diff options
Diffstat (limited to 'mst_utils')
| -rw-r--r-- | mst_utils/Makefile.am | 12 | ||||
| -rw-r--r-- | mst_utils/Makefile.in | 98 | ||||
| -rw-r--r-- | mst_utils/cable_discovery.cpp | 130 | ||||
| -rw-r--r-- | mst_utils/mdevices_info.c | 66 |
4 files changed, 288 insertions, 18 deletions
diff --git a/mst_utils/Makefile.am b/mst_utils/Makefile.am index 251bcd2..e0e23a5 100644 --- a/mst_utils/Makefile.am +++ b/mst_utils/Makefile.am @@ -40,4 +40,14 @@ mstdevices_info_DEPENDENCIES = $(top_builddir)/${MTCR_CONF_DIR}/libmtcr_ul.la \ $(top_builddir)/dev_mgt/libdev_mgt.la \ $(top_builddir)/reg_access/libreg_access.la mstdevices_info_LDADD = $(mstdevices_info_DEPENDENCIES) ${LDL} -mstdevices_info_LDFLAGS = -static \ No newline at end of file +mstdevices_info_LDFLAGS = -static + +if ENABLE_CABLES +bin_PROGRAMS += mstcable_discovery +mstcable_discovery_SOURCES = cable_discovery.cpp +mstcable_discovery_DEPENDENCIES = $(top_builddir)/${MTCR_CONF_DIR}/libmtcr_ul.la \ + $(top_builddir)/dev_mgt/libdev_mgt.la \ + $(top_builddir)/reg_access/libreg_access.la + mstcable_discovery_LDADD = $(mstcable_discovery_DEPENDENCIES) ${LDL} + mstcable_discovery_LDFLAGS = -static +endif \ No newline at end of file diff --git a/mst_utils/Makefile.in b/mst_utils/Makefile.in index abdb671..95f2bfe 100644 --- a/mst_utils/Makefile.in +++ b/mst_utils/Makefile.in @@ -110,28 +110,38 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = mstdevices_info$(EXEEXT) +bin_PROGRAMS = mstdevices_info$(EXEEXT) $(am__EXEEXT_1) +@ENABLE_CABLES_TRUE@am__append_1 = mstcable_discovery subdir = mst_utils DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/config/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ - $(top_srcdir)/configure.ac + $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +@ENABLE_CABLES_TRUE@am__EXEEXT_1 = mstcable_discovery$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) -am_mstdevices_info_OBJECTS = mdevices_info.$(OBJEXT) -mstdevices_info_OBJECTS = $(am_mstdevices_info_OBJECTS) +am__mstcable_discovery_SOURCES_DIST = cable_discovery.cpp +@ENABLE_CABLES_TRUE@am_mstcable_discovery_OBJECTS = \ +@ENABLE_CABLES_TRUE@ cable_discovery.$(OBJEXT) +mstcable_discovery_OBJECTS = $(am_mstcable_discovery_OBJECTS) am__DEPENDENCIES_1 = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = +mstcable_discovery_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(mstcable_discovery_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_mstdevices_info_OBJECTS = mdevices_info.$(OBJEXT) +mstdevices_info_OBJECTS = $(am_mstdevices_info_OBJECTS) mstdevices_info_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(mstdevices_info_LDFLAGS) $(LDFLAGS) \ @@ -170,8 +180,27 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(mstdevices_info_SOURCES) -DIST_SOURCES = $(mstdevices_info_SOURCES) +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(mstcable_discovery_SOURCES) $(mstdevices_info_SOURCES) +DIST_SOURCES = $(am__mstcable_discovery_SOURCES_DIST) \ + $(mstdevices_info_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -208,13 +237,13 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ +CABLE_ACCESS_DIR = @CABLE_ACCESS_DIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMPILER_FPIC = @COMPILER_FPIC@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CURL_INC_DIR = @CURL_INC_DIR@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ @@ -268,6 +297,7 @@ MUPARSER_CFLAGS = @MUPARSER_CFLAGS@ MUPARSER_LIBS = @MUPARSER_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ +NVML_DIR = @NVML_DIR@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OFED_BUILD = @OFED_BUILD@ @@ -281,6 +311,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PROJECT = @PROJECT@ RANLIB = @RANLIB@ SED = @SED@ @@ -293,6 +326,7 @@ TOOLS_BUILD_TIME = @TOOLS_BUILD_TIME@ TOOLS_CRYPTO = @TOOLS_CRYPTO@ TOOLS_GIT_SHA = @TOOLS_GIT_SHA@ VERSION = @VERSION@ +VFIO_DRIVER_DIR = @VFIO_DRIVER_DIR@ XZ_UTILS_DIR = @XZ_UTILS_DIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -320,6 +354,8 @@ default_en_inband = @default_en_inband@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ +expat_CFLAGS = @expat_CFLAGS@ +expat_LIBS = @expat_LIBS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ @@ -329,13 +365,23 @@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ +libcurl_CFLAGS = @libcurl_CFLAGS@ +libcurl_LIBS = @libcurl_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ +liblzma_CFLAGS = @liblzma_CFLAGS@ +liblzma_LIBS = @liblzma_LIBS@ +libxml2_CFLAGS = @libxml2_CFLAGS@ +libxml2_LIBS = @libxml2_LIBS@ +libz_CFLAGS = @libz_CFLAGS@ +libz_LIBS = @libz_LIBS@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +openssl_CFLAGS = @openssl_CFLAGS@ +openssl_LIBS = @openssl_LIBS@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ @@ -356,10 +402,17 @@ mstdevices_info_DEPENDENCIES = $(top_builddir)/${MTCR_CONF_DIR}/libmtcr_ul.la \ mstdevices_info_LDADD = $(mstdevices_info_DEPENDENCIES) ${LDL} mstdevices_info_LDFLAGS = -static +@ENABLE_CABLES_TRUE@mstcable_discovery_SOURCES = cable_discovery.cpp +@ENABLE_CABLES_TRUE@mstcable_discovery_DEPENDENCIES = $(top_builddir)/${MTCR_CONF_DIR}/libmtcr_ul.la \ +@ENABLE_CABLES_TRUE@ $(top_builddir)/dev_mgt/libdev_mgt.la \ +@ENABLE_CABLES_TRUE@ $(top_builddir)/reg_access/libreg_access.la + +@ENABLE_CABLES_TRUE@mstcable_discovery_LDADD = $(mstcable_discovery_DEPENDENCIES) ${LDL} +@ENABLE_CABLES_TRUE@mstcable_discovery_LDFLAGS = -static all: all-am .SUFFIXES: -.SUFFIXES: .c .lo .o .obj +.SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -440,6 +493,10 @@ clean-binPROGRAMS: echo " rm -f" $$list; \ rm -f $$list +mstcable_discovery$(EXEEXT): $(mstcable_discovery_OBJECTS) $(mstcable_discovery_DEPENDENCIES) $(EXTRA_mstcable_discovery_DEPENDENCIES) + @rm -f mstcable_discovery$(EXEEXT) + $(AM_V_CXXLD)$(mstcable_discovery_LINK) $(mstcable_discovery_OBJECTS) $(mstcable_discovery_LDADD) $(LIBS) + mstdevices_info$(EXEEXT): $(mstdevices_info_OBJECTS) $(mstdevices_info_DEPENDENCIES) $(EXTRA_mstdevices_info_DEPENDENCIES) @rm -f mstdevices_info$(EXEEXT) $(AM_V_CCLD)$(mstdevices_info_LINK) $(mstdevices_info_OBJECTS) $(mstdevices_info_LDADD) $(LIBS) @@ -450,6 +507,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cable_discovery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdevices_info.Po@am__quote@ .c.o: @@ -476,6 +534,30 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + mostlyclean-libtool: -rm -f *.lo diff --git a/mst_utils/cable_discovery.cpp b/mst_utils/cable_discovery.cpp new file mode 100644 index 0000000..f7c9850 --- /dev/null +++ b/mst_utils/cable_discovery.cpp @@ -0,0 +1,130 @@ +#include <cstdlib> +#include <cstdio> +#include <string> +#include <cstring> +#include <fstream> +#include <string.h> +#include <errno.h> +#include <sys/stat.h> +#include "include/mtcr_ul/mtcr.h" +#include "mtcr_ul/mtcr_cables.h" +#include "dev_mgt/tools_dev_types.h" +#include "reg_access/reg_access.h" +#include "tools_layouts/reg_access_hca_layouts.h" + + +const std::string MSTFLINT_DEV_DIR = "/dev/mstflint/"; + +int checkModule(mfile* mf, u_int32_t localPort) +{ + int ret = -1; + + if ((localPort < 1) || !mf) { + /*std::cout << "Invalid local port" << std::endl; */ + return ret; + } + + struct reg_access_hca_pmlp_reg_ext pmlp; + + memset(&pmlp, 0, sizeof(pmlp)); + pmlp.local_port = localPort; + if (reg_access_pmlp(mf, REG_ACCESS_METHOD_GET, &pmlp)) { + /* std::cout << "Failed to get module" << std::endl; */ + } else { + if (pmlp.width) { + ret = pmlp.lane_module_mapping[0].module; + } + } + + return ret; +} + +void CreateDirectoryIfNotExist(const std::string& poNewDirectory) +{ + if (mkdir(poNewDirectory.c_str(), + 0777)) { + switch (errno) { + case EEXIST: + case 0: + return; + + default: + throw std::runtime_error("Unable to create the directory: " + poNewDirectory + " " + strerror(errno)); + return; + } + } +} + +int main(int argc, char* argv[]) +{ + dev_info * devs = NULL; + int device_count = 0; + int num_ports = -1; + int verbose = 0; + int domain_needed = 0; + int ul_mode = 0; + unsigned int cable_count = 0; + + devs = mdevices_info_v(0xffffffff, &device_count, 1); + + if (!device_count || !devs) { + printf("\nNo supported PCIe devices were found.\n"); + if (devs) { + free(devs); + } + } + + for (int i = 0; i < device_count; i++) { + mfile* mf = mopen_adv(devs[i].dev_name, (MType)(MST_DEFAULT | MST_CABLE)); + if (!mf) { + continue; + } + + u_int32_t hw_id = 0; + u_int32_t hw_rev = 0; + dm_dev_id_t devid_type = DeviceUnknown; + if (dm_get_device_id(mf, &devid_type, &hw_id, &hw_rev) != GET_DEV_ID_SUCCESS) { + mclose(mf); + continue; + } + + + if (dm_is_5th_gen_hca(devid_type) && !dm_is_bluefield(devid_type)) { + num_ports = 1; + if (checkModule(mf, num_ports) == -1) { + mclose(mf); + continue; + } + } else if (dm_dev_is_switch(devid_type) && !dm_is_gpu(devid_type)) { + num_ports = dm_get_hw_ports_num(devid_type); + } else { + mclose(mf); + continue; + } + + mclose(mf); + + for (int port = 0; port < num_ports; port++) { + std::string cable_name = std::string(devs[i].dev_name) + "_" + CABLE_DEVICE_STR + std::to_string(port); + mfile * cable_mf = mopen_adv(cable_name.c_str(), (MType)(MST_DEFAULT | MST_CABLE)); + if (!cable_mf) { + continue; + } else { + CreateDirectoryIfNotExist(MSTFLINT_DEV_DIR); + std::ofstream mstDeviceFile(MSTFLINT_DEV_DIR + cable_name, std::ios::out | std::ios::trunc); + mstDeviceFile.close(); + cable_count++; + } + + mclose(cable_mf); + } + } + + if (cable_count == 0) { + printf("\nNo supported NVIDIA cables were found.\n"); + } else { + printf("Added %d NVIDIA cable devices.\n", cable_count); + } + + return 0; +} diff --git a/mst_utils/mdevices_info.c b/mst_utils/mdevices_info.c index 72cffa0..eea32fa 100644 --- a/mst_utils/mdevices_info.c +++ b/mst_utils/mdevices_info.c @@ -238,21 +238,24 @@ int print_rdma_bond_dev(char* net_dev_secondary, char* net_dev_primary) } void print_pci_info(dev_info* dev, int domain_needed) { + char dbdf[16384] = {0}; char fmt[16384] = {0}; /* Add PCI info */ if (domain_needed) { - sprintf(fmt, "%04x:%02x:%02x.%x", dev->pci.domain, dev->pci.bus, dev->pci.dev, dev->pci.func); - printf("%-16s", fmt); + sprintf(dbdf, "%04x:%02x:%02x.%x", dev->pci.domain, dev->pci.bus, dev->pci.dev, dev->pci.func); + printf("%-16s", dbdf); } else { - sprintf(fmt, "%02x:%02x.%x", dev->pci.bus, dev->pci.dev, dev->pci.func); - printf("%-10s", fmt); + sprintf(dbdf, "%02x:%02x.%x", dev->pci.bus, dev->pci.dev, dev->pci.func); + printf("%-10s", dbdf); } int hasIB = fmt_ib_dev(dev, fmt); if (hasIB) { printf("%-16s", fmt); + } else { + printf("%-16s", " "); } /* Add NET devices info */ @@ -284,6 +287,8 @@ void print_pci_info(dev_info* dev, int domain_needed) /* Add NUMA node */ printf("%-6s", dev->pci.numa_node); + printf("vfio-%-6s", dbdf); + printf("\n"); } @@ -385,16 +390,44 @@ int main(int argc, char** argv) if (verbose) { if (domain_needed) { if (ul_mode) { - printf("%-24s%-9s%-16s%-16s%-40s%-6s\n", "DEVICE_TYPE", "MST", "PCI", "RDMA", "NET", "NUMA"); + printf("%-24s%-9s%-16s%-16s%-40s%-6s%-16s\n", + "DEVICE_TYPE", + "MST", + "PCI", + "RDMA", + "NET", + "NUMA", + "VFIO"); } else { - printf("%-24s%-30s%-16s%-16s%-40s%-6s\n", "DEVICE_TYPE", "MST", "PCI", "RDMA", "NET", "NUMA"); + printf("%-24s%-30s%-16s%-16s%-40s%-6s%-16s\n", + "DEVICE_TYPE", + "MST", + "PCI", + "RDMA", + "NET", + "NUMA", + "VFIO"); } /* printf("%-30s%-16s%-16s%-8s%-20s\n", "---", "-----------", "---", "----", "---"); */ } else { if (ul_mode) { - printf("%-24s%-9s%-10s%-16s%-40s%-6s\n", "DEVICE_TYPE", "MST", "PCI", "RDMA", "NET", "NUMA"); + printf("%-24s%-9s%-10s%-16s%-40s%-6s%-16s\n", + "DEVICE_TYPE", + "MST", + "PCI", + "RDMA", + "NET", + "NUMA", + "VFIO"); } else { - printf("%-24s%-30s%-10s%-16s%-40s%-6s\n", "DEVICE_TYPE", "MST", "PCI", "RDMA", "NET", "NUMA"); + printf("%-24s%-30s%-10s%-16s%-40s%-6s%-16s\n", + "DEVICE_TYPE", + "MST", + "PCI", + "RDMA", + "NET", + "NUMA", + "VFIO"); } /* printf("%-30s%-16s%-10s%-8s%-20s\n", "---", "-----------", "---", "----", "---"); */ } @@ -403,7 +436,7 @@ int main(int argc, char** argv) /* dev_lst = devs; */ /* dev_lst_len = len; */ for (i = 0; i < len; i++) { - if (devs[i].type == MDEVS_TAVOR_CR) { + if ((devs[i].type == MDEVS_TAVOR_CR) && (strstr(devs[i].dev_name, "cable_") == NULL)) { mfile* mf = mopen(devs[i].dev_name); if (is_pcie_switch_device(mf)) { @@ -495,6 +528,21 @@ int main(int argc, char** argv) printf("\n"); } + int cable_found = 0; + for (i = 0; i < len; i++) { + if (devs[i].dev_name && (strstr(devs[i].dev_name, "cable_") != NULL)) { + if (cable_found == 0) { + printf("\nCable devices:\n"); + printf("---------------\n"); + cable_found = 1; + } + printf("%s\n", devs[i].dev_name); + } + } + if (cable_found) { + printf("\n"); + } + rc = 0; cleanup: if (devs) { |
