Thursday, November 15, 2012

My new openSUSE buildservice home project

Only a short information for you: I have a new home project on the openSUSE buildservice.  Therefore I've took the chance and deleted my old home project and a lot of old packages I've build for no longer supported (open)SUSE releases with it. 
That also means: some of the links to packages in this blog are may broken and I don't plan to fix them. You can find the new project here. Since the most of my former packages already moved into the distribution or other devel projects feel free to search here for them if you can't find them in my new home.

Tuesday, February 07, 2012

PandaBoard: persistant MAC address via initrd

I worked out a solution to replace the random MAC address set by the smsc95xx kernel module with the MAC address generated by u-boot on the PandaBoard(ES). It should also work on the BeagleBoard.

As first you need this kernel patch to fix isses with exporting the assign type (PERM, RANDOM, STOLEN) to /sys/class/net/*/addr_assign_type correctly if the smsc95xx driver generate a random MAC address. Build your kernel, if you use openSUSE:Factory:ARM you can get RPMs here, until it's integrated into the official openSUSE kernel.

Now you need a mkinitrd with this patch or a you install these RPMs for openSUSE. This adds a initrd boot script to set the MAC address from kernel cmdline parameters. These are the available parameters and some example values:
  • setmac.set_mac_addr=01:23:45:67:89:ab
  • setmac.set_iface=eth0
  • setmac.set_module=smsc95xx
The setmac.set_mac_addr= is mandatory to change the MAC and you have to choose one of the other two parameters. Either you specify the network interface or the kernel driver/module. In case you use setmac.set_module the first network device provided by this module which has a random MAC gets the new address assigned. Please note: this script change the MAC of a interface only if addr_assign_type=1 , otherwise nothing will change.

If you have installed the new kernel and mkinitrd you may need to follow these steps:
# mount the boot partition which contains the uImage (and may also the MLO file) 
mount /dev/mmcblk0p1 /mnt
# make sure this partition contains the new uImage
# build a new initrd
mkinitrd -B
# create a uInitrd
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d /boot/initrd /mnt/uInitrd
Now you need to tell u-boot to boot from the uInitrd and to set the needed cmdline parameters. I prefer to use a uEnv.txt file instead of a boot.scr since you simply can change it without call mkimage. You can download my currently used uEnv.txt here. The content depends on your setup you may need to adapt yours:
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=ext3 console=ttyO2,115200n8 vram=16M omapfb.vram=0:16M
bootcmd=mmc rescan ; setenv bootargs ${bootargs} setmac.set_mac_addr="${usbethaddr}" setmac.set_iface=eth0; fatload mmc 0:1 0x80000000 uImage; fatload mmc 0:1 0x81600000 uInitrd; bootm 0x80000000 0x81600000
uenvcmd=boot
Now umount /mnt and reboot your system. If you already worked around the random MAC address problem: don't forget to remove/disable these hacks.

Monday, February 06, 2012

Personal note: Moved to blog.bisect.de

As you may already seen, I moved my blog from dkukawka.blogspot.com to a new address. You reach the blog now on blog.bisect.de . The old address should still work but you may want to adopt your bookmarks or RSS/Atom feeds. 
I also merged my blog with my Google+ profile. By this you should see new posts also at my Google+ stream.

Saturday, February 04, 2012

Update: PandaBoard persistent MAC from smsc95xx kernel module

Some days ago I decided to send an updated and reworked version of my kernel patch for the smsc95xx kernel module - to get a persistent MAC address via the kernel cmdline from u-boot - to the linux kernel mailing list. I should have known better and save me the time: the patch wasn't accepted. You can follow the discussion here.

If you follow the argumentation, we should drop the support for changing the MAC address of a network device via kernel module parameter also from e.g. the following modules: sunhme, fec or ksz884x. And we should then also remove all the 'generate a random MAC for real devices' since it all could be somehow get managed in the user-space, although it's pita to handle this task in user-space since it's currently even hard to find out if a device got a random MAC assigned from the kernel.

I still plan to add the patch to the openSUSE kernel until I've worked out another solution. Feel free to use the patch anyway on your system.

Friday, January 20, 2012

PandaBoard: get persistent MAC address by default

The PandaBoard/PandaBoard ES, as the BeagleBoard too, don't have a EEPROM on the (USB-) network card to store the MAC address. That's why you get a new MAC and subsequently a new IP address with each boot. You can set the MAC manually via e.g. 'ifconfig eth0 hw ether 01:23:45:67:78:01' or also automatically via the network scripts.

The other solution would be to generate a MAC on OMAP (version > 2) machines by reusing another unique hardware identifier. There is already an old patch written by Mark Crichton for the BeagleBoard. And there was also an patch on the kernel mailing list from Andy Green and some related discussion, but none of them got into the kernel.  The problem was that if there are more than one card in the system without EEPROM they all would get the same MAC address. That sounds reasonable to me while I'm not sure that something like this will happen with a high chance out in the field. And since there are objections against exporting the OMAP die ID to the sysfs there is no simple way to handle the MAC generation in userspace (e.g. via udev).

While investigating how u-boot handle the no-EEPROM problem, I've found out that the u-boot code already contain functions to generate a persistent MAC for such devices. The MAC gets also exported to the u-boot environment as usbethaddr. That's why I wrote a patch for the smsc95xx kernel driver (based on a patch from Sebastien Jan) to take a module parameter to set the MAC address via the kernel command line. With this patch the driver takes the following parameter: macaddr=01:23:45:67:89:ab;[tgt-netdevname] and assign the given MAC address to the first device in the system without a MAC on the EEPROM. If there is more than one device without EEPROM you can add the netdevice name to the parameter - separated by a ';' - to assign it to a special device (e.g. for eth0: macaddr=01:23:45:67:89:ab;eth0). If there is no MAC given, the device still gets a random MAC as before.

After patching and installing your kernel, you need to change the u-boot config to pass the $usbethaddr from the environment along to the kernel cmdline. I used a uEnv.txt file (on my boot partition) instead of the legacy/obsolete boot.scr, since you simply can change the file without call mkimage after each change. That's the content of the uEnv.txt file I currently use to set the MAC of my PandaBoard ES:

bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=ext3 console=ttyO2,115200n8 vram=16M omapfb.vram=0:16M
bootcmd=mmc rescan ; setenv bootargs ${bootargs} smsc95xx.macaddr="${usbethaddr}" ; fatload mmc 0 0x82000000 uImage; bootm 0x82000000
uenvcmd=boot
You can find the patch here, I plan to include it into the openSUSE OMAP2+ kernel and to send it upstream as soon as I have some reports back that it also works for others. You can find an kernel RPM for openSUSE Factory here.

Friday, January 13, 2012

How to send patches via git-send-email

In the past I either directly commited to git or send - if needed - my patches to e.g. mailing list by exporting the patches from my local git repo via 'git format-patch -s origin' and then importing them into my mailer. Yesterday I finally found some time to get git-send-email running to do this for me directly on command line.

First you have to choose if you always use the same email account to send your patches. In this case you need to configure 'git-send-email' this way:
git config --global sendemail.from "YOUR NAME <user@example.org>"
git config --global sendemail.smtpserver imap.example.org
git config --global sendemail.smtpuser USER
# depending on your config you may also set:
git config --global sendemail.smtpencryption tls
If you don't want to enter password for your SMTP server all the time:
git config --global sendemail.smtppass = PASS
If you use different settings/email accounts for different project, you can setup different identities for them. Here one example for btrfs project:
git config --global sendemail.btrfs.to "linux-btrfs@vger.kernel.org"
git config --global sendemail.btrfs.from "YOUR NAME <user@example.org>"
git config --global sendemail.btrfs.smtpserver imap.example.org
git config --global sendemail.btrfs.smtpuser USER
git config --global sendemail.btrfs.smtppass = PASS
git config --global sendemail.btrfs.smtpencryption tls
There are some other options you may should use as e.g.:
git config --global sendemail.chainreplyto false
to set the threading format to shallow/flat instead of the deep threading, which is much more readable on a mailing list if you send multiple patches at once.

Now you can send you patches with (you may have to replace origin with the revision you need):
git send-email --annotate origin
If you use an identity e.g.:
git send-email --identity=btrfs --annotate origin
If you didn't commit your changes into your local git branch with the -s option (to get the 'Signed-off-by:' line) you need to add the --signoff option, as I realized after sending my latest patches to the btrfs mailing list. If you send a patch series you may also want to use a cover email to explain something or to write more info. In this case you can use --cover-letter to get git to create and let you edit such an email before sending. 

Here the full example command I would use to send my patches:
git send-email --identity=btrfs --annotate --cover-letter --signoff origin
For more info check e.g. the Git Community Book or use your favorite internet search engine.

Some fixes for btrfs-progs ...

Yesterday I found some time to send some patches for btrfs-progs upstream. Unfortunately the information on the btrfs wiki pages about the source code repositories are completely outdated, either the repo didn't exist or the branch wasn't there as in case of the 'for-chris' branch of the 'Integration repository'. Finally I send them against the repo of Chris Mason listed at git.kernel.org

The patches fix some possible segfaults and some compiler warnings, you can find them at the mailing list.

Tuesday, January 03, 2012

CHERRY STRAIT Exclusive Testa Motari Edition

I got a 'CHERRY STRAIT Exclusive Testa Motari Edition' keyboard at Christmas from my girlfriend. It's a really exclusive keyboard. The top of the board is made out of wood veneer. Since each wood is unique as a fingerprint, no keyboard looks like the other. My keyboard was made with satin walnut, but you can get them also with vavona burl or macassar ebony. The veneer used is certified for sustainable forestry and no tropical wood was used.

The keyboard was derived from the 'CHERRY STRAIT Corded'. The wood was glued to a aluminium plate. Thanks to that detail the 'Testa Motari Edition' is much more torsion-resistant and not that wibbly-wobbly as the original keyboard was reported in some tests (e.g. here).

It's a really cool keyboard with a nice to touch surface. As you can see in the following pictures, the device is very flat. From the ergonomical point of view I miss a way to change the inclination, but it's comfortable to use anyway. I guess you have always to wash your hands before using it, since the wood isn't sealed or varnished.

The key layout needs getting used to: four of the five multimedia keys are on the top of the numeric pad but the 'Play'-key is located between the Print/SysRq key and F12.  Also the block between the main keys and the numeric pad is modified and the 'fn' keys are not grouped compared to a standard keyboard.

Résumé: It's an expensive but really nice keyboard! Thanks for the present!

Here some pictures (see more here):