Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41b84816 authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven
Browse files

nubus: Adopt standard linked list implementation



This increases code re-use and improves readability.

Cc: "David S. Miller" <davem@davemloft.net>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Tested-by: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 189e19e8
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -416,8 +416,11 @@ struct net_device * __init mac8390_probe(int unit)
	if (unit >= 0)
		sprintf(dev->name, "eth%d", unit);

	while ((ndev = nubus_find_type(NUBUS_CAT_NETWORK, NUBUS_TYPE_ETHERNET,
				       ndev))) {
	for_each_func_rsrc(ndev) {
		if (ndev->category != NUBUS_CAT_NETWORK ||
		    ndev->type != NUBUS_TYPE_ETHERNET)
			continue;

		/* Have we seen it already? */
		if (slots & (1 << ndev->board->slot))
			continue;
+4 −2
Original line number Diff line number Diff line
@@ -187,6 +187,7 @@ struct net_device * __init mac89x0_probe(int unit)
	unsigned long ioaddr;
	unsigned short sig;
	int err = -ENODEV;
	struct nubus_rsrc *fres;

	if (!MACH_IS_MAC)
		return ERR_PTR(-ENODEV);
@@ -207,7 +208,8 @@ struct net_device * __init mac89x0_probe(int unit)
	/* We might have to parameterize this later */
	slot = 0xE;
	/* Get out now if there's a real NuBus card in slot E */
	if (nubus_find_slot(slot, NULL) != NULL)
	for_each_func_rsrc(fres)
		if (fres->board->slot == slot)
			goto out;

	/* The pseudo-ISA bits always live at offset 0x300 (gee,
+5 −3
Original line number Diff line number Diff line
@@ -464,9 +464,11 @@ static int mac_nubus_sonic_probe(struct net_device *dev)
	int reg_offset, dma_bitmode;

	/* Find the first SONIC that hasn't been initialized already */
	while ((ndev = nubus_find_type(NUBUS_CAT_NETWORK,
				       NUBUS_TYPE_ETHERNET, ndev)) != NULL)
	{
	for_each_func_rsrc(ndev) {
		if (ndev->category != NUBUS_CAT_NETWORK ||
		    ndev->type != NUBUS_TYPE_ETHERNET)
			continue;

		/* Have we seen it already? */
		if (slots & (1<<ndev->board->slot))
			continue;
+11 −34
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@

/* Globals */

struct nubus_rsrc *nubus_func_rsrcs;
LIST_HEAD(nubus_func_rsrcs);
struct nubus_board *nubus_boards;

/* Meaning of "bytelanes":
@@ -305,33 +305,20 @@ EXPORT_SYMBOL(nubus_rewinddir);

/* Driver interface functions, more or less like in pci.c */

struct nubus_rsrc *nubus_find_type(unsigned short category, unsigned short type,
				   const struct nubus_rsrc *from)
struct nubus_rsrc *nubus_first_rsrc_or_null(void)
{
	struct nubus_rsrc *itor = from ? from->next : nubus_func_rsrcs;

	while (itor) {
		if (itor->category == category && itor->type == type)
			return itor;
		itor = itor->next;
	}
	return NULL;
	return list_first_entry_or_null(&nubus_func_rsrcs, struct nubus_rsrc,
					list);
}
EXPORT_SYMBOL(nubus_find_type);
EXPORT_SYMBOL(nubus_first_rsrc_or_null);

struct nubus_rsrc *nubus_find_slot(unsigned int slot,
				   const struct nubus_rsrc *from)
struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from)
{
	struct nubus_rsrc *itor = from ? from->next : nubus_func_rsrcs;

	while (itor) {
		if (itor->board->slot == slot)
			return itor;
		itor = itor->next;
	}
	if (list_is_last(&from->list, &nubus_func_rsrcs))
		return NULL;
	return list_next_entry(from, list);
}
EXPORT_SYMBOL(nubus_find_slot);
EXPORT_SYMBOL(nubus_next_rsrc_or_null);

int
nubus_find_rsrc(struct nubus_dir *dir, unsigned char rsrc_type,
@@ -819,7 +806,6 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)

	while (nubus_readdir(&dir, &ent) != -1) {
		struct nubus_rsrc *fres;
		struct nubus_rsrc **fresp;

		fres = nubus_get_functional_resource(board, slot, &ent);
		if (fres == NULL)
@@ -834,16 +820,7 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
		}
		prev_resid = fres->resid;

		/* We zeroed this out above */
		if (board->first_func_rsrc == NULL)
			board->first_func_rsrc = fres;

		/* Put it on the func. resource list. Keep entries in order. */
		for (fresp = &nubus_func_rsrcs; *fresp != NULL;
		     fresp = &((*fresp)->next))
			/* spin */;
		*fresp = fres;
		fres->next = NULL;
		list_add_tail(&fres->list, &nubus_func_rsrcs);
	}

	/* Put it on the global NuBus board chain. Keep entries in order. */
+4 −7
Original line number Diff line number Diff line
@@ -36,15 +36,12 @@
static int
nubus_devices_proc_show(struct seq_file *m, void *v)
{
	struct nubus_rsrc *fres = nubus_func_rsrcs;
	struct nubus_rsrc *fres;

	while (fres) {
		seq_printf(m, "%x\t%04x %04x %04x %04x",
	for_each_func_rsrc(fres)
		seq_printf(m, "%x\t%04x %04x %04x %04x\t%08lx\n",
			   fres->board->slot, fres->category, fres->type,
			   fres->dr_sw, fres->dr_hw);
		seq_printf(m, "\t%08lx\n", fres->board->slot_addr);
		fres = fres->next;
	}
			   fres->dr_sw, fres->dr_hw, fres->board->slot_addr);
	return 0;
}

Loading