Installing Fedora Core on a HP/Compaq nx6125 laptop.

 

This is a nice laptop, very reasonably priced with plenty of features and not too heavy. There are a number of "gotchas" you will probably encounter when installing a vanilla FC4, however. So I am posting a record of my experiences here so you don't have to puzzle over these problems.

Output of lspci

Output of cat /proc/cpuinfo

(0) The Good News.

First, the good news: The DVD rewriter works out of the box (using the drag-and drop interface provided by Nautilus). So does the onboard wired Ethernet card, using the tg3 driver.


(1) ACPI

 

PROBLEM:

When I first booted it, the processor was slow, and the fan was on all the time. ACPI seemed to be throttling the CPU. /proc/acpi/thermal_zone/*/trip_points showed all the trip points at 16C.

SOLUTION:

According to a thread on fedoraforum, older kernels need the option no_timer_check=0 or disable_timer_pin_1. The latest kernels (e.g. 2.6.16) do not need this fix.

(2) ACPI, continued

PROBLEM:

ACPI still doesn't change fan speed. We may overheat if we are not careful.

I configured cpuspeed to throttle the processor when temperature exceeds 75 degrees. I did this by uncommenting a line in /etc/cpuspeed.conf:

OPTS="$OPTS -t /proc/acpi/thermal_zone/TZ1/temperature 75"

[It is possible to modify the speed of the processor by writing the desired speed (in kHz) to the file /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed. Using this facility the cpuspeed daemon adjusts the speed dynamically based on temperature and CPU idle times.]

Unfortunately this seems to interact badly with ACPI. I attempted to monitor the temperatures continuously by the command

watch "cat /proc/acpi/thermal_zone/*/temperature"

When I started the cpuspeed service (service cpuspeed start), the reported temperatures stopped changing, even when running glxgears. When the cpuspeed service was stopped, the true temperature was reported.

So, I turned off cpuspeed.

SOLUTION:

After much googling I discovered several patches on the 'Net. These will improve things slightly.

First, it is necessary to install a patched DSDT (Differentiated System Description Table) from here:

http://acpi.sourceforge.net/dsdt/view.php?manufacturer=HP&name=nx6125

The original version would simply never change the fan speed because of some conditional involving the _OS variable.

The simplest way to replace the DSDT is to override it at boot time using a table placed in your initrd (I assume for now you have an initrd - I believe it is also possible to compile it into the kernel itself but this is less flexible). The kernel patch for the DSDT override is found here:

http://gaugusch.at/kernel.shtml

and the compiler for the DSDT table is part of the ACPI-CA package found here:

http://developer.intel.com/technology/iapc/acpi/license2.htm

