Ubuntu (or other Linux) on the Asus Transformer Book T100

Standard

This post is now out of date — see the latest update, here

The T100 is a nice little convertible tablet/netbook.

My aim is to get a “perfect” Ubuntu installation on the T100, such that it can be used successfully as a daily machine in both netbook and tablet modes.

GLXGears in tablet mode

GLXGears in tablet mode


Unfortunately Linux support right now is quite rudimentary, and installing it requires us to jump through a few hoops. The situation is improving rapidly however. So I will keep updating this How-to as new drivers become available and things improve. See the latest update.

Warning

Eventually I expect hardware support for the T100 will be excellent, but we are not there yet. In order to get the best support possible, we will be using bleeding-edge builds and the latest Linux kernels. If you’d just prefer an easy life, come back in October and just install Ubuntu 14.10.

That said, this little convertible is a lovely machine, and Ubuntu/unity works very nicely on it — finally Unity has a purpose! The more people get on for the ride now, the quicker we can test and iron out bugs.

*** This post will constantly be updated as in-kernel support improves ***

Current status (updated 23/03/2014)

I’ll update this whenever I manage to get new things working. I will only add items to the How-to below that are confirmed to work well.

  • Graphics: Working with accelerated (3D) graphics 7/10
  • Wifi: Working, but often drops connection [working on improving this] 6/10
  • Touchscreen: Working, with multi-touch out of the box 10/10
  • Sound: Working, with patches 8/10
  • SD card reader: Working, some configuration needed (thanks akira) 9/10
  • Battery monitoring: Working, with patches 8/10
  • Tablet keys (Volume up/down etc): Not yet working 0/10
  • Power management (Suspend/resume): Not yet working 0/10
  • Orientation sensor: Not yet working [currently testing] 0/10
  • Backlight & ambient light sensor: Backlight not adjustable. Light sensor works with custom driver 5/10
  • Touchpad: Working, no multitouch yet 8/10
  • Shutdown / reboot: Working, with patches 9/10

1. First steps: Preparing for the Ubuntu Install

First things first, update using Asus LiveUpdate to the latest “BIOS” available. At the time of writing, that is v304. Do any backing up of Windows / recovery partitions. I’ll leave the details of that up to you.

Before we attempt to boot Linux on the T100, we need to do some preparation, so start in Windows. Download the latest daily AMD64 build of Ubuntu 14.04 from here.

Download the Rufus USB bootable image creator, and “burn” your downloaded ISO to a spare USB stick. In Rufus, for “Partition scheme and target system type”, choose “GPT partition scheme for UEFI computer”. For “File System”, choose “FAT32″, and leave the rest at default. At the bottom, check “Create a bootable disk using: ISO Image” and select your downloaded Ubuntu image, then hit “Start”.

When your USB stick is ready, close Rufus. It should now be browseable in Windows. Browse to the EFI\Boot directory, and place this bootloader (named bootia32.efi) there. This bootloader was compiled from source using the latest Grub2. If you don’t trust random downloaded files from the Internet (and you shouldn’t), you can find the instructions for building it yourself here.

2. Booting the Live Image

Now, insert the USB stick and reboot to the firmware (BIOS). You can do this in Windows by holding shift when pressing “restart”, then touching Troubleshoot → Advanced Options → UEFI Firmware Settings → Restart.

Once there, disable SecureBoot, then visit the boot options, and ensure the USB stick is the first in the list.

Press F10 to save settings, and after a few seconds you will be in the GRUB bootloader. Before the timeout, immediately hit CTRL-ALT-DEL. This will reboot the computer again, but this time you will have the laptop’s native resolution (rather than being stuck at 800×600 from the “bios”).

In the GRUB menu, highlight “Try Ubuntu”, and press “e” to edit it. In the editing screen, scroll down to the command line options, where it says “quiet splash”. Delete “splash” and replace it with:
video=VGA-1:1368x768e reboot=pci,force

Then press F10 to boot. You should get all the way to the Desktop.

3. Installing the distro

Click the “Install Ubuntu” desktop icon to install Ubuntu permanently.

The partitioning scheme you choose is up to you — but you will need to preserve the EFI partition, so don’t just partition the entire disk for Ubuntu.

