<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zulhilmi Zainudin</title>
    <description>The latest articles on DEV Community by Zulhilmi Zainudin (@zulhfreelancer).</description>
    <link>https://dev.to/zulhfreelancer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F331733%2Fc02d5cba-b206-43b3-9d16-ae75454543b1.jpeg</url>
      <title>DEV Community: Zulhilmi Zainudin</title>
      <link>https://dev.to/zulhfreelancer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zulhfreelancer"/>
    <language>en</language>
    <item>
      <title>Fix Your UGREEN WiFi USB Dongle on Debian / Ubuntu</title>
      <dc:creator>Zulhilmi Zainudin</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:20:28 +0000</pubDate>
      <link>https://dev.to/zulhfreelancer/fix-your-ugreen-wifi-usb-dongle-on-debian-ubuntu-218o</link>
      <guid>https://dev.to/zulhfreelancer/fix-your-ugreen-wifi-usb-dongle-on-debian-ubuntu-218o</guid>
      <description>&lt;p&gt;A small step-by-step guide for the UGREEN WiFi dongle that uses the&lt;br&gt;
&lt;strong&gt;AIC8800D80&lt;/strong&gt; chip. Linux does not ship a driver for it, so we will&lt;br&gt;
install one that works.&lt;/p&gt;

&lt;p&gt;Each step is short. Just follow it top to bottom.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to know this guide is for you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Plug in the dongle.&lt;/li&gt;
&lt;li&gt;Run this in a terminal:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   lsusb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Look for a line like one of these:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   a69c:5723   (shows for the first ~10 seconds, then changes)
   a69c:8d80   (this is the one we want)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you see &lt;code&gt;a69c:8d80&lt;/code&gt; (or it was &lt;code&gt;a69c:57xx&lt;/code&gt; a moment ago), this guide&lt;br&gt;
is for you. The dongle pretends to be a small USB stick first, then&lt;br&gt;
switches to WiFi mode. That is normal.&lt;/p&gt;


