0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/dsa/ocelot.h>
0012 #include <linux/if_bridge.h>
0013 #include <linux/of_net.h>
0014 #include <linux/phy/phy.h>
0015 #include <net/pkt_cls.h>
0016 #include "ocelot.h"
0017 #include "ocelot_police.h"
0018 #include "ocelot_vcap.h"
0019 #include "ocelot_fdma.h"
0020
0021 #define OCELOT_MAC_QUIRKS OCELOT_QUIRK_QSGMII_PORTS_MUST_BE_UP
0022
0023 static bool ocelot_netdevice_dev_check(const struct net_device *dev);
0024
0025 static struct ocelot *devlink_port_to_ocelot(struct devlink_port *dlp)
0026 {
0027 return devlink_priv(dlp->devlink);
0028 }
0029
0030 static int devlink_port_to_port(struct devlink_port *dlp)
0031 {
0032 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0033
0034 return dlp - ocelot->devlink_ports;
0035 }
0036
0037 static int ocelot_devlink_sb_pool_get(struct devlink *dl,
0038 unsigned int sb_index, u16 pool_index,
0039 struct devlink_sb_pool_info *pool_info)
0040 {
0041 struct ocelot *ocelot = devlink_priv(dl);
0042
0043 return ocelot_sb_pool_get(ocelot, sb_index, pool_index, pool_info);
0044 }
0045
0046 static int ocelot_devlink_sb_pool_set(struct devlink *dl, unsigned int sb_index,
0047 u16 pool_index, u32 size,
0048 enum devlink_sb_threshold_type threshold_type,
0049 struct netlink_ext_ack *extack)
0050 {
0051 struct ocelot *ocelot = devlink_priv(dl);
0052
0053 return ocelot_sb_pool_set(ocelot, sb_index, pool_index, size,
0054 threshold_type, extack);
0055 }
0056
0057 static int ocelot_devlink_sb_port_pool_get(struct devlink_port *dlp,
0058 unsigned int sb_index, u16 pool_index,
0059 u32 *p_threshold)
0060 {
0061 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0062 int port = devlink_port_to_port(dlp);
0063
0064 return ocelot_sb_port_pool_get(ocelot, port, sb_index, pool_index,
0065 p_threshold);
0066 }
0067
0068 static int ocelot_devlink_sb_port_pool_set(struct devlink_port *dlp,
0069 unsigned int sb_index, u16 pool_index,
0070 u32 threshold,
0071 struct netlink_ext_ack *extack)
0072 {
0073 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0074 int port = devlink_port_to_port(dlp);
0075
0076 return ocelot_sb_port_pool_set(ocelot, port, sb_index, pool_index,
0077 threshold, extack);
0078 }
0079
0080 static int
0081 ocelot_devlink_sb_tc_pool_bind_get(struct devlink_port *dlp,
0082 unsigned int sb_index, u16 tc_index,
0083 enum devlink_sb_pool_type pool_type,
0084 u16 *p_pool_index, u32 *p_threshold)
0085 {
0086 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0087 int port = devlink_port_to_port(dlp);
0088
0089 return ocelot_sb_tc_pool_bind_get(ocelot, port, sb_index, tc_index,
0090 pool_type, p_pool_index,
0091 p_threshold);
0092 }
0093
0094 static int
0095 ocelot_devlink_sb_tc_pool_bind_set(struct devlink_port *dlp,
0096 unsigned int sb_index, u16 tc_index,
0097 enum devlink_sb_pool_type pool_type,
0098 u16 pool_index, u32 threshold,
0099 struct netlink_ext_ack *extack)
0100 {
0101 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0102 int port = devlink_port_to_port(dlp);
0103
0104 return ocelot_sb_tc_pool_bind_set(ocelot, port, sb_index, tc_index,
0105 pool_type, pool_index, threshold,
0106 extack);
0107 }
0108
0109 static int ocelot_devlink_sb_occ_snapshot(struct devlink *dl,
0110 unsigned int sb_index)
0111 {
0112 struct ocelot *ocelot = devlink_priv(dl);
0113
0114 return ocelot_sb_occ_snapshot(ocelot, sb_index);
0115 }
0116
0117 static int ocelot_devlink_sb_occ_max_clear(struct devlink *dl,
0118 unsigned int sb_index)
0119 {
0120 struct ocelot *ocelot = devlink_priv(dl);
0121
0122 return ocelot_sb_occ_max_clear(ocelot, sb_index);
0123 }
0124
0125 static int ocelot_devlink_sb_occ_port_pool_get(struct devlink_port *dlp,
0126 unsigned int sb_index,
0127 u16 pool_index, u32 *p_cur,
0128 u32 *p_max)
0129 {
0130 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0131 int port = devlink_port_to_port(dlp);
0132
0133 return ocelot_sb_occ_port_pool_get(ocelot, port, sb_index, pool_index,
0134 p_cur, p_max);
0135 }
0136
0137 static int
0138 ocelot_devlink_sb_occ_tc_port_bind_get(struct devlink_port *dlp,
0139 unsigned int sb_index, u16 tc_index,
0140 enum devlink_sb_pool_type pool_type,
0141 u32 *p_cur, u32 *p_max)
0142 {
0143 struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
0144 int port = devlink_port_to_port(dlp);
0145
0146 return ocelot_sb_occ_tc_port_bind_get(ocelot, port, sb_index,
0147 tc_index, pool_type,
0148 p_cur, p_max);
0149 }
0150
0151 const struct devlink_ops ocelot_devlink_ops = {
0152 .sb_pool_get = ocelot_devlink_sb_pool_get,
0153 .sb_pool_set = ocelot_devlink_sb_pool_set,
0154 .sb_port_pool_get = ocelot_devlink_sb_port_pool_get,
0155 .sb_port_pool_set = ocelot_devlink_sb_port_pool_set,
0156 .sb_tc_pool_bind_get = ocelot_devlink_sb_tc_pool_bind_get,
0157 .sb_tc_pool_bind_set = ocelot_devlink_sb_tc_pool_bind_set,
0158 .sb_occ_snapshot = ocelot_devlink_sb_occ_snapshot,
0159 .sb_occ_max_clear = ocelot_devlink_sb_occ_max_clear,
0160 .sb_occ_port_pool_get = ocelot_devlink_sb_occ_port_pool_get,
0161 .sb_occ_tc_port_bind_get = ocelot_devlink_sb_occ_tc_port_bind_get,
0162 };
0163
0164 int ocelot_port_devlink_init(struct ocelot *ocelot, int port,
0165 enum devlink_port_flavour flavour)
0166 {
0167 struct devlink_port *dlp = &ocelot->devlink_ports[port];
0168 int id_len = sizeof(ocelot->base_mac);
0169 struct devlink *dl = ocelot->devlink;
0170 struct devlink_port_attrs attrs = {};
0171
0172 memset(dlp, 0, sizeof(*dlp));
0173 memcpy(attrs.switch_id.id, &ocelot->base_mac, id_len);
0174 attrs.switch_id.id_len = id_len;
0175 attrs.phys.port_number = port;
0176 attrs.flavour = flavour;
0177
0178 devlink_port_attrs_set(dlp, &attrs);
0179
0180 return devlink_port_register(dl, dlp, port);
0181 }
0182
0183 void ocelot_port_devlink_teardown(struct ocelot *ocelot, int port)
0184 {
0185 struct devlink_port *dlp = &ocelot->devlink_ports[port];
0186
0187 devlink_port_unregister(dlp);
0188 }
0189
0190 static struct devlink_port *ocelot_get_devlink_port(struct net_device *dev)
0191 {
0192 struct ocelot_port_private *priv = netdev_priv(dev);
0193 struct ocelot *ocelot = priv->port.ocelot;
0194 int port = priv->port.index;
0195
0196 return &ocelot->devlink_ports[port];
0197 }
0198
0199 int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv,
0200 struct flow_cls_offload *f,
0201 bool ingress)
0202 {
0203 struct ocelot *ocelot = priv->port.ocelot;
0204 int port = priv->port.index;
0205
0206 if (!ingress)
0207 return -EOPNOTSUPP;
0208
0209 switch (f->command) {
0210 case FLOW_CLS_REPLACE:
0211 return ocelot_cls_flower_replace(ocelot, port, f, ingress);
0212 case FLOW_CLS_DESTROY:
0213 return ocelot_cls_flower_destroy(ocelot, port, f, ingress);
0214 case FLOW_CLS_STATS:
0215 return ocelot_cls_flower_stats(ocelot, port, f, ingress);
0216 default:
0217 return -EOPNOTSUPP;
0218 }
0219 }
0220
0221 static int ocelot_setup_tc_cls_matchall_police(struct ocelot_port_private *priv,
0222 struct tc_cls_matchall_offload *f,
0223 bool ingress,
0224 struct netlink_ext_ack *extack)
0225 {
0226 struct flow_action_entry *action = &f->rule->action.entries[0];
0227 struct ocelot *ocelot = priv->port.ocelot;
0228 struct ocelot_policer pol = { 0 };
0229 int port = priv->port.index;
0230 int err;
0231
0232 if (!ingress) {
0233 NL_SET_ERR_MSG_MOD(extack, "Only ingress is supported");
0234 return -EOPNOTSUPP;
0235 }
0236
0237 if (priv->tc.police_id && priv->tc.police_id != f->cookie) {
0238 NL_SET_ERR_MSG_MOD(extack,
0239 "Only one policer per port is supported");
0240 return -EEXIST;
0241 }
0242
0243 err = ocelot_policer_validate(&f->rule->action, action, extack);
0244 if (err)
0245 return err;
0246
0247 pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8;
0248 pol.burst = action->police.burst;
0249
0250 err = ocelot_port_policer_add(ocelot, port, &pol);
0251 if (err) {
0252 NL_SET_ERR_MSG_MOD(extack, "Could not add policer");
0253 return err;
0254 }
0255
0256 priv->tc.police_id = f->cookie;
0257 priv->tc.offload_cnt++;
0258
0259 return 0;
0260 }
0261
0262 static int ocelot_setup_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
0263 struct tc_cls_matchall_offload *f,
0264 bool ingress,
0265 struct netlink_ext_ack *extack)
0266 {
0267 struct flow_action *action = &f->rule->action;
0268 struct ocelot *ocelot = priv->port.ocelot;
0269 struct ocelot_port_private *other_priv;
0270 const struct flow_action_entry *a;
0271 int err;
0272
0273 if (f->common.protocol != htons(ETH_P_ALL))
0274 return -EOPNOTSUPP;
0275
0276 if (!flow_action_basic_hw_stats_check(action, extack))
0277 return -EOPNOTSUPP;
0278
0279 a = &action->entries[0];
0280 if (!a->dev)
0281 return -EINVAL;
0282
0283 if (!ocelot_netdevice_dev_check(a->dev)) {
0284 NL_SET_ERR_MSG_MOD(extack,
0285 "Destination not an ocelot port");
0286 return -EOPNOTSUPP;
0287 }
0288
0289 other_priv = netdev_priv(a->dev);
0290
0291 err = ocelot_port_mirror_add(ocelot, priv->port.index,
0292 other_priv->port.index, ingress, extack);
0293 if (err)
0294 return err;
0295
0296 if (ingress)
0297 priv->tc.ingress_mirred_id = f->cookie;
0298 else
0299 priv->tc.egress_mirred_id = f->cookie;
0300 priv->tc.offload_cnt++;
0301
0302 return 0;
0303 }
0304
0305 static int ocelot_del_tc_cls_matchall_police(struct ocelot_port_private *priv,
0306 struct netlink_ext_ack *extack)
0307 {
0308 struct ocelot *ocelot = priv->port.ocelot;
0309 int port = priv->port.index;
0310 int err;
0311
0312 err = ocelot_port_policer_del(ocelot, port);
0313 if (err) {
0314 NL_SET_ERR_MSG_MOD(extack,
0315 "Could not delete policer");
0316 return err;
0317 }
0318
0319 priv->tc.police_id = 0;
0320 priv->tc.offload_cnt--;
0321
0322 return 0;
0323 }
0324
0325 static int ocelot_del_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
0326 bool ingress,
0327 struct netlink_ext_ack *extack)
0328 {
0329 struct ocelot *ocelot = priv->port.ocelot;
0330 int port = priv->port.index;
0331
0332 ocelot_port_mirror_del(ocelot, port, ingress);
0333
0334 if (ingress)
0335 priv->tc.ingress_mirred_id = 0;
0336 else
0337 priv->tc.egress_mirred_id = 0;
0338 priv->tc.offload_cnt--;
0339
0340 return 0;
0341 }
0342
0343 static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
0344 struct tc_cls_matchall_offload *f,
0345 bool ingress)
0346 {
0347 struct netlink_ext_ack *extack = f->common.extack;
0348 struct flow_action_entry *action;
0349
0350 switch (f->command) {
0351 case TC_CLSMATCHALL_REPLACE:
0352 if (!flow_offload_has_one_action(&f->rule->action)) {
0353 NL_SET_ERR_MSG_MOD(extack,
0354 "Only one action is supported");
0355 return -EOPNOTSUPP;
0356 }
0357
0358 if (priv->tc.block_shared) {
0359 NL_SET_ERR_MSG_MOD(extack,
0360 "Matchall offloads not supported on shared blocks");
0361 return -EOPNOTSUPP;
0362 }
0363
0364 action = &f->rule->action.entries[0];
0365
0366 switch (action->id) {
0367 case FLOW_ACTION_POLICE:
0368 return ocelot_setup_tc_cls_matchall_police(priv, f,
0369 ingress,
0370 extack);
0371 break;
0372 case FLOW_ACTION_MIRRED:
0373 return ocelot_setup_tc_cls_matchall_mirred(priv, f,
0374 ingress,
0375 extack);
0376 default:
0377 NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
0378 return -EOPNOTSUPP;
0379 }
0380
0381 break;
0382 case TC_CLSMATCHALL_DESTROY:
0383 action = &f->rule->action.entries[0];
0384
0385 if (f->cookie == priv->tc.police_id)
0386 return ocelot_del_tc_cls_matchall_police(priv, extack);
0387 else if (f->cookie == priv->tc.ingress_mirred_id ||
0388 f->cookie == priv->tc.egress_mirred_id)
0389 return ocelot_del_tc_cls_matchall_mirred(priv, ingress,
0390 extack);
0391 else
0392 return -ENOENT;
0393
0394 break;
0395 case TC_CLSMATCHALL_STATS:
0396 default:
0397 return -EOPNOTSUPP;
0398 }
0399 }
0400
0401 static int ocelot_setup_tc_block_cb(enum tc_setup_type type,
0402 void *type_data,
0403 void *cb_priv, bool ingress)
0404 {
0405 struct ocelot_port_private *priv = cb_priv;
0406
0407 if (!tc_cls_can_offload_and_chain0(priv->dev, type_data))
0408 return -EOPNOTSUPP;
0409
0410 switch (type) {
0411 case TC_SETUP_CLSMATCHALL:
0412 return ocelot_setup_tc_cls_matchall(priv, type_data, ingress);
0413 case TC_SETUP_CLSFLOWER:
0414 return ocelot_setup_tc_cls_flower(priv, type_data, ingress);
0415 default:
0416 return -EOPNOTSUPP;
0417 }
0418 }
0419
0420 static int ocelot_setup_tc_block_cb_ig(enum tc_setup_type type,
0421 void *type_data,
0422 void *cb_priv)
0423 {
0424 return ocelot_setup_tc_block_cb(type, type_data,
0425 cb_priv, true);
0426 }
0427
0428 static int ocelot_setup_tc_block_cb_eg(enum tc_setup_type type,
0429 void *type_data,
0430 void *cb_priv)
0431 {
0432 return ocelot_setup_tc_block_cb(type, type_data,
0433 cb_priv, false);
0434 }
0435
0436 static LIST_HEAD(ocelot_block_cb_list);
0437
0438 static int ocelot_setup_tc_block(struct ocelot_port_private *priv,
0439 struct flow_block_offload *f)
0440 {
0441 struct flow_block_cb *block_cb;
0442 flow_setup_cb_t *cb;
0443
0444 if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) {
0445 cb = ocelot_setup_tc_block_cb_ig;
0446 priv->tc.block_shared = f->block_shared;
0447 } else if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS) {
0448 cb = ocelot_setup_tc_block_cb_eg;
0449 } else {
0450 return -EOPNOTSUPP;
0451 }
0452
0453 f->driver_block_list = &ocelot_block_cb_list;
0454
0455 switch (f->command) {
0456 case FLOW_BLOCK_BIND:
0457 if (flow_block_cb_is_busy(cb, priv, &ocelot_block_cb_list))
0458 return -EBUSY;
0459
0460 block_cb = flow_block_cb_alloc(cb, priv, priv, NULL);
0461 if (IS_ERR(block_cb))
0462 return PTR_ERR(block_cb);
0463
0464 flow_block_cb_add(block_cb, f);
0465 list_add_tail(&block_cb->driver_list, f->driver_block_list);
0466 return 0;
0467 case FLOW_BLOCK_UNBIND:
0468 block_cb = flow_block_cb_lookup(f->block, cb, priv);
0469 if (!block_cb)
0470 return -ENOENT;
0471
0472 flow_block_cb_remove(block_cb, f);
0473 list_del(&block_cb->driver_list);
0474 return 0;
0475 default:
0476 return -EOPNOTSUPP;
0477 }
0478 }
0479
0480 static int ocelot_setup_tc(struct net_device *dev, enum tc_setup_type type,
0481 void *type_data)
0482 {
0483 struct ocelot_port_private *priv = netdev_priv(dev);
0484
0485 switch (type) {
0486 case TC_SETUP_BLOCK:
0487 return ocelot_setup_tc_block(priv, type_data);
0488 default:
0489 return -EOPNOTSUPP;
0490 }
0491 return 0;
0492 }
0493
0494 static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid,
0495 bool untagged)
0496 {
0497 struct ocelot_port_private *priv = netdev_priv(dev);
0498 struct ocelot_port *ocelot_port = &priv->port;
0499 struct ocelot *ocelot = ocelot_port->ocelot;
0500 int port = priv->port.index;
0501 int ret;
0502
0503 ret = ocelot_vlan_add(ocelot, port, vid, pvid, untagged);
0504 if (ret)
0505 return ret;
0506
0507
0508 ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr, vid,
0509 ENTRYTYPE_LOCKED);
0510
0511 return 0;
0512 }
0513
0514 static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid)
0515 {
0516 struct ocelot_port_private *priv = netdev_priv(dev);
0517 struct ocelot *ocelot = priv->port.ocelot;
0518 int port = priv->port.index;
0519 int ret;
0520
0521
0522
0523
0524
0525 if (vid == OCELOT_STANDALONE_PVID)
0526 return 0;
0527
0528 ret = ocelot_vlan_del(ocelot, port, vid);
0529 if (ret)
0530 return ret;
0531
0532
0533 ocelot_mact_forget(ocelot, dev->dev_addr, vid);
0534
0535 return 0;
0536 }
0537
0538 static int ocelot_port_open(struct net_device *dev)
0539 {
0540 struct ocelot_port_private *priv = netdev_priv(dev);
0541
0542 phylink_start(priv->phylink);
0543
0544 return 0;
0545 }
0546
0547 static int ocelot_port_stop(struct net_device *dev)
0548 {
0549 struct ocelot_port_private *priv = netdev_priv(dev);
0550
0551 phylink_stop(priv->phylink);
0552
0553 return 0;
0554 }
0555
0556 static netdev_tx_t ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev)
0557 {
0558 struct ocelot_port_private *priv = netdev_priv(dev);
0559 struct ocelot_port *ocelot_port = &priv->port;
0560 struct ocelot *ocelot = ocelot_port->ocelot;
0561 int port = priv->port.index;
0562 u32 rew_op = 0;
0563
0564 if (!static_branch_unlikely(&ocelot_fdma_enabled) &&
0565 !ocelot_can_inject(ocelot, 0))
0566 return NETDEV_TX_BUSY;
0567
0568
0569 if (ocelot->ptp && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
0570 struct sk_buff *clone = NULL;
0571
0572 if (ocelot_port_txtstamp_request(ocelot, port, skb, &clone)) {
0573 kfree_skb(skb);
0574 return NETDEV_TX_OK;
0575 }
0576
0577 if (clone)
0578 OCELOT_SKB_CB(skb)->clone = clone;
0579
0580 rew_op = ocelot_ptp_rew_op(skb);
0581 }
0582
0583 if (static_branch_unlikely(&ocelot_fdma_enabled)) {
0584 ocelot_fdma_inject_frame(ocelot, port, rew_op, skb, dev);
0585 } else {
0586 ocelot_port_inject_frame(ocelot, port, 0, rew_op, skb);
0587
0588 consume_skb(skb);
0589 }
0590
0591 return NETDEV_TX_OK;
0592 }
0593
0594 enum ocelot_action_type {
0595 OCELOT_MACT_LEARN,
0596 OCELOT_MACT_FORGET,
0597 };
0598
0599 struct ocelot_mact_work_ctx {
0600 struct work_struct work;
0601 struct ocelot *ocelot;
0602 enum ocelot_action_type type;
0603 union {
0604
0605 struct {
0606 unsigned char addr[ETH_ALEN];
0607 u16 vid;
0608 enum macaccess_entry_type entry_type;
0609 int pgid;
0610 } learn;
0611
0612 struct {
0613 unsigned char addr[ETH_ALEN];
0614 u16 vid;
0615 } forget;
0616 };
0617 };
0618
0619 #define ocelot_work_to_ctx(x) \
0620 container_of((x), struct ocelot_mact_work_ctx, work)
0621
0622 static void ocelot_mact_work(struct work_struct *work)
0623 {
0624 struct ocelot_mact_work_ctx *w = ocelot_work_to_ctx(work);
0625 struct ocelot *ocelot = w->ocelot;
0626
0627 switch (w->type) {
0628 case OCELOT_MACT_LEARN:
0629 ocelot_mact_learn(ocelot, w->learn.pgid, w->learn.addr,
0630 w->learn.vid, w->learn.entry_type);
0631 break;
0632 case OCELOT_MACT_FORGET:
0633 ocelot_mact_forget(ocelot, w->forget.addr, w->forget.vid);
0634 break;
0635 default:
0636 break;
0637 }
0638
0639 kfree(w);
0640 }
0641
0642 static int ocelot_enqueue_mact_action(struct ocelot *ocelot,
0643 const struct ocelot_mact_work_ctx *ctx)
0644 {
0645 struct ocelot_mact_work_ctx *w = kmemdup(ctx, sizeof(*w), GFP_ATOMIC);
0646
0647 if (!w)
0648 return -ENOMEM;
0649
0650 w->ocelot = ocelot;
0651 INIT_WORK(&w->work, ocelot_mact_work);
0652 queue_work(ocelot->owq, &w->work);
0653
0654 return 0;
0655 }
0656
0657 static int ocelot_mc_unsync(struct net_device *dev, const unsigned char *addr)
0658 {
0659 struct ocelot_port_private *priv = netdev_priv(dev);
0660 struct ocelot_port *ocelot_port = &priv->port;
0661 struct ocelot *ocelot = ocelot_port->ocelot;
0662 struct ocelot_mact_work_ctx w;
0663
0664 ether_addr_copy(w.forget.addr, addr);
0665 w.forget.vid = OCELOT_STANDALONE_PVID;
0666 w.type = OCELOT_MACT_FORGET;
0667
0668 return ocelot_enqueue_mact_action(ocelot, &w);
0669 }
0670
0671 static int ocelot_mc_sync(struct net_device *dev, const unsigned char *addr)
0672 {
0673 struct ocelot_port_private *priv = netdev_priv(dev);
0674 struct ocelot_port *ocelot_port = &priv->port;
0675 struct ocelot *ocelot = ocelot_port->ocelot;
0676 struct ocelot_mact_work_ctx w;
0677
0678 ether_addr_copy(w.learn.addr, addr);
0679 w.learn.vid = OCELOT_STANDALONE_PVID;
0680 w.learn.pgid = PGID_CPU;
0681 w.learn.entry_type = ENTRYTYPE_LOCKED;
0682 w.type = OCELOT_MACT_LEARN;
0683
0684 return ocelot_enqueue_mact_action(ocelot, &w);
0685 }
0686
0687 static void ocelot_set_rx_mode(struct net_device *dev)
0688 {
0689 struct ocelot_port_private *priv = netdev_priv(dev);
0690 struct ocelot *ocelot = priv->port.ocelot;
0691 u32 val;
0692 int i;
0693
0694
0695
0696
0697
0698 val = GENMASK(ocelot->num_phys_ports - 1, 0);
0699 for_each_nonreserved_multicast_dest_pgid(ocelot, i)
0700 ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i);
0701
0702 __dev_mc_sync(dev, ocelot_mc_sync, ocelot_mc_unsync);
0703 }
0704
0705 static int ocelot_port_set_mac_address(struct net_device *dev, void *p)
0706 {
0707 struct ocelot_port_private *priv = netdev_priv(dev);
0708 struct ocelot_port *ocelot_port = &priv->port;
0709 struct ocelot *ocelot = ocelot_port->ocelot;
0710 const struct sockaddr *addr = p;
0711
0712
0713 ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data,
0714 OCELOT_STANDALONE_PVID, ENTRYTYPE_LOCKED);
0715
0716 ocelot_mact_forget(ocelot, dev->dev_addr, OCELOT_STANDALONE_PVID);
0717
0718 eth_hw_addr_set(dev, addr->sa_data);
0719 return 0;
0720 }
0721
0722 static void ocelot_get_stats64(struct net_device *dev,
0723 struct rtnl_link_stats64 *stats)
0724 {
0725 struct ocelot_port_private *priv = netdev_priv(dev);
0726 struct ocelot *ocelot = priv->port.ocelot;
0727 int port = priv->port.index;
0728 u64 *s;
0729
0730 spin_lock(&ocelot->stats_lock);
0731
0732 s = &ocelot->stats[port * OCELOT_NUM_STATS];
0733
0734
0735 stats->rx_bytes = s[OCELOT_STAT_RX_OCTETS];
0736 stats->rx_packets = s[OCELOT_STAT_RX_SHORTS] +
0737 s[OCELOT_STAT_RX_FRAGMENTS] +
0738 s[OCELOT_STAT_RX_JABBERS] +
0739 s[OCELOT_STAT_RX_LONGS] +
0740 s[OCELOT_STAT_RX_64] +
0741 s[OCELOT_STAT_RX_65_127] +
0742 s[OCELOT_STAT_RX_128_255] +
0743 s[OCELOT_STAT_RX_256_511] +
0744 s[OCELOT_STAT_RX_512_1023] +
0745 s[OCELOT_STAT_RX_1024_1526] +
0746 s[OCELOT_STAT_RX_1527_MAX];
0747 stats->multicast = s[OCELOT_STAT_RX_MULTICAST];
0748 stats->rx_dropped = dev->stats.rx_dropped;
0749
0750
0751 stats->tx_bytes = s[OCELOT_STAT_TX_OCTETS];
0752 stats->tx_packets = s[OCELOT_STAT_TX_64] +
0753 s[OCELOT_STAT_TX_65_127] +
0754 s[OCELOT_STAT_TX_128_255] +
0755 s[OCELOT_STAT_TX_256_511] +
0756 s[OCELOT_STAT_TX_512_1023] +
0757 s[OCELOT_STAT_TX_1024_1526] +
0758 s[OCELOT_STAT_TX_1527_MAX];
0759 stats->tx_dropped = s[OCELOT_STAT_TX_DROPS] +
0760 s[OCELOT_STAT_TX_AGED];
0761 stats->collisions = s[OCELOT_STAT_TX_COLLISION];
0762
0763 spin_unlock(&ocelot->stats_lock);
0764 }
0765
0766 static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
0767 struct net_device *dev,
0768 const unsigned char *addr,
0769 u16 vid, u16 flags,
0770 struct netlink_ext_ack *extack)
0771 {
0772 struct ocelot_port_private *priv = netdev_priv(dev);
0773 struct ocelot_port *ocelot_port = &priv->port;
0774 struct ocelot *ocelot = ocelot_port->ocelot;
0775 int port = priv->port.index;
0776
0777 return ocelot_fdb_add(ocelot, port, addr, vid, ocelot_port->bridge);
0778 }
0779
0780 static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
0781 struct net_device *dev,
0782 const unsigned char *addr, u16 vid,
0783 struct netlink_ext_ack *extack)
0784 {
0785 struct ocelot_port_private *priv = netdev_priv(dev);
0786 struct ocelot_port *ocelot_port = &priv->port;
0787 struct ocelot *ocelot = ocelot_port->ocelot;
0788 int port = priv->port.index;
0789
0790 return ocelot_fdb_del(ocelot, port, addr, vid, ocelot_port->bridge);
0791 }
0792
0793 static int ocelot_port_fdb_dump(struct sk_buff *skb,
0794 struct netlink_callback *cb,
0795 struct net_device *dev,
0796 struct net_device *filter_dev, int *idx)
0797 {
0798 struct ocelot_port_private *priv = netdev_priv(dev);
0799 struct ocelot *ocelot = priv->port.ocelot;
0800 struct ocelot_dump_ctx dump = {
0801 .dev = dev,
0802 .skb = skb,
0803 .cb = cb,
0804 .idx = *idx,
0805 };
0806 int port = priv->port.index;
0807 int ret;
0808
0809 ret = ocelot_fdb_dump(ocelot, port, ocelot_port_fdb_do_dump, &dump);
0810
0811 *idx = dump.idx;
0812
0813 return ret;
0814 }
0815
0816 static int ocelot_vlan_rx_add_vid(struct net_device *dev, __be16 proto,
0817 u16 vid)
0818 {
0819 return ocelot_vlan_vid_add(dev, vid, false, false);
0820 }
0821
0822 static int ocelot_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
0823 u16 vid)
0824 {
0825 return ocelot_vlan_vid_del(dev, vid);
0826 }
0827
0828 static void ocelot_vlan_mode(struct ocelot *ocelot, int port,
0829 netdev_features_t features)
0830 {
0831 u32 val;
0832
0833
0834 val = ocelot_read(ocelot, ANA_VLANMASK);
0835 if (features & NETIF_F_HW_VLAN_CTAG_FILTER)
0836 val |= BIT(port);
0837 else
0838 val &= ~BIT(port);
0839 ocelot_write(ocelot, val, ANA_VLANMASK);
0840 }
0841
0842 static int ocelot_set_features(struct net_device *dev,
0843 netdev_features_t features)
0844 {
0845 netdev_features_t changed = dev->features ^ features;
0846 struct ocelot_port_private *priv = netdev_priv(dev);
0847 struct ocelot *ocelot = priv->port.ocelot;
0848 int port = priv->port.index;
0849
0850 if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC) &&
0851 priv->tc.offload_cnt) {
0852 netdev_err(dev,
0853 "Cannot disable HW TC offload while offloads active\n");
0854 return -EBUSY;
0855 }
0856
0857 if (changed & NETIF_F_HW_VLAN_CTAG_FILTER)
0858 ocelot_vlan_mode(ocelot, port, features);
0859
0860 return 0;
0861 }
0862
0863 static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
0864 {
0865 struct ocelot_port_private *priv = netdev_priv(dev);
0866 struct ocelot *ocelot = priv->port.ocelot;
0867 int port = priv->port.index;
0868
0869
0870
0871
0872 if (!phy_has_hwtstamp(dev->phydev) && ocelot->ptp) {
0873 switch (cmd) {
0874 case SIOCSHWTSTAMP:
0875 return ocelot_hwstamp_set(ocelot, port, ifr);
0876 case SIOCGHWTSTAMP:
0877 return ocelot_hwstamp_get(ocelot, port, ifr);
0878 }
0879 }
0880
0881 return phy_mii_ioctl(dev->phydev, ifr, cmd);
0882 }
0883
0884 static int ocelot_change_mtu(struct net_device *dev, int new_mtu)
0885 {
0886 struct ocelot_port_private *priv = netdev_priv(dev);
0887 struct ocelot_port *ocelot_port = &priv->port;
0888 struct ocelot *ocelot = ocelot_port->ocelot;
0889
0890 ocelot_port_set_maxlen(ocelot, priv->port.index, new_mtu);
0891 WRITE_ONCE(dev->mtu, new_mtu);
0892
0893 return 0;
0894 }
0895
0896 static const struct net_device_ops ocelot_port_netdev_ops = {
0897 .ndo_open = ocelot_port_open,
0898 .ndo_stop = ocelot_port_stop,
0899 .ndo_start_xmit = ocelot_port_xmit,
0900 .ndo_change_mtu = ocelot_change_mtu,
0901 .ndo_set_rx_mode = ocelot_set_rx_mode,
0902 .ndo_set_mac_address = ocelot_port_set_mac_address,
0903 .ndo_get_stats64 = ocelot_get_stats64,
0904 .ndo_fdb_add = ocelot_port_fdb_add,
0905 .ndo_fdb_del = ocelot_port_fdb_del,
0906 .ndo_fdb_dump = ocelot_port_fdb_dump,
0907 .ndo_vlan_rx_add_vid = ocelot_vlan_rx_add_vid,
0908 .ndo_vlan_rx_kill_vid = ocelot_vlan_rx_kill_vid,
0909 .ndo_set_features = ocelot_set_features,
0910 .ndo_setup_tc = ocelot_setup_tc,
0911 .ndo_eth_ioctl = ocelot_ioctl,
0912 .ndo_get_devlink_port = ocelot_get_devlink_port,
0913 };
0914
0915 struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port)
0916 {
0917 struct ocelot_port *ocelot_port = ocelot->ports[port];
0918 struct ocelot_port_private *priv;
0919
0920 if (!ocelot_port)
0921 return NULL;
0922
0923 priv = container_of(ocelot_port, struct ocelot_port_private, port);
0924
0925 return priv->dev;
0926 }
0927
0928
0929 static bool ocelot_netdevice_dev_check(const struct net_device *dev)
0930 {
0931 return dev->netdev_ops == &ocelot_port_netdev_ops;
0932 }
0933
0934 int ocelot_netdev_to_port(struct net_device *dev)
0935 {
0936 struct ocelot_port_private *priv;
0937
0938 if (!dev || !ocelot_netdevice_dev_check(dev))
0939 return -EINVAL;
0940
0941 priv = netdev_priv(dev);
0942
0943 return priv->port.index;
0944 }
0945
0946 static void ocelot_port_get_strings(struct net_device *netdev, u32 sset,
0947 u8 *data)
0948 {
0949 struct ocelot_port_private *priv = netdev_priv(netdev);
0950 struct ocelot *ocelot = priv->port.ocelot;
0951 int port = priv->port.index;
0952
0953 ocelot_get_strings(ocelot, port, sset, data);
0954 }
0955
0956 static void ocelot_port_get_ethtool_stats(struct net_device *dev,
0957 struct ethtool_stats *stats,
0958 u64 *data)
0959 {
0960 struct ocelot_port_private *priv = netdev_priv(dev);
0961 struct ocelot *ocelot = priv->port.ocelot;
0962 int port = priv->port.index;
0963
0964 ocelot_get_ethtool_stats(ocelot, port, data);
0965 }
0966
0967 static int ocelot_port_get_sset_count(struct net_device *dev, int sset)
0968 {
0969 struct ocelot_port_private *priv = netdev_priv(dev);
0970 struct ocelot *ocelot = priv->port.ocelot;
0971 int port = priv->port.index;
0972
0973 return ocelot_get_sset_count(ocelot, port, sset);
0974 }
0975
0976 static int ocelot_port_get_ts_info(struct net_device *dev,
0977 struct ethtool_ts_info *info)
0978 {
0979 struct ocelot_port_private *priv = netdev_priv(dev);
0980 struct ocelot *ocelot = priv->port.ocelot;
0981 int port = priv->port.index;
0982
0983 if (!ocelot->ptp)
0984 return ethtool_op_get_ts_info(dev, info);
0985
0986 return ocelot_get_ts_info(ocelot, port, info);
0987 }
0988
0989 static const struct ethtool_ops ocelot_ethtool_ops = {
0990 .get_strings = ocelot_port_get_strings,
0991 .get_ethtool_stats = ocelot_port_get_ethtool_stats,
0992 .get_sset_count = ocelot_port_get_sset_count,
0993 .get_link_ksettings = phy_ethtool_get_link_ksettings,
0994 .set_link_ksettings = phy_ethtool_set_link_ksettings,
0995 .get_ts_info = ocelot_port_get_ts_info,
0996 };
0997
0998 static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port,
0999 u8 state)
1000 {
1001 ocelot_bridge_stp_state_set(ocelot, port, state);
1002 }
1003
1004 static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port,
1005 unsigned long ageing_clock_t)
1006 {
1007 unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
1008 u32 ageing_time = jiffies_to_msecs(ageing_jiffies);
1009
1010 ocelot_set_ageing_time(ocelot, ageing_time);
1011 }
1012
1013 static void ocelot_port_attr_mc_set(struct ocelot *ocelot, int port, bool mc)
1014 {
1015 u32 cpu_fwd_mcast = ANA_PORT_CPU_FWD_CFG_CPU_IGMP_REDIR_ENA |
1016 ANA_PORT_CPU_FWD_CFG_CPU_MLD_REDIR_ENA |
1017 ANA_PORT_CPU_FWD_CFG_CPU_IPMC_CTRL_COPY_ENA;
1018 u32 val = 0;
1019
1020 if (mc)
1021 val = cpu_fwd_mcast;
1022
1023 ocelot_rmw_gix(ocelot, val, cpu_fwd_mcast,
1024 ANA_PORT_CPU_FWD_CFG, port);
1025 }
1026
1027 static int ocelot_port_attr_set(struct net_device *dev, const void *ctx,
1028 const struct switchdev_attr *attr,
1029 struct netlink_ext_ack *extack)
1030 {
1031 struct ocelot_port_private *priv = netdev_priv(dev);
1032 struct ocelot *ocelot = priv->port.ocelot;
1033 int port = priv->port.index;
1034 int err = 0;
1035
1036 if (ctx && ctx != priv)
1037 return 0;
1038
1039 switch (attr->id) {
1040 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1041 ocelot_port_attr_stp_state_set(ocelot, port, attr->u.stp_state);
1042 break;
1043 case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
1044 ocelot_port_attr_ageing_set(ocelot, port, attr->u.ageing_time);
1045 break;
1046 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
1047 ocelot_port_vlan_filtering(ocelot, port, attr->u.vlan_filtering,
1048 extack);
1049 break;
1050 case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
1051 ocelot_port_attr_mc_set(ocelot, port, !attr->u.mc_disabled);
1052 break;
1053 case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
1054 err = ocelot_port_pre_bridge_flags(ocelot, port,
1055 attr->u.brport_flags);
1056 break;
1057 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
1058 ocelot_port_bridge_flags(ocelot, port, attr->u.brport_flags);
1059 break;
1060 default:
1061 err = -EOPNOTSUPP;
1062 break;
1063 }
1064
1065 return err;
1066 }
1067
1068 static int ocelot_vlan_vid_prepare(struct net_device *dev, u16 vid, bool pvid,
1069 bool untagged, struct netlink_ext_ack *extack)
1070 {
1071 struct ocelot_port_private *priv = netdev_priv(dev);
1072 struct ocelot_port *ocelot_port = &priv->port;
1073 struct ocelot *ocelot = ocelot_port->ocelot;
1074 int port = priv->port.index;
1075
1076 return ocelot_vlan_prepare(ocelot, port, vid, pvid, untagged, extack);
1077 }
1078
1079 static int ocelot_port_obj_add_vlan(struct net_device *dev,
1080 const struct switchdev_obj_port_vlan *vlan,
1081 struct netlink_ext_ack *extack)
1082 {
1083 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1084 bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1085 int ret;
1086
1087 ret = ocelot_vlan_vid_prepare(dev, vlan->vid, pvid, untagged, extack);
1088 if (ret)
1089 return ret;
1090
1091 return ocelot_vlan_vid_add(dev, vlan->vid, pvid, untagged);
1092 }
1093
1094 static int ocelot_port_obj_add_mdb(struct net_device *dev,
1095 const struct switchdev_obj_port_mdb *mdb)
1096 {
1097 struct ocelot_port_private *priv = netdev_priv(dev);
1098 struct ocelot_port *ocelot_port = &priv->port;
1099 struct ocelot *ocelot = ocelot_port->ocelot;
1100 int port = priv->port.index;
1101
1102 return ocelot_port_mdb_add(ocelot, port, mdb, ocelot_port->bridge);
1103 }
1104
1105 static int ocelot_port_obj_del_mdb(struct net_device *dev,
1106 const struct switchdev_obj_port_mdb *mdb)
1107 {
1108 struct ocelot_port_private *priv = netdev_priv(dev);
1109 struct ocelot_port *ocelot_port = &priv->port;
1110 struct ocelot *ocelot = ocelot_port->ocelot;
1111 int port = priv->port.index;
1112
1113 return ocelot_port_mdb_del(ocelot, port, mdb, ocelot_port->bridge);
1114 }
1115
1116 static int ocelot_port_obj_mrp_add(struct net_device *dev,
1117 const struct switchdev_obj_mrp *mrp)
1118 {
1119 struct ocelot_port_private *priv = netdev_priv(dev);
1120 struct ocelot_port *ocelot_port = &priv->port;
1121 struct ocelot *ocelot = ocelot_port->ocelot;
1122 int port = priv->port.index;
1123
1124 return ocelot_mrp_add(ocelot, port, mrp);
1125 }
1126
1127 static int ocelot_port_obj_mrp_del(struct net_device *dev,
1128 const struct switchdev_obj_mrp *mrp)
1129 {
1130 struct ocelot_port_private *priv = netdev_priv(dev);
1131 struct ocelot_port *ocelot_port = &priv->port;
1132 struct ocelot *ocelot = ocelot_port->ocelot;
1133 int port = priv->port.index;
1134
1135 return ocelot_mrp_del(ocelot, port, mrp);
1136 }
1137
1138 static int
1139 ocelot_port_obj_mrp_add_ring_role(struct net_device *dev,
1140 const struct switchdev_obj_ring_role_mrp *mrp)
1141 {
1142 struct ocelot_port_private *priv = netdev_priv(dev);
1143 struct ocelot_port *ocelot_port = &priv->port;
1144 struct ocelot *ocelot = ocelot_port->ocelot;
1145 int port = priv->port.index;
1146
1147 return ocelot_mrp_add_ring_role(ocelot, port, mrp);
1148 }
1149
1150 static int
1151 ocelot_port_obj_mrp_del_ring_role(struct net_device *dev,
1152 const struct switchdev_obj_ring_role_mrp *mrp)
1153 {
1154 struct ocelot_port_private *priv = netdev_priv(dev);
1155 struct ocelot_port *ocelot_port = &priv->port;
1156 struct ocelot *ocelot = ocelot_port->ocelot;
1157 int port = priv->port.index;
1158
1159 return ocelot_mrp_del_ring_role(ocelot, port, mrp);
1160 }
1161
1162 static int ocelot_port_obj_add(struct net_device *dev, const void *ctx,
1163 const struct switchdev_obj *obj,
1164 struct netlink_ext_ack *extack)
1165 {
1166 struct ocelot_port_private *priv = netdev_priv(dev);
1167 int ret = 0;
1168
1169 if (ctx && ctx != priv)
1170 return 0;
1171
1172 switch (obj->id) {
1173 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1174 ret = ocelot_port_obj_add_vlan(dev,
1175 SWITCHDEV_OBJ_PORT_VLAN(obj),
1176 extack);
1177 break;
1178 case SWITCHDEV_OBJ_ID_PORT_MDB:
1179 ret = ocelot_port_obj_add_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1180 break;
1181 case SWITCHDEV_OBJ_ID_MRP:
1182 ret = ocelot_port_obj_mrp_add(dev, SWITCHDEV_OBJ_MRP(obj));
1183 break;
1184 case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1185 ret = ocelot_port_obj_mrp_add_ring_role(dev,
1186 SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1187 break;
1188 default:
1189 return -EOPNOTSUPP;
1190 }
1191
1192 return ret;
1193 }
1194
1195 static int ocelot_port_obj_del(struct net_device *dev, const void *ctx,
1196 const struct switchdev_obj *obj)
1197 {
1198 struct ocelot_port_private *priv = netdev_priv(dev);
1199 int ret = 0;
1200
1201 if (ctx && ctx != priv)
1202 return 0;
1203
1204 switch (obj->id) {
1205 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1206 ret = ocelot_vlan_vid_del(dev,
1207 SWITCHDEV_OBJ_PORT_VLAN(obj)->vid);
1208 break;
1209 case SWITCHDEV_OBJ_ID_PORT_MDB:
1210 ret = ocelot_port_obj_del_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1211 break;
1212 case SWITCHDEV_OBJ_ID_MRP:
1213 ret = ocelot_port_obj_mrp_del(dev, SWITCHDEV_OBJ_MRP(obj));
1214 break;
1215 case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1216 ret = ocelot_port_obj_mrp_del_ring_role(dev,
1217 SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1218 break;
1219 default:
1220 return -EOPNOTSUPP;
1221 }
1222
1223 return ret;
1224 }
1225
1226 static void ocelot_inherit_brport_flags(struct ocelot *ocelot, int port,
1227 struct net_device *brport_dev)
1228 {
1229 struct switchdev_brport_flags flags = {0};
1230 int flag;
1231
1232 flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1233
1234 for_each_set_bit(flag, &flags.mask, 32)
1235 if (br_port_flag_is_set(brport_dev, BIT(flag)))
1236 flags.val |= BIT(flag);
1237
1238 ocelot_port_bridge_flags(ocelot, port, flags);
1239 }
1240
1241 static void ocelot_clear_brport_flags(struct ocelot *ocelot, int port)
1242 {
1243 struct switchdev_brport_flags flags;
1244
1245 flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1246 flags.val = flags.mask & ~BR_LEARNING;
1247
1248 ocelot_port_bridge_flags(ocelot, port, flags);
1249 }
1250
1251 static int ocelot_switchdev_sync(struct ocelot *ocelot, int port,
1252 struct net_device *brport_dev,
1253 struct net_device *bridge_dev,
1254 struct netlink_ext_ack *extack)
1255 {
1256 clock_t ageing_time;
1257 u8 stp_state;
1258
1259 ocelot_inherit_brport_flags(ocelot, port, brport_dev);
1260
1261 stp_state = br_port_get_stp_state(brport_dev);
1262 ocelot_bridge_stp_state_set(ocelot, port, stp_state);
1263
1264 ageing_time = br_get_ageing_time(bridge_dev);
1265 ocelot_port_attr_ageing_set(ocelot, port, ageing_time);
1266
1267 return ocelot_port_vlan_filtering(ocelot, port,
1268 br_vlan_enabled(bridge_dev),
1269 extack);
1270 }
1271
1272 static int ocelot_switchdev_unsync(struct ocelot *ocelot, int port)
1273 {
1274 int err;
1275
1276 err = ocelot_port_vlan_filtering(ocelot, port, false, NULL);
1277 if (err)
1278 return err;
1279
1280 ocelot_clear_brport_flags(ocelot, port);
1281
1282 ocelot_bridge_stp_state_set(ocelot, port, BR_STATE_FORWARDING);
1283
1284 return 0;
1285 }
1286
1287 static int ocelot_bridge_num_get(struct ocelot *ocelot,
1288 const struct net_device *bridge_dev)
1289 {
1290 int bridge_num = ocelot_bridge_num_find(ocelot, bridge_dev);
1291
1292 if (bridge_num < 0) {
1293
1294 bridge_num = find_first_zero_bit(&ocelot->bridges,
1295 ocelot->num_phys_ports);
1296
1297 set_bit(bridge_num, &ocelot->bridges);
1298 }
1299
1300 return bridge_num;
1301 }
1302
1303 static void ocelot_bridge_num_put(struct ocelot *ocelot,
1304 const struct net_device *bridge_dev,
1305 int bridge_num)
1306 {
1307
1308
1309
1310 if (!ocelot_bridge_num_find(ocelot, bridge_dev))
1311 clear_bit(bridge_num, &ocelot->bridges);
1312 }
1313
1314 static int ocelot_netdevice_bridge_join(struct net_device *dev,
1315 struct net_device *brport_dev,
1316 struct net_device *bridge,
1317 struct netlink_ext_ack *extack)
1318 {
1319 struct ocelot_port_private *priv = netdev_priv(dev);
1320 struct ocelot_port *ocelot_port = &priv->port;
1321 struct ocelot *ocelot = ocelot_port->ocelot;
1322 int port = priv->port.index;
1323 int bridge_num, err;
1324
1325 bridge_num = ocelot_bridge_num_get(ocelot, bridge);
1326
1327 err = ocelot_port_bridge_join(ocelot, port, bridge, bridge_num,
1328 extack);
1329 if (err)
1330 goto err_join;
1331
1332 err = switchdev_bridge_port_offload(brport_dev, dev, priv,
1333 &ocelot_switchdev_nb,
1334 &ocelot_switchdev_blocking_nb,
1335 false, extack);
1336 if (err)
1337 goto err_switchdev_offload;
1338
1339 err = ocelot_switchdev_sync(ocelot, port, brport_dev, bridge, extack);
1340 if (err)
1341 goto err_switchdev_sync;
1342
1343 return 0;
1344
1345 err_switchdev_sync:
1346 switchdev_bridge_port_unoffload(brport_dev, priv,
1347 &ocelot_switchdev_nb,
1348 &ocelot_switchdev_blocking_nb);
1349 err_switchdev_offload:
1350 ocelot_port_bridge_leave(ocelot, port, bridge);
1351 err_join:
1352 ocelot_bridge_num_put(ocelot, bridge, bridge_num);
1353 return err;
1354 }
1355
1356 static void ocelot_netdevice_pre_bridge_leave(struct net_device *dev,
1357 struct net_device *brport_dev)
1358 {
1359 struct ocelot_port_private *priv = netdev_priv(dev);
1360
1361 switchdev_bridge_port_unoffload(brport_dev, priv,
1362 &ocelot_switchdev_nb,
1363 &ocelot_switchdev_blocking_nb);
1364 }
1365
1366 static int ocelot_netdevice_bridge_leave(struct net_device *dev,
1367 struct net_device *brport_dev,
1368 struct net_device *bridge)
1369 {
1370 struct ocelot_port_private *priv = netdev_priv(dev);
1371 struct ocelot_port *ocelot_port = &priv->port;
1372 struct ocelot *ocelot = ocelot_port->ocelot;
1373 int bridge_num = ocelot_port->bridge_num;
1374 int port = priv->port.index;
1375 int err;
1376
1377 err = ocelot_switchdev_unsync(ocelot, port);
1378 if (err)
1379 return err;
1380
1381 ocelot_port_bridge_leave(ocelot, port, bridge);
1382 ocelot_bridge_num_put(ocelot, bridge, bridge_num);
1383
1384 return 0;
1385 }
1386
1387 static int ocelot_netdevice_lag_join(struct net_device *dev,
1388 struct net_device *bond,
1389 struct netdev_lag_upper_info *info,
1390 struct netlink_ext_ack *extack)
1391 {
1392 struct ocelot_port_private *priv = netdev_priv(dev);
1393 struct ocelot_port *ocelot_port = &priv->port;
1394 struct ocelot *ocelot = ocelot_port->ocelot;
1395 struct net_device *bridge_dev;
1396 int port = priv->port.index;
1397 int err;
1398
1399 err = ocelot_port_lag_join(ocelot, port, bond, info);
1400 if (err == -EOPNOTSUPP) {
1401 NL_SET_ERR_MSG_MOD(extack, "Offloading not supported");
1402 return 0;
1403 }
1404
1405 bridge_dev = netdev_master_upper_dev_get(bond);
1406 if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1407 return 0;
1408
1409 err = ocelot_netdevice_bridge_join(dev, bond, bridge_dev, extack);
1410 if (err)
1411 goto err_bridge_join;
1412
1413 return 0;
1414
1415 err_bridge_join:
1416 ocelot_port_lag_leave(ocelot, port, bond);
1417 return err;
1418 }
1419
1420 static void ocelot_netdevice_pre_lag_leave(struct net_device *dev,
1421 struct net_device *bond)
1422 {
1423 struct net_device *bridge_dev;
1424
1425 bridge_dev = netdev_master_upper_dev_get(bond);
1426 if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1427 return;
1428
1429 ocelot_netdevice_pre_bridge_leave(dev, bond);
1430 }
1431
1432 static int ocelot_netdevice_lag_leave(struct net_device *dev,
1433 struct net_device *bond)
1434 {
1435 struct ocelot_port_private *priv = netdev_priv(dev);
1436 struct ocelot_port *ocelot_port = &priv->port;
1437 struct ocelot *ocelot = ocelot_port->ocelot;
1438 struct net_device *bridge_dev;
1439 int port = priv->port.index;
1440
1441 ocelot_port_lag_leave(ocelot, port, bond);
1442
1443 bridge_dev = netdev_master_upper_dev_get(bond);
1444 if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1445 return 0;
1446
1447 return ocelot_netdevice_bridge_leave(dev, bond, bridge_dev);
1448 }
1449
1450 static int ocelot_netdevice_changeupper(struct net_device *dev,
1451 struct net_device *brport_dev,
1452 struct netdev_notifier_changeupper_info *info)
1453 {
1454 struct netlink_ext_ack *extack;
1455 int err = 0;
1456
1457 extack = netdev_notifier_info_to_extack(&info->info);
1458
1459 if (netif_is_bridge_master(info->upper_dev)) {
1460 if (info->linking)
1461 err = ocelot_netdevice_bridge_join(dev, brport_dev,
1462 info->upper_dev,
1463 extack);
1464 else
1465 err = ocelot_netdevice_bridge_leave(dev, brport_dev,
1466 info->upper_dev);
1467 }
1468 if (netif_is_lag_master(info->upper_dev)) {
1469 if (info->linking)
1470 err = ocelot_netdevice_lag_join(dev, info->upper_dev,
1471 info->upper_info, extack);
1472 else
1473 ocelot_netdevice_lag_leave(dev, info->upper_dev);
1474 }
1475
1476 return notifier_from_errno(err);
1477 }
1478
1479
1480
1481
1482
1483
1484
1485 static int
1486 ocelot_netdevice_lag_changeupper(struct net_device *dev,
1487 struct netdev_notifier_changeupper_info *info)
1488 {
1489 struct net_device *lower;
1490 struct list_head *iter;
1491 int err = NOTIFY_DONE;
1492
1493 netdev_for_each_lower_dev(dev, lower, iter) {
1494 struct ocelot_port_private *priv = netdev_priv(lower);
1495 struct ocelot_port *ocelot_port = &priv->port;
1496
1497 if (ocelot_port->bond != dev)
1498 return NOTIFY_OK;
1499
1500 err = ocelot_netdevice_changeupper(lower, dev, info);
1501 if (err)
1502 return notifier_from_errno(err);
1503 }
1504
1505 return NOTIFY_DONE;
1506 }
1507
1508 static int
1509 ocelot_netdevice_prechangeupper(struct net_device *dev,
1510 struct net_device *brport_dev,
1511 struct netdev_notifier_changeupper_info *info)
1512 {
1513 if (netif_is_bridge_master(info->upper_dev) && !info->linking)
1514 ocelot_netdevice_pre_bridge_leave(dev, brport_dev);
1515
1516 if (netif_is_lag_master(info->upper_dev) && !info->linking)
1517 ocelot_netdevice_pre_lag_leave(dev, info->upper_dev);
1518
1519 return NOTIFY_DONE;
1520 }
1521
1522 static int
1523 ocelot_netdevice_lag_prechangeupper(struct net_device *dev,
1524 struct netdev_notifier_changeupper_info *info)
1525 {
1526 struct net_device *lower;
1527 struct list_head *iter;
1528 int err = NOTIFY_DONE;
1529
1530 netdev_for_each_lower_dev(dev, lower, iter) {
1531 struct ocelot_port_private *priv = netdev_priv(lower);
1532 struct ocelot_port *ocelot_port = &priv->port;
1533
1534 if (ocelot_port->bond != dev)
1535 return NOTIFY_OK;
1536
1537 err = ocelot_netdevice_prechangeupper(dev, lower, info);
1538 if (err)
1539 return err;
1540 }
1541
1542 return NOTIFY_DONE;
1543 }
1544
1545 static int
1546 ocelot_netdevice_changelowerstate(struct net_device *dev,
1547 struct netdev_lag_lower_state_info *info)
1548 {
1549 struct ocelot_port_private *priv = netdev_priv(dev);
1550 bool is_active = info->link_up && info->tx_enabled;
1551 struct ocelot_port *ocelot_port = &priv->port;
1552 struct ocelot *ocelot = ocelot_port->ocelot;
1553 int port = priv->port.index;
1554
1555 if (!ocelot_port->bond)
1556 return NOTIFY_DONE;
1557
1558 if (ocelot_port->lag_tx_active == is_active)
1559 return NOTIFY_DONE;
1560
1561 ocelot_port_lag_change(ocelot, port, is_active);
1562
1563 return NOTIFY_OK;
1564 }
1565
1566 static int ocelot_netdevice_event(struct notifier_block *unused,
1567 unsigned long event, void *ptr)
1568 {
1569 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1570
1571 switch (event) {
1572 case NETDEV_PRECHANGEUPPER: {
1573 struct netdev_notifier_changeupper_info *info = ptr;
1574
1575 if (ocelot_netdevice_dev_check(dev))
1576 return ocelot_netdevice_prechangeupper(dev, dev, info);
1577
1578 if (netif_is_lag_master(dev))
1579 return ocelot_netdevice_lag_prechangeupper(dev, info);
1580
1581 break;
1582 }
1583 case NETDEV_CHANGEUPPER: {
1584 struct netdev_notifier_changeupper_info *info = ptr;
1585
1586 if (ocelot_netdevice_dev_check(dev))
1587 return ocelot_netdevice_changeupper(dev, dev, info);
1588
1589 if (netif_is_lag_master(dev))
1590 return ocelot_netdevice_lag_changeupper(dev, info);
1591
1592 break;
1593 }
1594 case NETDEV_CHANGELOWERSTATE: {
1595 struct netdev_notifier_changelowerstate_info *info = ptr;
1596
1597 if (!ocelot_netdevice_dev_check(dev))
1598 break;
1599
1600 return ocelot_netdevice_changelowerstate(dev,
1601 info->lower_state_info);
1602 }
1603 default:
1604 break;
1605 }
1606
1607 return NOTIFY_DONE;
1608 }
1609
1610 struct notifier_block ocelot_netdevice_nb __read_mostly = {
1611 .notifier_call = ocelot_netdevice_event,
1612 };
1613
1614 static int ocelot_switchdev_event(struct notifier_block *unused,
1615 unsigned long event, void *ptr)
1616 {
1617 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1618 int err;
1619
1620 switch (event) {
1621 case SWITCHDEV_PORT_ATTR_SET:
1622 err = switchdev_handle_port_attr_set(dev, ptr,
1623 ocelot_netdevice_dev_check,
1624 ocelot_port_attr_set);
1625 return notifier_from_errno(err);
1626 }
1627
1628 return NOTIFY_DONE;
1629 }
1630
1631 struct notifier_block ocelot_switchdev_nb __read_mostly = {
1632 .notifier_call = ocelot_switchdev_event,
1633 };
1634
1635 static int ocelot_switchdev_blocking_event(struct notifier_block *unused,
1636 unsigned long event, void *ptr)
1637 {
1638 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1639 int err;
1640
1641 switch (event) {
1642
1643 case SWITCHDEV_PORT_OBJ_ADD:
1644 err = switchdev_handle_port_obj_add(dev, ptr,
1645 ocelot_netdevice_dev_check,
1646 ocelot_port_obj_add);
1647 return notifier_from_errno(err);
1648 case SWITCHDEV_PORT_OBJ_DEL:
1649 err = switchdev_handle_port_obj_del(dev, ptr,
1650 ocelot_netdevice_dev_check,
1651 ocelot_port_obj_del);
1652 return notifier_from_errno(err);
1653 case SWITCHDEV_PORT_ATTR_SET:
1654 err = switchdev_handle_port_attr_set(dev, ptr,
1655 ocelot_netdevice_dev_check,
1656 ocelot_port_attr_set);
1657 return notifier_from_errno(err);
1658 }
1659
1660 return NOTIFY_DONE;
1661 }
1662
1663 struct notifier_block ocelot_switchdev_blocking_nb __read_mostly = {
1664 .notifier_call = ocelot_switchdev_blocking_event,
1665 };
1666
1667 static void vsc7514_phylink_mac_config(struct phylink_config *config,
1668 unsigned int link_an_mode,
1669 const struct phylink_link_state *state)
1670 {
1671 struct net_device *ndev = to_net_dev(config->dev);
1672 struct ocelot_port_private *priv = netdev_priv(ndev);
1673 struct ocelot_port *ocelot_port = &priv->port;
1674
1675
1676 ocelot_port_writel(ocelot_port, DEV_PORT_MISC_HDX_FAST_DIS,
1677 DEV_PORT_MISC);
1678
1679
1680 ocelot_port_writel(ocelot_port, PCS1G_MODE_CFG_SGMII_MODE_ENA,
1681 PCS1G_MODE_CFG);
1682 ocelot_port_writel(ocelot_port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG);
1683
1684
1685 ocelot_port_writel(ocelot_port, PCS1G_CFG_PCS_ENA, PCS1G_CFG);
1686
1687
1688 ocelot_port_writel(ocelot_port, 0, PCS1G_ANEG_CFG);
1689
1690
1691 ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG);
1692 }
1693
1694 static void vsc7514_phylink_mac_link_down(struct phylink_config *config,
1695 unsigned int link_an_mode,
1696 phy_interface_t interface)
1697 {
1698 struct net_device *ndev = to_net_dev(config->dev);
1699 struct ocelot_port_private *priv = netdev_priv(ndev);
1700 struct ocelot *ocelot = priv->port.ocelot;
1701 int port = priv->port.index;
1702
1703 ocelot_phylink_mac_link_down(ocelot, port, link_an_mode, interface,
1704 OCELOT_MAC_QUIRKS);
1705 }
1706
1707 static void vsc7514_phylink_mac_link_up(struct phylink_config *config,
1708 struct phy_device *phydev,
1709 unsigned int link_an_mode,
1710 phy_interface_t interface,
1711 int speed, int duplex,
1712 bool tx_pause, bool rx_pause)
1713 {
1714 struct net_device *ndev = to_net_dev(config->dev);
1715 struct ocelot_port_private *priv = netdev_priv(ndev);
1716 struct ocelot *ocelot = priv->port.ocelot;
1717 int port = priv->port.index;
1718
1719 ocelot_phylink_mac_link_up(ocelot, port, phydev, link_an_mode,
1720 interface, speed, duplex,
1721 tx_pause, rx_pause, OCELOT_MAC_QUIRKS);
1722 }
1723
1724 static const struct phylink_mac_ops ocelot_phylink_ops = {
1725 .validate = phylink_generic_validate,
1726 .mac_config = vsc7514_phylink_mac_config,
1727 .mac_link_down = vsc7514_phylink_mac_link_down,
1728 .mac_link_up = vsc7514_phylink_mac_link_up,
1729 };
1730
1731 static int ocelot_port_phylink_create(struct ocelot *ocelot, int port,
1732 struct device_node *portnp)
1733 {
1734 struct ocelot_port *ocelot_port = ocelot->ports[port];
1735 struct ocelot_port_private *priv;
1736 struct device *dev = ocelot->dev;
1737 phy_interface_t phy_mode;
1738 struct phylink *phylink;
1739 int err;
1740
1741 of_get_phy_mode(portnp, &phy_mode);
1742
1743
1744
1745 if (phy_mode == PHY_INTERFACE_MODE_NA)
1746 phy_mode = PHY_INTERFACE_MODE_INTERNAL;
1747
1748 if (phy_mode != PHY_INTERFACE_MODE_SGMII &&
1749 phy_mode != PHY_INTERFACE_MODE_QSGMII &&
1750 phy_mode != PHY_INTERFACE_MODE_INTERNAL) {
1751 dev_err(dev, "unsupported phy mode %s for port %d\n",
1752 phy_modes(phy_mode), port);
1753 return -EINVAL;
1754 }
1755
1756
1757 if (phy_mode == PHY_INTERFACE_MODE_QSGMII)
1758 ocelot_port_rmwl(ocelot_port, 0,
1759 DEV_CLOCK_CFG_MAC_TX_RST |
1760 DEV_CLOCK_CFG_MAC_RX_RST,
1761 DEV_CLOCK_CFG);
1762
1763 ocelot_port->phy_mode = phy_mode;
1764
1765 if (phy_mode != PHY_INTERFACE_MODE_INTERNAL) {
1766 struct phy *serdes = of_phy_get(portnp, NULL);
1767
1768 if (IS_ERR(serdes)) {
1769 err = PTR_ERR(serdes);
1770 dev_err_probe(dev, err,
1771 "missing SerDes phys for port %d\n",
1772 port);
1773 return err;
1774 }
1775
1776 err = phy_set_mode_ext(serdes, PHY_MODE_ETHERNET, phy_mode);
1777 of_phy_put(serdes);
1778 if (err) {
1779 dev_err(dev, "Could not SerDes mode on port %d: %pe\n",
1780 port, ERR_PTR(err));
1781 return err;
1782 }
1783 }
1784
1785 priv = container_of(ocelot_port, struct ocelot_port_private, port);
1786
1787 priv->phylink_config.dev = &priv->dev->dev;
1788 priv->phylink_config.type = PHYLINK_NETDEV;
1789 priv->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
1790 MAC_10 | MAC_100 | MAC_1000FD | MAC_2500FD;
1791
1792 __set_bit(ocelot_port->phy_mode,
1793 priv->phylink_config.supported_interfaces);
1794
1795 phylink = phylink_create(&priv->phylink_config,
1796 of_fwnode_handle(portnp),
1797 phy_mode, &ocelot_phylink_ops);
1798 if (IS_ERR(phylink)) {
1799 err = PTR_ERR(phylink);
1800 dev_err(dev, "Could not create phylink (%pe)\n", phylink);
1801 return err;
1802 }
1803
1804 priv->phylink = phylink;
1805
1806 err = phylink_of_phy_connect(phylink, portnp, 0);
1807 if (err) {
1808 dev_err(dev, "Could not connect to PHY: %pe\n", ERR_PTR(err));
1809 phylink_destroy(phylink);
1810 priv->phylink = NULL;
1811 return err;
1812 }
1813
1814 return 0;
1815 }
1816
1817 int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
1818 struct device_node *portnp)
1819 {
1820 struct ocelot_port_private *priv;
1821 struct ocelot_port *ocelot_port;
1822 struct net_device *dev;
1823 int err;
1824
1825 dev = alloc_etherdev(sizeof(struct ocelot_port_private));
1826 if (!dev)
1827 return -ENOMEM;
1828 SET_NETDEV_DEV(dev, ocelot->dev);
1829 priv = netdev_priv(dev);
1830 priv->dev = dev;
1831 ocelot_port = &priv->port;
1832 ocelot_port->ocelot = ocelot;
1833 ocelot_port->index = port;
1834 ocelot_port->target = target;
1835 ocelot->ports[port] = ocelot_port;
1836
1837 dev->netdev_ops = &ocelot_port_netdev_ops;
1838 dev->ethtool_ops = &ocelot_ethtool_ops;
1839 dev->max_mtu = OCELOT_JUMBO_MTU;
1840
1841 dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXFCS |
1842 NETIF_F_HW_TC;
1843 dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
1844
1845 err = of_get_ethdev_address(portnp, dev);
1846 if (err)
1847 eth_hw_addr_gen(dev, ocelot->base_mac, port);
1848
1849 ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr,
1850 OCELOT_STANDALONE_PVID, ENTRYTYPE_LOCKED);
1851
1852 ocelot_init_port(ocelot, port);
1853
1854 err = ocelot_port_phylink_create(ocelot, port, portnp);
1855 if (err)
1856 goto out;
1857
1858 if (ocelot->fdma)
1859 ocelot_fdma_netdev_init(ocelot, dev);
1860
1861 err = register_netdev(dev);
1862 if (err) {
1863 dev_err(ocelot->dev, "register_netdev failed\n");
1864 goto out_fdma_deinit;
1865 }
1866
1867 return 0;
1868
1869 out_fdma_deinit:
1870 if (ocelot->fdma)
1871 ocelot_fdma_netdev_deinit(ocelot, dev);
1872 out:
1873 ocelot->ports[port] = NULL;
1874 free_netdev(dev);
1875
1876 return err;
1877 }
1878
1879 void ocelot_release_port(struct ocelot_port *ocelot_port)
1880 {
1881 struct ocelot_port_private *priv = container_of(ocelot_port,
1882 struct ocelot_port_private,
1883 port);
1884 struct ocelot *ocelot = ocelot_port->ocelot;
1885 struct ocelot_fdma *fdma = ocelot->fdma;
1886
1887 unregister_netdev(priv->dev);
1888
1889 if (fdma)
1890 ocelot_fdma_netdev_deinit(ocelot, priv->dev);
1891
1892 if (priv->phylink) {
1893 rtnl_lock();
1894 phylink_disconnect_phy(priv->phylink);
1895 rtnl_unlock();
1896
1897 phylink_destroy(priv->phylink);
1898 }
1899
1900 free_netdev(priv->dev);
1901 }