¿Dónde puedo encontrar el desbloqueo de Wwan FCC para 8086:7560?

¿Dónde puedo encontrar el desbloqueo de Wwan FCC para 8086:7560?

Lenovo envía sus computadoras portátiles P16 gen 2 (certificadas para Ubuntu Linux) con la siguiente tarjeta wwan: Intel MBIM [8086:7560]. El administrador del módem ve el módem wwan, pero no puede habilitarlo (mensaje de error: ** (modem-manager-gui:9178): ADVERTENCIA **: 10:33:30.084: Modem Manager >= 0.7.0: GDBus.Error:org .freedesktop.ModemManager1.Error.Core.Retry: Transición no válida

De acuerdo con las instrucciones de Lenovo (Guía del usuario de Linux ThinkPad P16 Gen 2: uno debe "Ir ahttps://support.lenovo.comy seleccione la entrada para su computadora. Descargue el paquete wwan-linux-fcc-unlock desde la página de soporte del producto. Asegúrese de consultar el archivo LÉAME para confirmar si se aplica alguna restricción para su geografía y para obtener instrucciones sobre cómo instalar la aplicación).

Sin embargo, lamentablemente no existe ningún archivo de este tipo disponible en los sitios de Lenovo. Y tampoco hay ningún comentario por parte de Lenovo sobre este hecho de no proporcionar el archivo de desbloqueo fcc.

Este enlace también parece estar vacío:https://www.lenovo.com/linux/wwan-enablement-on-Linux.pdf

A menos que alguien sepa dónde se puede encontrar el archivo fcc ulock para la tarjeta wwan mencionada anteriormente, el módem wwan de la serie P16 no se puede utilizar en ubuntu o linux. ¿Hay alguna información sobre esto por ahí?

gracias de antemano

Respuesta1

Para el desbloqueo 8086:7560, pude desbloquear con éxito el ThinkPad X1 Yoga Gen 7 usando el script que se encuentra aquí:https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/751.

Puede almacenar el script /etc/ModemManager/fcc-unlock.d/8086:7560y asegurarse de que sea ejecutable ( chmod +x). También necesitarás cambiar el shebang del encabezado de pythona python3.

Se necesitarán algunas soluciones, especialmente si utiliza suspender/hibernar, ya que el módem en sí es bastante complicado.

Un problema importante es que una vez que el módem esté apagado en el bus PCI, no podrá volver a encenderse y será necesario volver a encenderlo. Esto afecta al propio módem y al bus al que está conectado.

Necesitará la siguiente regla udev:

/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"

Luego necesitará un script que se ejecute en el arranque para configurar algunas propiedades iniciales del ahorro de energía del dispositivo para que el módem o Linux no suspenda el dispositivo sino que lo mantenga siempre encendido.

/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

NOTA: su sistema puede tener diferentes rutas de dispositivo. Por ejemplo, en Lenovo ThinkPad Z16 Gen 1 el módem es 0000:05:00.0, el bus propietario es 0000:00:01.3y los dispositivos ACPI PNP0A08:00/device:07/device:08. Para identificar correctamente qué ID utilizar, puede hacer lo siguiente:

  1. Identifique su módem con lspciel comando. Por ejemplo:
❯ lspci | grep Modem
05:00.0 Wireless controller [0d40]: Intel Corporation XMM7560 LTE Advanced Pro Modem (rev 01)

Esto nos da una ruta del dispositivo./sys/bus/pci/devices/0000:05:00.0

  1. Identificar el autobús propietario:
❯ 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

Nos da la ruta del autobús propio./sys/bus/pci/devices/0000:00:01.3

  1. Identifique los autobuses propietarios de ACPI:
❯ 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

Nos da caminos /sys/bus/acpi/devices/PNP0A08:00/device:07y/sys/bus/acpi/devices/PNP0A08:00/device:07/device:08

Luego, para ejecutar el script en el arranque:

/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

Para secuencias de comandos posteriores, necesitará una secuencia de comandos que pueda encontrar el módem porque cuando el sistema se suspende y se reanuda, la ID del módem cambiará cada vez.

/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

Luego, si planea usar suspender e hibernar, tendrá que configurar los scripts correspondientes para que se ejecuten antes y después de que eso ocurra:

/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

Luego, en consecuencia, el siguiente systemd, este para reanudar:

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

Y este para suspender:

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

Con estos scripts y otros, he tenido éxito en mantener activo el módem después de múltiples suspensiones e hibernaciones.

Como extra, es posible que también quieras ajustar la conexión de NetworkManager para que el DNS y la prioridad de ruta sean más bajos (valores más altos) que tu conexión principal para que se use como alternativa.

Respuesta2

También hay unasolicitud de fusión pendientecon un script de desbloqueo basado en bash.

Hice unaversión modificadade él que también envía AT+XDNS=0,1comandos porque sin él la conexión sigue cayendo.

información relacionada