Skip to content

Commit dc1a003

Browse files
Radu Pirea (NXP OSS)davem330
Radu Pirea (NXP OSS)
authored andcommitted
net: phy: nxp-c45-tja11xx: implement mdo_insert_tx_tag
Implement mdo_insert_tx_tag to insert the TLV header in the ethernet frame. Signed-off-by: Radu Pirea (NXP OSS) <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 31a99fc commit dc1a003

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

drivers/net/phy/nxp-c45-tja11xx-macsec.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
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"
@@ -118,6 +119,8 @@
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
@@ -166,6 +169,11 @@
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+
169177
enum 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+
15461579
static 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

15681604
int 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

Comments
 (0)