diff options
author | Suren A. Chilingaryan <csa@suren.me> | 2018-08-05 03:07:16 +0200 |
---|---|---|
committer | Suren A. Chilingaryan <csa@suren.me> | 2018-08-05 03:07:16 +0200 |
commit | d721f36bef886fbccb61238235244e51d930abad (patch) | |
tree | 548bcd049692d8f3e507eb552bd82e66b6be8e3f /connectx_port_config | |
download | mlx-d721f36bef886fbccb61238235244e51d930abad.tar.gz mlx-d721f36bef886fbccb61238235244e51d930abad.tar.bz2 mlx-d721f36bef886fbccb61238235244e51d930abad.tar.xz mlx-d721f36bef886fbccb61238235244e51d930abad.zip |
ipecamera3
Diffstat (limited to 'connectx_port_config')
-rwxr-xr-x | connectx_port_config | 406 |
1 files changed, 406 insertions, 0 deletions
diff --git a/connectx_port_config b/connectx_port_config new file mode 100755 index 0000000..0064d47 --- /dev/null +++ b/connectx_port_config @@ -0,0 +1,406 @@ +#!/bin/bash + +# +# Copyright (c) 2006 Mellanox Technologies. All rights reserved. +# +# This Software is licensed under one of the following licenses: +# +# 1) under the terms of the "Common Public License 1.0" a copy of which is +# available from the Open Source Initiative, see +# http://www.opensource.org/licenses/cpl.php. +# +# 2) under the terms of the "The BSD License" a copy of which is +# available from the Open Source Initiative, see +# http://www.opensource.org/licenses/bsd-license.php. +# +# 3) under the terms of the "GNU General Public License (GPL) Version 2" a +# copy of which is available from the Open Source Initiative, see +# http://www.opensource.org/licenses/gpl-license.php. +# +# Licensee has the right to choose one of the above licenses. +# +# Redistributions of source code must retain the above copyright +# notice and one of the license notices. +# +# Redistributions in binary form must reproduce both the above copyright +# notice, one of the license notices in the documentation +# and/or other materials provided with the distribution. +# +# + +port_types=( "" "ib" "eth" "auto" ) + +usage() +{ + echo "Usage:" + echo "/sbin/connectx_port_config" + echo "/sbin/connectx_port_config -s|--show" + echo "/sbin/connectx_port_config -h|--help" + echo "/sbin/connectx_port_config [-d|--device <PCI device id>] -c|--conf <port1,port2>" + echo "Possible port configurations:" + echo " eth,eth" + echo " eth,ib" + echo " eth,auto" + echo " ib,ib" + echo " ib,eth" + echo " ib,auto" + echo " auto,auto" + echo " auto,eth" +} + +is_integer() +{ + printf "%s\n" $1 |grep -E "^[+-]?[0-9]+$" > /dev/null + return $? +} + +# If module $1 is loaded return - 0 else - 1 +is_module() +{ + local RC + + /sbin/lsmod | grep -w "$1" > /dev/null 2>&1 + RC=$? + + return $RC +} + +# Select PCI device interactively +select_device() +{ + printf "Please select device to modify [$dev]: " + read dev; + + if is_integer $dev; then + if [ $dev -lt 1 ]; then + echo "Illegal index selected, quitting..."; echo + exit 1; + fi + + if [ -e ${Devices[$dev]}/mlx4_port1 ]; then + echo "`echo ${Devices[$dev]} | cut -d '/' -f 6`"; echo + else + echo "Illegal value selected, quitting..."; echo + exit 1 + fi + else + echo "Numeric value expected, quitting..."; echo + exit 1 + fi +} + +set_device() +{ + ser=0; + for d in ${Devices[@]}; do + ser=$(($ser+1)) + if [ "/sys/bus/pci/devices/${udevice}/" == "$d" ] || [ "/sys/bus/pci/devices/0000:${udevice}/" == "${d}" ] ; then + dev=$ser + return + fi + done +} + +validate_device() +{ + if [ "$udevice" = "0" ]; then + if [ "$comm" != "" ]; then + if [ ${#Devices[@]} -gt 1 ]; then + echo "More then 1 ConnectX devices found, please specify required device"; echo + usage + exit 1 + fi + fi + return + fi + + for d in ${Devices[@]}; do + ser=$(($ser+1)) + if [ "/sys/bus/pci/devices/${udevice}/" == "$d" ] || [ "/sys/bus/pci/devices/0000:${udevice}/" == "${d}" ] ; then + return + fi + done + echo "Error: illegal device selected." + exit 1; +} + +validate_port_config() +{ + for conf in "eth,eth" "eth,ib" "eth,auto" "auto,auto" "auto,eth" "ib,ib" "ib,auto" "ib,eth" "eth" "auto" "ib"; do + if [ "$conf" == "$comm" ]; then + return + fi + done + echo "Error: $comm is not valid port configuration" + usage + exit 1; +} + +prompt_options() +{ + local port=$1 + local options=$2 + if [ "$port" == "2" ]; then + if [ -e ${Devices[$dev]}/mlx4_port2 ]; then + echo -n "" + else + return 0 + fi + fi + + printf "Select mode for port $port (${options}): " + read mode + if is_integer $mode; then + if [ $mode -lt 0 ]; then + echo "Illegal value selected, quitting..."; echo + exit 1 + fi + if [ `echo ${options} | grep ${mode} -wc` == 0 ]; then + echo "Illegal value selected, quitting..."; echo + exit 1 + fi + return "${mode}" + else + echo "Illegal value selected, quitting..."; echo + exit 1 + fi +} + +show_configuration() +{ + local cnt=0 + for pci_dev in /sys/bus/pci/devices/*/; do + if [ -e $pci_dev/mlx4_port1 ]; then + echo "--------------------------------" + dev=`echo $pci_dev | cut -d '/' -f 6` + echo "Port configuration for PCI device: $dev is:" + cat ${pci_dev}/mlx4_port1 + if [ -e $pci_dev/mlx4_port2 ]; then + cat ${pci_dev}/mlx4_port2 + fi + echo "--------------------------------" + cnt=$(($cnt+1)) + fi + done + if [ $cnt == 0 ]; then + echo "No ConnectX devices found or driver not loaded" + fi +} + +save_config() +{ + local configuration_file=/etc/infiniband/connectx.conf + local config_comment="# ConnectX Port Configuration for $udevice" + local config_line=" -d $udevice -c $comm" + + local add_new_lines=1 + if [ -e "${configuration_file}" ]; then + # check if there is a configuration to the device + grep "${udevice}" ${configuration_file} >> /dev/null + if [ $? -eq 0 ]; then + # replace the configuration lines + sed -i "s/#.* ${udevice}/${config_comment}/" ${configuration_file} + sed -i "s/.*connectx_port_config.*$udevice.*/\/sbin\/connectx_port_config${config_line}/" ${configuration_file} + + add_new_lines=0 + fi + fi + + # add the configuration lines to the end of the file + if [ ${add_new_lines} -ne 0 ]; then + echo "${config_comment}" >> ${configuration_file} + echo "/sbin/connectx_port_config${config_line}" >> ${configuration_file} + fi +} + +set_port_config() +{ + echo "|----------------------------|" + echo "| Possible port modes: |" + echo "| 1: Infiniband |" + echo "| 2: Ethernet |" + echo "| 3: AutoSense |" + echo "|----------------------------|" + + local options="1,2,3" + + prompt_options 1 $options + comm=${port_types[$?]} + if [ -n "${comm}" ]; then + prompt_options 2 $options + local port2_conf=${port_types[$?]} + + if [ -n "${port2_conf}" ]; then + comm="${comm},${port2_conf}" + fi + fi +} + + +udevice=0 +comm="" +############################################################################### +# Parsing command line # +############################################################################### +while [ ! -z "$1" ]; do + case "$1" in + -s|--show) + show_configuration + if [ -n "$2" ]; then + echo "Too many parameters" + usage + exit 1 + fi + exit 0 + ;; + -d|--device) + if [ -z "$2" ]; then + echo "Error: Illegal input" + usage + exit 1 + fi + udevice=$2 + shift 2 + ;; + -c|--conf) + if [ -z "$2" ]; then + echo "Error: Illegal input" + usage + exit 1 + fi + comm=$2 + shift 2; + validate_port_config + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Wrong parameter error: $1" + usage + exit 1 + ;; + esac +done + +############################################################# +# Load low level driver if not loaded # +############################################################# +is_module mlx4_core +RC=$? +if [ $RC == 1 ]; then + echo "Bus driver not loaded, loading..." + /sbin/modprobe mlx4_core +fi + +############################################################# +# List ConnectX devices # +############################################################# +i=0 +echo; echo "ConnectX PCI devices :" +echo "|----------------------------|" +for pci_dev in /sys/bus/pci/devices/*/; do + if [ -e $pci_dev/mlx4_port1 ]; then + (( i++ )) + Devices[$i]=$pci_dev + dev=`echo $pci_dev | cut -d '/' -f 6` + echo "| $i $dev |" + fi +done +echo "|----------------------------|"; echo + +validate_device + +if [ $i == 0 ]; then + echo "No devices found, quiting..." + exit 1; +fi + +############################################################# +# Select device to modify # +############################################################# +dev=1 +if [ $i -ne 1 ]; then + if [ "$comm" != "" ]; then + if [ "$udevice" != "0" ]; then + set_device + fi + else + select_device + fi +fi + +udevice=`echo ${Devices[$dev]} | cut -d '/' -f 6` + +echo "Before port change:" +cat ${Devices[$dev]}/mlx4_port1 +if [ -e ${Devices[$dev]}/mlx4_port2 ]; then + cat ${Devices[$dev]}/mlx4_port2 +fi +echo + +write_mask="0x222" +mlx4_port_file="${Devices[$dev]}/mlx4_port1" +if [ ! -w $mlx4_port_file ] || [ $((0x$(stat -c "%a" $mlx4_port_file) & $write_mask)) == "0" ]; then + echo "Not allowed to change port configuration, quitting..." + exit 1; +fi +mlx4_port_file="${Devices[$dev]}/mlx4_port2" +if [ -e $mlx4_port_file ] && ([ ! -w $mlx4_port_file ] || [ $((0x$(stat -c "%a" $mlx4_port_file) & $write_mask)) == "0" ]); then + echo "Not allowed to change port configuration, quitting..." + exit 1; +fi + +############################################################ +# Set port configuration for the selected device # +############################################################ +if [ "$comm" == "" ]; then + set_port_config +fi + +if [ -e ${Devices[$dev]}/port_trigger ]; then + echo "all" > ${Devices[$dev]}/port_trigger +fi + +comm1=`echo ${comm} | cut -d ',' -f 1` +comm2=`echo ${comm} | cut -d ',' -f 2` + +for uverbs_dir in ${Devices[$dev]}infiniband_verbs/uverbs* +do + if [[ -f $uverbs_dir/ref_cnt ]]; then + if [[ `cat "$uverbs_dir/ref_cnt"` > 1 ]]; then + echo "WARNING: Please close user level applications" \ + "before running connectx_port_config. " + echo "Operation aborted!" + exit 1 + fi + fi +done + +{ +echo "${comm1}" > ${Devices[$dev]}/mlx4_port1 +} > /dev/null 2>&1 +rc=$? + if [ -e ${Devices[$dev]}/mlx4_port2 ]; then + { + echo "${comm2}" > ${Devices[$dev]}/mlx4_port2 + } > /dev/null 2>&1 + rc=$? +fi +if [ $rc -ne 0 ]; then + echo "WARNING: Illegal port configuration attempted," + echo " Please view dmesg for details."; echo + exit 1 +fi + +echo; echo "After port change:" +cat ${Devices[$dev]}/mlx4_port1 +if [ -e ${Devices[$dev]}/mlx4_port2 ]; then + cat ${Devices[$dev]}/mlx4_port2 +fi + +save_config + +exit 0 + |