swconfig: add (PHY) generic helper setting port link
[openwrt/openwrt.git] / target / linux / generic / files / include / linux / switch.h
index ba1de9b18b5d3aafe1db0facab0f98f4a67dc8f5..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_DEV_NAME,
-       SWITCH_ATTR_ALIAS,
-       SWITCH_ATTR_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;
@@ -129,6 +54,8 @@ struct switch_port_link {
        bool tx_flow;
        bool rx_flow;
        enum switch_port_speed speed;
+       /* in ethtool adv_t format */
+       u32 eee;
 };
 
 struct switch_port_stats {
@@ -168,11 +95,17 @@ struct switch_dev_ops {
 
        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;
        /* will be automatically filled */
        char devname[IFNAMSIZ];
@@ -191,8 +124,12 @@ 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;
@@ -204,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;
@@ -212,6 +154,7 @@ struct switch_val {
                const char *s;
                u32 i;
                struct switch_port *ports;
+               struct switch_port_link *link;
        } value;
 };
 
@@ -230,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 */