0033-net-dsa-add-multi-gmac-support.patch 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. From cce5dd6034ed1651ee25c910edee708e6b84a44a Mon Sep 17 00:00:00 2001
  2. From: John Crispin <[email protected]>
  3. Date: Thu, 10 Aug 2017 14:45:08 +0200
  4. Subject: [PATCH 33/57] net: dsa: add multi gmac support
  5. Signed-off-by: John Crispin <[email protected]>
  6. ---
  7. drivers/net/dsa/mt7530.c | 10 +---------
  8. include/net/dsa.h | 21 ++++++++++++++++++++-
  9. net/dsa/dsa2.c | 40 +++++++++++++++++++++++++++++++++-------
  10. net/dsa/dsa_priv.h | 1 +
  11. net/dsa/slave.c | 26 ++++++++++++++++----------
  12. 5 files changed, 71 insertions(+), 27 deletions(-)
  13. --- a/drivers/net/dsa/mt7530.c
  14. +++ b/drivers/net/dsa/mt7530.c
  15. @@ -996,15 +996,7 @@ err:
  16. static enum dsa_tag_protocol
  17. mtk_get_tag_protocol(struct dsa_switch *ds)
  18. {
  19. - struct mt7530_priv *priv = ds->priv;
  20. -
  21. - if (!dsa_is_cpu_port(ds, MT7530_CPU_PORT)) {
  22. - dev_warn(priv->dev,
  23. - "port not matched with tagging CPU port\n");
  24. - return DSA_TAG_PROTO_NONE;
  25. - } else {
  26. - return DSA_TAG_PROTO_MTK;
  27. - }
  28. + return DSA_TAG_PROTO_MTK;
  29. }
  30. static struct dsa_switch_ops mt7530_switch_ops = {
  31. --- a/include/net/dsa.h
  32. +++ b/include/net/dsa.h
  33. @@ -145,6 +145,8 @@ struct dsa_port {
  34. struct device_node *dn;
  35. unsigned int ageing_time;
  36. u8 stp_state;
  37. + struct net_device *ethernet;
  38. + int upstream;
  39. };
  40. struct dsa_switch {
  41. @@ -205,7 +207,7 @@ struct dsa_switch {
  42. static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
  43. {
  44. - return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
  45. + return !!(ds->cpu_port_mask & (1 << p));
  46. }
  47. static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
  48. @@ -218,6 +220,11 @@ static inline bool dsa_is_port_initializ
  49. return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
  50. }
  51. +static inline bool dsa_is_upstream_port(struct dsa_switch *ds, int p)
  52. +{
  53. + return dsa_is_cpu_port(ds, p) || dsa_is_dsa_port(ds, p);
  54. +}
  55. +
  56. static inline u8 dsa_upstream_port(struct dsa_switch *ds)
  57. {
  58. struct dsa_switch_tree *dst = ds->dst;
  59. @@ -234,6 +241,18 @@ static inline u8 dsa_upstream_port(struc
  60. return ds->rtable[dst->cpu_switch];
  61. }
  62. +static inline u8 dsa_port_upstream_port(struct dsa_switch *ds, int port)
  63. +{
  64. + /*
  65. + * If this port has a specific upstream cpu port, use it,
  66. + * otherwise use the switch default.
  67. + */
  68. + if (ds->ports[port].upstream)
  69. + return ds->ports[port].upstream;
  70. + else
  71. + return dsa_upstream_port(ds);
  72. +}
  73. +
  74. struct switchdev_trans;
  75. struct switchdev_obj;
  76. struct switchdev_obj_port_fdb;
  77. --- a/net/dsa/dsa2.c
  78. +++ b/net/dsa/dsa2.c
  79. @@ -248,8 +248,6 @@ static int dsa_cpu_port_apply(struct dev
  80. return err;
  81. }
  82. - ds->cpu_port_mask |= BIT(index);
  83. -
  84. return 0;
  85. }
  86. @@ -259,6 +257,10 @@ static void dsa_cpu_port_unapply(struct
  87. dsa_cpu_dsa_destroy(port);
  88. ds->cpu_port_mask &= ~BIT(index);
  89. + if (ds->ports[index].ethernet) {
  90. + dev_put(ds->ports[index].ethernet);
  91. + ds->ports[index].ethernet = NULL;
  92. + }
  93. }
  94. static int dsa_user_port_apply(struct device_node *port, u32 index,
  95. @@ -479,6 +481,29 @@ static int dsa_cpu_parse(struct device_n
  96. dst->rcv = dst->tag_ops->rcv;
  97. + dev_hold(ethernet_dev);
  98. + ds->ports[index].ethernet = ethernet_dev;
  99. + ds->cpu_port_mask |= BIT(index);
  100. +
  101. + return 0;
  102. +}
  103. +
  104. +static int dsa_user_parse(struct device_node *port, u32 index,
  105. + struct dsa_switch *ds)
  106. +{
  107. + struct device_node *cpu_port;
  108. + const unsigned int *cpu_port_reg;
  109. + int cpu_port_index;
  110. +
  111. + cpu_port = of_parse_phandle(port, "cpu", 0);
  112. + if (cpu_port) {
  113. + cpu_port_reg = of_get_property(cpu_port, "reg", NULL);
  114. + if (!cpu_port_reg)
  115. + return -EINVAL;
  116. + cpu_port_index = be32_to_cpup(cpu_port_reg);
  117. + ds->ports[index].upstream = cpu_port_index;
  118. + }
  119. +
  120. return 0;
  121. }
  122. @@ -486,18 +511,19 @@ static int dsa_ds_parse(struct dsa_switc
  123. {
  124. struct device_node *port;
  125. u32 index;
  126. - int err;
  127. + int err = 0;
  128. for (index = 0; index < DSA_MAX_PORTS; index++) {
  129. port = ds->ports[index].dn;
  130. if (!port)
  131. continue;
  132. - if (dsa_port_is_cpu(port)) {
  133. + if (dsa_port_is_cpu(port))
  134. err = dsa_cpu_parse(port, index, dst, ds);
  135. - if (err)
  136. - return err;
  137. - }
  138. + else if (!dsa_port_is_dsa(port))
  139. + err = dsa_user_parse(port, index, ds);
  140. + if (err)
  141. + return err;
  142. }
  143. pr_info("DSA: switch %d %d parsed\n", dst->tree, ds->index);
  144. --- a/net/dsa/dsa_priv.h
  145. +++ b/net/dsa/dsa_priv.h
  146. @@ -43,6 +43,7 @@ struct dsa_slave_priv {
  147. int old_duplex;
  148. struct net_device *bridge_dev;
  149. + struct net_device *master;
  150. #ifdef CONFIG_NET_POLL_CONTROLLER
  151. struct netpoll *netpoll;
  152. #endif
  153. --- a/net/dsa/slave.c
  154. +++ b/net/dsa/slave.c
  155. @@ -61,7 +61,7 @@ static int dsa_slave_get_iflink(const st
  156. {
  157. struct dsa_slave_priv *p = netdev_priv(dev);
  158. - return p->parent->dst->master_netdev->ifindex;
  159. + return p->master->ifindex;
  160. }
  161. static inline bool dsa_port_is_bridged(struct dsa_slave_priv *p)
  162. @@ -96,7 +96,7 @@ static void dsa_port_set_stp_state(struc
  163. static int dsa_slave_open(struct net_device *dev)
  164. {
  165. struct dsa_slave_priv *p = netdev_priv(dev);
  166. - struct net_device *master = p->parent->dst->master_netdev;
  167. + struct net_device *master = p->master;
  168. struct dsa_switch *ds = p->parent;
  169. u8 stp_state = dsa_port_is_bridged(p) ?
  170. BR_STATE_BLOCKING : BR_STATE_FORWARDING;
  171. @@ -151,7 +151,7 @@ out:
  172. static int dsa_slave_close(struct net_device *dev)
  173. {
  174. struct dsa_slave_priv *p = netdev_priv(dev);
  175. - struct net_device *master = p->parent->dst->master_netdev;
  176. + struct net_device *master = p->master;
  177. struct dsa_switch *ds = p->parent;
  178. if (p->phy)
  179. @@ -178,7 +178,7 @@ static int dsa_slave_close(struct net_de
  180. static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
  181. {
  182. struct dsa_slave_priv *p = netdev_priv(dev);
  183. - struct net_device *master = p->parent->dst->master_netdev;
  184. + struct net_device *master = p->master;
  185. if (change & IFF_ALLMULTI)
  186. dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
  187. @@ -189,7 +189,7 @@ static void dsa_slave_change_rx_flags(st
  188. static void dsa_slave_set_rx_mode(struct net_device *dev)
  189. {
  190. struct dsa_slave_priv *p = netdev_priv(dev);
  191. - struct net_device *master = p->parent->dst->master_netdev;
  192. + struct net_device *master = p->master;
  193. dev_mc_sync(master, dev);
  194. dev_uc_sync(master, dev);
  195. @@ -198,7 +198,7 @@ static void dsa_slave_set_rx_mode(struct
  196. static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
  197. {
  198. struct dsa_slave_priv *p = netdev_priv(dev);
  199. - struct net_device *master = p->parent->dst->master_netdev;
  200. + struct net_device *master = p->master;
  201. struct sockaddr *addr = a;
  202. int err;
  203. @@ -633,7 +633,7 @@ static netdev_tx_t dsa_slave_xmit(struct
  204. /* Queue the SKB for transmission on the parent interface, but
  205. * do not modify its EtherType
  206. */
  207. - nskb->dev = p->parent->dst->master_netdev;
  208. + nskb->dev = p->master;
  209. dev_queue_xmit(nskb);
  210. return NETDEV_TX_OK;
  211. @@ -945,7 +945,7 @@ static int dsa_slave_netpoll_setup(struc
  212. {
  213. struct dsa_slave_priv *p = netdev_priv(dev);
  214. struct dsa_switch *ds = p->parent;
  215. - struct net_device *master = ds->dst->master_netdev;
  216. + struct net_device *master = p->master;
  217. struct netpoll *netpoll;
  218. int err = 0;
  219. @@ -1233,11 +1233,16 @@ int dsa_slave_create(struct dsa_switch *
  220. struct net_device *master;
  221. struct net_device *slave_dev;
  222. struct dsa_slave_priv *p;
  223. + int port_cpu = ds->ports[port].upstream;
  224. int ret;
  225. - master = ds->dst->master_netdev;
  226. - if (ds->master_netdev)
  227. + if (port_cpu && ds->ports[port_cpu].ethernet)
  228. + master = ds->ports[port_cpu].ethernet;
  229. + else if (ds->master_netdev)
  230. master = ds->master_netdev;
  231. + else
  232. + master = ds->dst->master_netdev;
  233. + master->dsa_ptr = (void *)ds->dst;
  234. slave_dev = alloc_netdev(sizeof(struct dsa_slave_priv), name,
  235. NET_NAME_UNKNOWN, ether_setup);
  236. @@ -1263,6 +1268,7 @@ int dsa_slave_create(struct dsa_switch *
  237. p->parent = ds;
  238. p->port = port;
  239. p->xmit = dst->tag_ops->xmit;
  240. + p->master = master;
  241. p->old_pause = -1;
  242. p->old_link = -1;