OSDN Git Service

nubus: Adopt standard linked list implementation
authorFinn Thain <fthain@telegraphics.com.au>
Sat, 13 Jan 2018 22:37:13 +0000 (17:37 -0500)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Tue, 16 Jan 2018 15:47:29 +0000 (16:47 +0100)
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>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
drivers/net/ethernet/8390/mac8390.c
drivers/net/ethernet/cirrus/mac89x0.c
drivers/net/ethernet/natsemi/macsonic.c
drivers/nubus/nubus.c
drivers/nubus/proc.c
drivers/video/fbdev/macfb.c
include/linux/nubus.h

index 929ff64..2f91ce8 100644 (file)
@@ -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;
index f910f0f..977d4c2 100644 (file)
@@ -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...) */
index 14f3fb5..313fe5e 100644 (file)
@@ -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;
index 3657b13..0bb54cc 100644 (file)
@@ -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. */
index f2b1183..60c0f40 100644 (file)
 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;
 }
 
index e86a279..e707e61 100644 (file)
@@ -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;
 
index 4a48161..2cbc7a1 100644 (file)
@@ -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. */