
Lenovo liefert seine P16 Gen 2-Laptops (zertifiziert für Ubuntu Linux) mit der folgenden WWAN-Karte aus: Intel MBIM [8086:7560]. Der Modem-Manager erkennt das WWAN-Modem, kann es aber nicht aktivieren (Fehlermeldung: ** (modem-manager-gui:9178): WARNUNG **: 10:33:30.084: Modem-Manager >= 0.7.0: GDBus.Error:org.freedesktop.ModemManager1.Error.Core.Retry: Ungültiger Übergang
Laut Lenovo-Anleitung (ThinkPad P16 Gen 2 Linux-Benutzerhandbuch: „Gehe zuhttps://support.lenovo.comund wählen Sie den Eintrag für Ihren Computer aus. Laden Sie das Paket wwan-linux-fcc-unlock von der Produktsupportseite herunter. Lesen Sie unbedingt die README-Datei, um zu bestätigen, ob für Ihren Standort Einschränkungen gelten, und um Anweisungen zur Installation der Anwendung zu erhalten.)
Leider ist eine solche Datei auf den Lenovo-Websites nicht verfügbar. Auch Lenovo selbst hat keinen Kommentar zu diesem Versäumnis abgegeben, die FCC-Freischaltdatei bereitzustellen.
Auch dieser Link scheint leer zu sein:https://www.lenovo.com/linux/wwan-enablement-on-Linux.pdf
Sofern niemand weiß, wo die FCC-Ulock-Datei für die oben erwähnte WWAN-Karte zu finden ist, ist das WWAN-Modem der P16-Serie in Ubuntu oder Linux nicht verwendbar. Gibt es dazu irgendwelche Informationen?
Dank im Voraus
Antwort1
Für die 8086:7560-Entsperrung konnte ich das ThinkPad X1 Yoga Gen 7 mithilfe des hier befindlichen Skripts erfolgreich entsperren:https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/751.
Sie können das Skript unter speichern /etc/ModemManager/fcc-unlock.d/8086:7560
und sicherstellen, dass es ausführbar ist ( chmod +x
). Sie müssen außerdem den Shebang des Headers von python
in ändern python3
.
Insbesondere wenn Sie den Suspend-/Ruhezustand verwenden, sind einige Workarounds erforderlich, da das Modem selbst ziemlich empfindlich ist.
Ein großes Problem besteht darin, dass das Modem, sobald es über den PCI-Bus ausgeschaltet wurde, nicht mehr eingeschaltet werden kann und neu eingeschaltet werden muss. Dies betrifft das Modem selbst und den Bus, an den es angeschlossen ist.
Sie benötigen die folgende Udev-Regel:
/etc/udev/rules.d/99-modem-suspend.rules
# The modem fails to wake up ever again after suspend
SUBSYSTEM=="pci", ATTR{vendor}=="0x1cf8", ATTR{device}=="0x8653", ATTR{power/control}="on", GOTO="pci_pm_end"
SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{device}=="0x7560", ATTR{power/control}="on", GOTO="pci_pm_end"
SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{device}=="0x51b8", ATTR{power/control}="on", GOTO="pci_pm_end"
# Use normal sleeping otherwise
SUBSYSTEM=="pci", ATTR{power/control}="auto"
LABEL="pci_pm_end"
Dann benötigen Sie ein Skript, das beim Booten ausgeführt wird, um einige anfängliche Eigenschaften der Energiesparfunktion des Geräts festzulegen, sodass das Modem oder Linux das Gerät nicht in den Ruhezustand versetzt, sondern es immer mit Strom versorgt.
/opt/keep-modem-awake.sh
#!/bin/sh
# Enable wakeups
## Bus the modem is on
if grep 'pci:0000:00:1c.0' < /proc/acpi/wakeup | grep disabled
then
echo "Enabling wakeup for bus owning Modem..." > /dev/kmsg
echo RP01 > /proc/acpi/wakeup
fi
## Modem
if grep 'pci:0000:08:00.0' < /proc/acpi/wakeup | grep disabled
then
echo "Enabling wakeup for modem..." > /dev/kmsg
echo PXSX > /proc/acpi/wakeup
fi
# Disable d3cold for the modem
# It is behind the bridge: 00:1c.0 PCI bridge: Intel Corporation Device 51b8 (rev 01)
# https://patchwork.kernel.org/project/linux-pci/patch/[email protected]/
echo "Disabling modem d3cold..." > /dev/kmsg
## The actual modem
echo 0 > /sys/bus/pci/devices/0000:08:00.0/d3cold_allowed
## The owning buses
echo 0 > /sys/devices/pci0000:00/0000:00:1c.0/d3cold_allowed
echo 0 > /sys/bus/acpi/devices/PNP0A08:00/device:4f/physical_node/d3cold_allowed
echo 0 > /sys/bus/acpi/devices/PNP0A08:00/device:4f/device:50/physical_node/d3cold_allowed
# Use ACPI to reset the PCI and not just power off and power on the device
echo "Setting modem reset method to ACPI..." > /dev/kmsg
echo acpi > /sys/bus/pci/devices/0000:08:00.0/reset_method
HINWEIS: Ihr System kann unterschiedliche Gerätepfade haben. Beispielsweise lautet auf dem Lenovo ThinkPad Z16 Gen 1 das Modem 0000:05:00.0
, der zugehörige Bus ist 0000:00:01.3
und ACPI-Geräte PNP0A08:00/device:07/device:08
. Um die zu verwendenden IDs richtig zu identifizieren, können Sie Folgendes tun:
- Identifizieren Sie Ihr Modem mit
lspci
dem Befehl. Beispiel:
❯ lspci | grep Modem
05:00.0 Wireless controller [0d40]: Intel Corporation XMM7560 LTE Advanced Pro Modem (rev 01)
Dadurch erhalten wir einen Gerätepfad/sys/bus/pci/devices/0000:05:00.0
- Eigentümerbus identifizieren:
❯ ls -l /sys/bus/pci/devices/0000:05:00.0
lrwxrwxrwx. 1 root root 0 Apr 14 10:24 /sys/bus/pci/devices/0000:05:00.0 -> ../../../devices/pci0000:00/0000:00:01.3/0000:05:00.0
Gibt uns den eigenen Busweg/sys/bus/pci/devices/0000:00:01.3
- Identifizieren Sie ACPI-Eigentümerbusse:
❯ find /sys/bus/acpi/devices/PNP0A08:00/ -type l -exec ls -l {} + | grep '05:00.0'
lrwxrwxrwx. 1 root root 0 Apr 14 14:25 /sys/bus/acpi/devices/PNP0A08:00/device:07/device:08/physical_node -> ../../../../../pci0000:00/0000:00:01.3/0000:05:00.0
Gibt uns Wege /sys/bus/acpi/devices/PNP0A08:00/device:07
und/sys/bus/acpi/devices/PNP0A08:00/device:07/device:08
So führen Sie das Skript beim Booten aus:
/etc/systemd/system/keep-modem-awake.service
[Unit]
Description="Keep modem awake for suspend."
After=ModemManager.service NetworkManager.service
Wants=ModemManager.service NetworkManager.service
[Service]
ExecStart=/opt/keep-modem-awake.sh
[Install]
WantedBy=multi-user.target
Für spätere Skripte benötigen Sie ein Skript, das das Modem finden kann, da sich die Modem-ID jedes Mal ändert, wenn das System angehalten und fortgesetzt wird.
/opt/find-modem.sh
#!/bin/sh
# Make sure path is set
export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
for __i in $(seq 1 10)
do
__modem="$(/opt/find-modem-sub.sh | head -n 1)"
if [ -z "$__modem" ]
then
sleep 0.5
else
break
fi
done
if [ -z "$__modem" ]
then
exit 1
fi
echo "$__modem"
exit 0
/opt/find-modem-sub.sh
#!/bin/sh
# Make sure path is set
export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Read in commands
mmcli -L | grep '\/Modem\/' | while read __line
do
echo "$__line" | sed 's/^.*\/Modem\/\([0-9]\{1,\}\).*$/\1/'
exit 0
done
exit 1
Wenn Sie den Suspend- und Hibernate-Modus verwenden möchten, müssen Sie dafür entsprechende Skripte einrichten, sodass sie vor und nach diesem Vorgang ausgeführt werden:
/opt/suspend-modem.sh
#!/bin/sh
# Make sure path is correct
export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Get modem ID
__modem="$(/opt/find-modem.sh)"
if [ "$1" = "0" ]
then
echo "Telling NM to not use the modem..." > /dev/kmsg
nmcli c down NetworkName
# Make sure the connection is deactivated
echo "Waiting for NM to show disconnected..." > /dev/kmsg
while nmcli con show --active | grep NetworkName
do
sleep 0.5
done
# Deactivate the modem before suspend as the connection freezes and never comes back
echo "Disabling modem..." > /dev/kmsg
mmcli -m "$__modem" --disable
elif [ "$1" = "1" ]
then
echo "Disabling modem after resume..." > /dev/kmsg
mmcli -m "$__modem" --disable
echo "Entering low power mode after disable..." > /dev/kmsg
mmcli -m "$__modem" --set-power-state-low
echo "Performing enabling loops..." > /dev/kmsg
for __i in $(seq 1 5)
do
echo "Loop $__i..." > /dev/kmsg
echo "Turning on modem and enabling..." 1>&2
mmcli -m "$__modem" --set-power-state-on
if mmcli -m "$__modem" --enable
then
echo "Modem was enabled..." > /dev/kmsg
break
else
echo "Did not enable modem..." > /dev/kmsg
sleep 0.5
fi
done
echo "Telling NM to use the modem now..." > /dev/kmsg
nmcli c up NetworkName
fi
Dann entsprechend folgendes systemd, dieses hier zum Fortsetzen:
rfkill-modem-resume.service
[Unit]
Description=Enable modem after wake-up
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
Type=simple
ExecStart=/opt/suspend-modem.sh 1
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Und dieses hier zum Aussetzen:
rfkill-modem-suspend.service
[Unit]
Description=rfkill modem before sleep
Before=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
Type=simple
ExecStart=/opt/suspend-modem.sh 0
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Mit diesen und anderen Skripten ist es mir gelungen, das Modem nach mehreren Ruhe- und Standby-Modi am Leben zu halten.
Zusätzlich möchten Sie möglicherweise auch die NetworkManager-Verbindung so anpassen, dass die DNS- und Routenpriorität niedriger ist (höhere Werte) als bei Ihrer Hauptverbindung, sodass sie als Fallback verwendet wird.
Antwort2
Da ist auch einausstehende Zusammenführungsanforderungmit einem Bash-basierten Entsperrskript.
Ich machte einenmodifizierte Versiondavon, das auch AT+XDNS=0,1
Befehle sendet, da ohne diese die Verbindung ständig abbricht.