linux/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/* Atlantic Network Driver
   3 *
   4 * Copyright (C) 2014-2019 aQuantia Corporation
   5 * Copyright (C) 2019-2020 Marvell International Ltd.
   6 */
   7
   8/* File aq_nic.h: Declaration of common code for NIC. */
   9
  10#ifndef AQ_NIC_H
  11#define AQ_NIC_H
  12
  13#include <linux/ethtool.h>
  14
  15#include "aq_common.h"
  16#include "aq_rss.h"
  17#include "aq_hw.h"
  18
  19struct aq_ring_s;
  20struct aq_hw_ops;
  21struct aq_fw_s;
  22struct aq_vec_s;
  23struct aq_macsec_cfg;
  24struct aq_ptp_s;
  25enum aq_rx_filter_type;
  26
  27enum aq_fc_mode {
  28        AQ_NIC_FC_OFF = 0,
  29        AQ_NIC_FC_TX,
  30        AQ_NIC_FC_RX,
  31        AQ_NIC_FC_FULL,
  32};
  33
  34struct aq_fc_info {
  35        enum aq_fc_mode req;
  36        enum aq_fc_mode cur;
  37};
  38
  39struct aq_nic_cfg_s {
  40        const struct aq_hw_caps_s *aq_hw_caps;
  41        u64 features;
  42        u32 rxds;               /* rx ring size, descriptors # */
  43        u32 txds;               /* tx ring size, descriptors # */
  44        u32 vecs;               /* allocated rx/tx vectors */
  45        u32 link_irq_vec;
  46        u32 irq_type;
  47        u32 itr;
  48        u16 rx_itr;
  49        u16 tx_itr;
  50        u32 rxpageorder;
  51        u32 num_rss_queues;
  52        u32 mtu;
  53        struct aq_fc_info fc;
  54        u32 link_speed_msk;
  55        u32 wol;
  56        u8 is_vlan_rx_strip;
  57        u8 is_vlan_tx_insert;
  58        bool is_vlan_force_promisc;
  59        u16 is_mc_list_enabled;
  60        u16 mc_list_count;
  61        bool is_autoneg;
  62        bool is_polling;
  63        bool is_rss;
  64        bool is_lro;
  65        bool is_qos;
  66        bool is_ptp;
  67        bool is_media_detect;
  68        int downshift_counter;
  69        enum aq_tc_mode tc_mode;
  70        u32 priv_flags;
  71        u8  tcs;
  72        u8 prio_tc_map[8];
  73        u32 tc_max_rate[AQ_CFG_TCS_MAX];
  74        unsigned long tc_min_rate_msk;
  75        u32 tc_min_rate[AQ_CFG_TCS_MAX];
  76        struct aq_rss_parameters aq_rss;
  77        u32 eee_speeds;
  78};
  79
  80#define AQ_NIC_FLAG_STARTED     0x00000004U
  81#define AQ_NIC_FLAG_STOPPING    0x00000008U
  82#define AQ_NIC_FLAG_RESETTING   0x00000010U
  83#define AQ_NIC_FLAG_CLOSING     0x00000020U
  84#define AQ_NIC_PTP_DPATH_UP     0x02000000U
  85#define AQ_NIC_LINK_DOWN        0x04000000U
  86#define AQ_NIC_FLAG_ERR_UNPLUG  0x40000000U
  87#define AQ_NIC_FLAG_ERR_HW      0x80000000U
  88
  89#define AQ_NIC_QUIRK_BAD_PTP    BIT(0)
  90
  91#define AQ_NIC_WOL_MODES        (WAKE_MAGIC |\
  92                                 WAKE_PHY)
  93
  94#define AQ_NIC_CFG_RING_PER_TC(_NIC_CFG_) \
  95        (((_NIC_CFG_)->tc_mode == AQ_TC_MODE_4TCS) ? 8 : 4)
  96
  97#define AQ_NIC_CFG_TCVEC2RING(_NIC_CFG_, _TC_, _VEC_) \
  98        ((_TC_) * AQ_NIC_CFG_RING_PER_TC(_NIC_CFG_) + (_VEC_))
  99
 100#define AQ_NIC_RING2QMAP(_NIC_, _ID_) \
 101        ((_ID_) / AQ_NIC_CFG_RING_PER_TC(&(_NIC_)->aq_nic_cfg) * \
 102                (_NIC_)->aq_vecs + \
 103        ((_ID_) % AQ_NIC_CFG_RING_PER_TC(&(_NIC_)->aq_nic_cfg)))
 104
 105struct aq_hw_rx_fl2 {
 106        struct aq_rx_filter_vlan aq_vlans[AQ_VLAN_MAX_FILTERS];
 107};
 108
 109struct aq_hw_rx_fl3l4 {
 110        u8 active_ipv4;
 111        u8 active_ipv6:2;
 112        u8 is_ipv6;
 113        u8 reserved_count;
 114};
 115
 116struct aq_hw_rx_fltrs_s {
 117        struct hlist_head     filter_list;
 118        u16                   active_filters;
 119        struct aq_hw_rx_fl2   fl2;
 120        struct aq_hw_rx_fl3l4 fl3l4;
 121        /* filter ether type */
 122        u8 fet_reserved_count;
 123};
 124
 125struct aq_nic_s {
 126        atomic_t flags;
 127        u32 msg_enable;
 128        struct aq_vec_s *aq_vec[AQ_CFG_VECS_MAX];
 129        struct aq_ring_s *aq_ring_tx[AQ_HW_QUEUES_MAX];
 130        struct aq_hw_s *aq_hw;
 131        struct net_device *ndev;
 132        unsigned int aq_vecs;
 133        unsigned int packet_filter;
 134        unsigned int power_state;
 135        u8 port;
 136        const struct aq_hw_ops *aq_hw_ops;
 137        const struct aq_fw_ops *aq_fw_ops;
 138        struct aq_nic_cfg_s aq_nic_cfg;
 139        struct timer_list service_timer;
 140        struct work_struct service_task;
 141        struct timer_list polling_timer;
 142        struct aq_hw_link_status_s link_status;
 143        struct {
 144                u32 count;
 145                u8 ar[AQ_HW_MULTICAST_ADDRESS_MAX][ETH_ALEN];
 146        } mc_list;
 147        /* Bitmask of currently assigned vlans from linux */
 148        unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
 149
 150        struct pci_dev *pdev;
 151        unsigned int msix_entry_mask;
 152        u32 irqvecs;
 153        /* mutex to serialize FW interface access operations */
 154        struct mutex fwreq_mutex;
 155#if IS_ENABLED(CONFIG_MACSEC)
 156        struct aq_macsec_cfg *macsec_cfg;
 157#endif
 158        /* PTP support */
 159        struct aq_ptp_s *aq_ptp;
 160        struct aq_hw_rx_fltrs_s aq_hw_rx_fltrs;
 161};
 162
 163static inline struct device *aq_nic_get_dev(struct aq_nic_s *self)
 164{
 165        return self->ndev->dev.parent;
 166}
 167
 168void aq_nic_ndev_init(struct aq_nic_s *self);
 169struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev);
 170void aq_nic_set_tx_ring(struct aq_nic_s *self, unsigned int idx,
 171                        struct aq_ring_s *ring);
 172struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);
 173int aq_nic_init(struct aq_nic_s *self);
 174void aq_nic_cfg_start(struct aq_nic_s *self);
 175int aq_nic_ndev_register(struct aq_nic_s *self);
 176void aq_nic_ndev_free(struct aq_nic_s *self);
 177int aq_nic_start(struct aq_nic_s *self);
 178unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
 179                            struct aq_ring_s *ring);
 180int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb);
 181int aq_nic_get_regs(struct aq_nic_s *self, struct ethtool_regs *regs, void *p);
 182int aq_nic_get_regs_count(struct aq_nic_s *self);
 183u64 *aq_nic_get_stats(struct aq_nic_s *self, u64 *data);
 184int aq_nic_stop(struct aq_nic_s *self);
 185void aq_nic_deinit(struct aq_nic_s *self, bool link_down);
 186void aq_nic_set_power(struct aq_nic_s *self);
 187void aq_nic_free_hot_resources(struct aq_nic_s *self);
 188void aq_nic_free_vectors(struct aq_nic_s *self);
 189int aq_nic_realloc_vectors(struct aq_nic_s *self);
 190int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu);
 191int aq_nic_set_mac(struct aq_nic_s *self, struct net_device *ndev);
 192int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags);
 193int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev);
 194unsigned int aq_nic_get_link_speed(struct aq_nic_s *self);
 195void aq_nic_get_link_ksettings(struct aq_nic_s *self,
 196                               struct ethtool_link_ksettings *cmd);
 197int aq_nic_set_link_ksettings(struct aq_nic_s *self,
 198                              const struct ethtool_link_ksettings *cmd);
 199struct aq_nic_cfg_s *aq_nic_get_cfg(struct aq_nic_s *self);
 200u32 aq_nic_get_fw_version(struct aq_nic_s *self);
 201int aq_nic_set_loopback(struct aq_nic_s *self);
 202int aq_nic_set_downshift(struct aq_nic_s *self, int val);
 203int aq_nic_set_media_detect(struct aq_nic_s *self, int val);
 204int aq_nic_update_interrupt_moderation_settings(struct aq_nic_s *self);
 205void aq_nic_shutdown(struct aq_nic_s *self);
 206u8 aq_nic_reserve_filter(struct aq_nic_s *self, enum aq_rx_filter_type type);
 207void aq_nic_release_filter(struct aq_nic_s *self, enum aq_rx_filter_type type,
 208                           u32 location);
 209int aq_nic_setup_tc_mqprio(struct aq_nic_s *self, u32 tcs, u8 *prio_tc_map);
 210int aq_nic_setup_tc_max_rate(struct aq_nic_s *self, const unsigned int tc,
 211                             const u32 max_rate);
 212int aq_nic_setup_tc_min_rate(struct aq_nic_s *self, const unsigned int tc,
 213                             const u32 min_rate);
 214#endif /* AQ_NIC_H */
 215