From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E66E0C433F5 for ; Mon, 25 Oct 2021 16:54:50 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EFEB460EBC for ; Mon, 25 Oct 2021 16:54:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org EFEB460EBC Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id AE330834F1; Mon, 25 Oct 2021 18:54:47 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="VGHLTWMt"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5E13B8352A; Mon, 25 Oct 2021 18:54:46 +0200 (CEST) Received: from mail-lf1-x142.google.com (mail-lf1-x142.google.com [IPv6:2a00:1450:4864:20::142]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A680183458 for ; Mon, 25 Oct 2021 18:54:40 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=roman.bacik@broadcom.com Received: by mail-lf1-x142.google.com with SMTP id y26so10880850lfa.11 for ; Mon, 25 Oct 2021 09:54:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=S95qDS4ELsehJlD/RQImy0ywqLoapmnVhHJRNv9rpGY=; b=VGHLTWMtfBxQ7DNx0jP+CqkEDQaM5DdedtIChvSveV457IaxdPnG5gUifbHQMio8ll sf+/t+U10/m0E+HNhwWwrmVdAngbp84SQVjfpGgC5t7SjgGn0MYhX6SgcLZROlBccXiU r7vzSQwHN2jYpHtPfdSi0ChKNsJ/VT9zAPBdY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=S95qDS4ELsehJlD/RQImy0ywqLoapmnVhHJRNv9rpGY=; b=37CnHX9MEgzM61/8xiB7RWEFwKVLU2hGkhfkZy5KviVZIlSuWHx26QPR6pEuUM/nJV qgirY79j7YUHfUvaV1uIoITxedI+btoDiztBxuSvseP0qhTunAZdUxHvd+BTrNrsTdEY tF/b5m7Z3562lD/BtCkXKnW8cvlvPJxp+mEV7i2uXN5xVqLmCc+Ux1c5xuJF03ik8ut1 Eufpxot+tOQc3vkQKQmzQMnTwOoKCvzRBj5Srn48+exsZLSKSYZvxajTLA4U8RBIBipV ZG+Agxhbo6Li01XSmwiSWLatj+ohEd8H2PPjM/xmNC+oNsyKt38CoM1fagNDDQn2OZ+q diTA== X-Gm-Message-State: AOAM533GNsH7okUJ1tmIougC9//AYGZuCHCHUiA5tqiZ235QIeLiG4nG FITUJjA1PExG3re4Dts/3KxfqBmVoPb3XnIoQRc7dSbewnYMqoD6CG+iglbusgtmHX6wvWoj1Dx i70wh1TzJz0XJPd4PyVdj X-Google-Smtp-Source: ABdhPJwph3n21Jf8+hDXoWXynvOTs3qvjJHJAAbd12dbgFzx+nIqIpGcofGRwLOkTwXO4S1FiTIEnJZmCTrbSw1w4YY= X-Received: by 2002:ac2:5387:: with SMTP id g7mr11430346lfh.6.1635180879798; Mon, 25 Oct 2021 09:54:39 -0700 (PDT) From: Roman Bacik References: <20211022162222.v2.1.I1edaad77041c1300213c307eef6741499504047@changeid> <20211022162222.v2.2.I1edaad77041c1300213c307eef6741499504047@changeid> <93f977f0-1d8e-4411-f444-27a1574e990e@gmx.de> In-Reply-To: <93f977f0-1d8e-4411-f444-27a1574e990e@gmx.de> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQJLIuxJtMcd2WpbjgEnCkOJ7lkXfwI03MuDAuNnXOaq1HmusA== Date: Mon, 25 Oct 2021 09:54:37 -0700 Message-ID: Subject: RE: [PATCH v2 2/2] cmd: brcm: netXtreme commands To: Heinrich Schuchardt , U-Boot Mailing List Cc: Bharat Gooty , Bin Meng , Franck LENORMAND , Kory Maincent , Michal Simek , Patrick Delaunay , Peng Fan , Priyanka Jain , Rayagonda Kokatanur , Sean Anderson , Simon Glass Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="00000000000081c69a05cf303728" X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean --00000000000081c69a05cf303728 Content-Type: text/plain; charset="UTF-8" > -----Original Message----- > From: Heinrich Schuchardt > Sent: Saturday, October 23, 2021 1:02 AM > To: Roman Bacik ; U-Boot Mailing List boot@lists.denx.de> > Cc: Bharat Gooty ; Bin Meng > ; Franck LENORMAND > ; Kory Maincent > ; Michal Simek ; > Patrick Delaunay ; Peng Fan > ; Priyanka Jain ; Rayagonda > Kokatanur ; Sean Anderson > ; Simon Glass > Subject: Re: [PATCH v2 2/2] cmd: brcm: netXtreme commands > > > > On 10/23/21 01:23, Roman Bacik wrote: > > From: Bharat Gooty > > > > Following netXtreme commands are supported:- > > Device probe, remove, supported speeds, get/set speeds and > > get/set MAC address. > > > > Signed-off-by: Bharat Gooty > > > > Signed-off-by: Roman Bacik > > Please, add a man-page for the new command in doc/usage/. > Here is an example: doc/usage/loady.rst > Add the new man-page to doc/usage/index.rst > Test building with 'make htmldocs'. > > > --- > > > > (no changes since v1) > > > > cmd/Kconfig | 2 + > > cmd/broadcom/Kconfig | 10 ++ > > cmd/broadcom/Makefile | 3 +- > > cmd/broadcom/bnxt.c | 237 > ++++++++++++++++++++++++++++++++++++++++++ > > 4 files changed, 251 insertions(+), 1 deletion(-) > > create mode 100644 cmd/broadcom/Kconfig > > create mode 100644 cmd/broadcom/bnxt.c > > > > diff --git a/cmd/Kconfig b/cmd/Kconfig > > index 5b30b13e438f..e054292dbcd0 100644 > > --- a/cmd/Kconfig > > +++ b/cmd/Kconfig > > @@ -1953,6 +1953,8 @@ endmenu > > > > source "cmd/ti/Kconfig" > > > > +source "cmd/broadcom/Kconfig" > > + > > config CMD_BOOTSTAGE > > bool "Enable the 'bootstage' command" > > depends on BOOTSTAGE > > diff --git a/cmd/broadcom/Kconfig b/cmd/broadcom/Kconfig > > new file mode 100644 > > index 000000000000..6f16b09d1425 > > --- /dev/null > > +++ b/cmd/broadcom/Kconfig > > @@ -0,0 +1,10 @@ > > +menu "Broadcom specific command line interface" > > + > > +config BNXT_ETH_CMD > > + bool "BNXT commands" > > + depends on BNXT_ETH > > + help > > + Broadcom NXS ethernet controller commands. Commands > supported are:- > > + Driver probe, Driver remove, Supported speeds, get/set MAC > address and get/set Link speeds. > > + > > +endmenu > > diff --git a/cmd/broadcom/Makefile b/cmd/broadcom/Makefile > > index 62268d98d0dd..0027c1c15e5a 100644 > > --- a/cmd/broadcom/Makefile > > +++ b/cmd/broadcom/Makefile > > @@ -1,6 +1,7 @@ > > # SPDX-License-Identifier: GPL-2.0+ > > -# Copyright 2020 Broadcom > > +# Copyright 2020-2021 Broadcom > > > > obj-y += chimp_boot.o > > obj-y += nitro_image_load.o > > obj-y += chimp_handshake.o > > +obj-$(CONFIG_BNXT_ETH_CMD) += bnxt.o > > diff --git a/cmd/broadcom/bnxt.c b/cmd/broadcom/bnxt.c > > new file mode 100644 > > index 000000000000..b9d1e59a74fb > > --- /dev/null > > +++ b/cmd/broadcom/bnxt.c > > @@ -0,0 +1,237 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * Copyright 2021 Broadcom > > + */ > > + > > +#include > > +#include > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +static int do_bnxt_set_link(struct bnxt *bp, char *link_str) > > +{ > > + bp->link_set = simple_strtoul(link_str, NULL, 16); > > + > > + switch (bp->link_set) { > > + case LINK_SPEED_DRV_AUTONEG: > > + printf("- AutoNeg Not Supported\n"); > > + return 0; > > Please, remove the leading '- '. It just increases code size. > In case of an error, please, return CMD_RET_FAILURE. > Please, remove captitalization of 'Not Supported' > > > + case LINK_SPEED_DRV_1G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_1GB)) { > > + printf("- 1 GBPS: Link Speed is not supported\n"); > > ditto > > > + return 0; > > + } > > + > > + break; > > + case LINK_SPEED_DRV_10G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_10GB)) { > > + printf("- 10 GBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > > + } > > + > > + break; > > + case LINK_SPEED_DRV_25G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_25GB)) { > > + printf("- 25 GBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > + } > > + > > + break; > > + case LINK_SPEED_DRV_40G: > > + printf("- 40 GBPS Not Supported\n"); > > + return 0; > > ditto > > > + case LINK_SPEED_DRV_50G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_50GB)) { > > + printf("- 50 GBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > + } > > + > > + break; > > + case LINK_SPEED_DRV_100G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_100GB)) { > > + printf("- 100 GBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > + } > > + > > + break; > > + case LINK_SPEED_DRV_200G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_200GB)) { > > + printf("- 200 GBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > + } > > + > > + break; > > + case LINK_SPEED_DRV_2_5G: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_2_5GB)) { > > + printf("- 2.5 GBPS: Link Speed is not supported\n"); > > ditto > > > + return 0; > > + } > > + > > + break; > > + case LINK_SPEED_DRV_100M: > > + if (!(bp->support_speeds & > PORT_QCFG_SUPPORT_SPEEDS_100MB)) { > > + printf("- 100 MBPS: Link Speed is not supported\n"); > > + return 0; > > ditto > > > + } > > + > > + break; > > + default: > > + printf("- Invalid Link Speed specified\n"); > > + return CMD_RET_USAGE; > > + } > > + > > + prn_link_speed(bp->link_set, 1); > > + > > + return bnxt_set_link_speed(bp); > > +} > > + > > +static int (struct bnxt *bp, char *mac_str) > > +{ > > + struct eth_pdata *plat = dev_get_plat(bp->pdev); > > + u8 addr[ETH_ALEN]; > > + int ret = CMD_RET_USAGE; > > + > > + if (eth_validate_ethaddr_str(mac_str)) { > > + printf("Invalid MAC Address %s\n", mac_str); > > + return 0; > > return CMD_RET_FAILURE > > %s/Invalid MAC Address/Invalid MAC address/ > > > > + } > > + > > + string_to_enetaddr(mac_str, &addr[0]); > > + > > + if (!is_valid_ethaddr(&addr[0])) { > > + printf("- Warning: Invalid MAC address to set\n"); > > Please, be consistent. > > %s/- Warning: // > > > + return 0; > > return CMD_RET_FAILURE > > > + } > > + > > + memcpy(bp->mac_set, addr, ETH_ALEN); > > + > > + print_mac(&bp->mac_set[0], 1); > > + ret = bnxt_set_mac(bp); > > + if (ret) > > + return ret; > > + > > + bnxt_hwrm_nvm_flush(bp); > > + > > + /* copy ROM MAC to environment. */ > > + memcpy(plat->enetaddr, bp->mac_set, ETH_ALEN); > > + bnxt_env_set_ethaddr(bp->pdev); > > + > > + return CMD_RET_SUCCESS; > > +} > > + > > +static int print_drv(u8 flag) > > +{ > > + printf("bnxt - Device "); > > + if (flag) > > + printf("already"); > > + else > > + printf("not"); > > + > > + printf(" initialized\n"); > > + > > + return CMD_RET_SUCCESS; > > +} > > + > > +static int bnxt_parse_input(int argc, char *const argv[]) > > +{ > > + if (!strcmp(argv[2], "probe")) { > > + return CMD_PROBE; > > + } else if (!strcmp(argv[2], "remove")) { > > + return CMD_REMOVE; > > + } else if (!strcmp(argv[2], "get")) { > > + if (!strncmp(argv[3], "supported_speed", 16)) > > + return CMD_GET_SUPPORTED_SPEED; > > + else if (!strncmp(argv[3], "link_speed", 11)) > > + return CMD_GET_LINK_SPEED; > > + else if (!strncmp(argv[3], "mac", 4)) > > + return CMD_GET_MAC; > > + } > > + > > + return CMD_UNKNOWN; > > +} > > + > > +static int do_bnxt(struct cmd_tbl *cmdtp, int flag, int argc, char > > *const > argv[]) > > +{ > > Please, implement the subcommands as described in > doc/develop/commands.rst. > https://u-boot.readthedocs.io/en/latest/develop/commands.html > This avoids reinventing the wheel and reduces code size. > > > + struct udevice *dev; > > + struct bnxt *bp; > > + char name[30]; > > + int ret = CMD_RET_USAGE; > > + int cardnum; > > + int op; > > + > > + printf("\n"); > > + if (argc < 2) > > + return ret; > > + > > + cardnum = simple_strtoul(argv[1], NULL, 10); > > + sprintf(name, "bnxt_eth%u", cardnum); > > + ret = uclass_get_device_by_name(UCLASS_ETH, name, &dev); > > + if (ret) > > + return CMD_RET_USAGE; > > + > > + bp = dev_get_priv(dev); > > + op = bnxt_parse_input(argc, argv); > > + ret = CMD_RET_USAGE; > > + switch (op) { > > + case CMD_PROBE: > > + if (!bp->drv_load) > > + ret = bnxt_drv_probe(dev); > > + else > > + ret = print_drv(1); > > + break; > > + case CMD_REMOVE: > > + ret = bnxt_drv_remove(dev); > > + break; > > + case CMD_GET_SUPPORTED_SPEED: > > + ret = bnxt_supported_speed(bp); > > + break; > > + case CMD_GET_MAC: > > + ret = bnxt_get_mac(bp); > > + break; > > + case CMD_GET_LINK_SPEED: > > + ret = bnxt_get_link_speed(bp); > > + break; > > + case CMD_SET_MAC: > > + ret = do_bnxt_set_mac(bp, argv[4]); > > + break; > > + case CMD_SET_LINK_SPEED: > > + ret = do_bnxt_set_link(bp, argv[4]); > > + break; > > + default: > > + if (op && !bp->drv_load) > > + ret = print_drv(0); > > + } > > + > > + printf("\n"); > > + > > + return ret; > > +} > > + > > +U_BOOT_CMD > > + (bnxt, 5, 1, do_bnxt, > > + "Broadcom NetXtreme-C/E Management", > > + /* */" probe\n" > > + " - Load Driver Instance.\n" > > Please, remove capitalization and period at end of enumberation lines. > Saves us a few bytes. > > Best regards > > Heinrich Heinrich, We will address your comments in the next version. Thank you very much for your review, Roman > > > + "bnxt remove\n" > > + " - Unload Driver Instance.\n" > > + "bnxt get supported_speed\n" > > + " - Get Supported Link Speeds.\n" > > + "bnxt get link_speed\n" > > + " - Get Current Link Speed.\n" > > + "bnxt get mac\n" > > + " - Get MAC Address.\n" > > +); > > -- This electronic communication and the information and any files transmitted with it, or attached to it, are confidential and are intended solely for the use of the individual or entity to whom it is addressed and may contain information that is confidential, legally privileged, protected by privacy laws, or otherwise restricted from disclosure to anyone else. If you are not the intended recipient or the person responsible for delivering the e-mail to the intended recipient, you are hereby notified that any use, copying, distributing, dissemination, forwarding, printing, or copying of this e-mail is strictly prohibited. If you received this e-mail in error, please return the e-mail to the sender, delete it from your computer, and destroy any printed copy of it. --00000000000081c69a05cf303728 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature 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 6kRRYRlzjF1rVR3PZvtVpwKTcWvwqez9YnB5W7zFh0J6WXsQJsLKZoRNvv4VXAk2vycIsWR+aeNb l0x6vipMzcE90s2JZ/wqJlxX8dutql3gueCzZ2SxAgMBAAGjggHZMIIB1TAOBgNVHQ8BAf8EBAMC BaAwgaMGCCsGAQUFBwEBBIGWMIGTME4GCCsGAQUFBzAChkJodHRwOi8vc2VjdXJlLmdsb2JhbHNp Z24uY29tL2NhY2VydC9nc2djY3IzcGVyc29uYWxzaWduMmNhMjAyMC5jcnQwQQYIKwYBBQUHMAGG NWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwME0G A1UdIARGMEQwQgYKKwYBBAGgMgEoCjA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxz aWduLmNvbS9yZXBvc2l0b3J5LzAJBgNVHRMEAjAAMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9j cmwuZ2xvYmFsc2lnbi5jb20vZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3JsMCMGA1UdEQQc MBqBGHJvbWFuLmJhY2lrQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEFBQcDBDAfBgNVHSME GDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUFIRMHHEZDi127CpeMcPLPgCva8Aw DQYJKoZIhvcNAQELBQADggEBAJ3AlGS8SnTzvdaHc1sGWw7/pdUpzU59NLy5p827v5YbcxopZQPL v2q6YbcQTpQnxVa++htLqp+WyOb3PTzydNsHb5B++mR/jz9/+mJsa7yvtLkcDDcQrOfrZus6usQs oGwMj7g7D2OvJHuBtBRpqnKDRO4Wi7MHuGDfW6Wm+YJ3iibIl8OPWiqXlfOlkYxAaZcAAW84IeeM umNUQbWNMoBfa5qSHxe3ZWGNFZWnpTN7vp4rmu8Z1qrZGrSVc9IO3z+3/AD9GdYdelj8miFNczvR 0iiTaHiP8f5hiC8LUlKosTub10tap8TP0SCcuXM5RgS1q9QJ/zmwbg1zPbTTGkgxggJtMIICaQIB ATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYDVQQDEyhH bG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgwhRMMZKMaVhUl0DO8wDQYJ YIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEIM2gi3QaQbL8t6IBsBVB/23So+oZsVU87fLs IGN7DTx6MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIxMTAyNTE2 NTQ0MFowaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFl AwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFlAwQCATAN BgkqhkiG9w0BAQEFAASCAQBKDseEJAuh0lZFPpHERu8bEP2va09flizmMqjgrCjaCerjF+PSnxu6 BPDbMuHaCDyL6iCI/4YqaqDnb2rz+qomEj1nlfpDV9VpLCeOABa6zgxjD3R5+pVDXpBCgK/sDliG ktuYnS86jynqQT/Qsi7qdRlCnPDiXJt7XUm0MaFgtcloEv3kebOOgQ7CwFec8pec9HrBY/ZQ6P6R 2ItWFkAawpSa6JovmA8dqlc4N1ugQToCYVfXVSwnp/0Lwx5q59rppC66N6DY9d192jH4KbYS/06Z C5HJo8asb+IGP0N2DhZ8mViM0luCHFss8dPk+GDkKPvshrE+29RrGjrN7Vw1 --00000000000081c69a05cf303728--