1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# This validates that the kernel will load firmware out of its list of 4*4882a593Smuzhiyun# firmware locations on disk. Since the user helper does similar work, 5*4882a593Smuzhiyun# we reset the custom load directory to a location the user helper doesn't 6*4882a593Smuzhiyun# know so we can be sure we're not accidentally testing the user helper. 7*4882a593Smuzhiyunset -e 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunTEST_REQS_FW_SYSFS_FALLBACK="no" 10*4882a593SmuzhiyunTEST_REQS_FW_SET_CUSTOM_PATH="yes" 11*4882a593SmuzhiyunTEST_DIR=$(dirname $0) 12*4882a593Smuzhiyunsource $TEST_DIR/fw_lib.sh 13*4882a593Smuzhiyun 14*4882a593Smuzhiyuncheck_mods 15*4882a593Smuzhiyuncheck_setup 16*4882a593Smuzhiyunverify_reqs 17*4882a593Smuzhiyunsetup_tmp_file 18*4882a593Smuzhiyun 19*4882a593Smuzhiyuntrap "test_finish" EXIT 20*4882a593Smuzhiyun 21*4882a593Smuzhiyunif [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 22*4882a593Smuzhiyun # Turn down the timeout so failures don't take so long. 23*4882a593Smuzhiyun echo 1 >/sys/class/firmware/timeout 24*4882a593Smuzhiyunfi 25*4882a593Smuzhiyun 26*4882a593Smuzhiyunif printf '\000' >"$DIR"/trigger_request 2> /dev/null; then 27*4882a593Smuzhiyun echo "$0: empty filename should not succeed" >&2 28*4882a593Smuzhiyun exit 1 29*4882a593Smuzhiyunfi 30*4882a593Smuzhiyun 31*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_async_request ]; then 32*4882a593Smuzhiyun echo "$0: empty filename: async trigger not present, ignoring test" >&2 33*4882a593Smuzhiyun exit $ksft_skip 34*4882a593Smuzhiyunelse 35*4882a593Smuzhiyun if printf '\000' >"$DIR"/trigger_async_request 2> /dev/null; then 36*4882a593Smuzhiyun echo "$0: empty filename should not succeed (async)" >&2 37*4882a593Smuzhiyun exit 1 38*4882a593Smuzhiyun fi 39*4882a593Smuzhiyunfi 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun# Request a firmware that doesn't exist, it should fail. 42*4882a593Smuzhiyunif echo -n "nope-$NAME" >"$DIR"/trigger_request 2> /dev/null; then 43*4882a593Smuzhiyun echo "$0: firmware shouldn't have loaded" >&2 44*4882a593Smuzhiyun exit 1 45*4882a593Smuzhiyunfi 46*4882a593Smuzhiyunif diff -q "$FW" /dev/test_firmware >/dev/null ; then 47*4882a593Smuzhiyun echo "$0: firmware was not expected to match" >&2 48*4882a593Smuzhiyun exit 1 49*4882a593Smuzhiyunelse 50*4882a593Smuzhiyun if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 51*4882a593Smuzhiyun echo "$0: timeout works" 52*4882a593Smuzhiyun fi 53*4882a593Smuzhiyunfi 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun# This should succeed via kernel load or will fail after 1 second after 56*4882a593Smuzhiyun# being handed over to the user helper, which won't find the fw either. 57*4882a593Smuzhiyunif ! echo -n "$NAME" >"$DIR"/trigger_request ; then 58*4882a593Smuzhiyun echo "$0: could not trigger request" >&2 59*4882a593Smuzhiyun exit 1 60*4882a593Smuzhiyunfi 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun# Verify the contents are what we expect. 63*4882a593Smuzhiyunif ! diff -q "$FW" /dev/test_firmware >/dev/null ; then 64*4882a593Smuzhiyun echo "$0: firmware was not loaded" >&2 65*4882a593Smuzhiyun exit 1 66*4882a593Smuzhiyunelse 67*4882a593Smuzhiyun echo "$0: filesystem loading works" 68*4882a593Smuzhiyunfi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun# Try the asynchronous version too 71*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_async_request ]; then 72*4882a593Smuzhiyun echo "$0: firmware loading: async trigger not present, ignoring test" >&2 73*4882a593Smuzhiyun exit $ksft_skip 74*4882a593Smuzhiyunelse 75*4882a593Smuzhiyun if ! echo -n "$NAME" >"$DIR"/trigger_async_request ; then 76*4882a593Smuzhiyun echo "$0: could not trigger async request" >&2 77*4882a593Smuzhiyun exit 1 78*4882a593Smuzhiyun fi 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun # Verify the contents are what we expect. 81*4882a593Smuzhiyun if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then 82*4882a593Smuzhiyun echo "$0: firmware was not loaded (async)" >&2 83*4882a593Smuzhiyun exit 1 84*4882a593Smuzhiyun else 85*4882a593Smuzhiyun echo "$0: async filesystem loading works" 86*4882a593Smuzhiyun fi 87*4882a593Smuzhiyunfi 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun# Try platform (EFI embedded fw) loading too 90*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_request_platform ]; then 91*4882a593Smuzhiyun echo "$0: firmware loading: platform trigger not present, ignoring test" >&2 92*4882a593Smuzhiyunelse 93*4882a593Smuzhiyun if printf '\000' >"$DIR"/trigger_request_platform 2> /dev/null; then 94*4882a593Smuzhiyun echo "$0: empty filename should not succeed (platform)" >&2 95*4882a593Smuzhiyun exit 1 96*4882a593Smuzhiyun fi 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun # Note we echo a non-existing name, since files on the file-system 99*4882a593Smuzhiyun # are preferred over firmware embedded inside the platform's firmware 100*4882a593Smuzhiyun # The test adds a fake entry with the requested name to the platform's 101*4882a593Smuzhiyun # fw list, so the name does not matter as long as it does not exist 102*4882a593Smuzhiyun if ! echo -n "nope-$NAME" >"$DIR"/trigger_request_platform ; then 103*4882a593Smuzhiyun echo "$0: could not trigger request platform" >&2 104*4882a593Smuzhiyun exit 1 105*4882a593Smuzhiyun fi 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun # The test verifies itself that the loaded firmware contents matches 108*4882a593Smuzhiyun # the contents for the fake platform fw entry it added. 109*4882a593Smuzhiyun echo "$0: platform loading works" 110*4882a593Smuzhiyunfi 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun### Batched requests tests 113*4882a593Smuzhiyuntest_config_present() 114*4882a593Smuzhiyun{ 115*4882a593Smuzhiyun if [ ! -f $DIR/reset ]; then 116*4882a593Smuzhiyun echo "Configuration triggers not present, ignoring test" 117*4882a593Smuzhiyun exit $ksft_skip 118*4882a593Smuzhiyun fi 119*4882a593Smuzhiyun} 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun# Defaults : 122*4882a593Smuzhiyun# 123*4882a593Smuzhiyun# send_uevent: 1 124*4882a593Smuzhiyun# sync_direct: 0 125*4882a593Smuzhiyun# name: test-firmware.bin 126*4882a593Smuzhiyun# num_requests: 4 127*4882a593Smuzhiyunconfig_reset() 128*4882a593Smuzhiyun{ 129*4882a593Smuzhiyun echo 1 > $DIR/reset 130*4882a593Smuzhiyun} 131*4882a593Smuzhiyun 132*4882a593Smuzhiyunrelease_all_firmware() 133*4882a593Smuzhiyun{ 134*4882a593Smuzhiyun echo 1 > $DIR/release_all_firmware 135*4882a593Smuzhiyun} 136*4882a593Smuzhiyun 137*4882a593Smuzhiyunconfig_set_name() 138*4882a593Smuzhiyun{ 139*4882a593Smuzhiyun echo -n $1 > $DIR/config_name 140*4882a593Smuzhiyun} 141*4882a593Smuzhiyun 142*4882a593Smuzhiyunconfig_set_into_buf() 143*4882a593Smuzhiyun{ 144*4882a593Smuzhiyun echo 1 > $DIR/config_into_buf 145*4882a593Smuzhiyun} 146*4882a593Smuzhiyun 147*4882a593Smuzhiyunconfig_unset_into_buf() 148*4882a593Smuzhiyun{ 149*4882a593Smuzhiyun echo 0 > $DIR/config_into_buf 150*4882a593Smuzhiyun} 151*4882a593Smuzhiyun 152*4882a593Smuzhiyunconfig_set_buf_size() 153*4882a593Smuzhiyun{ 154*4882a593Smuzhiyun echo $1 > $DIR/config_buf_size 155*4882a593Smuzhiyun} 156*4882a593Smuzhiyun 157*4882a593Smuzhiyunconfig_set_file_offset() 158*4882a593Smuzhiyun{ 159*4882a593Smuzhiyun echo $1 > $DIR/config_file_offset 160*4882a593Smuzhiyun} 161*4882a593Smuzhiyun 162*4882a593Smuzhiyunconfig_set_partial() 163*4882a593Smuzhiyun{ 164*4882a593Smuzhiyun echo 1 > $DIR/config_partial 165*4882a593Smuzhiyun} 166*4882a593Smuzhiyun 167*4882a593Smuzhiyunconfig_unset_partial() 168*4882a593Smuzhiyun{ 169*4882a593Smuzhiyun echo 0 > $DIR/config_partial 170*4882a593Smuzhiyun} 171*4882a593Smuzhiyun 172*4882a593Smuzhiyunconfig_set_sync_direct() 173*4882a593Smuzhiyun{ 174*4882a593Smuzhiyun echo 1 > $DIR/config_sync_direct 175*4882a593Smuzhiyun} 176*4882a593Smuzhiyun 177*4882a593Smuzhiyunconfig_unset_sync_direct() 178*4882a593Smuzhiyun{ 179*4882a593Smuzhiyun echo 0 > $DIR/config_sync_direct 180*4882a593Smuzhiyun} 181*4882a593Smuzhiyun 182*4882a593Smuzhiyunconfig_set_uevent() 183*4882a593Smuzhiyun{ 184*4882a593Smuzhiyun echo 1 > $DIR/config_send_uevent 185*4882a593Smuzhiyun} 186*4882a593Smuzhiyun 187*4882a593Smuzhiyunconfig_unset_uevent() 188*4882a593Smuzhiyun{ 189*4882a593Smuzhiyun echo 0 > $DIR/config_send_uevent 190*4882a593Smuzhiyun} 191*4882a593Smuzhiyun 192*4882a593Smuzhiyunconfig_trigger_sync() 193*4882a593Smuzhiyun{ 194*4882a593Smuzhiyun echo -n 1 > $DIR/trigger_batched_requests 2>/dev/null 195*4882a593Smuzhiyun} 196*4882a593Smuzhiyun 197*4882a593Smuzhiyunconfig_trigger_async() 198*4882a593Smuzhiyun{ 199*4882a593Smuzhiyun echo -n 1 > $DIR/trigger_batched_requests_async 2> /dev/null 200*4882a593Smuzhiyun} 201*4882a593Smuzhiyun 202*4882a593Smuzhiyunconfig_set_read_fw_idx() 203*4882a593Smuzhiyun{ 204*4882a593Smuzhiyun echo -n $1 > $DIR/config_read_fw_idx 2> /dev/null 205*4882a593Smuzhiyun} 206*4882a593Smuzhiyun 207*4882a593Smuzhiyunread_firmwares() 208*4882a593Smuzhiyun{ 209*4882a593Smuzhiyun if [ "$(cat $DIR/config_into_buf)" == "1" ]; then 210*4882a593Smuzhiyun fwfile="$FW_INTO_BUF" 211*4882a593Smuzhiyun else 212*4882a593Smuzhiyun fwfile="$FW" 213*4882a593Smuzhiyun fi 214*4882a593Smuzhiyun if [ "$1" = "xzonly" ]; then 215*4882a593Smuzhiyun fwfile="${fwfile}-orig" 216*4882a593Smuzhiyun fi 217*4882a593Smuzhiyun for i in $(seq 0 3); do 218*4882a593Smuzhiyun config_set_read_fw_idx $i 219*4882a593Smuzhiyun # Verify the contents are what we expect. 220*4882a593Smuzhiyun # -Z required for now -- check for yourself, md5sum 221*4882a593Smuzhiyun # on $FW and DIR/read_firmware will yield the same. Even 222*4882a593Smuzhiyun # cmp agrees, so something is off. 223*4882a593Smuzhiyun if ! diff -q -Z "$fwfile" $DIR/read_firmware 2>/dev/null ; then 224*4882a593Smuzhiyun echo "request #$i: firmware was not loaded" >&2 225*4882a593Smuzhiyun exit 1 226*4882a593Smuzhiyun fi 227*4882a593Smuzhiyun done 228*4882a593Smuzhiyun} 229*4882a593Smuzhiyun 230*4882a593Smuzhiyunread_partial_firmwares() 231*4882a593Smuzhiyun{ 232*4882a593Smuzhiyun if [ "$(cat $DIR/config_into_buf)" == "1" ]; then 233*4882a593Smuzhiyun fwfile="${FW_INTO_BUF}" 234*4882a593Smuzhiyun else 235*4882a593Smuzhiyun fwfile="${FW}" 236*4882a593Smuzhiyun fi 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun if [ "$1" = "xzonly" ]; then 239*4882a593Smuzhiyun fwfile="${fwfile}-orig" 240*4882a593Smuzhiyun fi 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun # Strip fwfile down to match partial offset and length 243*4882a593Smuzhiyun partial_data="$(cat $fwfile)" 244*4882a593Smuzhiyun partial_data="${partial_data:$2:$3}" 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun for i in $(seq 0 3); do 247*4882a593Smuzhiyun config_set_read_fw_idx $i 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun read_firmware="$(cat $DIR/read_firmware)" 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun # Verify the contents are what we expect. 252*4882a593Smuzhiyun if [ $read_firmware != $partial_data ]; then 253*4882a593Smuzhiyun echo "request #$i: partial firmware was not loaded" >&2 254*4882a593Smuzhiyun exit 1 255*4882a593Smuzhiyun fi 256*4882a593Smuzhiyun done 257*4882a593Smuzhiyun} 258*4882a593Smuzhiyun 259*4882a593Smuzhiyunread_firmwares_expect_nofile() 260*4882a593Smuzhiyun{ 261*4882a593Smuzhiyun for i in $(seq 0 3); do 262*4882a593Smuzhiyun config_set_read_fw_idx $i 263*4882a593Smuzhiyun # Ensures contents differ 264*4882a593Smuzhiyun if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then 265*4882a593Smuzhiyun echo "request $i: file was not expected to match" >&2 266*4882a593Smuzhiyun exit 1 267*4882a593Smuzhiyun fi 268*4882a593Smuzhiyun done 269*4882a593Smuzhiyun} 270*4882a593Smuzhiyun 271*4882a593Smuzhiyuntest_batched_request_firmware_nofile() 272*4882a593Smuzhiyun{ 273*4882a593Smuzhiyun echo -n "Batched request_firmware() nofile try #$1: " 274*4882a593Smuzhiyun config_reset 275*4882a593Smuzhiyun config_set_name nope-test-firmware.bin 276*4882a593Smuzhiyun config_trigger_sync 277*4882a593Smuzhiyun read_firmwares_expect_nofile 278*4882a593Smuzhiyun release_all_firmware 279*4882a593Smuzhiyun echo "OK" 280*4882a593Smuzhiyun} 281*4882a593Smuzhiyun 282*4882a593Smuzhiyuntest_batched_request_firmware_into_buf_nofile() 283*4882a593Smuzhiyun{ 284*4882a593Smuzhiyun echo -n "Batched request_firmware_into_buf() nofile try #$1: " 285*4882a593Smuzhiyun config_reset 286*4882a593Smuzhiyun config_set_name nope-test-firmware.bin 287*4882a593Smuzhiyun config_set_into_buf 288*4882a593Smuzhiyun config_trigger_sync 289*4882a593Smuzhiyun read_firmwares_expect_nofile 290*4882a593Smuzhiyun release_all_firmware 291*4882a593Smuzhiyun echo "OK" 292*4882a593Smuzhiyun} 293*4882a593Smuzhiyun 294*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile() 295*4882a593Smuzhiyun{ 296*4882a593Smuzhiyun echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2 nofile: " 297*4882a593Smuzhiyun config_reset 298*4882a593Smuzhiyun config_set_name nope-test-firmware.bin 299*4882a593Smuzhiyun config_set_into_buf 300*4882a593Smuzhiyun config_set_partial 301*4882a593Smuzhiyun config_set_buf_size $2 302*4882a593Smuzhiyun config_set_file_offset $1 303*4882a593Smuzhiyun config_trigger_sync 304*4882a593Smuzhiyun read_firmwares_expect_nofile 305*4882a593Smuzhiyun release_all_firmware 306*4882a593Smuzhiyun echo "OK" 307*4882a593Smuzhiyun} 308*4882a593Smuzhiyun 309*4882a593Smuzhiyuntest_batched_request_firmware_direct_nofile() 310*4882a593Smuzhiyun{ 311*4882a593Smuzhiyun echo -n "Batched request_firmware_direct() nofile try #$1: " 312*4882a593Smuzhiyun config_reset 313*4882a593Smuzhiyun config_set_name nope-test-firmware.bin 314*4882a593Smuzhiyun config_set_sync_direct 315*4882a593Smuzhiyun config_trigger_sync 316*4882a593Smuzhiyun release_all_firmware 317*4882a593Smuzhiyun echo "OK" 318*4882a593Smuzhiyun} 319*4882a593Smuzhiyun 320*4882a593Smuzhiyuntest_request_firmware_nowait_uevent_nofile() 321*4882a593Smuzhiyun{ 322*4882a593Smuzhiyun echo -n "Batched request_firmware_nowait(uevent=true) nofile try #$1: " 323*4882a593Smuzhiyun config_reset 324*4882a593Smuzhiyun config_set_name nope-test-firmware.bin 325*4882a593Smuzhiyun config_trigger_async 326*4882a593Smuzhiyun release_all_firmware 327*4882a593Smuzhiyun echo "OK" 328*4882a593Smuzhiyun} 329*4882a593Smuzhiyun 330*4882a593Smuzhiyuntest_wait_and_cancel_custom_load() 331*4882a593Smuzhiyun{ 332*4882a593Smuzhiyun if [ "$HAS_FW_LOADER_USER_HELPER" != "yes" ]; then 333*4882a593Smuzhiyun return 334*4882a593Smuzhiyun fi 335*4882a593Smuzhiyun local timeout=10 336*4882a593Smuzhiyun name=$1 337*4882a593Smuzhiyun while [ ! -e "$DIR"/"$name"/loading ]; do 338*4882a593Smuzhiyun sleep 0.1 339*4882a593Smuzhiyun timeout=$(( $timeout - 1 )) 340*4882a593Smuzhiyun if [ "$timeout" -eq 0 ]; then 341*4882a593Smuzhiyun echo "firmware interface never appeared:" >&2 342*4882a593Smuzhiyun echo "$DIR/$name/loading" >&2 343*4882a593Smuzhiyun exit 1 344*4882a593Smuzhiyun fi 345*4882a593Smuzhiyun done 346*4882a593Smuzhiyun echo -1 >"$DIR"/"$name"/loading 347*4882a593Smuzhiyun} 348*4882a593Smuzhiyun 349*4882a593Smuzhiyuntest_request_firmware_nowait_custom_nofile() 350*4882a593Smuzhiyun{ 351*4882a593Smuzhiyun echo -n "Batched request_firmware_nowait(uevent=false) nofile try #$1: " 352*4882a593Smuzhiyun config_reset 353*4882a593Smuzhiyun config_unset_uevent 354*4882a593Smuzhiyun RANDOM_FILE_PATH=$(setup_random_file_fake) 355*4882a593Smuzhiyun RANDOM_FILE="$(basename $RANDOM_FILE_PATH)" 356*4882a593Smuzhiyun config_set_name $RANDOM_FILE 357*4882a593Smuzhiyun config_trigger_async & 358*4882a593Smuzhiyun test_wait_and_cancel_custom_load $RANDOM_FILE 359*4882a593Smuzhiyun wait 360*4882a593Smuzhiyun release_all_firmware 361*4882a593Smuzhiyun echo "OK" 362*4882a593Smuzhiyun} 363*4882a593Smuzhiyun 364*4882a593Smuzhiyuntest_batched_request_firmware() 365*4882a593Smuzhiyun{ 366*4882a593Smuzhiyun echo -n "Batched request_firmware() $2 try #$1: " 367*4882a593Smuzhiyun config_reset 368*4882a593Smuzhiyun config_trigger_sync 369*4882a593Smuzhiyun read_firmwares $2 370*4882a593Smuzhiyun release_all_firmware 371*4882a593Smuzhiyun echo "OK" 372*4882a593Smuzhiyun} 373*4882a593Smuzhiyun 374*4882a593Smuzhiyuntest_batched_request_firmware_into_buf() 375*4882a593Smuzhiyun{ 376*4882a593Smuzhiyun echo -n "Batched request_firmware_into_buf() $2 try #$1: " 377*4882a593Smuzhiyun config_reset 378*4882a593Smuzhiyun config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME 379*4882a593Smuzhiyun config_set_into_buf 380*4882a593Smuzhiyun config_trigger_sync 381*4882a593Smuzhiyun read_firmwares $2 382*4882a593Smuzhiyun release_all_firmware 383*4882a593Smuzhiyun echo "OK" 384*4882a593Smuzhiyun} 385*4882a593Smuzhiyun 386*4882a593Smuzhiyuntest_batched_request_firmware_direct() 387*4882a593Smuzhiyun{ 388*4882a593Smuzhiyun echo -n "Batched request_firmware_direct() $2 try #$1: " 389*4882a593Smuzhiyun config_reset 390*4882a593Smuzhiyun config_set_sync_direct 391*4882a593Smuzhiyun config_trigger_sync 392*4882a593Smuzhiyun release_all_firmware 393*4882a593Smuzhiyun echo "OK" 394*4882a593Smuzhiyun} 395*4882a593Smuzhiyun 396*4882a593Smuzhiyuntest_request_firmware_nowait_uevent() 397*4882a593Smuzhiyun{ 398*4882a593Smuzhiyun echo -n "Batched request_firmware_nowait(uevent=true) $2 try #$1: " 399*4882a593Smuzhiyun config_reset 400*4882a593Smuzhiyun config_trigger_async 401*4882a593Smuzhiyun release_all_firmware 402*4882a593Smuzhiyun echo "OK" 403*4882a593Smuzhiyun} 404*4882a593Smuzhiyun 405*4882a593Smuzhiyuntest_request_firmware_nowait_custom() 406*4882a593Smuzhiyun{ 407*4882a593Smuzhiyun echo -n "Batched request_firmware_nowait(uevent=false) $2 try #$1: " 408*4882a593Smuzhiyun config_reset 409*4882a593Smuzhiyun config_unset_uevent 410*4882a593Smuzhiyun RANDOM_FILE_PATH=$(setup_random_file) 411*4882a593Smuzhiyun RANDOM_FILE="$(basename $RANDOM_FILE_PATH)" 412*4882a593Smuzhiyun if [ "$2" = "both" ]; then 413*4882a593Smuzhiyun xz -9 -C crc32 -k $RANDOM_FILE_PATH 414*4882a593Smuzhiyun elif [ "$2" = "xzonly" ]; then 415*4882a593Smuzhiyun xz -9 -C crc32 $RANDOM_FILE_PATH 416*4882a593Smuzhiyun fi 417*4882a593Smuzhiyun config_set_name $RANDOM_FILE 418*4882a593Smuzhiyun config_trigger_async 419*4882a593Smuzhiyun release_all_firmware 420*4882a593Smuzhiyun echo "OK" 421*4882a593Smuzhiyun} 422*4882a593Smuzhiyun 423*4882a593Smuzhiyuntest_request_partial_firmware_into_buf() 424*4882a593Smuzhiyun{ 425*4882a593Smuzhiyun echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2: " 426*4882a593Smuzhiyun config_reset 427*4882a593Smuzhiyun config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME 428*4882a593Smuzhiyun config_set_into_buf 429*4882a593Smuzhiyun config_set_partial 430*4882a593Smuzhiyun config_set_buf_size $2 431*4882a593Smuzhiyun config_set_file_offset $1 432*4882a593Smuzhiyun config_trigger_sync 433*4882a593Smuzhiyun read_partial_firmwares normal $1 $2 434*4882a593Smuzhiyun release_all_firmware 435*4882a593Smuzhiyun echo "OK" 436*4882a593Smuzhiyun} 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun# Only continue if batched request triggers are present on the 439*4882a593Smuzhiyun# test-firmware driver 440*4882a593Smuzhiyuntest_config_present 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun# test with the file present 443*4882a593Smuzhiyunecho 444*4882a593Smuzhiyunecho "Testing with the file present..." 445*4882a593Smuzhiyunfor i in $(seq 1 5); do 446*4882a593Smuzhiyun test_batched_request_firmware $i normal 447*4882a593Smuzhiyundone 448*4882a593Smuzhiyun 449*4882a593Smuzhiyunfor i in $(seq 1 5); do 450*4882a593Smuzhiyun test_batched_request_firmware_into_buf $i normal 451*4882a593Smuzhiyundone 452*4882a593Smuzhiyun 453*4882a593Smuzhiyunfor i in $(seq 1 5); do 454*4882a593Smuzhiyun test_batched_request_firmware_direct $i normal 455*4882a593Smuzhiyundone 456*4882a593Smuzhiyun 457*4882a593Smuzhiyunfor i in $(seq 1 5); do 458*4882a593Smuzhiyun test_request_firmware_nowait_uevent $i normal 459*4882a593Smuzhiyundone 460*4882a593Smuzhiyun 461*4882a593Smuzhiyunfor i in $(seq 1 5); do 462*4882a593Smuzhiyun test_request_firmware_nowait_custom $i normal 463*4882a593Smuzhiyundone 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun# Partial loads cannot use fallback, so do not repeat tests. 466*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 0 10 467*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 0 5 468*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 1 6 469*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 2 10 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun# Test for file not found, errors are expected, the failure would be 472*4882a593Smuzhiyun# a hung task, which would require a hard reset. 473*4882a593Smuzhiyunecho 474*4882a593Smuzhiyunecho "Testing with the file missing..." 475*4882a593Smuzhiyunfor i in $(seq 1 5); do 476*4882a593Smuzhiyun test_batched_request_firmware_nofile $i 477*4882a593Smuzhiyundone 478*4882a593Smuzhiyun 479*4882a593Smuzhiyunfor i in $(seq 1 5); do 480*4882a593Smuzhiyun test_batched_request_firmware_into_buf_nofile $i 481*4882a593Smuzhiyundone 482*4882a593Smuzhiyun 483*4882a593Smuzhiyunfor i in $(seq 1 5); do 484*4882a593Smuzhiyun test_batched_request_firmware_direct_nofile $i 485*4882a593Smuzhiyundone 486*4882a593Smuzhiyun 487*4882a593Smuzhiyunfor i in $(seq 1 5); do 488*4882a593Smuzhiyun test_request_firmware_nowait_uevent_nofile $i 489*4882a593Smuzhiyundone 490*4882a593Smuzhiyun 491*4882a593Smuzhiyunfor i in $(seq 1 5); do 492*4882a593Smuzhiyun test_request_firmware_nowait_custom_nofile $i 493*4882a593Smuzhiyundone 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun# Partial loads cannot use fallback, so do not repeat tests. 496*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 0 10 497*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 0 5 498*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 1 6 499*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 2 10 500*4882a593Smuzhiyun 501*4882a593Smuzhiyuntest "$HAS_FW_LOADER_COMPRESS" != "yes" && exit 0 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun# test with both files present 504*4882a593Smuzhiyunxz -9 -C crc32 -k $FW 505*4882a593Smuzhiyunconfig_set_name $NAME 506*4882a593Smuzhiyunecho 507*4882a593Smuzhiyunecho "Testing with both plain and xz files present..." 508*4882a593Smuzhiyunfor i in $(seq 1 5); do 509*4882a593Smuzhiyun test_batched_request_firmware $i both 510*4882a593Smuzhiyundone 511*4882a593Smuzhiyun 512*4882a593Smuzhiyunfor i in $(seq 1 5); do 513*4882a593Smuzhiyun test_batched_request_firmware_into_buf $i both 514*4882a593Smuzhiyundone 515*4882a593Smuzhiyun 516*4882a593Smuzhiyunfor i in $(seq 1 5); do 517*4882a593Smuzhiyun test_batched_request_firmware_direct $i both 518*4882a593Smuzhiyundone 519*4882a593Smuzhiyun 520*4882a593Smuzhiyunfor i in $(seq 1 5); do 521*4882a593Smuzhiyun test_request_firmware_nowait_uevent $i both 522*4882a593Smuzhiyundone 523*4882a593Smuzhiyun 524*4882a593Smuzhiyunfor i in $(seq 1 5); do 525*4882a593Smuzhiyun test_request_firmware_nowait_custom $i both 526*4882a593Smuzhiyundone 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun# test with only xz file present 529*4882a593Smuzhiyunmv "$FW" "${FW}-orig" 530*4882a593Smuzhiyunecho 531*4882a593Smuzhiyunecho "Testing with only xz file present..." 532*4882a593Smuzhiyunfor i in $(seq 1 5); do 533*4882a593Smuzhiyun test_batched_request_firmware $i xzonly 534*4882a593Smuzhiyundone 535*4882a593Smuzhiyun 536*4882a593Smuzhiyunfor i in $(seq 1 5); do 537*4882a593Smuzhiyun test_batched_request_firmware_into_buf $i xzonly 538*4882a593Smuzhiyundone 539*4882a593Smuzhiyun 540*4882a593Smuzhiyunfor i in $(seq 1 5); do 541*4882a593Smuzhiyun test_batched_request_firmware_direct $i xzonly 542*4882a593Smuzhiyundone 543*4882a593Smuzhiyun 544*4882a593Smuzhiyunfor i in $(seq 1 5); do 545*4882a593Smuzhiyun test_request_firmware_nowait_uevent $i xzonly 546*4882a593Smuzhiyundone 547*4882a593Smuzhiyun 548*4882a593Smuzhiyunfor i in $(seq 1 5); do 549*4882a593Smuzhiyun test_request_firmware_nowait_custom $i xzonly 550*4882a593Smuzhiyundone 551*4882a593Smuzhiyun 552*4882a593Smuzhiyunexit 0 553