wo finde ich die WWAN-FCC-Freischaltung für 8086:7560

wo finde ich die WWAN-FCC-Freischaltung für 8086:7560

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:7560und sicherstellen, dass es ausführbar ist ( chmod +x). Sie müssen außerdem den Shebang des Headers von pythonin ä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.3und ACPI-Geräte PNP0A08:00/device:07/device:08. Um die zu verwendenden IDs richtig zu identifizieren, können Sie Folgendes tun:

  1. Identifizieren Sie Ihr Modem mit lspcidem 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

  1. 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

  1. 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:07und/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,1Befehle sendet, da ohne diese die Verbindung ständig abbricht.

verwandte Informationen