Is there any way to install Atheros e2400 drivers?

I have a new motherboard: MSI Z170A GAMING M5. This motherboard has an Atheros killer e2400 Ethernet controller. When I do lspci -nn, I get:

03.00.0 Ethernet controller [0200]: Qualcomm Atheros Device [1969:e0a1] (rev 10)

Google didn't seem to know the answer. Only a similar unsolved problem on the openSUSE forum.


Solution 1:

I am posting this from my Skylake MSI Z170A GAMING M5 build using my Killer E2400 on Ubuntu Gnome! Below are the (more or less) simple steps I used to get it working.

First we'll follow some instructions from Ubuntu

sudo apt-get build-dep linux-image-$(uname -r)
sudo apt-get install git
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-vivid.git

That git URL is for 15.04 Vivid Vervet. You would replace vivid with your release codename. That last step can take a little while, so relax and bask in the knowledge that your E2400 will soon be working.

Once that is finished, we'll modify the alx driver to include our E2400 (feel free to use your text editor of choice)

cd ubuntu-vivid/drivers/net/ethernet/atheros/alx/
sudo -H gedit reg.h

Find the line defining ALX_DEV_ID_E2200 (you can just search for E2200), and add this below it

#define ALX_DEV_ID_E2400                0xe0a1

Next,

sudo -H gedit main.c

Again, find E2200, and after the lines { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2200), .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, add

{ PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2400),
  .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG },

Now, all that's left is to make and install the drivers

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
sudo modprobe -r alx
sudo depmod
sudo modprobe -v alx

Note: You after executing the last line, you should see the module load from ...extra/alx.ko If you do not, you may need to rename the alx.ko that it did find to alx.ko.bak or something of the sort, and run the last three commands again.

Your E2400 should now appear for your networking enjoyment!

Solution 2:

Update for Ubuntu 14.04 (Trusty):

According to chili555's comment on a similar question that device is supported by the kernel shipped with Ubuntu 16.04. Luckily one can upgrade to the same kernel in Ubuntu 14.04 via LTS/HWE upgrades:

  1. Install the kernel packages:

    sudo apt install linux-generic-lts-xenial
    
  2. Reboot the machine. The newly installed kernel should be the new default boot option for Grub.

More info: Ubuntu Wiki – LTS Enablement Stack


Original post (still applicable to other Ubuntu releases before 16.04)

Short of applying the appropriate patch and recompiling the affected kernel module, you may be able to register new PCI device IDs (documentation) with existing device drivers:

Writing a device ID to this file will attempt to dynamically add a new device ID to a PCI device driver. This may allow the driver to support more hardware than was included in the driver's static device ID support table at compile time. The format for the device ID is: VVVV DDDD SVVV SDDD CCCC MMMM PPPP. That is Vendor ID, Device ID, Subsystem Vendor ID, Subsystem Device ID, Class, Class Mask, and Private Driver Data. The Vendor ID and Device ID fields are required, the rest are optional. Upon successfully adding an ID, the driver will probe for the device and attempt to bind to it. For example:

# echo "8086 10f5" > /sys/bus/pci/drivers/foo/new_id

So in this case, you should be good with:

sudo modprobe alx
echo 1969 e0a1 | sudo tee /sys/bus/pci/drivers/alx/new_id >/dev/null

I guessed the driver name alx from the patch mentioned in the comments. If it's not the right driver module name, search for an alternative.