Clone this repo:

Branches

  1. 23186b5 [roll] Roll drivers-wlan-intel-iwlwifi-bazel_sdk-cipd packages to version:26.20241121.0.1 by global-integration-roller · 44 minutes ago main
  2. 153f285 [roll] Roll third_party/fuchsia-infra-bazel-rules [roll] Roll fuchsia-infra-bazel-rules-bazel_sdk-cipd packages to version:26.20241120.6.1 by global-integration-roller · 4 hours ago
  3. d96ddd9 [roll] Roll third_party/fuchsia-infra-bazel-rules [roll] Roll fuchsia-infra-bazel-rules-luci_auth-cipd packages to git_revision:67d6d24f2f07d3083a2c0c0fc67856413d1119b9 by global-integration-roller · 4 hours ago
  4. 25aa4a0 [roll] Roll third_party/fuchsia-infra-bazel-rules [roll] Roll fuchsia-infra-bazel-rules-cas-cipd packages to git_revision:67d6d24f2f07d3083a2c0c0fc67856413d1119b9 by global-integration-roller · 5 hours ago
  5. 06ed3dc [roll] Roll drivers-wlan-intel-iwlwifi-bazel_sdk-cipd packages to version:26.20241120.6.1 by global-integration-roller · 5 hours ago

Intel Wifi driver

This repository contains the source code to build, package and run the Intel Wifi driver for Fuchsia using the Fuchsia Bazel SDK.

The prebuilts of this driver is uploaded to CIPD at this location.

https://chrome-infra-packages.appspot.com/p/fuchsia/drivers/wlan/intel/iwlwifi

1. Pre-requisites

  • A gLinux machine to build the driver.
    • Building and compiling on a gMac is not yet supported.
  • A NUC7 or NUC11 for running the driver.

2. Prepare your environment

2.1 Onetime repo setup

  1. Clone the Intel Wi-Fi Driver
git clone https://fuchsia.googlesource.com/drivers/wlan/intel/iwlwifi --recurse-submodules
  1. Go to the cloned directory
cd iwlwifi
  1. Run the bootstrap script to install Bazel and other required deps.
scripts/bootstrap.sh

2.2 Preparing the NUC

To prepare your development environment using NUC hardware, please follow the instruction in the below doc.

https://docs.google.com/document/d/1w4nEroDYQZ37xTUMlw-nM4F4URF3IvSWbmtcuSxBvus/edit#heading=h.tkg2hhv2medi

3. Building the driver

Once you have setup your environment, the Intel driver can be built using the following command.

./tools/bazel build third_party/iwlwifi/platform:iwlwifi_pkg

When finished successfully, it prints output logs similar to what's shown below:

$ ./tools/bazel build third_party/iwlwifi/platform:iwlwifi_pkg
...
INFO: Elapsed time: 0.464s, Critical Path: 0.11s
INFO: 11 processes: 11 internal.
INFO: Build completed successfully, 11 total actions

4. Loading the driver on to a device

  1. If the product bundle already contains a version of the Intel Wi-Fi driver, use the below command to disable it. Without this step, the OOT built driver will not be able to run and bind.
ffx driver disable fuchsia-pkg://fuchsia.com/iwlwifi#meta/iwlwifi.cm

The command output would look something like this:

$ tools/ffx driver disable fuchsia-pkg://fuchsia.com/iwlwifi#meta/iwlwifi.cm
Disabling fuchsia-pkg://fuchsia.com/iwlwifi#meta/iwlwifi.cm and restarting driver hosts with rematching enabled.
Successfully restarted and rematching 1 driver hosts with the driver.
  1. Build, publish and register the Intel Wi-Fi driver component using a single command:
tools/bazel run third_party/iwlwifi/platform:iwlwifi_pkg.iwlwifi_component

The command output would look something like this:

$ tools/bazel run third_party/iwlwifi/platform:iwlwifi_pkg.iwlwifi_component
...
Publishing packages: [PosixPath('third_party/iwlwifi/platform/iwlwifi.far')]
Published 1 packages
Running task: iwlwifi_pkg.iwlwifi_component.run_only (step 3/4)
Registering fuchsia-pkg://bazel.iwlwifi.pkg.publish.anonymous/iwlwifi#meta/iwlwifi.cm, restarting driver hosts, and attempting to bind to unbound nodes
Successfully bound:
Node 'dev.sys.platform.pt.PCI0.bus.01_00.0.01_00.0', Driver 'fuchsia-pkg://bazel.iwlwifi.pkg.publish.anonymous/iwlwifi#meta/iwlwifi.cm'.
Running task: iwlwifi_pkg.publish_anonymous.delete_repo (step 4/4)
  1. Verify that the iwlwifi driver is now loaded to the NUC:
