Recently I got a new laptop (Legion Pro 5) and installed my favorite Linux distro, Ubuntu, on it. Everything worked like a charm more or less out of the box, even with the Nvidia drivers! One small problem however floored me for a good day until I figured out the root cause.
Wifi not functioning after system wakeup from sleep
I tried every fix I could find. Restarted network services, tried to manually force the wifi drivers back up, disabled power savings, look in BIOS settings extensively for anything suspicious. Nothing worked. After wasting a couple hours I looked at the output of dmesg
and right there I saw the problem. I could see the wifi being up but the driver could not wake up from sleep.
rtw89_8852ce 0000:01:00.0: can't change power state from D3hot to D0 (config space inaccessible)
After some search engine gymnastics found out a thread very similar to my issue. The only possible explanation is that the BIOS and Realtek drivers cannot communicate properly that the system has woken up from sleep. This explains why the driver works upon a system reboot but not waking up from sleep.
The solution is to take down the Realtek wifi drivers before the laptop goes to sleep and bring them back upon resuming.
Bash Script
Make a file in the folder /usr/lib/systemd/system-sleep
. Put the bash script below in it:
#!/bin/sh
case "$1" in
pre)
modprobe -r rtw89_8852ce
echo "we are suspending at $(date)..." > /tmp/systemd_suspend_rtw_driver
;;
post)
modprobe rtw89_8852ce
;;
esac
Replace rtw89_8852ce
with your own driver if you're using a different one.
And there you have it. Hope this helps someone else given the popularity of Legion laptops. I am using Ubuntu 23.04 with 6.2.0-34 kernel.