onde posso encontrar o desbloqueio wwan fcc para 8086:7560

onde posso encontrar o desbloqueio wwan fcc para 8086:7560

A Lenovo envia seus laptops P16 gen 2 (certificados para Ubuntu Linux) com a seguinte placa wwan: Intel MBIM [8086:7560]. O gerenciador de modem vê o modem wwan, mas não consegue ativá-lo (mensagem de erro: ** (modem-manager-gui:9178): AVISO **: 10:33:30.084: Modem Manager >= 0.7.0: GDBus.Error:org .freedesktop.ModemManager1.Error.Core.Retry: Transição inválida

De acordo com as instruções da Lenovo (Guia do usuário do ThinkPad P16 Gen 2 Linux: deve-se "Ir parahttps://support.lenovo.come selecione a entrada para o seu computador. Baixe o pacote wwan-linux-fcc- unlock na página de suporte do produto. Certifique-se de verificar o README para confirmar se alguma restrição se aplica à sua região geográfica e para obter instruções sobre como instalar o aplicativo.)

No entanto, infelizmente não existe tal arquivo disponível nos sites da Lenovo. E também não há comentários da Lenovo sobre essa falha no fornecimento do arquivo de desbloqueio da FCC.

Este link também parece estar vazio:https://www.lenovo.com/linux/wwan-enablement-on-Linux.pdf

A menos que alguém saiba onde o arquivo fcc ulock para a placa wwan mencionada acima pode ser encontrado, o modem wwan da série P16 não pode ser usado no ubuntu ou no linux. Existe alguma informação sobre isso por aí?

desde já, obrigado

Responder1

Para o desbloqueio 8086:7560, consegui desbloquear com êxito no ThinkPad X1 Yoga Gen 7 usando o script localizado aqui:https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/751.

Você pode armazenar o script como /etc/ModemManager/fcc-unlock.d/8086:7560e certificar-se de que seja executável ( chmod +x). Você também precisará alterar o shebang do cabeçalho de pythonpara python3.

Serão necessárias algumas soluções alternativas, especialmente se você usar suspensão/hibernação, já que o modem em si é bastante meticuloso.

Um problema importante é que, uma vez desligado o modem do barramento PCI, ele não poderá ser ligado novamente, precisando ser ligado novamente. Isso afeta o próprio modem e o barramento ao qual ele está conectado.

Você precisará da seguinte regra do 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"

Então você precisará de um script que seja executado na inicialização para definir algumas propriedades iniciais de economia de energia do dispositivo para que o modem ou Linux não suspenda o dispositivo, mas o mantenha sempre ligado.

/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: seu sistema pode ter caminhos de dispositivos diferentes. Por exemplo, no Lenovo ThinkPad Z16 Gen 1 o modem é 0000:05:00.0, o barramento proprietário é 0000:00:01.3e os dispositivos ACPI PNP0A08:00/device:07/device:08. Para identificar corretamente quais IDs usar, você pode fazer o seguinte:

  1. Identifique seu modem com lspcicomando. Por exemplo:
❯ lspci | grep Modem
05:00.0 Wireless controller [0d40]: Intel Corporation XMM7560 LTE Advanced Pro Modem (rev 01)

Isso nos dá um caminho de dispositivo/sys/bus/pci/devices/0000:05:00.0

  1. Identifique o ônibus proprietário:
❯ 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 dá a propriedade do caminho do ônibus/sys/bus/pci/devices/0000:00:01.3

  1. Identifique os barramentos proprietários da 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 dá caminhos /sys/bus/acpi/devices/PNP0A08:00/device:07e/sys/bus/acpi/devices/PNP0A08:00/device:07/device:08

Então, para executar o script na inicialização:

/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 scripts posteriores, você precisará de um script que possa localizar o modem, pois quando o sistema for suspenso e reiniciado, o ID do modem mudará a 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

Então, se você planeja usar suspensão e hibernação, você terá que configurar scripts adequadamente para que eles sejam executados antes e depois que isso ocorrer:

/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

Então, respectivamente, o seguinte systemd, este para currículo:

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

E 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

Com esses scripts e outros, obtive sucesso em manter o modem ativo após várias suspensões e hibernações.

Como extra, você também pode querer ajustar a conexão do NetworkManager para que o DNS e a prioridade da rota sejam mais baixos (valores mais altos) do que a sua conexão principal, para que ela seja usada como substituto.

Responder2

Há também umsolicitação de mesclagem pendentecom um script de desbloqueio baseado em bash.

Eu fiz umversão modificadadele que também envia AT+XDNS=0,1comando porque sem ele a conexão fica caindo.

informação relacionada