--- /dev/null
+#!/bin/bash
+################################################################################
+# Copyright (c) 2016 Wind River Systems, Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+################################################################################
+
+# Certain i40e network devices (XL710 Fortville) have an internal firmware LLDP
+# agent enabled by default. This can prevent LLDP PDUs from being processed by
+# the driver and any upper layer agents.
+#
+# This script allows a user to enable and disable the internal LLDP agent.
+#
+# Note: debugfs must be enabled in the kernel
+#
+# To enable:
+# ./i40e-lldp-configure.sh start
+#
+# To disable:
+# ./i40e-lldp-configure.sh stop
+
+PROGNAME=$(basename $0)
+DEBUGFS_PATH=/sys/kernel/debug
+DEBUGFS_I40_DEVICES_PATH=$DEBUGFS_PATH/i40e
+LLDP_COMMAND=lldp
+
+function log {
+ local MSG="${PROGNAME}: $1"
+ logger -p notice "${MSG}"
+}
+
+function err {
+ local MSG="${PROGNAME}: $1"
+ logger -p error "${MSG}"
+}
+
+function configure_device {
+ local DEVICE=$1
+ local ACTION=$2
+ local DEVICE_PATH=${DEBUGFS_I40_DEVICES}/${DEVICE}
+
+ if [ ! -d ${DEVICE_PATH} ]; then
+ return 1
+ fi
+
+ echo "${LLDP_COMMAND} ${ACTION}" > ${DEVICE_PATH}/command
+ RET=$?
+
+ if [ ${RET} -ne 0 ]; then
+ err "Failed to ${ACTION} internal LLDP agent for device ${DEVICE}"
+ return ${RET}
+ fi
+
+ log "${ACTION} internal LLDP agent for device ${DEVICE}"
+ return ${RET}
+}
+
+function is_debugfs_mounted {
+ if grep -qs "${DEBUGFS_PATH}" /proc/mounts; then
+ return 0
+ fi
+ return 1
+}
+
+function mount_debugfs {
+ mount -t debugfs none ${DEBUGFS_PATH}
+}
+
+function unmount_debugfs {
+ umount ${DEBUGFS_PATH}
+}
+
+function scan_devices {
+ local ACTION=$1
+ local DEBUGFS_MOUNTED="false"
+ local DEVICES=${DEBUGFS_I40_DEVICES_PATH}/*
+
+ if is_debugfs_mounted; then
+ DEBUGFS_MOUNTED="true"
+ fi
+
+ if [ ${DEBUGFS_MOUNTED} = "false" ]; then
+ mount_debugfs
+ RET=$?
+ if [ ${RET} -ne 0 ]; then
+ err "Failed to mount debugfs"
+ return ${RET}
+ fi
+ log "Mounted debugfs"
+ fi
+
+ for DEVICE in $DEVICES; do
+ configure_device ${DEVICE} ${ACTION}
+ done
+
+ if [ ${DEBUGFS_MOUNTED} = "false" ]; then
+ unmount_debugfs
+ RET=$?
+ if [ ${RET} -ne 0 ]; then
+ err "Failed to unmount debugfs"
+ return ${RET}
+ fi
+ log "Unmounted debugfs"
+ fi
+
+ return 0
+}
+
+function start {
+ scan_devices start
+ return $?
+}
+
+function stop {
+ scan_devices stop
+ return $?
+}
+
+function status {
+ return 0
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ status)
+ status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|status}"
+ exit 1
+esac