711-01-net-dsa-qca8k-implement-lag_fdb_add-del-ops.patch 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. From 3b4329230db8750bea7a56ef07f07cbbf5fc6c5a Mon Sep 17 00:00:00 2001
  2. From: Christian Marangi <[email protected]>
  3. Date: Tue, 4 Jul 2023 22:50:12 +0200
  4. Subject: [PATCH 19/20] net: dsa: qca8k: implement lag_fdb_add/del ops
  5. Implement lag_fdb_add/del ops to correctly support using LAG interface.
  6. Qca8k switch supports declaring fdb entry for link aggregation by simply
  7. setting the DES_PORT bits to all the LAG member.
  8. Signed-off-by: Christian Marangi <[email protected]>
  9. ---
  10. drivers/net/dsa/qca/qca8k-8xxx.c | 2 ++
  11. drivers/net/dsa/qca/qca8k-common.c | 48 ++++++++++++++++++++++++++++++
  12. drivers/net/dsa/qca/qca8k.h | 6 ++++
  13. 3 files changed, 56 insertions(+)
  14. --- a/drivers/net/dsa/qca/qca8k-8xxx.c
  15. +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
  16. @@ -2012,6 +2012,8 @@ static const struct dsa_switch_ops qca8k
  17. .port_fdb_add = qca8k_port_fdb_add,
  18. .port_fdb_del = qca8k_port_fdb_del,
  19. .port_fdb_dump = qca8k_port_fdb_dump,
  20. + .lag_fdb_add = qca8k_lag_fdb_add,
  21. + .lag_fdb_del = qca8k_lag_fdb_del,
  22. .port_mdb_add = qca8k_port_mdb_add,
  23. .port_mdb_del = qca8k_port_mdb_del,
  24. .port_mirror_add = qca8k_port_mirror_add,
  25. --- a/drivers/net/dsa/qca/qca8k-common.c
  26. +++ b/drivers/net/dsa/qca/qca8k-common.c
  27. @@ -1215,6 +1215,42 @@ int qca8k_port_lag_leave(struct dsa_swit
  28. return qca8k_lag_refresh_portmap(ds, port, lag, true);
  29. }
  30. +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
  31. + const unsigned char *addr, u16 vid,
  32. + struct dsa_db db)
  33. +{
  34. + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  35. + struct dsa_port *dp;
  36. + u16 port_mask = 0;
  37. +
  38. + /* Set the vid to the port vlan id if no vid is set */
  39. + if (!vid)
  40. + vid = QCA8K_PORT_VID_DEF;
  41. +
  42. + dsa_lag_foreach_port(dp, ds->dst, &lag)
  43. + port_mask |= BIT(dp->index);
  44. +
  45. + return qca8k_port_fdb_insert(priv, addr, port_mask, vid);
  46. +}
  47. +
  48. +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
  49. + const unsigned char *addr, u16 vid,
  50. + struct dsa_db db)
  51. +{
  52. + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  53. + struct dsa_port *dp;
  54. + u16 port_mask = 0;
  55. +
  56. + /* Set the vid to the port vlan id if no vid is set */
  57. + if (!vid)
  58. + vid = QCA8K_PORT_VID_DEF;
  59. +
  60. + dsa_lag_foreach_port(dp, ds->dst, &lag)
  61. + port_mask |= BIT(dp->index);
  62. +
  63. + return qca8k_fdb_del(priv, addr, port_mask, vid);
  64. +}
  65. +
  66. int qca8k_read_switch_id(struct qca8k_priv *priv)
  67. {
  68. u32 val;
  69. --- a/drivers/net/dsa/qca/qca8k.h
  70. +++ b/drivers/net/dsa/qca/qca8k.h
  71. @@ -590,5 +590,11 @@ int qca8k_port_lag_join(struct dsa_switc
  72. struct netlink_ext_ack *extack);
  73. int qca8k_port_lag_leave(struct dsa_switch *ds, int port,
  74. struct dsa_lag lag);
  75. +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
  76. + const unsigned char *addr, u16 vid,
  77. + struct dsa_db db);
  78. +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
  79. + const unsigned char *addr, u16 vid,
  80. + struct dsa_db db);
  81. #endif /* __QCA8K_H */