[][atenl: add package]

[Description]
Add atenl package, a userspace daemon for mt76 testmode.
atenl acts as an intermediate for HQADLL command and mt76 testmode
(implemented with NL80211_CMD_TESTMODE), which provides transparency for
the usage of QA-tool and Litepoint on mt76.

[Release-log]
N/A

Change-Id: If11e67b36dd7c3ef9629e824bc26ed4f16f34dca
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5553443
diff --git a/feed/atenl/files/iwpriv.sh b/feed/atenl/files/iwpriv.sh
new file mode 100755
index 0000000..be5a2ac
--- /dev/null
+++ b/feed/atenl/files/iwpriv.sh
@@ -0,0 +1,329 @@
+#!/bin/ash
+
+interface=$1
+cmd_type=$2
+full_cmd=$3
+
+work_mode="RUN" # RUN/PRINT/DEBUG
+tmp_file="$HOME/.tmp_ate_config"
+phy_idx=$(echo ${interface} | tr -dc '0-9')
+
+cmd=$(echo ${full_cmd} | sed s/=/' '/g | cut -d " " -f 1)
+param=$(echo ${full_cmd} | sed s/=/' '/g | cut -d " " -f 2)
+
+function do_cmd() {
+    case ${work_mode} in
+        "RUN")
+            eval "$1"
+            ;;
+        "PRINT")
+            echo "$1"
+            ;;
+        "DEBUG")
+            eval "$1"
+            echo "$1"
+            ;;
+    esac
+}
+
+function record_config() {
+    if [ -f ${tmp_file} ]; then
+        if grep -q $1 ${tmp_file}; then
+            sed -i "/$1/c\\$1=$2" ${tmp_file}
+        else
+            echo "$1=$2" >> ${tmp_file}
+        fi
+    else
+        echo "$1=$2" >> ${tmp_file}
+    fi
+}
+
+function get_config() {
+    echo "$(cat ${tmp_file} | grep $1 | sed s/=/' '/g | cut -d " " -f 2)"
+}
+
+function do_ate_work() {
+    local ate_cmd=$1
+
+    case ${ate_cmd} in
+        "ATESTART")
+            local if_str=$(ifconfig | grep mon${phy_idx})
+
+            if [ ! -z "${if_str}" -a "${if_str}" != " " ]; then
+                echo "ATE already starts."
+            else
+                do_cmd "iw phy ${interface} interface add mon${phy_idx} type monitor"
+                do_cmd "iw dev wlan${phy_idx} del"
+                do_cmd "ifconfig mon${phy_idx} up"
+            fi
+            ;;
+        "ATESTOP")
+            local if_str=$(ifconfig | grep mon${phy_idx})
+
+            if [ -z "${if_str}" -a "${if_str}" != " " ]; then
+                echo "ATE does not start."
+            else
+                do_cmd "mt76-test ${interface} set state=off"
+                do_cmd "iw dev mon${phy_idx} del"
+                do_cmd "iw phy ${interface} interface add wlan${phy_idx} type managed"
+                do_cmd "ifconfig wlan${phy_idx} up"
+            fi
+            ;;
+        "TXFRAME")
+            do_cmd "mt76-test ${interface} set state=tx_frames"
+            ;;
+        "TXSTOP")
+            do_cmd "mt76-test ${interface} set state=idle"
+            ;;
+        "RXFRAME")
+            do_cmd "mt76-test ${interface} set state=rx_frames"
+            ;;
+        "RXSTOP")
+            do_cmd "mt76-test ${interface} set state=idle"
+            ;;
+        "TXCONT")
+            do_cmd "mt76-test ${interface} set state=tx_cont"
+            ;;
+    esac
+}
+
+function simple_convert() {
+    if [ "$1" = "ATETXCNT" ]; then
+        echo "tx_count"
+    elif [ "$1" = "ATETXLEN" ]; then
+        echo "tx_length"
+    elif [ "$1" = "ATETXMCS" ]; then
+        echo "tx_rate_idx"
+    elif [ "$1" = "ATEVHTNSS" ]; then
+        echo "tx_rate_nss"
+    elif [ "$1" = "ATETXLDPC" ]; then
+        echo "tx_rate_ldpc"
+    elif [ "$1" = "ATETXSTBC" ]; then
+        echo "tx_rate_stbc"
+    elif [ "$1" = "ATEPKTTXTIME" ]; then
+        echo "tx_time"
+    elif [ "$1" = "ATEIPG" ]; then
+        echo "tx_ipg"
+    elif [ "$1" = "ATEDUTYCYCLE" ]; then
+        echo "tx_duty_cycle"
+    elif [ "$1" = "ATETXFREQOFFSET" ]; then
+        echo "freq_offset"
+    else
+        echo "unknown"
+    fi
+}
+
+function convert_tx_mode() {
+    if [ "$1" = "0" ]; then
+        echo "cck"
+    elif [ "$1" = "1" ]; then
+        echo "ofdm"
+    elif [ "$1" = "2" ]; then
+        echo "ht"
+    elif [ "$1" = "4" ]; then
+        echo "vht"
+    elif [ "$1" = "8" ]; then
+        echo "he_su"
+    elif [ "$1" = "9" ]; then
+        echo "he_er"
+    elif [ "$1" = "10" ]; then
+        echo "he_tb"
+    elif [ "$1" = "11" ]; then
+        echo "he_mu"
+    else
+        echo "unknown"
+    fi
+}
+
+function convert_gi {
+    local tx_mode=$1
+    local val=$2
+    local sgi="0"
+    local he_ltf="0"
+
+    case ${tx_mode} in
+        "ht"|"vht")
+            sgi=${val}
+            ;;
+        "he_su"|"he_er")
+            case ${val} in
+                "0")
+                    ;;
+                "1")
+                    he_ltf="1"
+                    ;;
+                "2")
+                    sgi="1"
+                    he_ltf="1"
+                    ;;
+                "3")
+                    sgi="2"
+                    he_ltf="2"
+                    ;;
+                "4")
+                    he_ltf="2"
+                    ;;
+                *)
+                    echo "unknown gi"
+            esac
+            ;;
+        "he_mu")
+            case ${val} in
+                "0")
+                    he_ltf="2"
+                    ;;
+                "1")
+                    he_ltf="1"
+                    ;;
+                "2")
+                    sgi="1"
+                    he_ltf="1"
+                    ;;
+                "3")
+                    sgi="2"
+                    he_ltf="2"
+                    ;;
+                *)
+                    echo "unknown gi"
+            esac
+            ;;
+        "he_tb")
+            case ${val} in
+                "0")
+                    sgi="1"
+                    ;;
+                "1")
+                    sgi="1"
+                    he_ltf="1"
+                    ;;
+                "2")
+                    sgi="2"
+                    he_ltf="2"
+                    ;;
+                *)
+                    echo "unknown gi"
+            esac
+            ;;
+        *)
+            echo "unknown tx_rate_mode, can't transform gi"
+    esac
+
+    do_cmd "mt76-test ${interface} set tx_rate_sgi=${sgi} tx_ltf=${he_ltf}"
+}
+
+function convert_channel {
+    local band=$(echo $1 | sed s/:/' '/g | cut -d " " -f 2)
+    local ch=$(echo $1 | sed s/:/' '/g | cut -d " " -f 1)
+    local bw=$(get_config "ATETXBW" | cut -d ":" -f 1)
+
+    if [ "${band}" = "0" ]; then
+        case ${bw} in
+            "1")
+                if [ "${ch}" -ge "1" ] && [ "${ch}" -le "7" ]; then
+                    local bw_str="HT40+"
+                else
+                    local bw_str="HT40-"
+                fi
+                ;;
+            "0")
+                local bw_str="HT20"
+                ;;
+        esac
+    else
+        case ${bw} in
+            "2")
+                local bw_str="80MHz"
+                ;;
+            "1")
+                if [ "${ch}" == "36" ] || [ "${ch}" == "44" ] || [ "${ch}" == "52" ] || [ "${ch}" == "60" ] || \
+                   [ "${ch}" == "100" ] || [ "${ch}" == "108" ] || [ "${ch}" == "116" ] || [ "${ch}" == "124" ] || \
+                   [ "${ch}" == "132" ] || [ "${ch}" == "132" ] || [ "${ch}" == "140" ] || [ "${ch}" == "149" ] || \
+                   [ "${ch}" == "157" ]
+                then
+                    local bw_str="HT40+"
+                else
+                    local bw_str="HT40-"
+                fi
+                ;;
+            "0")
+                local bw_str="HT20"
+                ;;
+        esac
+    fi
+
+    do_cmd "iw dev mon${phy_idx} set channel ${ch} ${bw_str}"
+}
+
+if [ "${cmd_type}" = "set" ]; then
+    skip=0
+    use_ated=0
+    case ${cmd} in
+        "ATE")
+            do_ate_work ${param}
+
+            skip=1
+            ;;
+        "ATETXCNT"|"ATETXLEN"|"ATETXMCS"|"ATEVHTNSS"|"ATETXLDPC"|"ATETXSTBC"| \
+        "ATEPKTTXTIME"|"ATEIPG"|"ATEDUTYCYCLE"|"ATETXFREQOFFSET")
+            cmd_new=$(simple_convert ${cmd})
+            param_new=${param}
+            ;;
+        "ATETXANT"|"ATERXANT")
+            cmd_new="tx_antenna"
+            param_new=${param}
+            ;;
+        "ATETXGI")
+            tx_mode=$(convert_tx_mode $(get_config "ATETXMODE"))
+            convert_gi ${tx_mode} ${param}
+            skip=1
+            ;;
+        "ATETXMODE")
+            cmd_new="tx_rate_mode"
+            param_new=$(convert_tx_mode ${param})
+            record_config ${cmd} ${param}
+            ;;
+        "ATETXPOW0"|"ATETXPOW1"|"ATETXPOW2"|"ATETXPOW3")
+            cmd_new="tx_power"
+            param_new="${param},0,0,0"
+            ;;
+        "ATETXBW")
+            record_config ${cmd} ${param}
+            skip=1
+            ;;
+        "ATECHANNEL")
+            convert_channel ${param}
+            skip=1
+            ;;
+        "ATECTRLBANDIDX")
+            echo "Unused command, please use phy0/phy1 to switch"
+            skip=1
+            ;;
+        "bufferMode")
+            if [ "${param}" = "2" ]; then
+                do_cmd "ated -i ${interface} -c \"eeprom update\""
+            fi
+            skip=1
+            ;;
+        *)
+            echo "Unknown command to set"
+            skip=1
+    esac
+
+    if [ "${skip}" != "1" ]; then
+        do_cmd "mt76-test ${interface} set ${cmd_new}=${param_new}"
+    fi
+elif [ "${cmd_type}" = "show" ]; then
+    do_cmd "mt76-test ${interface} dump"
+    do_cmd "mt76-test ${interface} dump stats"
+elif [ "${cmd_type}" = "e2p" ]; then
+    v1=$(do_cmd "ated -i ${interface} -c \"eeprom read ${param}\"")
+    v1=$(echo "${v1}" | grep "val =" | cut -d '(' -f 2 | grep -o -E '[0-9]+')
+
+    param2=$(expr ${param} + "1")
+    v2=$(do_cmd "ated -i ${interface} -c \"eeprom read ${param2}\"")
+    v2=$(echo "${v2}" | grep "val =" | cut -d '(' -f 2 | grep -o -E '[0-9]+')
+    printf "[0x%04x]:0x%02x%02x\n" ${param} ${v2} ${v1}
+else
+    echo "Unknown command"
+fi
+