1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4ALL_TESTS=" 5 settime 6 adjtime 7 adjfreq 8" 9DEV=$1 10 11# Kselftest framework requirement - SKIP code is 4. 12ksft_skip=4 13 14############################################################################## 15# Sanity checks 16 17if [[ "$(id -u)" -ne 0 ]]; then 18 echo "SKIP: need root privileges" 19 exit $ksft_skip 20fi 21 22if [[ "$DEV" == "" ]]; then 23 echo "SKIP: PTP device not provided" 24 exit $ksft_skip 25fi 26 27require_command() 28{ 29 local cmd=$1; shift 30 31 if [[ ! -x "$(command -v "$cmd")" ]]; then 32 echo "SKIP: $cmd not installed" 33 exit $ksft_skip 34 fi 35} 36 37phc_sanity() 38{ 39 phc_ctl $DEV get &> /dev/null 40 41 if [ $? != 0 ]; then 42 echo "SKIP: unknown clock $DEV: No such device" 43 exit $ksft_skip 44 fi 45} 46 47require_command phc_ctl 48phc_sanity 49 50############################################################################## 51# Helpers 52 53# Exit status to return at the end. Set in case one of the tests fails. 54EXIT_STATUS=0 55PASS_COUNT=0 56# Per-test return value. Clear at the beginning of each test. 57RET=0 58 59check_err() 60{ 61 local err=$1 62 63 if [[ $RET -eq 0 && $err -ne 0 ]]; then 64 RET=$err 65 fi 66} 67 68log_test() 69{ 70 local test_name=$1 71 72 if [[ $RET -eq $ksft_skip ]]; then 73 printf "TEST: %-60s [SKIP]\n" "$test_name" 74 return 0 75 fi 76 77 if [[ $RET -ne 0 ]]; then 78 EXIT_STATUS=1 79 printf "TEST: %-60s [FAIL]\n" "$test_name" 80 return 1 81 fi 82 83 ((PASS_COUNT++)) 84 printf "TEST: %-60s [ OK ]\n" "$test_name" 85 return 0 86} 87 88tests_run() 89{ 90 local current_test 91 92 for current_test in ${TESTS:-$ALL_TESTS}; do 93 $current_test 94 done 95} 96 97############################################################################## 98# Tests 99 100settime_do() 101{ 102 local res out 103 104 out=$(LC_ALL=C phc_ctl $DEV set 0 wait 120.5 get 2>&1) 105 if [[ $? -ne 0 ]]; then 106 if echo "$out" | grep -qi "Operation not supported"; then 107 return $ksft_skip 108 fi 109 return 1 110 fi 111 res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') 112 113 (( res == 120 )) 114} 115 116adjtime_do() 117{ 118 local res out 119 120 out=$(LC_ALL=C phc_ctl $DEV set 0 adj 10 get 2>&1) 121 if [[ $? -ne 0 ]]; then 122 if echo "$out" | grep -qi "Operation not supported"; then 123 return $ksft_skip 124 fi 125 return 1 126 fi 127 res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') 128 129 (( res == 10 )) 130} 131 132adjfreq_do() 133{ 134 local res out 135 136 # Set the clock to be 1% faster 137 out=$(LC_ALL=C phc_ctl $DEV freq 10000000 set 0 wait 100.5 get 2>&1) 138 if [[ $? -ne 0 ]]; then 139 if echo "$out" | grep -qi "Operation not supported"; then 140 return $ksft_skip 141 fi 142 return 1 143 fi 144 res=$(echo "$out" | awk '/clock time is/{print $5}' | awk -F. '{print $1}') 145 146 (( res == 101 )) 147} 148 149############################################################################## 150 151cleanup() 152{ 153 phc_ctl $DEV freq 0.0 &> /dev/null 154 phc_ctl $DEV set &> /dev/null 155} 156 157settime() 158{ 159 RET=0 160 161 settime_do 162 check_err $? 163 log_test "settime" 164 cleanup 165} 166 167adjtime() 168{ 169 RET=0 170 171 adjtime_do 172 check_err $? 173 log_test "adjtime" 174 cleanup 175} 176 177adjfreq() 178{ 179 RET=0 180 181 adjfreq_do 182 check_err $? 183 log_test "adjfreq" 184 cleanup 185} 186 187trap cleanup EXIT 188 189tests_run 190 191if [[ $EXIT_STATUS -eq 0 && $PASS_COUNT -eq 0 ]]; then 192 exit $ksft_skip 193fi 194exit $EXIT_STATUS 195