swconfig: add (PHY) generic helper setting port link
[openwrt/openwrt.git] / target / linux / generic / files / include / linux / switch.h
index ef2dc3ad9fe1de38a66346ab39025ba97d41aa51..0c4cce7fa5ba0d3590b75d3c298ce1444207e0b4 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
+#ifndef _LINUX_SWITCH_H
+#define _LINUX_SWITCH_H
 
-#ifndef __LINUX_SWITCH_H
-#define __LINUX_SWITCH_H
-
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/netlink.h>
-#include <linux/genetlink.h>
-#ifndef __KERNEL__
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#else
 #include <net/genetlink.h>
-#endif
-
-/* main attributes */
-enum {
-       SWITCH_ATTR_UNSPEC,
-       /* global */
-       SWITCH_ATTR_TYPE,
-       /* device */
-       SWITCH_ATTR_ID,
-       SWITCH_ATTR_NAME,
-       SWITCH_ATTR_DEV_NAME,
-       SWITCH_ATTR_VLANS,
-       SWITCH_ATTR_PORTS,
-       SWITCH_ATTR_CPU_PORT,
-       /* attributes */
-       SWITCH_ATTR_OP_ID,
-       SWITCH_ATTR_OP_TYPE,
-       SWITCH_ATTR_OP_NAME,
-       SWITCH_ATTR_OP_PORT,
-       SWITCH_ATTR_OP_VLAN,
-       SWITCH_ATTR_OP_VALUE_INT,
-       SWITCH_ATTR_OP_VALUE_STR,
-       SWITCH_ATTR_OP_VALUE_PORTS,
-       SWITCH_ATTR_OP_DESCRIPTION,
-       /* port lists */
-       SWITCH_ATTR_PORT,
-       SWITCH_ATTR_MAX
-};
-
-/* commands */
-enum {
-       SWITCH_CMD_UNSPEC,
-       SWITCH_CMD_GET_SWITCH,
-       SWITCH_CMD_NEW_ATTR,
-       SWITCH_CMD_LIST_GLOBAL,
-       SWITCH_CMD_GET_GLOBAL,
-       SWITCH_CMD_SET_GLOBAL,
-       SWITCH_CMD_LIST_PORT,
-       SWITCH_CMD_GET_PORT,
-       SWITCH_CMD_SET_PORT,
-       SWITCH_CMD_LIST_VLAN,
-       SWITCH_CMD_GET_VLAN,
-       SWITCH_CMD_SET_VLAN
-};
-
-/* data types */
-enum switch_val_type {
-       SWITCH_TYPE_UNSPEC,
-       SWITCH_TYPE_INT,
-       SWITCH_TYPE_STRING,
-       SWITCH_TYPE_PORTS,
-       SWITCH_TYPE_NOVAL,
-};
-
-/* port nested attributes */
-enum {
-       SWITCH_PORT_UNSPEC,
-       SWITCH_PORT_ID,
-       SWITCH_PORT_FLAG_TAGGED,
-       SWITCH_PORT_ATTR_MAX
-};
-
-#define SWITCH_ATTR_DEFAULTS_OFFSET    0x1000
-
-#ifdef __KERNEL__
+#include <uapi/linux/switch.h>
 
 struct switch_dev;
 struct switch_op;
 struct switch_val;
 struct switch_attr;
 struct switch_attrlist;
+struct switch_led_trigger;
 
 int register_switch(struct switch_dev *dev, struct net_device *netdev);
 void unregister_switch(struct switch_dev *dev);
@@ -113,6 +40,29 @@ struct switch_attrlist {
        const struct switch_attr *attr;
 };
 
+enum switch_port_speed {
+       SWITCH_PORT_SPEED_UNKNOWN = 0,
+       SWITCH_PORT_SPEED_10 = 10,
+       SWITCH_PORT_SPEED_100 = 100,
+       SWITCH_PORT_SPEED_1000 = 1000,
+};
+
+struct switch_port_link {
+       bool link;
+       bool duplex;
+       bool aneg;
+       bool tx_flow;
+       bool rx_flow;
+       enum switch_port_speed speed;
+       /* in ethtool adv_t format */
+       u32 eee;
+};
+
+struct switch_port_stats {
+       unsigned long tx_bytes;
+       unsigned long rx_bytes;
+};
+
 /**
  * struct switch_dev_ops - switch driver operations
  *
@@ -142,14 +92,27 @@ struct switch_dev_ops {
 
        int (*apply_config)(struct switch_dev *dev);
        int (*reset_switch)(struct switch_dev *dev);
+
+       int (*get_port_link)(struct switch_dev *dev, int port,
+                            struct switch_port_link *link);
+       int (*set_port_link)(struct switch_dev *dev, int port,
+                            struct switch_port_link *link);
+       int (*get_port_stats)(struct switch_dev *dev, int port,
+                             struct switch_port_stats *stats);
+
+       int (*phy_read16)(struct switch_dev *dev, int addr, u8 reg, u16 *value);
+       int (*phy_write16)(struct switch_dev *dev, int addr, u8 reg, u16 value);
 };
 
 struct switch_dev {
+       struct device_node *of_node;
        const struct switch_dev_ops *ops;
-       const char *name;
+       /* will be automatically filled */
+       char devname[IFNAMSIZ];
 
-       /* NB: either devname or netdev must be set */
-       const char *devname;
+       const char *name;
+       /* NB: either alias or netdev must be set */
+       const char *alias;
        struct net_device *netdev;
 
        int ports;
@@ -161,8 +124,16 @@ struct switch_dev {
        struct list_head dev_list;
        unsigned long def_global, def_port, def_vlan;
 
-       spinlock_t lock;
+       struct mutex sw_mutex;
        struct switch_port *portbuf;
+       struct switch_portmap *portmap;
+       struct switch_port_link linkbuf;
+
+       char buf[128];
+
+#ifdef CONFIG_SWCONFIG_LEDS
+       struct switch_led_trigger *led_trigger;
+#endif
 };
 
 struct switch_port {
@@ -170,6 +141,11 @@ struct switch_port {
        u32 flags;
 };
 
+struct switch_portmap {
+       u32 virt;
+       const char *s;
+};
+
 struct switch_val {
        const struct switch_attr *attr;
        int port_vlan;
@@ -178,6 +154,7 @@ struct switch_val {
                const char *s;
                u32 i;
                struct switch_port *ports;
+               struct switch_port_link *link;
        } value;
 };
 
@@ -196,6 +173,7 @@ struct switch_attr {
        int max;
 };
 
-#endif
+int switch_generic_set_link(struct switch_dev *dev, int port,
+                           struct switch_port_link *link);
 
-#endif
+#endif /* _LINUX_SWITCH_H */