Dell XPS 13 9350 (late 2015 model) and Ubuntu

This is pretty new hardware and sadly, not everything works out of the box. Here’s a brief collection of notes about getting Ubuntu to run. Some of these settings may not be necessary, but they’re the ones that let me get to a working state.



  • General -> Advanced Boot Options, set Enable Legacy Option ROMs
  • Secure Boot -> Enable, set to Disabled
  • System Configuration -> SATA Operation, set to AHCI (this will break Windows. You should reinstall it before installing Linux if you want a dual-boot system.)
  • POST Behavior -> Fastboot, set to Thorough

Installation via USB key:

I like to use (Windows) and put a live system on a USB key and install from that. I used plain Ubuntu (, but I’m wagering that you can use any of the derivatives or other distros, too. Make sure to get the latest one; at the time of writing it’s 15.10 (64bit).

With the USB key attached, turn on the laptop and wait for it to display the DELL logo, then hammer away at that F12 key (boot option). You’ll see a list of boot device options, including some for UEFI and some for Legacy boot methods. Choose your USB key from the latter list (should be near the top).

At this point, boot into a Ubuntu live system. This should go without a hitch. Once booted, you’ll notice that your wifi doesn’t work, but more about that later. Start the installation and make your choices. If you want a dual boot setup, you’ll need to resize your Windows partition and then create two partitions manually; a larger ext4 for Ubuntu and a smaller swap (rule of thumb says equal the size of your RAM; I used 8192MiB). The device to install the bootloader (GRUB) to is /dev/nvme0n1, not the incorrectly pre-set /dev/nvme. Installation should go mostly fine, but you’ll not be able to get any updates from the internet during because we don’t have wifi yet.

Reboot and boot into Ubuntu. Which should be blazingly fast (and work).


The default wifi chip in the XPS 13 is a Dell DW1820A which is a combined bluetooth/wifi ac 2×2 device attached via PCIe. Bluetooth works out of the box, though for pairing/tethering for network access with my Android smartphone, I’ve had to manually disable the audio redirection on the phone.

The wifi portion is done by a chip from Broadcom, BCM4350, which has the PCI ID 14e4:43a3 and does not have support in any 4.2 (which is Ubuntu 15.10’s kernel) or 4.3 kernels yet. There is however a pretty recent (mid-September) patch that enables support for it, plus another patch that adds the necessary(?) firmware file to it, both of which apply to the experimental version of the kernel built on top of the 4.3 kernel. According to this, general support is planned for the 4.4 kernel. So… see you guys in a year. Just kidding.

UPDATE: Kernel 4.4-rc1 is upon us and it fixes a dirty USB-related bug that consumed CPU. Instructions/Repo URL updated below. CPU still at 100% if no USB device is attached. That’s some weird shit.

We’ll need to get a hold of those newer commits as well as that firmware patch, and then compile our own kernel.

  1. Connect your laptop to the Internet.
    Since there’s no physical Ethernet jack on the device, you may wanna do this via USB/bluetooth -> wifi tethering via your phone, or get one of those USB wireless/Ethernet adaptors.
    This is a tricky spot; if you’re stuck here, get desperate and download all the packages from another computer to copy them onto the laptop and set up a new source entry for apt that points to that local repository.
  2. Get a hold of the following packages via apt-get:
    sudo apt-get install git build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache
  3. Grab a copy of the net-next kernel repository:
    git clone git://
  4. Copy over your current Ubuntu kernel configuration to save some labour: (more detailed infos here)
    cd net-next
    cp /boot/config-`uname -r` .config
    make oldconfig
  5. At this point, you’ll be prompted for several new kernel settings. Just hitting enter (= choosing the default option) is a good choice, just look out for prompts about brcmfmac (the driver that handles the wifi chip).
  6. Run this and wait an hour or so. Do something with the kids. Play a game. (LOCALVERSION can be set to anything you’d like, it’s just for you to recognize that you built this particular kernel.)
    make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-custom
  7. The above command will compile the kernel and generate Debian-style packages to later install from the directory above. they should look somewhat like this:
    julian@constellation:~$ ll -h *.deb
    -rw-r--r-- 1 julian julian 944K Nov 11 01:48 linux-firmware-image-4.3.0-jules_4.3.0-jules-3_amd64.deb
    -rw-r--r-- 1 julian julian 6,9M Nov 11 01:49 linux-headers-4.3.0-jules_4.3.0-jules-3_amd64.deb
    -rw-r--r-- 1 julian julian 44M Nov 11 01:51 linux-image-4.3.0-jules_4.3.0-jules-3_amd64.deb
    -rw-r--r-- 1 julian julian 426M Nov 11 02:23 linux-image-4.3.0-jules-dbg_4.3.0-jules-3_amd64.deb
    -rw-r--r-- 1 julian julian 798K Nov 11 01:49 linux-libc-dev_4.3.0-jules-3_amd64.deb
  8. Install those packages:
    cd ..
    sudo dpkg -i linux-image-4.3.0-jules_4.3.0-jules-3_amd64.deb
    sudo dpkg -i linux-headers-4.3.0-jules_4.3.0-jules-3_amd64.deb
  9. Grab this patch and apply it as root to your firmware folder:
    sudo -s
    cd /lib/firmware
    git apply ~/brcm4350.patch
  10. Reboot.

GRUB should have your new 4.3.0-custom kernel selected as the default. If you want to check, hit “e” in the boot menu and scan through the last few lines, it should mention the kernel’s LOCALVERSION you set above. You can boot from there with F10.

After you boot up, wifi should work out of the (new) box.


The net-next kernel isn’t without its issues. For example, some part of the USB system seems broken as i have kworker/ksoftirqd threads that consume a full CPU core as long as no USB devices are plugged in. That drains the battery real good. Going back to earlier commits may help in tracing down this issue, unfortunately I currently don’t have any spare time to do that.

UPDATE: This issue is fixed with 4.4-rc1. Still there.

Battery consumption isn’t that nice. Where with last year’s model you could apparently get as little as ~3.5W of power consumption, this year’s model gives me between 7 and 8W 6 and 7W in idle at 50% screen brightness and around 6W at the lowest, non-off brightness setting. Maybe future kernel patches will change this, but Skylake is allegedly already well-supported in kernel 4.3.0.

Further reading material

PSA: New domain name

Just a quick heads up, since DynDNS has, unbeknownst to me, changed their SLA, effectively deleting – my now over a decade old host alias – I was forced to create a new redirect with a different company.

So if you come across a URL that starts with, simply substitute it by

Oh, and fuck you, DynDNS, for those bogus “you have to login into the web interface once per 30 days”.

That is all.

Watch streams in VLC

The increase in popularity of user-generated streams, driven by Starcraft II and several of the games in the moba genre, has given rise to an enormous expansion of streaming providers such as and Unfortunately, to enjoy these streams, you’re usually tied to a browser window and the flash player to enjoy these streams. You can name the upsides of this solution all you want, but the obvious downsides remain:

  • doesn’t work on systems that don’t have the flash player (like those heinous i-devices)
  • introduces horrible usability, e.g.:
    • no volume adjusting by scroll wheel or multimedia keys
    • no clicking onto the video to bring focus to it (without it redirecting you to some page)
    • no small window-borders, instead you have the cluttered browser ui where it’s completely unnecessary
    • no way of viewing the actual resolution of the stream’s video data
  • high cpu load when VLC can playback h264 using the GPU’s video decoding unit to do this more efficiently

… i guess you catch my drift.

Sadly, streaming providers such as the aforementioned ones don’t provide a portable, universally usable address that users can just plug into their system’s favorite video player to playback these streams. This is where this article comes in.

Continue reading

Android MIUI Camera for other ROMs


As someone who loves tinkering with his gadgets and tries to get the most out of them, i’ve always been somewhat disappointed with camera applications available for the android platform. Usually, they either cost money (Vignette), or are crappy anyway (Camera360), just adding some colorization filters to the functionality that is already provided by the stock Android camera.

The HTC camera applications that ship with their Sense UI are usually better than anything you’ll find in the Android market, sadly though, they rely on proprietary libraries shipped with Sense, which itself heavily modifies the Android UI system. Bottom line: unless you’re running a Sense ROM on your HTC Device, you simply can’t use the stock HTC Sense camera application.

As lots of people prefer a stable non-Sense (ha ha!) ROM such as Cyanogenmod on their device, running the HTC application is out of the question, and usually you’ll find a lot of people discontent with the stock Android camera app’s functionality. It lacks proper focusing modes (like tap to focus), the UI looks like it was written for the Gameboy and usually, you don’t find a lot of options to adapt the application’s behavior like shutter sounds.

Continue reading

Chrome extension to remotely add torrents to WebUIs

It has been an entire year since I’ve last posted an article, and what better opportunity than the one year anniversary of that last post could there possibly be to present the offspring of my latest surge in productivity? None, i tell you!

About Chrome

Google Chrome, the up and coming web browser draws people toward itself in very much the same way that moths are drawn to the corona of a watchtower, exceeding the 10% mark in terms of total browser market share and thereby bringing the WebKit HTML rendering engine to almost double as many people as Apple’s Safari has been able to.

As a relatively new browser (2.5 years old), and similar to most popular applications that permit the development of plug-ins, it has always had a flourishing community of developers that try and augment its capabilities to the best of their abilities (to the extent that Chrome allows them), and today I’m taking the time to introduce one that in its current form isn’t yet known to the Chrome platform.

Continue reading

Netgear WNR3500L, Tomato und T-Home Entertain über VDSL

So. Lange (über ein Jahr) ists her, dass mich mein VDSL-Anschluss in ungeahnte Bandbreitensphären befördert hat. Für das erste halbe Jahr hatte ich ‘nen WRT54GL mit Tomato dran laufen – da lief Entertain nicht. Nach besagtem halben Jahr stellte ich ‘nen zweiten WRT54G hin – per Switch zusammen mit dem WRT54GL ans Modem (Speedport 300hs) angeschlossen – und hatte dann auch nach einiger Konfigurationsarbeit den Media-Receiver am Laufen. Nach viel Arbeit hab ich in diesem Jahr nun endlich eine Lösung für Tomato-Liebhaber, die einen in jeder Facette glücklich machen dürfte.

Das Ganze benötigt immer noch einiges an Konfiguration, aber läuft stabil und beinahe alles funktioniert.

Continue reading

WRT54GL, Tomato und VDSL

Hier die versprochene Kurzanleitung. (jetzt noch kuerzer fuer Tomato 1.25!)

zunaechst mal den WRT wie gewohnt auf PPPoE konfigurieren. Fuer die weiteren Schritte muss entweder Telnet oder SSH (Administration -> Admin Access) aktiviert sein. Als Telnet-/SSH-Client bietet sich unter Windows PuTTY an.

Man loggt sich also auf den WRT ein und gibt folgende Befehle ein:

nvram set vlan7hwname=et0
nvram set vlan7ports=”4t 5″
nvram set wan_ifnameX=vlan7
nvram commit

Man beachte, dass es sich hinter “et” um eine NULL handelt. Durch den Commit wird das ganze abgespeichert. Der Rest laeuft ueber das Web-Interface ab. Unter Administration -> Scripts legen wir im Init-Script folgende Zeilen ab:

ifconfig vlan7 up
service wan stop
service wan restart

Das Ganze noch abspeichern und den Router rebooten. Ab da sollte der Router sich dann kurz nach dem Hochbooten erfolgreich einwaehlen.

Wer die maximale Geschwindigkeit vermisst (ein WRT54GL schafft mit dem Stock-Speed von 200Mhz nur knappe 35Mbit/s), kann zusaetzlich seinen Router einen Tick (naja, 25%!) uebertakten. Hier wieder per Telnet/SSH:

nvram set clkfreq=250
nvram commit

und rebooten – ohne QoS bekommt man beispielsweise per Bittorrent dann einigermassen stabile 5,5MByte/s.

Angemerkt sei weiterhin, dass es sich hier immernoch nicht um die perfekte Loesung handelt. Man muss zwar nicht mehr selbst Hand anlegen, damit er sich einwaehlt; es handelt sich bei den Befehlen im Init-Script allerdings um einen moeglicherweise zeitverschlingenden Workaround, der mit einer neuen Tomato-Version sicherlich schoener zu loesen ist. Zu gegebenem Zeitpunkt werd ich diesen Artikel dann anpassen.