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 / Hotplug.ycp < prev    next >
Text File  |  2006-11-29  |  5KB  |  211 lines

  1. /**
  2.  * File:
  3.  *    Hotplug.ycp
  4.  *
  5.  * Module:
  6.  *    Hotplug
  7.  *
  8.  * Summary:
  9.  *    provide hotplug (USB, FireWire, PCMCIA) functions
  10.  *
  11.  * $Id: Hotplug.ycp 22825 2005-03-29 09:31:42Z jsrain $
  12.  *
  13.  * Authors:
  14.  *    Klaus Kaempf <kkaempf@suse.de>
  15.  *    Arvin Schnell <arvin@suse.de>
  16.  */
  17.  
  18. {
  19.     module "Hotplug";
  20.  
  21.     import "Arch";
  22.     import "ModuleLoading";
  23.     import "HwStatus";
  24.     import "Linuxrc";
  25.  
  26.     import "Mode";
  27.  
  28.     /**
  29.      * if a usb controller was found and initialized
  30.      */
  31.     global boolean haveUSB = false;
  32.  
  33.     /**
  34.      * if a firewire controller was found and initialized
  35.      */
  36.     global boolean haveFireWire = false;
  37.  
  38.     // start a controller (by loading its module)
  39.     // return true if successfull
  40.     // return false if failed
  41.  
  42.     define boolean startController (map controller)
  43.     ``{
  44.     // check module information
  45.     // skip controller if no module info available
  46.  
  47.     list<map> module_drivers = controller["drivers"]:[];
  48.  
  49.     if (size (module_drivers) == 0)
  50.         return true;
  51.  
  52.     // loop through all drivers checking if one is already active
  53.  
  54.     boolean already_active = false;
  55.     foreach (map modulemap, module_drivers,
  56.     ``{
  57.         if (modulemap["active"]:true)
  58.         {
  59.         already_active = true;
  60.         }
  61.     });
  62.  
  63.     // save unique key for HwStatus::Set()
  64.     string unique_key = controller["unique_key"]:"";
  65.  
  66.     if (already_active)
  67.     {
  68.         HwStatus::Set (unique_key, `yes);
  69.         return true;
  70.     }
  71.  
  72.     boolean stop_loading = false;
  73.     boolean one_module_failed = false;
  74.  
  75.     // loop through all drivers defined for this controller
  76.     // break after first successful load
  77.     //   no need to check "active", already done before !
  78.  
  79.     foreach (map modulemap, module_drivers,
  80.     ``{
  81.         y2milestone ("modulemap: %1", modulemap);
  82.         boolean module_modprobe = modulemap["modprobe"]:false;
  83.  
  84.         boolean all_modules_loaded = true;
  85.  
  86.         if (!stop_loading)
  87.         {
  88.         foreach (list module_entry, modulemap["modules"]:[],
  89.         ``{
  90.             string module_name = module_entry[0]:"";
  91.             string module_args = module_entry[1]:"";
  92.  
  93.             symbol load_result = `ok;
  94.             if (Linuxrc::manual ())
  95.             {
  96.             list vendor_device = ModuleLoading::prepareVendorDeviceInfo (controller);
  97.             load_result = ModuleLoading::Load (module_name, module_args,
  98.                              vendor_device[0]:"",
  99.                              vendor_device[1]:"",
  100.                              true,
  101.                              module_modprobe);
  102.             }
  103.             else
  104.             {
  105.             load_result = ModuleLoading::Load (module_name, module_args,
  106.                              "", "",
  107.                              false, module_modprobe);
  108.             }
  109.             if (load_result == `fail)
  110.             {
  111.             all_modules_loaded = false;
  112.             }
  113.             else if (load_result == `dont)
  114.             {
  115.             all_modules_loaded = true;
  116.             }
  117.  
  118.             // break out of module load loop if one module failed
  119.  
  120.             if (!all_modules_loaded)
  121.             {
  122.             one_module_failed = true;
  123.             }
  124.  
  125.         }); // foreach module of current driver info
  126.  
  127.         } // stop_loading
  128.  
  129.         // break out of driver load loop if all modules of
  130.         //   the current driver loaded successfully
  131.  
  132.         if (all_modules_loaded)
  133.         {
  134.         stop_loading = true;
  135.         }
  136.  
  137.     });  // foreach driver
  138.  
  139.     HwStatus::Set (unique_key, one_module_failed?`no:`yes);
  140.  
  141.     return (!one_module_failed);
  142.     }
  143.  
  144.  
  145.     /**
  146.      * @param    none
  147.      *
  148.      * @returns    void
  149.      * probe for usb type, load appropriate modules, and mount
  150.      * usbfs to /proc/bus/usb
  151.      */
  152.  
  153.     global define void StartUSB ()
  154.     ``{
  155.     if (Arch::sparc ())    // why this and why here ???
  156.         return;
  157.  
  158.     list<map> usb_controllers = (list<map>) SCR::Read(.probe.usbctrl);
  159.  
  160.     foreach (map controller, usb_controllers,
  161.     ``{
  162.         boolean start_result = startController (controller);
  163.         if (start_result)
  164.         haveUSB = true;
  165.     });
  166.  
  167.     y2milestone ("haveUSB = %1", haveUSB);
  168.  
  169.     if (haveUSB)
  170.     {
  171.         // prevent multiple mounts for /proc/bus/usb
  172.         list<map> mtab = (list<map>) SCR::Read(.etc.mtab);
  173.         if (mtab == nil) mtab = [];
  174.         boolean usb_mounted = false;
  175.         foreach (map mpoint, mtab,
  176.         ``{
  177.         if (mpoint["file"]:"" == "/proc/bus/usb")
  178.             usb_mounted = true;
  179.         });
  180.         if (!usb_mounted)
  181.         SCR::Execute (.target.mount, ["usbfs", "/proc/bus/usb"], "-t usbfs");
  182.     }
  183.     }
  184.  
  185.     /**
  186.      * @param    none
  187.      *
  188.      * @returns    void
  189.      * probe for firewire type, load appropriate modules, and mount
  190.      * usbfs to /proc/bus/usb
  191.      */
  192.  
  193.     global define void StartFireWire ()
  194.     ``{
  195.     if (Arch::sparc ())    // why this and why here ???
  196.         return;
  197.  
  198.     list<map> firewire_controllers = (list<map>) SCR::Read (.probe.ieee1394ctrl);
  199.  
  200.     foreach (map controller, firewire_controllers,
  201.     ``{
  202.         boolean start_result = startController (controller);
  203.         if (start_result)
  204.         haveFireWire = true;
  205.     });
  206.  
  207.     y2milestone ("haveFireWire = %1", haveFireWire);
  208.     }
  209.  
  210. }
  211.