diff --git a/Runner/suites/Kernel/Baseport/IPA/run.sh b/Runner/suites/Kernel/Baseport/IPA/run.sh index ea2cf9b9..7486f5d4 100755 --- a/Runner/suites/Kernel/Baseport/IPA/run.sh +++ b/Runner/suites/Kernel/Baseport/IPA/run.sh @@ -2,6 +2,9 @@ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause-Clear +# +# Test for IPA driver: skip if CONFIG_QCOM_IPA not enabled, then +# builtin vs module, verify /dev/ipa, functional sysfs & dmesg checks. # Robustly find and source init_env SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" @@ -30,40 +33,61 @@ fi TESTNAME="IPA" test_path=$(find_test_case_by_name "$TESTNAME") cd "$test_path" || exit 1 -res_file="./$TESTNAME.res" +RES_FILE="./$TESTNAME.res" log_info "-----------------------------------------------------------------------------------------" log_info "-------------------Starting $TESTNAME Testcase----------------------------" log_info "=== Test Initialization ===" -IPA_MODULE_PATH=$(find_kernel_module "ipa") - -if [ -z "$IPA_MODULE_PATH" ]; then - log_error "ipa.ko module not found in filesystem." - echo "$TESTNAME FAIL" > "$res_file" - exit 1 +# Kernel config gate +if ! check_kernel_config "CONFIG_QCOM_IPA"; then + log_skip "$TESTNAME SKIP - CONFIG_QCOM_IPA not enabled" + echo "$TESTNAME SKIP" >"$RES_FILE" + exit 0 fi -log_info "Found ipa.ko at: $IPA_MODULE_PATH" +MODNAME="ipa" +PRE_LOADED=0 -if ! load_kernel_module "$IPA_MODULE_PATH"; then - echo "$TESTNAME FAIL" > "$res_file" - exit 1 +# Ensure module is loaded +if is_module_loaded "$MODNAME"; then + PRE_LOADED=1 + log_info "Module $MODNAME already loaded" +else + MODPATH=$(find_kernel_module "$MODNAME") + [ -n "$MODPATH" ] || log_fail "$MODNAME.ko not found in filesystem" + load_kernel_module "$MODPATH" || log_fail "Failed to load $MODNAME" + log_pass "$MODNAME module loaded" fi -if is_module_loaded "ipa"; then - log_info "ipa module is loaded" - log_pass "$TESTNAME : Test Passed" - echo "$TESTNAME PASS" > "$res_file" - exit 0 +# /dev node check (warn only, don't fail/skip) +log_info "Verifying /dev/ipa node" +if wait_for_path "/dev/ipa" 3; then + log_pass "/dev/ipa node is present" else - log_error "ipa module not listed in lsmod" - log_fail "$TESTNAME : Test Failed" - echo "$TESTNAME FAIL" > "$res_file" - exit 1 + log_warn "No /dev/ipa node found (platform/use-case may not expose it)" fi -log_info "=== Cleanup ===" -unload_kernel_module "ipa" true +# dmesg scan: errors + success pattern +# scan_dmesg_errors(label, out_dir, extra_err, ok_kw) +scan_dmesg_errors "ipa" "." "handshake_complete.*error|stall|abort" "IPA Q6 handshake completed" +rc=$? +case "$rc" in + 0) log_warn "IPA-related errors found in dmesg (see ipa_dmesg_errors.log)" ;; + 1) log_info "No IPA-related errors in dmesg" ;; + 2) log_warn "Success pattern 'IPA Q6 handshake completed' not found in dmesg" ;; + 3) log_warn "scan_dmesg_errors misuse (label missing?)" ;; +esac + +#Cleanup: unload only if we loaded it +if [ "$PRE_LOADED" -eq 0 ]; then + log_info "Unloading $MODNAME (loaded by this test)" + unload_kernel_module "$MODNAME" false || log_warn "Unload $MODNAME failed" +else + log_info "$MODNAME was pre-loaded; leaving it loaded" +fi log_info "-------------------Completed $TESTNAME Testcase----------------------------" +log_pass "$TESTNAME PASS" +echo "$TESTNAME PASS" >"$RES_FILE" +exit 0 diff --git a/Runner/suites/Kernel/Baseport/RMNET/run.sh b/Runner/suites/Kernel/Baseport/RMNET/run.sh index 145f3f8a..c850cd2f 100755 --- a/Runner/suites/Kernel/Baseport/RMNET/run.sh +++ b/Runner/suites/Kernel/Baseport/RMNET/run.sh @@ -2,6 +2,9 @@ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause-Clear +# +# Test for RMNET driver: skip if CONFIG_RMNET not enabled, then +# builtin vs module, verify /dev/rmnet, functional sysfs & dmesg checks. # Robustly find and source init_env SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" @@ -30,40 +33,79 @@ fi TESTNAME="RMNET" test_path=$(find_test_case_by_name "$TESTNAME") cd "$test_path" || exit 1 -res_file="./$TESTNAME.res" +RES_FILE="./$TESTNAME.res" log_info "-----------------------------------------------------------------------------------------" log_info "-------------------Starting $TESTNAME Testcase----------------------------" log_info "=== Test Initialization ===" -RMNET_MODULE_PATH=$(find_kernel_module "rmnet") -if [ -z "$RMNET_MODULE_PATH" ]; then - log_error "rmnet.ko module not found in filesystem." - echo "$TESTNAME FAIL" > "$res_file" - exit 1 +# Kernel config gate +if ! check_kernel_config "CONFIG_RMNET"; then + log_skip "$TESTNAME SKIP - CONFIG_RMNET not enabled" + echo "$TESTNAME SKIP" >"$RES_FILE" + exit 0 fi -log_info "Found rmnet.ko at: $RMNET_MODULE_PATH" +# Load module if needed +MODNAME="rmnet" +PRE_LOADED=0 +if is_module_loaded "$MODNAME"; then + PRE_LOADED=1 + log_info "Module $MODNAME already loaded" +else + MODPATH=$(find_kernel_module "$MODNAME") + [ -n "$MODPATH" ] || log_fail "$MODNAME.ko not found in filesystem" + load_kernel_module "$MODPATH" || log_fail "Failed to load $MODNAME" + log_pass "$MODNAME module loaded" +fi -if ! load_kernel_module "$RMNET_MODULE_PATH"; then - echo "$TESTNAME FAIL" > "$res_file" - exit 1 +# /dev/rmnet* nodes (authoritative), but do NOT FAIL if absent (common until modem data call) +log_info "Verifying /dev/rmnet* node(s)" +first_node="" +for n in /dev/rmnet*; do + case "$n" in + /dev/rmnet*) [ -e "$n" ] && { first_node="$n"; break; } ;; + esac +done + +if [ -n "$first_node" ]; then + if wait_for_path "$first_node" 3; then + log_pass "rmnet node $first_node is present" + else + log_fail "rmnet node $first_node did not appear within timeout" + fi +else + log_warn "No /dev/rmnet* nodes found" fi -if is_module_loaded "rmnet"; then - log_info "rmnet module is loaded" - log_pass "$TESTNAME : Test Passed" - echo "$TESTNAME PASS" > "$res_file" - exit 0 +# dmesg scan for rmnet errors (no positive 'OK' pattern required here) +scan_dmesg_errors "rmnet" "." "panic|oops|fault|stall|abort" "" +if [ -s "./rmnet_dmesg_errors.log" ]; then + log_fail "rmnet-related errors found in dmesg" else - log_error "rmnet module not listed in lsmod" - log_fail "$TESTNAME : Test Failed" - echo "$TESTNAME FAIL" > "$res_file" - exit 1 + log_info "No rmnet-related errors in dmesg" +fi + +# Optional informational check: ip link (do not fail if absent) +if command -v ip >/dev/null 2>&1; then + if ip -o link show | grep -qi rmnet; then + log_info "ip(8): rmnet interface(s) present" + else + log_info "ip(8): no rmnet interface yet (probably no data call)" + fi fi -log_info "=== Cleanup ===" -unload_kernel_module "rmnet" true +# Cleanup if we loaded it +if [ "$PRE_LOADED" -eq 0 ]; then + log_info "Unloading $MODNAME (loaded by this test)" + unload_kernel_module "$MODNAME" false || log_warn "Unload $MODNAME failed" +else + log_info "$MODNAME was pre-loaded; leaving it loaded" +fi log_info "-------------------Completed $TESTNAME Testcase----------------------------" +log_pass "$TESTNAME PASS" +echo "$TESTNAME PASS" >"$RES_FILE" +exit 0 + diff --git a/Runner/utils/functestlib.sh b/Runner/utils/functestlib.sh index a9075ebb..e4a8c8d6 100755 --- a/Runner/utils/functestlib.sh +++ b/Runner/utils/functestlib.sh @@ -61,12 +61,13 @@ is_module_loaded() { /sbin/lsmod | awk '{print $1}' | grep -q "^${module_name}$" } -# Insert a kernel module with optional parameters +# load_kernel_module [params...] +# 1) If already loaded, no-op +# 2) Try insmod [params] +# 3) If that fails, try modprobe [params] load_kernel_module() { - module_path="$1" - shift + module_path="$1"; shift params="$*" - module_name=$(basename "$module_path" .ko) if is_module_loaded "$module_name"; then @@ -76,15 +77,24 @@ load_kernel_module() { if [ ! -f "$module_path" ]; then log_error "Module file not found: $module_path" - return 1 + # still try modprobe if it exists in modules directory + else + log_info "Loading module via insmod: $module_path $params" + if /sbin/insmod "$module_path" "$params" 2>insmod_err.log; then + log_info "Module $module_name loaded successfully via insmod" + return 0 + else + log_warn "insmod failed: $(cat insmod_err.log)" + fi fi - log_info "Loading module: $module_path $params" - if /sbin/insmod "$module_path" "$params" 2>insmod_err.log; then - log_info "Module $module_name loaded successfully" + # fallback to modprobe + log_info "Falling back to modprobe $module_name $params" + if /sbin/modprobe "$module_name" "$params" 2>modprobe_err.log; then + log_info "Module $module_name loaded successfully via modprobe" return 0 else - log_error "insmod failed: $(cat insmod_err.log)" + log_error "modprobe failed: $(cat modprobe_err.log)" return 1 fi } @@ -171,14 +181,25 @@ find_test_case_script_by_name() { find "$base_dir" -type d -iname "$test_name" -print -quit 2>/dev/null } +# Check each given kernel config is set to y/m in /proc/config.gz, logs result, returns 0/1. check_kernel_config() { - configs="$1" - for config_key in $configs; do - if zcat /proc/config.gz | grep -qE "^$config_key=(y|m)"; then - log_pass "Kernel config $config_key is enabled" + cfgs=$1 + for config_key in $cfgs; do + if command -v zgrep >/dev/null 2>&1; then + if zgrep -qE "^${config_key}=(y|m)" /proc/config.gz 2>/dev/null; then + log_pass "Kernel config $config_key is enabled" + else + log_fail "Kernel config $config_key is missing or not enabled" + return 1 + fi else - log_fail "Kernel config $config_key is missing or not enabled" - return 1 + # Fallback if zgrep is unavailable + if gzip -dc /proc/config.gz 2>/dev/null | grep -qE "^${config_key}=(y|m)"; then + log_pass "Kernel config $config_key is enabled" + else + log_fail "Kernel config $config_key is missing or not enabled" + return 1 + fi fi done return 0 @@ -1653,41 +1674,71 @@ detect_ufs_partition_block() { return 1 } -# Check for dmesg I/O errors and log summary +# scan_dmesg_check