Skip to content

usb: gadget: composite: report bcdUSB 0x0210 when WebUSB is enabled (v6.8) - #368

Open
evgeny-boger wants to merge 2 commits into
dev/v6.8from
feature/webusb-bcdusb-0210-v6.8-rebase1
Open

usb: gadget: composite: report bcdUSB 0x0210 when WebUSB is enabled (v6.8)#368
evgeny-boger wants to merge 2 commits into
dev/v6.8from
feature/webusb-bcdusb-0210-v6.8-rebase1

Conversation

@evgeny-boger

Copy link
Copy Markdown
Member

Что происходит; кому и зачем нужно:

Ядро умеет отдавать WebUSB landing page для USB-гаджета (configfs webusb/{use,bVendorCode,landingPage}, ядро ≥ 6.3): в BOS-дескриптор добавляется WebUSB platform capability, а на vendor-запрос GET_URL возвращается URL. Chromium на десктопе показывает по этому URL уведомление «Go to <site> to connect <device>» при подключении устройства.

Но composite_setup() для не-superspeed гаджета с use_webusb выдаёт bcdUSB = 0x0201 (общая ветка с LPM), игнорируя значение из configfs. Спецификация WebUSB требует bcdUSB ≥ 2.10, и Chromium это проверяет жёстко: landing page читается только при версии ≥ 2.1.0 (kUsbVersion2_1 = 0x0210 в usb_service_linux.cc и usb_device_win.cc). То есть configfs-фича ядра в связке с Chromium не работает вообще: chrome://usb-internals показывает «USB Version: 2.0.1» и landing page отсутствует.

Патч отдаёт 0x0210 при use_webusb, для чисто LPM-случая оставляет 0x0201. Предназначен и для mainline (Fixes: 93c4739, Cc: stable).


Что поменялось для пользователей:

Прямо сейчас — ничего: webusb/use в configfs никто не включает, и при use_webusb = 0 дескриптор прежний (bcdUSB 2.00, BOS не отдаётся) — проверено.

Дальше это нужно для Debug Network: планируется, что wb-utils будет включать WebUSB с landing page https://10-200-200-1.<sn>.ip.wirenboard.com/ (веб-интерфейс контроллера), когда в wb-mqtt-homeui настроен HTTPS. Важно: одного этого патча для появления уведомления не хватит — Chromium на Linux не читает дескрипторы у устройств с mass-storage интерфейсом (ShouldReadDescriptors()), а на Windows отправляет GET_URL только через интерфейс, привязанный к драйверу WinUSB, которого у связки RNDIS+MSC нет. Это решается на стороне гаджета отдельно; данный патч — необходимое, но не достаточное условие.


Как проверял/а:

  • scripts/checkpatch.pl (mainline-версия, знает тег Assisted-by:): 0 warnings; остаётся только ERROR: Missing Signed-off-by — по Documentation/process/coding-assistants.rst тег DCO ставит человек, см. ниже.
  • Собран libcomposite.ko для 6.8.0-wb161 (кросс-сборка, vermagic совпадает), загружен на WB 8.5 (wirenboard-ALFLOJF3, musb HS):
    • use_webusb = 1: до патча хост видит bcdUSB 2.01, Chromium 144 — «USB Version: 2.0.1», landing page нет; после патча bcdUSB 2.10, chrome://usb-internals показывает «USB Version: 2.1.0» и «WebUSB Landing Page: …», уведомление появляется, клик открывает веб-интерфейс по HTTPS без предупреждения о сертификате.
    • use_webusb = 0 (штатное состояние, HTTPS не настроен): bcdUSB 2.00, BOS не отдаётся, RNDIS и mass storage работают как раньше.
  • Полной сборки ядра не делал — изменение одной ветки в composite_setup().
  • Не проверял: привязку RNDIS на «чистом» Windows-хосте при включённом WebUSB (Windows начнёт запрашивать BOS; ожидается штатный откат на MS OS 1.0 строку 0xEE, но это стоит проверить до включения WebUSB в wb-utils).

AI-assisted:

Патч и changelog подготовлены с помощью LLM-ассистента (тег Assisted-by: LLM по Documentation/process/coding-assistants.rst). По той же инструкции ассистент не ставит Signed-off-by — его добавляет человек-отправитель, подтверждая DCO.

The WebUSB specification requires a device that carries the WebUSB
platform capability descriptor to report bcdUSB >= 0x0210, and
Chromium enforces exactly that: its USB service reads the BOS
descriptor and the landing page URL only if the device version is at
least 2.1.0 (kUsbVersion2_1 = 0x0210 in usb_service_linux.cc and
usb_device_win.cc).

composite_setup() currently reports bcdUSB 0x0201 for a non-superspeed
gadget with cdev->use_webusb set, sharing the branch with LPM-capable
gadgets, and ignores the value written to the configfs bcdUSB
attribute. Chromium therefore never reads the landing page: the
"Go to <site> to connect <device>" notification never appears, which
defeats the purpose of the configfs webusb/ interface.

Report 0x0210 when WebUSB is in use; keep 0x0201 for the LPM-only case.

Verified on a Wiren Board 8 (musb high-speed UDC, kernel 6.8) with
Chromium 144 on Linux: with 0x0201 chrome://usb-internals shows
"USB Version: 2.0.1" and no landing page; with 0x0210 it shows
"USB Version: 2.1.0", "WebUSB Landing Page: <url>" and the plug-in
notification is displayed. With webusb/use = 0 the device still
reports bcdUSB 2.00 and no BOS, as before.

An LLM assistant located the Chromium-side version gate, wrote this
patch and the changelog, and ran the on-hardware verification above;
the analysis and the result were reviewed by the submitter.

Fixes: 93c4739 ("usb: gadget: add WebUSB landing page support")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Signed-off-by: Evgeny Boger <boger@wirenboard.com>
@evgeny-boger

Copy link
Copy Markdown
Member Author

Заменяет #367 (закрыт): там в коммите оказался Signed-off-by, поставленный AI-ассистентом, что запрещено Documentation/process/coding-assistants.rst — история переписана в новой ветке, поэтому close & reopen вместо force-push.

Отличия от #367: добавлены Cc: stable@vger.kernel.org и тег Assisted-by: LLM, в changelog добавлен абзац о том, что делал ассистент, и результат проверки обратного случая (use_webusb = 0 → bcdUSB 2.00, BOS не отдаётся). scripts/checkpatch.pl из mainline (он знает тег Assisted-by:, в дереве 6.8 — ещё нет): 0 errors, 0 warnings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant