Skip to content

Commit 75bfd79

Browse files
peileelikartben
authored andcommitted
net: shell: iface: Add link speed settings command
Add this to set link speed through net_shell. Current zephyr version doesn't have user interface to change speed, hence adding this to accomodate it. Full duplex will be set by default for each link speed. Able to change link speed using command below: net iface set_link <iface idx> <speed> <optional:h(half)/f(full)> eg: net iface set_link 1 100 h net iface set_link 1 10 f net iface set_link 1 1000 Able to set multiple link speed like below: net iface set_link <iface idx> <speed1> <speed2> <optional:h/f> eg: net iface set_link 1 10 100 h net iface set_link 1 1000 f 10 Signed-off-by: Ling Pei Lee <pei.lee.ling@intel.com>
1 parent 6d16180 commit 75bfd79

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

subsys/net/lib/shell/iface.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,83 @@ static int cmd_net_default_iface(const struct shell *sh, size_t argc, char *argv
817817
return 0;
818818
}
819819

820+
#if defined(CONFIG_ETH_PHY_DRIVER)
821+
static int cmd_net_link_speed(const struct shell *sh, size_t argc, char *argv[])
822+
{
823+
int idx = get_iface_idx(sh, argv[1]);
824+
const struct device *phy_dev;
825+
bool half_duplex = false;
826+
uint16_t user_input_spd;
827+
struct net_if *iface;
828+
uint16_t speed = 0U;
829+
int ret;
830+
831+
if (argc < 3) {
832+
PR_WARNING("Usage: net iface set_link <index> "
833+
"<Speed:10/100/1000/2500/5000> [Duplex]:h/f>\n");
834+
return -ENOEXEC;
835+
}
836+
837+
iface = net_if_get_by_index(idx);
838+
if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) {
839+
PR_WARNING("Interface %d is not Ethernet type\n", idx);
840+
return -EINVAL;
841+
}
842+
843+
phy_dev = net_eth_get_phy(iface);
844+
if (!phy_dev) {
845+
PR_WARNING("No PHY device found for interface %d\n", idx);
846+
return -ENOEXEC;
847+
}
848+
849+
for (int k = 2; k < argc; k++) {
850+
if ((k + 1 < argc) && (argv[k+1][0] == 'h')) {
851+
half_duplex = true;
852+
} else {
853+
half_duplex = false;
854+
}
855+
856+
user_input_spd = shell_strtoul(argv[k], 10, &ret);
857+
switch (user_input_spd) {
858+
case 0:
859+
break;
860+
case 10:
861+
speed |= half_duplex ? LINK_HALF_10BASE : LINK_FULL_10BASE;
862+
break;
863+
case 100:
864+
speed |= half_duplex ? LINK_HALF_100BASE : LINK_FULL_100BASE;
865+
break;
866+
case 1000:
867+
speed |= half_duplex ? LINK_HALF_1000BASE : LINK_FULL_1000BASE;
868+
break;
869+
case 2500:
870+
if (half_duplex) {
871+
PR_WARNING("2500BASE half-duplex not supported\n");
872+
return -ENOTSUP;
873+
}
874+
speed |= LINK_FULL_2500BASE;
875+
break;
876+
case 5000:
877+
if (half_duplex) {
878+
PR_WARNING("5000BASE half-duplex not supported\n");
879+
return -ENOTSUP;
880+
}
881+
speed |= LINK_FULL_5000BASE;
882+
break;
883+
default:
884+
PR_WARNING("Unsupported speed %d\n", user_input_spd);
885+
return -ENOTSUP;
886+
}
887+
}
888+
889+
if (speed != 0U) {
890+
return phy_configure_link(phy_dev, speed);
891+
}
892+
PR_WARNING("No speed specified\n");
893+
return -ENOEXEC;
894+
}
895+
#endif /* CONFIG_ETH_PHY_DRIVER */
896+
820897
#if defined(CONFIG_NET_SHELL_DYN_CMD_COMPLETION)
821898

822899
#include "iface_dynamic.h"
@@ -841,6 +918,13 @@ SHELL_STATIC_SUBCMD_SET_CREATE(net_cmd_iface,
841918
SHELL_CMD(default, IFACE_DYN_CMD,
842919
"'net iface default [<index>]' displays or sets the default network interface.",
843920
cmd_net_default_iface),
921+
#if defined(CONFIG_ETH_PHY_DRIVER)
922+
SHELL_CMD(set_link, IFACE_DYN_CMD,
923+
"'net iface set_link <index> <Speed 10/100/1000/2500/5000> "
924+
"<Duplex[optional]:h/f>'"
925+
" sets link speed for the network interface.",
926+
cmd_net_link_speed),
927+
#endif /* CONFIG_ETH_PHY_DRIVER */
844928
SHELL_SUBCMD_SET_END
845929
);
846930

0 commit comments

Comments
 (0)