|
17 | 17 | import click
|
18 | 18 | import sonic_platform
|
19 | 19 | import sonic_platform_base.sonic_sfp.sfputilhelper
|
| 20 | +from sfputil.debug import debug |
20 | 21 | from sonic_platform_base.sfp_base import SfpBase
|
21 | 22 | from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
|
22 | 23 | from natsort import natsorted
|
@@ -605,6 +606,8 @@ def cli():
|
605 | 606 | sys.exit(ERROR_PORT_CONFIG_LOAD)
|
606 | 607 |
|
607 | 608 |
|
| 609 | +cli.add_command(debug) |
| 610 | + |
608 | 611 | # 'show' subgroup
|
609 | 612 | @cli.group()
|
610 | 613 | def show():
|
@@ -1965,116 +1968,5 @@ def get_overall_offset_sff8472(api, page, offset, size, wire_addr):
|
1965 | 1968 | return page * PAGE_SIZE + offset + PAGE_SIZE_FOR_A0H
|
1966 | 1969 |
|
1967 | 1970 |
|
1968 |
| -# 'debug' subgroup |
1969 |
| -@cli.group() |
1970 |
| -def debug(): |
1971 |
| - """Module debug and diagnostic control""" |
1972 |
| - pass |
1973 |
| - |
1974 |
| - |
1975 |
| -# 'loopback' subcommand |
1976 |
| -@debug.command() |
1977 |
| -@click.argument('port_name', required=True) |
1978 |
| -@click.argument('loopback_mode', required=True, |
1979 |
| - type=click.Choice(["host-side-input", "host-side-output", |
1980 |
| - "media-side-input", "media-side-output"])) |
1981 |
| -@click.argument('enable', required=True, type=click.Choice(["enable", "disable"])) |
1982 |
| -def loopback(port_name, loopback_mode, enable): |
1983 |
| - """Set module diagnostic loopback mode |
1984 |
| - """ |
1985 |
| - physical_port = logical_port_to_physical_port_index(port_name) |
1986 |
| - sfp = platform_chassis.get_sfp(physical_port) |
1987 |
| - |
1988 |
| - if is_port_type_rj45(port_name): |
1989 |
| - click.echo("{}: This functionality is not applicable for RJ45 port".format(port_name)) |
1990 |
| - sys.exit(EXIT_FAIL) |
1991 |
| - |
1992 |
| - if not is_sfp_present(port_name): |
1993 |
| - click.echo("{}: SFP EEPROM not detected".format(port_name)) |
1994 |
| - sys.exit(EXIT_FAIL) |
1995 |
| - |
1996 |
| - try: |
1997 |
| - api = sfp.get_xcvr_api() |
1998 |
| - except NotImplementedError: |
1999 |
| - click.echo("{}: This functionality is not implemented".format(port_name)) |
2000 |
| - sys.exit(ERROR_NOT_IMPLEMENTED) |
2001 |
| - |
2002 |
| - namespace = multi_asic.get_namespace_for_port(port_name) |
2003 |
| - config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) |
2004 |
| - if config_db is not None: |
2005 |
| - config_db.connect() |
2006 |
| - try: |
2007 |
| - subport = int(config_db.get(config_db.CONFIG_DB, f'PORT|{port_name}', 'subport')) |
2008 |
| - except TypeError: |
2009 |
| - click.echo(f"{port_name}: subport is not present in CONFIG_DB") |
2010 |
| - sys.exit(EXIT_FAIL) |
2011 |
| - |
2012 |
| - # If subport is set to 0, assign a default value of 1 to ensure valid subport configuration |
2013 |
| - if subport == 0: |
2014 |
| - subport = 1 |
2015 |
| - else: |
2016 |
| - click.echo(f"{port_name}: Failed to connect to CONFIG_DB") |
2017 |
| - sys.exit(EXIT_FAIL) |
2018 |
| - |
2019 |
| - state_db = SonicV2Connector(use_unix_socket_path=False, namespace=namespace) |
2020 |
| - if state_db is not None: |
2021 |
| - state_db.connect(state_db.STATE_DB) |
2022 |
| - try: |
2023 |
| - host_lane_count = int(state_db.get(state_db.STATE_DB, |
2024 |
| - f'TRANSCEIVER_INFO|{port_name}', |
2025 |
| - 'host_lane_count')) |
2026 |
| - except TypeError: |
2027 |
| - click.echo(f"{port_name}: host_lane_count is not present in STATE_DB") |
2028 |
| - sys.exit(EXIT_FAIL) |
2029 |
| - |
2030 |
| - try: |
2031 |
| - media_lane_count = int(state_db.get(state_db.STATE_DB, |
2032 |
| - f'TRANSCEIVER_INFO|{port_name}', |
2033 |
| - 'media_lane_count')) |
2034 |
| - except TypeError: |
2035 |
| - click.echo(f"{port_name}: media_lane_count is not present in STATE_DB") |
2036 |
| - sys.exit(EXIT_FAIL) |
2037 |
| - else: |
2038 |
| - click.echo(f"{port_name}: Failed to connect to STATE_DB") |
2039 |
| - sys.exit(EXIT_FAIL) |
2040 |
| - |
2041 |
| - if 'host-side' in loopback_mode: |
2042 |
| - lane_mask = get_subport_lane_mask(subport, host_lane_count) |
2043 |
| - elif 'media-side' in loopback_mode: |
2044 |
| - lane_mask = get_subport_lane_mask(subport, media_lane_count) |
2045 |
| - else: |
2046 |
| - lane_mask = 0 |
2047 |
| - |
2048 |
| - try: |
2049 |
| - status = api.set_loopback_mode(loopback_mode, |
2050 |
| - lane_mask=lane_mask, |
2051 |
| - enable=enable == 'enable') |
2052 |
| - except AttributeError: |
2053 |
| - click.echo("{}: Set loopback mode is not applicable for this module".format(port_name)) |
2054 |
| - sys.exit(ERROR_NOT_IMPLEMENTED) |
2055 |
| - except TypeError: |
2056 |
| - click.echo("{}: Set loopback mode failed. Parameter is not supported".format(port_name)) |
2057 |
| - sys.exit(EXIT_FAIL) |
2058 |
| - |
2059 |
| - if status: |
2060 |
| - click.echo("{}: {} {} loopback".format(port_name, enable, loopback_mode)) |
2061 |
| - else: |
2062 |
| - click.echo("{}: {} {} loopback failed".format(port_name, enable, loopback_mode)) |
2063 |
| - sys.exit(EXIT_FAIL) |
2064 |
| - |
2065 |
| - |
2066 |
| -def get_subport_lane_mask(subport, lane_count): |
2067 |
| - """Get the lane mask for the given subport and lane count |
2068 |
| -
|
2069 |
| - Args: |
2070 |
| - subport (int): Subport number |
2071 |
| - lane_count (int): Lane count for the subport |
2072 |
| -
|
2073 |
| - Returns: |
2074 |
| - int: Lane mask for the given subport and lane count |
2075 |
| - """ |
2076 |
| - return ((1 << lane_count) - 1) << ((subport - 1) * lane_count) |
2077 |
| - |
2078 |
| - |
2079 | 1971 | if __name__ == '__main__':
|
2080 | 1972 | cli()
|
0 commit comments