summaryrefslogtreecommitdiffstats
path: root/loader2/firewire.c
blob: abe36b2cdca3261ce913b2731c094b41deb78604 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * firewire.c - firewire probing/module loading functionality
 *
 * Erik Troan <ewt@redhat.com>
 * Matt Wilson <msw@redhat.com>
 * Michael Fulbright <msf@redhat.com>
 * Jeremy Katz <katzj@redhat.com>
 *
 * Copyright 2002 Red Hat, Inc.
 *
 * This software may be freely redistributed under the terms of the GNU
 * General Public License.
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <kudzu/kudzu.h>
#include <newt.h>
#include <unistd.h>

#include "loader.h"
#include "log.h"
#include "modules.h"
#include "windows.h"

/* boot flags */
extern int flags;

int firewireInitialize(moduleList modLoaded, moduleDeps modDeps,
			      moduleInfoSet modInfo) {
    struct device ** devices;
    int i = 0;
    int found = 0;

    if (FL_NOIEEE1394(flags)) return 0;

    devices = probeDevices(CLASS_FIREWIRE, BUS_PCI, 0);

    if (!devices) {
	logMessage(INFO, "no firewire controller found");
	return 0;
    }

    startNewt();

    /* JKFIXME: if we looked for all of them, we could batch this up and it
     * would be faster */
    for (i=0; devices[i]; i++) {
	if (!devices[i]->driver)
	    continue;
	logMessage(INFO, "found firewire controller %s", devices[i]->driver);

        winStatus(40, 3, _("Loading"), _("Loading %s driver..."), 
                  devices[0]->driver);

        if (mlLoadModuleSet(devices[i]->driver, modLoaded, modDeps, modInfo)) {
            logMessage(ERROR, "failed to insert firewire module");
        } else {
           found++;
        }
    }

    if (found == 0) {
        newtPopWindow();
        return 1;
    }

    sleep(3);

    logMessage(INFO, "probing for firewire scsi devices");
    devices = probeDevices(CLASS_SCSI, BUS_FIREWIRE, 0);

    if (!devices) {
	logMessage(DEBUGLVL, "no firewire scsi devices found");
        newtPopWindow();
	return 0;
    }

    for (i=0;devices[i];i++) {
	if ((devices[i]->detached == 0) && (devices[i]->driver != NULL)) {
 	    logMessage(INFO, "found firewire device using %s",
		       devices[i]->driver);
	    mlLoadModuleSet(devices[i]->driver, modLoaded, modDeps, modInfo);
	}
    }

    newtPopWindow();

    return 0;
}