From: Finn Thain <fthain@telegraphics.com.au>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: linux-m68k@vger.kernel.org, linux-kernel@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
netdev@vger.kernel.org, linux-fbdev@vger.kernel.org
Subject: [PATCH v5 12/14] nubus: Adopt standard linked list implementation
Date: Sat, 13 Jan 2018 17:37:13 -0500 (EST) [thread overview]
Message-ID: <fb137321694df0c225d49f19f4238e37cfff4429.1515814167.git.fthain@telegraphics.com.au> (raw)
In-Reply-To: <cover.1515814167.git.fthain@telegraphics.com.au>
This increases code re-use and improves readability.
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
drivers/net/ethernet/8390/mac8390.c | 7 +++--
drivers/net/ethernet/cirrus/mac89x0.c | 6 +++--
drivers/net/ethernet/natsemi/macsonic.c | 8 +++---
drivers/nubus/nubus.c | 45 ++++++++-------------------------
drivers/nubus/proc.c | 11 +++-----
drivers/video/fbdev/macfb.c | 8 +++---
include/linux/nubus.h | 15 +++++------
7 files changed, 40 insertions(+), 60 deletions(-)
diff --git a/drivers/net/ethernet/8390/mac8390.c b/drivers/net/ethernet/8390/mac8390.c
index 929ff6419621..2f91ce8dc614 100644
--- a/drivers/net/ethernet/8390/mac8390.c
+++ b/drivers/net/ethernet/8390/mac8390.c
@@ -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;
diff --git a/drivers/net/ethernet/cirrus/mac89x0.c b/drivers/net/ethernet/cirrus/mac89x0.c
index f910f0f386d6..977d4c2c759d 100644
--- a/drivers/net/ethernet/cirrus/mac89x0.c
+++ b/drivers/net/ethernet/cirrus/mac89x0.c
@@ -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,8 +208,9 @@ 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)
- goto out;
+ for_each_func_rsrc(fres)
+ if (fres->board->slot == slot)
+ goto out;
/* The pseudo-ISA bits always live at offset 0x300 (gee,
wonder why...) */
diff --git a/drivers/net/ethernet/natsemi/macsonic.c b/drivers/net/ethernet/natsemi/macsonic.c
index 14f3fb50dc21..313fe5e0184b 100644
--- a/drivers/net/ethernet/natsemi/macsonic.c
+++ b/drivers/net/ethernet/natsemi/macsonic.c
@@ -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;
diff --git a/drivers/nubus/nubus.c b/drivers/nubus/nubus.c
index 3657b13c0022..0bb54ccd7a1a 100644
--- a/drivers/nubus/nubus.c
+++ b/drivers/nubus/nubus.c
@@ -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;
- }
- return NULL;
+ 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. */
diff --git a/drivers/nubus/proc.c b/drivers/nubus/proc.c
index f2b118330be0..60c0f40b4d5e 100644
--- a/drivers/nubus/proc.c
+++ b/drivers/nubus/proc.c
@@ -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;
}
diff --git a/drivers/video/fbdev/macfb.c b/drivers/video/fbdev/macfb.c
index e86a2796e3d9..e707e617bf1c 100644
--- a/drivers/video/fbdev/macfb.c
+++ b/drivers/video/fbdev/macfb.c
@@ -670,15 +670,17 @@ static int __init macfb_init(void)
* code is really broken :-)
*/
- while ((ndev = nubus_find_type(NUBUS_CAT_DISPLAY,
- NUBUS_TYPE_VIDEO, ndev)))
- {
+ for_each_func_rsrc(ndev) {
unsigned long base = ndev->board->slot_addr;
if (mac_bi_data.videoaddr < base ||
mac_bi_data.videoaddr - base > 0xFFFFFF)
continue;
+ if (ndev->category != NUBUS_CAT_DISPLAY ||
+ ndev->type != NUBUS_TYPE_VIDEO)
+ continue;
+
video_is_nubus = 1;
slot_addr = (unsigned char *)base;
diff --git a/include/linux/nubus.h b/include/linux/nubus.h
index 4a481610ad38..2cbc7a199bca 100644
--- a/include/linux/nubus.h
+++ b/include/linux/nubus.h
@@ -33,7 +33,6 @@ struct nubus_dirent {
struct nubus_board {
struct nubus_board *next;
- struct nubus_rsrc *first_func_rsrc;
/* Only 9-E actually exist, though 0-8 are also theoretically
possible, and 0 is a special case which represents the
@@ -63,8 +62,7 @@ struct nubus_board {
};
struct nubus_rsrc {
- /* Next link in list */
- struct nubus_rsrc *next;
+ struct list_head list;
/* The functional resource ID */
unsigned char resid;
@@ -82,7 +80,7 @@ struct nubus_rsrc {
};
/* This is all NuBus functional resources (used to find devices later on) */
-extern struct nubus_rsrc *nubus_func_rsrcs;
+extern struct list_head nubus_func_rsrcs;
/* This is all NuBus cards */
extern struct nubus_board *nubus_boards;
@@ -115,12 +113,11 @@ static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
const struct nubus_dirent *ent) {}
#endif
-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 *nubus_next_rsrc_or_null(struct nubus_rsrc *from);
-struct nubus_rsrc *nubus_find_slot(unsigned int slot,
- const struct nubus_rsrc *from);
+#define for_each_func_rsrc(f) \
+ for (f = nubus_first_rsrc_or_null(); f; f = nubus_next_rsrc_or_null(f))
/* These are somewhat more NuBus-specific. They all return 0 for
success and -1 for failure, as you'd expect. */
--
2.13.6
next prev parent reply other threads:[~2018-01-13 22:40 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-13 22:37 [PATCH v5 00/14] Modernization and fixes for NuBus subsystem Finn Thain
2018-01-13 22:37 ` [PATCH v5 07/14] nubus: Remove redundant code Finn Thain
2018-01-13 22:37 ` [PATCH v5 10/14] nubus: Rework /proc/bus/nubus/s/ implementation Finn Thain
2018-01-13 22:37 ` [PATCH v5 04/14] nubus: Fix log spam Finn Thain
2018-01-13 22:37 ` [PATCH v5 09/14] nubus: Generalize block resource handling Finn Thain
2018-01-13 22:37 ` [PATCH v5 13/14] nubus: Add expansion_type values for various Mac models Finn Thain
2018-01-13 22:37 ` [PATCH v5 05/14] nubus: Validate slot resource IDs Finn Thain
2018-01-13 22:37 ` [PATCH v5 03/14] nubus: Use static functions where possible Finn Thain
2018-01-13 22:37 ` [PATCH v5 11/14] nubus: Rename struct nubus_dev Finn Thain
2018-01-13 22:37 ` [PATCH v5 01/14] nubus: Avoid array underflow and overflow Finn Thain
2018-01-13 22:37 ` [PATCH v5 08/14] nubus: Clean up whitespace Finn Thain
2018-01-13 22:37 ` [PATCH v5 02/14] nubus: Fix up header split Finn Thain
2018-01-13 22:37 ` [PATCH v5 06/14] nubus: Call proc_mkdir() not more than once per slot directory Finn Thain
2018-01-13 22:37 ` Finn Thain [this message]
2018-01-13 22:37 ` [PATCH v5 14/14] nubus: Add support for the driver model Finn Thain
2018-01-16 18:10 ` [PATCH v5 00/14] Modernization and fixes for NuBus subsystem Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fb137321694df0c225d49f19f4238e37cfff4429.1515814167.git.fthain@telegraphics.com.au \
--to=fthain@telegraphics.com.au \
--cc=b.zolnierkie@samsung.com \
--cc=davem@davemloft.net \
--cc=geert@linux-m68k.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).