8086:7560에 대한 wwan fcc 잠금 해제는 어디서 찾을 수 있나요?

8086:7560에 대한 wwan fcc 잠금 해제는 어디서 찾을 수 있나요?

Lenovo는 Intel MBIM [8086:7560] WWAN 카드와 함께 P16 gen 2 노트북(Ubuntu Linux 인증)을 제공합니다. 모뎀 관리자가 WWAN 모뎀을 볼 수 있지만 활성화할 수 없습니다(오류 메시지: ** (modem-manager-gui:9178): 경고 **: 10:33:30.084: 모뎀 관리자 >= 0.7.0: GDBus.Error:org .freedesktop.ModemManager1.Error.Core.Retry: 잘못된 전환

Lenovo 지침(ThinkPad P16 Gen 2 Linux 사용자 가이드: "이동https://support.lenovo.com컴퓨터에 대한 항목을 선택합니다. 제품 지원 페이지에서 wwan-linux-fcc-unlock 패키지를 다운로드하십시오. 해당 지역에 적용되는 제한 사항이 있는지 확인하고 애플리케이션 설치 방법에 대한 지침을 얻으려면 README를 확인하세요.)

그러나 안타깝게도 lenovo 사이트에는 해당 파일이 없습니다. 그리고 Lenovo에서는 fcc 잠금 해제 파일을 제공하지 못한 것에 대해 아무런 언급도 하지 않았습니다.

이 링크도 비어 있는 것 같습니다.https://www.lenovo.com/linux/wwan-enablement-on-Linux.pdf

위에서 언급한 wwan 카드의 fcc ulock 파일을 어디에서 찾을 수 있는지 아는 사람이 없다면 P16 시리즈의 wwan 모뎀은 우분투나 리눅스에서 사용할 수 없습니다. 주변에 이에 대한 정보가 있나요?

미리 감사드립니다

답변1

8086:7560 잠금 해제의 경우 여기에 있는 스크립트를 사용하여 ThinkPad X1 Yoga Gen 7에서 성공적으로 잠금을 해제할 수 있었습니다.https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/751.

스크립트를 다른 이름으로 저장 /etc/ModemManager/fcc-unlock.d/8086:7560하고 실행 가능한지 확인할 수 있습니다( chmod +x). 또한 헤더의 shebang을 에서 python로 변경해야 합니다 python3.

특히 일시 중지/최대 절전 모드를 사용하는 경우 모뎀 자체가 다소 까다롭기 때문에 몇 가지 해결 방법이 필요합니다.

한 가지 주요 문제는 PCI 버스에서 모뎀의 전원이 꺼지면 다시 전원을 켤 수 없으므로 다시 켜야 한다는 것입니다. 이는 모뎀 자체와 연결된 버스에 영향을 미칩니다.

다음 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"

그런 다음 모뎀이나 Linux가 장치를 일시 중지하지 않고 항상 전원을 유지하도록 장치 절전의 일부 초기 속성을 설정하기 위해 부팅 시 실행되는 스크립트가 필요합니다.

/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

참고: 시스템의 장치 경로가 다를 수 있습니다. 예를 들어, Lenovo ThinkPad Z16 Gen 1에서 모뎀은 이고 0000:05:00.0, 소유 버스는 0000:00:01.3ACPI 장치 입니다 PNP0A08:00/device:07/device:08. 사용할 ID를 올바르게 식별하려면 다음을 수행할 수 있습니다.

  1. 명령 으로 모뎀을 식별하십시오 lspci. 예를 들어:
❯ lspci | grep Modem
05:00.0 Wireless controller [0d40]: Intel Corporation XMM7560 LTE Advanced Pro Modem (rev 01)

이것은 우리에게 장치 경로를 제공합니다/sys/bus/pci/devices/0000:05:00.0

  1. 소유 버스 식별:
❯ 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

우리에게 버스 경로를 제공합니다./sys/bus/pci/devices/0000:00:01.3

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

/sys/bus/acpi/devices/PNP0A08:00/device:07우리에게 길 을 주고/sys/bus/acpi/devices/PNP0A08:00/device:07/device:08

그런 다음 부팅 시 스크립트를 실행하려면 다음을 수행하세요.

/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

이후 스크립트의 경우 시스템이 일시 중지되었다가 다시 시작될 때마다 모뎀 ID가 변경되므로 모뎀을 찾을 수 있는 스크립트가 필요합니다.

/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

그런 다음 일시 중지 및 최대 절전 모드를 사용하려는 경우 해당 작업이 발생하기 전후에 실행되도록 그에 따라 스크립트를 설정해야 합니다.

/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

그런 다음 그에 따라 다음 시스템이 재개됩니다.

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

그리고 이것은 정지를 위한 것입니다:

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

이 스크립트와 다른 스크립트를 사용하여 여러 번의 일시 중지 및 최대 절전 모드 후에도 모뎀을 활성 상태로 유지하는 데 성공했습니다.

추가로, DNS 및 경로 우선순위가 기본 연결보다 낮도록(높은 값) 대체용으로 사용되도록 NetworkManager 연결을 조정할 수도 있습니다.

답변2

또 한있다보류 중인 병합 요청bash 기반 잠금 해제 스크립트를 사용합니다.

나는 만들었습니다수정된 버전AT+XDNS=0,1명령이 없으면 연결이 계속 끊어지기 때문에 명령 도 보냅니다 .

관련 정보