WIFI NÃO FUNCIONA APÓS O SUSPEND [RESOLVIDO]

UMA PEQUENA INTRODUÇÃO

 

Linux utiliza um mecanismo de gerencia o as funções de hardware. Este mecanismo conversa com o hardware do computador por uma camada de abstração chamada HAL (Hardware Abstraction Layer), que é parte componente dos subsistemas do Linux.

As ferramentas pm-utils (Power Manager Utils) e systemd (System and Service Manager) fazem parte do conjunto de softwares da freedesktop.org e são as responsáveis por executar a função sleep, que é composto pelas operações SUSPEND, HIBERNATE, HYBRID_SUSPEND e HYBRID_HIBERNATE. Todas tem a função que restaura a volta ao sistema (RESUME|THAW|POST).

Por exemplo, se o usuário fechar a tampa do notebook (LID CLOSE ACTION), o sistema irá executar uma das funções sleep que está configurada para esta ação. Ao abrir a tampa, o sistema irá executar a função de RESUME.

Porém as ferramentas pm-util e systemd tem suas particularidades.

O pm-utils trabalha com os flags suspend, hibernate, resume e thaw.

O systemd trabalha com pre e post. O pre é o momento anterior ao sleep e post e o momento posterior ao sleep, quando ocorre o evento wakeup. Fica mais ou menos assim:

    LID FECHADO ------(pre)----->  SLEEP ------------> LID ABERTO -----(post)-----> WAKEUP

SOLUÇÃO

Descobri que ocorre um problema com os módulos do adaptador WIFI, me obrigando a derrubar os módulos e levantá-los em seguida. Para corrigir este problema bastava escrever um script, que seria executado assim que a função RESUME fosse executada. Porém, para isso, é necessário saber qual mecanismo é utilizado pelo sistema para fazer o sleep.

As distribuições mais recentes do Linux utilizam o systemd para isso. Os ambientes gráficos mais populares são integrados ao systemd. Não sei se a ferramenta systemd é dependente da pm-utils, mas é interessante incluir a solução nos dois casos. Para isso teremos que identificar o nome do módulo do WIFI.

COMO IDENTIFICAR OS MÓDULOS DO WIFI

Para identificar o nome do módulo do WIFI execute como superusuário o comando a seguir:

# lshw -C network

Separei o fragmento que nos interessa da saída do comando:

  *-usb                     
       description: Wireless interface
       product: 802.11 bg WLAN
       vendor: Ralink
       physical id: 3
       bus info: usb@1:3
       logical name: wlx0019dba00811
       version: 0.01
       serial: 00:19:db:a0:08:11
       capabilities: usb-2.00 ethernet physical wireless
       configuration: broadcast=yes driver=rt73usb driverversion=4.15.0-20-generic firmware=1.7 ip=192.168.1.6 link=yes maxpower=300mA multicast=yes speed=480Mbit/s wireless=IEEE 802.11

Podemos ver que em description aparece “Wireless interface”, que é o nosso adaptador WIFI. A informação que procuramos é o nome do módulo de driver, informação que está em configuration.

       configuration: broadcast=yes driver=rt73usb driverversion=4.15.0-20-generic firmware=1.7 ip=192.168.1.6 link=yes maxpower=300mA multicast=yes speed=480Mbit/s wireless=IEEE 802.11

O nome do módulo de driver é o rt73usb.

O SCRIPT WIFI-WAKEUP

 

Segue o código do script wifi-wakeup:

#!/bin/sh
# Autor: Marcos Antonio Mello Estevão.
# Nome do script: wifi-wakeup.
# Este script é baseado no:
# /etc/pm/sleep.d/60_wpa_supplicant
# Este é um script de ação que baixa e levanta o móduli rt73usb do adaptador WIFI.
# O objetivo é executar durante o evento RESUME, no caso do SUSPEND e THAW, no caso do HIBERNATE.

PATH=/sbin:/usr/sbin:/bin:/usr/bin

resume_action()
{
rmmod rt73usb
modprobe rt73usb
}

case “$1” in
resume|thaw|post)
resume_action
;;
esac

exit 0

O LOCAL CORRETO ONDE COLOCAR O SCRIPT

O script é bem simples e pode ser utilizado tanto no pm-utils quanto no systemd e foi testado nos dois softwares.

Em pm-utils:

O caminho dos scripts pre e post do pm-utils está localizado em:

  • /usr/lib/pm-utils/sleep.d/

Em systemd:

O caminho dos scripts pre e post do systemd está localizado em:

  • /lib/systemd/system-sleep/

Uma forma de identificar o caminho adequado para abrigar o script é conhecer o local onde o script hdparm é executado na função sleep. O comando a seguir irá ajudá-lo:

# find /lib /usr -name “*hdparm*” | grep sleep 

A saída do comando é algo semelhante a isto:

/lib/systemd/system-sleep/hdparm
/usr/lib/pm-utils/sleep.d/95hdparm-apm

Obs.: veja que em pm-utils é necessário colocar um número inteiro de dois dígitos que define a ordem da sequência da execução do script. Neste caso, sugiro colocá-lo mais ao final.

Agora faça o teste.

Rolar para cima