Bug#396193: [Yaird-devel] Bug#396193: Patch to recognize openfirmware
drivers
Bernhard R. Link
brlink at debian.org
Sun Apr 1 16:19:04 UTC 2007
* Jonas Smedegaard <dr at jones.dk> [070330 20:54]:
> This raises another question: It seems to me that this patch will fail
> for kernels that offers devspec in sysfs but does not ship with a
> modules.ofmap file.
- Without this patch the kernel running at the time yaird is called
has sysfs support for openfirmware, then yaird fails with "unrecognized device"
and I found no way to make it run without patching it.
- If a new official kernel is installed, or a new package build with
make-kpkg, or a kernel installed by hand without removing files,
it will have a ofmap file. (I think make-kpkg just installes all map
files, and the ofmap support added consists of removing the file when
deinstalling).
So the only point it could even be a problem is when a new yaird is used
to install an old kernel. Attached modified patch makes missing that
file only a warning and no fatal error, so it should even work in those cases.
Hochachtungsvoll,
Bernhard R. Link
P.S: somehow your mails do not seem to arrive here. I'll keep polling
the bugreport for new mails, though my answer times might a bit long due
to this.
P.P.S: Please also consider to always add esp.ko for sparc (as requested
by #341522). This will vastly increase the usability for sparc, as it
will both support older kernels and upgrading kernels from and old
non-sysfs aware kernel (like sarge's) to a new one (like etch's).
I've never seen a sun sparc not needing esp as their scsi driver.
(Though I know nothing of the very new ones, though they propably have
ide anyway so it stays true).
-------------- next part --------------
diff -r -u -N yaird.original/usr/lib/yaird/perl/Conf.pm /usr/lib/yaird/perl/Conf.pm
--- yaird.original/usr/lib/yaird/perl/Conf.pm 2006-08-27 05:36:27.000000000 +0200
+++ /usr/lib/yaird/perl/Conf.pm 2006-11-01 12:01:37.000000000 +0100
@@ -51,6 +51,9 @@
pciMap => sub { get('libModules')
. '/' . get('version')
. '/modules.pcimap'; },
+ ofMap => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.ofmap'; },
ccwMap => sub { get('libModules')
. '/' . get('version')
. '/modules.ccwmap'; },
diff -r -u -N yaird.original/usr/lib/yaird/perl/Hardware.pm /usr/lib/yaird/perl/Hardware.pm
--- yaird.original/usr/lib/yaird/perl/Hardware.pm 2006-08-27 05:36:26.000000000 +0200
+++ /usr/lib/yaird/perl/Hardware.pm 2006-11-01 12:55:54.000000000 +0100
@@ -30,6 +30,8 @@
use ScsiDev;
use PciDev;
use PciTab;
+use OpenFirmwareDev;
+use OpenFirmwareTab;
use UsbDev;
use UsbTab;
use CcwDev;
@@ -74,6 +76,12 @@
$modules = UsbTab::find ($dev);
}
+ elsif (-f "$abspath/devspec") {
+ # OpenFirmware specification
+ my $dev = OpenFirmwareDev->new (path => $abspath);
+ $modules = OpenFirmwareTab::find ($dev);
+ }
+
elsif ($abspath =~ m!/css0$!) {
# S390 Channel SubSystem; harmless
}
@@ -245,7 +253,6 @@
elsif ($abspath =~ m!/floppy.\d+$!) {
$modules = [ "floppy" ];
}
-
else {
# NOTE: We may want to avoid duplicate messages
Base::error ("unrecognised device: $abspath");
diff -r -u -N yaird.original/usr/lib/yaird/perl/OpenFirmwareDev.pm /usr/lib/yaird/perl/OpenFirmwareDev.pm
--- yaird.original/usr/lib/yaird/perl/OpenFirmwareDev.pm 1970-01-01 01:00:00.000000000 +0100
+++ /usr/lib/yaird/perl/OpenFirmwareDev.pm 2006-11-01 12:01:05.000000000 +0100
@@ -0,0 +1,42 @@
+#!perl -w
+#
+# OpenFirmwareDev -- the probed values for a PCI device, as found in /sys.
+# this file is based on PciDev which is
+# Copyright (C) 2005 Erik van Konijnenburg
+# and modified for OpenFirmware by Bernhard R. Link in 2006
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+use strict;
+use warnings;
+use Base;
+package OpenFirmwareDev;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path');
+ my $path = $self->path;
+ my $devspec = Base::getStringFile ("$path/devspec");
+ $devspec =~ s/.*\///;
+ $devspec =~ s/@[^@]*$//;
+ $self->{name} = $devspec;
+}
+
+sub path { return $_[0]->{path}; }
+sub name { return $_[0]->{name}; }
+
+1;
diff -r -u -N yaird.original/usr/lib/yaird/perl/OpenFirmwareMapEntry.pm /usr/lib/yaird/perl/OpenFirmwareMapEntry.pm
--- yaird.original/usr/lib/yaird/perl/OpenFirmwareMapEntry.pm 1970-01-01 01:00:00.000000000 +0100
+++ /usr/lib/yaird/perl/OpenFirmwareMapEntry.pm 2006-11-01 12:18:37.000000000 +0100
@@ -0,0 +1,51 @@
+#!perl -w
+#
+# OpenFirmwareMapEntry - iencapsulate a line form modules.ofmap.
+# this file is bases on PciMapEnty which is
+# Copyright (C) 2005 Erik van Konijnenburg
+# and changed for OpenFirmware by Bernhard R. Link in 2006
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+# Knows how to match, can return module name.
+#
+
+use strict;
+use warnings;
+use Base;
+package OpenFirmwareMapEntry;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('module', 'name', 'type', 'compatible');
+}
+
+sub module { return $_[0]->{module}; }
+
+sub matches {
+ my ($self, $dev) = @_;
+ # As /sys only contains the name, neigther type nor compatible
+ # can be checked...
+ if ($self->{name} eq $dev->name) {
+ return 1;
+ }
+ return 0;
+}
+
+1;
+
diff -r -u -N yaird.original/usr/lib/yaird/perl/OpenFirmwareTab.pm /usr/lib/yaird/perl/OpenFirmwareTab.pm
--- yaird.original/usr/lib/yaird/perl/OpenFirmwareTab.pm 1970-01-01 01:00:00.000000000 +0100
+++ /usr/lib/yaird/perl/OpenFirmwareTab.pm 2006-11-01 12:57:26.000000000 +0100
@@ -0,0 +1,90 @@
+#!perl -w
+#
+# OpenFirmwareTab -- encapsulate modules.ofmap
+# this file is based on PciTab which is
+# Copyright (C) 2005 Erik van Konijnenburg
+# changed for OpenFirmware by Bernhard R. Link in 2006
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+use OpenFirmwareMapEntry;
+package OpenFirmwareTab;
+
+my $ofList = undef;
+
+# Parse this:
+# # of module name type compatible
+# esp SUNW,esp * *
+# esp SUNW,fas * *
+# esp esp * *
+# parport_sunbpp SUNW,bpp * *
+
+sub init () {
+ if (defined ($ofList)) {
+ return;
+ }
+ $ofList = [];
+ my $name = Conf::get('ofMap');
+ if (! open (IN, "<", "$name")) {
+ Base::warning ("can't open of module list $name");
+ return;
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ next if ($line eq "");
+ my @fields = split (/\s+/, $line, 999);
+ if ($#fields != 3) {
+ Base::fatal "malformed line in of module list $name";
+ }
+ push @{$ofList}, OpenFirmwareMapEntry->new (
+ module => $fields[0],
+ name => $fields[1],
+ type => $fields[2],
+ compatible => $fields[3],
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal "could not read of module list $name";
+ }
+}
+
+sub all () {
+ init;
+ return $ofList;
+}
+
+# given pathname in devices tree, find module name in OF map as a list.
+sub find ($) {
+ my ($dev) = @_;
+ my @result = ();
+ for my $ome (@{OpenFirmwareTab::all()}) {
+ if ($ome->matches ($dev)) {
+ push @result, $ome->module;
+ }
+ }
+ return [@result];
+}
+
+
+1;
+
More information about the Yaird-devel
mailing list