OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
Hi everyone,

After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.

ddb{2}> show panic
assertwaitok: non-zero mutex count: 1

ddb{2}> trace
db_enter() at db_enter+0x10
panic(ffffffff81c8ec25) at panic+0x128
assertwaitok() at assertwaitok+0xc7
mi_switch() at mi_switch+0x40
sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
_submit+0x13f
xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
cdce_stop(ffff800000119000) at cdce_stop+0x46
cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
cdce_start(ffff800000119048) at cdce_start+0x84
if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
end trace frame: 0x0, count: -16



PC Engines apu2
coreboot build 20202604
BIOS version v4.11.0.6
4080 MB ECC DRAM
SeaBIOS (version rel-1.12.1.3-0-g300e8b70)


root@master[~]usbdevs -v
Controller /dev/usb0:
addr 01: 1022:0000 AMD, xHCI root hub
         super speed, self powered, config 1, rev 1.00
         driver: uhub0
addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
         high speed, self powered, config 1, rev 1.02
         driver: cdce0
         driver: umass0
Controller /dev/usb1:
addr 01: 1022:0000 AMD, EHCI root hub
         high speed, self powered, config 1, rev 1.00
         driver: uhub1
addr 02: 0438:7900 Advanced Micro Devices, Hub
         high speed, self powered, config 1, rev 0.18
         driver: uhub2


root@master[~]usbdevs -vv
Controller /dev/usb0:
addr 01: 1022:0000 AMD, xHCI root hub
         super speed, self powered, config 1, rev 1.00
         driver: uhub0
         port 01: 0000.02a0 power Rx.detect
         port 02: 0000.02a0 power Rx.detect
         port 03: 0000.0503 connect enabled recovery
         port 04: 0000.02a0 power Rx.detect
addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
         high speed, self powered, config 1, rev 1.02
         driver: cdce0
         driver: umass0
Controller /dev/usb1:
addr 01: 1022:0000 AMD, EHCI root hub
         high speed, self powered, config 1, rev 1.00
         driver: uhub1
         port 01: 0000.0503 connect enabled power
         port 02: 0000.0500 power
addr 02: 0438:7900 Advanced Micro Devices, Hub
         high speed, self powered, config 1, rev 0.18
         driver: uhub2
         port 01: 0000.0100 power
         port 02: 0000.0100 power
         port 03: 0000.0100 power
         port 04: 0000.0100 power


root@master[~]ifconfig cdce0
cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr xx:xx:xx:xx:xx:xx
        index 6 priority 0 llprio 3
        inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255




root@master[~]dmesg
OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 4259880960 (4062MB)
avail mem = 4118163456 (3927MB)
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
bios0: PC Engines apu2
acpi0 at bios0: ACPI 6.0
acpi0: sleep states S0 S1 S4 S5
acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
acpitimer0 at acpi0: 3579545 Hz, 32 bits
acpimcfg0 at acpi0
acpimcfg0: addr 0xf8000000, bus 0-64
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
cpu0: apic clock running at 99MHz
cpu0: mwait min=64, max=64, IBE
cpu1 at mainbus0: apid 1 (application processor)
cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
cpu1: smt 0, core 1, package 0
cpu2 at mainbus0: apid 2 (application processor)
cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
cpu2: smt 0, core 2, package 0
cpu3 at mainbus0: apid 3 (application processor)
cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
cpu3: smt 0, core 3, package 0
ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
acpihpet0 at acpi0: 14318180 Hz
acpiprt0 at acpi0: bus 0 (PCI0)
acpiprt1 at acpi0: bus -1 (PBR4)
acpiprt2 at acpi0: bus 1 (PBR5)
acpiprt3 at acpi0: bus 2 (PBR6)
acpiprt4 at acpi0: bus 3 (PBR7)
acpiprt5 at acpi0: bus -1 (PBR8)
acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
acpitz0 at acpi0: critical temperature is 115 degC
acpibtn0 at acpi0: PWRB
acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
acpicmos0 at acpi0
amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
"PRP0001" at acpi0 not configured
"PRP0001" at acpi0 not configured
"PRP0001" at acpi0 not configured
"PRP0001" at acpi0 not configured
"PRP0001" at acpi0 not configured
"PRP0001" at acpi0 not configured
"BOOT0000" at acpi0 not configured
cpu0: 998 MHz: speeds: 1000 800 600 MHz
pci0 at mainbus0 bus 0
pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
pci1 at ppb0 bus 1
em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
pci2 at ppb1 bus 2
em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
pci3 at ppb2 bus 3
em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
usb0 at xhci0: USB revision 3.0
uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
ahci0: port 0: 6.0Gb/s
scsibus1 at ahci0: 32 targets
sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
usb1 at ehci0: USB revision 2.0
uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
iic0 at piixpm0
iic1 at piixpm0
iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
sdhc0: SDHC 2.0, 50 MHz base clock
sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
isa0 at pcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com0: console
com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
lpt0 at isa0 port 0x378/4 irq 7
intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
vmm0 at mainbus0: SVM/RVI
cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
cdce0: address xx:xx:xx:xx:xx:xx
umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
umass0: using SCSI over Bulk-Only
scsibus2 at umass0: 2 targets, initiator 0
sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
vscsi0 at root
scsibus3 at vscsi0: 256 targets
softraid0 at root
scsibus4 at softraid0: 256 targets
root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b
 
Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
30 min ago… :/


OpenBSD/amd64 (master.bsdxxx.xx) (tty00)

login: panic: assertwaitok: non-zero mutex count: 1
Stopped at      db_enter+0x10:  popq    %rbp
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
db_enter() at db_enter+0x10
panic(ffffffff81c882c4) at panic+0x128
assertwaitok() at assertwaitok+0xc7
mi_switch() at mi_switch+0x40
sleep_finish(ffff8000225b8538,1) at sleep_finish+0x84
sleep_finish_all(ffff8000225b8538,1) at sleep_finish_all+0x21
tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
xhci_command_submit(ffff80000009c000,ffff8000225b8628,1dcd6500) at xhci_command
_submit+0x13f
xhci_abort_xfer(fffffd812e90c780,6) at xhci_abort_xfer+0x13a
usbd_abort_pipe(ffff80000047b000) at usbd_abort_pipe+0x3d
cdce_stop(ffff80000012d000) at cdce_stop+0x46
cdce_encap(ffff80000012d000,fffffd80c0731d00,0) at cdce_encap+0xf7
cdce_start(ffff80000012d048) at cdce_start+0x84
if_qstart_compat(ffff80000012d2c0) at if_qstart_compat+0x2e
end trace frame: 0xffff8000225b8840, count: 0
https://www.openbsd.org/ddb.html describes the minimum info required in bug
reports.  Insufficient info makes it difficult to find and fix bugs.
ddb{2}>

> On 22 May 2020, at 15:58, Łukasz Lejtkowski <[hidden email]> wrote:
>
> Hi everyone,
>
> After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.
>
> ddb{2}> show panic
> assertwaitok: non-zero mutex count: 1
>
> ddb{2}> trace
> db_enter() at db_enter+0x10
> panic(ffffffff81c8ec25) at panic+0x128
> assertwaitok() at assertwaitok+0xc7
> mi_switch() at mi_switch+0x40
> sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
> sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
> tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
> xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
> _submit+0x13f
> xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
> usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
> cdce_stop(ffff800000119000) at cdce_stop+0x46
> cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
> cdce_start(ffff800000119048) at cdce_start+0x84
> if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
> ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
> taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
> end trace frame: 0x0, count: -16
>
>
>
> PC Engines apu2
> coreboot build 20202604
> BIOS version v4.11.0.6
> 4080 MB ECC DRAM
> SeaBIOS (version rel-1.12.1.3-0-g300e8b70)
>
>
> root@master[~]usbdevs -v
> Controller /dev/usb0:
> addr 01: 1022:0000 AMD, xHCI root hub
> super speed, self powered, config 1, rev 1.00
> driver: uhub0
> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
> high speed, self powered, config 1, rev 1.02
> driver: cdce0
> driver: umass0
> Controller /dev/usb1:
> addr 01: 1022:0000 AMD, EHCI root hub
> high speed, self powered, config 1, rev 1.00
> driver: uhub1
> addr 02: 0438:7900 Advanced Micro Devices, Hub
> high speed, self powered, config 1, rev 0.18
> driver: uhub2
>
>
> root@master[~]usbdevs -vv
> Controller /dev/usb0:
> addr 01: 1022:0000 AMD, xHCI root hub
> super speed, self powered, config 1, rev 1.00
> driver: uhub0
> port 01: 0000.02a0 power Rx.detect
> port 02: 0000.02a0 power Rx.detect
> port 03: 0000.0503 connect enabled recovery
> port 04: 0000.02a0 power Rx.detect
> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
> high speed, self powered, config 1, rev 1.02
> driver: cdce0
> driver: umass0
> Controller /dev/usb1:
> addr 01: 1022:0000 AMD, EHCI root hub
> high speed, self powered, config 1, rev 1.00
> driver: uhub1
> port 01: 0000.0503 connect enabled power
> port 02: 0000.0500 power
> addr 02: 0438:7900 Advanced Micro Devices, Hub
> high speed, self powered, config 1, rev 0.18
> driver: uhub2
> port 01: 0000.0100 power
> port 02: 0000.0100 power
> port 03: 0000.0100 power
> port 04: 0000.0100 power
>
>
> root@master[~]ifconfig cdce0
> cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> lladdr xx:xx:xx:xx:xx:xx
> index 6 priority 0 llprio 3
> inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255
>
>
>
>
> root@master[~]dmesg
> OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
>    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> real mem = 4259880960 (4062MB)
> avail mem = 4118163456 (3927MB)
> mpath0 at root
> scsibus0 at mpath0: 256 targets
> mainbus0 at root
> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
> bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
> bios0: PC Engines apu2
> acpi0 at bios0: ACPI 6.0
> acpi0: sleep states S0 S1 S4 S5
> acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
> acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
> acpitimer0 at acpi0: 3579545 Hz, 32 bits
> acpimcfg0 at acpi0
> acpimcfg0: addr 0xf8000000, bus 0-64
> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> cpu0: smt 0, core 0, package 0
> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> cpu0: apic clock running at 99MHz
> cpu0: mwait min=64, max=64, IBE
> cpu1 at mainbus0: apid 1 (application processor)
> cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> cpu1: smt 0, core 1, package 0
> cpu2 at mainbus0: apid 2 (application processor)
> cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> cpu2: smt 0, core 2, package 0
> cpu3 at mainbus0: apid 3 (application processor)
> cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> cpu3: smt 0, core 3, package 0
> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
> ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
> acpihpet0 at acpi0: 14318180 Hz
> acpiprt0 at acpi0: bus 0 (PCI0)
> acpiprt1 at acpi0: bus -1 (PBR4)
> acpiprt2 at acpi0: bus 1 (PBR5)
> acpiprt3 at acpi0: bus 2 (PBR6)
> acpiprt4 at acpi0: bus 3 (PBR7)
> acpiprt5 at acpi0: bus -1 (PBR8)
> acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> acpitz0 at acpi0: critical temperature is 115 degC
> acpibtn0 at acpi0: PWRB
> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> acpicmos0 at acpi0
> amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
> "PRP0001" at acpi0 not configured
> "PRP0001" at acpi0 not configured
> "PRP0001" at acpi0 not configured
> "PRP0001" at acpi0 not configured
> "PRP0001" at acpi0 not configured
> "PRP0001" at acpi0 not configured
> "BOOT0000" at acpi0 not configured
> cpu0: 998 MHz: speeds: 1000 800 600 MHz
> pci0 at mainbus0 bus 0
> pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
> vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
> pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
> ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
> pci1 at ppb0 bus 1
> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
> pci2 at ppb1 bus 2
> em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
> pci3 at ppb2 bus 3
> em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
> xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
> usb0 at xhci0: USB revision 3.0
> uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
> ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
> ahci0: port 0: 6.0Gb/s
> scsibus1 at ahci0: 32 targets
> sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
> sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
> ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
> usb1 at ehci0: USB revision 2.0
> uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
> piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
> iic0 at piixpm0
> iic1 at piixpm0
> iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
> pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
> sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
> sdhc0: SDHC 2.0, 50 MHz base clock
> sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
> pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
> pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
> pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
> km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
> pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
> pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
> isa0 at pcib0
> isadma0 at isa0
> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> com0: console
> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
> pcppi0 at isa0 port 0x61
> spkr0 at pcppi0
> lpt0 at isa0 port 0x378/4 irq 7
> intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
> wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
> vmm0 at mainbus0: SVM/RVI
> cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
> cdce0: address xx:xx:xx:xx:xx:xx
> umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
> umass0: using SCSI over Bulk-Only
> scsibus2 at umass0: 2 targets, initiator 0
> sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
> uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
> vscsi0 at root
> scsibus3 at vscsi0: 256 targets
> softraid0 at root
> scsibus4 at softraid0: 256 targets
> root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) - too high. Should be 12,25-12,50 V. I replaced to the new one.

