Lines Matching +full:sci +full:- +full:reset
1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
3 * Driver for Microsemi VSC85xx PHYs - MACsec support
11 #include <dt-bindings/net/mscc-phy-vsc8531.h>
37 /* non-MACsec access */ in vsc8584_macsec_phy_read()
185 /* Set the MACsec block out of s/w reset and enable clocks */ in vsc8584_macsec_block_init()
321 struct vsc8531_private *priv = phydev->priv; in __vsc8584_macsec_init()
358 proc_bank = (priv->addr < 2) ? PROC_0 : PROC_2; in __vsc8584_macsec_init()
373 struct vsc8531_private *priv = phydev->priv; in vsc8584_macsec_flow()
374 enum macsec_bank bank = flow->bank; in vsc8584_macsec_flow()
375 u32 val, match = 0, mask = 0, action = 0, idx = flow->index; in vsc8584_macsec_flow()
377 if (flow->match.tagged) in vsc8584_macsec_flow()
379 if (flow->match.untagged) in vsc8584_macsec_flow()
382 if (bank == MACSEC_INGR && flow->assoc_num >= 0) { in vsc8584_macsec_flow()
383 match |= MSCC_MS_SAM_MISC_MATCH_AN(flow->assoc_num); in vsc8584_macsec_flow()
387 if (bank == MACSEC_INGR && flow->match.sci && flow->rx_sa->sc->sci) { in vsc8584_macsec_flow()
388 u64 sci = (__force u64)flow->rx_sa->sc->sci; in vsc8584_macsec_flow() local
395 lower_32_bits(sci)); in vsc8584_macsec_flow()
397 upper_32_bits(sci)); in vsc8584_macsec_flow()
400 if (flow->match.etype) { in vsc8584_macsec_flow()
404 MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE((__force u32)htons(flow->etype))); in vsc8584_macsec_flow()
407 match |= MSCC_MS_SAM_MISC_MATCH_PRIORITY(flow->priority); in vsc8584_macsec_flow()
413 if (flow->action.drop) in vsc8584_macsec_flow()
415 else if (flow->action.bypass || flow->port == MSCC_MS_PORT_UNCONTROLLED) in vsc8584_macsec_flow()
423 MSCC_MS_SAM_FLOW_CTRL_DEST_PORT(flow->port); in vsc8584_macsec_flow()
429 if (priv->secy->replay_protect) in vsc8584_macsec_flow()
431 if (priv->secy->validate_frames == MACSEC_VALIDATE_STRICT) in vsc8584_macsec_flow()
433 else if (priv->secy->validate_frames == MACSEC_VALIDATE_CHECK) in vsc8584_macsec_flow()
436 if (priv->secy->protect_frames) in vsc8584_macsec_flow()
438 if (priv->secy->tx_sc.encrypt) in vsc8584_macsec_flow()
440 if (priv->secy->tx_sc.send_sci) in vsc8584_macsec_flow()
451 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_find_flow()
454 list_for_each_entry_safe(pos, tmp, &priv->macsec_flows, list) in vsc8584_macsec_find_flow()
455 if (pos->assoc_num == ctx->sa.assoc_num && pos->bank == bank) in vsc8584_macsec_find_flow()
458 return ERR_PTR(-ENOENT); in vsc8584_macsec_find_flow()
464 enum macsec_bank bank = flow->bank; in vsc8584_macsec_flow_enable()
465 u32 val, idx = flow->index; in vsc8584_macsec_flow_enable()
467 if ((flow->bank == MACSEC_INGR && flow->rx_sa && !flow->rx_sa->active) || in vsc8584_macsec_flow_enable()
468 (flow->bank == MACSEC_EGR && flow->tx_sa && !flow->tx_sa->active)) in vsc8584_macsec_flow_enable()
474 /* Set in-use */ in vsc8584_macsec_flow_enable()
483 enum macsec_bank bank = flow->bank; in vsc8584_macsec_flow_disable()
484 u32 val, idx = flow->index; in vsc8584_macsec_flow_disable()
489 /* Clear in-use */ in vsc8584_macsec_flow_disable()
497 if (flow->bank == MACSEC_INGR) in vsc8584_macsec_flow_context_id()
498 return flow->index + MSCC_MS_MAX_FLOWS; in vsc8584_macsec_flow_context_id()
500 return flow->index; in vsc8584_macsec_flow_context_id()
523 struct vsc8531_private *priv = phydev->priv; in vsc8584_macsec_transformation()
524 enum macsec_bank bank = flow->bank; in vsc8584_macsec_transformation()
525 int i, ret, index = flow->index; in vsc8584_macsec_transformation()
528 u64 sci; in vsc8584_macsec_transformation() local
530 ret = vsc8584_macsec_derive_key(key, priv->secy->key_len, hkey); in vsc8584_macsec_transformation()
534 switch (priv->secy->key_len) { in vsc8584_macsec_transformation()
542 return -EINVAL; in vsc8584_macsec_transformation()
546 (CONTROL_TYPE_EGRESS | CONTROL_AN(priv->secy->tx_sc.encoding_sa)) : in vsc8584_macsec_transformation()
563 for (i = 0; i < priv->secy->key_len / sizeof(u32); i++) in vsc8584_macsec_transformation()
577 flow->rx_sa->next_pn : flow->tx_sa->next_pn); in vsc8584_macsec_transformation()
583 priv->secy->replay_window); in vsc8584_macsec_transformation()
586 sci = (__force u64)(bank == MACSEC_INGR ? flow->rx_sa->sc->sci : priv->secy->sci); in vsc8584_macsec_transformation()
588 lower_32_bits(sci)); in vsc8584_macsec_transformation()
590 upper_32_bits(sci)); in vsc8584_macsec_transformation()
596 flow->has_transformation = true; in vsc8584_macsec_transformation()
604 &priv->ingr_flows : &priv->egr_flows; in vsc8584_macsec_alloc_flow()
611 return ERR_PTR(-ENOMEM); in vsc8584_macsec_alloc_flow()
615 return ERR_PTR(-ENOMEM); in vsc8584_macsec_alloc_flow()
618 flow->index = index; in vsc8584_macsec_alloc_flow()
619 flow->bank = bank; in vsc8584_macsec_alloc_flow()
620 flow->priority = 8; in vsc8584_macsec_alloc_flow()
621 flow->assoc_num = -1; in vsc8584_macsec_alloc_flow()
623 list_add_tail(&flow->list, &priv->macsec_flows); in vsc8584_macsec_alloc_flow()
630 unsigned long *bitmap = flow->bank == MACSEC_INGR ? in vsc8584_macsec_free_flow()
631 &priv->ingr_flows : &priv->egr_flows; in vsc8584_macsec_free_flow()
633 list_del(&flow->list); in vsc8584_macsec_free_flow()
634 clear_bit(flow->index, bitmap); in vsc8584_macsec_free_flow()
641 flow->port = MSCC_MS_PORT_CONTROLLED; in vsc8584_macsec_add_flow()
650 flow = vsc8584_macsec_alloc_flow(phydev->priv, MACSEC_INGR); in vsc8584_macsec_default_flows()
654 flow->priority = 15; in vsc8584_macsec_default_flows()
655 flow->port = MSCC_MS_PORT_UNCONTROLLED; in vsc8584_macsec_default_flows()
656 flow->match.tagged = 1; in vsc8584_macsec_default_flows()
657 flow->match.untagged = 1; in vsc8584_macsec_default_flows()
658 flow->match.etype = 1; in vsc8584_macsec_default_flows()
659 flow->etype = ETH_P_PAE; in vsc8584_macsec_default_flows()
660 flow->action.bypass = 1; in vsc8584_macsec_default_flows()
666 flow = vsc8584_macsec_alloc_flow(phydev->priv, MACSEC_EGR); in vsc8584_macsec_default_flows()
670 flow->priority = 15; in vsc8584_macsec_default_flows()
671 flow->port = MSCC_MS_PORT_COMMON; in vsc8584_macsec_default_flows()
672 flow->match.untagged = 1; in vsc8584_macsec_default_flows()
673 flow->match.etype = 1; in vsc8584_macsec_default_flows()
674 flow->etype = ETH_P_PAE; in vsc8584_macsec_default_flows()
675 flow->action.bypass = 1; in vsc8584_macsec_default_flows()
687 vsc8584_macsec_free_flow(phydev->priv, flow); in vsc8584_macsec_del_flow()
693 struct phy_device *phydev = ctx->phydev; in __vsc8584_macsec_add_rxsa()
694 struct vsc8531_private *priv = phydev->priv; in __vsc8584_macsec_add_rxsa()
697 flow->assoc_num = ctx->sa.assoc_num; in __vsc8584_macsec_add_rxsa()
698 flow->rx_sa = ctx->sa.rx_sa; in __vsc8584_macsec_add_rxsa()
701 flow->match.tagged = 1; in __vsc8584_macsec_add_rxsa()
702 flow->match.sci = 1; in __vsc8584_macsec_add_rxsa()
704 if (priv->secy->validate_frames != MACSEC_VALIDATE_DISABLED) in __vsc8584_macsec_add_rxsa()
705 flow->match.untagged = 1; in __vsc8584_macsec_add_rxsa()
712 ret = vsc8584_macsec_transformation(phydev, flow, ctx->sa.key); in __vsc8584_macsec_add_rxsa()
714 vsc8584_macsec_free_flow(phydev->priv, flow); in __vsc8584_macsec_add_rxsa()
724 flow->assoc_num = ctx->sa.assoc_num; in __vsc8584_macsec_add_txsa()
725 flow->tx_sa = ctx->sa.tx_sa; in __vsc8584_macsec_add_txsa()
728 flow->match.untagged = 1; in __vsc8584_macsec_add_txsa()
730 vsc8584_macsec_add_flow(ctx->phydev, flow); in __vsc8584_macsec_add_txsa()
735 ret = vsc8584_macsec_transformation(ctx->phydev, flow, ctx->sa.key); in __vsc8584_macsec_add_txsa()
737 vsc8584_macsec_free_flow(ctx->phydev->priv, flow); in __vsc8584_macsec_add_txsa()
744 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_dev_open()
747 list_for_each_entry_safe(flow, tmp, &priv->macsec_flows, list) in vsc8584_macsec_dev_open()
748 vsc8584_macsec_flow_enable(ctx->phydev, flow); in vsc8584_macsec_dev_open()
755 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_dev_stop()
758 list_for_each_entry_safe(flow, tmp, &priv->macsec_flows, list) in vsc8584_macsec_dev_stop()
759 vsc8584_macsec_flow_disable(ctx->phydev, flow); in vsc8584_macsec_dev_stop()
766 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_add_secy()
767 struct macsec_secy *secy = ctx->secy; in vsc8584_macsec_add_secy()
769 if (priv->secy) in vsc8584_macsec_add_secy()
770 return -EEXIST; in vsc8584_macsec_add_secy()
772 priv->secy = secy; in vsc8584_macsec_add_secy()
774 vsc8584_macsec_flow_default_action(ctx->phydev, MACSEC_EGR, in vsc8584_macsec_add_secy()
775 secy->validate_frames != MACSEC_VALIDATE_DISABLED); in vsc8584_macsec_add_secy()
776 vsc8584_macsec_flow_default_action(ctx->phydev, MACSEC_INGR, in vsc8584_macsec_add_secy()
777 secy->validate_frames != MACSEC_VALIDATE_DISABLED); in vsc8584_macsec_add_secy()
779 return vsc8584_macsec_default_flows(ctx->phydev); in vsc8584_macsec_add_secy()
784 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_del_secy()
787 list_for_each_entry_safe(flow, tmp, &priv->macsec_flows, list) in vsc8584_macsec_del_secy()
788 vsc8584_macsec_del_flow(ctx->phydev, flow); in vsc8584_macsec_del_secy()
790 vsc8584_macsec_flow_default_action(ctx->phydev, MACSEC_EGR, false); in vsc8584_macsec_del_secy()
791 vsc8584_macsec_flow_default_action(ctx->phydev, MACSEC_INGR, false); in vsc8584_macsec_del_secy()
793 priv->secy = NULL; in vsc8584_macsec_del_secy()
811 return -EOPNOTSUPP; in vsc8584_macsec_upd_rxsc()
816 struct vsc8531_private *priv = ctx->phydev->priv; in vsc8584_macsec_del_rxsc()
819 list_for_each_entry_safe(flow, tmp, &priv->macsec_flows, list) { in vsc8584_macsec_del_rxsc()
820 if (flow->bank == MACSEC_INGR && flow->rx_sa && in vsc8584_macsec_del_rxsc()
821 flow->rx_sa->sc->sci == ctx->rx_sc->sci) in vsc8584_macsec_del_rxsc()
822 vsc8584_macsec_del_flow(ctx->phydev, flow); in vsc8584_macsec_del_rxsc()
830 struct phy_device *phydev = ctx->phydev; in vsc8584_macsec_add_rxsa()
831 struct vsc8531_private *priv = phydev->priv; in vsc8584_macsec_add_rxsa()
852 if (ctx->sa.update_pn) in vsc8584_macsec_upd_rxsa()
853 return -EINVAL; in vsc8584_macsec_upd_rxsa()
860 vsc8584_macsec_flow_disable(ctx->phydev, flow); in vsc8584_macsec_upd_rxsa()
866 vsc8584_macsec_flow_enable(ctx->phydev, flow); in vsc8584_macsec_upd_rxsa()
878 vsc8584_macsec_del_flow(ctx->phydev, flow); in vsc8584_macsec_del_rxsa()
884 struct phy_device *phydev = ctx->phydev; in vsc8584_macsec_add_txsa()
885 struct vsc8531_private *priv = phydev->priv; in vsc8584_macsec_add_txsa()
906 if (ctx->sa.update_pn) in vsc8584_macsec_upd_txsa()
907 return -EINVAL; in vsc8584_macsec_upd_txsa()
914 vsc8584_macsec_flow_disable(ctx->phydev, flow); in vsc8584_macsec_upd_txsa()
920 vsc8584_macsec_flow_enable(ctx->phydev, flow); in vsc8584_macsec_upd_txsa()
932 vsc8584_macsec_del_flow(ctx->phydev, flow); in vsc8584_macsec_del_txsa()
955 struct vsc8531_private *vsc8531 = phydev->priv; in vsc8584_macsec_init()
957 switch (phydev->phy_id & phydev->drv->phy_id_mask) { in vsc8584_macsec_init()
961 INIT_LIST_HEAD(&vsc8531->macsec_flows); in vsc8584_macsec_init()
962 vsc8531->secy = NULL; in vsc8584_macsec_init()
964 phydev->macsec_ops = &vsc8584_macsec_ops; in vsc8584_macsec_init()
974 struct vsc8531_private *priv = phydev->priv; in vsc8584_handle_macsec_interrupt()
985 rec = 6 + priv->secy->key_len / sizeof(u32); in vsc8584_handle_macsec_interrupt()
986 list_for_each_entry_safe(flow, tmp, &priv->macsec_flows, list) { in vsc8584_handle_macsec_interrupt()
989 if (flow->bank != MACSEC_EGR || !flow->has_transformation) in vsc8584_handle_macsec_interrupt()
993 MSCC_MS_XFORM_REC(flow->index, rec)); in vsc8584_handle_macsec_interrupt()
996 macsec_pn_wrapped(priv->secy, flow->tx_sa); in vsc8584_handle_macsec_interrupt()