I recently had the privilege of attending Nvidia’s GPU Technology Conference, where due to the generosity of a friend and colleague, I came into possession of a Jetson TK1 board; while he’s been working on more useful things with his Jetsons, I’ve just been tinkering with mine, adding a mini PCI-E wifi adapter, for example. Here’s what I did to get that working.

Our home isn’t wired for ethernet, so adding a wireless card to the Jetson made sense for ease of access. We have an 802.11AC-capable base station, so I chose the Intel 7260 which supports A/B/G/N/AC. Intel also has a decent track record when it comes to Linux support. Initially, I did not purchase any antennas; that was a mistake. Without them, I was unable to connect to our network, so if you’re thinking of using this card I’d strongly suggest going ahead and getting a pair of antennas too. As suggested here, you’ll need two pigtail adapters to connect the tiny antenna ports on the card itself to a standard threaded antenna mount, then a pair of antennas like these.

When you go to mount the card, you might notice it doesn’t come with any screws, and without them the card won’t lie flush with the board. I thought I’d bite the bullet and get the “official” screws from Intel to be sure I had the correct size, but don’t bother, those seem to have the wrong threads for the Jetson. I still haven’t found the correct size, but the Intel screws thread just far enough to keep it from popping up.

Once the hardware was installed, everything was pretty straightforward using the latest L4T (21.3) and (almost) worked out of the box. If you boot up with the card installed and check dmesg, looking for any lines containing iwlwifi, you’ll probably see a warning about lack of firmware. The easiest way to get the necessary firmware is to

[email protected]:~$ sudo apt-get install linux-firmware

but you can also get it from kernel.org. After installing the linux-firmware package, you should find some new files in /lib/firmware:

[email protected]:~$ ls /lib/firmware/iwlwifi-*
/lib/firmware/iwlwifi-1000-5.ucode  /lib/firmware/iwlwifi-5150-2.ucode
/lib/firmware/iwlwifi-100-5.ucode   /lib/firmware/iwlwifi-6000-4.ucode
/lib/firmware/iwlwifi-105-6.ucode   /lib/firmware/iwlwifi-6000g2a-5.ucode
/lib/firmware/iwlwifi-135-6.ucode   /lib/firmware/iwlwifi-6000g2a-6.ucode
/lib/firmware/iwlwifi-2000-6.ucode  /lib/firmware/iwlwifi-6000g2b-6.ucode
/lib/firmware/iwlwifi-2030-6.ucode  /lib/firmware/iwlwifi-6050-5.ucode
/lib/firmware/iwlwifi-3160-7.ucode  /lib/firmware/iwlwifi-7260-7.ucode
/lib/firmware/iwlwifi-3160-8.ucode  /lib/firmware/iwlwifi-7260-8.ucode
/lib/firmware/iwlwifi-3160-9.ucode  /lib/firmware/iwlwifi-7260-9.ucode
/lib/firmware/iwlwifi-3945-2.ucode  /lib/firmware/iwlwifi-7265-8.ucode
/lib/firmware/iwlwifi-4965-2.ucode  /lib/firmware/iwlwifi-7265-9.ucode

And one short reboot later, the iwlwifi module should now be satisfied:

[email protected]:~# dmesg | grep iwlwifi
[    9.441308] iwlwifi 0000:01:00.0: loaded firmware version op_mode iwlmvm
[    9.664570] iwlwifi 0000:01:00.0: Detected Intel(R) Dual Band Wireless AC 7260, REV=0x144
[    9.664658] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[    9.664898] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[    9.788834] iwlwifi 0000:01:00.0: NVM section 0 read completed
[    9.788957] iwlwifi 0000:01:00.0: NVM section 1 read completed
[    9.789072] iwlwifi 0000:01:00.0: NVM section 4 read completed
[    9.789193] iwlwifi 0000:01:00.0: NVM section 5 read completed
[   12.331778] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[   12.332022] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S

If all goes well, you should (automagically) have a new network device, iwlan0. This can be seen in ifconfig or NetworkManager, via the command-line interface nmcli:

[email protected]:~$ nmcli dev                                                                                                      
DEVICE     TYPE              STATE        
eth0       802-3-ethernet    connected  
wlan0      802-11-wireless   disconnected   

At this point, we can use nmcli to connect to a wireless network, which is handy if you (like me) are interacting with the Jetson from a terminal interface instead of the desktop GUI. All it should take is something like this:

nmcli dev wifi connect <YOUR_SSID_HERE> password <YOUR_KEY_HERE>

If this works, nmcli dev should now report connected for wlan0; alternatively you can see some other details using iwconfig:

[email protected]:~$ iwconfig wlan0
wlan0     IEEE 802.11abgn  ESSID:"Euclid"  
          Mode:Managed  Frequency:2.452 GHz  Access Point: 88:1F:A1:32:8B:7A   
          Bit Rate=1 Mb/s   Tx-Power=27 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
          Link Quality=57/70  Signal level=-53 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

And that’s really all there was to it. I took several missteps trying to manually configure the network, wpa_supplicant and the like before finding the easier way using NetworkManager. Also, an antenna of some kind seems to be required — without the antennas mentioned above I was never able to make a successful connection. Hopefully this information will save you some time by avoiding the same mistakes.