Install Compiled Intel 7260 Driver on Jetson LT4 21.1

With the new Linux for Tegra (LT4) 21.1 release, I needed a new driver for a Intel 7260 Wireless mini PCIe card. You can read about my initial installation of that hardware here: Installing Wireless Intel 7260 Adapter on NVIDIA Jetson TK1.

WARNING NOTE: The compiled driver is for LT4 21.1 ONLY. Installing the supplied drivers on a different LT4 setup (like LT4 21.2) system will bonk things up.

In the previous article, I was using a Jetson community LT4 release called ‘Grinch‘. Grinch has built in support for several different wireless adapters, one of which is the 7260. With the new release, I decided I would build my own 7260 driver, thinking “How hard could it be?”. That attitude quickly changed to “How could that be?”, but I’ll save that for another day.

Basically I built the Intel wireless drivers, placed them on Github jetsonhacks/install7260LT4211, and wrote a shell script to move everything around on installation so that the 7260 wireless works. The installation assumes a fresh LT4 21.1 install, and that the 7260 card is installed. Looky here:

Now, I’ll say upfront that this is some pretty hard core stuff. The Linux for Tegra (LT4) 21.1 release has associated source code for the kernel. Fortunately that kernel also has the source code for the 7260 drivers, so it was a matter of configuring the kernel and building the drivers.

Originally I thought that would be straightfoward. The name of the driver is referred to as ‘iwlwifi’, there are a few of different parts to it but basically it compiles into three different files:

iwlwifi.ko
iwldvm.ko
iwlmvm.ko

stored appropriately in the ‘iwlwifi’ folder. You also need the firmware for the 7260, which is:

iwlwifi-7260-7.ucode

An alternative approach is to get the firmware for the 7260 by executing:

$ sudo apt-get install linux-firmware

(and in fact this command will get firmware for other Intel hardware, as well as a slew of other hardware). However, I chose just to put it up in the repository for simplicity.

After I built the driver, and installed the firmware there were, let’s call them issues. There were two modules that I ended up needing to rebuild:

cfg80211
mac80211

This surprised me because I thought that both of these modules would be the result of compiling the kernel source independently. They weren’t; there were a couple of missing symbols that were not being exported causing the iwlwifi driver to lie over and play dead. So I included these two rebuilt wireless modules in the repository.

In order to get the 7260 to work, the GPIO pin 191 on the Jetson must be set on. You can do this by executing:

echo 191 > /sys/class/gpio/export;
echo out > /sys/class/gpio/gpio191/direction;
echo 1 > /sys/class/gpio/gpio191/value;

Because the kernel sets this value to off when it boots, you’ll need to set it immediately thereafter. That’s where the modified /etc/rc.local comes in. If you look at that file on Github, you’ll notice that GPIO 191 is set, and then the iwlwifi module is unloaded, and then loaded again.

The Grinch, being its own kernel, took the liberty of setting the pin high so it doesn’t need that code in /etc/rc.local.

Note here that the install script just overwrites /etc/rc.local.

Certainly you may want to have a more delicate hand in the install, please modify installDrivers.sh for your situation.

Notes

These modules and drivers are built against the 3.10.40-g8c4516e kernel, and will probably only work with that version.

If you don’t have ethernet access, you can go to another machine and download the zip file from the Jetsonhacks install7260LT421 repository and sneaker net it using a SD card or USB drive over to the Jetson.

You may be able to use other Intel wireless hardware with this driver. In order to do so, you will have to acquire the firmware for the device. This can be done using:

$ sudo apt-get install linux-firmware

Good luck!

