Changeset 36283


Ignore:
Timestamp:
2013-04-09T16:19:09+02:00 (5 years ago)
Author:
blogic
Message:

[swconfig] allow loading port maps from OF

Signed-off-by: John Crispin <blogic@…>

Location:
trunk/target/linux/generic/files
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/swconfig.c

    r34288 r36283  
    2424#include <linux/skbuff.h> 
    2525#include <linux/switch.h> 
     26#include <linux/of.h> 
    2627 
    2728//#define DEBUG 1 
     
    845846                const struct switch_dev *dev) 
    846847{ 
     848        struct nlattr *p = NULL, *m = NULL; 
    847849        void *hdr; 
     850        int i; 
    848851 
    849852        hdr = genlmsg_put(msg, pid, seq, &switch_fam, flags, 
     
    867870                goto nla_put_failure; 
    868871 
     872        m = nla_nest_start(msg, SWITCH_ATTR_PORTMAP); 
     873        if (!m) 
     874                goto nla_put_failure; 
     875        for (i = 0; i < dev->ports; i++) { 
     876                p = nla_nest_start(msg, SWITCH_ATTR_PORTS); 
     877                if (!p) 
     878                        continue; 
     879                if (dev->portmap[i].s) { 
     880                        if (nla_put_string(msg, SWITCH_PORTMAP_SEGMENT, dev->portmap[i].s)) 
     881                                goto nla_put_failure; 
     882                        if (nla_put_u32(msg, SWITCH_PORTMAP_VIRT, dev->portmap[i].virt)) 
     883                                goto nla_put_failure; 
     884                } 
     885                nla_nest_end(msg, p); 
     886        } 
     887        nla_nest_end(msg, m); 
    869888        return genlmsg_end(msg, hdr); 
    870889nla_put_failure: 
     
    955974}; 
    956975 
     976#ifdef CONFIG_OF 
     977void 
     978of_switch_load_portmap(struct switch_dev *dev) 
     979{ 
     980        struct device_node *port; 
     981 
     982        if (!dev->of_node) 
     983                return; 
     984 
     985        for_each_child_of_node(dev->of_node, port) { 
     986                const __be32 *prop; 
     987                const char *segment; 
     988                int size, phys; 
     989 
     990                if (of_device_is_compatible(port, "swconfig,port")) 
     991                        continue; 
     992 
     993                if (of_property_read_string(port, "swconfig,segment", &segment)) 
     994                        continue; 
     995 
     996                prop = of_get_property(port, "swconfig,portmap", &size); 
     997                if (!prop) 
     998                        continue; 
     999 
     1000                if (size != (2 * sizeof(*prop))) { 
     1001                        pr_err("%s: failed to parse port mapping\n", port->name); 
     1002                        continue; 
     1003                } 
     1004 
     1005                phys = be32_to_cpup(prop++); 
     1006                if ((phys < 0) | (phys >= dev->ports)) { 
     1007                        pr_err("%s: physical port index out of range\n", port->name); 
     1008                        continue; 
     1009                } 
     1010 
     1011                dev->portmap[phys].s = kstrdup(segment, GFP_KERNEL); 
     1012                dev->portmap[phys].virt = be32_to_cpup(prop); 
     1013                pr_debug("Found port: %s, physical: %d, virtual: %d\n", 
     1014                        segment, phys, dev->portmap[phys].virt); 
     1015        } 
     1016} 
     1017#endif 
     1018 
    9571019int 
    9581020register_switch(struct switch_dev *dev, struct net_device *netdev) 
     
    9771039                if (!dev->portbuf) 
    9781040                        return -ENOMEM; 
     1041                dev->portmap = kzalloc(sizeof(struct switch_portmap) * dev->ports, 
     1042                                GFP_KERNEL); 
     1043                if (!dev->portmap) { 
     1044                        kfree(dev->portbuf); 
     1045                        return -ENOMEM; 
     1046                } 
    9791047        } 
    9801048        swconfig_defaults_init(dev); 
     
    9971065                return -ENFILE; 
    9981066        } 
     1067 
     1068#ifdef CONFIG_OF 
     1069        if (dev->ports) 
     1070                of_switch_load_portmap(dev); 
     1071#endif 
    9991072 
    10001073        /* fill device name */ 
  • trunk/target/linux/generic/files/include/linux/switch.h

    r34677 r36283  
    9999 
    100100struct switch_dev { 
     101        struct device_node *of_node; 
    101102        const struct switch_dev_ops *ops; 
    102103        /* will be automatically filled */ 
     
    119120        struct mutex sw_mutex; 
    120121        struct switch_port *portbuf; 
     122        struct switch_portmap *portmap; 
    121123 
    122124        char buf[128]; 
     
    130132        u32 id; 
    131133        u32 flags; 
     134}; 
     135 
     136struct switch_portmap { 
     137        u32 virt; 
     138        const char *s; 
    132139}; 
    133140 
  • trunk/target/linux/generic/files/include/uapi/linux/switch.h

    r34677 r36283  
    4040        SWITCH_ATTR_VLANS, 
    4141        SWITCH_ATTR_PORTS, 
     42        SWITCH_ATTR_PORTMAP, 
    4243        SWITCH_ATTR_CPU_PORT, 
    4344        /* attributes */ 
     
    5455        SWITCH_ATTR_PORT, 
    5556        SWITCH_ATTR_MAX 
     57}; 
     58 
     59enum { 
     60        /* port map */ 
     61        SWITCH_PORTMAP_PORTS, 
     62        SWITCH_PORTMAP_SEGMENT, 
     63        SWITCH_PORTMAP_VIRT, 
     64        SWITCH_PORTMAP_MAX 
    5665}; 
    5766 
Note: See TracChangeset for help on using the changeset viewer.