
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:7560
y asegurarse de que sea ejecutable ( chmod +x
). También necesitarás cambiar el shebang del encabezado de python
a 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.3
y los dispositivos ACPI PNP0A08:00/device:07/device:08
. Para identificar correctamente qué ID utilizar, puede hacer lo siguiente:
- Identifique su módem con
lspci
el 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
- 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
- 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:07
y/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,1
comandos porque sin él la conexión sigue cayendo.