[OpenWrt-Devel] [PATCH] ipq806x: add ath10k calibration data MAC addresses patching
Mathias Kresin
dev at kresin.me
Thu Dec 6 15:24:14 EST 2018
28/10/2018 17:39, Christian Lamparter:
> 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>
Hey Felix,
as long as you don't strongly disagree, I would like to pick this patch.
I don't consider the calibration data patching as messy, as it is the
place where the mac address is expected but unfortunately not correct set.
Beside the issues mentioned by Ben, I really don't like to split the
wireless calibration data and wireless mac address handling across
multiple files if it can be done at a single place.
Mathias
> ---
> .../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
> + }
> +}
> +
> [ -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
>
_______________________________________________
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