Tryptophan, first, I found that on my Dell laptop, Fn<F2> would unblock both the hard and soft blocks that rfkill did. (I had to reboot or suspend/resume for them to actually unblock.) Seems that /usr/lib/pm-utils/sleep.d/49bluetooth-generic does a 'rfkill block bluetooth', which also results in both soft and hard blocks on dell-wifi, which don't seem to be unblocked with a 'rfkill unblock ...'. So I removed the execute bit on this file: chmod -x /usr/lib/pm-utils/sleep.d/49bluetooth-generic so that it's no longer called by pm-suspend.
Next, my IT person from my previous job suggested the following:
echo 'SUSPEND_MODULES="uhci_hd button ehci_hd iwlwifi"' > /etc/pm/config.d/modules.
This will result in the wifi modules to be specifically unloaded before suspend and
reloaded after resume.
Finally, I found that although wifi (wlan0) had been properly resumed, I always have to restart dhcpcd:
dhcpcd -d -t 20 wlan0
It would be nice to have this done automatically after the wifi is resumed, but I haven't been able to figure out how to do this.
The above works for me, and I thus have added the acpi hook in /etc/acpi/acpi_handler.sh:
case "2" in
Hope this helps!