> On 22 May 2020, at 20:05, Łukasz Lejtkowski <[hidden email]> wrote:
>
> 30 min ago… :/
>
>
> OpenBSD/amd64 (master.bsdxxx.xx) (tty00)
>
> login: panic: assertwaitok: non-zero mutex count: 1
> Stopped at      db_enter+0x10:  popq    %rbp
>    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
> db_enter() at db_enter+0x10
> panic(ffffffff81c882c4) at panic+0x128
> assertwaitok() at assertwaitok+0xc7
> mi_switch() at mi_switch+0x40
> sleep_finish(ffff8000225b8538,1) at sleep_finish+0x84
> sleep_finish_all(ffff8000225b8538,1) at sleep_finish_all+0x21
> tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
> xhci_command_submit(ffff80000009c000,ffff8000225b8628,1dcd6500) at xhci_command
> _submit+0x13f
> xhci_abort_xfer(fffffd812e90c780,6) at xhci_abort_xfer+0x13a
> usbd_abort_pipe(ffff80000047b000) at usbd_abort_pipe+0x3d
> cdce_stop(ffff80000012d000) at cdce_stop+0x46
> cdce_encap(ffff80000012d000,fffffd80c0731d00,0) at cdce_encap+0xf7
> cdce_start(ffff80000012d048) at cdce_start+0x84
> if_qstart_compat(ffff80000012d2c0) at if_qstart_compat+0x2e
> end trace frame: 0xffff8000225b8840, count: 0
> https://www.openbsd.org/ddb.html describes the minimum info required in bug
> reports.  Insufficient info makes it difficult to find and fix bugs.
> ddb{2}>
>
>> On 22 May 2020, at 15:58, Łukasz Lejtkowski <[hidden email]> wrote:
>>
>> Hi everyone,
>>
>> After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.
>>
>> ddb{2}> show panic
>> assertwaitok: non-zero mutex count: 1
>>
>> ddb{2}> trace
>> db_enter() at db_enter+0x10
>> panic(ffffffff81c8ec25) at panic+0x128
>> assertwaitok() at assertwaitok+0xc7
>> mi_switch() at mi_switch+0x40
>> sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
>> sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
>> tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
>> xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
>> _submit+0x13f
>> xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
>> usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
>> cdce_stop(ffff800000119000) at cdce_stop+0x46
>> cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
>> cdce_start(ffff800000119048) at cdce_start+0x84
>> if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
>> ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
>> taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
>> end trace frame: 0x0, count: -16
>>
>>
>>
>> PC Engines apu2
>> coreboot build 20202604
>> BIOS version v4.11.0.6
>> 4080 MB ECC DRAM
>> SeaBIOS (version rel-1.12.1.3-0-g300e8b70)
>>
>>
>> root@master[~]usbdevs -v
>> Controller /dev/usb0:
>> addr 01: 1022:0000 AMD, xHCI root hub
>> super speed, self powered, config 1, rev 1.00
>> driver: uhub0
>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>> high speed, self powered, config 1, rev 1.02
>> driver: cdce0
>> driver: umass0
>> Controller /dev/usb1:
>> addr 01: 1022:0000 AMD, EHCI root hub
>> high speed, self powered, config 1, rev 1.00
>> driver: uhub1
>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>> high speed, self powered, config 1, rev 0.18
>> driver: uhub2
>>
>>
>> root@master[~]usbdevs -vv
>> Controller /dev/usb0:
>> addr 01: 1022:0000 AMD, xHCI root hub
>> super speed, self powered, config 1, rev 1.00
>> driver: uhub0
>> port 01: 0000.02a0 power Rx.detect
>> port 02: 0000.02a0 power Rx.detect
>> port 03: 0000.0503 connect enabled recovery
>> port 04: 0000.02a0 power Rx.detect
>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>> high speed, self powered, config 1, rev 1.02
>> driver: cdce0
>> driver: umass0
>> Controller /dev/usb1:
>> addr 01: 1022:0000 AMD, EHCI root hub
>> high speed, self powered, config 1, rev 1.00
>> driver: uhub1
>> port 01: 0000.0503 connect enabled power
>> port 02: 0000.0500 power
>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>> high speed, self powered, config 1, rev 0.18
>> driver: uhub2
>> port 01: 0000.0100 power
>> port 02: 0000.0100 power
>> port 03: 0000.0100 power
>> port 04: 0000.0100 power
>>
>>
>> root@master[~]ifconfig cdce0
>> cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>> lladdr xx:xx:xx:xx:xx:xx
>> index 6 priority 0 llprio 3
>> inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255
>>
>>
>>
>>
>> root@master[~]dmesg
>> OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
>>   [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>> real mem = 4259880960 (4062MB)
>> avail mem = 4118163456 (3927MB)
>> mpath0 at root
>> scsibus0 at mpath0: 256 targets
>> mainbus0 at root
>> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
>> bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
>> bios0: PC Engines apu2
>> acpi0 at bios0: ACPI 6.0
>> acpi0: sleep states S0 S1 S4 S5
>> acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
>> acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
>> acpitimer0 at acpi0: 3579545 Hz, 32 bits
>> acpimcfg0 at acpi0
>> acpimcfg0: addr 0xf8000000, bus 0-64
>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
>> cpu0 at mainbus0: apid 0 (boot processor)
>> cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
>> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>> cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>> cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>> cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>> cpu0: smt 0, core 0, package 0
>> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
>> cpu0: apic clock running at 99MHz
>> cpu0: mwait min=64, max=64, IBE
>> cpu1 at mainbus0: apid 1 (application processor)
>> cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
>> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>> cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>> cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>> cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>> cpu1: smt 0, core 1, package 0
>> cpu2 at mainbus0: apid 2 (application processor)
>> cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>> cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>> cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>> cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>> cpu2: smt 0, core 2, package 0
>> cpu3 at mainbus0: apid 3 (application processor)
>> cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>> cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>> cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>> cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>> cpu3: smt 0, core 3, package 0
>> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
>> ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
>> acpihpet0 at acpi0: 14318180 Hz
>> acpiprt0 at acpi0: bus 0 (PCI0)
>> acpiprt1 at acpi0: bus -1 (PBR4)
>> acpiprt2 at acpi0: bus 1 (PBR5)
>> acpiprt3 at acpi0: bus 2 (PBR6)
>> acpiprt4 at acpi0: bus 3 (PBR7)
>> acpiprt5 at acpi0: bus -1 (PBR8)
>> acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>> acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>> acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>> acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>> acpitz0 at acpi0: critical temperature is 115 degC
>> acpibtn0 at acpi0: PWRB
>> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
>> acpicmos0 at acpi0
>> amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
>> "PRP0001" at acpi0 not configured
>> "PRP0001" at acpi0 not configured
>> "PRP0001" at acpi0 not configured
>> "PRP0001" at acpi0 not configured
>> "PRP0001" at acpi0 not configured
>> "PRP0001" at acpi0 not configured
>> "BOOT0000" at acpi0 not configured
>> cpu0: 998 MHz: speeds: 1000 800 600 MHz
>> pci0 at mainbus0 bus 0
>> pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
>> vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
>> pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
>> ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
>> pci1 at ppb0 bus 1
>> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>> ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
>> pci2 at ppb1 bus 2
>> em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>> ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
>> pci3 at ppb2 bus 3
>> em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>> ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
>> xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
>> usb0 at xhci0: USB revision 3.0
>> uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
>> ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
>> ahci0: port 0: 6.0Gb/s
>> scsibus1 at ahci0: 32 targets
>> sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
>> sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
>> ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
>> usb1 at ehci0: USB revision 2.0
>> uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
>> piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
>> iic0 at piixpm0
>> iic1 at piixpm0
>> iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
>> pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
>> sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
>> sdhc0: SDHC 2.0, 50 MHz base clock
>> sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
>> pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
>> pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
>> pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
>> km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
>> pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
>> pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
>> isa0 at pcib0
>> isadma0 at isa0
>> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
>> com0: console
>> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
>> com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
>> pcppi0 at isa0 port 0x61
>> spkr0 at pcppi0
>> lpt0 at isa0 port 0x378/4 irq 7
>> intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
>> wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
>> vmm0 at mainbus0: SVM/RVI
>> cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>> cdce0: address xx:xx:xx:xx:xx:xx
>> umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>> umass0: using SCSI over Bulk-Only
>> scsibus2 at umass0: 2 targets, initiator 0
>> sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
>> uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
>> vscsi0 at root
>> scsibus3 at vscsi0: 256 targets
>> softraid0 at root
>> scsibus4 at softraid0: 256 targets
>> root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Mark Kettenis
> From: Łukasz Lejtkowski <[hidden email]>
> Date: Fri, 22 May 2020 20:51:57 +0200
>
> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
> too high. Should be 12,25-12,50 V. I replaced to the new one.

That might be why the device stops responding.  The fact that cleaning
up from a failed USB transaction leads to this panic is a bug though.

And somebody just posted a very similar panic with ure(4).  Something
in the network stack is holding a mutex when it shouldn't.

> > On 22 May 2020, at 20:05, Łukasz Lejtkowski <[hidden email]> wrote:
> >
> > 30 min ago… :/
> >
> >
> > OpenBSD/amd64 (master.bsdxxx.xx) (tty00)
> >
> > login: panic: assertwaitok: non-zero mutex count: 1
> > Stopped at      db_enter+0x10:  popq    %rbp
> >    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
> > db_enter() at db_enter+0x10
> > panic(ffffffff81c882c4) at panic+0x128
> > assertwaitok() at assertwaitok+0xc7
> > mi_switch() at mi_switch+0x40
> > sleep_finish(ffff8000225b8538,1) at sleep_finish+0x84
> > sleep_finish_all(ffff8000225b8538,1) at sleep_finish_all+0x21
> > tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
> > xhci_command_submit(ffff80000009c000,ffff8000225b8628,1dcd6500) at xhci_command
> > _submit+0x13f
> > xhci_abort_xfer(fffffd812e90c780,6) at xhci_abort_xfer+0x13a
> > usbd_abort_pipe(ffff80000047b000) at usbd_abort_pipe+0x3d
> > cdce_stop(ffff80000012d000) at cdce_stop+0x46
> > cdce_encap(ffff80000012d000,fffffd80c0731d00,0) at cdce_encap+0xf7
> > cdce_start(ffff80000012d048) at cdce_start+0x84
> > if_qstart_compat(ffff80000012d2c0) at if_qstart_compat+0x2e
> > end trace frame: 0xffff8000225b8840, count: 0
> > https://www.openbsd.org/ddb.html describes the minimum info required in bug
> > reports.  Insufficient info makes it difficult to find and fix bugs.
> > ddb{2}>
> >
> >> On 22 May 2020, at 15:58, Łukasz Lejtkowski <[hidden email]> wrote:
> >>
> >> Hi everyone,
> >>
> >> After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.
> >>
> >> ddb{2}> show panic
> >> assertwaitok: non-zero mutex count: 1
> >>
> >> ddb{2}> trace
> >> db_enter() at db_enter+0x10
> >> panic(ffffffff81c8ec25) at panic+0x128
> >> assertwaitok() at assertwaitok+0xc7
> >> mi_switch() at mi_switch+0x40
> >> sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
> >> sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
> >> tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
> >> xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
> >> _submit+0x13f
> >> xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
> >> usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
> >> cdce_stop(ffff800000119000) at cdce_stop+0x46
> >> cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
> >> cdce_start(ffff800000119048) at cdce_start+0x84
> >> if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
> >> ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
> >> taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
> >> end trace frame: 0x0, count: -16
> >>
> >>
> >>
> >> PC Engines apu2
> >> coreboot build 20202604
> >> BIOS version v4.11.0.6
> >> 4080 MB ECC DRAM
> >> SeaBIOS (version rel-1.12.1.3-0-g300e8b70)
> >>
> >>
> >> root@master[~]usbdevs -v
> >> Controller /dev/usb0:
> >> addr 01: 1022:0000 AMD, xHCI root hub
> >> super speed, self powered, config 1, rev 1.00
> >> driver: uhub0
> >> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
> >> high speed, self powered, config 1, rev 1.02
> >> driver: cdce0
> >> driver: umass0
> >> Controller /dev/usb1:
> >> addr 01: 1022:0000 AMD, EHCI root hub
> >> high speed, self powered, config 1, rev 1.00
> >> driver: uhub1
> >> addr 02: 0438:7900 Advanced Micro Devices, Hub
> >> high speed, self powered, config 1, rev 0.18
> >> driver: uhub2
> >>
> >>
> >> root@master[~]usbdevs -vv
> >> Controller /dev/usb0:
> >> addr 01: 1022:0000 AMD, xHCI root hub
> >> super speed, self powered, config 1, rev 1.00
> >> driver: uhub0
> >> port 01: 0000.02a0 power Rx.detect
> >> port 02: 0000.02a0 power Rx.detect
> >> port 03: 0000.0503 connect enabled recovery
> >> port 04: 0000.02a0 power Rx.detect
> >> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
> >> high speed, self powered, config 1, rev 1.02
> >> driver: cdce0
> >> driver: umass0
> >> Controller /dev/usb1:
> >> addr 01: 1022:0000 AMD, EHCI root hub
> >> high speed, self powered, config 1, rev 1.00
> >> driver: uhub1
> >> port 01: 0000.0503 connect enabled power
> >> port 02: 0000.0500 power
> >> addr 02: 0438:7900 Advanced Micro Devices, Hub
> >> high speed, self powered, config 1, rev 0.18
> >> driver: uhub2
> >> port 01: 0000.0100 power
> >> port 02: 0000.0100 power
> >> port 03: 0000.0100 power
> >> port 04: 0000.0100 power
> >>
> >>
> >> root@master[~]ifconfig cdce0
> >> cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> >> lladdr xx:xx:xx:xx:xx:xx
> >> index 6 priority 0 llprio 3
> >> inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255
> >>
> >>
> >>
> >>
> >> root@master[~]dmesg
> >> OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
> >>   [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> >> real mem = 4259880960 (4062MB)
> >> avail mem = 4118163456 (3927MB)
> >> mpath0 at root
> >> scsibus0 at mpath0: 256 targets
> >> mainbus0 at root
> >> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
> >> bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
> >> bios0: PC Engines apu2
> >> acpi0 at bios0: ACPI 6.0
> >> acpi0: sleep states S0 S1 S4 S5
> >> acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
> >> acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
> >> acpitimer0 at acpi0: 3579545 Hz, 32 bits
> >> acpimcfg0 at acpi0
> >> acpimcfg0: addr 0xf8000000, bus 0-64
> >> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> >> cpu0 at mainbus0: apid 0 (boot processor)
> >> cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
> >> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> >> cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> >> cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu0: smt 0, core 0, package 0
> >> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> >> cpu0: apic clock running at 99MHz
> >> cpu0: mwait min=64, max=64, IBE
> >> cpu1 at mainbus0: apid 1 (application processor)
> >> cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
> >> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> >> cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> >> cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu1: smt 0, core 1, package 0
> >> cpu2 at mainbus0: apid 2 (application processor)
> >> cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
> >> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> >> cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> >> cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu2: smt 0, core 2, package 0
> >> cpu3 at mainbus0: apid 3 (application processor)
> >> cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
> >> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
> >> cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
> >> cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
> >> cpu3: smt 0, core 3, package 0
> >> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
> >> ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
> >> acpihpet0 at acpi0: 14318180 Hz
> >> acpiprt0 at acpi0: bus 0 (PCI0)
> >> acpiprt1 at acpi0: bus -1 (PBR4)
> >> acpiprt2 at acpi0: bus 1 (PBR5)
> >> acpiprt3 at acpi0: bus 2 (PBR6)
> >> acpiprt4 at acpi0: bus 3 (PBR7)
> >> acpiprt5 at acpi0: bus -1 (PBR8)
> >> acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> >> acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> >> acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> >> acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
> >> acpitz0 at acpi0: critical temperature is 115 degC
> >> acpibtn0 at acpi0: PWRB
> >> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> >> acpicmos0 at acpi0
> >> amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
> >> "PRP0001" at acpi0 not configured
> >> "PRP0001" at acpi0 not configured
> >> "PRP0001" at acpi0 not configured
> >> "PRP0001" at acpi0 not configured
> >> "PRP0001" at acpi0 not configured
> >> "PRP0001" at acpi0 not configured
> >> "BOOT0000" at acpi0 not configured
> >> cpu0: 998 MHz: speeds: 1000 800 600 MHz
> >> pci0 at mainbus0 bus 0
> >> pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
> >> vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
> >> pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
> >> ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
> >> pci1 at ppb0 bus 1
> >> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> >> ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
> >> pci2 at ppb1 bus 2
> >> em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> >> ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
> >> pci3 at ppb2 bus 3
> >> em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
> >> ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
> >> xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
> >> usb0 at xhci0: USB revision 3.0
> >> uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
> >> ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
> >> ahci0: port 0: 6.0Gb/s
> >> scsibus1 at ahci0: 32 targets
> >> sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
> >> sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
> >> ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
> >> usb1 at ehci0: USB revision 2.0
> >> uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
> >> piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
> >> iic0 at piixpm0
> >> iic1 at piixpm0
> >> iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
> >> pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
> >> sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
> >> sdhc0: SDHC 2.0, 50 MHz base clock
> >> sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
> >> pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
> >> pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
> >> pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
> >> km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
> >> pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
> >> pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
> >> isa0 at pcib0
> >> isadma0 at isa0
> >> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> >> com0: console
> >> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> >> com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
> >> pcppi0 at isa0 port 0x61
> >> spkr0 at pcppi0
> >> lpt0 at isa0 port 0x378/4 irq 7
> >> intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
> >> wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
> >> vmm0 at mainbus0: SVM/RVI
> >> cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
> >> cdce0: address xx:xx:xx:xx:xx:xx
> >> umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
> >> umass0: using SCSI over Bulk-Only
> >> scsibus2 at umass0: 2 targets, initiator 0
> >> sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
> >> uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
> >> vscsi0 at root
> >> scsibus3 at vscsi0: 256 targets
> >> softraid0 at root
> >> scsibus4 at softraid0: 256 targets
> >> root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b
> >
>
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
5h later…

login: panic: assertwaitok: non-zero mutex count: 1
Stopped at      db_enter+0x10:  popq    %rbp
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
db_enter() at db_enter+0x10
panic(ffffffff81c882c4) at panic+0x128
assertwaitok() at assertwaitok+0xc7
mi_switch() at mi_switch+0x40
sleep_finish(ffff8000225b8208,1) at sleep_finish+0x84
sleep_finish_all(ffff8000225b8208,1) at sleep_finish_all+0x21
tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
xhci_command_submit(ffff80000009c000,ffff8000225b82f8,1dcd6500) at xhci_command
_submit+0x13f
xhci_abort_xfer(fffffd812e90c3c0,6) at xhci_abort_xfer+0x13a
usbd_abort_pipe(ffff800000bbe000) at usbd_abort_pipe+0x3d
cdce_stop(ffff800000bba800) at cdce_stop+0x46
cdce_encap(ffff800000bba800,fffffd80cf78c700,0) at cdce_encap+0xf7
cdce_start(ffff800000bba848) at cdce_start+0x84
if_qstart_compat(ffff800000bbaac0) at if_qstart_compat+0x2e
end trace frame: 0xffff8000225b8510, count: 0
https://www.openbsd.org/ddb.html describes the minimum info required in bug
reports.  Insufficient info makes it difficult to find and fix bugs.

> On 22 May 2020, at 21:05, Mark Kettenis <[hidden email]> wrote:
>
>> From: Łukasz Lejtkowski <[hidden email]>
>> Date: Fri, 22 May 2020 20:51:57 +0200
>>
>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>
> That might be why the device stops responding.  The fact that cleaning
> up from a failed USB transaction leads to this panic is a bug though.
>
> And somebody just posted a very similar panic with ure(4).  Something
> in the network stack is holding a mutex when it shouldn't.
>
>>> On 22 May 2020, at 20:05, Łukasz Lejtkowski <[hidden email]> wrote:
>>>
>>> 30 min ago… :/
>>>
>>>
>>> OpenBSD/amd64 (master.bsdxxx.xx) (tty00)
>>>
>>> login: panic: assertwaitok: non-zero mutex count: 1
>>> Stopped at      db_enter+0x10:  popq    %rbp
>>>   TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
>>> db_enter() at db_enter+0x10
>>> panic(ffffffff81c882c4) at panic+0x128
>>> assertwaitok() at assertwaitok+0xc7
>>> mi_switch() at mi_switch+0x40
>>> sleep_finish(ffff8000225b8538,1) at sleep_finish+0x84
>>> sleep_finish_all(ffff8000225b8538,1) at sleep_finish_all+0x21
>>> tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
>>> xhci_command_submit(ffff80000009c000,ffff8000225b8628,1dcd6500) at xhci_command
>>> _submit+0x13f
>>> xhci_abort_xfer(fffffd812e90c780,6) at xhci_abort_xfer+0x13a
>>> usbd_abort_pipe(ffff80000047b000) at usbd_abort_pipe+0x3d
>>> cdce_stop(ffff80000012d000) at cdce_stop+0x46
>>> cdce_encap(ffff80000012d000,fffffd80c0731d00,0) at cdce_encap+0xf7
>>> cdce_start(ffff80000012d048) at cdce_start+0x84
>>> if_qstart_compat(ffff80000012d2c0) at if_qstart_compat+0x2e
>>> end trace frame: 0xffff8000225b8840, count: 0
>>> https://www.openbsd.org/ddb.html describes the minimum info required in bug
>>> reports.  Insufficient info makes it difficult to find and fix bugs.
>>> ddb{2}>
>>>
>>>> On 22 May 2020, at 15:58, Łukasz Lejtkowski <[hidden email]> wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.
>>>>
>>>> ddb{2}> show panic
>>>> assertwaitok: non-zero mutex count: 1
>>>>
>>>> ddb{2}> trace
>>>> db_enter() at db_enter+0x10
>>>> panic(ffffffff81c8ec25) at panic+0x128
>>>> assertwaitok() at assertwaitok+0xc7
>>>> mi_switch() at mi_switch+0x40
>>>> sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
>>>> sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
>>>> tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
>>>> xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
>>>> _submit+0x13f
>>>> xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
>>>> usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
>>>> cdce_stop(ffff800000119000) at cdce_stop+0x46
>>>> cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
>>>> cdce_start(ffff800000119048) at cdce_start+0x84
>>>> if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
>>>> ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
>>>> taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
>>>> end trace frame: 0x0, count: -16
>>>>
>>>>
>>>>
>>>> PC Engines apu2
>>>> coreboot build 20202604
>>>> BIOS version v4.11.0.6
>>>> 4080 MB ECC DRAM
>>>> SeaBIOS (version rel-1.12.1.3-0-g300e8b70)
>>>>
>>>>
>>>> root@master[~]usbdevs -v
>>>> Controller /dev/usb0:
>>>> addr 01: 1022:0000 AMD, xHCI root hub
>>>> super speed, self powered, config 1, rev 1.00
>>>> driver: uhub0
>>>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>>>> high speed, self powered, config 1, rev 1.02
>>>> driver: cdce0
>>>> driver: umass0
>>>> Controller /dev/usb1:
>>>> addr 01: 1022:0000 AMD, EHCI root hub
>>>> high speed, self powered, config 1, rev 1.00
>>>> driver: uhub1
>>>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>>>> high speed, self powered, config 1, rev 0.18
>>>> driver: uhub2
>>>>
>>>>
>>>> root@master[~]usbdevs -vv
>>>> Controller /dev/usb0:
>>>> addr 01: 1022:0000 AMD, xHCI root hub
>>>> super speed, self powered, config 1, rev 1.00
>>>> driver: uhub0
>>>> port 01: 0000.02a0 power Rx.detect
>>>> port 02: 0000.02a0 power Rx.detect
>>>> port 03: 0000.0503 connect enabled recovery
>>>> port 04: 0000.02a0 power Rx.detect
>>>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>>>> high speed, self powered, config 1, rev 1.02
>>>> driver: cdce0
>>>> driver: umass0
>>>> Controller /dev/usb1:
>>>> addr 01: 1022:0000 AMD, EHCI root hub
>>>> high speed, self powered, config 1, rev 1.00
>>>> driver: uhub1
>>>> port 01: 0000.0503 connect enabled power
>>>> port 02: 0000.0500 power
>>>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>>>> high speed, self powered, config 1, rev 0.18
>>>> driver: uhub2
>>>> port 01: 0000.0100 power
>>>> port 02: 0000.0100 power
>>>> port 03: 0000.0100 power
>>>> port 04: 0000.0100 power
>>>>
>>>>
>>>> root@master[~]ifconfig cdce0
>>>> cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>>>> lladdr xx:xx:xx:xx:xx:xx
>>>> index 6 priority 0 llprio 3
>>>> inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255
>>>>
>>>>
>>>>
>>>>
>>>> root@master[~]dmesg
>>>> OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
>>>>  [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>>>> real mem = 4259880960 (4062MB)
>>>> avail mem = 4118163456 (3927MB)
>>>> mpath0 at root
>>>> scsibus0 at mpath0: 256 targets
>>>> mainbus0 at root
>>>> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
>>>> bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
>>>> bios0: PC Engines apu2
>>>> acpi0 at bios0: ACPI 6.0
>>>> acpi0: sleep states S0 S1 S4 S5
>>>> acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
>>>> acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
>>>> acpitimer0 at acpi0: 3579545 Hz, 32 bits
>>>> acpimcfg0 at acpi0
>>>> acpimcfg0: addr 0xf8000000, bus 0-64
>>>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
>>>> cpu0 at mainbus0: apid 0 (boot processor)
>>>> cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
>>>> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu0: smt 0, core 0, package 0
>>>> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
>>>> cpu0: apic clock running at 99MHz
>>>> cpu0: mwait min=64, max=64, IBE
>>>> cpu1 at mainbus0: apid 1 (application processor)
>>>> cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
>>>> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu1: smt 0, core 1, package 0
>>>> cpu2 at mainbus0: apid 2 (application processor)
>>>> cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>>>> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu2: smt 0, core 2, package 0
>>>> cpu3 at mainbus0: apid 3 (application processor)
>>>> cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>>>> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu3: smt 0, core 3, package 0
>>>> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
>>>> ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
>>>> acpihpet0 at acpi0: 14318180 Hz
>>>> acpiprt0 at acpi0: bus 0 (PCI0)
>>>> acpiprt1 at acpi0: bus -1 (PBR4)
>>>> acpiprt2 at acpi0: bus 1 (PBR5)
>>>> acpiprt3 at acpi0: bus 2 (PBR6)
>>>> acpiprt4 at acpi0: bus 3 (PBR7)
>>>> acpiprt5 at acpi0: bus -1 (PBR8)
>>>> acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpitz0 at acpi0: critical temperature is 115 degC
>>>> acpibtn0 at acpi0: PWRB
>>>> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
>>>> acpicmos0 at acpi0
>>>> amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "BOOT0000" at acpi0 not configured
>>>> cpu0: 998 MHz: speeds: 1000 800 600 MHz
>>>> pci0 at mainbus0 bus 0
>>>> pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
>>>> vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
>>>> pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
>>>> ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
>>>> pci1 at ppb0 bus 1
>>>> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
>>>> pci2 at ppb1 bus 2
>>>> em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
>>>> pci3 at ppb2 bus 3
>>>> em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
>>>> xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
>>>> usb0 at xhci0: USB revision 3.0
>>>> uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
>>>> ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
>>>> ahci0: port 0: 6.0Gb/s
>>>> scsibus1 at ahci0: 32 targets
>>>> sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
>>>> sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
>>>> ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
>>>> usb1 at ehci0: USB revision 2.0
>>>> uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
>>>> piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
>>>> iic0 at piixpm0
>>>> iic1 at piixpm0
>>>> iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
>>>> pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
>>>> sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
>>>> sdhc0: SDHC 2.0, 50 MHz base clock
>>>> sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
>>>> pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
>>>> pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
>>>> pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
>>>> km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
>>>> pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
>>>> pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
>>>> isa0 at pcib0
>>>> isadma0 at isa0
>>>> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
>>>> com0: console
>>>> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
>>>> com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
>>>> pcppi0 at isa0 port 0x61
>>>> spkr0 at pcppi0
>>>> lpt0 at isa0 port 0x378/4 irq 7
>>>> intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
>>>> wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
>>>> vmm0 at mainbus0: SVM/RVI
>>>> cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>>>> cdce0: address xx:xx:xx:xx:xx:xx
>>>> umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>>>> umass0: using SCSI over Bulk-Only
>>>> scsibus2 at umass0: 2 targets, initiator 0
>>>> sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
>>>> uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
>>>> vscsi0 at root
>>>> scsibus3 at vscsi0: 256 targets
>>>> softraid0 at root
>>>> scsibus4 at softraid0: 256 targets
>>>> root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b
>>>
>>
>>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Gerhard Roth-2
In reply to this post by Mark Kettenis
On 5/22/20 9:05 PM, Mark Kettenis wrote:

>> From: Łukasz Lejtkowski <[hidden email]>
>> Date: Fri, 22 May 2020 20:51:57 +0200
>>
>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>
> That might be why the device stops responding.  The fact that cleaning
> up from a failed USB transaction leads to this panic is a bug though.
>
> And somebody just posted a very similar panic with ure(4).  Something
> in the network stack is holding a mutex when it shouldn't.

I think that holding the mutex is ok. The bug is calling the stop
routine in case of errors.

This is what common foo_start() does:

        m_head = ifq_deq_begin(&ifp->if_snd);
        if (foo_encap(sc, m_head, 0)) {
                ifq_deq_rollback(&ifp->if_snd, m_head);
                ...
                return;
        }
        ifq_deq_commit(&ifp->if_snd, m_head);

Here, ifq_deq_begin() grabs a mutex and it is held while
calling foo_encap().

For USB network interfaces foo_encap() mostly does this:

        err = usbd_transfer(sc->sc_xfer);
        if (err != USBD_IN_PROGRESS) {
                foo_stop(sc);
                return EIO;
        }

And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
which might sleep.

How to fix? We could do the foo_encap() after the ifq_deq_commit(),
possibly dropping the current mbuf if encap fails (who cares
for the packets after foo_stop() anyway).

Or change all the drivers to follow the path that if_aue.c takes:

        err = usbd_transfer(c->aue_xfer);
        if (err != USBD_IN_PROGRESS) {
                ...
                /* Stop the interface from process context. */
                usb_add_task(sc->aue_udev, &sc->aue_stop_task);
                return (EIO);
        }

Any ideas, what's better? Or alternative proposals?


Gerhard

>
>>> On 22 May 2020, at 20:05, Łukasz Lejtkowski <[hidden email]> wrote:
>>>
>>> 30 min ago… :/
>>>
>>>
>>> OpenBSD/amd64 (master.bsdxxx.xx) (tty00)
>>>
>>> login: panic: assertwaitok: non-zero mutex count: 1
>>> Stopped at      db_enter+0x10:  popq    %rbp
>>>     TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
>>> db_enter() at db_enter+0x10
>>> panic(ffffffff81c882c4) at panic+0x128
>>> assertwaitok() at assertwaitok+0xc7
>>> mi_switch() at mi_switch+0x40
>>> sleep_finish(ffff8000225b8538,1) at sleep_finish+0x84
>>> sleep_finish_all(ffff8000225b8538,1) at sleep_finish_all+0x21
>>> tsleep(ffff8000000b1750,16,ffffffff81c95c7d,33) at tsleep+0xd6
>>> xhci_command_submit(ffff80000009c000,ffff8000225b8628,1dcd6500) at xhci_command
>>> _submit+0x13f
>>> xhci_abort_xfer(fffffd812e90c780,6) at xhci_abort_xfer+0x13a
>>> usbd_abort_pipe(ffff80000047b000) at usbd_abort_pipe+0x3d
>>> cdce_stop(ffff80000012d000) at cdce_stop+0x46
>>> cdce_encap(ffff80000012d000,fffffd80c0731d00,0) at cdce_encap+0xf7
>>> cdce_start(ffff80000012d048) at cdce_start+0x84
>>> if_qstart_compat(ffff80000012d2c0) at if_qstart_compat+0x2e
>>> end trace frame: 0xffff8000225b8840, count: 0
>>> https://www.openbsd.org/ddb.html describes the minimum info required in bug
>>> reports.  Insufficient info makes it difficult to find and fix bugs.
>>> ddb{2}>
>>>
>>>> On 22 May 2020, at 15:58, Łukasz Lejtkowski <[hidden email]> wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> After a few hours OpenBSD 6.7 crashes to ddb> . Without a LTE modem OpenBSD 6.7 works stable. Huawei E3372s-153 HiLink on OpenBSD 6.6 works perfectly, stable. Something wrong with USB, xHCI or cdce on OpenBSD 6.7 imho.
>>>>
>>>> ddb{2}> show panic
>>>> assertwaitok: non-zero mutex count: 1
>>>>
>>>> ddb{2}> trace
>>>> db_enter() at db_enter+0x10
>>>> panic(ffffffff81c8ec25) at panic+0x128
>>>> assertwaitok() at assertwaitok+0xc7
>>>> mi_switch() at mi_switch+0x40
>>>> sleep_finish(ffff8000225b8f88,1) at sleep_finish+0x84
>>>> sleep_finish_all(ffff8000225b8f88,1) at sleep_finish_all+0x21
>>>> tsleep(ffff8000000a5750,16,ffffffff81c99248,33) at tsleep+0xd6
>>>> xhci_command_submit(ffff800000090000,ffff8000225b9078,1dcd6500) at xhci_command
>>>> _submit+0x13f
>>>> xhci_abort_xfer(fffffd811e918690,6) at xhci_abort_xfer+0x13a
>>>> usbd_abort_pipe(ffff80000045f000) at usbd_abort_pipe+0x3d
>>>> cdce_stop(ffff800000119000) at cdce_stop+0x46
>>>> cdce_encap(ffff800000119000,fffffd80df8b8400,0) at cdce_encap+0xf7
>>>> cdce_start(ffff800000119048) at cdce_start+0x84
>>>> if_qstart_compat(ffff8000001192c0) at if_qstart_compat+0x2e
>>>> ifq_serialize(ffff8000001192c0,ffff800000119390) at ifq_serialize+0x103
>>>> taskq_thread(ffff8000000290c0) at taskq_thread+0x4d
>>>> end trace frame: 0x0, count: -16
>>>>
>>>>
>>>>
>>>> PC Engines apu2
>>>> coreboot build 20202604
>>>> BIOS version v4.11.0.6
>>>> 4080 MB ECC DRAM
>>>> SeaBIOS (version rel-1.12.1.3-0-g300e8b70)
>>>>
>>>>
>>>> root@master[~]usbdevs -v
>>>> Controller /dev/usb0:
>>>> addr 01: 1022:0000 AMD, xHCI root hub
>>>> super speed, self powered, config 1, rev 1.00
>>>> driver: uhub0
>>>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>>>> high speed, self powered, config 1, rev 1.02
>>>> driver: cdce0
>>>> driver: umass0
>>>> Controller /dev/usb1:
>>>> addr 01: 1022:0000 AMD, EHCI root hub
>>>> high speed, self powered, config 1, rev 1.00
>>>> driver: uhub1
>>>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>>>> high speed, self powered, config 1, rev 0.18
>>>> driver: uhub2
>>>>
>>>>
>>>> root@master[~]usbdevs -vv
>>>> Controller /dev/usb0:
>>>> addr 01: 1022:0000 AMD, xHCI root hub
>>>> super speed, self powered, config 1, rev 1.00
>>>> driver: uhub0
>>>> port 01: 0000.02a0 power Rx.detect
>>>> port 02: 0000.02a0 power Rx.detect
>>>> port 03: 0000.0503 connect enabled recovery
>>>> port 04: 0000.02a0 power Rx.detect
>>>> addr 02: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
>>>> high speed, self powered, config 1, rev 1.02
>>>> driver: cdce0
>>>> driver: umass0
>>>> Controller /dev/usb1:
>>>> addr 01: 1022:0000 AMD, EHCI root hub
>>>> high speed, self powered, config 1, rev 1.00
>>>> driver: uhub1
>>>> port 01: 0000.0503 connect enabled power
>>>> port 02: 0000.0500 power
>>>> addr 02: 0438:7900 Advanced Micro Devices, Hub
>>>> high speed, self powered, config 1, rev 0.18
>>>> driver: uhub2
>>>> port 01: 0000.0100 power
>>>> port 02: 0000.0100 power
>>>> port 03: 0000.0100 power
>>>> port 04: 0000.0100 power
>>>>
>>>>
>>>> root@master[~]ifconfig cdce0
>>>> cdce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>>>> lladdr xx:xx:xx:xx:xx:xx
>>>> index 6 priority 0 llprio 3
>>>> inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255
>>>>
>>>>
>>>>
>>>>
>>>> root@master[~]dmesg
>>>> OpenBSD 6.7 (GENERIC.MP) #1: Sat May 16 16:33:02 MDT 2020
>>>>    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>>>> real mem = 4259880960 (4062MB)
>>>> avail mem = 4118163456 (3927MB)
>>>> mpath0 at root
>>>> scsibus0 at mpath0: 256 targets
>>>> mainbus0 at root
>>>> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xcfe8d020 (13 entries)
>>>> bios0: vendor coreboot version "v4.11.0.6" date 04/26/2020
>>>> bios0: PC Engines apu2
>>>> acpi0 at bios0: ACPI 6.0
>>>> acpi0: sleep states S0 S1 S4 S5
>>>> acpi0: tables DSDT FACP SSDT MCFG TPM2 APIC HEST SSDT SSDT HPET
>>>> acpi0: wakeup devices PWRB(S4) PBR4(S4) PBR5(S4) PBR6(S4) PBR7(S4) PBR8(S4) UOH1(S3) UOH2(S3) UOH3(S3) UOH4(S3) UOH5(S3) UOH6(S3) XHC0(S4)
>>>> acpitimer0 at acpi0: 3579545 Hz, 32 bits
>>>> acpimcfg0 at acpi0
>>>> acpimcfg0: addr 0xf8000000, bus 0-64
>>>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
>>>> cpu0 at mainbus0: apid 0 (boot processor)
>>>> cpu0: AMD GX-412TC SOC, 998.27 MHz, 16-30-01
>>>> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu0: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu0: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu0: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu0: smt 0, core 0, package 0
>>>> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
>>>> cpu0: apic clock running at 99MHz
>>>> cpu0: mwait min=64, max=64, IBE
>>>> cpu1 at mainbus0: apid 1 (application processor)
>>>> cpu1: AMD GX-412TC SOC, 998.17 MHz, 16-30-01
>>>> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu1: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu1: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu1: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu1: smt 0, core 1, package 0
>>>> cpu2 at mainbus0: apid 2 (application processor)
>>>> cpu2: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>>>> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu2: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu2: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu2: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu2: smt 0, core 2, package 0
>>>> cpu3 at mainbus0: apid 3 (application processor)
>>>> cpu3: AMD GX-412TC SOC, 998.13 MHz, 16-30-01
>>>> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,SKINIT,TOPEXT,DBKP,PERFTSC,PCTRL3,ITSC,BMI1,XSAVEOPT
>>>> cpu3: 32KB 64b/line 2-way I-cache, 32KB 64b/line 8-way D-cache, 2MB 64b/line 16-way L2 cache
>>>> cpu3: ITLB 32 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu3: DTLB 40 4KB entries fully associative, 8 4MB entries fully associative
>>>> cpu3: smt 0, core 3, package 0
>>>> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins
>>>> ioapic1 at mainbus0: apid 5 pa 0xfec20000, version 21, 32 pins
>>>> acpihpet0 at acpi0: 14318180 Hz
>>>> acpiprt0 at acpi0: bus 0 (PCI0)
>>>> acpiprt1 at acpi0: bus -1 (PBR4)
>>>> acpiprt2 at acpi0: bus 1 (PBR5)
>>>> acpiprt3 at acpi0: bus 2 (PBR6)
>>>> acpiprt4 at acpi0: bus 3 (PBR7)
>>>> acpiprt5 at acpi0: bus -1 (PBR8)
>>>> acpicpu0 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu1 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu2 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpicpu3 at acpi0: C2(0@400 io@0x1771), C1(@1 halt!), PSS
>>>> acpitz0 at acpi0: critical temperature is 115 degC
>>>> acpibtn0 at acpi0: PWRB
>>>> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
>>>> acpicmos0 at acpi0
>>>> amdgpio0 at acpi0: GPIO uid 0 addr 0xfed81500/0x300 irq 7, 184 pins
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "PRP0001" at acpi0 not configured
>>>> "BOOT0000" at acpi0 not configured
>>>> cpu0: 998 MHz: speeds: 1000 800 600 MHz
>>>> pci0 at mainbus0 bus 0
>>>> pchb0 at pci0 dev 0 function 0 "AMD 16h Root Complex" rev 0x00
>>>> vendor "AMD", unknown product 0x1567 (class system subclass IOMMU, rev 0x00) at pci0 dev 0 function 2 not configured
>>>> pchb1 at pci0 dev 2 function 0 "AMD 16h Host" rev 0x00
>>>> ppb0 at pci0 dev 2 function 2 "AMD 16h PCIE" rev 0x00: msi
>>>> pci1 at ppb0 bus 1
>>>> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ppb1 at pci0 dev 2 function 3 "AMD 16h PCIE" rev 0x00: msi
>>>> pci2 at ppb1 bus 2
>>>> em1 at pci2 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ppb2 at pci0 dev 2 function 4 "AMD 16h PCIE" rev 0x00: msi
>>>> pci3 at ppb2 bus 3
>>>> em2 at pci3 dev 0 function 0 "Intel I210" rev 0x03: msi, address xx:xx:xx:xx:xx:xx
>>>> ccp0 at pci0 dev 8 function 0 "AMD 16h Crypto" rev 0x00
>>>> xhci0 at pci0 dev 16 function 0 "AMD Bolton xHCI" rev 0x11: msi, xHCI 1.0
>>>> usb0 at xhci0: USB revision 3.0
>>>> uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
>>>> ahci0 at pci0 dev 17 function 0 "AMD Hudson-2 SATA" rev 0x40: apic 4 int 19, AHCI 1.3
>>>> ahci0: port 0: 6.0Gb/s
>>>> scsibus1 at ahci0: 32 targets
>>>> sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDMCEAW12, DC33> naa.55cd2e414caba047
>>>> sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
>>>> ehci0 at pci0 dev 19 function 0 "AMD Hudson-2 USB2" rev 0x39: apic 4 int 18
>>>> usb1 at ehci0: USB revision 2.0
>>>> uhub1 at usb1 configuration 1 interface 0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
>>>> piixpm0 at pci0 dev 20 function 0 "AMD Hudson-2 SMBus" rev 0x42: SMI
>>>> iic0 at piixpm0
>>>> iic1 at piixpm0
>>>> iic1: addr 0x4c 3e=00 48=00 4a=00 4e=00 fc=00 fe=00 words 00=ffff 01=ffff 02=ffff 03=ffff 04=ffff 05=ffff 06=ffff 07=ffff
>>>> pcib0 at pci0 dev 20 function 3 "AMD Hudson-2 LPC" rev 0x11
>>>> sdhc0 at pci0 dev 20 function 7 "AMD Bolton SD/MMC" rev 0x01: apic 4 int 16
>>>> sdhc0: SDHC 2.0, 50 MHz base clock
>>>> sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma
>>>> pchb2 at pci0 dev 24 function 0 "AMD 16h Link Cfg" rev 0x00
>>>> pchb3 at pci0 dev 24 function 1 "AMD 16h Address Map" rev 0x00
>>>> pchb4 at pci0 dev 24 function 2 "AMD 16h DRAM Cfg" rev 0x00
>>>> km0 at pci0 dev 24 function 3 "AMD 16h Misc Cfg" rev 0x00
>>>> pchb5 at pci0 dev 24 function 4 "AMD 16h CPU Power" rev 0x00
>>>> pchb6 at pci0 dev 24 function 5 "AMD 16h Misc Cfg" rev 0x00
>>>> isa0 at pcib0
>>>> isadma0 at isa0
>>>> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
>>>> com0: console
>>>> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
>>>> com2 at isa0 port 0x3e8/8 irq 5: ns16550a, 16 byte fifo
>>>> pcppi0 at isa0 port 0x61
>>>> spkr0 at pcppi0
>>>> lpt0 at isa0 port 0x378/4 irq 7
>>>> intr_establish: pic ioapic0 pin 7: can't share type 3 with 2
>>>> wbsio0 at isa0 port 0x2e/2: NCT5104D rev 0x52
>>>> vmm0 at mainbus0: SVM/RVI
>>>> cdce0 at uhub0 port 4 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>>>> cdce0: address xx:xx:xx:xx:xx:xx
>>>> umass0 at uhub0 port 4 configuration 1 interface 2 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
>>>> umass0: using SCSI over Bulk-Only
>>>> scsibus2 at umass0: 2 targets, initiator 0
>>>> sd1 at scsibus2 targ 1 lun 0: <HUAWEI, TF CARD Storage, 2.31> removable
>>>> uhub2 at uhub1 port 1 configuration 1 interface 0 "Advanced Micro Devices Hub" rev 2.00/0.18 addr 2
>>>> vscsi0 at root
>>>> scsibus3 at vscsi0: 256 targets
>>>> softraid0 at root
>>>> scsibus4 at softraid0: 256 targets
>>>> root on sd0a (c5280affbb56a9ff.a) swap on sd0b dump on sd0b
>>>
>>
>>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Martin Pieuchot
On 25/05/20(Mon) 12:56, Gerhard Roth wrote:

> On 5/22/20 9:05 PM, Mark Kettenis wrote:
> > > From: Łukasz Lejtkowski <[hidden email]>
> > > Date: Fri, 22 May 2020 20:51:57 +0200
> > >
> > > Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
> > > too high. Should be 12,25-12,50 V. I replaced to the new one.
> >
> > That might be why the device stops responding.  The fact that cleaning
> > up from a failed USB transaction leads to this panic is a bug though.
> >
> > And somebody just posted a very similar panic with ure(4).  Something
> > in the network stack is holding a mutex when it shouldn't.
>
> I think that holding the mutex is ok. The bug is calling the stop
> routine in case of errors.
>
> This is what common foo_start() does:
>
> m_head = ifq_deq_begin(&ifp->if_snd);
> if (foo_encap(sc, m_head, 0)) {
> ifq_deq_rollback(&ifp->if_snd, m_head);
> ...
> return;
> }
> ifq_deq_commit(&ifp->if_snd, m_head);
>
> Here, ifq_deq_begin() grabs a mutex and it is held while
> calling foo_encap().
>
> For USB network interfaces foo_encap() mostly does this:
>
> err = usbd_transfer(sc->sc_xfer);
> if (err != USBD_IN_PROGRESS) {
> foo_stop(sc);
> return EIO;
> }
>
> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
> which might sleep.
>
> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
> possibly dropping the current mbuf if encap fails (who cares
> for the packets after foo_stop() anyway).

That's the approach taken by drivers using ifq_dequeue(9) instead of
ifq_deq_begin/commit().

> Or change all the drivers to follow the path that if_aue.c takes:
>
> err = usbd_transfer(c->aue_xfer);
> if (err != USBD_IN_PROGRESS) {
> ...
> /* Stop the interface from process context. */
> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
> return (EIO);
> }

That's just trading the current problem for another one with higher
complexity.

> Any ideas, what's better? Or alternative proposals?

Using ifq_dequeue(9) would have the advantage of unifying the code base.
It introduces a behavior change.  A simpler fix would be to call
foo_stop() in the error path after ifq_deq_rollback().

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
Right now LTE modem working on internal USB 2.0(EHCI). External is USB 3.0(xHCI). We will see… :)

root@master[~]usbdevs -v
Controller /dev/usb0:
addr 01: 1022:0000 AMD, xHCI root hub
         super speed, self powered, config 1, rev 1.00
         driver: uhub0
Controller /dev/usb1:
addr 01: 1022:0000 AMD, EHCI root hub
         high speed, self powered, config 1, rev 1.00
         driver: uhub1
addr 02: 0438:7900 Advanced Micro Devices, Hub
         high speed, self powered, config 1, rev 0.18
         driver: uhub2
addr 03: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
         high speed, self powered, config 1, rev 1.02
         driver: cdce0
         driver: umass0
root@master[~]


> On 25 May 2020, at 13:19, Martin Pieuchot <[hidden email]> wrote:
>
> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>> From: Łukasz Lejtkowski <[hidden email]>
>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>
>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>
>>> That might be why the device stops responding.  The fact that cleaning
>>> up from a failed USB transaction leads to this panic is a bug though.
>>>
>>> And somebody just posted a very similar panic with ure(4).  Something
>>> in the network stack is holding a mutex when it shouldn't.
>>
>> I think that holding the mutex is ok. The bug is calling the stop
>> routine in case of errors.
>>
>> This is what common foo_start() does:
>>
>> m_head = ifq_deq_begin(&ifp->if_snd);
>> if (foo_encap(sc, m_head, 0)) {
>> ifq_deq_rollback(&ifp->if_snd, m_head);
>> ...
>> return;
>> }
>> ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> Here, ifq_deq_begin() grabs a mutex and it is held while
>> calling foo_encap().
>>
>> For USB network interfaces foo_encap() mostly does this:
>>
>> err = usbd_transfer(sc->sc_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> foo_stop(sc);
>> return EIO;
>> }
>>
>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>> which might sleep.
>>
>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>> possibly dropping the current mbuf if encap fails (who cares
>> for the packets after foo_stop() anyway).
>
> That's the approach taken by drivers using ifq_dequeue(9) instead of
> ifq_deq_begin/commit().
>
>> Or change all the drivers to follow the path that if_aue.c takes:
>>
>> err = usbd_transfer(c->aue_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> ...
>> /* Stop the interface from process context. */
>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>> return (EIO);
>> }
>
> That's just trading the current problem for another one with higher
> complexity.
>
>> Any ideas, what's better? Or alternative proposals?
>
> Using ifq_dequeue(9) would have the advantage of unifying the code base.
> It introduces a behavior change.  A simpler fix would be to call
> foo_stop() in the error path after ifq_deq_rollback().


IMG_0278.JPG (1M) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
LTE modem works correctly under usb 2.0(EHCI), no panics. Uptime almost 2 days. Something is broken in xHCI (xhci.c?).
Any patch for 6.7 soon, or is it more complicated?


> On 27 May 2020, at 18:30, Łukasz Lejtkowski <[hidden email]> wrote:
>
> Right now LTE modem working on internal USB 2.0(EHCI). External is USB 3.0(xHCI). We will see… :)
>
> root@master[~]usbdevs -v
> Controller /dev/usb0:
> addr 01: 1022:0000 AMD, xHCI root hub
> super speed, self powered, config 1, rev 1.00
> driver: uhub0
> Controller /dev/usb1:
> addr 01: 1022:0000 AMD, EHCI root hub
> high speed, self powered, config 1, rev 1.00
> driver: uhub1
> addr 02: 0438:7900 Advanced Micro Devices, Hub
> high speed, self powered, config 1, rev 0.18
> driver: uhub2
> addr 03: 12d1:14dc HUAWEI_MOBILE, HUAWEI_MOBILE
> high speed, self powered, config 1, rev 1.02
> driver: cdce0
> driver: umass0
> root@master[~]
>
> <IMG_0278.JPG>
>> On 25 May 2020, at 13:19, Martin Pieuchot <[hidden email] <mailto:[hidden email]>> wrote:
>>
>> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>>> From: Łukasz Lejtkowski <[hidden email] <mailto:[hidden email]>>
>>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>>
>>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>>
>>>> That might be why the device stops responding.  The fact that cleaning
>>>> up from a failed USB transaction leads to this panic is a bug though.
>>>>
>>>> And somebody just posted a very similar panic with ure(4).  Something
>>>> in the network stack is holding a mutex when it shouldn't.
>>>
>>> I think that holding the mutex is ok. The bug is calling the stop
>>> routine in case of errors.
>>>
>>> This is what common foo_start() does:
>>>
>>> m_head = ifq_deq_begin(&ifp->if_snd);
>>> if (foo_encap(sc, m_head, 0)) {
>>> ifq_deq_rollback(&ifp->if_snd, m_head);
>>> ...
>>> return;
>>> }
>>> ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> Here, ifq_deq_begin() grabs a mutex and it is held while
>>> calling foo_encap().
>>>
>>> For USB network interfaces foo_encap() mostly does this:
>>>
>>> err = usbd_transfer(sc->sc_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> foo_stop(sc);
>>> return EIO;
>>> }
>>>
>>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>>> which might sleep.
>>>
>>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>>> possibly dropping the current mbuf if encap fails (who cares
>>> for the packets after foo_stop() anyway).
>>
>> That's the approach taken by drivers using ifq_dequeue(9) instead of
>> ifq_deq_begin/commit().
>>
>>> Or change all the drivers to follow the path that if_aue.c takes:
>>>
>>> err = usbd_transfer(c->aue_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> ...
>>> /* Stop the interface from process context. */
>>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>>> return (EIO);
>>> }
>>
>> That's just trading the current problem for another one with higher
>> complexity.
>>
>>> Any ideas, what's better? Or alternative proposals?
>>
>> Using ifq_dequeue(9) would have the advantage of unifying the code base.
>> It introduces a behavior change.  A simpler fix would be to call
>> foo_stop() in the error path after ifq_deq_rollback().
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Gerhard Roth-2
In reply to this post by Martin Pieuchot
On 2020-05-25 13:19, Martin Pieuchot wrote:

> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>> From: Łukasz Lejtkowski <[hidden email]>
>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>
>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>
>>> That might be why the device stops responding.  The fact that cleaning
>>> up from a failed USB transaction leads to this panic is a bug though.
>>>
>>> And somebody just posted a very similar panic with ure(4).  Something
>>> in the network stack is holding a mutex when it shouldn't.
>>
>> I think that holding the mutex is ok. The bug is calling the stop
>> routine in case of errors.
>>
>> This is what common foo_start() does:
>>
>> m_head = ifq_deq_begin(&ifp->if_snd);
>> if (foo_encap(sc, m_head, 0)) {
>> ifq_deq_rollback(&ifp->if_snd, m_head);
>> ...
>> return;
>> }
>> ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> Here, ifq_deq_begin() grabs a mutex and it is held while
>> calling foo_encap().
>>
>> For USB network interfaces foo_encap() mostly does this:
>>
>> err = usbd_transfer(sc->sc_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> foo_stop(sc);
>> return EIO;
>> }
>>
>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>> which might sleep.
>>
>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>> possibly dropping the current mbuf if encap fails (who cares
>> for the packets after foo_stop() anyway).
>
> That's the approach taken by drivers using ifq_dequeue(9) instead of
> ifq_deq_begin/commit().
>
>> Or change all the drivers to follow the path that if_aue.c takes:
>>
>> err = usbd_transfer(c->aue_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> ...
>> /* Stop the interface from process context. */
>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>> return (EIO);
>> }
>
> That's just trading the current problem for another one with higher
> complexity.
>
>> Any ideas, what's better? Or alternative proposals?
>
> Using ifq_dequeue(9) would have the advantage of unifying the code base.
> It introduces a behavior change.  A simpler fix would be to call
> foo_stop() in the error path after ifq_deq_rollback().
>

Hi,

two weeks passed any nobody objected Martin's proposal. So I thought,
we could try to move on this way.

Gerhard


Index: sys/dev/usb/if_axe.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
retrieving revision 1.139
diff -u -p -u -p -r1.139 if_axe.c
--- sys/dev/usb/if_axe.c 7 Jul 2019 06:40:10 -0000 1.139
+++ sys/dev/usb/if_axe.c 8 Jun 2020 15:13:25 -0000
@@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
  /* Transmit */
  err = usbd_transfer(c->axe_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->axe_mbuf = NULL;
  axe_stop(sc);
  return(EIO);
  }
@@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (axe_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  /*
  * If there's a BPF listener, bounce a copy of this frame
Index: sys/dev/usb/if_axen.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
retrieving revision 1.27
diff -u -p -u -p -r1.27 if_axen.c
--- sys/dev/usb/if_axen.c 7 Jul 2019 06:40:10 -0000 1.27
+++ sys/dev/usb/if_axen.c 8 Jun 2020 14:49:26 -0000
@@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
  /* Transmit */
  err = usbd_transfer(c->axen_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->axen_mbuf = NULL;
  axen_stop(sc);
  return EIO;
  }
@@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (axen_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  /*
  * If there's a BPF listener, bounce a copy of this frame
Index: sys/dev/usb/if_cdce.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
retrieving revision 1.76
diff -u -p -u -p -r1.76 if_cdce.c
--- sys/dev/usb/if_cdce.c 14 Nov 2019 13:50:55 -0000 1.76
+++ sys/dev/usb/if_cdce.c 8 Jun 2020 14:50:40 -0000
@@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
  if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (cdce_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }

- ifq_deq_commit(&ifp->if_snd, m_head);
-
  #if NBPFILTER > 0
  if (ifp->if_bpf)
  bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
@@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
     10000, cdce_txeof);
  err = usbd_transfer(c->cdce_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->cdce_mbuf = NULL;
  cdce_stop(sc);
  return (EIO);
  }
Index: sys/dev/usb/if_kue.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
retrieving revision 1.89
diff -u -p -u -p -r1.89 if_kue.c
--- sys/dev/usb/if_kue.c 2 Oct 2018 19:49:10 -0000 1.89
+++ sys/dev/usb/if_kue.c 8 Jun 2020 14:52:27 -0000
@@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
  if (err != USBD_IN_PROGRESS) {
  printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
        usbd_errstr(err));
+ c->kue_mbuf = NULL;
  kue_stop(sc);
  return (EIO);
  }
@@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (kue_send(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
-
- ifq_deq_commit(&ifp->if_snd, m_head);

  #if NBPFILTER > 0
  /*
Index: sys/dev/usb/if_mos.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
retrieving revision 1.40
diff -u -p -u -p -r1.40 if_mos.c
--- sys/dev/usb/if_mos.c 7 Jul 2019 06:40:10 -0000 1.40
+++ sys/dev/usb/if_mos.c 8 Jun 2020 15:15:42 -0000
@@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
  /* Transmit */
  err = usbd_transfer(c->mos_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->mos_mbuf = NULL;
  mos_stop(sc);
  return(EIO);
  }
@@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (mos_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  /*
  * If there's a BPF listener, bounce a copy of this frame
Index: sys/dev/usb/if_mue.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 if_mue.c
--- sys/dev/usb/if_mue.c 7 Jul 2019 06:40:10 -0000 1.7
+++ sys/dev/usb/if_mue.c 8 Jun 2020 14:55:07 -0000
@@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
  /* Transmit */
  err = usbd_transfer(c->mue_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->mue_mbuf = NULL;
  mue_stop(sc);
  return(EIO);
  }
@@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (mue_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  /* If there's a BPF listener, bounce a copy of this frame to him. */
  #if NBPFILTER > 0
Index: sys/dev/usb/if_smsc.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
retrieving revision 1.34
diff -u -p -u -p -r1.34 if_smsc.c
--- sys/dev/usb/if_smsc.c 8 Apr 2020 09:49:32 -0000 1.34
+++ sys/dev/usb/if_smsc.c 8 Jun 2020 15:02:20 -0000
@@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
  return;
  }

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (smsc_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  #if NBPFILTER > 0
  if (ifp->if_bpf)
@@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct

  err = usbd_transfer(c->sc_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->sc_mbuf = NULL;
  smsc_stop(sc);
  return (EIO);
  }
Index: sys/dev/usb/if_ugl.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
retrieving revision 1.23
diff -u -p -u -p -r1.23 if_ugl.c
--- sys/dev/usb/if_ugl.c 2 Oct 2018 19:49:10 -0000 1.23
+++ sys/dev/usb/if_ugl.c 8 Jun 2020 15:16:09 -0000
@@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
  if (err != USBD_IN_PROGRESS) {
  printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
        usbd_errstr(err));
+ c->ugl_mbuf = NULL;
  ugl_stop(sc);
  return (EIO);
  }
@@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (ugl_send(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
-
- ifq_deq_commit(&ifp->if_snd, m_head);

  #if NBPFILTER > 0
  /*
Index: sys/dev/usb/if_upl.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
retrieving revision 1.75
diff -u -p -u -p -r1.75 if_upl.c
--- sys/dev/usb/if_upl.c 2 Oct 2018 19:49:10 -0000 1.75
+++ sys/dev/usb/if_upl.c 8 Jun 2020 15:06:43 -0000
@@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
  if (err != USBD_IN_PROGRESS) {
  printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
        usbd_errstr(err));
+ c->upl_mbuf = NULL;
  upl_stop(sc);
  return (EIO);
  }
@@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
  if (ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (upl_send(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
-
- ifq_deq_commit(&ifp->if_snd, m_head);

  #if NBPFILTER > 0
  /*
Index: sys/dev/usb/if_ure.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
retrieving revision 1.14
diff -u -p -u -p -r1.14 if_ure.c
--- sys/dev/usb/if_ure.c 10 Mar 2020 01:11:30 -0000 1.14
+++ sys/dev/usb/if_ure.c 8 Jun 2020 15:12:53 -0000
@@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
  break;
  }
 
- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  break;

  if (ure_encap(sc, m_head)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  break;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  #if NBPFILTER > 0
  if (ifp->if_bpf)
@@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m

  err = usbd_transfer(c->uc_xfer);
  if (err != 0 && err != USBD_IN_PROGRESS) {
+ c->uc_mbuf = NULL;
  ure_stop(sc);
  return (EIO);
  }
Index: sys/dev/usb/if_urndis.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
retrieving revision 1.69
diff -u -p -u -p -r1.69 if_urndis.c
--- sys/dev/usb/if_urndis.c 22 Jan 2019 18:06:05 -0000 1.69
+++ sys/dev/usb/if_urndis.c 8 Jun 2020 15:14:57 -0000
@@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
  /* Transmit */
  err = usbd_transfer(c->sc_xfer);
  if (err != USBD_IN_PROGRESS) {
+ c->sc_mbuf = NULL;
  urndis_stop(sc);
  return(EIO);
  }
@@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
  if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
  return;

- m_head = ifq_deq_begin(&ifp->if_snd);
+ IFQ_DEQUEUE(&ifp->if_snd, m_head);
  if (m_head == NULL)
  return;

  if (urndis_encap(sc, m_head, 0)) {
- ifq_deq_rollback(&ifp->if_snd, m_head);
+ m_freem(m_head);
  ifq_set_oactive(&ifp->if_snd);
  return;
  }
- ifq_deq_commit(&ifp->if_snd, m_head);

  /*
  * If there's a BPF listener, bounce a copy of this frame

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Patrick Wildt-3
On Mon, Jun 08, 2020 at 05:31:44PM +0200, Gerhard Roth wrote:

> On 2020-05-25 13:19, Martin Pieuchot wrote:
> > On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
> > > On 5/22/20 9:05 PM, Mark Kettenis wrote:
> > > > > From: Łukasz Lejtkowski <[hidden email]>
> > > > > Date: Fri, 22 May 2020 20:51:57 +0200
> > > > >
> > > > > Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
> > > > > too high. Should be 12,25-12,50 V. I replaced to the new one.
> > > >
> > > > That might be why the device stops responding.  The fact that cleaning
> > > > up from a failed USB transaction leads to this panic is a bug though.
> > > >
> > > > And somebody just posted a very similar panic with ure(4).  Something
> > > > in the network stack is holding a mutex when it shouldn't.
> > >
> > > I think that holding the mutex is ok. The bug is calling the stop
> > > routine in case of errors.
> > >
> > > This is what common foo_start() does:
> > >
> > > m_head = ifq_deq_begin(&ifp->if_snd);
> > > if (foo_encap(sc, m_head, 0)) {
> > > ifq_deq_rollback(&ifp->if_snd, m_head);
> > > ...
> > > return;
> > > }
> > > ifq_deq_commit(&ifp->if_snd, m_head);
> > >
> > > Here, ifq_deq_begin() grabs a mutex and it is held while
> > > calling foo_encap().
> > >
> > > For USB network interfaces foo_encap() mostly does this:
> > >
> > > err = usbd_transfer(sc->sc_xfer);
> > > if (err != USBD_IN_PROGRESS) {
> > > foo_stop(sc);
> > > return EIO;
> > > }
> > >
> > > And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
> > > which might sleep.
> > >
> > > How to fix? We could do the foo_encap() after the ifq_deq_commit(),
> > > possibly dropping the current mbuf if encap fails (who cares
> > > for the packets after foo_stop() anyway).
> >
> > That's the approach taken by drivers using ifq_dequeue(9) instead of
> > ifq_deq_begin/commit().
> >
> > > Or change all the drivers to follow the path that if_aue.c takes:
> > >
> > > err = usbd_transfer(c->aue_xfer);
> > > if (err != USBD_IN_PROGRESS) {
> > > ...
> > > /* Stop the interface from process context. */
> > > usb_add_task(sc->aue_udev, &sc->aue_stop_task);
> > > return (EIO);
> > > }
> >
> > That's just trading the current problem for another one with higher
> > complexity.
> >
> > > Any ideas, what's better? Or alternative proposals?
> >
> > Using ifq_dequeue(9) would have the advantage of unifying the code base.
> > It introduces a behavior change.  A simpler fix would be to call
> > foo_stop() in the error path after ifq_deq_rollback().
> >
>
> Hi,
>
> two weeks passed any nobody objected Martin's proposal. So I thought,
> we could try to move on this way.
>
> Gerhard
>

From what I remember from various discussions, the goal should be to
check if there's a buffer free in the ring, then dequeue and send, and
it it can't be sent out, then drop it.  With USB apparently those
drivers "always" have an open buffer, so we can just dequeue and send,
like you do in this diff.  And if it gets dropped, that's fine.

That said, I think IFQ_DEQUEUE() is old compat code, and we actually
nowadays prefer:

m_head = ifq_dequeue(&ifp->if_snd);

If you look at the define for IFQ_DEQUEUE() you'll see it's marked
as compat code.  If you look at a new driver, like ixl(4), you'll
see that it also uses ifq_dequeue().

Sorry to to give you some work, but with that fixed: ok patrick@

Patrick

>
> Index: sys/dev/usb/if_axe.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
> retrieving revision 1.139
> diff -u -p -u -p -r1.139 if_axe.c
> --- sys/dev/usb/if_axe.c 7 Jul 2019 06:40:10 -0000 1.139
> +++ sys/dev/usb/if_axe.c 8 Jun 2020 15:13:25 -0000
> @@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
>   /* Transmit */
>   err = usbd_transfer(c->axe_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->axe_mbuf = NULL;
>   axe_stop(sc);
>   return(EIO);
>   }
> @@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (axe_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>   /*
>   * If there's a BPF listener, bounce a copy of this frame
> Index: sys/dev/usb/if_axen.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
> retrieving revision 1.27
> diff -u -p -u -p -r1.27 if_axen.c
> --- sys/dev/usb/if_axen.c 7 Jul 2019 06:40:10 -0000 1.27
> +++ sys/dev/usb/if_axen.c 8 Jun 2020 14:49:26 -0000
> @@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
>   /* Transmit */
>   err = usbd_transfer(c->axen_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->axen_mbuf = NULL;
>   axen_stop(sc);
>   return EIO;
>   }
> @@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (axen_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>   /*
>   * If there's a BPF listener, bounce a copy of this frame
> Index: sys/dev/usb/if_cdce.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
> retrieving revision 1.76
> diff -u -p -u -p -r1.76 if_cdce.c
> --- sys/dev/usb/if_cdce.c 14 Nov 2019 13:50:55 -0000 1.76
> +++ sys/dev/usb/if_cdce.c 8 Jun 2020 14:50:40 -0000
> @@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
>   if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (cdce_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
>
> - ifq_deq_commit(&ifp->if_snd, m_head);
> -
>  #if NBPFILTER > 0
>   if (ifp->if_bpf)
>   bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
> @@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
>      10000, cdce_txeof);
>   err = usbd_transfer(c->cdce_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->cdce_mbuf = NULL;
>   cdce_stop(sc);
>   return (EIO);
>   }
> Index: sys/dev/usb/if_kue.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
> retrieving revision 1.89
> diff -u -p -u -p -r1.89 if_kue.c
> --- sys/dev/usb/if_kue.c 2 Oct 2018 19:49:10 -0000 1.89
> +++ sys/dev/usb/if_kue.c 8 Jun 2020 14:52:27 -0000
> @@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
>   if (err != USBD_IN_PROGRESS) {
>   printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
>         usbd_errstr(err));
> + c->kue_mbuf = NULL;
>   kue_stop(sc);
>   return (EIO);
>   }
> @@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (kue_send(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> -
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>  #if NBPFILTER > 0
>   /*
> Index: sys/dev/usb/if_mos.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
> retrieving revision 1.40
> diff -u -p -u -p -r1.40 if_mos.c
> --- sys/dev/usb/if_mos.c 7 Jul 2019 06:40:10 -0000 1.40
> +++ sys/dev/usb/if_mos.c 8 Jun 2020 15:15:42 -0000
> @@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
>   /* Transmit */
>   err = usbd_transfer(c->mos_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->mos_mbuf = NULL;
>   mos_stop(sc);
>   return(EIO);
>   }
> @@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (mos_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>   /*
>   * If there's a BPF listener, bounce a copy of this frame
> Index: sys/dev/usb/if_mue.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
> retrieving revision 1.7
> diff -u -p -u -p -r1.7 if_mue.c
> --- sys/dev/usb/if_mue.c 7 Jul 2019 06:40:10 -0000 1.7
> +++ sys/dev/usb/if_mue.c 8 Jun 2020 14:55:07 -0000
> @@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
>   /* Transmit */
>   err = usbd_transfer(c->mue_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->mue_mbuf = NULL;
>   mue_stop(sc);
>   return(EIO);
>   }
> @@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (mue_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>   /* If there's a BPF listener, bounce a copy of this frame to him. */
>  #if NBPFILTER > 0
> Index: sys/dev/usb/if_smsc.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
> retrieving revision 1.34
> diff -u -p -u -p -r1.34 if_smsc.c
> --- sys/dev/usb/if_smsc.c 8 Apr 2020 09:49:32 -0000 1.34
> +++ sys/dev/usb/if_smsc.c 8 Jun 2020 15:02:20 -0000
> @@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
>   return;
>   }
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (smsc_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>  #if NBPFILTER > 0
>   if (ifp->if_bpf)
> @@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct
>
>   err = usbd_transfer(c->sc_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->sc_mbuf = NULL;
>   smsc_stop(sc);
>   return (EIO);
>   }
> Index: sys/dev/usb/if_ugl.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
> retrieving revision 1.23
> diff -u -p -u -p -r1.23 if_ugl.c
> --- sys/dev/usb/if_ugl.c 2 Oct 2018 19:49:10 -0000 1.23
> +++ sys/dev/usb/if_ugl.c 8 Jun 2020 15:16:09 -0000
> @@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
>   if (err != USBD_IN_PROGRESS) {
>   printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
>         usbd_errstr(err));
> + c->ugl_mbuf = NULL;
>   ugl_stop(sc);
>   return (EIO);
>   }
> @@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (ugl_send(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> -
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>  #if NBPFILTER > 0
>   /*
> Index: sys/dev/usb/if_upl.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
> retrieving revision 1.75
> diff -u -p -u -p -r1.75 if_upl.c
> --- sys/dev/usb/if_upl.c 2 Oct 2018 19:49:10 -0000 1.75
> +++ sys/dev/usb/if_upl.c 8 Jun 2020 15:06:43 -0000
> @@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
>   if (err != USBD_IN_PROGRESS) {
>   printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
>         usbd_errstr(err));
> + c->upl_mbuf = NULL;
>   upl_stop(sc);
>   return (EIO);
>   }
> @@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
>   if (ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (upl_send(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> -
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>  #if NBPFILTER > 0
>   /*
> Index: sys/dev/usb/if_ure.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
> retrieving revision 1.14
> diff -u -p -u -p -r1.14 if_ure.c
> --- sys/dev/usb/if_ure.c 10 Mar 2020 01:11:30 -0000 1.14
> +++ sys/dev/usb/if_ure.c 8 Jun 2020 15:12:53 -0000
> @@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
>   break;
>   }
>  
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   break;
>
>   if (ure_encap(sc, m_head)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   break;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>  #if NBPFILTER > 0
>   if (ifp->if_bpf)
> @@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m
>
>   err = usbd_transfer(c->uc_xfer);
>   if (err != 0 && err != USBD_IN_PROGRESS) {
> + c->uc_mbuf = NULL;
>   ure_stop(sc);
>   return (EIO);
>   }
> Index: sys/dev/usb/if_urndis.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
> retrieving revision 1.69
> diff -u -p -u -p -r1.69 if_urndis.c
> --- sys/dev/usb/if_urndis.c 22 Jan 2019 18:06:05 -0000 1.69
> +++ sys/dev/usb/if_urndis.c 8 Jun 2020 15:14:57 -0000
> @@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
>   /* Transmit */
>   err = usbd_transfer(c->sc_xfer);
>   if (err != USBD_IN_PROGRESS) {
> + c->sc_mbuf = NULL;
>   urndis_stop(sc);
>   return(EIO);
>   }
> @@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
>   if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
>   return;
>
> - m_head = ifq_deq_begin(&ifp->if_snd);
> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>   if (m_head == NULL)
>   return;
>
>   if (urndis_encap(sc, m_head, 0)) {
> - ifq_deq_rollback(&ifp->if_snd, m_head);
> + m_freem(m_head);
>   ifq_set_oactive(&ifp->if_snd);
>   return;
>   }
> - ifq_deq_commit(&ifp->if_snd, m_head);
>
>   /*
>   * If there's a BPF listener, bounce a copy of this frame
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
Hi Gerhard,

Today I added Your patches to 6.7-stable and moved back LTE modem to USB 3.0. So, just waiting for… nothing or kernel panic. I’ll let you know.

> On 8 Jun 2020, at 19:13, Patrick Wildt <[hidden email]> wrote:
>
> On Mon, Jun 08, 2020 at 05:31:44PM +0200, Gerhard Roth wrote:
>> On 2020-05-25 13:19, Martin Pieuchot wrote:
>>> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>>>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>>>> From: Łukasz Lejtkowski <[hidden email]>
>>>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>>>
>>>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>>>
>>>>> That might be why the device stops responding.  The fact that cleaning
>>>>> up from a failed USB transaction leads to this panic is a bug though.
>>>>>
>>>>> And somebody just posted a very similar panic with ure(4).  Something
>>>>> in the network stack is holding a mutex when it shouldn't.
>>>>
>>>> I think that holding the mutex is ok. The bug is calling the stop
>>>> routine in case of errors.
>>>>
>>>> This is what common foo_start() does:
>>>>
>>>> m_head = ifq_deq_begin(&ifp->if_snd);
>>>> if (foo_encap(sc, m_head, 0)) {
>>>> ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> ...
>>>> return;
>>>> }
>>>> ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> Here, ifq_deq_begin() grabs a mutex and it is held while
>>>> calling foo_encap().
>>>>
>>>> For USB network interfaces foo_encap() mostly does this:
>>>>
>>>> err = usbd_transfer(sc->sc_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> foo_stop(sc);
>>>> return EIO;
>>>> }
>>>>
>>>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>>>> which might sleep.
>>>>
>>>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>>>> possibly dropping the current mbuf if encap fails (who cares
>>>> for the packets after foo_stop() anyway).
>>>
>>> That's the approach taken by drivers using ifq_dequeue(9) instead of
>>> ifq_deq_begin/commit().
>>>
>>>> Or change all the drivers to follow the path that if_aue.c takes:
>>>>
>>>> err = usbd_transfer(c->aue_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> ...
>>>> /* Stop the interface from process context. */
>>>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>>>> return (EIO);
>>>> }
>>>
>>> That's just trading the current problem for another one with higher
>>> complexity.
>>>
>>>> Any ideas, what's better? Or alternative proposals?
>>>
>>> Using ifq_dequeue(9) would have the advantage of unifying the code base.
>>> It introduces a behavior change.  A simpler fix would be to call
>>> foo_stop() in the error path after ifq_deq_rollback().
>>>
>>
>> Hi,
>>
>> two weeks passed any nobody objected Martin's proposal. So I thought,
>> we could try to move on this way.
>>
>> Gerhard
>>
>
> From what I remember from various discussions, the goal should be to
> check if there's a buffer free in the ring, then dequeue and send, and
> it it can't be sent out, then drop it.  With USB apparently those
> drivers "always" have an open buffer, so we can just dequeue and send,
> like you do in this diff.  And if it gets dropped, that's fine.
>
> That said, I think IFQ_DEQUEUE() is old compat code, and we actually
> nowadays prefer:
>
> m_head = ifq_dequeue(&ifp->if_snd);
>
> If you look at the define for IFQ_DEQUEUE() you'll see it's marked
> as compat code.  If you look at a new driver, like ixl(4), you'll
> see that it also uses ifq_dequeue().
>
> Sorry to to give you some work, but with that fixed: ok patrick@
>
> Patrick
>
>>
>> Index: sys/dev/usb/if_axe.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
>> retrieving revision 1.139
>> diff -u -p -u -p -r1.139 if_axe.c
>> --- sys/dev/usb/if_axe.c 7 Jul 2019 06:40:10 -0000 1.139
>> +++ sys/dev/usb/if_axe.c 8 Jun 2020 15:13:25 -0000
>> @@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
>> /* Transmit */
>> err = usbd_transfer(c->axe_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->axe_mbuf = NULL;
>> axe_stop(sc);
>> return(EIO);
>> }
>> @@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (axe_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> /*
>> * If there's a BPF listener, bounce a copy of this frame
>> Index: sys/dev/usb/if_axen.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
>> retrieving revision 1.27
>> diff -u -p -u -p -r1.27 if_axen.c
>> --- sys/dev/usb/if_axen.c 7 Jul 2019 06:40:10 -0000 1.27
>> +++ sys/dev/usb/if_axen.c 8 Jun 2020 14:49:26 -0000
>> @@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
>> /* Transmit */
>> err = usbd_transfer(c->axen_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->axen_mbuf = NULL;
>> axen_stop(sc);
>> return EIO;
>> }
>> @@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (axen_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> /*
>> * If there's a BPF listener, bounce a copy of this frame
>> Index: sys/dev/usb/if_cdce.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
>> retrieving revision 1.76
>> diff -u -p -u -p -r1.76 if_cdce.c
>> --- sys/dev/usb/if_cdce.c 14 Nov 2019 13:50:55 -0000 1.76
>> +++ sys/dev/usb/if_cdce.c 8 Jun 2020 14:50:40 -0000
>> @@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
>> if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (cdce_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>>
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>> -
>> #if NBPFILTER > 0
>> if (ifp->if_bpf)
>> bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
>> @@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
>>    10000, cdce_txeof);
>> err = usbd_transfer(c->cdce_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->cdce_mbuf = NULL;
>> cdce_stop(sc);
>> return (EIO);
>> }
>> Index: sys/dev/usb/if_kue.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
>> retrieving revision 1.89
>> diff -u -p -u -p -r1.89 if_kue.c
>> --- sys/dev/usb/if_kue.c 2 Oct 2018 19:49:10 -0000 1.89
>> +++ sys/dev/usb/if_kue.c 8 Jun 2020 14:52:27 -0000
>> @@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
>> if (err != USBD_IN_PROGRESS) {
>> printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
>>       usbd_errstr(err));
>> + c->kue_mbuf = NULL;
>> kue_stop(sc);
>> return (EIO);
>> }
>> @@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (kue_send(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> -
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> #if NBPFILTER > 0
>> /*
>> Index: sys/dev/usb/if_mos.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
>> retrieving revision 1.40
>> diff -u -p -u -p -r1.40 if_mos.c
>> --- sys/dev/usb/if_mos.c 7 Jul 2019 06:40:10 -0000 1.40
>> +++ sys/dev/usb/if_mos.c 8 Jun 2020 15:15:42 -0000
>> @@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
>> /* Transmit */
>> err = usbd_transfer(c->mos_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->mos_mbuf = NULL;
>> mos_stop(sc);
>> return(EIO);
>> }
>> @@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (mos_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> /*
>> * If there's a BPF listener, bounce a copy of this frame
>> Index: sys/dev/usb/if_mue.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
>> retrieving revision 1.7
>> diff -u -p -u -p -r1.7 if_mue.c
>> --- sys/dev/usb/if_mue.c 7 Jul 2019 06:40:10 -0000 1.7
>> +++ sys/dev/usb/if_mue.c 8 Jun 2020 14:55:07 -0000
>> @@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
>> /* Transmit */
>> err = usbd_transfer(c->mue_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->mue_mbuf = NULL;
>> mue_stop(sc);
>> return(EIO);
>> }
>> @@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (mue_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> /* If there's a BPF listener, bounce a copy of this frame to him. */
>> #if NBPFILTER > 0
>> Index: sys/dev/usb/if_smsc.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
>> retrieving revision 1.34
>> diff -u -p -u -p -r1.34 if_smsc.c
>> --- sys/dev/usb/if_smsc.c 8 Apr 2020 09:49:32 -0000 1.34
>> +++ sys/dev/usb/if_smsc.c 8 Jun 2020 15:02:20 -0000
>> @@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
>> return;
>> }
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (smsc_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> #if NBPFILTER > 0
>> if (ifp->if_bpf)
>> @@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct
>>
>> err = usbd_transfer(c->sc_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->sc_mbuf = NULL;
>> smsc_stop(sc);
>> return (EIO);
>> }
>> Index: sys/dev/usb/if_ugl.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
>> retrieving revision 1.23
>> diff -u -p -u -p -r1.23 if_ugl.c
>> --- sys/dev/usb/if_ugl.c 2 Oct 2018 19:49:10 -0000 1.23
>> +++ sys/dev/usb/if_ugl.c 8 Jun 2020 15:16:09 -0000
>> @@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
>> if (err != USBD_IN_PROGRESS) {
>> printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
>>       usbd_errstr(err));
>> + c->ugl_mbuf = NULL;
>> ugl_stop(sc);
>> return (EIO);
>> }
>> @@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (ugl_send(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> -
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> #if NBPFILTER > 0
>> /*
>> Index: sys/dev/usb/if_upl.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
>> retrieving revision 1.75
>> diff -u -p -u -p -r1.75 if_upl.c
>> --- sys/dev/usb/if_upl.c 2 Oct 2018 19:49:10 -0000 1.75
>> +++ sys/dev/usb/if_upl.c 8 Jun 2020 15:06:43 -0000
>> @@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
>> if (err != USBD_IN_PROGRESS) {
>> printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
>>       usbd_errstr(err));
>> + c->upl_mbuf = NULL;
>> upl_stop(sc);
>> return (EIO);
>> }
>> @@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
>> if (ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (upl_send(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> -
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> #if NBPFILTER > 0
>> /*
>> Index: sys/dev/usb/if_ure.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
>> retrieving revision 1.14
>> diff -u -p -u -p -r1.14 if_ure.c
>> --- sys/dev/usb/if_ure.c 10 Mar 2020 01:11:30 -0000 1.14
>> +++ sys/dev/usb/if_ure.c 8 Jun 2020 15:12:53 -0000
>> @@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
>> break;
>> }
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> break;
>>
>> if (ure_encap(sc, m_head)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> break;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> #if NBPFILTER > 0
>> if (ifp->if_bpf)
>> @@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m
>>
>> err = usbd_transfer(c->uc_xfer);
>> if (err != 0 && err != USBD_IN_PROGRESS) {
>> + c->uc_mbuf = NULL;
>> ure_stop(sc);
>> return (EIO);
>> }
>> Index: sys/dev/usb/if_urndis.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
>> retrieving revision 1.69
>> diff -u -p -u -p -r1.69 if_urndis.c
>> --- sys/dev/usb/if_urndis.c 22 Jan 2019 18:06:05 -0000 1.69
>> +++ sys/dev/usb/if_urndis.c 8 Jun 2020 15:14:57 -0000
>> @@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
>> /* Transmit */
>> err = usbd_transfer(c->sc_xfer);
>> if (err != USBD_IN_PROGRESS) {
>> + c->sc_mbuf = NULL;
>> urndis_stop(sc);
>> return(EIO);
>> }
>> @@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
>> if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
>> return;
>>
>> - m_head = ifq_deq_begin(&ifp->if_snd);
>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>> if (m_head == NULL)
>> return;
>>
>> if (urndis_encap(sc, m_head, 0)) {
>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>> + m_freem(m_head);
>> ifq_set_oactive(&ifp->if_snd);
>> return;
>> }
>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>
>> /*
>> * If there's a BPF listener, bounce a copy of this frame

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
Good news - no more kernel panics on USB 3.0(xHCI), it’s fixed.

Bad news - after 2-3h LTE modem lost local network connection via USB 3.0(cdce0). I have to remove modem and put it back to usb port - then local network connection between OpenBSD and modem back for 2-3h, sometimes 30-40 min. It looks like the same problem as kernel panic, but this time there is lost network connection via usb 3.0(xhci).  

root@master[~]ping 192.168.8.1
PING 192.168.8.1 (192.168.8.1): 56 data bytes
ping: sendmsg: Network is down
ping: wrote 192.168.8.1 64 chars, ret=-1
ping: sendmsg: Network is down
ping: wrote 192.168.8.1 64 chars, ret=-1

192.168.8.1 is default static IP on lte modem.

Your changes in if_cdce.c 1.77 not completely fix the problem.


> On 11 Jun 2020, at 11:13, Łukasz Lejtkowski <[hidden email]> wrote:
>
> Hi Gerhard,
>
> Today I added Your patches to 6.7-stable and moved back LTE modem to USB 3.0. So, just waiting for… nothing or kernel panic. I’ll let you know.
>
>> On 8 Jun 2020, at 19:13, Patrick Wildt <[hidden email] <mailto:[hidden email]>> wrote:
>>
>> On Mon, Jun 08, 2020 at 05:31:44PM +0200, Gerhard Roth wrote:
>>> On 2020-05-25 13:19, Martin Pieuchot wrote:
>>>> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>>>>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>>>>> From: Łukasz Lejtkowski <[hidden email] <mailto:[hidden email]>>
>>>>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>>>>
>>>>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>>>>
>>>>>> That might be why the device stops responding.  The fact that cleaning
>>>>>> up from a failed USB transaction leads to this panic is a bug though.
>>>>>>
>>>>>> And somebody just posted a very similar panic with ure(4).  Something
>>>>>> in the network stack is holding a mutex when it shouldn't.
>>>>>
>>>>> I think that holding the mutex is ok. The bug is calling the stop
>>>>> routine in case of errors.
>>>>>
>>>>> This is what common foo_start() does:
>>>>>
>>>>> m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> if (foo_encap(sc, m_head, 0)) {
>>>>> ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> ...
>>>>> return;
>>>>> }
>>>>> ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> Here, ifq_deq_begin() grabs a mutex and it is held while
>>>>> calling foo_encap().
>>>>>
>>>>> For USB network interfaces foo_encap() mostly does this:
>>>>>
>>>>> err = usbd_transfer(sc->sc_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> foo_stop(sc);
>>>>> return EIO;
>>>>> }
>>>>>
>>>>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>>>>> which might sleep.
>>>>>
>>>>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>>>>> possibly dropping the current mbuf if encap fails (who cares
>>>>> for the packets after foo_stop() anyway).
>>>>
>>>> That's the approach taken by drivers using ifq_dequeue(9) instead of
>>>> ifq_deq_begin/commit().
>>>>
>>>>> Or change all the drivers to follow the path that if_aue.c takes:
>>>>>
>>>>> err = usbd_transfer(c->aue_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> ...
>>>>> /* Stop the interface from process context. */
>>>>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>>>>> return (EIO);
>>>>> }
>>>>
>>>> That's just trading the current problem for another one with higher
>>>> complexity.
>>>>
>>>>> Any ideas, what's better? Or alternative proposals?
>>>>
>>>> Using ifq_dequeue(9) would have the advantage of unifying the code base.
>>>> It introduces a behavior change.  A simpler fix would be to call
>>>> foo_stop() in the error path after ifq_deq_rollback().
>>>>
>>>
>>> Hi,
>>>
>>> two weeks passed any nobody objected Martin's proposal. So I thought,
>>> we could try to move on this way.
>>>
>>> Gerhard
>>>
>>
>> From what I remember from various discussions, the goal should be to
>> check if there's a buffer free in the ring, then dequeue and send, and
>> it it can't be sent out, then drop it.  With USB apparently those
>> drivers "always" have an open buffer, so we can just dequeue and send,
>> like you do in this diff.  And if it gets dropped, that's fine.
>>
>> That said, I think IFQ_DEQUEUE() is old compat code, and we actually
>> nowadays prefer:
>>
>> m_head = ifq_dequeue(&ifp->if_snd);
>>
>> If you look at the define for IFQ_DEQUEUE() you'll see it's marked
>> as compat code.  If you look at a new driver, like ixl(4), you'll
>> see that it also uses ifq_dequeue().
>>
>> Sorry to to give you some work, but with that fixed: ok patrick@
>>
>> Patrick
>>
>>>
>>> Index: sys/dev/usb/if_axe.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
>>> retrieving revision 1.139
>>> diff -u -p -u -p -r1.139 if_axe.c
>>> --- sys/dev/usb/if_axe.c 7 Jul 2019 06:40:10 -0000 1.139
>>> +++ sys/dev/usb/if_axe.c 8 Jun 2020 15:13:25 -0000
>>> @@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
>>> /* Transmit */
>>> err = usbd_transfer(c->axe_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->axe_mbuf = NULL;
>>> axe_stop(sc);
>>> return(EIO);
>>> }
>>> @@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (axe_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> /*
>>> * If there's a BPF listener, bounce a copy of this frame
>>> Index: sys/dev/usb/if_axen.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
>>> retrieving revision 1.27
>>> diff -u -p -u -p -r1.27 if_axen.c
>>> --- sys/dev/usb/if_axen.c 7 Jul 2019 06:40:10 -0000 1.27
>>> +++ sys/dev/usb/if_axen.c 8 Jun 2020 14:49:26 -0000
>>> @@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
>>> /* Transmit */
>>> err = usbd_transfer(c->axen_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->axen_mbuf = NULL;
>>> axen_stop(sc);
>>> return EIO;
>>> }
>>> @@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (axen_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> /*
>>> * If there's a BPF listener, bounce a copy of this frame
>>> Index: sys/dev/usb/if_cdce.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
>>> retrieving revision 1.76
>>> diff -u -p -u -p -r1.76 if_cdce.c
>>> --- sys/dev/usb/if_cdce.c 14 Nov 2019 13:50:55 -0000 1.76
>>> +++ sys/dev/usb/if_cdce.c 8 Jun 2020 14:50:40 -0000
>>> @@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
>>> if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (cdce_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>>
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>> -
>>> #if NBPFILTER > 0
>>> if (ifp->if_bpf)
>>> bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
>>> @@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
>>>    10000, cdce_txeof);
>>> err = usbd_transfer(c->cdce_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->cdce_mbuf = NULL;
>>> cdce_stop(sc);
>>> return (EIO);
>>> }
>>> Index: sys/dev/usb/if_kue.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
>>> retrieving revision 1.89
>>> diff -u -p -u -p -r1.89 if_kue.c
>>> --- sys/dev/usb/if_kue.c 2 Oct 2018 19:49:10 -0000 1.89
>>> +++ sys/dev/usb/if_kue.c 8 Jun 2020 14:52:27 -0000
>>> @@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
>>> if (err != USBD_IN_PROGRESS) {
>>> printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
>>>       usbd_errstr(err));
>>> + c->kue_mbuf = NULL;
>>> kue_stop(sc);
>>> return (EIO);
>>> }
>>> @@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (kue_send(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> -
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> #if NBPFILTER > 0
>>> /*
>>> Index: sys/dev/usb/if_mos.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
>>> retrieving revision 1.40
>>> diff -u -p -u -p -r1.40 if_mos.c
>>> --- sys/dev/usb/if_mos.c 7 Jul 2019 06:40:10 -0000 1.40
>>> +++ sys/dev/usb/if_mos.c 8 Jun 2020 15:15:42 -0000
>>> @@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
>>> /* Transmit */
>>> err = usbd_transfer(c->mos_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->mos_mbuf = NULL;
>>> mos_stop(sc);
>>> return(EIO);
>>> }
>>> @@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (mos_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> /*
>>> * If there's a BPF listener, bounce a copy of this frame
>>> Index: sys/dev/usb/if_mue.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
>>> retrieving revision 1.7
>>> diff -u -p -u -p -r1.7 if_mue.c
>>> --- sys/dev/usb/if_mue.c 7 Jul 2019 06:40:10 -0000 1.7
>>> +++ sys/dev/usb/if_mue.c 8 Jun 2020 14:55:07 -0000
>>> @@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
>>> /* Transmit */
>>> err = usbd_transfer(c->mue_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->mue_mbuf = NULL;
>>> mue_stop(sc);
>>> return(EIO);
>>> }
>>> @@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (mue_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> /* If there's a BPF listener, bounce a copy of this frame to him. */
>>> #if NBPFILTER > 0
>>> Index: sys/dev/usb/if_smsc.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
>>> retrieving revision 1.34
>>> diff -u -p -u -p -r1.34 if_smsc.c
>>> --- sys/dev/usb/if_smsc.c 8 Apr 2020 09:49:32 -0000 1.34
>>> +++ sys/dev/usb/if_smsc.c 8 Jun 2020 15:02:20 -0000
>>> @@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
>>> return;
>>> }
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (smsc_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> #if NBPFILTER > 0
>>> if (ifp->if_bpf)
>>> @@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct
>>>
>>> err = usbd_transfer(c->sc_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->sc_mbuf = NULL;
>>> smsc_stop(sc);
>>> return (EIO);
>>> }
>>> Index: sys/dev/usb/if_ugl.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
>>> retrieving revision 1.23
>>> diff -u -p -u -p -r1.23 if_ugl.c
>>> --- sys/dev/usb/if_ugl.c 2 Oct 2018 19:49:10 -0000 1.23
>>> +++ sys/dev/usb/if_ugl.c 8 Jun 2020 15:16:09 -0000
>>> @@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
>>> if (err != USBD_IN_PROGRESS) {
>>> printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
>>>       usbd_errstr(err));
>>> + c->ugl_mbuf = NULL;
>>> ugl_stop(sc);
>>> return (EIO);
>>> }
>>> @@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (ugl_send(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> -
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> #if NBPFILTER > 0
>>> /*
>>> Index: sys/dev/usb/if_upl.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
>>> retrieving revision 1.75
>>> diff -u -p -u -p -r1.75 if_upl.c
>>> --- sys/dev/usb/if_upl.c 2 Oct 2018 19:49:10 -0000 1.75
>>> +++ sys/dev/usb/if_upl.c 8 Jun 2020 15:06:43 -0000
>>> @@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
>>> if (err != USBD_IN_PROGRESS) {
>>> printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
>>>       usbd_errstr(err));
>>> + c->upl_mbuf = NULL;
>>> upl_stop(sc);
>>> return (EIO);
>>> }
>>> @@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
>>> if (ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (upl_send(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> -
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> #if NBPFILTER > 0
>>> /*
>>> Index: sys/dev/usb/if_ure.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
>>> retrieving revision 1.14
>>> diff -u -p -u -p -r1.14 if_ure.c
>>> --- sys/dev/usb/if_ure.c 10 Mar 2020 01:11:30 -0000 1.14
>>> +++ sys/dev/usb/if_ure.c 8 Jun 2020 15:12:53 -0000
>>> @@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
>>> break;
>>> }
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> break;
>>>
>>> if (ure_encap(sc, m_head)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> break;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> #if NBPFILTER > 0
>>> if (ifp->if_bpf)
>>> @@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m
>>>
>>> err = usbd_transfer(c->uc_xfer);
>>> if (err != 0 && err != USBD_IN_PROGRESS) {
>>> + c->uc_mbuf = NULL;
>>> ure_stop(sc);
>>> return (EIO);
>>> }
>>> Index: sys/dev/usb/if_urndis.c
>>> ===================================================================
>>> RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
>>> retrieving revision 1.69
>>> diff -u -p -u -p -r1.69 if_urndis.c
>>> --- sys/dev/usb/if_urndis.c 22 Jan 2019 18:06:05 -0000 1.69
>>> +++ sys/dev/usb/if_urndis.c 8 Jun 2020 15:14:57 -0000
>>> @@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
>>> /* Transmit */
>>> err = usbd_transfer(c->sc_xfer);
>>> if (err != USBD_IN_PROGRESS) {
>>> + c->sc_mbuf = NULL;
>>> urndis_stop(sc);
>>> return(EIO);
>>> }
>>> @@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
>>> if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
>>> return;
>>>
>>> - m_head = ifq_deq_begin(&ifp->if_snd);
>>> + IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>> if (m_head == NULL)
>>> return;
>>>
>>> if (urndis_encap(sc, m_head, 0)) {
>>> - ifq_deq_rollback(&ifp->if_snd, m_head);
>>> + m_freem(m_head);
>>> ifq_set_oactive(&ifp->if_snd);
>>> return;
>>> }
>>> - ifq_deq_commit(&ifp->if_snd, m_head);
>>>
>>> /*
>>> * If there's a BPF listener, bounce a copy of this frame
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Gerhard Roth-2
On 2020-06-13 01:24, Łukasz Lejtkowski wrote:

> Good news - no more kernel panics on USB 3.0(xHCI), it’s fixed.
>
> Bad news - after 2-3h LTE modem lost local network connection via USB
> 3.0(cdce0). I have to remove modem and put it back to usb port - then
> local network connection between OpenBSD and modem back for 2-3h,
> sometimes 30-40 min. It looks like the same problem as kernel panic, but
> this time there is lost network connection via usb 3.0(xhci).
>
> root@master[~]ping 192.168.8.1
> PING 192.168.8.1 (192.168.8.1): 56 data bytes
> ping: sendmsg: Network is down
> ping: wrote 192.168.8.1 64 chars, ret=-1
> ping: sendmsg: Network is down
> ping: wrote 192.168.8.1 64 chars, ret=-1
>
> 192.168.8.1 is default static IP on lte modem.
>
> Your changes in if_cdce.c 1.77 not completely fix the problem.

Hi,

yes, my patch just targeted to fix the panic as a reaction to USB
problems; not the USB problems themself.

Does it recover after doing

        # ifconfig cdcef0 down
        # ifconfig cdcef0 up

Gerhard

>
>
>> On 11 Jun 2020, at 11:13, Łukasz Lejtkowski <[hidden email]
>> <mailto:[hidden email]>> wrote:
>>
>> Hi Gerhard,
>>
>> Today I added Your patches to 6.7-stable and moved back LTE modem to
>> USB 3.0. So, just waiting for… nothing or kernel panic. I’ll let you
>> know.
>>
>>> On 8 Jun 2020, at 19:13, Patrick Wildt <[hidden email]
>>> <mailto:[hidden email]>> wrote:
>>>
>>> On Mon, Jun 08, 2020 at 05:31:44PM +0200, Gerhard Roth wrote:
>>>> On 2020-05-25 13:19, Martin Pieuchot wrote:
>>>>> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>>>>>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>>>>>> From: Łukasz Lejtkowski <[hidden email]
>>>>>>>> <mailto:[hidden email]>>
>>>>>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>>>>>
>>>>>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>>>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>>>>>
>>>>>>> That might be why the device stops responding.  The fact that
>>>>>>> cleaning
>>>>>>> up from a failed USB transaction leads to this panic is a bug though.
>>>>>>>
>>>>>>> And somebody just posted a very similar panic with ure(4).  Something
>>>>>>> in the network stack is holding a mutex when it shouldn't.
>>>>>>
>>>>>> I think that holding the mutex is ok. The bug is calling the stop
>>>>>> routine in case of errors.
>>>>>>
>>>>>> This is what common foo_start() does:
>>>>>>
>>>>>> m_head = ifq_deq_begin(&ifp->if_snd);
>>>>>> if (foo_encap(sc, m_head, 0)) {
>>>>>> ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>>> ...
>>>>>> return;
>>>>>> }
>>>>>> ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>>
>>>>>> Here, ifq_deq_begin() grabs a mutex and it is held while
>>>>>> calling foo_encap().
>>>>>>
>>>>>> For USB network interfaces foo_encap() mostly does this:
>>>>>>
>>>>>> err = usbd_transfer(sc->sc_xfer);
>>>>>> if (err != USBD_IN_PROGRESS) {
>>>>>> foo_stop(sc);
>>>>>> return EIO;
>>>>>> }
>>>>>>
>>>>>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>>>>>> which might sleep.
>>>>>>
>>>>>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>>>>>> possibly dropping the current mbuf if encap fails (who cares
>>>>>> for the packets after foo_stop() anyway).
>>>>>
>>>>> That's the approach taken by drivers using ifq_dequeue(9) instead of
>>>>> ifq_deq_begin/commit().
>>>>>
>>>>>> Or change all the drivers to follow the path that if_aue.c takes:
>>>>>>
>>>>>> err = usbd_transfer(c->aue_xfer);
>>>>>> if (err != USBD_IN_PROGRESS) {
>>>>>> ...
>>>>>> /* Stop the interface from process context. */
>>>>>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>>>>>> return (EIO);
>>>>>> }
>>>>>
>>>>> That's just trading the current problem for another one with higher
>>>>> complexity.
>>>>>
>>>>>> Any ideas, what's better? Or alternative proposals?
>>>>>
>>>>> Using ifq_dequeue(9) would have the advantage of unifying the code
>>>>> base.
>>>>> It introduces a behavior change.  A simpler fix would be to call
>>>>> foo_stop() in the error path after ifq_deq_rollback().
>>>>>
>>>>
>>>> Hi,
>>>>
>>>> two weeks passed any nobody objected Martin's proposal. So I thought,
>>>> we could try to move on this way.
>>>>
>>>> Gerhard
>>>>
>>>
>>> From what I remember from various discussions, the goal should be to
>>> check if there's a buffer free in the ring, then dequeue and send, and
>>> it it can't be sent out, then drop it.  With USB apparently those
>>> drivers "always" have an open buffer, so we can just dequeue and send,
>>> like you do in this diff.  And if it gets dropped, that's fine.
>>>
>>> That said, I think IFQ_DEQUEUE() is old compat code, and we actually
>>> nowadays prefer:
>>>
>>> m_head = ifq_dequeue(&ifp->if_snd);
>>>
>>> If you look at the define for IFQ_DEQUEUE() you'll see it's marked
>>> as compat code.  If you look at a new driver, like ixl(4), you'll
>>> see that it also uses ifq_dequeue().
>>>
>>> Sorry to to give you some work, but with that fixed: ok patrick@
>>>
>>> Patrick
>>>
>>>>
>>>> Index: sys/dev/usb/if_axe.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
>>>> retrieving revision 1.139
>>>> diff -u -p -u -p -r1.139 if_axe.c
>>>> --- sys/dev/usb/if_axe.c7 Jul 2019 06:40:10 -00001.139
>>>> +++ sys/dev/usb/if_axe.c8 Jun 2020 15:13:25 -0000
>>>> @@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
>>>> /* Transmit */
>>>> err = usbd_transfer(c->axe_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->axe_mbuf = NULL;
>>>> axe_stop(sc);
>>>> return(EIO);
>>>> }
>>>> @@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (axe_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> /*
>>>> * If there's a BPF listener, bounce a copy of this frame
>>>> Index: sys/dev/usb/if_axen.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
>>>> retrieving revision 1.27
>>>> diff -u -p -u -p -r1.27 if_axen.c
>>>> --- sys/dev/usb/if_axen.c7 Jul 2019 06:40:10 -00001.27
>>>> +++ sys/dev/usb/if_axen.c8 Jun 2020 14:49:26 -0000
>>>> @@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
>>>> /* Transmit */
>>>> err = usbd_transfer(c->axen_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->axen_mbuf = NULL;
>>>> axen_stop(sc);
>>>> return EIO;
>>>> }
>>>> @@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (axen_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> /*
>>>> * If there's a BPF listener, bounce a copy of this frame
>>>> Index: sys/dev/usb/if_cdce.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
>>>> retrieving revision 1.76
>>>> diff -u -p -u -p -r1.76 if_cdce.c
>>>> --- sys/dev/usb/if_cdce.c14 Nov 2019 13:50:55 -00001.76
>>>> +++ sys/dev/usb/if_cdce.c8 Jun 2020 14:50:40 -0000
>>>> @@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
>>>> if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (cdce_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>>
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>> -
>>>> #if NBPFILTER > 0
>>>> if (ifp->if_bpf)
>>>> bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
>>>> @@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
>>>>    10000, cdce_txeof);
>>>> err = usbd_transfer(c->cdce_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->cdce_mbuf = NULL;
>>>> cdce_stop(sc);
>>>> return (EIO);
>>>> }
>>>> Index: sys/dev/usb/if_kue.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
>>>> retrieving revision 1.89
>>>> diff -u -p -u -p -r1.89 if_kue.c
>>>> --- sys/dev/usb/if_kue.c2 Oct 2018 19:49:10 -00001.89
>>>> +++ sys/dev/usb/if_kue.c8 Jun 2020 14:52:27 -0000
>>>> @@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
>>>> if (err != USBD_IN_PROGRESS) {
>>>> printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
>>>>       usbd_errstr(err));
>>>> +c->kue_mbuf = NULL;
>>>> kue_stop(sc);
>>>> return (EIO);
>>>> }
>>>> @@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (kue_send(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> #if NBPFILTER > 0
>>>> /*
>>>> Index: sys/dev/usb/if_mos.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
>>>> retrieving revision 1.40
>>>> diff -u -p -u -p -r1.40 if_mos.c
>>>> --- sys/dev/usb/if_mos.c7 Jul 2019 06:40:10 -00001.40
>>>> +++ sys/dev/usb/if_mos.c8 Jun 2020 15:15:42 -0000
>>>> @@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
>>>> /* Transmit */
>>>> err = usbd_transfer(c->mos_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->mos_mbuf = NULL;
>>>> mos_stop(sc);
>>>> return(EIO);
>>>> }
>>>> @@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (mos_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> /*
>>>> * If there's a BPF listener, bounce a copy of this frame
>>>> Index: sys/dev/usb/if_mue.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
>>>> retrieving revision 1.7
>>>> diff -u -p -u -p -r1.7 if_mue.c
>>>> --- sys/dev/usb/if_mue.c7 Jul 2019 06:40:10 -00001.7
>>>> +++ sys/dev/usb/if_mue.c8 Jun 2020 14:55:07 -0000
>>>> @@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
>>>> /* Transmit */
>>>> err = usbd_transfer(c->mue_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->mue_mbuf = NULL;
>>>> mue_stop(sc);
>>>> return(EIO);
>>>> }
>>>> @@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (mue_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> /* If there's a BPF listener, bounce a copy of this frame to him. */
>>>> #if NBPFILTER > 0
>>>> Index: sys/dev/usb/if_smsc.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
>>>> retrieving revision 1.34
>>>> diff -u -p -u -p -r1.34 if_smsc.c
>>>> --- sys/dev/usb/if_smsc.c8 Apr 2020 09:49:32 -00001.34
>>>> +++ sys/dev/usb/if_smsc.c8 Jun 2020 15:02:20 -0000
>>>> @@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
>>>> return;
>>>> }
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (smsc_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> #if NBPFILTER > 0
>>>> if (ifp->if_bpf)
>>>> @@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct
>>>>
>>>> err = usbd_transfer(c->sc_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->sc_mbuf = NULL;
>>>> smsc_stop(sc);
>>>> return (EIO);
>>>> }
>>>> Index: sys/dev/usb/if_ugl.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
>>>> retrieving revision 1.23
>>>> diff -u -p -u -p -r1.23 if_ugl.c
>>>> --- sys/dev/usb/if_ugl.c2 Oct 2018 19:49:10 -00001.23
>>>> +++ sys/dev/usb/if_ugl.c8 Jun 2020 15:16:09 -0000
>>>> @@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
>>>> if (err != USBD_IN_PROGRESS) {
>>>> printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
>>>>       usbd_errstr(err));
>>>> +c->ugl_mbuf = NULL;
>>>> ugl_stop(sc);
>>>> return (EIO);
>>>> }
>>>> @@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (ugl_send(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> #if NBPFILTER > 0
>>>> /*
>>>> Index: sys/dev/usb/if_upl.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
>>>> retrieving revision 1.75
>>>> diff -u -p -u -p -r1.75 if_upl.c
>>>> --- sys/dev/usb/if_upl.c2 Oct 2018 19:49:10 -00001.75
>>>> +++ sys/dev/usb/if_upl.c8 Jun 2020 15:06:43 -0000
>>>> @@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
>>>> if (err != USBD_IN_PROGRESS) {
>>>> printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
>>>>       usbd_errstr(err));
>>>> +c->upl_mbuf = NULL;
>>>> upl_stop(sc);
>>>> return (EIO);
>>>> }
>>>> @@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (upl_send(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> #if NBPFILTER > 0
>>>> /*
>>>> Index: sys/dev/usb/if_ure.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
>>>> retrieving revision 1.14
>>>> diff -u -p -u -p -r1.14 if_ure.c
>>>> --- sys/dev/usb/if_ure.c10 Mar 2020 01:11:30 -00001.14
>>>> +++ sys/dev/usb/if_ure.c8 Jun 2020 15:12:53 -0000
>>>> @@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
>>>> break;
>>>> }
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> break;
>>>>
>>>> if (ure_encap(sc, m_head)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> break;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> #if NBPFILTER > 0
>>>> if (ifp->if_bpf)
>>>> @@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m
>>>>
>>>> err = usbd_transfer(c->uc_xfer);
>>>> if (err != 0 && err != USBD_IN_PROGRESS) {
>>>> +c->uc_mbuf = NULL;
>>>> ure_stop(sc);
>>>> return (EIO);
>>>> }
>>>> Index: sys/dev/usb/if_urndis.c
>>>> ===================================================================
>>>> RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
>>>> retrieving revision 1.69
>>>> diff -u -p -u -p -r1.69 if_urndis.c
>>>> --- sys/dev/usb/if_urndis.c22 Jan 2019 18:06:05 -00001.69
>>>> +++ sys/dev/usb/if_urndis.c8 Jun 2020 15:14:57 -0000
>>>> @@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
>>>> /* Transmit */
>>>> err = usbd_transfer(c->sc_xfer);
>>>> if (err != USBD_IN_PROGRESS) {
>>>> +c->sc_mbuf = NULL;
>>>> urndis_stop(sc);
>>>> return(EIO);
>>>> }
>>>> @@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
>>>> if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
>>>> return;
>>>>
>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>> if (m_head == NULL)
>>>> return;
>>>>
>>>> if (urndis_encap(sc, m_head, 0)) {
>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>> +m_freem(m_head);
>>>> ifq_set_oactive(&ifp->if_snd);
>>>> return;
>>>> }
>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>
>>>> /*
>>>> * If there's a BPF listener, bounce a copy of this frame
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: OpenBSD 6.7 crashes on APU2C4 with LTE modem Huawei E3372s-153 HiLink

Łukasz Lejtkowski
> Does it recover after doing
>
> # ifconfig cdcef0 down
> # ifconfig cdcef0 up

root@master[~]ifconfig cdce0
cdce0: flags=8c03<UP,BROADCAST,OACTIVE,SIMPLEX,MULTICAST> mtu 1500
        lladdr xx:xx:xx:xx:xx:xx
        index 30 priority 0 llprio 3
        inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255

root@master[~]ping 192.168.8.1
PING 192.168.8.1 (192.168.8.1): 56 data bytes
ping: sendmsg: Network is down
ping: wrote 192.168.8.1 64 chars, ret=-1
ping: sendmsg: Network is down
ping: wrote 192.168.8.1 64 chars, ret=-1
ping: sendmsg: Network is down

root@master[~]ifconfig cdce0 down
root@master[~]ifconfig cdce0 up

root@master[~]ping 192.168.8.1
PING 192.168.8.1 (192.168.8.1): 56 data bytes
64 bytes from 192.168.8.1: icmp_seq=0 ttl=64 time=20.804 ms
64 bytes from 192.168.8.1: icmp_seq=1 ttl=64 time=13.976 ms
64 bytes from 192.168.8.1: icmp_seq=2 ttl=64 time=14.468 ms

Probably some good sign for You to next patch?


> On 15 Jun 2020, at 20:09, Gerhard Roth <[hidden email]> wrote:
>
> On 2020-06-13 01:24, Łukasz Lejtkowski wrote:
>> Good news - no more kernel panics on USB 3.0(xHCI), it’s fixed.
>> Bad news - after 2-3h LTE modem lost local network connection via USB 3.0(cdce0). I have to remove modem and put it back to usb port - then local network connection between OpenBSD and modem back for 2-3h, sometimes 30-40 min. It looks like the same problem as kernel panic, but this time there is lost network connection via usb 3.0(xhci).
>> root@master[~]ping 192.168.8.1
>> PING 192.168.8.1 (192.168.8.1): 56 data bytes
>> ping: sendmsg: Network is down
>> ping: wrote 192.168.8.1 64 chars, ret=-1
>> ping: sendmsg: Network is down
>> ping: wrote 192.168.8.1 64 chars, ret=-1
>> 192.168.8.1 is default static IP on lte modem.
>> Your changes in if_cdce.c 1.77 not completely fix the problem.
>
> Hi,
>
> yes, my patch just targeted to fix the panic as a reaction to USB problems; not the USB problems themself.
>
> Does it recover after doing
>
> # ifconfig cdcef0 down
> # ifconfig cdcef0 up
>
> Gerhard
>
>>> On 11 Jun 2020, at 11:13, Łukasz Lejtkowski <[hidden email] <mailto:[hidden email]>> wrote:
>>>
>>> Hi Gerhard,
>>>
>>> Today I added Your patches to 6.7-stable and moved back LTE modem to USB 3.0. So, just waiting for… nothing or kernel panic. I’ll let you know.
>>>
>>>> On 8 Jun 2020, at 19:13, Patrick Wildt <[hidden email] <mailto:[hidden email]>> wrote:
>>>>
>>>> On Mon, Jun 08, 2020 at 05:31:44PM +0200, Gerhard Roth wrote:
>>>>> On 2020-05-25 13:19, Martin Pieuchot wrote:
>>>>>> On 25/05/20(Mon) 12:56, Gerhard Roth wrote:
>>>>>>> On 5/22/20 9:05 PM, Mark Kettenis wrote:
>>>>>>>>> From: Łukasz Lejtkowski <[hidden email] <mailto:[hidden email]>>
>>>>>>>>> Date: Fri, 22 May 2020 20:51:57 +0200
>>>>>>>>>
>>>>>>>>> Probably power supply 12 V is broken. Showing 16,87 V(Fluke 179) -
>>>>>>>>> too high. Should be 12,25-12,50 V. I replaced to the new one.
>>>>>>>>
>>>>>>>> That might be why the device stops responding.  The fact that cleaning
>>>>>>>> up from a failed USB transaction leads to this panic is a bug though.
>>>>>>>>
>>>>>>>> And somebody just posted a very similar panic with ure(4).  Something
>>>>>>>> in the network stack is holding a mutex when it shouldn't.
>>>>>>>
>>>>>>> I think that holding the mutex is ok. The bug is calling the stop
>>>>>>> routine in case of errors.
>>>>>>>
>>>>>>> This is what common foo_start() does:
>>>>>>>
>>>>>>> m_head = ifq_deq_begin(&ifp->if_snd);
>>>>>>> if (foo_encap(sc, m_head, 0)) {
>>>>>>> ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>>>> ...
>>>>>>> return;
>>>>>>> }
>>>>>>> ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>>>
>>>>>>> Here, ifq_deq_begin() grabs a mutex and it is held while
>>>>>>> calling foo_encap().
>>>>>>>
>>>>>>> For USB network interfaces foo_encap() mostly does this:
>>>>>>>
>>>>>>> err = usbd_transfer(sc->sc_xfer);
>>>>>>> if (err != USBD_IN_PROGRESS) {
>>>>>>> foo_stop(sc);
>>>>>>> return EIO;
>>>>>>> }
>>>>>>>
>>>>>>> And foo_stop() calls usbd_abort_pipe() -> xhci_command_submit(),
>>>>>>> which might sleep.
>>>>>>>
>>>>>>> How to fix? We could do the foo_encap() after the ifq_deq_commit(),
>>>>>>> possibly dropping the current mbuf if encap fails (who cares
>>>>>>> for the packets after foo_stop() anyway).
>>>>>>
>>>>>> That's the approach taken by drivers using ifq_dequeue(9) instead of
>>>>>> ifq_deq_begin/commit().
>>>>>>
>>>>>>> Or change all the drivers to follow the path that if_aue.c takes:
>>>>>>>
>>>>>>> err = usbd_transfer(c->aue_xfer);
>>>>>>> if (err != USBD_IN_PROGRESS) {
>>>>>>> ...
>>>>>>> /* Stop the interface from process context. */
>>>>>>> usb_add_task(sc->aue_udev, &sc->aue_stop_task);
>>>>>>> return (EIO);
>>>>>>> }
>>>>>>
>>>>>> That's just trading the current problem for another one with higher
>>>>>> complexity.
>>>>>>
>>>>>>> Any ideas, what's better? Or alternative proposals?
>>>>>>
>>>>>> Using ifq_dequeue(9) would have the advantage of unifying the code base.
>>>>>> It introduces a behavior change.  A simpler fix would be to call
>>>>>> foo_stop() in the error path after ifq_deq_rollback().
>>>>>>
>>>>>
>>>>> Hi,
>>>>>
>>>>> two weeks passed any nobody objected Martin's proposal. So I thought,
>>>>> we could try to move on this way.
>>>>>
>>>>> Gerhard
>>>>>
>>>>
>>>> From what I remember from various discussions, the goal should be to
>>>> check if there's a buffer free in the ring, then dequeue and send, and
>>>> it it can't be sent out, then drop it.  With USB apparently those
>>>> drivers "always" have an open buffer, so we can just dequeue and send,
>>>> like you do in this diff.  And if it gets dropped, that's fine.
>>>>
>>>> That said, I think IFQ_DEQUEUE() is old compat code, and we actually
>>>> nowadays prefer:
>>>>
>>>> m_head = ifq_dequeue(&ifp->if_snd);
>>>>
>>>> If you look at the define for IFQ_DEQUEUE() you'll see it's marked
>>>> as compat code.  If you look at a new driver, like ixl(4), you'll
>>>> see that it also uses ifq_dequeue().
>>>>
>>>> Sorry to to give you some work, but with that fixed: ok patrick@
>>>>
>>>> Patrick
>>>>
>>>>>
>>>>> Index: sys/dev/usb/if_axe.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
>>>>> retrieving revision 1.139
>>>>> diff -u -p -u -p -r1.139 if_axe.c
>>>>> --- sys/dev/usb/if_axe.c7 Jul 2019 06:40:10 -00001.139
>>>>> +++ sys/dev/usb/if_axe.c8 Jun 2020 15:13:25 -0000
>>>>> @@ -1223,6 +1223,7 @@ axe_encap(struct axe_softc *sc, struct m
>>>>> /* Transmit */
>>>>> err = usbd_transfer(c->axe_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->axe_mbuf = NULL;
>>>>> axe_stop(sc);
>>>>> return(EIO);
>>>>> }
>>>>> @@ -1246,16 +1247,15 @@ axe_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (axe_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> /*
>>>>> * If there's a BPF listener, bounce a copy of this frame
>>>>> Index: sys/dev/usb/if_axen.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
>>>>> retrieving revision 1.27
>>>>> diff -u -p -u -p -r1.27 if_axen.c
>>>>> --- sys/dev/usb/if_axen.c7 Jul 2019 06:40:10 -00001.27
>>>>> +++ sys/dev/usb/if_axen.c8 Jun 2020 14:49:26 -0000
>>>>> @@ -1186,6 +1186,7 @@ axen_encap(struct axen_softc *sc, struct
>>>>> /* Transmit */
>>>>> err = usbd_transfer(c->axen_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->axen_mbuf = NULL;
>>>>> axen_stop(sc);
>>>>> return EIO;
>>>>> }
>>>>> @@ -1209,16 +1210,15 @@ axen_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (axen_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> /*
>>>>> * If there's a BPF listener, bounce a copy of this frame
>>>>> Index: sys/dev/usb/if_cdce.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
>>>>> retrieving revision 1.76
>>>>> diff -u -p -u -p -r1.76 if_cdce.c
>>>>> --- sys/dev/usb/if_cdce.c14 Nov 2019 13:50:55 -00001.76
>>>>> +++ sys/dev/usb/if_cdce.c8 Jun 2020 14:50:40 -0000
>>>>> @@ -375,18 +375,16 @@ cdce_start(struct ifnet *ifp)
>>>>> if (usbd_is_dying(sc->cdce_udev) || ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (cdce_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>>
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>> -
>>>>> #if NBPFILTER > 0
>>>>> if (ifp->if_bpf)
>>>>> bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
>>>>> @@ -422,6 +420,7 @@ cdce_encap(struct cdce_softc *sc, struct
>>>>>    10000, cdce_txeof);
>>>>> err = usbd_transfer(c->cdce_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->cdce_mbuf = NULL;
>>>>> cdce_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> Index: sys/dev/usb/if_kue.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
>>>>> retrieving revision 1.89
>>>>> diff -u -p -u -p -r1.89 if_kue.c
>>>>> --- sys/dev/usb/if_kue.c2 Oct 2018 19:49:10 -00001.89
>>>>> +++ sys/dev/usb/if_kue.c8 Jun 2020 14:52:27 -0000
>>>>> @@ -829,6 +829,7 @@ kue_send(struct kue_softc *sc, struct mb
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> printf("%s: kue_send error=%s\n", sc->kue_dev.dv_xname,
>>>>>       usbd_errstr(err));
>>>>> +c->kue_mbuf = NULL;
>>>>> kue_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> @@ -852,17 +853,15 @@ kue_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (kue_send(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> #if NBPFILTER > 0
>>>>> /*
>>>>> Index: sys/dev/usb/if_mos.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
>>>>> retrieving revision 1.40
>>>>> diff -u -p -u -p -r1.40 if_mos.c
>>>>> --- sys/dev/usb/if_mos.c7 Jul 2019 06:40:10 -00001.40
>>>>> +++ sys/dev/usb/if_mos.c8 Jun 2020 15:15:42 -0000
>>>>> @@ -1097,6 +1097,7 @@ mos_encap(struct mos_softc *sc, struct m
>>>>> /* Transmit */
>>>>> err = usbd_transfer(c->mos_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->mos_mbuf = NULL;
>>>>> mos_stop(sc);
>>>>> return(EIO);
>>>>> }
>>>>> @@ -1120,16 +1121,15 @@ mos_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (mos_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> /*
>>>>> * If there's a BPF listener, bounce a copy of this frame
>>>>> Index: sys/dev/usb/if_mue.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
>>>>> retrieving revision 1.7
>>>>> diff -u -p -u -p -r1.7 if_mue.c
>>>>> --- sys/dev/usb/if_mue.c7 Jul 2019 06:40:10 -00001.7
>>>>> +++ sys/dev/usb/if_mue.c8 Jun 2020 14:55:07 -0000
>>>>> @@ -987,6 +987,7 @@ mue_encap(struct mue_softc *sc, struct m
>>>>> /* Transmit */
>>>>> err = usbd_transfer(c->mue_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->mue_mbuf = NULL;
>>>>> mue_stop(sc);
>>>>> return(EIO);
>>>>> }
>>>>> @@ -1308,16 +1309,15 @@ mue_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (mue_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> /* If there's a BPF listener, bounce a copy of this frame to him. */
>>>>> #if NBPFILTER > 0
>>>>> Index: sys/dev/usb/if_smsc.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
>>>>> retrieving revision 1.34
>>>>> diff -u -p -u -p -r1.34 if_smsc.c
>>>>> --- sys/dev/usb/if_smsc.c8 Apr 2020 09:49:32 -00001.34
>>>>> +++ sys/dev/usb/if_smsc.c8 Jun 2020 15:02:20 -0000
>>>>> @@ -649,16 +649,15 @@ smsc_start(struct ifnet *ifp)
>>>>> return;
>>>>> }
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (smsc_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> #if NBPFILTER > 0
>>>>> if (ifp->if_bpf)
>>>>> @@ -1400,6 +1399,7 @@ smsc_encap(struct smsc_softc *sc, struct
>>>>>
>>>>> err = usbd_transfer(c->sc_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->sc_mbuf = NULL;
>>>>> smsc_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> Index: sys/dev/usb/if_ugl.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
>>>>> retrieving revision 1.23
>>>>> diff -u -p -u -p -r1.23 if_ugl.c
>>>>> --- sys/dev/usb/if_ugl.c2 Oct 2018 19:49:10 -00001.23
>>>>> +++ sys/dev/usb/if_ugl.c8 Jun 2020 15:16:09 -0000
>>>>> @@ -566,6 +566,7 @@ ugl_send(struct ugl_softc *sc, struct mb
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname,
>>>>>       usbd_errstr(err));
>>>>> +c->ugl_mbuf = NULL;
>>>>> ugl_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> @@ -589,17 +590,15 @@ ugl_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (ugl_send(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> #if NBPFILTER > 0
>>>>> /*
>>>>> Index: sys/dev/usb/if_upl.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
>>>>> retrieving revision 1.75
>>>>> diff -u -p -u -p -r1.75 if_upl.c
>>>>> --- sys/dev/usb/if_upl.c2 Oct 2018 19:49:10 -00001.75
>>>>> +++ sys/dev/usb/if_upl.c8 Jun 2020 15:06:43 -0000
>>>>> @@ -546,6 +546,7 @@ upl_send(struct upl_softc *sc, struct mb
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> printf("%s: upl_send error=%s\n", sc->sc_dev.dv_xname,
>>>>>       usbd_errstr(err));
>>>>> +c->upl_mbuf = NULL;
>>>>> upl_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> @@ -569,17 +570,15 @@ upl_start(struct ifnet *ifp)
>>>>> if (ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (upl_send(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> #if NBPFILTER > 0
>>>>> /*
>>>>> Index: sys/dev/usb/if_ure.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
>>>>> retrieving revision 1.14
>>>>> diff -u -p -u -p -r1.14 if_ure.c
>>>>> --- sys/dev/usb/if_ure.c10 Mar 2020 01:11:30 -00001.14
>>>>> +++ sys/dev/usb/if_ure.c8 Jun 2020 15:12:53 -0000
>>>>> @@ -775,16 +775,15 @@ ure_start(struct ifnet *ifp)
>>>>> break;
>>>>> }
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> break;
>>>>>
>>>>> if (ure_encap(sc, m_head)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> break;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> #if NBPFILTER > 0
>>>>> if (ifp->if_bpf)
>>>>> @@ -1933,6 +1932,7 @@ ure_encap(struct ure_softc *sc, struct m
>>>>>
>>>>> err = usbd_transfer(c->uc_xfer);
>>>>> if (err != 0 && err != USBD_IN_PROGRESS) {
>>>>> +c->uc_mbuf = NULL;
>>>>> ure_stop(sc);
>>>>> return (EIO);
>>>>> }
>>>>> Index: sys/dev/usb/if_urndis.c
>>>>> ===================================================================
>>>>> RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
>>>>> retrieving revision 1.69
>>>>> diff -u -p -u -p -r1.69 if_urndis.c
>>>>> --- sys/dev/usb/if_urndis.c22 Jan 2019 18:06:05 -00001.69
>>>>> +++ sys/dev/usb/if_urndis.c8 Jun 2020 15:14:57 -0000
>>>>> @@ -804,6 +804,7 @@ urndis_encap(struct urndis_softc *sc, st
>>>>> /* Transmit */
>>>>> err = usbd_transfer(c->sc_xfer);
>>>>> if (err != USBD_IN_PROGRESS) {
>>>>> +c->sc_mbuf = NULL;
>>>>> urndis_stop(sc);
>>>>> return(EIO);
>>>>> }
>>>>> @@ -1190,16 +1191,15 @@ urndis_start(struct ifnet *ifp)
>>>>> if (usbd_is_dying(sc->sc_udev) || ifq_is_oactive(&ifp->if_snd))
>>>>> return;
>>>>>
>>>>> -m_head = ifq_deq_begin(&ifp->if_snd);
>>>>> +IFQ_DEQUEUE(&ifp->if_snd, m_head);
>>>>> if (m_head == NULL)
>>>>> return;
>>>>>
>>>>> if (urndis_encap(sc, m_head, 0)) {
>>>>> -ifq_deq_rollback(&ifp->if_snd, m_head);
>>>>> +m_freem(m_head);
>>>>> ifq_set_oactive(&ifp->if_snd);
>>>>> return;
>>>>> }
>>>>> -ifq_deq_commit(&ifp->if_snd, m_head);
>>>>>
>>>>> /*
>>>>> * If there's a BPF listener, bounce a copy of this frame
>>>