On Tue, Jun 13, 2023 at 9:29 AM Jim Liu wrote:
>
> Hi Ramon
>
> Thanks for your review.
> The udelay timing is defined on our spec .
> Does this need to use config to control it or use dts method to set the
> timing?
dts
>
>
> Best regards,
> Jim
>
uot;,
> -1);
>
> pdata->phy_interface = dev_read_phy_mode(dev);
> debug("phy interface %d\n", pdata->phy_interface);
> --
> 2.39.2
>
Reviewed-by: Ramon Fried
properties are
> missing.
>
> Signed-off-by: Marek Vasut
> ---
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michal Simek
> Cc: Nishanth Menon
> Cc: Ramon Fried
> ---
> drivers/net/phy/ethernet_id.c | 37 -
y better chance of successful PHY ID
> readout.
>
> Signed-off-by: Marek Vasut
> ---
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michal Simek
> Cc: Nishanth Menon
> Cc: Ramon Fried
> ---
> drivers/net/phy/phy.c | 2 +-
> 1 file changed, 1 insertion(+), 1 d
+ (reg)))
>
> #define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)(unsigned long)dev->priv, \
> (pci_addr_t)(unsigned long)a)
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
p;& \
> - !CONFIG_IS_ENABLED(SYS_DCACHE_OFF) && !defined(CONFIG_X86)
> + !CONFIG_IS_ENABLED(SYS_DCACHE_OFF) && !defined(CONFIG_X86) &&
> !defined(CONFIG_RISCV)
> #warning cache-line size is larger than descriptor size
> #endif
> #endif
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
t;device) {
> - case 0x8168:
> case 0x8125:
> + case 0x8161:
> + case 0x8168:
> region = 2;
> break;
> default:
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
_i2c_probe(struct udevice *dev)
> case 0x00989700:
> puts("KSZ9897S: ");
> break;
> + case 0x00989300:
> + puts("KSZ9893R: ");
> + break;
> default:
> dev_err(dev, "invalid chip id: 0x%08x\n", id);
> return -EINVAL;
> }
> + if ((id & 0xf00) == 0x300)
> + priv->features |= IS_9893;
> + else
> + priv->features |= NEW_XMII;
>
> /* probe mdio bus */
> ret = ksz_probe_mdio(dev);
> @@ -503,6 +577,7 @@ static const struct udevice_id ksz_i2c_ids[] = {
> { .compatible = "microchip,ksz9897" },
> { .compatible = "microchip,ksz9477" },
> { .compatible = "microchip,ksz9567" },
> + { .compatible = "microchip,ksz9893" },
> { }
> };
>
> --
> 2.25.1
>
>
Reviewed-by: Ramon Fried
; + if (i == 6 && isdigit((int)*s)) {
> + struct in_addr v4 = string_to_ip(s);
> +
> + if (memcmp(&zero_ip, &v4,
> + sizeof(struct in_addr)) != 0) {
> + /* Ending with :IPv4-address */
> + addr->s6_addr32[3] = v4.s_addr;
> + break;
> + }
> + }
> +
> + val = simple_strtoul(s, &end, 16);
> + if (end != e && *end != '\0' && *end != ':')
> + goto out_err;
> + addr->s6_addr16[i] = htons(val);
> + s = end;
> + }
> + return 0;
> +
> +out_err:
> + return -1;
> +}
> +#endif
> +
> void string_to_enetaddr(const char *addr, uint8_t *enetaddr)
> {
> char *end;
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
&ndisc->target);
> + }
> + break;
> +
> + case IPV6_NDISC_NEIGHBOUR_ADVERTISEMENT:
> + /* are we waiting for a reply ? */
> + if (ip6_is_unspecified_addr(&net_nd_sol_packet_ip6))
> + break;
> +
> + if ((memcmp(&ndisc->target, &net_nd_rep_packet_ip6,
> + sizeof(struct in6_addr)) == 0) &&
> + ndisc_has_option(ip6, ND_OPT_TARGET_LL_ADDR)) {
> + ndisc_extract_enetaddr(ndisc, neigh_eth_addr);
> +
> + /* save address for later use */
> + if (!net_nd_packet_mac)
> + memcpy(net_nd_packet_mac, neigh_eth_addr, 7);
> +
> + /* modify header, and transmit it */
> + memcpy(((struct ethernet_hdr
> *)net_nd_tx_packet)->et_dest,
> + neigh_eth_addr, 6);
> +
> + net_send_packet(net_nd_tx_packet,
> + net_nd_tx_packet_size);
> +
> + /* no ND request pending now */
> + net_nd_sol_packet_ip6 = net_null_addr_ip6;
> + net_nd_tx_packet_size = 0;
> + net_nd_packet_mac = NULL;
> + }
> + break;
> + default:
> + debug("Unexpected ICMPv6 type 0x%x\n", icmp->icmp6_type);
> + return -1;
> + }
> +
> + return 0;
> +}
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
turn string_to_ip6(value, strlen(value), &net_gateway6);
> +}
> +
> +U_BOOT_ENV_CALLBACK(gatewayip6, on_gatewayip6);
> +
> +static int on_serverip6(const char *name, const char *value, enum env_op op,
> + int flags)
> +{
> + if (flags & H_PROGRAMMATIC)
> + return 0;
> +
> + return string_to_ip6(value, strlen(value), &net_server_ip6);
> +}
> +
> +U_BOOT_ENV_CALLBACK(serverip6, on_serverip6);
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
/* Fallthrough */
> case 'I':
> - /* %pI6 currently unused */
> - if (0 && fmt[1] == '6')
> + if (IS_ENABLED(CONFIG_IPV6) && fmt[1] == '6')
> return ip6_addr_string(buf, end, ptr, field_width,
>precision, flags);
> if (fmt[1] == '4')
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
The ethernet
> * receive routine will process it.
> @@ -1187,6 +1203,11 @@ void net_process_received_packet(uchar *in_packet, int
> len)
> case PROT_RARP:
> rarp_receive(ip, len);
> break;
> +#endif
> +#if IS_ENABLED(CONFI
gt; + struct icmp6hdr *icmp;
> + struct udp_hdr *udp;
> + u16 csum;
> + u16 csum_p;
> + u16 hlen;
> +
> + if (len < IP6_HDR_SIZE)
> + return -EINVAL;
> +
> + if (ip6->version != 6)
> + return -EINVAL;
> +
> + switch (ip6->nexthdr) {
> + case PROT_ICMPV6:
> + icmp = (struct icmp6hdr *)(((uchar *)ip6) + IP6_HDR_SIZE);
> + csum = icmp->icmp6_cksum;
> + hlen = ntohs(ip6->payload_len);
> + icmp->icmp6_cksum = 0;
> + /* checksum */
> + csum_p = csum_partial((u8 *)icmp, hlen, 0);
> + icmp->icmp6_cksum = csum_ipv6_magic(&ip6->saddr, &ip6->daddr,
> + hlen, PROT_ICMPV6,
> csum_p);
> +
> + if (icmp->icmp6_cksum != csum)
> + return -EINVAL;
> +
> + switch (icmp->icmp6_type) {
> + case IPV6_NDISC_NEIGHBOUR_SOLICITATION:
> + case IPV6_NDISC_NEIGHBOUR_ADVERTISEMENT:
> + ndisc_receive(et, ip6, len);
> + break;
> + default:
> + break;
> + }
> + break;
> + case IPPROTO_UDP:
> + udp = (struct udp_hdr *)(((uchar *)ip6) + IP6_HDR_SIZE);
> + csum = udp->udp_xsum;
> + hlen = ntohs(ip6->payload_len);
> + udp->udp_xsum = 0;
> + /* checksum */
> + csum_p = csum_partial((u8 *)udp, hlen, 0);
> + udp->udp_xsum = csum_ipv6_magic(&ip6->saddr, &ip6->daddr,
> + hlen, IPPROTO_UDP, csum_p);
> +
> + if (csum != udp->udp_xsum)
> + return -EINVAL;
> +
> + /* IP header OK. Pass the packet to the current handler. */
> + net_get_udp_handler()((uchar *)ip6 + IP6_HDR_SIZE +
> + UDP_HDR_SIZE,
> + ntohs(udp->udp_dst),
> + zero_ip,
> + ntohs(udp->udp_src),
> + ntohs(udp->udp_len) - 8);
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
e_ip6) {
> + printf("TFTP from server %pI6c; our IP address is %pI6c",
> + &tftp_remote_ip6, &net_ip6);
> +
> + if (tftp_block_size_option > TFTP_MTU_BLOCKSIZE6)
> + tftp_block_size_option = TFTP_MTU_BLOCKSIZE6;
> + } else {
> + printf("TFTP %s server %pI4; our IP address is %pI4",
> #ifdef CONFIG_CMD_TFTPPUT
> - protocol == TFTPPUT ? "to" : "from",
> + protocol == TFTPPUT ? "to" : "from",
> #else
> - "from",
> + "from",
> #endif
> - &tftp_remote_ip, &net_ip);
> + &tftp_remote_ip, &net_ip);
> + }
>
> /* Check if we need to send across this subnet */
> - if (net_gateway.s_addr && net_netmask.s_addr) {
> + if (IS_ENABLED(CONFIG_IPV6) && use_ip6) {
> + if (!ip6_addr_in_subnet(&net_ip6, &tftp_remote_ip6,
> + net_prefix_length))
> + printf("; sending through gateway %pI6c",
> + &net_gateway6);
> + } else if (net_gateway.s_addr && net_netmask.s_addr) {
> struct in_addr our_net;
> struct in_addr remote_net;
>
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
aiting */
> +}
> +
> +static void ping6_timeout(void)
> +{
> + eth_halt();
> + net_set_state(NETLOOP_FAIL);/* we did not get the reply */
> +}
> +
> +void ping6_start(void)
> +{
> + printf("Using %s device\n", eth_get_name());
> + net_set_timeout_handler(1UL, ping6_timeout);
> +
> + ping6_send();
> +}
> +
> +int ping6_receive(struct ethernet_hdr *et, struct ip6_hdr *ip6, int len)
> +{
> + struct icmp6hdr *icmp =
> + (struct icmp6hdr *)(((uchar *)ip6) + IP6_HDR_SIZE);
> + struct in6_addr src_ip;
> +
> + switch (icmp->icmp6_type) {
> + case IPV6_ICMP_ECHO_REPLY:
> + src_ip = ip6->saddr;
> + if (memcmp(&net_ping_ip6, &src_ip, sizeof(struct in6_addr)))
> + return -EINVAL;
> + net_set_state(NETLOOP_SUCCESS);
> + break;
> + case IPV6_ICMP_ECHO_REQUEST:
> + /* ignore for now */
> + debug("Got ICMPv6 ECHO REQUEST from %pI6c\n", &ip6->saddr);
> + return -EINVAL;
> + default:
> + debug("Unexpected ICMPv6 type 0x%x\n", icmp->icmp6_type);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
+static inline int
> +net_ip6_handler(struct ethernet_hdr *et, struct ip6_hdr *ip6,
> + int len)
> +{
> + return -EINVAL;
> +}
> +
> +/**
> + * Copy IPv6 addr
> + *
> + * @param to destination IPv6 addr
> + * @param from source IPv6 addr
> + */
> +static inline void net_copy_ip6(void *to, const void *from)
> +{
> +}
> +
> +#endif /* __NET6_H__ */
> diff --git a/net/net6.c b/net/net6.c
> new file mode 100644
> index 00..7cd442e6e2
> --- /dev/null
> +++ b/net/net6.c
> @@ -0,0 +1,31 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2013 Allied Telesis Labs NZ
> + * Chris Packham,
> + *
> + * Copyright (C) 2022 YADRO
> + * Viacheslav Mitrofanov
> + */
> +
> +/* Simple IPv6 network layer implementation */
> +
> +#include
> +#include
> +#include
> +#include
> +#include
> +
> +/* NULL IPv6 address */
> +struct in6_addr const net_null_addr_ip6 = ZERO_IPV6_ADDR;
> +/* Our gateway's IPv6 address */
> +struct in6_addr net_gateway6 = ZERO_IPV6_ADDR;
> +/* Our IPv6 addr (0 = unknown) */
> +struct in6_addr net_ip6 = ZERO_IPV6_ADDR;
> +/* Our link local IPv6 addr (0 = unknown) */
> +struct in6_addr net_link_local_ip6 = ZERO_IPV6_ADDR;
> +/* set server IPv6 addr (0 = unknown) */
> +struct in6_addr net_server_ip6 = ZERO_IPV6_ADDR;
> +/* The prefix length of our network */
> +u32 net_prefix_length;
> +
> +bool use_ip6;
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
#define NET6_FLAGS
> +#endif
> +
> #ifndef CONFIG_ENV_OVERWRITE
> #define SERIAL_FLAGS "serial#:so,"
> #else
> @@ -76,6 +85,7 @@ enum env_flags_varaccess {
> #define ENV_FLAGS_LIST_STATIC \
> ETHADDR_FLAGS \
> NET_FLAGS \
> + NET6_FLAGS \
> SERIAL_FLAGS \
> CONFIG_ENV_FLAGS_LIST_STATIC
>
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
X) += mdio-mux-uclass.o
> obj-$(CONFIG_NET) += eth_common.o
> obj-$(CONFIG_CMD_LINK_LOCAL) += link_local.o
> obj-$(CONFIG_NET) += net.o
> +obj-$(CONFIG_IPV6) += net6.o
> obj-$(CONFIG_CMD_NFS) += nfs.o
> obj-$(CONFIG_CMD_PING) += ping.o
> obj-$(CONFIG_CMD_PCAP) += pcap.o
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
s"
> +#else
> +#define NET6_FLAGS
> +#endif
> +
> #ifndef CONFIG_ENV_OVERWRITE
> #define SERIAL_FLAGS "serial#:so,"
> #else
> @@ -76,6 +85,7 @@ enum env_flags_varaccess {
> #define ENV_FLAGS_LIST_STATIC \
> ETHADDR_FLAGS \
> NET_FLAGS \
> + NET6_FLAGS \
> SERIAL_FLAGS \
> CONFIG_ENV_FLAGS_LIST_STATIC
>
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
e MTK_TRGMII BIT(MTK_TRGMII_BIT)
> +#define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT)
> +
> +/* Supported path present on SoCs */
> +#define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT)
> +
> +#define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII)
> +
> +#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
> +
> +#define MT7621_CAPS (MTK_GMAC1_TRGMII | MTK_TRGMII_MT7621_CLK)
> +
> +#define MT7623_CAPS (MTK_GMAC1_TRGMII)
> +
> +/* Frame Engine Register Bases */
> #define PDMA_BASE 0x0800
> #define GDMA1_BASE 0x0500
> #define GDMA2_BASE 0x1500
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
0x300
> #define PHY_POWER_SAVING_TX0x0
>
> +/* PDMA descriptors */
> +struct mtk_rx_dma {
> + unsigned int rxd1;
> + unsigned int rxd2;
> + unsigned int rxd3;
> + unsigned int rxd4;
> +} __packed __aligned(4);
> +
> +struct mtk_tx_dma {
> + unsigned int txd1;
> + unsigned int txd2;
> + unsigned int txd3;
> + unsigned int txd4;
> +} __packed __aligned(4);
> +
> +/* PDMA TXD fields */
> +#define PDMA_TXD2_DDONEBIT(31)
> +#define PDMA_TXD2_LS0 BIT(30)
> +#define PDMA_TXD2_SDL0_M GENMASK(29, 16)
> +#define PDMA_TXD2_SDL0_SET(_v) FIELD_PREP(PDMA_TXD2_SDL0_M, (_v))
> +
> +#define PDMA_TXD4_FPORT_M GENMASK(27, 25)
> +#define PDMA_TXD4_FPORT_SET(_v)FIELD_PREP(PDMA_TXD4_FPORT_M, (_v))
> +
> +/* PDMA RXD fields */
> +#define PDMA_RXD2_DDONEBIT(31)
> +#define PDMA_RXD2_LS0 BIT(30)
> +#define PDMA_RXD2_PLEN0_M GENMASK(29, 16)
> +#define PDMA_RXD2_PLEN0_GET(_v)FIELD_GET(PDMA_RXD2_PLEN0_M, (_v))
> +#define PDMA_RXD2_PLEN0_SET(_v)FIELD_PREP(PDMA_RXD2_PLEN0_M, (_v))
> +
> #endif /* _MTK_ETH_H_ */
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
E_MODE_NA)
> return -EINVAL;
> - }
>
> pdata->max_speed = 0;
> cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed",
> NULL);
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
.of_match = liteeth_ids,
> + .of_to_plat = liteeth_of_to_plat,
> + .plat_auto = sizeof(struct eth_pdata),
> + .remove = liteeth_remove,
> + .ops = &liteeth_ops,
> + .priv_auto = sizeof(struct liteeth),
> +};
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index 52dc9e4f0f6d..95420bd4a140 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -460,6 +460,11 @@ config LPC32XX_ETH
> depends on ARCH_LPC32XX
> default y
>
> +config LITEETH
> + bool "LiteX LiteEth Ethernet MAC"
> + help
> +Driver for the LiteEth Ethernet MAC from LiteX.
> +
> config MVGBE
> bool "Marvell Orion5x/Kirkwood network interface support"
> depends on ARCH_KIRKWOOD || ARCH_ORION5X
> diff --git a/drivers/net/Makefile b/drivers/net/Makefile
> index 054ec68470db..770107296c62 100644
> --- a/drivers/net/Makefile
> +++ b/drivers/net/Makefile
> @@ -47,6 +47,7 @@ obj-$(CONFIG_GMAC_ROCKCHIP) += gmac_rockchip.o
> obj-$(CONFIG_HIGMACV300_ETH) += higmacv300.o
> obj-$(CONFIG_KS8851_MLL) += ks8851_mll.o
> obj-$(CONFIG_KSZ9477) += ksz9477.o
> +obj-$(CONFIG_LITEETH) += liteeth.o
> obj-$(CONFIG_LPC32XX_ETH) += lpc32xx_eth.o
> obj-$(CONFIG_MACB) += macb.o
> obj-$(CONFIG_MCFFEC) += mcffec.o mcfmii.o
> --
> 2.35.1
>
Reviewed-by: Ramon Fried
> {
> + int ret;
> +
> + ret = of_set_phy_supported(phydev);
> + if (ret)
> + return ret;
> +
> /* Invoke an optional board-specific helper */
> return board_phy_config(phydev);
> }
> --
> 2.31.1
>
Reviewed-by: Ramon Fried
v_read_phandle_with_args(dev, "sfp", NULL, 0, 0, &sfp_args) &&
> ofnode_is_enabled(sfp_args.node))
> @@ -1620,6 +1660,7 @@ static const struct eth_ops mvneta_ops = {
>
> static const struct udevice_id mvneta_ids[] = {
> { .compatible = "marvell,armada-370-neta" },
> + { .compatible = "marvell,armada-ac5-neta" },
> { .compatible = "marvell,armada-xp-neta" },
> { .compatible = "marvell,armada-3700-neta" },
> { }
> --
> 2.37.3
>
Reviewed-by: Ramon Fried
/* CONFIG_SPL_BUILD */
>
> -/* ENET Config */
> -/* ENET1 */
> -#if defined(CONFIG_CMD_NET)
> -#define CONFIG_FEC_MXC_PHYADDR 7
> -
> -#define PHY_ANEG_TIMEOUT 2
> -#endif /* CONFIG_CMD_NET */
> -
> #define MEM_LAYOUT_ENV_SETTINGS \
> "fdt_addr_r=0x5020\0" \
> "kernel_addr_r=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
> --
> 2.35.1
>
Reviewed-by: Ramon Fried
cpsw_mdio->bus->write = cpsw_mdio_write;
> + }
> +
> cpsw_mdio->bus->priv = cpsw_mdio;
> snprintf(cpsw_mdio->bus->name, sizeof(cpsw_mdio->bus->name), name);
>
> diff --git a/drivers/net/ti/cpsw_mdio.h b/drivers/net/ti/cpsw_mdio.h
> index dbf4a2dcac..9b98763656 100644
> --- a/drivers/net/ti/cpsw_mdio.h
> +++ b/drivers/net/ti/cpsw_mdio.h
> @@ -11,7 +11,7 @@
> struct cpsw_mdio;
>
> struct mii_dev *cpsw_mdio_init(const char *name, phys_addr_t mdio_base,
> - u32 bus_freq, int fck_freq);
> + u32 bus_freq, int fck_freq, bool manual_mode);
> void cpsw_mdio_free(struct mii_dev *bus);
> u32 cpsw_mdio_get_alive(struct mii_dev *bus);
>
> diff --git a/drivers/net/ti/keystone_net.c b/drivers/net/ti/keystone_net.c
> index fbec69f571..1bdbd599d7 100644
> --- a/drivers/net/ti/keystone_net.c
> +++ b/drivers/net/ti/keystone_net.c
> @@ -571,7 +571,8 @@ static int ks2_eth_probe(struct udevice *dev)
> mdio_bus = cpsw_mdio_init("ethernet-mdio",
> priv->mdio_base,
> EMAC_MDIO_CLOCK_FREQ,
> - EMAC_MDIO_BUS_FREQ);
> + EMAC_MDIO_BUS_FREQ,
> + false);
> if (!mdio_bus) {
> pr_err("MDIO alloc failed\n");
> return -ENOMEM;
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
w_common->fclk),
> - false);
> + priv->mdio_manual_mode);
> if (!cpsw_common->bus)
> return -EFAULT;
>
> @@ -658,6 +675,10 @@ static int am65_cpsw_port_probe(struct udevice *dev)
> sprintf(portname, "%s%s", dev->parent->name, dev->name);
> device_set_name(dev, portname);
>
> + priv->mdio_manual_mode = false;
> + if (soc_device_match(k3_mdio_soc_data))
> + priv->mdio_manual_mode = true;
> +
> ret = am65_cpsw_ofdata_parse_phy(dev);
> if (ret)
> goto out;
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
On Fri, Sep 23, 2022 at 12:36 PM Michal Simek wrote:
>
> Hi,
>
> On 9/23/22 11:17, Samuel Obuch wrote:
> > Hi, I tested both versions to be sure, but the results are as can be
> > expected:
> >
> > 1. both __raw_readl/__raw_writel and readl/writel functions work ok on
> > riscv -
> > only the or
*to8ptr++ = *from8ptr++;
>
> - *to32ptr++ = alignbuffer;
> + __raw_writel(alignbuffer, to32ptr++);
> }
>
> static int wait_for_bit(const char *func, u32 *reg, const u32 mask,
> --
> 2.31.1
>
Reviewed-by: Ramon Fried
if (length != first_read)
> + if (length > first_read)
> xemaclite_alignedread(addr + first_read,
> etherrxbuff + first_read,
> length - first_read);
> --
> 2.31.1
>
Reviewed-by: Ramon Fried
the espressobin v5 board the value is "marvell/armada-3720-espressobin.dtb"
> @@ -408,7 +434,7 @@ way in future u-boot versions. In particular the type>_boot
> variables (e.g. mmc_boot, usb_boot) are a strictly internal implementation
> detail and must not be used as a public interface.
>
> -.. _BootLoaderSpec:
> http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/
> +.. _`Boot Loader Specification`:
> https://systemd.io/BOOT_LOADER_SPECIFICATION/
>
> .. sectionauthor:: (C) Copyright 2014 Red Hat Inc.
> .. sectionauthor:: Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights
> reserved.
> --
> 2.37.3
>
Reviewed-by: Ramon Fried
> struct ccsr_fman *reg;
>
> reg = (void *)CONFIG_SYS_FSL_FM1_ADDR;
> - if (fm_init_common(0, reg))
> + if (fm_init_common(0, reg, NULL))
> return 0;
>
> for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
> @@ -103,7 +103,7 @@ int fm_standard_init(struct bd_info *bis)
>
> #if (CONFIG_SYS_NUM_FMAN == 2)
> reg = (void *)CONFIG_SYS_FSL_FM2_ADDR;
> - if (fm_init_common(1, reg))
> + if (fm_init_common(1, reg, NULL))
> return 0;
>
> for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
> --
> 2.35.1.1320.gc452695387.dirty
>
Reviewed-by: Ramon Fried
H;
> diff --git a/drivers/qe/Kconfig b/drivers/qe/Kconfig
> index c44a81f69a..89a75c175b 100644
> --- a/drivers/qe/Kconfig
> +++ b/drivers/qe/Kconfig
> @@ -27,6 +27,10 @@ choice
> depends on FMAN_ENET || QE
> default SYS_QE_FMAN_FW_IN_ROM
>
> +config SYS_QE_FMAN_FW_IN_FS
> + depends on FS_LOADER && FMAN_ENET
> + bool "Filesystem"
> +
> config SYS_QE_FMAN_FW_IN_NOR
> bool "NOR flash"
>
> --
> 2.35.1.1320.gc452695387.dirty
>
Reviewed-by: Ramon Fried
; @@ -52,4 +52,16 @@ struct device_plat {
> int request_firmware_into_buf(struct udevice *dev,
> const char *name,
> void *buf, size_t size, u32 offset);
> +
> +/**
> + * get_fs_loader() - Get the chosen filesystem loader
> + * @dev: Where to store the device
> + *
> + * This gets a filesystem loader device based on the value of
> + * /chosen/firmware-loader. If no such property exists, it returns a
> + * firmware loader which is configured by environmental variables.
> + *
> + * Return: 0 on success, negative value on error
> + */
> +int get_fs_loader(struct udevice **dev);
> #endif
> --
> 2.35.1.1320.gc452695387.dirty
>
Reviewed-by: Ramon Fried
On Sat, Aug 13, 2022 at 9:15 AM Sean Anderson wrote:
>
> On 4/22/22 1:30 PM, Sean Anderson wrote:
> > This adds support for loading Fman firmware from a filesystem using the
> > firmware loader subsystem. It was originally part of [1], but has been
> > split off because it is conceptually separate
On Fri, Aug 19, 2022 at 11:10 AM Viacheslav Mitrofanov
wrote:
>
> That is quite a big patch that includes such things as Neighbour
> Discovery Protocol, string parsers, converters and basic IPv6
> implementation. It consists of all necessary parts to add upper layer
> protocols.
>
> Due to code de
On Fri, Aug 19, 2022 at 11:10 AM Viacheslav Mitrofanov
wrote:
>
> The command tftpboot uses IPv4 by default, to use IPv6 instead add -ipv6
> as the last argument. All other tftpboot features and parameters are left
> the same.
>
In my opinion, we should be able to detect if a user has provided or
On Fri, Aug 19, 2022 at 2:30 PM Vyacheslav Mitrofanov V
wrote:
>
> On Fri, 2022-08-19 at 14:00 +0300, Ramon Fried wrote:
> > On Fri, Aug 19, 2022 at 11:10 AM Viacheslav Mitrofanov
> > wrote:
> > > The command tftpboot uses IPv4 by default, to use IPv6 instead add
&g
On Mon, Aug 22, 2022 at 9:36 AM Vyacheslav Mitrofanov V
wrote:
>
> On Fri, 2022-08-19 at 21:01 +0300, Ramon Fried wrote:
> >
> > On Fri, Aug 19, 2022 at 2:30 PM Vyacheslav Mitrofanov V
> > wrote:
> > > On Fri, 2022-08-19 at 14:00 +0300, Ramon Fried wrote:
> &g
{
> > struct enetc_priv *priv = dev_get_priv(dev);
> > + int res;
> >
> > if (ofnode_valid(dev_ofnode(dev)) &&
> > !ofnode_is_available(dev_ofnode(dev))) {
> > enetc_dbg(dev, "interface disabled\n");
> > @@ -350,7 +353,10 @@ static int enetc_probe(struct udevice *dev)
> >
> > enetc_start_pcs(dev);
> >
> > - return enetc_config_phy(dev);
> > + res = enetc_config_phy(dev);
> > + if(res)
> > + enetc_remove(dev);
> > + return res;
> > }
> >
> > /*
Reviewed-by: Ramon Fried
On Fri, Sep 2, 2022 at 9:35 AM Siarhei Yasinski
wrote:
>
> If ethernet connected to SFP, like this:
>
> &enetc_port0 {
> phy-connection-type = "sgmii";
> sfp = <&sfp0>;
> managed = "in-band-status";
> status = "okay";
> };
>
> Then enetc_config_phy returns -ENODEV a
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
>
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-b
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-amlo
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-a
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-am
Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-am
; Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-am
irovsky
> Cc: Haolin Li
> Cc: Heinrich Schuchardt
> Cc: Joe Hershberger
> Cc: Joel Stanley
> Cc: Josua Mayer
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Me
essandro"
> Cc: "Cédric Le Goater"
> Cc: "Marek Behún"
> Cc: Alex Nemirovsky
> Cc: Haolin Li
> Cc: Heinrich Schuchardt
> Cc: Joe Hershberger
> Cc: Joel Stanley
> Cc: Josua Mayer
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Mic
; Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc: Neil Armstrong
> Cc: Radu Pirea
> Cc: Ramon Fried
> Cc: Samuel Mendoza-Jonas
> Cc: Stefan Roese
> Cc: T Karthik Reddy
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> Cc: u-boot-amlo...@groups.i
l D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Ramon Fried
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> drivers/net/mvpp2.c | 8 ++--
> include/phy_interface.h | 2 ++
> 2 fil
t; Signed-off-by: Marek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Ramon Fried
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> drivers/net/phy/phy.c | 4 +++
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Nate Drude
> Cc: Ramon Fried
> Cc: Simon Glass
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> drivers/net/phy/marvell.c | 45 +++--
>
>
> Signed-off-by: Marek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Nate Drude
> Cc: Ramon Fried
> Cc: Simon Glass
> Cc: Stef
ek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Nate Drude
> Cc: Ramon Fried
> Cc: Simon Glass
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir
-by: Marek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Nate Drude
> Cc: Ramon Fried
> Cc: Simon Glass
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc:
berger
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Nate Drude
> Cc: Ramon Fried
> Cc: Simon Glass
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> drivers/net/phy/Kconfig | 5 +
> drivers/net/phy/Makefile | 1 +
&
\n");
> return 1;
> }
> - /* Fall through */
> + fallthrough;
>
> #ifdef CONFIG_CMD_RARP
> case RARP:
> @@ -1534,7 +1533,7 @@ common:
> net_start_again();
>
ic handler (get rid of UDP signature)
> > 3. Ensure seq_num and ack_num are respected in net_send_tcp_packet
> > function (make sure existing wget_cmd code is reflected with the fix)
> >
> > Signed-off-by: Dmitrii Merkurev
> > Cc: Ying-Chun Liu (PaulLiu)
ng-Chun Liu (PaulLiu)
> > Cc: Simon Glass
> > Сс: Joe Hershberger
> > Сс: Ramon Fried
> > Signed-off-by: Dmitrii Merkurev
> > ---
> >
> > drivers/fastboot/fb_common.c | 32
> > include/fastboot.h
peated
> 10x/100x
> - 2500baseX does not do AN, or does very different c73 AN
> - SGMII 2500 behavior is unclear
>
> Signed-off-by: Marek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
>
Generic code clean ups.]
> ---
> Cc: Hai Pham
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Peng Fan
> Cc: Ramon Fried
> Cc: Simon Glass
> ---
> drivers/net/Kconfig |8 +
> drivers/net/Makefile |1 +
> drivers/net/rswitch.c | 1139 +
l D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Ramon Fried
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> V2: No change
> ---
> drivers/net/mvpp2.c | 8 ++--
> include/phy_in
t; Signed-off-by: Marek Vasut
> ---
> Cc: "Ariel D'Alessandro"
> Cc: "Marek Behún"
> Cc: Joe Hershberger
> Cc: Marek Vasut
> Cc: Ramon Fried
> Cc: Stefan Roese
> Cc: Tim Harvey
> Cc: Vladimir Oltean
> ---
> V2: No change
> ---
> driv
Le Goater"
> Cc: "Marek Behún"
> Cc: Alex Nemirovsky
> Cc: Haolin Li
> Cc: Heinrich Schuchardt
> Cc: Joe Hershberger
> Cc: Joel Stanley
> Cc: Josua Mayer
> Cc: Marek Vasut
> Cc: Michael Trimarchi
> Cc: Michal Simek
> Cc: Nate Drude
> Cc
> @@ -42,6 +42,8 @@
> #define DEBUGOUT(fmt, args...) do { } while (0)
> #endif
>
> +#define NUM_RX_DESC8
> +
> /* I/O wrapper functions */
> #define E1000_WRITE_REG(a, reg, value) \
> writel((value), ((a)->hw_addr + E1000_##reg))
> --
> 2.39.2
>
Reviewed-by: Ramon Fried
+ static bool first_call = true;
> +
> if (eth_get_dev()) {
> memcpy(net_ethaddr, eth_get_ethaddr(), 6);
>
> @@ -365,6 +368,12 @@ static int net_init_loop(void)
> */
> return -ENONET;
>
> + if (IS_ENABLED(CONFIG_IPV6_ROUTER_DISCOVERY))
> + if (first_call && use_ip6) {
> + first_call = false;
> + srand_mac(); /* This is for rand used in ip6_send_rs.
> */
> + net_loop(RS);
> + }
> return 0;
> }
>
> @@ -574,6 +583,10 @@ restart:
> ncsi_probe_packages();
> break;
> #endif
> + case RS:
> + if (IS_ENABLED(CONFIG_IPV6_ROUTER_DISCOVERY))
> + ip6_send_rs();
> + break;
> default:
> break;
> }
> @@ -671,7 +684,13 @@ restart:
> x = time_handler;
> time_handler = (thand_f *)0;
> (*x)();
> - }
> + } else if (IS_ENABLED(CONFIG_IPV6_ROUTER_DISCOVERY))
> + if (time_handler && protocol == RS)
> + if (!ip6_is_unspecified_addr(&net_gateway6) &&
> + net_prefix_length != 0) {
> + net_set_state(NETLOOP_SUCCESS);
> + net_set_timeout_handler(0, 0);
> + }
>
> if (net_state == NETLOOP_FAIL)
> ret = net_start_again();
> diff --git a/net/net6.c b/net/net6.c
> index 75577bc..2dd64c0 100644
> --- a/net/net6.c
> +++ b/net/net6.c
> @@ -413,6 +413,7 @@ int net_ip6_handler(struct ethernet_hdr *et, struct
> ip6_hdr *ip6, int len)
> break;
> case IPV6_NDISC_NEIGHBOUR_SOLICITATION:
> case IPV6_NDISC_NEIGHBOUR_ADVERTISEMENT:
> + case IPV6_NDISC_ROUTER_ADVERTISEMENT:
> ndisc_receive(et, ip6, len);
> break;
> default:
> --
> 1.8.3.1
>
Reviewed-by: Ramon Fried
t; + struct ytphy_plat_priv *priv;
> +
> + priv = calloc(1, sizeof(struct ytphy_plat_priv));
> + if (!priv)
> + return -ENOMEM;
> +
> + phydev->priv = priv;
> +
> + return 0;
> +}
> +
> +static struct phy_driver motorcomm8531_driver = {
> + .name = "YT8531 Gigabit Ethernet",
> + .uid = PHY_ID_YT8531,
> + .mask = PHY_ID_MASK,
> + .features = PHY_GBIT_FEATURES,
> + .probe = &yt8531_probe,
> + .config= &yt8531_config,
> + .startup = &yt8531_startup,
> + .shutdown = &genphy_shutdown,
> +};
> +
> +int phy_motorcomm_init(void)
> +{
> + phy_register(&motorcomm8531_driver);
> +
> + return 0;
> +}
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 80230b907c..78bde61798 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -570,6 +570,9 @@ int phy_init(void)
> #endif
> #ifdef CONFIG_PHY_XILINX_GMII2RGMII
> phy_xilinx_gmii2rgmii_init();
> +#endif
> +#ifdef CONFIG_PHY_MOTORCOMM
> + phy_motorcomm_init();
> #endif
> genphy_init();
>
> @@ -755,7 +758,6 @@ static struct phy_device *create_phy_by_mask(struct
> mii_dev *bus,
> while (phy_mask) {
> int addr = ffs(phy_mask) - 1;
> int r = get_phy_id(bus, addr, devad, &phy_id);
> -
> /*
> * If the PHY ID is flat 0 we ignore it. There are C45 PHYs
> * that return all 0s for C22 reads (like Aquantia AQR112) and
> diff --git a/include/phy.h b/include/phy.h
> index 87aa86c2e7..f7bb2fe0af 100644
> --- a/include/phy.h
> +++ b/include/phy.h
> @@ -344,6 +344,7 @@ int phy_mscc_init(void);
> int phy_fixed_init(void);
> int phy_ncsi_init(void);
> int phy_xilinx_gmii2rgmii_init(void);
> +int phy_motorcomm_init(void);
>
> int board_phy_config(struct phy_device *phydev);
> int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id);
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
behavior
> over all PHY addresses. Add Fixes tag, sort the tag list.]
> ---
> Cc: Joe Hershberger
> Cc: Ramon Fried
> ---
> drivers/net/ravb.c | 6 ++
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ravb.c b/drivers/net/ravb
es transferred = "
> +if sz:
> +expected_text += "%d" % sz
> +addr = addr + sz
> +assert "TIMEOUT" not in output
> +assert "Access violation" not in output
> +assert expected_text in output
> +
> +with u_boot_console.temporary_timeout(timeout):
> +output = u_boot_console.run_command("tftpboot %x %s" % (addr, fnu))
> +
> +expected_text = "Bytes transferred = "
> +if sz:
> +expected_text += "%d" % sz
> +assert "TIMEOUT" not in output
> +assert expected_text in output
> +
> +expected_tftpp_crc = expected_tftpb_crc
> +
> +output = u_boot_console.run_command("crc32 $fileaddr $filesize")
> +assert expected_tftpp_crc in output
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
r("done")
> +
> +# Sending Ctrl-C
> +output = u_boot_console.run_command(
> +chr(3), wait_for_echo=False, send_nl=False
> +)
> +
> +assert "TIMEOUT" not in output
> +assert "DHCP client bound to address " not in output
> +assert "Abort" in output
> +
> +# Provide a time to recover from Abort - if it is not performed
> +# There is message like: ethernet@ff0e: No link.
> +u_boot_console.run_command("sleep 1")
> +
> @pytest.mark.buildconfigspec('cmd_dhcp6')
> def test_net_dhcp6(u_boot_console):
> """Test the dhcp6 command.
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
le.temporary_timeout(timeout):
> +output = u_boot_console.run_command("pxe get")
> +
> +assert "TIMEOUT" not in output
> +assert expected_text_uuid in output
> +assert expected_text_ethaddr in output
> +assert expected_text_ipaddr in output
> +
> +i = 1
> +for i in range(0, len(ipaddr_file) - 1):
> +expected_text_ip = f"Retrieving file:
> pxelinux.cfg/{ipaddr_file[:-i]}"
> +assert expected_text_ip in output
> +i += 1
> +
> +assert expected_text_default in output
> +assert "Config file 'default.boot' found" in output
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
p83869->tx_int_delay = DP83869_CLK_DELAY_DEFAULT;
> + pr_warn("tx-internal-delay-ps not set/invalid,
> default"
> + " to %ups\n", DP83869_CLK_DELAY_DEFAULT);
> }
>
> - dp83869->tx_int_delay =
> dp83869_internal_delay[dp83869->tx_int_delay];
> + dp83869->tx_int_delay =
> + (dp83869->tx_int_delay - DP83869_CLK_DELAY_STEP)
> + / DP83869_CLK_DELAY_STEP;
> }
>
> return 0;
> --
> 2.30.2
>
Reviewed-by: Ramon Fried
hydev);
> mdio_unregister(priv->bus);
> mdio_free(priv->bus);
> + if (priv->reset_ctl)
> + reset_assert(priv->reset_ctl);
> clk_release_bulk(&priv->clks);
>
> return 0;
> --
> 2.25.1
>
Reviewed-by: Ramon Fried
eqos_free_descs(eqos->rx_descs);
> diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h
> index a6b719af809f..06a082da72ef 100644
> --- a/drivers/net/dwc_eth_qos.h
> +++ b/drivers/net/dwc_eth_qos.h
> @@ -273,7 +273,6 @@ struct eqos_priv {
> unsigned int desc_per_cacheline;
> void *tx_dma_buf;
> void *rx_dma_buf;
> - void *rx_pkt;
> bool started;
> bool reg_access_ok;
> bool clk_ck_enabled;
> --
> 2.42.0
>
Reviewed-by: Ramon Fried
ruct udevice *dev)
>
> if (!eqos->phy->link) {
> pr_err("No link");
> + ret = -EAGAIN;
> goto err_shutdown_phy;
> }
>
> --
> 2.42.0
>
Reviewed-by: Ramon Fried
eturn -EAGAIN;
> - }
> +
> + debug("%s(dev=%p, flags=%x):\n", __func__, dev, flags);
>
> *packetp = eqos->rx_dma_buf +
> (eqos->rx_desc_idx * EQOS_MAX_PACKET_SIZE);
> --
> 2.42.0
>
Reviewed-by: Ramon Fried
);
> + case PHY_INTERFACE_MODE_RMII:
> + return data->ops->set_to_rmii(dev);
> + }
> +
> + return -EINVAL;
> +}
> +
> +static int eqos_set_tx_clk_speed_rk(struct udevice *dev)
> +{
> + struct eth_pdata *pdata = dev_get_plat(dev);
> + struct rockchip_platform_data *data = pdata->priv_pdata;
> +
> + return data->ops->set_gmac_speed(dev);
> +}
> +
> +static ulong eqos_get_tick_clk_rate_rk(struct udevice *dev)
> +{
> + struct eqos_priv *eqos = dev_get_priv(dev);
> +
> + return clk_get_rate(&eqos->clk_master_bus);
> +}
> +
> +static struct eqos_ops eqos_rockchip_ops = {
> + .eqos_inval_desc = eqos_inval_desc_generic,
> + .eqos_flush_desc = eqos_flush_desc_generic,
> + .eqos_inval_buffer = eqos_inval_buffer_generic,
> + .eqos_flush_buffer = eqos_flush_buffer_generic,
> + .eqos_probe_resources = eqos_probe_resources_rk,
> + .eqos_remove_resources = eqos_remove_resources_rk,
> + .eqos_stop_resets = eqos_stop_resets_rk,
> + .eqos_start_resets = eqos_start_resets_rk,
> + .eqos_stop_clks = eqos_stop_clks_rk,
> + .eqos_start_clks = eqos_start_clks_rk,
> + .eqos_calibrate_pads = eqos_null_ops,
> + .eqos_disable_calibration = eqos_null_ops,
> + .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_rk,
> + .eqos_get_enetaddr = eqos_null_ops,
> + .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_rk,
> +};
> +
> +struct eqos_config eqos_rockchip_config = {
> + .reg_access_always_ok = false,
> + .mdio_wait = 10,
> + .swr_wait = 50,
> + .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB,
> + .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
> + .axi_bus_width = EQOS_AXI_WIDTH_64,
> + .interface = dev_read_phy_mode,
> + .ops = &eqos_rockchip_ops,
> +};
> --
> 2.42.0
>
Reviewed-by: Ramon Fried
put"))
> + data->clock_input = true;
> + else
> + data->clock_input = false;
> +
> /* snps,reset props are deprecated, do bare minimum to support them */
> if (dev_read_bool(dev, "snps,reset-active-low"))
> reset_flags |= GPIOD_ACTIVE_LOW;
> @@ -273,6 +438,12 @@ static int eqos_start_resets_rk(struct udevice *dev)
>
> static int eqos_stop_clks_rk(struct udevice *dev)
> {
> + struct eth_pdata *pdata = dev_get_plat(dev);
> + struct rockchip_platform_data *data = pdata->priv_pdata;
> +
> + if (data->ops->set_clock_selection)
> + data->ops->set_clock_selection(dev, false);
> +
> return 0;
> }
>
> @@ -293,6 +464,9 @@ static int eqos_start_clks_rk(struct udevice *dev)
> udelay(eqos->reset_delays[2]);
> }
>
> + if (data->ops->set_clock_selection)
> + data->ops->set_clock_selection(dev, true);
> +
> tx_delay = dev_read_u32_default(dev, "tx_delay", 0x30);
> rx_delay = dev_read_u32_default(dev, "rx_delay", 0x10);
>
> --
> 2.42.0
>
Reviewed-by: Ramon Fried
p_seq_num, tcp_ack_num, action);
> + net_set_state(NETLOOP_FAIL);
> return;
> }
>
> @@ -420,6 +477,15 @@ void wget_start(void)
> debug_cond(DEBUG_WGET,
>"\nwget:Load address: 0x%lx\nLoading: *\b",
> image_load_addr);
>
> + if (IS_ENABLED(CONFIG_LMB)) {
> + if (wget_init_load_size()) {
> + printf("\nwget error: ");
> + printf("trying to overwrite reserved memory...\n");
> + net_set_state(NETLOOP_FAIL);
> + return;
> + }
> + }
> +
> net_set_timeout_handler(wget_timeout, wget_timeout_handler);
> tcp_set_tcp_handler(wget_handler);
>
> --
> 2.34.1
>
Reviewed-by: Ramon Fried
goto out;
> + }
> + s = env_get("httpserverip");
> + if (!s) {
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + strlcpy(net_boot_file_name, s, sizeof(net_boot_file_name));
> + strlcat(net_boot_file_name, ":/", sizeof(net_boot_file_name)); /*
> append '/' which is removed by strsep() */
> + strlcat(net_boot_file_name, file_name, sizeof(net_boot_file_name));
> + image_load_addr = dst_addr;
> + ret = net_loop(WGET);
> +
> +out:
> + free(str_copy);
> +
> + return ret;
> +}
> +#endif
> --
> 2.34.1
>
Reviewed-by: Ramon Fried
CMDLINE
> default y
> imply NETDEVICES
>
> diff --git a/net/Kconfig b/net/Kconfig
> index 4215889127c9..25d494e1db46 100644
> --- a/net/Kconfig
> +++ b/net/Kconfig
> @@ -4,6 +4,7 @@
>
> menuconfig NET
> bool "Networking support"
> + depends on CMDLINE
> default y
>
> if NET
> --
> 2.42.0.515.g380fc7ccd1-goog
>
Reviewed-by: Ramon Fried
On Fri, Apr 7, 2023 at 9:55 PM Simon Glass wrote:
>
> Hi,
>
> On Fri, 7 Apr 2023 at 18:56, wrote:
> >
> > From: Sean Edmond
> >
> > Adds DHCPv6 protocol to u-boot.
> >
> > Allows for address assignement with DHCPv6 4-message exchange
> > (SOLICIT->ADVERTISE->REQUEST->REPLY). Includes DHCPv6 opt
andbox_defconfig | 1 +
> > test/py/tests/test_net.py | 25 +
> > 2 files changed, 26 insertions(+)
>
> Reviewed-by: Simon Glass
Acked-by: Ramon Fried
ile_func)(struct pxe_context *ctx,
> const char *file_path,
> * @bootdir: Directory that files are loaded from ("" if no directory). This
> is
> * allocated
> * @pxe_file_size: Size of the PXE file
> + * @use_ipv6: TRUE : use IPv6 addressing, FALSE : use IPv4 addressing
> */
> struct pxe_context {
> struct cmd_tbl *cmdtp;
> @@ -112,6 +113,7 @@ struct pxe_context {
> bool allow_abs_path;
> char *bootdir;
> ulong pxe_file_size;
> + bool use_ipv6;
> };
>
> /**
> @@ -209,12 +211,14 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
> * @allow_abs_path: true to allow absolute paths
> * @bootfile: Bootfile whose directory loaded files are relative to, NULL if
> * none
> + * @use_ipv6: TRUE : use IPv6 addressing
> + *FALSE : use IPv4 addressing
> * Return: 0 if OK, -ENOMEM if out of memory, -E2BIG if bootfile is larger
> than
> * MAX_TFTP_PATH_LEN bytes
> */
> int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
> pxe_getfile_func getfile, void *userdata,
> - bool allow_abs_path, const char *bootfile);
> + bool allow_abs_path, const char *bootfile, bool use_ipv6);
>
> /**
> * pxe_destroy_ctx() - Destroy a PXE context
> @@ -251,7 +255,9 @@ int pxe_get_file_size(ulong *sizep);
> * "rpi/info", which indicates that all files should be fetched from the
> * "rpi/" subdirectory
> * @sizep: Size of the PXE file (not bootfile)
> + * @use_ipv6: TRUE : use IPv6 addressing
> + *FALSE : use IPv4 addressing
> */
> -int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep);
> +int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep, bool
> use_ipv6);
>
> #endif /* __PXE_UTILS_H */
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
rt_ms;
> + int rt_prev_ms;
> + struct dhcp6_rx_pkt_status rx_status;
> + struct dhcp6_server_uid server_uid;
> + char duid[DUID_MAX_SIZE];
> +};
> +
> +/* Starts a DHCPv6 4-message exchange as a DHCPv6 client. On successful
> exchange,
> + * the DHCPv6 state machine will transition from internal states:
> + * DHCP6_INIT->DHCP6_SOLICIT->DHCP6_REQUEST->DHCP6_DONE
> + *
> + * Transmitted SOLICIT and REQUEST packets will set/request the minimum
> required
> + * DHCPv6 options to PXE boot.
> + *
> + * After a successful exchange, the DHCPv6 assigned address will be set in
> net_ip6
> + *
> + * Additionally, the following will be set after receiving these options:
> + * DHCP6_OPTION_OPT_BOOTFILE_URL (option 59) -> net_server_ip6,
> net_boot_file_name
> + * DHCP6_OPTION_OPT_BOOTFILE_PARAM (option 60) - > pxelinux_configfile
> + *
> + * Illustration of a 4-message exchange with 2 servers (copied from
> + * https://www.rfc-editor.org/rfc/rfc8415):
> + *
> + * Server Server
> + * (not selected) Client(selected)
> + *
> + * v v v
> + * | | |
> + * | Begins initialization |
> + * | | |
> + *start of | _/|\_ |
> + *4-message|/ Solicit | Solicit \|
> + *exchange | | |
> + * Determines | Determines
> + *configuration| configuration
> + * | | |
> + * |\ | /|
> + * | \ | /Advertise|
> + * | Advertise\|/ |
> + * | \ | |
> + * | Collects Advertises |
> + * | \ | |
> + * | Selects configuration |
> + * | | |
> + * | _/|\_ |
> + * |/ Request | Request \|
> + * | | |
> + * | | Commits configuration
> + * | | |
> + *end of | | _/|
> + *4-message| |/ Reply|
> + *exchange | | |
> + * |Initialization complete|
> + * | | |
> + */
> +void dhcp6_start(void);
> +
> +#endif /* __DHCP6_H__ */
> diff --git a/net/net.c b/net/net.c
> index c9a749f6cc..8cb8b4b9f3 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -107,6 +107,8 @@
> #include
> #include
> #include
> +#include
> +#include
> #include "arp.h"
> #include "bootp.h"
> #include "cdp.h"
> @@ -120,8 +122,7 @@
> #if defined(CONFIG_CMD_WOL)
> #include "wol.h"
> #endif
> -#include
> -#include
> +#include "dhcpv6.h"
>
> /** BOOTP EXTENTIONS **/
>
> @@ -135,6 +136,8 @@ struct in_addr net_dns_server;
> /* Our 2nd DNS IP address */
> struct in_addr net_dns_server2;
> #endif
> +/* Indicates whether the pxe path prefix / config file was specified in dhcp
> option */
> +char *pxelinux_configfile;
>
> /** END OF BOOTP EXTENTIONS **/
>
> @@ -510,6 +513,10 @@ restart:
> dhcp_request(); /* Basically same as BOOTP */
> break;
> #endif
> + case DHCP6:
> + if (IS_ENABLED(CONFIG_CMD_DHCP6))
> + dhcp6_start();
> + break;
> #if defined(CONFIG_CMD_BOOTP)
> case BOOTP:
> bootp_reset();
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
utput = u_boot_console.run_command('dhcp6')
> +assert 'DHCP6 client bound to ' in output
> +
> +global net6_set_up
> +net6_set_up = True
> +
> @pytest.mark.buildconfigspec('net')
> def test_net_setup_static(u_boot_console):
> """Set up a static IP configuration.
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
:
> + case PHY_INTERFACE_MODE_RGMII_RXID:
> + case PHY_INTERFACE_MODE_RGMII_TXID:
> + return 1;
> + default:
> + fallthrough;
> + }
> + return 0;
> }
>
> /**
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
On Tue, Apr 25, 2023 at 4:17 PM Eugen Hristev
wrote:
>
> On 4/25/23 16:06, Eugen Hristev wrote:
> > Add minimal support for 8125B version.
> > Changes are based on the Linux driver.
> > Tested on Radxa Rock 5B Rk3588 board.
> >
> > Connection to a laptop worked fine in 100 Mbps mode.
> > 1000 Mbps
_clk_en)
> phy_write_mmd(phydev, DP83867_DEVADDR,
> DP83867_SGMIICTL,
> DP83867_SGMII_TYPE);
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
> + case PHY_INTERFACE_MODE_RGMII_RXID:
> + case PHY_INTERFACE_MODE_RGMII_TXID:
> + return 1;
> + default:
> + return 0;
> + }
> }
>
> bool phy_interface_is_ncsi(void);
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
phydev->interface >= PHY_INTERFACE_MODE_SGMII &&
> - phydev->interface <= PHY_INTERFACE_MODE_QSGMII;
> -}
> -
> bool phy_interface_is_ncsi(void);
>
> /* PHY UIDs for various PHYs that are referenced in external code */
> --
> 2.40.0
>
Reviewed-by: Ramon Fried
On Tue, Apr 25, 2023 at 10:47 PM Eugen Hristev
wrote:
>
> On 4/25/23 22:22, Ramon Fried wrote:
> > On Tue, Apr 25, 2023 at 4:17 PM Eugen Hristev
> > wrote:
> >>
> >> On 4/25/23 16:06, Eugen Hristev wrote:
> >>> Add minimal support for 8125B vers
be released
> and pushed back to the list. Also return the more appropriate
> -EAGAIN instead of -EINVAL if the descriptor is not ready yet.
>
> Reviewed-by: Marek Vasut
> Signed-off-by: Valentine Barshak
> ---
> Cc: Joe Hershberger
> Cc: Ramon Fried
> ---
> driv
urces = eqos_probe_resources_jh7110,
> + .eqos_remove_resources = eqos_remove_resources_jh7110,
> + .eqos_stop_resets = eqos_stop_resets_jh7110,
> + .eqos_start_resets = eqos_start_resets_jh7110,
> + .eqos_stop_clks = eqos_stop_clks_jh7110,
> + .eqos_start_clks = eqos_start_clks_jh7110,
> + .eqos_calibrate_pads = eqos_null_ops,
> + .eqos_disable_calibration = eqos_null_ops,
> + .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_jh7110,
> + .eqos_get_enetaddr = eqos_null_ops,
> + .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_jh7110
> +};
> +
> +/* mdio_wait: There is no need to wait after setting the MAC_MDIO_Address
> register
> + * swr_wait: Software reset bit must be read at least 4 CSR clock cycles
> + * after it is written to 1.
> + * config_mac: Enable rx queue to DCB mode.
> + * config_mac_mdio: CSR clock range is 250-300 Mhz.
> + * axi_bus_width: The width of the data bus is 64 bit.
> + */
> +struct eqos_config __maybe_unused eqos_jh7110_config = {
> + .reg_access_always_ok = false,
> + .mdio_wait = 0,
> + .swr_wait = 4,
> + .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB,
> + .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300,
> + .axi_bus_width = EQOS_AXI_WIDTH_64,
> + .interface = dev_read_phy_mode,
> + .ops = &eqos_jh7110_ops
> +};
> --
> 2.17.1
>
Reviewed-by: Ramon Fried
1 - 100 of 1191 matches
Mail list logo