#!/bin/sh
# ☠️☠️ POURQUOI CE FICHIER EXISTE — c'est le remede DE FOND du 13-bis, la ou le
#    crochet system-sleep n'est qu'un filet.
#
#   Mesure du 19/08, dans drivers/net/wireless/ath/ath10k/wow.c :
#   ath10k_hif_suspend() et ath10k_hif_resume() ne sont appeles QUE depuis
#   wow.c:534 et wow.c:578 — c'est-a-dire QUE si WoWLAN est arme.
#
#   ➜ SANS WoWLAN, le pilote ne fait AUCUN suspend/resume materiel : mac80211
#     fait un drv_stop complet a l'endormissement et un drv_start complet au
#     reveil. Ce drv_start passe par hif_power_up -> ath10k_snoc_wlan_enable ->
#     la requete QMI wlan_enable. C'EST EXACTEMENT LE CHEMIN QUI ECHOUE, celui du
#     « -110 » et du « Hardware became unavailable upon resume ».
#
#   🔑 Avec WoWLAN, ce chemin n'est plus emprunte : le firmware reste charge, la
#     puce reste alimentee, il n'y a plus de wlan_enable a refaire au reveil.
#     On ne rattrape pas la panne — ON SUPPRIME L'OCCASION DE LA PRODUIRE.
#
# ⚖️ POURQUOI « magic » ET PAS « disconnect » : le pilote annonce les deux
#    (WIPHY_WOWLAN_DISCONNECT | WIPHY_WOWLAN_MAGIC_PKT, wow.c:17-19). N'importe
#    lequel suffit a faire prendre le chemin wow — mais « disconnect » reveille
#    le telephone A CHAQUE perte de WiFi, ce qui viderait la batterie dans un
#    couloir. « magic » ne reveille que sur un paquet envoye expres.
#
# ⚠️ POURQUOI UN DISPATCHER ET PAS UN FICHIER conf.d : mesure faite, un defaut
#    global ne prend pas. « [connection] wifi.wake-on-wlan=magic » puis
#    « nmcli general reload » laisse la connexion a « 0x1 (default) », et
#    « [connection-*] » avec match-device non plus. La propriete se pose sur la
#    CONNEXION, donc il faut la poser connexion par connexion — y compris sur
#    celles creees plus tard, d'ou le dispatcher plutot qu'un script de demarrage.
#
# ⚠️ ET IL NE REACTIVE PAS LA CONNEXION. Un « nmcli connection up » ici
#    rappellerait le dispatcher, donc ce script — boucle. Le reglage prend a la
#    connexion suivante, ce qui suffit : la premiere veille utile est plus tard.
#
# COMMENT ON VERIFIE QUE CA MARCHE — pas « le fichier est livre » :
#     cat /sys/class/net/wlan0/device/power/wakeup
#   doit rendre « enabled ». Il vaut « disabled » tant que cfg80211 n'a pas
#   pousse de configuration wow au peripherique — c'est donc l'EFFET, pas le
#   reglage, et il ne ment pas.

[ "$2" = "up" ] || exit 0

case "$(nmcli -t -f GENERAL.TYPE device show "$1" 2>/dev/null | cut -d: -f2)" in
	wifi) ;;
	*) exit 0 ;;
esac

NOM=$(nmcli -t -f NAME,DEVICE connection show --active 2>/dev/null \
	| awk -F: -v d="$1" '$2 == d { print $1; exit }')
[ -n "$NOM" ] || exit 0

ACTUEL=$(nmcli -t -f 802-11-wireless.wake-on-wlan connection show "$NOM" 2>/dev/null \
	| cut -d: -f2)

# ☠️ r3 — CE TEST COMPARAIT UN NOMBRE A UN MOT, ET IL NE MATCHAIT JAMAIS.
#    Il cherchait « magic » ; nmcli en mode « -t » rend le NOMBRE seul. Mesure du
#    19/08, les deux formes cote a cote sur la meme connexion :
#
#      nmcli    -f ... connection show  ->  0x8 (magic)
#      nmcli -t -f ... connection show  ->  0x8
#
#    ⚖️ Le reglage etait donc bien pose — « power/wakeup » vaut « enabled » sur
#      l'appareil — mais le dispatcher le REECRIVAIT a chaque montee de lien, et
#      journalisait « WoWLAN magic pose » a chaque fois. Cinq lignes identiques
#      pour cinq demarrages, dont aucune ne signalait quoi que ce soit.
#    🔑 Ce que ca coute n'est pas l'ecriture : c'est qu'un journal qui annonce un
#      changement a chaque fois devient un journal qu'on n'ouvre plus. Le jour ou
#      la pose echoue vraiment, la ligne se perd dans les autres.
#
# ⚠️ On teste le BIT (0x8), pas le mot : NM peut cumuler plusieurs drapeaux —
#    « disconnect|magic » vaut 0xc — et un test textuel sur « 0x8 » raterait ce
#    cas-la aussi. Le « *magic* » reste en premier pour les versions de nmcli qui
#    rendent le mot.
case "$ACTUEL" in
	*magic*) exit 0 ;;
	0x*|[0-9]*) [ "$(( ACTUEL & 8 ))" -ne 0 ] && exit 0 ;;
esac

nmcli connection modify "$NOM" 802-11-wireless.wake-on-wlan magic 2>/dev/null \
	&& logger -t joyeuse-wowlan "WoWLAN « magic » pose sur « $NOM » (etait : $ACTUEL)" \
	|| logger -t joyeuse-wowlan "echec de la pose de WoWLAN sur « $NOM »"

exit 0
