Difference between revisions of "How to install the development version of atk9k"

From ThinkWiki
Jump to: navigation, search
(Configure the kernel)
 
(52 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
ath9k is the new open source driver for newer atheros cards including those with 11n hardware support.
 
ath9k is the new open source driver for newer atheros cards including those with 11n hardware support.
  
At the time of writing, [http://linuxwireless.org/en/users/Drivers/ath9k ath9k] will not compile against the current kernel release 2.6.26. Thus, in order to get it running, you will need to download and compile the current [http://linuxwireless.org/en/developers/Documentation#wireless-testing.git wireless testing branch] of the kernel which follows the current release candidate for the next kernel (2.6.27). Previous instructions for downloading and compiling the ath9k driver separately from wireless testing are [https://lists.ath9k.org/pipermail/ath9k-devel/2008-August/000128.html deprecated] as it has now been [https://lists.ath9k.org/pipermail/ath9k-devel/2008-August/000108.html added in to wireless testing]. This howto will outline the entire process without assuming any prior knowledge of git or kernel compilation.
+
The [http://linuxwireless.org/en/users/Drivers/ath9k ath9k] module is included in the current kernel release [http://lkml.org/lkml/2008/10/9/415 2.6.27]. If your distribution does not yet have this kernel available as a package, these are instructions for installing it from source.
== Install git and other stuff ==
+
 
You will need to have [http://git.or.cz/ git] up and running to access both the wireless testing branch, and the ath9k driver itself which is not yet included. Git is the revision control system used for the Linux kernel and associated projects. Your distribution will most likely have a package for it so install that using aptitude, yum or portage or whatever first. Additionally, compiling your kernel is at a minimum going to require "gcc" and "make" and you're also going to need either the qt3 development libraries to run the x-configuration utilities or ncurses development libraries to run the menuconfig utility. The names of these packages and how to install them will vary from distro to distro.  
+
== Preparation ==
 +
Compiling your kernel is at a minimum going to require '''gcc''', '''make''' and the '''qt3 development libraries''' to run the x-configuration utility. The names of these packages and how to install them will vary from distro to distro. You'll also want to add yourself to the '''src''' group so that you can do most of the kernel compilation as a regular user. You will have to log out and log back in for this change to take effect.
  
 
=== Debian ===
 
=== Debian ===
{{cmdroot|aptitude install git-core build-essential kernel-package libqt3-mt-dev fakeroot}}
+
{{cmdroot|aptitude install git-core build-essential kernel-package libqt3-mt-dev fakeroot}}<br>
 +
{{cmdroot|adduser <you> src}}
 +
 
 +
=== Ubuntu ===
 +
{{cmduser|sudo aptitude install git-core build-essential kernel-package libqt3-mt-dev fakeroot}}<br>
 +
{{cmduser|sudo adduser <you> src}}
  
== Get the wireless-testing branch ==
+
== Get the kernel sources ==
It does not appear that you can take the easy way out and use the [http://linuxwireless.org/en/users/Download#DownloadlatestLinuxwirelessdrivers compat-wireless] tree. Instead we have to compile the entire wireless-testing kernel to successfully build ath9k.
+
Download and unzip the kernel sources
Once you've got git installed, you can follow the [http://linuxwireless.org/en/developers/Documentation/git-guide linux wireless git-guide] and download the wireless testing branch
 
  
 
{{cmduser|cd /usr/src}}<br>
 
{{cmduser|cd /usr/src}}<br>
{{cmduser|git-clone git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git}}
+
{{cmduser|wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2}}<br>
 +
{{cmduser|tar xvjf linux-2.6.27.tar.bz2}}<br>
 +
{{cmduser|cd linux-2.6.27}}<br>
  
== Copy your current kernel's config ==
+
== Kernel config ==
This is the part most people are afraid of. However, you can use your current kernel's configuration as a baseline to help ease the pain. Most self-respecting distributions keep a copy of your kernel configuration in the /boot directory alongside the kernel itself. If this is not the case, you might find a copy of the kernel config at {{path|/proc/config.gz}} (which will of course needs to be gunziped). Whatever the case, you will want to copy the the current config file to {{path|/usr/src/wireless-testing/.config}}
+
This is the part most people are afraid of. However, you can use your current kernel's configuration as a baseline to help ease the pain. Most self-respecting distributions keep a copy of your kernel configuration in the /boot directory alongside the kernel itself. If this is not the case, you might find a copy of the kernel config at {{path|/proc/config.gz}} (which will of course needs to be gunziped). Whatever the case, you will want to copy the the current config file to the directory of the the kernel tree you are about to compile {{path|/usr/src/linux-2.6.27/.config}}
  
=== Debian ===
+
=== Debian/Ubuntu ===
{{cmduser|cp /boot/config-`uname -r` /usr/src/wireless-testing/.config}}
+
{{cmduser|cp /boot/config-`uname -r` ./.config}}
  
 
== Configure the kernel ==
 
== Configure the kernel ==
Line 26: Line 33:
 
{{cmduser|make xconfig}}
 
{{cmduser|make xconfig}}
  
You'll likely see some messages in the terminal about unset or unrecognized configuration variables which should be automatically either added or removed respectively. You might want to make sure the following are enabled
+
You'll likely see some messages in the terminal about unset or unrecognized configuration variables which automatically either get added or removed respectively. You might want to make sure the following are enabled
  
 
{{kernelconf|CONFIG_NET_SCHED|[Y]|QoS and/or fair queueing|Networking Options|Networking||}}<br>
 
{{kernelconf|CONFIG_NET_SCHED|[Y]|QoS and/or fair queueing|Networking Options|Networking||}}<br>
Line 34: Line 41:
 
{{kernelconf|CONFIG_MAC80211|[Y]|Wireless Extensions|Wireless Networking|Networking||}}<br>
 
{{kernelconf|CONFIG_MAC80211|[Y]|Wireless Extensions|Wireless Networking|Networking||}}<br>
 
{{kernelconf|CONFIG_WIRELESS_EXT|[M]|Generic IEEE 802.11 Networking Stack (mac80211)|Wireless Networking|Networking||}}<br>
 
{{kernelconf|CONFIG_WIRELESS_EXT|[M]|Generic IEEE 802.11 Networking Stack (mac80211)|Wireless Networking|Networking||}}<br>
{{kernelconf|CONFIG_MAC80211_RC_DEFAULT_PID|[Y]|PID controller based rate control algorithm|Default rate control algorithm|Rate control algorithm selection|Generic IEEE 802.11 Networking Stack (mac80211 Networking)|Wireless Networking|Networking||}}<br>
 
 
{{kernelconf|CONFIG_MAC80211_RC_PID|[Y]|PID controller based rate control algorithm|Rate control algorithm selection|Generic IEEE 802.11 Networking Stack (mac80211)|Wireless Networking|Networking||}}<br>
 
{{kernelconf|CONFIG_MAC80211_RC_PID|[Y]|PID controller based rate control algorithm|Rate control algorithm selection|Generic IEEE 802.11 Networking Stack (mac80211)|Wireless Networking|Networking||}}<br>
  
Line 42: Line 48:
 
{{kernelconf|CONFIG_WLAN80211|[Y]|Wireless LAN (IEEE 802.11)|Wireless LAN|Network Device Support|Device Drivers||}}<br>
 
{{kernelconf|CONFIG_WLAN80211|[Y]|Wireless LAN (IEEE 802.11)|Wireless LAN|Network Device Support|Device Drivers||}}<br>
 
{{kernelconf|CONFIG_ATH9K|[m]|Atheros 802.11n wireless cards support|Wireless LAN (IEEE 802.11)|Wireless LAN|Network Device Support|Device Drivers||}}<br>
 
{{kernelconf|CONFIG_ATH9K|[m]|Atheros 802.11n wireless cards support|Wireless LAN (IEEE 802.11)|Wireless LAN|Network Device Support|Device Drivers||}}<br>
 +
 +
Also, unless you want to worry about creating an initrd (initial RAM disk), you're also probably best to build anything necessary to read your root filesystem into the kernel rather than as modules. This includes both filesystem (e.g. '''ext3''') and low level hardware drivers (e.g. '''libata'''). The particular drivers required will depend on your particular setup. You can try and get an idea of what you might need to include by examining the output of <code>lsmod</code>. If you see any modules in there that might be required to boot the system, you should make sure you compile these in.
  
 
Make sure you save any changes you make before you exit.
 
Make sure you save any changes you make before you exit.
  
 
==Compilation==
 
==Compilation==
Now it's time to compile your kernel. The generic way to do this is  
+
Now it's time to compile your kernel. If you have NCPU cpus, the generic way to do this is  
  
{{cmduser|make}}<br>
+
{{cmduser|make -j <NCPU+1>}}<br>
 
{{cmduser|su}}<br>
 
{{cmduser|su}}<br>
 
{{cmdroot|make modules_install}}<br>
 
{{cmdroot|make modules_install}}<br>
{{cmdroot|cp arch/<your architecture>/boot/bzImage /boot/linux-2.6.26-wl}}
+
{{cmdroot|cp arch/<your architecture>/boot/bzImage /boot/linux-2.6.27}}
  
 
Where <your architecture> will be x86 if you're running a 32-bit system or x86_64 if you're running 64-bit.
 
Where <your architecture> will be x86 if you're running a 32-bit system or x86_64 if you're running 64-bit.
Line 58: Line 66:
  
 
<pre>
 
<pre>
title         Wireless testing Linux kernel 2.6.26-wl
+
title         Linux kernel 2.6.27
 
root (hd#,#)
 
root (hd#,#)
kernel /boot/linux-2.6.26-wl root=/dev/<your root device> ro  
+
kernel /boot/linux-2.6.27 root=/dev/<your root device> ro  
 
</pre>
 
</pre>
  
Line 66: Line 74:
  
 
{{NOTE|If you compiled the drivers needed to access your root device (filesystem and hardware driver) as modules rather than building them directly into the kernel, you're going to have build an initrd, using something like mkinitramfs and add the resulting initrd to the above grub stanza as follows:
 
{{NOTE|If you compiled the drivers needed to access your root device (filesystem and hardware driver) as modules rather than building them directly into the kernel, you're going to have build an initrd, using something like mkinitramfs and add the resulting initrd to the above grub stanza as follows:
initrd /boot/initrd.img-2.6.26-wl
+
initrd /boot/initrd.img-2.6.27
 
}}  
 
}}  
  
 
Now reboot into your new kernel.
 
Now reboot into your new kernel.
===Debian===
+
===Debian/Ubuntu===
Debian has a system to help you build kernels as Debian packages.
+
Debian has a system to help you build kernels as Debian packages. If NCPU is the number of CPUs you have,
  
<code>$ fakeroot make-kpkg --append-to-version=.mykernel linux_image</code><br>
+
<code>$ CONCURRENCY_LEVEL=<NCPU+1> fakeroot make-kpkg --append-to-version=.mykernel linux_image</code><br>
 
{{cmduser|su}}<br>
 
{{cmduser|su}}<br>
{{cmdroot|dpkg -i /usr/src/linux-image-2.6.26.mykernel-wl_2.6.26.mykernel-wl-10.00.Custom_amd64.deb}}<br>
+
(for Ubuntu, skip "su" and prepend the below commands with "sudo")
 +
 
 +
Note: if running Debian with initrd, you can run:
 +
 
 +
<code>$ CONCURRENCY_LEVEL=<NCPU+1> fakeroot make-kpkg --initrd --append-to-version=.mykernel linux_image</code><br>
 +
 
 +
{{cmdroot|dpkg -i /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_amd64.deb}}<br>
 +
 
 
or if you're running 32-bit i386
 
or if you're running 32-bit i386
  
{{cmdroot|dpkg -i /usr/src/linux-image-2.6.26.mykernel-wl_2.6.26.mykernel-wl-10.00.Custom_i386.deb}}<br>
+
{{cmdroot|dpkg -i /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_i386.deb}}<br>
  
which should take care of all of the above for you.
+
Note: As of 2008-09-13, if running Debian or Ubuntu and you have previously built any 2.6.27-rc kernel, you must use force-overwrite when using dpkg. [See http://lkml.org/lkml/2008/9/11/62]
  
 +
{{cmdroot|dpkg -i --force-overwrite /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_amd64.deb}}<br>
  
 +
or if you're running 32-bit i386
 +
 +
{{cmdroot|dpkg -i --force-overwrite /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_i386.deb}}<br>
 +
 +
Again it is recommended that you build what you need into your kernel. However, if aren't sure what is needed to read your root file system and so can't just build it into your kernel, you can create an initrd using update-initramfs
 +
 +
{{cmdroot|update-initramfs -c -k 2.6.27.mykernel}}<br>
 +
{{cmdroot|update-grub}}
  
 
== Ok, now see if it worked ==
 
== Ok, now see if it worked ==
Line 90: Line 114:
 
The first command should hopefully generate no errors and the second is purely diagnostic and should show you a working wireless device. You can then proceed to use wpa_supplicant or network manager or iwconfig to setup your wireless networking.
 
The first command should hopefully generate no errors and the second is purely diagnostic and should show you a working wireless device. You can then proceed to use wpa_supplicant or network manager or iwconfig to setup your wireless networking.
  
== Keeping up to date ==
+
==Hardware specific==
If you want to keep up to date with the latest developments, you can always check the git tree of the wireless-testing kernel for code changes.
 
  
{{cmduser|cd /usr/src/wireless-testing && git-pull}}<br>
+
===168c:0024 (MacBook Wireless)===
  
Of course you will have to repeat the necessary steps above to recompile and reinstall any changes.
+
Currently with this hardware (output of <code>lspci -vvv</code>), the driver installs, but does not allow association with an access point.
 +
 
 +
<pre>
 +
02:00.0 Network controller: Atheros Communications, Inc. Unknown device 0024 (rev 01)
 +
        Subsystem: Apple Computer Inc. Unknown device 0087
 +
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
 +
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR-
 +
        Latency: 0, Cache Line Size: 256 bytes
 +
        Interrupt: pin A routed to IRQ 17
 +
        Region 0: Memory at 50100000 (64-bit, non-prefetchable) [size=64K]
 +
        Capabilities: [40] Power Management version 2
 +
                Flags: PMEClk- DSI- D1+ D2- AuxCurrent=375mA PME(D0+,D1+,D2-,D3hot+,D3cold-)
 +
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
 +
        Capabilities: [50] Message Signalled Interrupts: Mask- 64bit- Queue=0/0 Enable-
 +
                Address: 00000000  Data: 0000
 +
        Capabilities: [60] Express Legacy Endpoint IRQ 0
 +
                Device: Supported: MaxPayload 128 bytes, PhantFunc 0, ExtTag-
 +
                Device: Latency L0s <512ns, L1 <64us
 +
                Device: AtnBtn- AtnInd- PwrInd-
 +
                Device: Errors: Correctable- Non-Fatal- Fatal- Unsupported-
 +
                Device: RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop-
 +
                Device: MaxPayload 128 bytes, MaxReadReq 512 bytes
 +
                Link: Supported Speed 2.5Gb/s, Width x1, ASPM L0s L1, Port 0
 +
                Link: Latency L0s <512ns, L1 <64us
 +
                Link: ASPM L1 Enabled RCB 128 bytes CommClk+ ExtSynch-
 +
                Link: Speed 2.5Gb/s, Width x1
 +
        Capabilities: [90] MSI-X: Enable- Mask- TabSize=1
 +
                Vector table: BAR=0 offset=00000000
 +
                PBA: BAR=0 offset=00000000
 +
        Capabilities: [100] Advanced Error Reporting
 +
        Capabilities: [140] Virtual Channel
 +
</pre>

Latest revision as of 08:34, 14 October 2008

ath9k is the new open source driver for newer atheros cards including those with 11n hardware support.

The ath9k module is included in the current kernel release 2.6.27. If your distribution does not yet have this kernel available as a package, these are instructions for installing it from source.

Preparation

Compiling your kernel is at a minimum going to require gcc, make and the qt3 development libraries to run the x-configuration utility. The names of these packages and how to install them will vary from distro to distro. You'll also want to add yourself to the src group so that you can do most of the kernel compilation as a regular user. You will have to log out and log back in for this change to take effect.

Debian

# aptitude install git-core build-essential kernel-package libqt3-mt-dev fakeroot
# adduser <you> src

Ubuntu

$ sudo aptitude install git-core build-essential kernel-package libqt3-mt-dev fakeroot
$ sudo adduser <you> src

Get the kernel sources

Download and unzip the kernel sources

$ cd /usr/src
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2
$ tar xvjf linux-2.6.27.tar.bz2
$ cd linux-2.6.27

Kernel config

This is the part most people are afraid of. However, you can use your current kernel's configuration as a baseline to help ease the pain. Most self-respecting distributions keep a copy of your kernel configuration in the /boot directory alongside the kernel itself. If this is not the case, you might find a copy of the kernel config at /proc/config.gz (which will of course needs to be gunziped). Whatever the case, you will want to copy the the current config file to the directory of the the kernel tree you are about to compile /usr/src/linux-2.6.27/.config

Debian/Ubuntu

$ cp /boot/config-`uname -r` ./.config

Configure the kernel

Now run

$ make xconfig

You'll likely see some messages in the terminal about unset or unrecognized configuration variables which automatically either get added or removed respectively. You might want to make sure the following are enabled

Networking → Networking Options → [Y]QoS and/or fair queueing (CONFIG_NET_SCHED)
Networking → Networking Options → QoS and/or fair queueing → [M]Multiband Priority Queueing (PRIO) (CONFIG_NET_SCH_PRIO)
Networking → Wireless Networking → [M]Improved wireless configuration API (CONFIG_CFG80211)
Networking → Wireless Networking → Improved wireless configuration API → [Y]nl80211 new netlink interface support (CONFIG_NL80211)
Networking → Wireless Networking → [Y]Wireless Extensions (CONFIG_MAC80211)
Networking → Wireless Networking → [M]Generic IEEE 802.11 Networking Stack (mac80211) (CONFIG_WIRELESS_EXT)
Networking → Wireless Networking → Generic IEEE 802.11 Networking Stack (mac80211) → Rate control algorithm selection → [Y]PID controller based rate control algorithm (CONFIG_MAC80211_RC_PID)

and most importantly

Device Drivers → [Y]Network Device Support (CONFIG_WLAN80211)
Device Drivers → Network Device Support → Wireless LAN → [Y]Wireless LAN (IEEE 802.11) (CONFIG_WLAN80211)
Device Drivers → Network Device Support → Wireless LAN → Wireless LAN (IEEE 802.11) → [m]Atheros 802.11n wireless cards support (CONFIG_ATH9K)

Also, unless you want to worry about creating an initrd (initial RAM disk), you're also probably best to build anything necessary to read your root filesystem into the kernel rather than as modules. This includes both filesystem (e.g. ext3) and low level hardware drivers (e.g. libata). The particular drivers required will depend on your particular setup. You can try and get an idea of what you might need to include by examining the output of lsmod. If you see any modules in there that might be required to boot the system, you should make sure you compile these in.

Make sure you save any changes you make before you exit.

Compilation

Now it's time to compile your kernel. If you have NCPU cpus, the generic way to do this is

$ make -j <NCPU+1>
$ su
# make modules_install
# cp arch/<your architecture>/boot/bzImage /boot/linux-2.6.27

Where <your architecture> will be x86 if you're running a 32-bit system or x86_64 if you're running 64-bit.

Then you'll have to set your bootloader to load the new kernel. If you're using grub, you'll add this to /boot/grub/menu.list or /etc/grub.conf or whatever

title	        Linux kernel 2.6.27
root		(hd#,#)
kernel		/boot/linux-2.6.27 root=/dev/<your root device> ro 

You're going to have to set (hd#,#) and root=/dev/<your root device> to reflect your boot device configuration. The best bet is probably to just copy and modify an existing entry.

NOTE!
If you compiled the drivers needed to access your root device (filesystem and hardware driver) as modules rather than building them directly into the kernel, you're going to have build an initrd, using something like mkinitramfs and add the resulting initrd to the above grub stanza as follows:

initrd /boot/initrd.img-2.6.27

Now reboot into your new kernel.

Debian/Ubuntu

Debian has a system to help you build kernels as Debian packages. If NCPU is the number of CPUs you have,

$ CONCURRENCY_LEVEL=<NCPU+1> fakeroot make-kpkg --append-to-version=.mykernel linux_image
$ su
(for Ubuntu, skip "su" and prepend the below commands with "sudo")

Note: if running Debian with initrd, you can run:

$ CONCURRENCY_LEVEL=<NCPU+1> fakeroot make-kpkg --initrd --append-to-version=.mykernel linux_image

# dpkg -i /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_amd64.deb

or if you're running 32-bit i386

# dpkg -i /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_i386.deb

Note: As of 2008-09-13, if running Debian or Ubuntu and you have previously built any 2.6.27-rc kernel, you must use force-overwrite when using dpkg. [See http://lkml.org/lkml/2008/9/11/62]

# dpkg -i --force-overwrite /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_amd64.deb

or if you're running 32-bit i386

# dpkg -i --force-overwrite /usr/src/linux-image-2.6.27.mykernel_2.6.27.mykernel-10.00.Custom_i386.deb

Again it is recommended that you build what you need into your kernel. However, if aren't sure what is needed to read your root file system and so can't just build it into your kernel, you can create an initrd using update-initramfs

# update-initramfs -c -k 2.6.27.mykernel
# update-grub

Ok, now see if it worked

Once you have your kernel compiled and install, reboot and choose it from your grub or lilo menu. Hopefully it boots Ok, and you can open a command line and # modprobe ath9k
# iwconfig
The first command should hopefully generate no errors and the second is purely diagnostic and should show you a working wireless device. You can then proceed to use wpa_supplicant or network manager or iwconfig to setup your wireless networking.

Hardware specific

168c:0024 (MacBook Wireless)

Currently with this hardware (output of lspci -vvv), the driver installs, but does not allow association with an access point.

02:00.0 Network controller: Atheros Communications, Inc. Unknown device 0024 (rev 01)
        Subsystem: Apple Computer Inc. Unknown device 0087
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR-
        Latency: 0, Cache Line Size: 256 bytes
        Interrupt: pin A routed to IRQ 17
        Region 0: Memory at 50100000 (64-bit, non-prefetchable) [size=64K]
        Capabilities: [40] Power Management version 2
                Flags: PMEClk- DSI- D1+ D2- AuxCurrent=375mA PME(D0+,D1+,D2-,D3hot+,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [50] Message Signalled Interrupts: Mask- 64bit- Queue=0/0 Enable-
                Address: 00000000  Data: 0000
        Capabilities: [60] Express Legacy Endpoint IRQ 0
                Device: Supported: MaxPayload 128 bytes, PhantFunc 0, ExtTag-
                Device: Latency L0s <512ns, L1 <64us
                Device: AtnBtn- AtnInd- PwrInd-
                Device: Errors: Correctable- Non-Fatal- Fatal- Unsupported-
                Device: RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop-
                Device: MaxPayload 128 bytes, MaxReadReq 512 bytes
                Link: Supported Speed 2.5Gb/s, Width x1, ASPM L0s L1, Port 0
                Link: Latency L0s <512ns, L1 <64us
                Link: ASPM L1 Enabled RCB 128 bytes CommClk+ ExtSynch-
                Link: Speed 2.5Gb/s, Width x1
        Capabilities: [90] MSI-X: Enable- Mask- TabSize=1
                Vector table: BAR=0 offset=00000000
                PBA: BAR=0 offset=00000000
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [140] Virtual Channel