#!/bin/sh
# Detache le gadget USB avant la veille, le rattache apres.
#
# ☠️ POURQUOI — la nuit du 12 au 13/08, mesuree par le mouchard batterie :
#    00:44:42  le telephone s'endort (marque « veille », 45 %)
#    01:02:07  41 757 WARNING du noyau, TOUS a la meme seconde :
#              « dwc3 a600000.usb: No resource for ep1out », sur le fil
#              d'interruption irq/172-s-dwc3, avec eth_start et rx_fill dans la
#              trace — le gadget ethernet USB qui tente de repartir.
#    puis      plus rien. Aucune marque « reveil », aucun releve jusqu'a un
#              APPUI LONG a 08:28. Le fil d'interruption part en boucle et noie
#              le systeme : l'ecran ne revient pas, rien ne repond.
#
# 🔑 CE QUE FAIT LE REMEDE, et pourquoi c'est celui-la : au reveil, le
#    controleur dwc3 a perdu la configuration de ses endpoints, et le gadget
#    essaie quand meme d'emettre — d'ou « no resource ». On ne corrige pas dwc3 :
#    on lui evite la situation, en DETACHANT le gadget de l'UDC avant la veille
#    et en le rattachant apres. C'est le geste que fait deja l'espace utilisateur
#    pour reconfigurer un gadget, il n'a rien d'exotique.
#
# ⚠️ CONSEQUENCE ASSUMEE : le lien reseau par USB (172.16.42.1) tombe pendant la
#    veille et revient au reveil. La CHARGE n'est pas concernee — elle est geree
#    par le PMIC, pas par le gadget.
#
# ⚠️ On memorise le nom de l'UDC dans /run plutot que de le supposer : il est
#    « a600000.usb » sur ce telephone, mais le deduire du materiel evite qu'un
#    changement de device-tree rende ce script silencieusement inoperant.
set -u
ETAT=/run/joyeuse-usb-veille.udc
CFG=/sys/kernel/config/usb_gadget

log() { echo "joyeuse-usb-veille: $*"; }

case "$1" in
pre)
	for g in "$CFG"/*; do
		[ -f "$g/UDC" ] || continue
		udc=$(cat "$g/UDC" 2>/dev/null)
		[ -n "$udc" ] || continue
		echo "$udc" > "$ETAT"
		# ☠️ Verification par l'EFFET : un `echo` qui echoue ne dit rien.
		if echo "" > "$g/UDC" 2>/dev/null && [ -z "$(cat "$g/UDC" 2>/dev/null)" ]; then
			log "gadget $(basename "$g") detache de $udc"
		else
			log "ECHEC du detachement de $(basename "$g") — la veille va se faire AVEC le gadget"
		fi
	done
	;;
post)
	[ -r "$ETAT" ] || exit 0
	udc=$(cat "$ETAT")
	for g in "$CFG"/*; do
		[ -f "$g/UDC" ] || continue
		[ -n "$(cat "$g/UDC" 2>/dev/null)" ] && continue   # deja rattache
		if echo "$udc" > "$g/UDC" 2>/dev/null && [ -n "$(cat "$g/UDC" 2>/dev/null)" ]; then
			log "gadget $(basename "$g") rattache a $udc"
		else
			# ⚠️ Ne pas mourir ici : un gadget non rattache coute le reseau USB,
			#    pas le telephone. On le DIT, c'est tout.
			log "ECHEC du rattachement a $udc — plus de reseau par USB jusqu'au redemarrage"
		fi
	done
	rm -f "$ETAT"
	;;
esac
