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); }
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); }
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); }
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); }
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); }