$ tools/ffx driver list --loaded | grep wifi
fuchsia-pkg://bazel.pkg.publish.anonymous/iwlwifi#meta/iwlwifi.cm

Notice the iwlwifi driver toward the bottom of the loaded drivers list.

  1. View the iwlwifi component information:
$ tools/ffx component show iwlwifi.cm
                Moniker:  /bootstrap/full-pkg-drivers:dev.sys.platform.pt.PCI0.bus.01_00.0_.pci-01_00.0-fidl
                    URL:  fuchsia-pkg://bazel.iwlwifi.pkg.publish.anonymous/iwlwifi#meta/iwlwifi.cm
            Environment:  full-pkg-driver-env
            Instance ID:  None
                   Type:  CML component
        Component State:  Resolved
           Resolved URL:  fuchsia-pkg://bazel.iwlwifi.pkg.publish.anonymous/iwlwifi#meta/iwlwifi.cm
 Namespace Capabilities:  /svc/fuchsia.logger.LogSink
                          /svc/fuchsia.hardware.pci.Service
   Exposed Capabilities:  fuchsia.wlan.softmac.Service
                          fuchsia.wlan.phyimpl.Service
                          diagnostics
            Merkle root:  98384e7ced5c66b0fbf5f725abb43e9e9b57594e694f9167c032cceb4b009b80
        Execution State:  Running
           Start reason:  Instance is in a single_run collection
  Outgoing Capabilities:  diagnostics
                          fuchsia.wlan.phyimpl.Service
                Runtime:  Unknown
  1. Run a scan command to validate the driver works
fx shell wlan-dev scan

A successful scan output would look something like this.

fuchsia~$ fx shell wlan-dev scan
Warning: this tool may cause state mismatches between layers of the WLAN
subsystem. It is intended for use by WLAN developers only. Please reach out
to the WLAN team if your use case relies on it.
Scan(ClientScanCmd { iface_id: 0, scan_type: Passive })
BSSID              dBm   Chan Protection   Compatible SSID
8c:3b:ad:ab:91:4d  -86 157V WPA2 PSK Y
60:32:b1:6a:e6:53  -72 9+ WPA2 PSK Y
62:8c:b5:39:0b:fb  -85 153V WPA2 PSK Y

5. Run tests

5.1 Run unit-tests on emulator

  1. Run the work-on script to prepare your development environment:
tools/work-on core.x64 --target fuchsia-emulator
  1. Stop all running Fuchsia emulator instance:
tools/ffx emu stop --all
  1. Start the Fuchsia emulator:
tools/ffx emu start --headless
  1. Execute the following command to run the driver tests:
tools/bazel test third_party/iwlwifi/test:iwlwifi_test_pkg

5.2 Run unit-tests on NUC

  1. Boot your NUC in Fastboot mode (or boot it normally to run Fuchsia).

  2. Identify your NUC’s device name, for example:

$ ffx target list
NAME                      SERIAL       TYPE       STATE
fuchsia-5254-0063-5e7a    <unknown>    Unknown    Unknown
  1. Run the work-on script to prepare your development environment:
tools/work-on core.x64 --target <name_from_target_list>

Replace <name_from_target_list> with the target name (in this case, fuchsia-5254-0063-5e7a).

  1. Execute the following command to run the driver tests. Note the argument to not cache the results and actually run all tests, even if everything is unchanged.
tools/bazel test --cache_test_results=no third_party/iwlwifi/test:iwlwifi_test_pkg

5.3 Running tests with ASAN

Execute the following command to run the driver tests with ASAN enabled.

tools/bazel test --features=asan --cache_test_results=no third_party/iwlwifi/test:iwlwifi_test_pkg

6. Upload your changes

Once you're ready to send your changes for code review, run:

git push origin HEAD:refs/for/main

git will then print the URL of your pending CL.