# 在 Linux 上使用 Netgear A6210 USB 无线网卡

## 背景

最近要让一台 Linux 机器连接无线网，所以要买一个对 Linux 支持比较好的 USB 无线网卡。以前曾经用过一些 USB 无线网卡，但对 Linux 的支持大多不好，要么是需要 out of tree module，要么就忽然不能工作。因此前期的调研十分重要。

## 挑选 USB 无线网卡

在调研的时候，发现了 [morrownr/USB-WiFi](https://github.com/morrownr/USB-WiFi) 仓库，里面总结了一些 Linux 支持比较好的 USB 无线网卡，由于是外国人写的，所以里面很多型号在国内都买不到，但实际上 USB 无线网卡的芯片组一般就是那些，所以需要先确定芯片组，再根据芯片组找对应的 USB 无线网卡。

开发用于 USB 无线网卡的厂商常见的是：Mediatek（2011 年 MediaTek 收购了 Ralink）和 Realtek。国内直接买到的 USB 无线网卡大部分是 Realtek，但是 Realtek 的 Linux 驱动很长一段时间都是 out of tree 的状态，只有比较新的一些芯片组有内核支持，而 Mediatek 系列的芯片内核支持较好，缺点是比较贵。下面从上面的仓库里摘录了一些芯片组的 Linux 内核支持情况：

| Chipset    | Linux | Commit                                                                                                                                                                   | 802.11   | USB | Bluetooth | Package | Links                                                                                                                                                                                        |
| ---------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | --- | --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| MT7601u    | 4.2+  | [mt7601u](https://github.com/torvalds/linux/commit/c869f77d6abb5d5f9f2f1a661d5c53862a9cad34)                                                                             | b/g/n    | 2.0 | N/A       |         | [Official](https://www.mediatek.cn/products/broadband-wifi/mt7601u)                                                                                                                          |
| MT7610u    | 4.19+ | [mt76x0u](https://github.com/torvalds/linux/commit/ff69c75ee5392320ab3a8dd01db46d3cd097eb46)                                                                             | b/g/n/ac | 2.0 | N/A       |         | [Official](https://www.mediatek.cn/products/broadband-wifi/mt7610u)                                                                                                                          |
| MT7612u    | 4.19+ | [mt76x2u](https://github.com/torvalds/linux/commit/ee676cd5017c5f71b8aac1f2d1016ba0f6e4f348)                                                                             | b/g/n/ac | 3.0 | 4.0       |         | [Official](https://www.mediatek.cn/products/broadband-wifi/mt7612u)                                                                                                                          |
| MT7662u    |       |                                                                                                                                                                          | b/g/n/ac | 3.0 | 4.0       |         | [Official](https://www.mediatek.cn/products/broadband-wifi/mt7662u)                                                                                                                          |
| MT7921au   |       |                                                                                                                                                                          |          |     |           |         |                                                                                                                                                                                              |
| MT7922u    |       |                                                                                                                                                                          |          |     |           |         |                                                                                                                                                                                              |
| RTL8188eus | 3.12+ | rtl8188eu/r8188eu/[rtl8xxxu](https://github.com/torvalds/linux/commit/3dfb8e844fa30cceb4b810613e2c35f628eb3e70) [LKDDB](https://cateee.net/lkddb/web-lkddb/R8188EU.html) | b/g/n    | 2.0 | N/A       | QFN-46  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8188eus)                                                                                                   |
| RTL8188gu  | N/A   | [3rd party](https://github.com/McMCCRU/rtl8188gu) [patch](https://patchwork.kernel.org/project/linux-wireless/patch/5a9a264d-a59b-0d91-04f0-e5b38e6aaea0@gmail.com/)     |          |     |           |         |                                                                                                                                                                                              |
| RTL8723bu  | 4.6+  | [rtl8xxxu](https://github.com/torvalds/linux/commit/35a741febfae3cfc2a27d3b4935e255585ecfd81) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTL8XXXU.html)                  | b/g/n    | 2.0 | 4.0       | QFN-56  | [USB 0bda:b720](https://linux-hardware.org/?id=usb:0bda-b720)，[Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8723bu)                                     |
| RTL8723du  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/87caeef032fc3921bc866ad7becb6ed51aa8b27b) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8723DU.html)                 | b/g/n    |     | 4.2       | QFN-48  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8723du)                                                                                                    |
| RTL8811au  | N/A   | [3rd party](https://docs.alfa.com.tw/Support/Linux/RTL8811AU/)                                                                                                           | b/g/n/ac | 2.0 | N/A       | QFN-56  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8811au) [Datasheet](https://datasheet.lcsc.com/lcsc/2205121200_Realtek-Semicon-RTL8811AU-CG_C3013607.pdf)  |
| RTL8821au  | N/A   |                                                                                                                                                                          | b/g/n/ac | 2.0 | 4.0       | QFN-56  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8821au)                                                                                                    |
| RTL8811cu  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/aff5ffd718de23cb8603f2e229204670e2644334) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8821CU.html)                 | b/g/n/ac | 2.0 | N/A       | QFN-56  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8811cu)，[Datasheet](https://datasheet.lcsc.com/lcsc/2302141730_Realtek-Semicon-RTL8811CU-CG_C2687136.pdf) |
| RTL8821cu  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/aff5ffd718de23cb8603f2e229204670e2644334) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8821CU.html)                 | b/g/n/ac | 2.0 | 4.2       | QFN-56  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8821cu)，[Datasheet](https://datasheet.lcsc.com/lcsc/2202211630_Realtek-Semicon-RTL8821CU-CG_C2761145.pdf) |
| RTL8812au  | N/A   | [3rd party](https://docs.alfa.com.tw/Support/Linux/RTL8812AU/)                                                                                                           | b/g/n/ac | 3.0 | N/A       | QFN-76  | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8812au)                                                                                                    |
| RTL8812bu  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/45794099f5e1d7abc5eb07e6eec7e1e5c6cb540d) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8822BU.html)                 | b/g/n/ac | 3.0 | N/A       | TFBGA   | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8812bu)                                                                                                    |
| RTL8822bu  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/45794099f5e1d7abc5eb07e6eec7e1e5c6cb540d) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8822BU.html)                 | b/g/n/ac | 3.0 | 4.1       | TFBGA   | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8822bu)，[Datasheet](https://datasheet.lcsc.com/lcsc/2204071230_Realtek-Semicon-RTL8822BU-CG_C2803244.pdf) |
| RTL8822cu  | 6.2+  | [rtw88](https://github.com/torvalds/linux/commit/07cef03b8d44dee7488de3d1585387e603c78676) [LKDDB](https://cateee.net/lkddb/web-lkddb/RTW88_8822CU.html)                 |          |     |           |         |                                                                                                                                                                                              |
| RTL8814au  | N/A   | [3rd party](https://docs.alfa.com.tw/Support/Linux/RTL8814AU/)                                                                                                           | b/g/n/ac | 3.0 | N/A       | QFN-128 | [Official](https://www.realtek.com/en/products/communications-network-ics/item/rtl8814au)                                                                                                    |

可以观察到规律：Realtek 的产品型号中，881x 和 882x 有对应的关系，前者不带蓝牙，后者带。最后一位数字越大，则越新。

在内核源码中可以找到一些使用这个芯片组的 USB 无线网卡型号，但需要注意的是，有时候同样的型号，有 v1v2v3 之分，可能用的是不同的芯片组，购买前需要问清楚。

购买的时候，考虑芯片组的支持情况，Linux 内核版本等等因素，我最后购买了 Netgeat A6210 认证翻新版，使用芯片组 MT7612u，价格是 138 人民币。

## 使用

使用的 Linux 内核版本是 5.10，插上 USB 无线网卡即可使用：

```shell
$ lsusb
Bus 002 Device 002: ID 0846:9053 NetGear, Inc. A6210
```

在使用 iwd 的连接无线网的时候，还出现一个小插曲，就是 iwd 遇到很长的中文 SSID 时会崩溃，于是我进行了修复，并且发送给 iwd mailing list（[link](https://lore.kernel.org/iwd/20230226062526.3115588-1-c@jia.je/T/#u)），并等待修复。原理很简单，一是打印十六进制字符的时候没有考虑符号，二是缺少了缓冲区溢出的检查。

## Realtek 上游 Linux 内核驱动支持

归功于 Sascha Hauer [s.hauer@pengutronix.de](mailto:s.hauer@pengutronix.de) 老哥，最近 Linux 上游增加了不少对 realtek 网卡的支持，因此只要系统足够新，realtek 的网卡也值得考虑，如：

- RTL8723du: Linux 6.2+
- RTL8811cu: Linux 6.2+
- RTL8821cu: Linux 6.2+
- RTL8812bu: Linux 6.2+
- RTL8822bu: Linux 6.2+
- RTL8822cu: Linux 6.2+

RTL8188gu 也有正在 review 的 [patch](https://patchwork.kernel.org/project/linux-wireless/patch/5a9a264d-a59b-0d91-04f0-e5b38e6aaea0@gmail.com/)。经过我的测试也是工作的。
