octeontx2-pf: Add support for unicast MAC address filtering
[linux-2.6-microblaze.git] / drivers / net / ethernet / marvell / octeontx2 / nic / otx2_common.h
index d6253f2..f959688 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/timecounter.h>
 
 #include <mbox.h>
+#include <npc.h>
 #include "otx2_reg.h"
 #include "otx2_txrx.h"
 #include <rvu_trace.h>
@@ -197,6 +198,8 @@ struct otx2_hw {
        struct otx2_drv_stats   drv_stats;
        u64                     cgx_rx_stats[CGX_RX_STATS_COUNT];
        u64                     cgx_tx_stats[CGX_TX_STATS_COUNT];
+       u8                      cgx_links;  /* No. of CGX links present in HW */
+       u8                      lbk_links;  /* No. of LBK links present in HW */
 };
 
 struct otx2_vf_config {
@@ -226,6 +229,25 @@ struct otx2_ptp {
 
 #define OTX2_HW_TIMESTAMP_LEN  8
 
+struct otx2_mac_table {
+       u8 addr[ETH_ALEN];
+       u16 mcam_entry;
+       bool inuse;
+};
+
+struct otx2_flow_config {
+       u16                     entry[NPC_MAX_NONCONTIG_ENTRIES];
+       u32                     nr_flows;
+#define OTX2_MAX_NTUPLE_FLOWS  32
+#define OTX2_MAX_UNICAST_FLOWS 8
+#define OTX2_MCAM_COUNT                (OTX2_MAX_NTUPLE_FLOWS + \
+                                OTX2_MAX_UNICAST_FLOWS)
+       u32                     ntuple_offset;
+       u32                     unicast_offset;
+       u32                     ntuple_max_flows;
+       struct list_head        flow_list;
+};
+
 struct otx2_nic {
        void __iomem            *reg_base;
        struct net_device       *netdev;
@@ -236,6 +258,9 @@ struct otx2_nic {
 #define OTX2_FLAG_RX_TSTAMP_ENABLED            BIT_ULL(0)
 #define OTX2_FLAG_TX_TSTAMP_ENABLED            BIT_ULL(1)
 #define OTX2_FLAG_INTF_DOWN                    BIT_ULL(2)
+#define OTX2_FLAG_MCAM_ENTRIES_ALLOC           BIT_ULL(3)
+#define OTX2_FLAG_NTUPLE_SUPPORT               BIT_ULL(4)
+#define OTX2_FLAG_UCAST_FLTR_SUPPORT           BIT_ULL(5)
 #define OTX2_FLAG_RX_PAUSE_ENABLED             BIT_ULL(9)
 #define OTX2_FLAG_TX_PAUSE_ENABLED             BIT_ULL(10)
        u64                     flags;
@@ -264,6 +289,7 @@ struct otx2_nic {
        struct refill_work      *refill_wrk;
        struct workqueue_struct *otx2_wq;
        struct work_struct      rx_mode_work;
+       struct otx2_mac_table   *mac_table;
 
        /* Ethtool stuff */
        u32                     msg_enable;
@@ -273,6 +299,8 @@ struct otx2_nic {
 
        struct otx2_ptp         *ptp;
        struct hwtstamp_config  tstamp;
+
+       struct otx2_flow_config *flow_cfg;
 };
 
 static inline bool is_otx2_lbkvf(struct pci_dev *pdev)
@@ -642,4 +670,22 @@ int otx2_open(struct net_device *netdev);
 int otx2_stop(struct net_device *netdev);
 int otx2_set_real_num_queues(struct net_device *netdev,
                             int tx_queues, int rx_queues);
+/* MCAM filter related APIs */
+int otx2_mcam_flow_init(struct otx2_nic *pf);
+int otx2_alloc_mcam_entries(struct otx2_nic *pfvf);
+void otx2_mcam_flow_del(struct otx2_nic *pf);
+int otx2_destroy_ntuple_flows(struct otx2_nic *pf);
+int otx2_destroy_mcam_flows(struct otx2_nic *pfvf);
+int otx2_get_flow(struct otx2_nic *pfvf,
+                 struct ethtool_rxnfc *nfc, u32 location);
+int otx2_get_all_flows(struct otx2_nic *pfvf,
+                      struct ethtool_rxnfc *nfc, u32 *rule_locs);
+int otx2_add_flow(struct otx2_nic *pfvf,
+                 struct ethtool_rx_flow_spec *fsp);
+int otx2_remove_flow(struct otx2_nic *pfvf, u32 location);
+int otx2_prepare_flow_request(struct ethtool_rx_flow_spec *fsp,
+                             struct npc_install_flow_req *req);
+int otx2_del_macfilter(struct net_device *netdev, const u8 *mac);
+int otx2_add_macfilter(struct net_device *netdev, const u8 *mac);
+
 #endif /* OTX2_COMMON_H */