Basically, you need to patch your kernel with the DSDT override patch (you know how to patch a kernel, don't you?). Then download the customized DSDT which matches your BIOS version (I am presently using F.0D). Using the compiler (iasl) you convert this table from ACPI source language into ACPI machine language. The resulting table is appended to the initrd after a magic string. The kernel recognizes the magic string at boot time and loads the following table in place of the one provided by the HP BIOS. Thus, assuming your compiled DSDT is in the file DSDT.aml and your initrd is /boot/initrd-2.6.15.img, you would do this:

cp -p /boot/initrd-2.6.15.img /boot/initrd-2.6.15.img.BAK (HIGHLY RECOMMENDED: back up your initrd in case you damage it: If you damage it fatally and can't boot you can modify your GRUB entry to boot with the backup version)

echo -n INITRDDSDT123DSDT123 >> /boot/initrd-2.6.15.img
cat DSDT.aml >> /boot/initrd-2.6.15.img

That's it: now you should be able to boot with the new DSDT and the fans should come on at the thermal trip points.

Be careful with the custom DSDT patch, especially if you upgrade the BIOS (see here).

PROBLEM:

It still doesn't work. There seems to be a problem with either the HP BIOS or the Linux ACPI subsystem or the interaction between them. This is all discussed further on bugzilla.kernel.org, http://bugzilla.kernel.org/show_bug.cgi?id=5534. For the time being the only workaround is to run "cat /proc/acpi/thermal_zone/*/temperature" periodically (e.g. from the crontab every minute).

(3) Synaptics touchpad.

PROBLEM:

The synaptics touchpad didn't work.

I tried synclient -l. It didn't work initially, I had to set Option "SHMConfig" "yes" in xorg.conf section for Synaptics input device. I couldn't see anything wrong in the synclient output. However, taps were mapped to button 2 instead of button 1, and dragging with the left button down often did not work (the state field of the event was zero, not 0x100).

SOLUTION:

It seems that the synaptics driver which comes with Fedora does not work. I follow these instructions (reproduced from a post on FedoraForum) to install the latest version:

First, get the package synaptics-0.14.3.tar from http://web.telia.com/~u89404340/touchpad/ (thank you!). bunzip2 it, untar and read and follow the install. in my case, the file /usr/X11R6/lib/modules/input/synaptics_drv.o already existed, but it didn't work until after replacing it with the freshly compiled driver.

Now, the /etc/X11/xorg.conf edits are:


Section "ServerLayout"
...
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Synaptics Mouse" "AlwaysCore"
EndSection

Section "Module"
...
Load "synaptics"
Load "dri"
EndSection

Section "InputDevice"
Identifier "Synaptics Mouse"
Driver "synaptics"
Option "Device" "/dev/psaux"
Option "Protocol" "auto-dev"
Option "LeftEdge" "1700"
Option "RightEdge" "5300"
Option "TopEdge" "1700"
Option "BottomEdge" "4200"
Option "FingerLow" "25"
Option "FingerHigh" "30"
Option "MaxTapTime" "180"
Option "MaxTapMove" "220"
Option "VertScrollDelta" "100"
Option "MinSpeed" "0.09"
Option "MaxSpeed" "0.18"
Option "AccelFactor" "0.0015"
Option "SHMConfig" "on"
EndSection

It now works perfectly with complete fuctionality.

(4) Sound

PROBLEM:

The sound card was not recognized. system-config-soundcard showed this output:

The following audio device was detected.
Vendor: ATI
Model Technologies Inc: Unknown device 4370
Module: snd-atiixp

Hitting "Play test sound", nothing was audible. Also, when run from a terminal (xterm, gnome-terminal or whatever), the following messages were seen:

[root@ceiriog1 prw]# system-config-soundcard
amixer: Unable to find simple control 'PCM-2',0
amixer: Unable to find simple control 'DRC Range',0
Playing WAVE '/usr/share/system-config-soundcard/sound-sample.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

Also, the light on the "mute" button above the keyboard is on all the time. It does not toggle when pressed.

This problem persisted after upgrading to kernel-2.6.14-1.1656_FC4, alsa-lib-1.0.10-3.FC4 and alsa-utils-1.0.10-1.FC4.

In order to hear a sound, you need to apply the patch from the Linux Kernel mailing list:

http://www.ussg.iu.edu/hypermail/linux/kernel/0511.3/0014.html

(or use a later kernel).

Now the hardware buttons for mute and volume control still do not work but the volume can be controlled by software (alsamixer).

(5) Modem

PROBLEM:

How to get modem to work? First I tried the SoftLink modem driver. I couldn't compile slmodemd-2.9.9e_pre1_alsa because we lack /usr/include/gnu/stubs-32.h. slmodemd comes with a binary driver component (dsplibs.o) which is 32-bit. Therefore the package must be compiled in 32-bit mode (-m32), and requires 32-bit libraries and headers.

The modem still didn't work. Starting up slmodemd I got this error:

Starting SmartLink modem daemon:ALSA lib pcm.c:1969:(snd_pcm_open_conf) Invalid type for PCM modem:1 definition (id: modem, value: cards.pcm.modem)
[FAILED]

This problem persists after upgrading to kernel-2.6.14-1.1656_FC4, alsa-lib-1.0.10-3.FC4 and alsa-utils-1.0.10-1.FC4.

I downloaded scanModem.gz from the linmodems site (linmodems.technion.ac.il) and ran it. The PCI vendor is is 1002 (ATI), and the device id is 4378. SoftModem.txt indicates this may be supported by Conexant, see http://www.linuxant.com. Windows also reports the modem as having "Manufacturer: CXT". Slmodem-ALSA.txt suggests there may be support in the ALSA package using the snd-atiixp-modem driver.

I tried running

slmodemd --country=UK --alsa hw:0

This ran, but givegave the error message

error: mixer setup: Off-hook switch not found for card hw:0

Running wvdial gives NO CARRIER, and slmodemd spits out the errors

error: cannot set channels for playback: Invalid argument

SOLUTION:

So, I tried the driver from www.linuxant.com. I used the generic RPM version (hsfmodem-7.18.00.07x86_64full-1.x86_64.rpm) since there seems to be no precompiled version for a FC4 x86_64 kernel. hfsconfig successfully compiled the modules but failed to insert them.

modprobe /dev/ttySHSF gave:

WARNING: Error inserting hsfserial (/lib/modules/2.6.14-prepprw1/extra/hsfserial.ko): Invalid argument
FATAL: Error inserting hsfpcibasic2 (/lib/modules/2.6.14-prepprw1/extra/hsfpcibasic2.ko): Unknown symbol in module, or unknown parameter (see dmesg)

dmesg then showed:

hsfserial: falsely claims to have parameter calloutmajor

This problem is fixed in hsfmodem-7.43.00.01x86_64full-1.x86_64.rpm. However, this version has problems if used in conjunction with the Software Suspend 2 kernel patch (conflicting typedefs). This can be fixed by renaming the typedefs using the following patch:

hsfmodem.patch

(6) Wireless LAN

PROBLEM:

Wireless driver (Broadcom) didn't work. The wireless card appears to be a Broadcom AirForce One (54g), model number BCM4318.I installed ndiswrapper 1.8 and obtained the Broadcom Windows drivers from my HP driver disk. I initialized the drivers using

ndiswrapper -i /path/bcmwl5.inf

and loaded the ndiswrapper module. Unfortunately, /var/log/messages showed

Jan 29 21:59:25 ceiriog1 kernel: ndiswrapper version 1.8 loaded (preempt=no,smp=no)
Jan 29 21:59:25 ceiriog1 loadndisdriver: loadndisdriver: load_driver(361): couldn't load driver bcmwl5
Jan 29 21:59:25 ceiriog1 kernel: ndiswrapper (check_nt_hdr:149): Windows driver is not 64-bit; bad magic: 010B
Jan 29 21:59:25 ceiriog1 kernel: ndiswrapper (load_sys_files:218): couldn't prepare driver 'bcmwl5'
Jan 29 21:59:25 ceiriog1 kernel: ndiswrapper (load_wrap_driver:112): loadndiswrapper failed (65280); check system log for messages from 'loadndisdriver'

since the Windows version which came with my nx6125 is only 32-bit and Broadcom don't supply drivers for 64-bit Windows.

Some research showed that, unfortunately, 32-bit drivers cannot be loaded on 64-bit kernels. This limitation applies both to ndiswrapper and to the commercial DriverLoader product from www.linuxant.com. Linuxant have a 64-bit Broadcom driver on their site, but it does not support the particular model we need (4318). After some googling, however, I found the necessary driver on the Acer site:

ftp://ftp.support.acer-euro.com/notebook/aspire_3020_5020/driver/winxp64bit

Full marks to Acer, no marks to HP or Broadcom.

The following procedure worked for me:

First register the Windows driver:

  /usr/sbin/ndiswrapper -i /path/to/bcmwl5.inf

Then load the ndiswrapper module:

  /sbin/modprobe ndiswrapper

If this succeeds, the command

  /usr/sbin/ndiswrapper -l

should print (among others) the line:

  bcmwl5          driver present, hardware present

After loading ndiswrapper, we can scan the available wireless access points with the command

  iwlist wlan0 scan

which works more or less OK for me, except for the warning

  Warning: Driver for device wlan0 has been compiled with version 19
of Wireless Extension, while this program supports up to version 17.
Some things may be broken...

Next add an alias to modprobe.conf so that subsequent references to the interface "wlan0" will automatically load ndiswrapper. This is done by the command

  ndiswrapper -m

Reboot or modprobe ndiswrapper. Then run

 /usr/bin/system-config-network

and select "New", "Wireless connection". "ndiswrapper (wlan0)" should show up in the list of available devices. Here you can specify mode and SSID (i.e. ESSID), choose to obtain an IP address using DHCP and so on. You can also choose to let all (non-root) users activate and deactivate the device.

At this point I ran

  /sbin/service network stop
/sbin/service network start

This gave an error message:

  Bringing up interface wlan0:  Error : unrecognised wireless request "Mb/s"

However, /sbin/ifconfig showed the wlan0 interface was up and running anyway, and I could access the management interface of my wireless router (192.168.1.1).

(7) Java plugin

This is a general 64-bit problem: There is no official 64-bit Java plugin for firefox or mozilla! I downloaded both jre-1_5_0_06-linux-amd64.rpm and jre-1_5_0_06-linux-i586.rpm (from java.sun.com). The latter contains the "plugin" subdirectory with the libjavaplugin_oji.so files, but the former does not. Since I can't load a 32-bit plugin in a 64-bit application, I'm stumped.

http://forum.java.sun.com/thread.jspa?threadID=568127&tstart=75

suggests that the answer is to get the unofficial version from blackdown.org. I tried this. It is necessary to run the self-extracting binary and then create a soft-link to libjavaplugin_oji.so in /usr/lib64/firefox-1.0.7/plugins. Some applets work, but others crash firefox immediately. In the end I had to resort to installing the 32-bit version of the browser.

(8) Compiling the Kernel

Kernel Compilation: make xconfig doesn't work (at least for kernel-2.6.14-1.1653_1.rhfc4.cubbi_swsusp2.src.rpm).

It seems that scripts/kconfig/Makefile expects to find the QT libraries in /usr/lib64/qt-3.3/lib/../lib64; they are not here, they are just in /usr/lib64/qt-3.3/lib. For the time being we need to remove the line which modifies LIBPATH by appending the output of $(HOSTCXX) -print-multi-os-directory.

(9) Wireless encryption with WEP

OK, having got the wireless card working with my wireless router, I tried to enable WEP encryption. I set the router to use the "Open" mode. However, the Fedora Network Configuration tool (system-config-network) does not seem to have a button to set the mode on the client. Wireless Settings contains a field for the "Key", however, it is not even clear what type of encryption this refers to (it must be WEP because I eventually made it work). Setting the appropriate key here alone does not work. iwconfig wlan0 (as root) shows that the Security mode is "restricted". However when I executed the command

 iwconfig wlan0 key open

and then tried again, all was OK!

Is there any way to set this up in a GUI so that it happens automatically?

Anyway, it is arguably better to run the access point in the "Restricted" or "Shared key" mode. In that case the default network setting on the client is OK.

(10) Wireless encryption with WPA

First you need the wpa_supplicant package from http://hostap.epitest.fi/wpa_supplicant. In the top level package directory, copy defconfig to .config. Then edit the latter file to uncomment the line containing
CONFIG_DRIVER_NDISWRAPPER=y
Now build the package with make, and copy wpa_cli and wpa_supplicant to /usr/local/bin. You should be able to test the daemon by running it in the foreground like this:
wpa_supplicant -i wlan0 -c examples/wpa-psk-tkip.conf -D ndiswrapper
If this works, you can append the following lines to /etc/sysconfig/network-scripts/ifup-wireless, so wpa_supplicant can be started every time the interface is brought up:
if [ "$WPA" = "y" -a -x /usr/local/bin/wpa_supplicant ]; then
/usr/local/bin/wpa_supplicant -D ndiswrapper -Bw \
-c/etc/wpa_supplicant.conf -i$DEVICE -P /var/run/wpa_supplicant.pid
fi
Then you enable WPA by editing /etc/sysconfig/network-scripts/ifcfg-wlan0 and inserting the line
WPA=y

(11) CPU frequency

With the cpuspeed service disabled, the CPU speed keeps dropping back to 800 MHz. You can verify this by putting the Gnome CPU speed applet on the panel and trying to change it. Under certain loads (NOT always), the speed keeps dropping back. There is a complex interaction between ACPI and cpufreq subsystems, which I describe elsewhere (FIXME).

(12) 3D Acceleration

This laptop uses an ATI Radeon 200M. You will probably want the proprietary drivers from ATI, although the display works fine with the standard "vesa" driver from X.org. In my opinion, it is much better to use the RPM packages from http://rpm.livna.org than to allow the ATI installer to spray files all over your system. The package ati-fglrx-8.22.5.1-0.lvn.1.4 contains the X.org driver module. The package kernel-module-fglrx-2.6.14-1.1656_FC4 contains the kernel module which is necessary if you want to use DRM. If you run a custom kernel you need to get the source RPM ati-fglrx-8.22.5.1-0.lvn.1.4.src.rpm, install it, and rebuild the kernel module. For example:
rpmbuild -ba /usr/src/redhat/SPECS/ati-fglrx.spec --without userland --target x86_64 --define "ksrc /lib/modules/2.6.14-1.1656_FC4/build"
You need to give the correct path to your kernel source tree as the value of "ksrc".

I found that the kernel module will build correctly (albeit with more warnings than I would like) for this version. However, it does not yet build for kernel 2.6.16-rc5.

(13) Playing DVDs

My first attempt:

First I went over to http://freshrpms.net and grabbed the RPMS for mplayer and mplayer-fonts. More stuff is needed, however:

error: Failed dependencies:
libXvMCW.so.1()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libaa.so.1()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libdvdread.so.3()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libfribidi.so.0()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
liblirc_client.so.0()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
liblzo.so.1()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libmad.so.0()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libmp3lame.so.0()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
libxvidcore.so.4()(64bit) is needed by mplayer-1.0-0.20.pre7.2.fc4.x86_64
These dependencies are resolved by:
  yum install aalib
yum install fribidi
yum install lirc
yum install lzo

http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/libdvdread/libdvdread-0.9.4-8cvs.2.fc4.x86_64.rpm
http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/libdvdcss/libdvdcss-1.2.9-1.2.fc4.x86_64.rpm
http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/libmad/libmad-0.15.1b-3.2.fc4.x86_64.rpm
http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/lame/lame-3.96.1-2.2.fc4.x86_64.rpm
http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/xvidcore/xvidcore-1.0.3-1.2.fc4.x86_64.rpm
http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/4/libXvMCW/libXvMCW-0.9.3-1.2.fc4.x86_64.rpm
It is now possible to play DVDs by, for example,
  mplayer dvd://1 -alang en -slang hu -dvd-device /dev/hdc
This command selects English as the audio language and Hungarian as the subtitle language.

The easy way:

Recently, after installing Fedora Core 5, I discovered the easiest way of enabling video playback. Just pop over to http://rpm.livna.org, install their yum repository configuration file (http://rpm.livna.org/livna-release-5.rpm) and then execute
  yum install vlc
yum install libdvdcss
vlc (VideoLan Client) has a very nice, fast player which integrates well into the Gnome desktop.

(14) Streaming audio

You can get RealPlayer from http://www.real.com/linux. However, initially this did not work for me, either with real audio streams or ogg streams: the player would skip forward as if trying to play the stream at double speed. The problem seems to arise because RealPlayer uses the obsolete OSS audio interface instead of the newer ALSA. I was using the kernel-based OSS emulation drivers. With the user-space emulation package "alsa-oss",
ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-1.0.9.tar.bz2
and a little ingenuity, things can be fixed.

The alsa-oss package provides a library which may be preloaded with any given audio application to redirect OSS calls. The "aoss" script is a wrapper which sets the LD_PRELOAD environment variable before executing the application, so that the redirector will be loaded. So the idea is, instead of running
my_app --args
you run
aoss my_app --args
Since RealPlayer is a 32-bit application, you need a 32-bit alsa-oss library. So the steps to build it are these:
CFLAGS=-m32 CXXFLAGS=-m32 ./configure
make
make install

To ensure that the aoss wrapper is run every time, you can edit the shell script /usr/local/RealPlayer/realplay to replace "$REALPLAYBIN" by "aoss $REALPLAYBIN".