In addition to the EFI partition, I prefer separate /, /home and /boot mount points; but that is up to you. You could squish down the Windows partition and created the additional partition(s), or just delete the Windows partition altogether if you don’t need it.

When done, reboot, leaving the USB stick in.

4. First boot

Ubuntu won’t boot yet. We’ll need to compile our own bootia32.efi to use with Grub. To do that we really need a wireless connection. So we’ll boot manually, fix up wireless, and fix Grub.

Boot back to the Grub welcome screen on the USB stick. Hit ‘c’ to drop to a Grub command line.

You’ll need to provide Grub with the path to your kernel and initrd to boot. First, the path to the kernel:


linux (hd2,gpt5)/boot/vmlinuz-3.13-xxxx root=/dev/mmcblk0p5 video=VGA-1:1368x768e reboot=pci,force

Here, (hd2, gpt5) refers to the fifth partition on the third disk (Partition numbering begins at 1 and disk numbering begins at 0). This will vary depending on how yo uinstalled and your T100 model. On my 32GB model, Grub assigns the USB stick as hd0, the read-only recovery flash chip as hd1, and the main internal flash as hd2. gpt5 is the fifth partition, but it will depend on how you installed.

Fortunately, grub has good auto-completion features, so you can hit twice as you type, and grub will list possible completions for you — just keep trying until you see the various vmlinuz kernels.

The root=/dev/mmcblk0p5 will also depend on the partition you installed to. It will be your root partition. Unfortunately this can’t be auto-completed, so if you can’t remember your partition setup, you’ll need to try by trial and error.

To complete the line, press Enter.

Then you need to specify the location of your initrd. This is easy, it’s in the same place as the kernel:
initrd (hd2,gpt5)/boot/initrd-3.13-xxxx

Then Enter.

Then boot with:
boot

With luck after hitting Enter, you’ll boot through to Ubuntu. If not, don’t be disheartened — keep trying.

5. Enabling wifi

To get further, we’ll need wifi. However internal wifi on the T100 isn’t terribly reliable under Linux yet. If you have access to another wifi dongle, you might want to try that until you’re fully set up.

The driver is already included, but it needs some firmware and a copy of your system’s wifi nvram:

  • Grab the Wifi firmware here (from the Linux-wireless repository). Copy it to /lib/firmware/brcm/brcmfmac43241b4-sdio.bin
  • The NVRAM is difficult to get right now, as 32-bit EFI runtime services aren’t yet available on 64-bit. But you can use my NVRAM — get it here and copy it to /lib/firmware/brcm/brcmfmac43241b4-sdio.txt

You’ll now need to reboot using the same procedure again, and wifi should be working.

However, I found wifi performance to be very poor — there are some bugs in the driver. This is improved somewhat with the latest kernel, which we will upgrade to in a later step. I managed to improve performance somewhat by using the NVRAMs from other platforms, and splicing in some of the missing variables. You can see my tries here. In all cases, copy them to /lib/firmware/brcm/brcmfmac43241b4-sdio.txt , and reboot or unload/reload the wifi driver:

sudo modprobe -r brcmfmac
sudo modprobe brcmfmac

If you find a firmware/nvram combination that works really well, please share.

6. Completing the installation

We can’t keep rebooting like this… so let’s fix Grub. This assumes you now have a working Internet connection.

We’ll need some build tools — install them:


sudo apt-get update && sudo apt-get install git bison libopts25 libselinux1-dev autogen m4 autoconf help2man libopts25-dev flex libfont-freetype-perl automake autotools-dev libfreetype6-dev texinfo ia32_libs build_essential

Then get the Grub source:
git clone git://git.savannah.gnu.org/grub.git

Now build it:

cd grub
./autogen.sh
./configure --with-platform=efi --target=i386 --program-prefix=""
make

And install to efi:


cd grub-core
sudo ../grub-install -d . --efi-directory /boot/efi/ --target=i386

This will create a directory, ‘grub’, in your EFI partition.
We want to copy the grubia32.efi from there to the location Ubuntu created during installation:


cd /boot/efi/EFI
sudo cp grub/grubia32.efi ubuntu/grubx64.efi

This should be enough to allow you to boot from the “ubuntu” option in your EFI firmware.

Before you boot, let’s add the default command line options to Grub.

