Loading drivers/net/ethernet/aquantia/atlantic-fwd/Makefile +3 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,9 @@ atlantic-fwd-objs := atl_fw.o \ atl_ethtool.o \ atl_trace.o \ atl_compat.o \ atl_hwmon.o atl_hwmon.o \ atl_ptp.o \ atl_hw_ptp.o atlantic-fwd-$(CONFIG_ATLFWD_FWD) += atl_fwd.o atlantic-fwd-$(CONFIG_ATLFWD_FWD_NETLINK) += atl_fwdnl.o \ Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl2_fw.c +84 −3 Original line number Diff line number Diff line Loading @@ -153,10 +153,56 @@ static inline int atl2_shared_buffer_finish_ack(struct atl_hw *hw) return err; } static int atl2_fw_get_filter_caps(struct atl_hw *hw) { struct atl_nic *nic = container_of(hw, struct atl_nic, hw); struct filter_caps_s filter_caps; u32 tag_top; int err; err = atl2_shared_buffer_read_safe(hw, filter_caps, &filter_caps); if (err) return err; hw->art_base_index = filter_caps.rslv_tbl_base_index * 8; hw->art_available = filter_caps.rslv_tbl_count * 8; if (hw->art_available == 0) hw->art_available = 128; nic->rxf_flex.available = 1; nic->rxf_flex.base_index = filter_caps.flexible_filter_mask >> 1; nic->rxf_mac.base_index = filter_caps.l2_filters_base_index; nic->rxf_mac.available = filter_caps.l2_filter_count; nic->rxf_etype.base_index = filter_caps.ethertype_filter_base_index; nic->rxf_etype.available = filter_caps.ethertype_filter_count; nic->rxf_etype.tag_top = (nic->rxf_etype.available >= ATL2_RPF_ETYPE_TAGS) ? (ATL2_RPF_ETYPE_TAGS) : (ATL2_RPF_ETYPE_TAGS >> 1); nic->rxf_vlan.base_index = filter_caps.vlan_filter_base_index; /* 0 - no tag, 1 - reserved for vlan-filter-offload filters */ tag_top = (filter_caps.vlan_filter_count == ATL_VLAN_FLT_NUM) ? (ATL_VLAN_FLT_NUM - 2) : (ATL_VLAN_FLT_NUM / 2 - 2); nic->rxf_vlan.available = min_t(u32, filter_caps.vlan_filter_count - 2, tag_top); nic->rxf_ntuple.l3_v4_base_index = filter_caps.l3_ip4_filter_base_index; nic->rxf_ntuple.l3_v4_available = min_t(u32, filter_caps.l3_ip4_filter_count, ATL_NTUPLE_FLT_NUM - 1); nic->rxf_ntuple.l3_v6_base_index = filter_caps.l3_ip6_filter_base_index; nic->rxf_ntuple.l3_v6_available = filter_caps.l3_ip6_filter_count; nic->rxf_ntuple.l4_base_index = filter_caps.l4_filter_base_index; nic->rxf_ntuple.l4_available = min_t(u32, filter_caps.l4_filter_count, ATL_NTUPLE_FLT_NUM - 1); return 0; } static int __atl2_fw_wait_init(struct atl_hw *hw) { struct request_policy_s request_policy; struct link_control_s link_control; uint32_t mtu; int err; BUILD_BUG_ON_MSG(sizeof(struct link_options_s) != 0x4, "linkOptions invalid size"); Loading @@ -168,7 +214,7 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) "pauseQuanta invalid size"); BUILD_BUG_ON_MSG(sizeof(struct cable_diag_control_s) != 0x4, "cableDiagControl invalid size"); BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x6C, BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x70, "statistics_s invalid size"); Loading Loading @@ -225,9 +271,16 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) "stats invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, filter_caps) != 0x774, "filter_caps invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, management_status) != 0x78c, "management_status invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, trace) != 0x800, "trace invalid offset"); err = atl2_fw_get_filter_caps(hw); if (err) return err; atl2_shared_buffer_get(hw, link_control, link_control); link_control.mode = ATL2_HOST_MODE_ACTIVE; atl2_shared_buffer_write(hw, link_control, link_control); Loading @@ -236,6 +289,30 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) mtu = ATL_MAX_MTU + ETH_FCS_LEN + ETH_HLEN; atl2_shared_buffer_write(hw, mtu, mtu); atl2_shared_buffer_get(hw, request_policy, request_policy); request_policy.bcast.accept = 1; request_policy.bcast.queue_or_tc = 1; request_policy.bcast.rx_queue_tc_index = 0; request_policy.mcast.accept = 1; request_policy.mcast.queue_or_tc = 1; request_policy.mcast.rx_queue_tc_index = 0; request_policy.promisc.queue_or_tc = 1; request_policy.promisc.rx_queue_tc_index = 0; atl2_shared_buffer_write(hw, request_policy, request_policy); return atl2_shared_buffer_finish_ack(hw); } int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti) { struct request_policy_s request_policy; atl2_shared_buffer_get(hw, request_policy, request_policy); request_policy.promisc.all = promisc; request_policy.mcast.promisc = allmulti; atl2_shared_buffer_write(hw, request_policy, request_policy); return atl2_shared_buffer_finish_ack(hw); } Loading Loading @@ -498,9 +575,11 @@ static struct atl_link_type *atl2_fw_check_link(struct atl_hw *hw) { struct atl_link_type *link; struct atl_link_state *lstate = &hw->link_state; struct phy_health_monitor_s phy_health_monitor = {0}; struct phy_health_monitor_s phy_health_monitor; int ret = 0; memset(&phy_health_monitor, 0, sizeof(phy_health_monitor)); atl_lock_fw(hw); __atl2_fw_update_link_status(hw); Loading Loading @@ -700,10 +779,12 @@ static int atl2_fw_enable_wol(struct atl_hw *hw, unsigned int wol_mode) static int atl2_fw_update_thermal(struct atl_hw *hw) { bool enable = !!(hw->thermal.flags & atl_thermal_monitor); struct phy_health_monitor_s phy_health_monitor = {0}; struct phy_health_monitor_s phy_health_monitor; struct thermal_shutdown_s thermal_shutdown; int ret = 0; memset(&phy_health_monitor, 0, sizeof(phy_health_monitor)); atl_lock_fw(hw); atl2_shared_buffer_get(hw, thermal_shutdown, thermal_shutdown); Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl2_fw.h +71 −15 Original line number Diff line number Diff line Loading @@ -80,7 +80,6 @@ struct thermal_shutdown_s { struct mac_address_s { uint8_t mac_address[6]; uint16_t rsvd; }; struct sleep_proxy_s { Loading Loading @@ -188,7 +187,7 @@ struct sleep_proxy_s { uint32_t rr__offset; } mdns; /* WARN: where this gap actually is not known */ uint32_t reserveFWGAP:16; uint32_t reserve_fw_gap:16; }; struct ptp_s { Loading Loading @@ -472,26 +471,64 @@ struct statistics_s { uint32_t tx_good_frames; uint32_t rx_good_frames; uint32_t reserveFWGAP; uint32_t reserve_fw_gap; } msm; uint32_t main_loop_cycles; uint32_t reserve_fw_gap; }; struct filter_caps_s { uint8_t unicast_filters_count; uint8_t multicast_filters_count; uint8_t ethertype_filters_count; uint8_t vlan_filters_count; uint8_t l3_filters_count; uint8_t l4_filters_count; uint8_t l4_flex_filters_count; uint8_t flexible_filters_count; uint8_t l2_filters_base_index:6; uint8_t flexible_filter_mask:2; uint8_t l2_filter_count; uint8_t ethertype_filter_base_index; uint8_t ethertype_filter_count; uint8_t vlan_filter_base_index; uint8_t vlan_filter_count; uint8_t l3_ip4_filter_base_index:4; uint8_t l3_ip4_filter_count:4; uint8_t l3_ip6_filter_base_index:4; uint8_t l3_ip6_filter_count:4; uint8_t l4_filter_base_index:4; uint8_t l4_filter_count:4; uint8_t l4_flex_filter_base_index:4; uint8_t l4_flex_filter_count:4; uint8_t rslv_tbl_base_index; uint8_t rslv_tbl_count; }; struct request_policy_s { struct { uint8_t all:1; uint8_t rsvd:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } promisc; struct { uint8_t accept:1; uint8_t rsvd:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } bcast; struct { uint8_t accept:1; uint8_t promisc:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } mcast; uint8_t rsvd:8; }; struct fw_interface_in { uint32_t mtu; uint32_t rsvd1:32; struct mac_address_s mac_address; uint16_t rsvd; struct link_control_s link_control; uint32_t rsvd2:32; struct link_options_s link_options; Loading @@ -504,6 +541,8 @@ struct fw_interface_in { struct cable_diag_control_s cable_diag_control; uint32_t rsvd6:32; struct data_buffer_status_s data_buffer_status; uint32_t rsvd7:32; struct request_policy_s request_policy; }; struct transaction_counter_s { Loading @@ -511,6 +550,22 @@ struct transaction_counter_s { uint32_t transaction_cnt_b:16; }; struct management_status_s { struct mac_address_s mac_address; uint16_t vlan; struct{ uint32_t enable : 1; uint32_t rsvd:31; } flags; uint32_t rsvd1:32; uint32_t rsvd2:32; uint32_t rsvd3:32; uint32_t rsvd4:32; uint32_t rsvd5:32; }; struct fw_interface_out { struct transaction_counter_s transaction_id; struct version_s version; Loading @@ -536,11 +591,11 @@ struct fw_interface_out { uint32_t rsvd11:32; struct statistics_s stats; uint32_t rsvd12:32; uint32_t rsvd13:32; struct filter_caps_s filter_caps; uint32_t rsvd14:32; struct device_caps_s device_caps; uint32_t reserve[30]; uint32_t rsvd13:32; struct management_status_s management_status; uint32_t reserve[21]; struct trace_s trace; }; Loading Loading @@ -629,6 +684,7 @@ enum ATL2_WAKE_REASON { int atl2_fw_init(struct atl_hw *hw); int atl2_get_fw_version(struct atl_hw *hw, u32 *fw_version); int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti); #endif drivers/net/ethernet/aquantia/atlantic-fwd/atl_common.h +42 −5 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ #include <linux/netdevice.h> #include <linux/moduleparam.h> #define ATL_VERSION "1.1.7" #define ATL_VERSION "1.1.10" struct atl_nic; Loading @@ -34,13 +34,15 @@ struct atl_nic; #include "atl_fwd.h" struct atl_ptp; enum { ATL_RXF_VLAN_BASE = 0, ATL_RXF_VLAN_MAX = ATL_VLAN_FLT_NUM, ATL_RXF_ETYPE_BASE = ATL_RXF_VLAN_BASE + ATL_RXF_VLAN_MAX, ATL_RXF_ETYPE_MAX = ATL_ETYPE_FLT_NUM, /* + 1 is for backward compatibility */ ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX + 1, ATL2_RPF_ETYPE_TAGS = 7, ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX, ATL_RXF_NTUPLE_MAX = ATL_NTUPLE_FLT_NUM, ATL_RXF_FLEX_BASE = ATL_RXF_NTUPLE_BASE + ATL_RXF_NTUPLE_MAX, ATL_RXF_FLEX_MAX = 1, Loading Loading @@ -132,12 +134,20 @@ struct atl_rxf_ntuple { __be16 dst_port[ATL_RXF_NTUPLE_MAX]; __be16 src_port[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3v4[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3v6[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l4 l4[ATL_RXF_NTUPLE_MAX]; s8 l3_idx[ATL_RXF_NTUPLE_MAX]; bool is_ipv6[ATL_RXF_NTUPLE_MAX]; s8 l4_idx[ATL_RXF_NTUPLE_MAX]; uint32_t cmd[ATL_RXF_NTUPLE_MAX]; int count; int l3_v4_base_index; int l3_v4_available; int l3_v6_base_index; int l3_v6_available; int l4_base_index; int l4_available; }; enum atl_vlan_cmd { Loading @@ -157,6 +167,8 @@ struct atl_rxf_vlan { unsigned long map[ATL_VID_MAP_LEN]; int vlans_active; int promisc_count; int base_index; int available; }; enum atl_etype_cmd { Loading @@ -168,9 +180,24 @@ enum atl_etype_cmd { ATL_ETYPE_VAL_MASK = BIT(16) - 1, }; struct atl2_tag_policy { u16 action; u16 usage; }; struct atl_rxf_etype { uint32_t cmd[ATL_RXF_ETYPE_MAX]; int count; struct atl2_tag_policy tags_policy[ATL_RXF_ETYPE_MAX]; int tag[ATL_RXF_ETYPE_MAX]; int base_index; int available; int tag_top; }; struct atl_rxf_mac { int base_index; int available; }; enum atl_flex_cmd { Loading @@ -184,6 +211,8 @@ enum atl_flex_cmd { struct atl_rxf_flex { uint32_t cmd[ATL_RXF_FLEX_MAX]; int count; int base_index; int available; }; struct atl_queue_vec; Loading @@ -192,7 +221,11 @@ struct atl_queue_vec; #define ATL_FWD_RING_BASE ATL_MAX_QUEUES /* Use TC 1 for offload * engine rings */ #define ATL_NUM_MSI_VECS 32 #define ATL_NUM_NON_RING_IRQS 1 enum { ATL_IRQ_LINK = 0, ATL_IRQ_PTP, ATL_NUM_NON_RING_IRQS, }; #define ATL_RXF_RING_ANY 32 Loading Loading @@ -252,7 +285,11 @@ struct atl_nic { struct atl_rxf_ntuple rxf_ntuple; struct atl_rxf_vlan rxf_vlan; struct atl_rxf_etype rxf_etype; struct atl_rxf_mac rxf_mac; struct atl_rxf_flex rxf_flex; /* PTP support */ struct atl_ptp *ptp; }; /* Flags only modified with RTNL lock held */ Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl_compat.h +7 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,12 @@ #include <linux/pci.h> #include <linux/msi.h> #include <linux/skbuff.h> #include <linux/netdevice.h> #ifndef IS_REACHABLE #define IS_REACHABLE defined #endif /* If the kernel is not RHEL / CentOS, then the 2 identifiers below will be * undefined. Define them this way to simplify the checks below. Loading Loading @@ -107,7 +113,7 @@ static inline int skb_xmit_more(struct sk_buff *skb) { return 0; } #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5,2,0) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8, 2) static inline int skb_xmit_more(struct sk_buff *skb) { return netdev_xmit_more(); Loading Loading
drivers/net/ethernet/aquantia/atlantic-fwd/Makefile +3 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,9 @@ atlantic-fwd-objs := atl_fw.o \ atl_ethtool.o \ atl_trace.o \ atl_compat.o \ atl_hwmon.o atl_hwmon.o \ atl_ptp.o \ atl_hw_ptp.o atlantic-fwd-$(CONFIG_ATLFWD_FWD) += atl_fwd.o atlantic-fwd-$(CONFIG_ATLFWD_FWD_NETLINK) += atl_fwdnl.o \ Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl2_fw.c +84 −3 Original line number Diff line number Diff line Loading @@ -153,10 +153,56 @@ static inline int atl2_shared_buffer_finish_ack(struct atl_hw *hw) return err; } static int atl2_fw_get_filter_caps(struct atl_hw *hw) { struct atl_nic *nic = container_of(hw, struct atl_nic, hw); struct filter_caps_s filter_caps; u32 tag_top; int err; err = atl2_shared_buffer_read_safe(hw, filter_caps, &filter_caps); if (err) return err; hw->art_base_index = filter_caps.rslv_tbl_base_index * 8; hw->art_available = filter_caps.rslv_tbl_count * 8; if (hw->art_available == 0) hw->art_available = 128; nic->rxf_flex.available = 1; nic->rxf_flex.base_index = filter_caps.flexible_filter_mask >> 1; nic->rxf_mac.base_index = filter_caps.l2_filters_base_index; nic->rxf_mac.available = filter_caps.l2_filter_count; nic->rxf_etype.base_index = filter_caps.ethertype_filter_base_index; nic->rxf_etype.available = filter_caps.ethertype_filter_count; nic->rxf_etype.tag_top = (nic->rxf_etype.available >= ATL2_RPF_ETYPE_TAGS) ? (ATL2_RPF_ETYPE_TAGS) : (ATL2_RPF_ETYPE_TAGS >> 1); nic->rxf_vlan.base_index = filter_caps.vlan_filter_base_index; /* 0 - no tag, 1 - reserved for vlan-filter-offload filters */ tag_top = (filter_caps.vlan_filter_count == ATL_VLAN_FLT_NUM) ? (ATL_VLAN_FLT_NUM - 2) : (ATL_VLAN_FLT_NUM / 2 - 2); nic->rxf_vlan.available = min_t(u32, filter_caps.vlan_filter_count - 2, tag_top); nic->rxf_ntuple.l3_v4_base_index = filter_caps.l3_ip4_filter_base_index; nic->rxf_ntuple.l3_v4_available = min_t(u32, filter_caps.l3_ip4_filter_count, ATL_NTUPLE_FLT_NUM - 1); nic->rxf_ntuple.l3_v6_base_index = filter_caps.l3_ip6_filter_base_index; nic->rxf_ntuple.l3_v6_available = filter_caps.l3_ip6_filter_count; nic->rxf_ntuple.l4_base_index = filter_caps.l4_filter_base_index; nic->rxf_ntuple.l4_available = min_t(u32, filter_caps.l4_filter_count, ATL_NTUPLE_FLT_NUM - 1); return 0; } static int __atl2_fw_wait_init(struct atl_hw *hw) { struct request_policy_s request_policy; struct link_control_s link_control; uint32_t mtu; int err; BUILD_BUG_ON_MSG(sizeof(struct link_options_s) != 0x4, "linkOptions invalid size"); Loading @@ -168,7 +214,7 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) "pauseQuanta invalid size"); BUILD_BUG_ON_MSG(sizeof(struct cable_diag_control_s) != 0x4, "cableDiagControl invalid size"); BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x6C, BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x70, "statistics_s invalid size"); Loading Loading @@ -225,9 +271,16 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) "stats invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, filter_caps) != 0x774, "filter_caps invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, management_status) != 0x78c, "management_status invalid offset"); BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, trace) != 0x800, "trace invalid offset"); err = atl2_fw_get_filter_caps(hw); if (err) return err; atl2_shared_buffer_get(hw, link_control, link_control); link_control.mode = ATL2_HOST_MODE_ACTIVE; atl2_shared_buffer_write(hw, link_control, link_control); Loading @@ -236,6 +289,30 @@ static int __atl2_fw_wait_init(struct atl_hw *hw) mtu = ATL_MAX_MTU + ETH_FCS_LEN + ETH_HLEN; atl2_shared_buffer_write(hw, mtu, mtu); atl2_shared_buffer_get(hw, request_policy, request_policy); request_policy.bcast.accept = 1; request_policy.bcast.queue_or_tc = 1; request_policy.bcast.rx_queue_tc_index = 0; request_policy.mcast.accept = 1; request_policy.mcast.queue_or_tc = 1; request_policy.mcast.rx_queue_tc_index = 0; request_policy.promisc.queue_or_tc = 1; request_policy.promisc.rx_queue_tc_index = 0; atl2_shared_buffer_write(hw, request_policy, request_policy); return atl2_shared_buffer_finish_ack(hw); } int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti) { struct request_policy_s request_policy; atl2_shared_buffer_get(hw, request_policy, request_policy); request_policy.promisc.all = promisc; request_policy.mcast.promisc = allmulti; atl2_shared_buffer_write(hw, request_policy, request_policy); return atl2_shared_buffer_finish_ack(hw); } Loading Loading @@ -498,9 +575,11 @@ static struct atl_link_type *atl2_fw_check_link(struct atl_hw *hw) { struct atl_link_type *link; struct atl_link_state *lstate = &hw->link_state; struct phy_health_monitor_s phy_health_monitor = {0}; struct phy_health_monitor_s phy_health_monitor; int ret = 0; memset(&phy_health_monitor, 0, sizeof(phy_health_monitor)); atl_lock_fw(hw); __atl2_fw_update_link_status(hw); Loading Loading @@ -700,10 +779,12 @@ static int atl2_fw_enable_wol(struct atl_hw *hw, unsigned int wol_mode) static int atl2_fw_update_thermal(struct atl_hw *hw) { bool enable = !!(hw->thermal.flags & atl_thermal_monitor); struct phy_health_monitor_s phy_health_monitor = {0}; struct phy_health_monitor_s phy_health_monitor; struct thermal_shutdown_s thermal_shutdown; int ret = 0; memset(&phy_health_monitor, 0, sizeof(phy_health_monitor)); atl_lock_fw(hw); atl2_shared_buffer_get(hw, thermal_shutdown, thermal_shutdown); Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl2_fw.h +71 −15 Original line number Diff line number Diff line Loading @@ -80,7 +80,6 @@ struct thermal_shutdown_s { struct mac_address_s { uint8_t mac_address[6]; uint16_t rsvd; }; struct sleep_proxy_s { Loading Loading @@ -188,7 +187,7 @@ struct sleep_proxy_s { uint32_t rr__offset; } mdns; /* WARN: where this gap actually is not known */ uint32_t reserveFWGAP:16; uint32_t reserve_fw_gap:16; }; struct ptp_s { Loading Loading @@ -472,26 +471,64 @@ struct statistics_s { uint32_t tx_good_frames; uint32_t rx_good_frames; uint32_t reserveFWGAP; uint32_t reserve_fw_gap; } msm; uint32_t main_loop_cycles; uint32_t reserve_fw_gap; }; struct filter_caps_s { uint8_t unicast_filters_count; uint8_t multicast_filters_count; uint8_t ethertype_filters_count; uint8_t vlan_filters_count; uint8_t l3_filters_count; uint8_t l4_filters_count; uint8_t l4_flex_filters_count; uint8_t flexible_filters_count; uint8_t l2_filters_base_index:6; uint8_t flexible_filter_mask:2; uint8_t l2_filter_count; uint8_t ethertype_filter_base_index; uint8_t ethertype_filter_count; uint8_t vlan_filter_base_index; uint8_t vlan_filter_count; uint8_t l3_ip4_filter_base_index:4; uint8_t l3_ip4_filter_count:4; uint8_t l3_ip6_filter_base_index:4; uint8_t l3_ip6_filter_count:4; uint8_t l4_filter_base_index:4; uint8_t l4_filter_count:4; uint8_t l4_flex_filter_base_index:4; uint8_t l4_flex_filter_count:4; uint8_t rslv_tbl_base_index; uint8_t rslv_tbl_count; }; struct request_policy_s { struct { uint8_t all:1; uint8_t rsvd:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } promisc; struct { uint8_t accept:1; uint8_t rsvd:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } bcast; struct { uint8_t accept:1; uint8_t promisc:1; uint8_t rx_queue_tc_index:5; uint8_t queue_or_tc:1; } mcast; uint8_t rsvd:8; }; struct fw_interface_in { uint32_t mtu; uint32_t rsvd1:32; struct mac_address_s mac_address; uint16_t rsvd; struct link_control_s link_control; uint32_t rsvd2:32; struct link_options_s link_options; Loading @@ -504,6 +541,8 @@ struct fw_interface_in { struct cable_diag_control_s cable_diag_control; uint32_t rsvd6:32; struct data_buffer_status_s data_buffer_status; uint32_t rsvd7:32; struct request_policy_s request_policy; }; struct transaction_counter_s { Loading @@ -511,6 +550,22 @@ struct transaction_counter_s { uint32_t transaction_cnt_b:16; }; struct management_status_s { struct mac_address_s mac_address; uint16_t vlan; struct{ uint32_t enable : 1; uint32_t rsvd:31; } flags; uint32_t rsvd1:32; uint32_t rsvd2:32; uint32_t rsvd3:32; uint32_t rsvd4:32; uint32_t rsvd5:32; }; struct fw_interface_out { struct transaction_counter_s transaction_id; struct version_s version; Loading @@ -536,11 +591,11 @@ struct fw_interface_out { uint32_t rsvd11:32; struct statistics_s stats; uint32_t rsvd12:32; uint32_t rsvd13:32; struct filter_caps_s filter_caps; uint32_t rsvd14:32; struct device_caps_s device_caps; uint32_t reserve[30]; uint32_t rsvd13:32; struct management_status_s management_status; uint32_t reserve[21]; struct trace_s trace; }; Loading Loading @@ -629,6 +684,7 @@ enum ATL2_WAKE_REASON { int atl2_fw_init(struct atl_hw *hw); int atl2_get_fw_version(struct atl_hw *hw, u32 *fw_version); int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti); #endif
drivers/net/ethernet/aquantia/atlantic-fwd/atl_common.h +42 −5 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ #include <linux/netdevice.h> #include <linux/moduleparam.h> #define ATL_VERSION "1.1.7" #define ATL_VERSION "1.1.10" struct atl_nic; Loading @@ -34,13 +34,15 @@ struct atl_nic; #include "atl_fwd.h" struct atl_ptp; enum { ATL_RXF_VLAN_BASE = 0, ATL_RXF_VLAN_MAX = ATL_VLAN_FLT_NUM, ATL_RXF_ETYPE_BASE = ATL_RXF_VLAN_BASE + ATL_RXF_VLAN_MAX, ATL_RXF_ETYPE_MAX = ATL_ETYPE_FLT_NUM, /* + 1 is for backward compatibility */ ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX + 1, ATL2_RPF_ETYPE_TAGS = 7, ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX, ATL_RXF_NTUPLE_MAX = ATL_NTUPLE_FLT_NUM, ATL_RXF_FLEX_BASE = ATL_RXF_NTUPLE_BASE + ATL_RXF_NTUPLE_MAX, ATL_RXF_FLEX_MAX = 1, Loading Loading @@ -132,12 +134,20 @@ struct atl_rxf_ntuple { __be16 dst_port[ATL_RXF_NTUPLE_MAX]; __be16 src_port[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3v4[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l3 l3v6[ATL_RXF_NTUPLE_MAX]; struct atl2_rxf_l4 l4[ATL_RXF_NTUPLE_MAX]; s8 l3_idx[ATL_RXF_NTUPLE_MAX]; bool is_ipv6[ATL_RXF_NTUPLE_MAX]; s8 l4_idx[ATL_RXF_NTUPLE_MAX]; uint32_t cmd[ATL_RXF_NTUPLE_MAX]; int count; int l3_v4_base_index; int l3_v4_available; int l3_v6_base_index; int l3_v6_available; int l4_base_index; int l4_available; }; enum atl_vlan_cmd { Loading @@ -157,6 +167,8 @@ struct atl_rxf_vlan { unsigned long map[ATL_VID_MAP_LEN]; int vlans_active; int promisc_count; int base_index; int available; }; enum atl_etype_cmd { Loading @@ -168,9 +180,24 @@ enum atl_etype_cmd { ATL_ETYPE_VAL_MASK = BIT(16) - 1, }; struct atl2_tag_policy { u16 action; u16 usage; }; struct atl_rxf_etype { uint32_t cmd[ATL_RXF_ETYPE_MAX]; int count; struct atl2_tag_policy tags_policy[ATL_RXF_ETYPE_MAX]; int tag[ATL_RXF_ETYPE_MAX]; int base_index; int available; int tag_top; }; struct atl_rxf_mac { int base_index; int available; }; enum atl_flex_cmd { Loading @@ -184,6 +211,8 @@ enum atl_flex_cmd { struct atl_rxf_flex { uint32_t cmd[ATL_RXF_FLEX_MAX]; int count; int base_index; int available; }; struct atl_queue_vec; Loading @@ -192,7 +221,11 @@ struct atl_queue_vec; #define ATL_FWD_RING_BASE ATL_MAX_QUEUES /* Use TC 1 for offload * engine rings */ #define ATL_NUM_MSI_VECS 32 #define ATL_NUM_NON_RING_IRQS 1 enum { ATL_IRQ_LINK = 0, ATL_IRQ_PTP, ATL_NUM_NON_RING_IRQS, }; #define ATL_RXF_RING_ANY 32 Loading Loading @@ -252,7 +285,11 @@ struct atl_nic { struct atl_rxf_ntuple rxf_ntuple; struct atl_rxf_vlan rxf_vlan; struct atl_rxf_etype rxf_etype; struct atl_rxf_mac rxf_mac; struct atl_rxf_flex rxf_flex; /* PTP support */ struct atl_ptp *ptp; }; /* Flags only modified with RTNL lock held */ Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl_compat.h +7 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,12 @@ #include <linux/pci.h> #include <linux/msi.h> #include <linux/skbuff.h> #include <linux/netdevice.h> #ifndef IS_REACHABLE #define IS_REACHABLE defined #endif /* If the kernel is not RHEL / CentOS, then the 2 identifiers below will be * undefined. Define them this way to simplify the checks below. Loading Loading @@ -107,7 +113,7 @@ static inline int skb_xmit_more(struct sk_buff *skb) { return 0; } #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5,2,0) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8, 2) static inline int skb_xmit_more(struct sk_buff *skb) { return netdev_xmit_more(); Loading