home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
root
/
usr
/
share
/
YaST2
/
modules
/
StorageControllers.ycp
< prev
next >
Wrap
Text File
|
2006-11-29
|
17KB
|
625 lines
/**
* Module: StorageControllers.ycp
*
* Authors: Klaus Kaempf <kkaempf@suse.de> (initial)
*
* Purpose:
* This module does all floppy disk related stuff:
* - Detect the floppy devices
*
* SCR: Read(.probe.storage)
*
* $Id: StorageControllers.ycp 27816 2006-02-10 10:51:47Z fehr $
*/
{
module "StorageControllers";
import "Arch";
import "Mode";
import "ModulesConf";
import "ModuleLoading";
import "HwStatus";
import "Initrd";
import "Kernel";
import "Storage";
import "StorageDevices";
import "StorageClients";
import "Label";
import "Popup";
import "Linuxrc";
textdomain "storage";
// list of loaded modules and arguments
// needed for modules.conf writing
// must be kept in order (-> no map !)
// must be searchable (-> separate lists for names and args)
global list moduleNames = [];
global list moduleArgs = [];
global list moduleIDs = []; //unique_id from probing
list<list> ModToInitrdLx = [];
list<list> ModToInitrd = [];
global string dasdParam = "";
// --------------------------------------------------------------
// local values
list controllers = []; // set by "Probe"
// remember postinstall modules (like imm and ppa)
// which must be installed *last*
list postinstall_names = [ "imm", "ppa" ];
// postinstall modules information
// list of [ boolean modprobe,
// string module_name,
// string module_arg,
// string vendor,
// string device]
list<list> postinstall_info = [];
// --------------------------------------------------------------
define list GetDasdList()
``{
list ret = [];
list<map> dasd = (list<map>) SCR::Read(.proc.dasddev);
y2milestone( "dasd=%1", dasd );
foreach( map entry, dasd,
``{
term a = `item( `id(entry["name"]:"") );
a = add( a, entry["name"]:"" );
a = add( a, entry["address"]:"" );
a = add( a, entry["state"]:"" );
ret = add( ret, a );
});
return( ret );
}
define string S390DasdParams()
``{
SCR::UnmountAgent (.proc.modules);
map mod = (map)SCR::Read(.proc.modules);
boolean mod_loaded = haskey(mod, "dasd_mod");
y2milestone( "mod %1", mod );
string param = (string)SCR::Read(.etc.install_inf.DASD_Parameter);
if( param==nil )
{
param = "";
}
y2milestone( "param %1 size:%2", param, size(param) );
boolean do_load = !mod_loaded || size(param)==0;
if( do_load )
{
string okb = Label::AcceptButton();
// button text
string loadb = _("&Load Module");
// popup text
string text = sformat(
_("Here, enter the parameters with which to load
the dasd module, such as dasd=FD00-FD0F,FD40.
Press \"%1\" to load the
module.
If the table shows the correct DASDs available,
press \"%2\".
"), deletechars(loadb,"&"), deletechars(okb,"&") );
list cont = GetDasdList();
UI::OpenDialog(
`opt(`decorated),
`HBox(
`HSpacing(1),
`VBox(
`VSpacing(0.5),
// heading text
`Left(`Heading(_("DASD Module Parameter Setting"))),
`VSpacing(0.2),
`Left(`Label(text)),
`VSpacing(0.2),
`HBox(
// label text
`Left(`TextEntry(`id(`param), _("&DASD Parameter"),
param )),
`VSpacing(1),
`Bottom(`PushButton(`id(`load), loadb ))
),
`VSpacing(1),
`HBox(
`Table( `id(`dd_table),
// heading text
`header( _("DASD Name"),
// heading text
_("DASD Address"),
// heading text
_("Status") ),
cont ),
`VSpacing(10)
),
`VSpacing(1),
`HBox(
`HStretch(),
`PushButton(`id(`abort), Label::AbortButton() ),
`HStretch(),
`PushButton(`id(`accept), Label::AcceptButton() ),
`HStretch()
),
`VSpacing(0.5)
),
`HSpacing(1)
));
UI::SetFocus(`id(`param));
symbol ret = `none;
do
{
ret = (symbol)UI::UserInput();
y2milestone( "ret = %1", ret );
if( ret == `load )
{
if( mod_loaded )
{
SCR::Execute( .target.bash,
"/sbin/rmmod dasd_eckd_mod dasd_fba_mod dasd_mod" );
}
param = (string)UI::QueryWidget( `id(`param), `Value );
y2milestone( "param %1", param );
boolean ret = (boolean)SCR::Execute(.target.modprobe, "dasd_mod", param );
mod_loaded = true;
y2milestone( "ret=%1", ret );
if( !ret )
{
// popup text
Popup::Error( sformat(_("Error loading module dasd with
parameter: %1"), param ));
}
SCR::Execute(.target.modprobe, "dasd_eckd_mod", "" );
SCR::Execute(.target.modprobe, "dasd_fba_mod", "" );
cont = GetDasdList();
UI::ChangeWidget( `id(`dd_table), `Items, cont );
}
else if( ret == `accept && size(cont)==0 )
{
ret = `continue;
}
if( (ret == `accept||ret == `abort) && size(cont)==0 )
{
// popup text
Popup::Error( _("There are no DASD devices active.
It is not possible to install without
active DASD devices."));
}
}
while( ret != `accept && ret != `abort );
UI::CloseDialog();
}
y2milestone( "ret %1", param );
return( param );
}
/**
* Probe storage controllers
* probing, loading modules
*
* @returns integer number of controllers, 0 = none found
*/
global define integer Probe ()
``{
y2milestone( "StorageControllers::Probe()" );
// probe 'storage' list
controllers = (list<map>)SCR::Read (.probe.storage);
if (!Arch::s390 () && size (controllers) == 0)
{
y2milestone("no controllers");
}
return size (controllers);
}
// --------------------------------------------------------------
// parportInitialize
define void parportInitialize ()
``{
// post-load parport module
if ((size (postinstall_info) == 0) || Mode::test ())
{
return;
}
boolean parport_loaded = false;
boolean parport_pc_loaded = false;
foreach (list postlist, postinstall_info,
``{
boolean post_modprobe = postlist[0]:false;
string post_name = postlist[1]:"";
string post_arg = postlist[2]:"";
string post_vendor = postlist[3]:"";
string post_device = postlist[4]:"";
if (!parport_loaded)
{
if( `ok == ModuleLoading::Load( "parport", "", post_vendor,
post_device, Linuxrc::manual (), true ))
{
ModulesConf::ModuleArgs ("parport", "");
parport_loaded = true;
}
}
if( !parport_pc_loaded)
{
if( `ok == ModuleLoading::Load( "parport_pc", "", post_vendor,
post_device, Linuxrc::manual (), true ))
{
ModulesConf::ModuleArgs ("parport_pc", "");
parport_pc_loaded = true;
}
}
if( `ok == ModuleLoading::Load( post_name, post_arg, post_vendor,
post_device, Linuxrc::manual (), post_modprobe))
{
ModulesConf::ModuleArgs (post_name, post_arg);
Kernel::AddModuleToLoad(post_name);
moduleNames = add( moduleNames, post_name );
moduleArgs = add( moduleArgs, post_arg );
y2milestone( "moduleNames %1", moduleNames );
y2milestone( "moduleArgs %1", moduleArgs );
}
});
return;
}
// start a controller (by loading its module)
// return true if all necessary modules were actually loaded
// return false if loading failed or was not necessary at all
define boolean startController (map controller)
``{
// check module information
// skip controller if no module info available
list<map> module_drivers = controller["drivers"]:[];
string module_id = controller["unique_key"]:"";
if (size (module_drivers) == 0)
return false;
// get list of modules from /proc/modules
SCR::UnmountAgent (.proc.modules);
map loaded_modules = (map)SCR::Read(.proc.modules);
// loop through all drivers checking if one is already active
// or if one is already listed in /proc/modules
boolean already_active = false;
foreach (map modulemap, module_drivers,
``{
if( modulemap["active"]:true ||
size( loaded_modules[modulemap["modules",0,0]:""]:$[] ) > 0 )
{
already_active = true;
if( modulemap["active"]:true )
{
ModToInitrdLx = add( ModToInitrdLx,
[ modulemap["modules",0,0]:"",
modulemap["modules",0,1]:"" ] );
y2milestone( "startController ModToInitrdLx %1", ModToInitrdLx );
y2milestone( "startController ModToInitrd %1", ModToInitrd );
}
}
});
// save unique key for HwStatus::Set()
string unique_key = controller["unique_key"]:"";
if (already_active)
{
HwStatus::Set (unique_key, `yes);
return false;
}
boolean stop_loading = false;
boolean one_module_failed = false;
// loop through all drivers defined for this controller
// break after first successful load
// no need to check "active", already done before !
foreach (map modulemap, module_drivers,
``{
y2milestone ("startController modulemap: %1", modulemap);
boolean module_modprobe = modulemap["modprobe"]:false;
boolean all_modules_loaded = true;
if (!stop_loading)
{
foreach (list module_entry, modulemap["modules"]:[],
``{
string module_name = module_entry[0]:"";
string module_args = module_entry[1]:"";
// remember postinstall modules
if( contains( postinstall_names, module_name) )
{
y2milestone("startController name: %1 args: %2", module_name, module_args);
list vendor_device =
ModuleLoading::prepareVendorDeviceInfo(controller);
// save data for parportInitialize
postinstall_info =
add( postinstall_info,
[module_modprobe, module_name, module_args,
vendor_device[0]:"", vendor_device[1]:""]);
}
else
{
// load module if not yet loaded
if( !contains (moduleNames, module_name) )
{
symbol load_result = `ok;
if( Linuxrc::manual () )
{
list vendor_device =
ModuleLoading::prepareVendorDeviceInfo(controller);
load_result =
ModuleLoading::Load( module_name, module_args,
vendor_device[0]:"",
vendor_device[1]:"", true,
module_modprobe );
}
else
{
load_result =
ModuleLoading::Load( module_name, module_args,
"", "", false,
module_modprobe );
}
y2milestone( "startController load_result %1", load_result );
if (load_result == `fail)
{
all_modules_loaded = false;
}
else if (load_result == `dont)
{
all_modules_loaded = true;
}
else // load ok
{
// save data for modules.conf writing
moduleNames = add (moduleNames, module_name);
moduleArgs = add (moduleArgs, module_args);
moduleIDs = add (moduleIDs, module_id);
y2milestone( "startController moduleNames %1", moduleNames );
y2milestone( "startController moduleArgs %1", moduleArgs );
y2milestone( "startController moduleIDs %1", moduleIDs );
ModToInitrd = add( ModToInitrd, [ module_name,
module_args ] );
y2milestone( "startController ModToInitrd %1", ModToInitrd );
y2milestone( "startController ModToInitrdLx %1", ModToInitrdLx );
}
} // not yet loaded
} // not postinstall
// break out of module load loop if one module failed
if (!all_modules_loaded)
{
one_module_failed = true;
}
}); // foreach module of current driver info
} // stop_loading
// break out of driver load loop if all modules of
// the current driver loaded successfully
if (all_modules_loaded)
{
stop_loading = true;
}
}); // foreach driver
HwStatus::Set (unique_key, one_module_failed?`no:`yes);
return (!one_module_failed);
}
// local function to go through list of resources (list of maps)
// checking if '"active":true' is set.
define boolean anyActive (list<map> resources)
``{
boolean active = size(resources)==0;
foreach (map res, resources,
``{
if (res["active"]:false)
active = true;
});
return active;
}
/**
* Start storage related USB and FireWire stuff
*
*/
global define void StartHotplugStorage ()
``{
import "Hotplug";
// If USB capable, there might be an usb storage device (i.e. ZIP)
// activate the module _last_ since it might interfere with other
// controllers (i.e. having usb-storage first might result in
// /dev/sda == zip which is bad if the zip drive is removed :-}).
if (Hotplug::haveUSB)
{
// if loading of usb-storage is successful, re-probe for floppies
// again since USB ZIP drives are regarded as floppies.
if (ModuleLoading::Load ("usb-storage", "", "", "USB Storage", Linuxrc::manual (), true) == `ok)
{
StorageDevices::FloppyReady();
}
}
if (Hotplug::haveFireWire)
{
// load sbp2
ModuleLoading::Load ("sbp2", "", "", "SBP2 Protocol", Linuxrc::manual (), true);
}
return;
}
/**
* @param none
* @returns void
* Init storage controllers (module loading)
* Must have called StorageControllers::probe() before !
// O: list of [ loaded modules, module argument ]
*/
global define void Initialize()
``{
moduleNames = [];
moduleArgs = [];
map controller = $[];
integer cindex = 0;
list ioresources = [];
boolean module_loaded = false;
ModToInitrd = [];
ModToInitrdLx = [];
y2milestone("Initialize controllers: %1", controllers);
// loop through all controller descriptions from hwprobe
// use while(), continue not allowed in foreach()
while( !Arch::s390() && cindex < size(controllers) )
{
controller = controllers[cindex]:$[];
y2milestone( "Initialize controller %1", controller );
if( size(controller["requires"]:[])>0 )
{
foreach( string s, controller["requires"]:[],
``{
Storage::AddHwPackage( s );
});
}
cindex = cindex + 1;
// check BIOS resources on 'wintel' compatible systems
if (Arch::board_wintel ())
{
// for every controller it is checked whether
// the controller is disabled in BIOS
// this is done by checking for an active IO or memory resource
if( !(anyActive (controller["resource", "io"]:[])
|| anyActive (controller["resource", "mem"]:[])))
{
y2milestone( "Initialize controller %1 disabled in BIOS",
controller["device"]:"" );
// continue if disabled in BIOS
continue;
}
}
module_loaded = startController(controller) || module_loaded;
} // while (controller)
y2milestone( "Initialize module_loaded %1", module_loaded );
y2milestone( "Initialize ModToInitrdLx %1 ModToInitrd %2 ", ModToInitrdLx,
ModToInitrd );
ModToInitrd = (list<list>)union( ModToInitrdLx, ModToInitrd );
y2milestone( "Initialize ModToInitrd %1", ModToInitrd );
if( size(ModToInitrd)>1 )
{
list<string> ls = filter( string s,
splitstring( (string)SCR::Read( .etc.install_inf.InitrdModules ),
" " ),
``(size(s)>0) );
y2milestone( "Initialize ls=%1", ls );
integer i = 0;
map lrmods = listmap( string s, ls, ``{i=i+1; return( $[ s : i ] );});
y2milestone( "Initialize lrmods=%1", lrmods );
i = 0;
while( i<size(ModToInitrd) )
{
integer j=i+1;
while( j<size(ModToInitrd) )
{
if( haskey( lrmods, ModToInitrd[i,0]:"" ) &&
haskey( lrmods, ModToInitrd[j,0]:"" ) &&
lrmods[ModToInitrd[i,0]:""]:0 >
lrmods[ModToInitrd[j,0]:""]:0 )
{
list tmp = ModToInitrd[i]:[];
ModToInitrd[i] = ModToInitrd[j]:[];
ModToInitrd[j] = tmp;
}
j = j+1;
}
i=i+1;
}
y2milestone( "Initialize ModToInitrd %1", ModToInitrd );
}
foreach( list s, ModToInitrd,
``{
Initrd::AddModule( s[0]:"", s[1]:"" );
});
y2milestone( "Initialize postinstall_info %1", postinstall_info );
parportInitialize ();
// load all raid personalities
SCR::Execute(.target.modprobe, "raid0", "" );
SCR::Execute(.target.modprobe, "raid1", "" );
SCR::Execute(.target.modprobe, "raid5", "" );
SCR::Execute(.target.modprobe, "raid6", "" );
SCR::Execute(.target.modprobe, "multipath", "" );
// init sw-RAID subsystem in the kernel
SCR::Execute( .target.bash, "/sbin/raidautorun");
StartHotplugStorage();
y2milestone("Initialize all controllers initialized module_loaded:%1",
module_loaded );
StorageDevices::InitDone();
if( module_loaded )
Storage::ReReadTargetMap();
y2milestone( "Initialize calling EnablePopup()" );
StorageClients::EnablePopup();
return;
}; // Initialize ()
}