Open /etc/default grub in a text editor:
sudo nano /etc/default/grub

And edit the GRUB_CMDLINE_LINUX_DEFAULT exactly as we did before. When done, hit ctrl-o to save then ctrl-x to exit. Then, to update Grub:
sudo update-grub

Congratulations! you should now be able to boot/reboot directly to the Ubuntu desktop!

7. Upgrading to the bleeding edge to improve hardware support

There are still a lot of things to get working. The best way to improve hardware support further is to use the latest development branches of the kernel.

Unfortunately (as at the time of writing), even the latest development Linux kernel (3.14-rc5) lacks some key hardware support for Baytrail tablets. But we can improve that by pulling in latest patches for sound. We’ll also compile in a new experimental feature for accessing 32-bit EFI services from a 64-bit system, as we need that for tools like efibootmgr to work. Finally, we’ll pull in the latest wireless fixes and the latest power management changes. We need to power management changes for our battery patch.

I recommend you compile this on a fast desktop computer with a decent network connection. You could do this on your tablet, but it would be extremely slow. For the following instructions, I assume you’re using a recent 64-bit Ubuntu on a desktop. If you’re using 32-bit, you’ll have to change the instructions to cross-compile — I’ll leave that up to you (and Google).

On your compiling machine, install the packages you’ll need to build a kernel:

sudo apt-get install git build-essential fakeroot crash kexec-tools makedumpfile kernel-wedge libncurses5 libncurses5-dev
sudo apt-get build-dep linux-image-$(uname -r)

Then create a working directory, step into it, and download the sources you’ll need:

mkdir kernel
cd kernel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd source
git remote add sound git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
git remote add efi git://git.kernel.org/pub/scm/linux/kernel/git/mfleming/efi.git
git remote add pmfixes git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
git remote add wifinext git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next.git
git fetch sound
git fetch efi
git fetch pmfixes
git fetch wifinext

Then merge the updates from sound, efi mixed-mode, power management and wireless onto the mainline kernel:

git merge sound/topic/intel
git merge efi/efi-for-mingo
git merge pmfixes/linux-next
git merge wifinext/master

There are still some patches we need to apply. Step back and create a patch directory, and download some patches into it:


cd ..
mkdir patches
^mkdir^cd
git clone https://github.com/jfwells/linux-asus-t100ta.git

Now apply the patches:

