Linux
November 5, 2022

Проблема определения Wi-Fi адаптера (Driver CDROM Mode)

Несколько дней назад, утром включив комп столкнулся с проблемой определения wifi адаптера, начал определяться как usb накопитель. Причем поведение было довольно странным, в течение дня при перезагрузке адаптер спокойно переключался, а вот отключения компа вечером и включении утром, переключения не происходило.

Будем исправлять это недоразумение и возвращать к жизни.

Первым делом смотрим выхлоп dmesg:

sudo dmesg
...
[ 3301.659616] usb 5-2: new high-speed USB device number 7 using xhci_hcd
[ 3301.785827] usb 5-2: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 2.00
[ 3301.785831] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3301.785832] usb 5-2: Product: DISK
[ 3301.785833] usb 5-2: Manufacturer: Realtek
[ 3301.786145] usb-storage 5-2:1.0: USB Mass Storage device detected
[ 3301.786243] scsi host9: usb-storage 5-2:1.0
[ 3302.829042] scsi 9:0:0:0: Direct-Access     Realtek  Driver Storage   1.00 PQ: 0 ANSI: 0 CCS
[ 3302.829551] sd 9:0:0:0: [sdc] 16000 512-byte logical blocks: (8.19 MB/7.81 MiB)
[ 3302.831718] sd 9:0:0:0: [sdc] Write Protect is on
[ 3302.831721] sd 9:0:0:0: [sdc] Mode Sense: 03 00 80 00
[ 3302.833913] sd 9:0:0:0: [sdc] No Caching mode page found
[ 3302.833915] sd 9:0:0:0: [sdc] Assuming drive cache: write through
[ 3302.842540]  sdc:
[ 3302.847716] sd 9:0:0:0: [sdc] Attached SCSI removable disk
[ 3308.789677] FAT-fs (sdc): utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!
...

Здесь нас интересуют значения idVendor=0bda, idProduct=1a2b

Вывод inxi:

inxi -n

Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet
    driver: r8168
  IF: enp9s0 state: up speed: 100 Mbps duplex: full mac: 1X:c0:XX:52:fX:XX
  Device-2: Realtek RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode)
    type: USB driver: usb-storage

Для начала попробуем переключить режим в ручную, в помощью usb_modeswitch подставив значения idVendor=0bda, idProduct=1a2b

sudo usb_modeswitch -KW -v 0bda -p 1a2b

Смотрим выхлоп dmesg и inxi, если устройство переключилось, увидим это

sudo dmesg

[ 3358.643200] usb 5-2: reset high-speed USB device number 7 using xhci_hcd
[ 3359.230195] usb 5-2: reset high-speed USB device number 7 using xhci_hcd
[ 3380.555958] usb 5-2: USB disconnect, device number 7
[ 3380.893007] usb 5-2: new high-speed USB device number 8 using xhci_hcd
[ 3381.019271] usb 5-2: New USB device found, idVendor=0bda, idProduct=c811, bcdDevice= 2.00
[ 3381.019276] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3381.019277] usb 5-2: Product: 802.11ac NIC
[ 3381.019278] usb 5-2: Manufacturer: Realtek
[ 3381.019279] usb 5-2: SerialNumber: 123456
[ 3396.096863] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

Как видим idProduct изменился на значение c811

inxi -n

Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet
    driver: r8168
  IF: enp9s0 state: up speed: 100 Mbps duplex: full mac: 1X:c0:XX:52:fX:XX
  Device-2: Realtek 802.11ac NIC type: USB driver: rtl8821cu
  IF: wlan0 state: up mac: 98:XX:XX:9a:XX:94

Чтобы каждый раз не переключать в ручную, сделаем это в автоматическом режиме, с помощью плавила udev

Создаём файл в /etc/usb_modeswitch.d/ с названием 0bda:1a2b:

# Mercusys MU6H
DefaultVendor=  0x0bda
DefaultProduct= 0x1a2b

TargetVendor=   0x0bda
TargetProduct=  0xc811

MessageContent="55534243123456780000000000000601000000000000000000000000000000" 

StandardEject=1

В /etc/udev/rules.d/ создаём файл 40-wifi-switch.rules:

ATTRS{idVendor}=="0bda", ATTRS{manufacturer}!="Realtek", ATTR{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch -v 0bda -p c811 -J"

Перегружаемся, если всё правильно было сделано, то всё должно переключиться.