&lt;h2&gt;
  
  
  What you need before starting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A computer with &lt;strong&gt;Debian&lt;/strong&gt; or &lt;strong&gt;Ubuntu&lt;/strong&gt; (or a version of Mint, etc.)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;password&lt;/strong&gt; for your user account (for &lt;code&gt;sudo&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Some way to get online &lt;strong&gt;right now&lt;/strong&gt; — the internal WiFi, a phone
USB-tether, or a network cable. We need to download one file.&lt;/li&gt;
&lt;li&gt;About &lt;strong&gt;15 minutes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 1 — Install the tools
&lt;/h2&gt;

&lt;p&gt;Copy and paste this whole block, then press Enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; dkms build-essential git &lt;span class="s2"&gt;"linux-headers-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs the compiler tools and the headers for &lt;strong&gt;your current&lt;br&gt;
kernel&lt;/strong&gt;. The last part is written so it works on Debian, Ubuntu and&lt;br&gt;
Mint alike — it picks the right package name automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it worked:&lt;/strong&gt; this command should print a folder path ending in &lt;code&gt;/build&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /lib/modules/&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it says "No such file or directory", stop here — the headers for&lt;br&gt;
your running kernel are missing. Fix that first.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2 — Download the driver
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/shenmintao/aic8800d80.git ~/aic8800d80
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/aic8800d80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You now have the driver code in a folder called &lt;code&gt;aic8800d80&lt;/code&gt; in your&lt;br&gt;
home directory.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3 — Run the installer
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This does everything for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copies the firmware files to the right place,&lt;/li&gt;
&lt;li&gt;builds the driver and installs it,&lt;/li&gt;
&lt;li&gt;sets it to rebuild automatically after future system updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait until you see &lt;strong&gt;INSTALLATION COMPLETED SUCCESSFULLY&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If your computer uses &lt;strong&gt;Secure Boot&lt;/strong&gt;, the tool will ask about it.&lt;br&gt;
If you do not know what that is, just answer &lt;code&gt;y&lt;/code&gt; to continue, and if&lt;br&gt;
the driver later fails to load, you will need to turn Secure Boot off&lt;br&gt;
in your BIOS/UEFI settings (out-of-scope of this guide).&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 4 — Unplug and replug the dongle
&lt;/h2&gt;

&lt;p&gt;This part matters. Do it exactly like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pull the dongle out.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait 5 seconds.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plug it back in.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives the chip a clean restart so the new driver can talk to it&lt;br&gt;
from scratch. A reboot also works, but the replug is faster.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5 — Check that it works
&lt;/h2&gt;

&lt;p&gt;Wait about 10 seconds after replugging, then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsusb | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; aic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want to see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a69c:8d81   (note: 8d81 — different from before, that is good)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the WiFi interface exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for a name that starts with &lt;code&gt;wlx&lt;/code&gt; followed by a mix of letters&lt;br&gt;
and numbers, for example &lt;code&gt;wlx1234567890ab&lt;/code&gt; (the exact letters/numbers&lt;br&gt;
differ per device — that is fine).&lt;/p&gt;

&lt;p&gt;Finally, scan for networks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmcli device wifi list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see nearby networks — &lt;strong&gt;done, you have working WiFi!&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;p&gt;Connect to your network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmcli device wifi connect &lt;span class="s2"&gt;"YOUR_WIFI_NAME"&lt;/span&gt; password &lt;span class="s2"&gt;"YOUR_WIFI_PASSWORD"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the text in quotes. Keep the quotes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  It fails at step 3 or no WiFi appears after replugging
&lt;/h3&gt;

&lt;p&gt;Your dongle may be an older hardware revision. Check with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"chip_mcu_id|upload fail"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you see &lt;code&gt;chip_mcu_id = 1&lt;/code&gt; &lt;strong&gt;or&lt;/strong&gt; &lt;code&gt;bin upload fail: 170400&lt;/code&gt;,
switch to the special branch for your hardware:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;cd&lt;/span&gt; ~/aic8800d80
  git fetch origin
  git switch legacy-mcu1
  &lt;span class="nb"&gt;sudo&lt;/span&gt; ./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Do not skip &lt;code&gt;sudo ./install.sh&lt;/code&gt;!&lt;/strong&gt; Just switching the branch&lt;br&gt;
  changes nothing on its own — the installer is what actually replaces&lt;br&gt;
  the firmware files on disk. Wrong old firmware files can even make&lt;br&gt;
  the whole system freeze, so let the installer do its full job.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then &lt;strong&gt;unplug, wait 5 seconds, and replug&lt;/strong&gt; the dongle, and try
Step 5 again.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The dongle is completely silent — no errors, no network names
&lt;/h3&gt;

&lt;p&gt;A failed first attempt can leave the chip stuck ("wedged"). The fix is&lt;br&gt;
always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unplug the dongle.&lt;/li&gt;
&lt;li&gt;Wait about &lt;strong&gt;10 seconds&lt;/strong&gt; (not less).&lt;/li&gt;
&lt;li&gt;Plug it back in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A normal reboot also fixes it. USB-level resets from software are&lt;br&gt;
&lt;strong&gt;not&lt;/strong&gt; enough — the chip needs a real loss of power.&lt;/p&gt;
&lt;h3&gt;
  
  
  The driver worked yesterday but broke after a system update
&lt;/h3&gt;

&lt;p&gt;System updates install a new kernel, and the driver must be rebuilt&lt;br&gt;
for it. Normally this happens automatically. To check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dkms status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good output looks like &lt;code&gt;aic8800/1.0.0, ...: installed&lt;/code&gt; (the word&lt;br&gt;
&lt;strong&gt;installed&lt;/strong&gt; is the important bit).&lt;/p&gt;

&lt;p&gt;If it says something else, rebuild by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/aic8800d80
git switch legacy-mcu1   &lt;span class="c"&gt;# only if you switched earlier&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The install of system updates fails with a "linux-headers" error
&lt;/h3&gt;

&lt;p&gt;An old, half-removed driver can block system updates. Remove it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dkms status                    &lt;span class="c"&gt;# note any "aic8800" lines&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dkms remove aic8800/1.0.6 &lt;span class="nt"&gt;--all&lt;/span&gt;   &lt;span class="c"&gt;# use the version number you saw&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;--configure&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;       &lt;span class="c"&gt;# un-stick the blocked updates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then redo this guide from Step 2.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uninstalling (if you ever need to)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/aic8800d80
&lt;span class="nb"&gt;sudo &lt;/span&gt;dkms remove aic8800/1.0.0 &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /lib/firmware/aic8800&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Can I delete the &lt;code&gt;~/aic8800d80&lt;/code&gt; folder afterwards?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, it is safe.&lt;/strong&gt; During installation, the installer made its own&lt;br&gt;
copy of everything in &lt;code&gt;/usr/src/aic8800-1.0.0&lt;/code&gt;, and that is the copy&lt;br&gt;
the system uses to rebuild the driver after future kernel updates.&lt;br&gt;
Your home folder version is not needed for day-to-day use.&lt;/p&gt;

&lt;p&gt;The only reasons to keep it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you might need to run the installer again while troubleshooting
(for example, switching to the &lt;code&gt;legacy-mcu1&lt;/code&gt; branch), and&lt;/li&gt;
&lt;li&gt;re-downloading is one command anyway (&lt;code&gt;git clone&lt;/code&gt; in Step 2), so
deleting it costs you nothing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  About this guide
&lt;/h2&gt;

&lt;p&gt;This guide was &lt;strong&gt;written by an AI assistant&lt;/strong&gt; (Claude Code). The steps&lt;br&gt;
come from a real, working installation on &lt;strong&gt;one&lt;/strong&gt; computer: Debian 13,&lt;br&gt;
kernel 6.12, with a UGREEN dongle whose chip turned out to be the older&lt;br&gt;
"MCU1" hardware revision.&lt;/p&gt;

&lt;p&gt;Because it was written on one machine, it may contain mistakes or miss&lt;br&gt;
cases that differ on your setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Found a mistake?
&lt;/h3&gt;

&lt;p&gt;Please leave a comment to correct it — write your correction below so it can be fixed for everyone.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tested on Debian 13 (trixie) with kernel 6.12. Driver source:&lt;br&gt;
&lt;a href="https://github.com/shenmintao/aic8800d80" rel="noopener noreferrer"&gt;shenmintao/aic8800d80&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>howto</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