cd ../source
git apply ../patches/linux-asus-t100ta/patches/*

They should all apply without error.

Now we’re almost ready to compile. Before we do, we need a .config file to tell the kernel build system what parts we want to compile. Start by copying over the current one from your T100. You’ll find it at /boot/config-xxxxxx , where xxxxxx is the version of the currently running kernel. Grab it and copy it to the kernel/source directory you’ve just been working in. Rename it to .config .

Now we need to update the config:


make oldconfig

This will prompt you to set configuration for the things that will be newer in this kernel. Select ‘m’ to compile relevant drivers as a module where offered (in particular all the ‘soc’ sound options). Select ‘Y’ to enable EFI mixed mode where offered. Leave the kernel debugging options off.

When done, we’re ready to compile. We can just do it the quick and dirty way:


make clean
make -j8 deb-pkg

The above assumes this is on a quad-core processor with hyperthreading (hence the ‘-j8′, or 8 simultaneous processes). Reduce this number appropriately if you have less cores.

This will take some time (anywhere from 20 minutes to over an hour. If you’re doing it directly on the T100, all bets are off – it could take all day.

When complete, you’ll have a set of .deb packages in the directory above (i.e. in the “kernel” directory). We need “linux-headers-xxxxx.deb” and “linux-image-xxxxx.deb”. Choose the smaller of the linux-image packages, the one without debug symbols. Copy them over to your T100.

On the T100, install the new kernel with:

cd <folder where you saved the .debs>
dpkg -i ./*.deb

Then reboot!

8. Sound

Sound won’t yet be working. First, you’ll need some more firmware. For now, you can grab it from ChromiumOS, here. Unpack the archive and copy the files to /lib/firmware/intel .

The drivers are in a bit of a raw state — they expose about a hundred oddly-named mixer and DSP devices to ALSA. We can set some defaults. Grab the defaults file here, and copy it to /var/lib/alsa/asound.state .

Reboot, and force-load the state file into alsa with :
sudo alsactl -f /var/lib/alsa/asound.state restore

For me, my sound still sounds pretty awful. I need to mute the distorted right channel in alsamixer, then at least it is bearable. I also find the CPU runs a bit hot with sound enabled. Let me know if you have more luck.

* please be careful — my sound is permanently distorted, even in Windows now; keep the volume low when testing the various options *

9. SD card reader

The SD card reader works with newer kernels, but the sdhci module needs some configuration. Create a new file:


sudo nano /etc/modprobe.d/sdhci.conf

Then add the following:


options sdhci debug_quirks=0x8000

ctrl-o then ctrl-x to save and exit, then:


update-initramfs -u -k all

Then reboot and the card reader should be working.

9. Other drivers

So far, the only additional driver I have working is the light sensor. Please download and test my driver here.

9. Other scripts

I have made some additional small scripts to improve usability.

Dock scripts: These enable/disable the Onboard on-screen keyboard when you undock/dock the tablet. Set up the onscreen keyboard first in System Settings → Accessibility, then the scripts will enable/disable they keyboard for text fields.

Rotate script: This will rotate the screen and touchscreen when run. You can place the desktop entry on your desktop. We can connect the orientation sensor to this later, once that is working.

Workable... for now.

Workable… for now.

477 thoughts on “Ubuntu (or other Linux) on the Asus Transformer Book T100

  1. john

    im on 14.10, i installed the os and followed the grub install etc, i also installed the latest kernel 3.16rc4 and i have enabled the pre-release proposed under software sources and i ran all the updates.
    wifi still SUCKS.
    however i was able to finally get sound working by following the INSERT FILE HERE part, i did just rename the one file i downloaded to asound.state and copy and pasted it into the folder. when i copied out the contents like the sound section says it kept creating asound.state.lock. so that is why i copied the folder after renaming it on the desktop. then i entered the command at the end of the sound section into the terminal and sound was working. i am being very observant of grub updates when i run updates since it will probably screw up grub.
    if the wifi worked better i could stop using a usb wifi stick.

    someone in the comments area posted how to get bluetooth on and i used that to get it working.

    Once that is fixed the only minor issues i will have is no battery icon, screen brightness/rotation.

    The biggest problem is that the unity launcher can’t be auto-hid since when it is hidden you can’t make it appear by swiping from the side of the screen. you have to use the keyboard mouse. so i recommend leaving the launcher visable.

  2. john

    Also I followed this suggestion by Brainwreck and it took a few times but wifi seems much more stable.

    brainwreck

    did some more work

    its seems in the file

    /lib/firmware/brcm/brcmfmac43241b4-sdio,txt

    on the line devid=0×4374

    should be devid=0×4324

    i got this from the kernel wifi here

    http://wireless.kernel.org/en/users/Drivers/brcm80211

    you can see it lists brcm43241 as devid 0×4324 not 0×4374

    with devid=0×4374 i kept getting massive error messages but once i changed it i only get

    brcmfmac: brcmf_fil_cm_data:failed err=-23

  3. john

    any suggestions on a better keyboard than onboard, onboard works fairly good but it just doesn’t match up with andriods keyboards. I haven a samsung S5 and the keyboard is great.

  4. john

    so I tried my headphones. if i turn the volume beyond 25% the tablet speakers turn on with the headphones going to the maximum. If i turn it down below that then i only get VERY LOUD headphones with volume lowering in the headphones as i slide it closer to zero and the tablet speakers are completely quiet.
    Not sure if this is any help to anyone

  5. john

    i recommend installing the firefox extension “grab and drag”
    it lets you use the touchscreen to scroll while reading pages. it also makes an icon on the toolbar to turn it on and off if you need to highlight something

  6. A question about the partitioning in Step 3. The tablet came with Windows 8 and I’m hoping to dual-boot between them.

    In the Ubuntu installation process, when choosing the partitioning, the installer isn’t detecting Windows 8. How can I create a partition for Ubuntu that won’t also delete the Windows files that are there? Will the installer work with the empty space first before writing over Windows?

  7. john

    @Jason, boot into windows 8 and use the disk management tool see this link:
    http://pcsupport.about.com/od/windows-8/a/disk-management-windows-8.htm

    just resize the partition, i recommend making the windows partition the largest and noting all the partitions. that way when you are in ubuntu and installing you can use the size of the partitions to tell what is what.
    if you have an external HD, i would try backing up the entire hard drive….. i lost my windows recovery.
    Next i suggest when you install that you use only one partition for the system… plus a small SWAP partition. write down which partition that you install the system on that way when you reboot and use the grub command you only have to remember that partition.

  8. @JOHN

    Hilariously, I accidentally began the full ubuntu install, wiping out the windows partition. I didn’t intend to: I was poking around to find out what the partition names were, for later steps. I clicked the ‘continue’ button to go forward in the installer, getting to the partition section. But due to the slowness, I probably clicked a few times extra, unsure if it had received them… and when I looked past, the install had started. I cancelled and rebooted, but the damage had been done: the UEFI program wasn’t showing a windows bootable disk.

    So now I’m committed! It’s a brick otherwise.

    I’m going to see if a local computer shop can help me re-install windows back on the machine, sideloading it or something. Or, possibly wiping the machine and re-windows-ing it, and then starting this process AGAIN, with more care.

  9. john

    you could erhuuum download windows OS, and create a windows usb installer. then just use your oem number

  10. @JOHN

    … an interesting notion. I’m going to have to download it one way or another, since it never came with a disk.

    I’m at step 6 right now, trying to load all that stuff from apt… the flaky wi-fi is making this part of it a major headache! If I leave it alone, and the wi-fi drops, then apt fails.

    Is there a way to let it keep going from where it left off at the last error?

  11. I have to say, the

    git clone git://git.savannah.gnu.org/grub.git

    portion has been the longest part of the process so far! I thought it was the flakey wireless, but I think it’s actually over at savannah.gnu.org I’ve been waiting on this command for the better part of a day now. It’s often measuring it’s download in bytes per second. I’m at 98% at 3:44 in the afternoon here: I started around 10:00 am.

  12. john

    I found a spare wifi usb stick and it got me going. Wifi still chooses when to work. Kinda ruins the ehole tablet part

  13. john

    hey, thanks for that pingback. I just used that. funny though you lose all your drivers. anyone know what each partition is? I am the 64gig TA version

  14. darkside

    Yes, please, could someone upload a working kernel?
    I have been trying to compile it, but no way, I get an error.

  15. hi i installed ubuntu on the entire hard disk 32 g so windows 8 it was eliminate and i getting problem in the boot of Ubuntu some time it freeze and some time not and i don’t have recovery windows 8 any help to install windows 8 back i Google a lot of webpages but no hope my main problem does not show USB boot on UEFI any idea thanks .

  16. Sunil

    One way to get better speed with WIFI is to start multiple ping sessions with wifi access point with very small interval set

    ping -i .2 192.168.2.1 &

    with a lot of such pings (some 20 in parallel) I get upto 4Mbps instead of 50-300 Kbps otherwise.

  17. I’ve worked my way through the whole thing, except for those last scripts. Newbie question; how do I install them?

    Do I just download them and put ‘em in the relevant folders as per the folders they’re in the git?

  18. john

    @yosef, press f9 a lot wheb u restart. There is an option that says to reset the device if you are no longer keeoing it. I think it is under “troubleshoot”

  19. Ben

    I can’t get Ubunutu to self-boot (step 6).

    When grub-install calls efibootmgr it gets this error:

    Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.

    It suggests running modprobe efivars but this has no apparent effect.

    This page says that the error message I get means I have booted from the BIOS, not in UEFI mode. I thought that UEFI mode might be accessed by the CTRL-ALT-DEL technique described in step 2, but that hasn’t made a difference.

    Any advice? (Thanks for the instructions btw they are working remarkably well.)

  20. Ben

    I’ve tried turning secure boot back on in case that enables UEFI mode, but neither the USB stick nor the Ubuntu installation have authorised signatures so it won’t let me boot them.

  21. Ben

    Nathan Coulson suggests just installing grub-efi-ia32 with apt, but I still get the same error during installation and still can’t boot.

    More details on the boot failure: when I tell the Aptio Setup Utility to boot from the Ubuntu partition the screen flashes black for a fraction of a second and then moves to the next entry in the boot order without any visible error messages.

  22. Ben

    Solved it!

    I mistyped this command:

    sudo cp grub/grubia32.efi ubuntu/grubx64.efi

    I didn’t notice that the filenames are different.

  23. James

    So I got linux installed and WiFi at least turning on and searching. But it refuses to connect to any network. It won’t even connect to an open network. Any ideas on this?

  24. Joif

    Hello everyone
    I’m testing the T100TA with Debian installed on a usb drive with debootstrap. So far these are the packages I installed to correctly boot the system:
    - linux-image-3.15>=3.15.5-1 (experimental)
    - xserver-xorg-video-intel>=2:2.99.912 (experimental)
    - grub-efi-ia32>=2.02~beta2-10 (sid)
    - options for grub described in the instructions above

    The wifi works with:
    - firmware-brcm80211>=0.43
    - /lib/firmware/brcm/brcmfmac43241b4-sdio.txt as described by brainwreck

    I didn’t recompile anything, so all the optimizations are missing but the system can be used somehow.
    Anyway, someone should take care to collect all the tests, all these comments are a mess now (:

  25. john

    @ James, I have the exact same problem. I just gave up on wifi being reliable. it would work when it wanted. I started using a usb wifi card.

  26. Alex

    My wifi works great with the newest kernel, at least until I start downloading files, and then it disconnect and sometimes have issues to connect again.

    One thing I can’t seem to get right is the rotation scripts, would been nice to have that featured.

  27. john

    so i ran updates just a little bit ago. really strange but i have no done any patches, i just installed and added sound and bluetooth. but the BATTERY popped up and was showing. i opened up the power control panel and it showed the battery information. any clue what is up with that? after i restarted the battery icon disappeared. so i guess the patches are falling in now for the battery.

  28. moisemust

    Hi. Tried to compile the kernel again and still got an “error 2″ message. Can anyone help me? Do I need to provide a file or its contents?
    Thanks in advance!

  29. John

    hey the power button started working with today’s updates. i am using the proposed updates and forced all updates that haven’t gone through. progress is obviously happening the last few days

  30. GitBlame

    Just updated
    Suspend mod not working :(
    Power button indeed working
    Wifi 5Ghz works at full speed!

  31. john

    my wifi still is shitty as day one, can’t download anything or it slows and crashes to a halt and disconnects.
    Suspend and shutdown do not work when pressing the power button but the power button is working as gitblame and i have said.

  32. John

    shouldn’t this be in the instructions?

    brainwreck

    got bluetooth to load on boot on kernels 3.14.0-rc7 and 3.15.0-rc2..

    open terminal and type

    sudo nano /etc/rc.local

    the add the following line before Exit 0

    should look like this:
    hciattach /dev/ttyS4 bcm2035 921600 flow
    Exit 0

    the ctrl+o and ctrl+x

    reboot and bluetooth icon should appear in the system tray in upper right corner of ubuntu

  33. John

    Linux cato-T100TA 3.16.0-4-generic #9-Ubuntu SMP Mon Jul 14 11:55:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

  34. John

    In fact i reintalled ubuntu with the daily iso, put your files straight in and i can’t connect at all now. immediately wants the wifi password again, and again, and again (bangs head against keyboard) This wifi bullshit is bullshit lol

  35. John

    at the begging of the brcmfmac43241b4-sdio.txt file there are some funny characters on the first line. i deleted them and moved # all the way over to the left… seemed to have fixed it immediately

  36. John

     #Sample variables file for BCM94324A1 iPA+iLNA FCBGA REF board
    # NV VER: 0.2.3.0.XV1

    changed to this

    #Sample variables file for BCM94324A1 iPA+iLNA FCBGA REF board
    # NV VER: 0.2.3.0.XV1

  37. ralphie02

    HELP!
    So I had a semi-working asus t100 (errors still show up during boot-up) with Ubuntu 14.04 based on the instructions in this website. I mistakenly updated with “pre-released updates” and I believe it ruined my grub :(

    Can someone tell me what I should do? I’m not sure if searching online for how to recover grub without internet applies here because of the eufi stuff and how this device does not officially support Ubuntu drivers…..

    Thanks in advance

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>