[OpenWrt-Devel] [PATCH] ipq806x: add ath10k calibration data MAC addresses patching

Chuanhong Guo gch981213 at gmail.com
Fri Dec 7 03:26:43 EST 2018


Hi!
On Mon, Oct 29, 2018 at 12:40 AM Christian Lamparter <chunkeey at gmail.com> wrote:
>
> Ben Greear reported in his patch:
> |Subject: netgear r7800: Fix mac address of radios.
> |
> |Reloading the driver causes the phyX to change, and that
> |caused the MAC address to change.
>
> This is because all ODM/OEMs except QCA bothered to write
> the correct MAC address for the ath10k wifi into the
> calibration data.
>
> This patch copies over the MAC patching helper functions from ipq40xx's
> target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> file and converts all the devices to patch the correct MACs into the
> extracted calibration data before it gets sent to the driver, which sets
> up the device with the correct MAC address. It also removes the
> 10_fix_wifi_mac file as it has served its purpose.
>
> Please note the C2600: There is conflicting information on what
> the offset for the second wifi is supposed to be. This patch uses
> what was specified in 10_fix_wifi_mac.
>
> Reported-by: Ben Greear <greearb at candelatech.com>
> Signed-off-by: Christian Lamparter <chunkeey at gmail.com>
> ---
>  .../etc/hotplug.d/firmware/11-ath10k-caldata  | 64 +++++++++++++++++--
>  .../etc/hotplug.d/ieee80211/10_fix_wifi_mac   | 37 -----------
>  2 files changed, 57 insertions(+), 44 deletions(-)
>  delete mode 100644 target/linux/ipq806x/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac
>
> diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> index fa49c250f0..1d070603f2 100644
> --- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> @@ -1,5 +1,21 @@
>  #!/bin/sh
>
> +# xor multiple hex values of the same length
> +xor() {
> +       local val
> +       local ret="0x$1"
> +       local retlen=${#1}
> +
> +       shift
> +       while [ -n "$1" ]; do
> +               val="0x$1"
> +               ret=$((ret ^ val))
> +               shift
> +       done
> +
> +       printf "%0${retlen}x" "$ret"
> +}
> +
>  ath10kcal_die() {
>         echo "ath10cal: " "$*"
>         exit 1
> @@ -36,6 +52,29 @@ ath10kcal_patch_mac() {
>         macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
>  }
>
> +ath10kcal_patch_mac_crc() {
> +       local mac=$1
> +       local mac_offset=6
> +       local chksum_offset=2
> +       local xor_mac
> +       local xor_fw_mac
> +       local xor_fw_chksum
> +
> +       xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
> +       xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
> +
> +       ath10kcal_patch_mac "$mac" && {
> +               xor_mac=${mac//:/}
> +               xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
> +
> +               xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
> +               xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
> +
> +               printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
> +                       dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
> +       }
> +}
> +
I think we should replace the ath10kcal_patch_mac directly instead of
introducing another function.
All ath10k calibration data have a checksum at 0x2.
ath10kcal_patch_mac works for QCA9880/QCA9882 only because the ath10k
firmware for these two chips doesn't check the checksum value. (QCA
proprietary driver checks this and refuses to use caldata with
incorrect checksum.)
>  [ -e /lib/firmware/$FIRMWARE ] && exit 0
>
>  . /lib/functions.sh
> @@ -43,53 +82,64 @@ ath10kcal_patch_mac() {
>
>  board=$(board_name)
>
> -
>  case "$FIRMWARE" in
>  "ath10k/pre-cal-pci-0000:01:00.0.bin")
>         case $board in
>         linksys,ea8500)
> -               hw_mac_addr=$(mtd_get_mac_ascii devinfo hw_mac_addr)
>                 ath10kcal_extract "art" 4096 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1)
> +               ;;
> +       nec,wg2600hp)
> +               ath10kcal_extract "ART" 4096 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 12) +1)
>                 ;;
>         netgear,d7800 |\
>         netgear,r7500v2 |\
>         netgear,r7800)
>                 ath10kcal_extract "art" 4096 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +1)
>                 ;;
>         tplink,c2600)
>                 ath10kcal_extract "radio" 4096 12064
> -#              ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 8) -1)
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 8) -1)
>                 ;;
> -       nec,wg2600hp |\
>         tplink,vr2600v)
>                 ath10kcal_extract "ART" 4096 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 0) -1)
>                 ;;
>         zyxel,nbg6817)
>                 ath10kcal_extract "0:ART" 4096 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1)
>                 ;;
>         esac
>         ;;
>  "ath10k/pre-cal-pci-0001:01:00.0.bin")
>         case $board in
>         linksys,ea8500)
> -               hw_mac_addr=$(mtd_get_mac_ascii devinfo hw_mac_addr)
>                 ath10kcal_extract "art" 20480 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2)
> +               ;;
> +       nec,wg2600hp)
> +               ath10kcal_extract "ART" 20480 12064
> +               ath10kcal_patch_mac_crc $(mtd_get_mac_binary PRODUCTDATA 12)
>                 ;;
>         netgear,d7800 |\
>         netgear,r7500v2 |\
>         netgear,r7800)
>                 ath10kcal_extract "art" 20480 12064
> +               ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +2)
>                 ;;
>         tplink,c2600)
>                 ath10kcal_extract "radio" 20480 12064
> -#              ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 8) -2)
> +               ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 8)
>                 ;;
> -       nec,wg2600hp |\
>         tplink,vr2600v)
>                 ath10kcal_extract "ART" 20480 12064
> +               ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 0)
>                 ;;
>         zyxel,nbg6817)
>                 ath10kcal_extract "0:ART" 20480 12064
> +               ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
>                 ;;
>         esac
>         ;;
> diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac b/target/linux/ipq806x/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac
> deleted file mode 100644
> index afa425f075..0000000000
> --- a/target/linux/ipq806x/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -#!/bin/ash
> -
> -[ "$ACTION" == "add" ] || exit 0
> -
> -PHYNBR=${DEVPATH##*/phy}
> -
> -[ -n $PHYNBR ] || exit 0
> -
> -. /lib/functions.sh
> -. /lib/functions/system.sh
> -
> -board=$(board_name)
> -
> -case "$board" in
> -       linksys,ea8500)
> -               echo $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) $(($PHYNBR + 1)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       nec,wg2600hp)
> -               echo $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 12) $((1 - $PHYNBR)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       netgear,d7800 |\
> -       netgear,r7500v2 |\
> -       netgear,r7800)
> -               echo $(macaddr_add $(mtd_get_mac_binary art 6)  $(($PHYNBR + 1)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       tplink,c2600)
> -               echo $(macaddr_add $(mtd_get_mac_binary default-mac 8)  $(($PHYNBR - 1)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       tplink,vr2600v)
> -               echo $(macaddr_add $(mtd_get_mac_binary default-mac 0)  $(($PHYNBR - 1)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       zyxel,nbg6817)
> -               echo $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) $((1 - $PHYNBR)) ) > /sys${DEVPATH}/macaddress
> -               ;;
> -       *)
> -               ;;
> -esac
> --
> 2.19.1
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list