Skip to content

Commit

Permalink
nubus: Adopt standard linked list implementation
Browse files Browse the repository at this point in the history
This increases code re-use and improves readability.

Cc: "David S. Miller" <[email protected]>
Cc: Bartlomiej Zolnierkiewicz <[email protected]>
Acked-by: Bartlomiej Zolnierkiewicz <[email protected]>
Tested-by: Stan Johnson <[email protected]>
Signed-off-by: Finn Thain <[email protected]>
Signed-off-by: Geert Uytterhoeven <[email protected]>
  • Loading branch information
Finn Thain authored and geertu committed Jan 16, 2018
1 parent 189e19e commit 41b8481
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 60 deletions.
7 changes: 5 additions & 2 deletions drivers/net/ethernet/8390/mac8390.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/ethernet/cirrus/mac89x0.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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...) */
Expand Down
8 changes: 5 additions & 3 deletions drivers/net/ethernet/natsemi/macsonic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
45 changes: 11 additions & 34 deletions drivers/nubus/nubus.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

/* Globals */

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

/* Meaning of "bytelanes":
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand All @@ -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. */
Expand Down
11 changes: 4 additions & 7 deletions drivers/nubus/proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
8 changes: 5 additions & 3 deletions drivers/video/fbdev/macfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
15 changes: 6 additions & 9 deletions include/linux/nubus.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit 41b8481

Please sign in to comment.