Beispiel #1
0
static void
scan (void)
{
  auto int dev_iterate_real (struct grub_ieee1275_devalias *alias,
			     int use_name);

  int dev_iterate_real (struct grub_ieee1275_devalias *alias, int use_name)
    {
      struct ofdisk_hash_ent *op;


      if (grub_strcmp (alias->type, "block") != 0)
	return 0;

      grub_dprintf ("disk", "disk name = %s, path = %s\n", alias->name,
		    alias->path);

      op = ofdisk_hash_find (alias->path);
      if (!op)
	{
	  char *name = grub_strdup (use_name ? alias->name : alias->path);
	  char *can = grub_strdup (alias->path);
	  if (!name || !can)
	    {
	      grub_errno = GRUB_ERR_NONE;
	      grub_free (name);
	      grub_free (can);
	      return 0;
	    }
	  op = ofdisk_hash_add (name, can);
	}
      return 0;
    }

  auto int dev_iterate_alias (struct grub_ieee1275_devalias *alias);
  int dev_iterate_alias (struct grub_ieee1275_devalias *alias)
  {
    return dev_iterate_real (alias, 1);
  }

  auto int dev_iterate (struct grub_ieee1275_devalias *alias);
  int dev_iterate (struct grub_ieee1275_devalias *alias)
  {
    return dev_iterate_real (alias, 0);
  }

  grub_devalias_iterate (dev_iterate_alias);
  if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS))
    grub_ieee1275_devices_iterate (dev_iterate);
}
Beispiel #2
0
static void
find_rtc (void)
{
  auto int hook (struct grub_ieee1275_devalias *alias);
  int hook (struct grub_ieee1275_devalias *alias)
  {
    if (grub_strcmp (alias->type, "rtc") == 0)
      {
	grub_dprintf ("datetime", "Found RTC %s\n", alias->path);
	rtc = grub_strdup (alias->path);
	return 1;
      }
    return 0;
  }
  
  grub_ieee1275_devices_iterate (hook);
}
Beispiel #3
0
static void
find_display (void)
{
  auto int hook (struct grub_ieee1275_devalias *alias);
  int hook (struct grub_ieee1275_devalias *alias)
  {
    if (grub_strcmp (alias->type, "display") == 0)
      {
	grub_dprintf ("video", "Found display %s\n", alias->path);
	display = grub_strdup (alias->path);
	return 1;
      }
    return 0;
  }
  
  grub_ieee1275_devices_iterate (hook);
}
Beispiel #4
0
static void
scan (void)
{
  auto int dev_iterate (struct grub_ieee1275_devalias *alias);

  int dev_iterate (struct grub_ieee1275_devalias *alias)
    {
      struct ofdisk_hash_ent *op;

      grub_dprintf ("disk", "device name = %s type = %s\n", alias->name,
		    alias->type);

      if (grub_strcmp (alias->type, "block") != 0)
	return 0;

      grub_dprintf ("disk", "disk name = %s\n", alias->name);
      grub_dprintf ("disk", "disk name = %s, path = %s\n", alias->name,
		    alias->path);

      op = ofdisk_hash_find (alias->name);
      if (!op)
	{
	  char *name = grub_strdup (alias->name);
	  char *can = grub_strdup (alias->path);
	  if (!name || !can)
	    {
	      grub_errno = GRUB_ERR_NONE;
	      grub_free (name);
	      grub_free (can);
	      return 0;
	    }
	  op = ofdisk_hash_add (name, can);
	}
      return 0;
    }

  grub_devalias_iterate (dev_iterate);
  grub_ieee1275_devices_iterate (dev_iterate);
}
Beispiel #5
0
static void
grub_ofnet_findcards (void)
{
  auto int search_net_devices (struct grub_ieee1275_devalias *alias);

  int search_net_devices (struct grub_ieee1275_devalias *alias)
  {
    if (!grub_strcmp (alias->type, "network"))
      {
	struct grub_ofnetcard_data *ofdata;
	struct grub_net_card *card;
	grub_ieee1275_phandle_t devhandle;
	grub_net_link_level_address_t lla;
	char *shortname;

	ofdata = grub_malloc (sizeof (struct grub_ofnetcard_data));
	if (!ofdata)
	  {
	    grub_print_error ();
	    return 1;
	  }
	card = grub_zalloc (sizeof (struct grub_net_card));
	if (!card)
	  {
	    grub_free (ofdata);
	    grub_print_error ();
	    return 1;
	  }

	ofdata->path = grub_strdup (alias->path);

	grub_ieee1275_finddevice (ofdata->path, &devhandle);

	if (grub_ieee1275_get_integer_property
	    (devhandle, "max-frame-size", &(ofdata->mtu),
	     sizeof (ofdata->mtu), 0))
	  {
	    ofdata->mtu = 1500;
	  }

	if (grub_ieee1275_get_property (devhandle, "mac-address",
					&(lla.mac), 6, 0)
	    && grub_ieee1275_get_property (devhandle, "local-mac-address",
					   &(lla.mac), 6, 0))
	  {
	    grub_error (GRUB_ERR_IO, "Couldn't retrieve mac address.");
	    grub_print_error ();
	    return 0;
	  }

	lla.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET;
	card->default_address = lla;

	card->driver = NULL;
	card->data = ofdata;
	card->flags = 0;
	shortname = find_alias (alias->path);
	card->name = grub_xasprintf ("ofnet_%s", shortname ? : alias->path);
	card->idle_poll_delay_ms = 1;
	grub_free (shortname);

	card->driver = &ofdriver;
	grub_net_card_register (card);
	return 0;
      }
    return 0;
  }

  /* Look at all nodes for devices of the type network.  */
  grub_ieee1275_devices_iterate (search_net_devices);
}