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 <gree...@candelatech.com>
Signed-off-by: Christian Lamparter <chunk...@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@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to