1111#include <linux/module.h>
1212#include <linux/phy.h>
1313#include <linux/processor.h>
14+ #include <net/dst_metadata.h>
1415#include <net/macsec.h>
1516
1617#include "nxp-c45-tja11xx.h"
118119#define ADPTR_CNTRL 0x0F00
119120#define ADPTR_CNTRL_CONFIG_EN BIT(14)
120121#define ADPTR_CNTRL_ADPTR_EN BIT(12)
122+ #define ADPTR_TX_TAG_CNTRL 0x0F0C
123+ #define ADPTR_TX_TAG_CNTRL_ENA BIT(31)
121124
122125#define TX_SC_FLT_BASE 0x800
123126#define TX_SC_FLT_SIZE 0x10
166169#define MACSEC_INPBTS 0x0638
167170#define MACSEC_IPSNFS 0x063C
168171
172+ #define TJA11XX_TLV_TX_NEEDED_HEADROOM (32)
173+ #define TJA11XX_TLV_NEEDED_TAILROOM (0)
174+
175+ #define ETH_P_TJA11XX_TLV (0x4e58)
176+
169177enum nxp_c45_sa_type {
170178 TX_SA ,
171179 RX_SA ,
@@ -1543,6 +1551,31 @@ static int nxp_c45_mdo_get_rx_sa_stats(struct macsec_context *ctx)
15431551 return 0 ;
15441552}
15451553
1554+ struct tja11xx_tlv_header {
1555+ struct ethhdr eth ;
1556+ u8 subtype ;
1557+ u8 len ;
1558+ u8 payload [28 ];
1559+ };
1560+
1561+ static int nxp_c45_mdo_insert_tx_tag (struct phy_device * phydev ,
1562+ struct sk_buff * skb )
1563+ {
1564+ struct tja11xx_tlv_header * tlv ;
1565+ struct ethhdr * eth ;
1566+
1567+ eth = eth_hdr (skb );
1568+ tlv = skb_push (skb , TJA11XX_TLV_TX_NEEDED_HEADROOM );
1569+ memmove (tlv , eth , sizeof (* eth ));
1570+ skb_reset_mac_header (skb );
1571+ tlv -> eth .h_proto = htons (ETH_P_TJA11XX_TLV );
1572+ tlv -> subtype = 1 ;
1573+ tlv -> len = sizeof (tlv -> payload );
1574+ memset (tlv -> payload , 0 , sizeof (tlv -> payload ));
1575+
1576+ return 0 ;
1577+ }
1578+
15461579static const struct macsec_ops nxp_c45_macsec_ops = {
15471580 .mdo_dev_open = nxp_c45_mdo_dev_open ,
15481581 .mdo_dev_stop = nxp_c45_mdo_dev_stop ,
@@ -1563,6 +1596,9 @@ static const struct macsec_ops nxp_c45_macsec_ops = {
15631596 .mdo_get_tx_sa_stats = nxp_c45_mdo_get_tx_sa_stats ,
15641597 .mdo_get_rx_sc_stats = nxp_c45_mdo_get_rx_sc_stats ,
15651598 .mdo_get_rx_sa_stats = nxp_c45_mdo_get_rx_sa_stats ,
1599+ .mdo_insert_tx_tag = nxp_c45_mdo_insert_tx_tag ,
1600+ .needed_headroom = TJA11XX_TLV_TX_NEEDED_HEADROOM ,
1601+ .needed_tailroom = TJA11XX_TLV_NEEDED_TAILROOM ,
15661602};
15671603
15681604int nxp_c45_macsec_config_init (struct phy_device * phydev )
@@ -1583,6 +1619,11 @@ int nxp_c45_macsec_config_init(struct phy_device *phydev)
15831619 if (ret )
15841620 return ret ;
15851621
1622+ ret = nxp_c45_macsec_write (phydev , ADPTR_TX_TAG_CNTRL ,
1623+ ADPTR_TX_TAG_CNTRL_ENA );
1624+ if (ret )
1625+ return ret ;
1626+
15861627 ret = nxp_c45_macsec_write (phydev , ADPTR_CNTRL , ADPTR_CNTRL_ADPTR_EN );
15871628 if (ret )
15881629 return ret ;
0 commit comments