123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- From 0dff8c753c8929a478357abb38db0d1c1a60ec94 Mon Sep 17 00:00:00 2001
- From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
- Date: Wed, 29 Aug 2012 22:08:15 +0200
- Subject: net: switchlib: add framework for ethernet switch drivers
- Add a generic framework similar to phylib for ethernet switch
- drivers and devices. This is useful to share the init and
- setup code for switch devices across different boards.
- Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
- Cc: Joe Hershberger <joe.hershberger@gmail.com>
- --- a/Makefile
- +++ b/Makefile
- @@ -280,6 +280,7 @@ LIBS-y += drivers/mtd/ubi/libubi.o
- LIBS-y += drivers/mtd/spi/libspi_flash.o
- LIBS-y += drivers/net/libnet.o
- LIBS-y += drivers/net/phy/libphy.o
- +LIBS-y += drivers/net/switch/libswitch.o
- LIBS-y += drivers/pci/libpci.o
- LIBS-y += drivers/pcmcia/libpcmcia.o
- LIBS-y += drivers/power/libpower.o \
- --- /dev/null
- +++ b/drivers/net/switch/Makefile
- @@ -0,0 +1,30 @@
- +#
- +# Copyright (C) 2000-2011 Wolfgang Denk, DENX Software Engineering, wd@denx.de
- +# Copyright (C) 2011-2013 Daniel Schwierzeck, daniel.schwierzeck@gmail.com
- +#
- +# SPDX-License-Identifier: GPL-2.0+
- +#
- +
- +include $(TOPDIR)/config.mk
- +
- +LIB := $(obj)libswitch.o
- +
- +COBJS-$(CONFIG_SWITCH_MULTI) += switch.o
- +
- +COBJS := $(COBJS-y)
- +SRCS := $(COBJS:.o=.c)
- +OBJS := $(addprefix $(obj),$(COBJS))
- +
- +all: $(LIB)
- +
- +$(LIB): $(obj).depend $(OBJS)
- + $(call cmd_link_o_target, $(OBJS))
- +
- +#########################################################################
- +
- +# defines $(obj).depend target
- +include $(SRCTREE)/rules.mk
- +
- +sinclude $(obj).depend
- +
- +#########################################################################
- --- /dev/null
- +++ b/drivers/net/switch/switch.c
- @@ -0,0 +1,62 @@
- +/*
- + * Copyright (C) 2011-2013 Daniel Schwierzeck, daniel.schwierzeck@gmail.com
- + *
- + * SPDX-License-Identifier: GPL-2.0+
- + */
- +
- +#include <common.h>
- +#include <netdev.h>
- +#include <miiphy.h>
- +#include <switch.h>
- +
- +static struct list_head switch_drivers;
- +static struct list_head switch_devices;
- +
- +void switch_init(void)
- +{
- + INIT_LIST_HEAD(&switch_drivers);
- + INIT_LIST_HEAD(&switch_devices);
- +
- + board_switch_init();
- +}
- +
- +void switch_driver_register(struct switch_driver *drv)
- +{
- + INIT_LIST_HEAD(&drv->list);
- + list_add_tail(&drv->list, &switch_drivers);
- +}
- +
- +int switch_device_register(struct switch_device *dev)
- +{
- + struct switch_driver *drv;
- +
- + /* Add switch device only, if an adequate driver is registered */
- + list_for_each_entry(drv, &switch_drivers, list) {
- + if (!strcmp(drv->name, dev->name)) {
- + dev->drv = drv;
- +
- + INIT_LIST_HEAD(&dev->list);
- + list_add_tail(&dev->list, &switch_devices);
- +
- + return 0;
- + }
- + }
- +
- + return -1;
- +}
- +
- +struct switch_device *switch_connect(struct mii_dev *bus)
- +{
- + struct switch_device *sw;
- + int err;
- +
- + list_for_each_entry(sw, &switch_devices, list) {
- + sw->bus = bus;
- +
- + err = sw->drv->probe(sw);
- + if (!err)
- + return sw;
- + }
- +
- + return NULL;
- +}
- --- /dev/null
- +++ b/include/switch.h
- @@ -0,0 +1,102 @@
- +/*
- + * This file is released under the terms of GPL v2 and any later version.
- + * See the file COPYING in the root directory of the source tree for details.
- + *
- + * Copyright (C) 2011-2013 Daniel Schwierzeck, daniel.schwierzeck@gmail.com
- + */
- +
- +#ifndef __SWITCH_H
- +#define __SWITCH_H
- +
- +#include <linux/list.h>
- +
- +#define SWITCH_NAME_SIZE 32
- +
- +struct switch_device;
- +struct mii_dev;
- +
- +struct switch_driver {
- + struct list_head list;
- +
- + /* Switch device name */
- + const char name[SWITCH_NAME_SIZE];
- +
- + /*
- + * Called to probe the switch chip. Must return 0 if the switch
- + * chip matches the given switch device/driver combination. Otherwise
- + * 1 must be returned.
- + */
- + int (*probe) (struct switch_device *dev);
- +
- + /*
- + * Called to initialize the switch chip.
- + */
- + void (*setup) (struct switch_device *dev);
- +};
- +
- +struct switch_device {
- + struct list_head list;
- + struct switch_driver *drv;
- +
- + /* MII bus the switch chip is connected to */
- + struct mii_dev *bus;
- +
- + /* Switch device name */
- + const char name[SWITCH_NAME_SIZE];
- +
- + /* Bitmask for board specific setup of used switch ports */
- + u16 port_mask;
- +
- + /* Number of switch port that is connected to host CPU */
- + u16 cpu_port;
- +};
- +
- +/*
- + * Board specific switch initialization.
- + *
- + * Called from switch_init to register the board specific switch_device
- + * structure.
- + */
- +extern int board_switch_init(void);
- +
- +/* Initialize switch subsystem */
- +#ifdef CONFIG_SWITCH_MULTI
- +extern void switch_init(void);
- +#else
- +static inline void switch_init(void)
- +{
- +}
- +#endif
- +
- +/* Register a switch driver */
- +extern void switch_driver_register(struct switch_driver *drv);
- +
- +/* Register a switch device */
- +extern int switch_device_register(struct switch_device *dev);
- +
- +/*
- + * Probe the available switch chips and connect the found one
- + * with the given MII bus
- + */
- +#ifdef CONFIG_SWITCH_MULTI
- +extern struct switch_device *switch_connect(struct mii_dev *bus);
- +#else
- +static inline struct switch_device *switch_connect(struct mii_dev *bus)
- +{
- + return NULL;
- +}
- +#endif
- +
- +/*
- + * Setup the given switch device
- + */
- +static inline void switch_setup(struct switch_device *dev)
- +{
- + if (dev->drv->setup)
- + dev->drv->setup(dev);
- +}
- +
- +/* Init functions for supported Switch drivers */
- +
- +#endif /* __SWITCH_H */
- +
- --- a/net/eth.c
- +++ b/net/eth.c
- @@ -10,6 +10,7 @@
- #include <net.h>
- #include <miiphy.h>
- #include <phy.h>
- +#include <switch.h>
-
- void eth_parse_enetaddr(const char *addr, uchar *enetaddr)
- {
- @@ -287,6 +288,8 @@ int eth_initialize(bd_t *bis)
- phy_init();
- #endif
-
- + switch_init();
- +
- eth_env_init(bis);
-
- /*
|