11
11
#include <linux/module.h>
12
12
#include <linux/phy.h>
13
13
#include <linux/processor.h>
14
+ #include <net/dst_metadata.h>
14
15
#include <net/macsec.h>
15
16
16
17
#include "nxp-c45-tja11xx.h"
118
119
#define ADPTR_CNTRL 0x0F00
119
120
#define ADPTR_CNTRL_CONFIG_EN BIT(14)
120
121
#define ADPTR_CNTRL_ADPTR_EN BIT(12)
122
+ #define ADPTR_TX_TAG_CNTRL 0x0F0C
123
+ #define ADPTR_TX_TAG_CNTRL_ENA BIT(31)
121
124
122
125
#define TX_SC_FLT_BASE 0x800
123
126
#define TX_SC_FLT_SIZE 0x10
166
169
#define MACSEC_INPBTS 0x0638
167
170
#define MACSEC_IPSNFS 0x063C
168
171
172
+ #define TJA11XX_TLV_TX_NEEDED_HEADROOM (32)
173
+ #define TJA11XX_TLV_NEEDED_TAILROOM (0)
174
+
175
+ #define ETH_P_TJA11XX_TLV (0x4e58)
176
+
169
177
enum nxp_c45_sa_type {
170
178
TX_SA ,
171
179
RX_SA ,
@@ -1543,6 +1551,31 @@ static int nxp_c45_mdo_get_rx_sa_stats(struct macsec_context *ctx)
1543
1551
return 0 ;
1544
1552
}
1545
1553
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
+
1546
1579
static const struct macsec_ops nxp_c45_macsec_ops = {
1547
1580
.mdo_dev_open = nxp_c45_mdo_dev_open ,
1548
1581
.mdo_dev_stop = nxp_c45_mdo_dev_stop ,
@@ -1563,6 +1596,9 @@ static const struct macsec_ops nxp_c45_macsec_ops = {
1563
1596
.mdo_get_tx_sa_stats = nxp_c45_mdo_get_tx_sa_stats ,
1564
1597
.mdo_get_rx_sc_stats = nxp_c45_mdo_get_rx_sc_stats ,
1565
1598
.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 ,
1566
1602
};
1567
1603
1568
1604
int nxp_c45_macsec_config_init (struct phy_device * phydev )
@@ -1583,6 +1619,11 @@ int nxp_c45_macsec_config_init(struct phy_device *phydev)
1583
1619
if (ret )
1584
1620
return ret ;
1585
1621
1622
+ ret = nxp_c45_macsec_write (phydev , ADPTR_TX_TAG_CNTRL ,
1623
+ ADPTR_TX_TAG_CNTRL_ENA );
1624
+ if (ret )
1625
+ return ret ;
1626
+
1586
1627
ret = nxp_c45_macsec_write (phydev , ADPTR_CNTRL , ADPTR_CNTRL_ADPTR_EN );
1587
1628
if (ret )
1588
1629
return ret ;
0 commit comments