4 Comments

  1. Hi,
    First many thank you for providing useful information about jetson TK1.
    I have a question about the Intel 7460 wireless module activation.
    I was installed a jetpack 2.1 for L4T at my Jetson TK1 board.
    – L4T R21.4 (10. July. 2015)
    – R21.4 jet pack include a intel 7460 driver.

    And I was equipping the Intel 7460 wireless module to mini PCI-E slot. And then I turned on the Jetson TK1. But the Intel 7460 wireless module didn’t work after boot.
    The strange thing about this is activated after insert with mini wireless module (ipTime N100 mini) to usb port in Jetson TK1.

    As a result, the Intel 7460 wireless module didn’t be working stand alone. So
    I always have to connect the mini wireless module to usb.

    So could you explain why it is? What am I doing some wrong?

  2. Hi
    See in your note the instructions are for 21.1, but the link
    Linux for Tegra (LT4) 21.1 points to Linux for Tegra (LT4) 21.2.
    What changes do I need to make for 21.2?

  3. Hi
    I have L21.5 installed on Jetson TK1 with Intel 7260 HMW module. The wifi module works for me sometimes on boot-up and sometimes it doesnt work. This is the dmesg output when it doesnt work:
    [ 13.882762] cfg80211: Calling CRDA to update world regulatory domain
    [ 13.884648] init: plymouth-upstart-bridge main process ended, respawning
    [ 13.889301] Intel(R) Wireless WiFi driver for Linux, in-tree:
    [ 13.889312] Copyright(c) 2003-2013 Intel Corporation
    [ 13.891528] cfg80211: World regulatory domain updated:
    [ 13.891538] cfg80211: (start_freq – end_freq @ bandwidth), (max_antenna_gain, max_eirp)
    [ 13.891545] cfg80211: (2402000 KHz – 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 13.891552] cfg80211: (2457000 KHz – 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 13.891558] cfg80211: (2474000 KHz – 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
    [ 13.891564] cfg80211: (5170000 KHz – 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 13.891571] cfg80211: (5735000 KHz – 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 13.892732] iwlwifi 0000:01:00.0: loaded firmware version 22.1.7.0 op_mode iwlmvm
    [ 13.917994] iwlwifi 0000:01:00.0: Detected Intel(R) Dual Band Wireless AC 7260, REV=0x144
    [ 13.918035] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
    [ 13.918528] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
    [ 14.016495] iwlwifi 0000:01:00.0: NVM section 0 read completed
    [ 14.016570] iwlwifi 0000:01:00.0: NVM section 1 read completed
    [ 14.016640] iwlwifi 0000:01:00.0: NVM section 4 read completed
    [ 14.016720] iwlwifi 0000:01:00.0: NVM section 5 read completed
    [ 14.101480] init: plymouth-stop pre-start process (915) terminated with status 1
    [ 14.221919] ieee80211 phy0: Selected rate control algorithm ‘iwl-mvm-rs’
    [ 14.233341] systemd-udevd[346]: renamed network interface wlan0 to wlan1
    [ 14.235574] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
    [ 14.235801] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
    [ 14.239748] cfg80211: Calling CRDA for country: US
    [ 14.256392] cfg80211: Regulatory domain changed to country: US
    [ 14.256398] cfg80211: (start_freq – end_freq @ bandwidth), (max_antenna_gain, max_eirp)
    [ 14.256403] cfg80211: (2402000 KHz – 2472000 KHz @ 40000 KHz), (300 mBi, 2700 mBm)
    [ 14.256407] cfg80211: (5170000 KHz – 5250000 KHz @ 40000 KHz), (300 mBi, 1700 mBm)
    [ 14.256411] cfg80211: (5250000 KHz – 5330000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 14.256414] cfg80211: (5490000 KHz – 5600000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 14.256418] cfg80211: (5650000 KHz – 5710000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
    [ 14.256422] cfg80211: (5735000 KHz – 5835000 KHz @ 40000 KHz), (300 mBi, 3000 mBm)
    [ 14.256428] cfg80211: (57240000 KHz – 63720000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
    [ 14.357602] IPv6: ADDRCONF(NETDEV_UP): wlan1: link is not ready
    [ 14.499049] tegradc tegradc.1: nominal-pclk:106507000 parent:426000000 div:4.0 pclk:106500000 105441930~116092630

    I want to use Jetson on a quadcopter and therefore want the communication to be reliable. Any help is appreciated.

    Thanks

Leave a Reply

Your email address will not be published.


*