162c1c2e6SDmitry Bogdanov /* SPDX-License-Identifier: GPL-2.0-only */ 262c1c2e6SDmitry Bogdanov /* Atlantic Network Driver 362c1c2e6SDmitry Bogdanov * Copyright (C) 2020 Marvell International Ltd. 462c1c2e6SDmitry Bogdanov */ 562c1c2e6SDmitry Bogdanov 662c1c2e6SDmitry Bogdanov #ifndef AQ_MACSEC_H 762c1c2e6SDmitry Bogdanov #define AQ_MACSEC_H 862c1c2e6SDmitry Bogdanov 962c1c2e6SDmitry Bogdanov #include <linux/netdevice.h> 1062c1c2e6SDmitry Bogdanov #if IS_ENABLED(CONFIG_MACSEC) 1162c1c2e6SDmitry Bogdanov 1262c1c2e6SDmitry Bogdanov #include "net/macsec.h" 1362c1c2e6SDmitry Bogdanov 1462c1c2e6SDmitry Bogdanov struct aq_nic_s; 1562c1c2e6SDmitry Bogdanov 1662c1c2e6SDmitry Bogdanov #define AQ_MACSEC_MAX_SC 32 1762c1c2e6SDmitry Bogdanov #define AQ_MACSEC_MAX_SA 32 1862c1c2e6SDmitry Bogdanov 1962c1c2e6SDmitry Bogdanov enum aq_macsec_sc_sa { 2062c1c2e6SDmitry Bogdanov aq_macsec_sa_sc_4sa_8sc, 2162c1c2e6SDmitry Bogdanov aq_macsec_sa_sc_not_used, 2262c1c2e6SDmitry Bogdanov aq_macsec_sa_sc_2sa_16sc, 2362c1c2e6SDmitry Bogdanov aq_macsec_sa_sc_1sa_32sc, 2462c1c2e6SDmitry Bogdanov }; 2562c1c2e6SDmitry Bogdanov 2662c1c2e6SDmitry Bogdanov struct aq_macsec_txsc { 2727736563SDmitry Bogdanov u32 hw_sc_idx; 2827736563SDmitry Bogdanov unsigned long tx_sa_idx_busy; 2927736563SDmitry Bogdanov const struct macsec_secy *sw_secy; 3027736563SDmitry Bogdanov u8 tx_sa_key[MACSEC_NUM_AN][MACSEC_KEYID_LEN]; 3162c1c2e6SDmitry Bogdanov }; 3262c1c2e6SDmitry Bogdanov 3362c1c2e6SDmitry Bogdanov struct aq_macsec_rxsc { 349ff40a75SMark Starovoytov u32 hw_sc_idx; 359ff40a75SMark Starovoytov unsigned long rx_sa_idx_busy; 369ff40a75SMark Starovoytov const struct macsec_secy *sw_secy; 379ff40a75SMark Starovoytov const struct macsec_rx_sc *sw_rxsc; 389ff40a75SMark Starovoytov u8 rx_sa_key[MACSEC_NUM_AN][MACSEC_KEYID_LEN]; 3962c1c2e6SDmitry Bogdanov }; 4062c1c2e6SDmitry Bogdanov 4162c1c2e6SDmitry Bogdanov struct aq_macsec_cfg { 4262c1c2e6SDmitry Bogdanov enum aq_macsec_sc_sa sc_sa; 4362c1c2e6SDmitry Bogdanov /* Egress channel configuration */ 4462c1c2e6SDmitry Bogdanov unsigned long txsc_idx_busy; 4562c1c2e6SDmitry Bogdanov struct aq_macsec_txsc aq_txsc[AQ_MACSEC_MAX_SC]; 4662c1c2e6SDmitry Bogdanov /* Ingress channel configuration */ 4762c1c2e6SDmitry Bogdanov unsigned long rxsc_idx_busy; 4862c1c2e6SDmitry Bogdanov struct aq_macsec_rxsc aq_rxsc[AQ_MACSEC_MAX_SC]; 4962c1c2e6SDmitry Bogdanov }; 5062c1c2e6SDmitry Bogdanov 5162c1c2e6SDmitry Bogdanov extern const struct macsec_ops aq_macsec_ops; 5262c1c2e6SDmitry Bogdanov 5362c1c2e6SDmitry Bogdanov int aq_macsec_init(struct aq_nic_s *nic); 5462c1c2e6SDmitry Bogdanov void aq_macsec_free(struct aq_nic_s *nic); 5562c1c2e6SDmitry Bogdanov int aq_macsec_enable(struct aq_nic_s *nic); 5662c1c2e6SDmitry Bogdanov void aq_macsec_work(struct aq_nic_s *nic); 5762c1c2e6SDmitry Bogdanov 5862c1c2e6SDmitry Bogdanov #endif 5962c1c2e6SDmitry Bogdanov 6062c1c2e6SDmitry Bogdanov #endif /* AQ_MACSEC_H */ 61