#!/bin/bash # SPDX-License-Identifier: GPL-2.0 ALL_TESTS=" settime adjtime adjfreq " DEV=$1 # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 ############################################################################## # Sanity checks if [[ "$(id -u)" -ne 0 ]]; then echo "SKIP: need root privileges" exit $ksft_skip fi if [[ "$DEV" == "" ]]; then echo "SKIP: PTP device not provided" exit $ksft_skip fi require_command() { local cmd=$1; shift if [[ ! -x "$(command -v "$cmd")" ]]; then echo "SKIP: $cmd not installed" exit $ksft_skip fi } phc_sanity() { phc_ctl $DEV get &> /dev/null if [ $? != 0 ]; then echo "SKIP: unknown clock $DEV: No such device" exit $ksft_skip fi } require_command phc_ctl phc_sanity ############################################################################## # Helpers # Exit status to return at the end. Set in case one of the tests fails. EXIT_STATUS=0 PASS_COUNT=0 # Per-test return value. Clear at the beginning of each test. RET=0 check_err() { local err=$1 if [[ $RET -eq 0 && $err -ne 0 ]]; then RET=$err fi } log_test() { local test_name=$1 if [[ $RET -eq $ksft_skip ]]; then printf "TEST: %-60s [SKIP]\n" "$test_name" return 0 fi if [[ $RET -ne 0 ]]; then EXIT_STATUS=1 printf "TEST: %-60s [FAIL]\n" "$test_name" return 1 fi ((PASS_COUNT++)) printf "TEST: %-60s [ OK ]\n" "$test_name" return 0 } tests_run() { local current_test for current_test in ${TESTS:-$ALL_TESTS}; do $current_test done } ############################################################################## # Tests settime_do() { local res out out=$(LC_ALL=C phc_ctl $DEV set 0 wait 120.5 get 2>&1) if [[ $? -ne 0 ]]; then if echo "$out" | grep -qi "Operation not supported"; then return $ksft_skip fi return 1 fi res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') (( res == 120 )) } adjtime_do() { local res out out=$(LC_ALL=C phc_ctl $DEV set 0 adj 10 get 2>&1) if [[ $? -ne 0 ]]; then if echo "$out" | grep -qi "Operation not supported"; then return $ksft_skip fi return 1 fi res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') (( res == 10 )) } adjfreq_do() { local res out # Set the clock to be 1% faster out=$(LC_ALL=C phc_ctl $DEV freq 10000000 set 0 wait 100.5 get 2>&1) if [[ $? -ne 0 ]]; then if echo "$out" | grep -qi "Operation not supported"; then return $ksft_skip fi return 1 fi res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') (( res == 101 )) } ############################################################################## cleanup() { phc_ctl $DEV freq 0.0 &> /dev/null phc_ctl $DEV set &> /dev/null } settime() { RET=0 settime_do check_err $? log_test "settime" cleanup } adjtime() { RET=0 adjtime_do check_err $? log_test "adjtime" cleanup } adjfreq() { RET=0 adjfreq_do check_err $? log_test "adjfreq" cleanup } trap cleanup EXIT tests_run if [[ $EXIT_STATUS -eq 0 && $PASS_COUNT -eq 0 ]]; then exit $ksft_skip fi exit $EXIT_STATUS