NIC feature enhancement
This commit is contained in:
parent
4ac8494e39
commit
3f570dd146
287
kernel.spec
287
kernel.spec
@ -32,7 +32,7 @@
|
||||
|
||||
Name: kernel
|
||||
Version: 4.19.90
|
||||
Release: %{hulkrelease}.0244
|
||||
Release: %{hulkrelease}.0245
|
||||
Summary: Linux Kernel
|
||||
License: GPLv2
|
||||
URL: http://www.kernel.org/
|
||||
@ -850,6 +850,291 @@ fi
|
||||
|
||||
%changelog
|
||||
|
||||
* Fri Nov 17 2023 Luo Shengwei <luoshengwei@huawei.com> - 4.19.90-2311.3.0.0245
|
||||
- net: hns3: Fix unreasonable modifications caused by rollback extension ringparam parameters
|
||||
- net: hns3: Fix ethtool_ Ops&gen_ Improper modification of kabi changes caused by adding members in the ops structure
|
||||
- net: hns3: Fix Kabi issue caused by ptp introducing gettimex64()
|
||||
- Fallback ethtool about nla_ Modification of kabi changes caused by the addition of new associations in the policy structure
|
||||
- net: hns3: Fallback Ethtool's modifications to extack
|
||||
- net: hns3: Fallback ethtool's modification of lane
|
||||
- net: hns3: HNAE3 framework add support for ROH client
|
||||
- net: hns3: add ROH MAC type definitions and support query MAC type
|
||||
- net: hns3: Add configuration of TM QCN error event
|
||||
- net: hns3: fix return value check bug of rx copybreak
|
||||
- net: hns3: add netdev reset check for hns3_set_tunable()
|
||||
- ethtool: mark netlink family as __ro_after_init
|
||||
- net: hns3: add max order judgement for tx spare buffer
|
||||
- net: hns3: fix ethtool tx copybreak buf size indicating not aligned issue
|
||||
- net: hns3: fix deadlock issue when externel_lb and reset are executed together
|
||||
- ethtool: Fix uninitialized number of lanes
|
||||
- ethtool: reset lanes when lanes is omitted
|
||||
- ethtool: limit bitset size
|
||||
- ethtool: fix application of verbose no_mask bitset
|
||||
- net: hns3: fix for not calculating TX BD send size correctly
|
||||
- NIC: hns3: fix kabi
|
||||
- ptp: deprecate gettime64() in favor of gettimex64()
|
||||
- net: hns3: add support for Hisilicon ptp sync device
|
||||
- net: hns3: sync linux kernel hns3 wol to openeuler
|
||||
- net: hns3: fix pointer cast to different type for wol
|
||||
- net: hns3: fix the HCLGE_OPC_WOL_CFG opcode id for wol
|
||||
- net: hns3: fix getting supported parameter from driver in hclge_set_wol
|
||||
- net: hns3: add supports pfc storm detection and suppression
|
||||
- net: hns3: debugfs add dump dscp map info
|
||||
- net: hns3: support debugfs for wake on lan
|
||||
- net: hns3: add debugfs support for interrupt coalesce
|
||||
- net: hns3: delete the hclge_cmd.c and hclgevf_cmd.c
|
||||
- net: hns3: refactor VF cmdq init and uninit APIs with new common APIs
|
||||
- net: hns3: refactor PF cmdq init and uninit APIs with new common APIs
|
||||
- net: hns3: create common cmdq init and uninit APIs
|
||||
- net: hns3: refactor VF cmdq resource APIs with new common APIs
|
||||
- net: hns3: refactor PF cmdq resource APIs with new common APIs
|
||||
- net: hns3: create common cmdq resource allocate/free/query APIs
|
||||
- net: hns3: refactor hclgevf_cmd_send with new hclge_comm_cmd_send API
|
||||
- net: hns3: refactor hclge_cmd_send with new hclge_comm_cmd_send API
|
||||
- net: hns3: fix setting wrong tx_timeout value issue
|
||||
- net: hns3: refactor hclge_mac_link_status_wait for interface reuse
|
||||
- net: hns3: add wait until mac link down
|
||||
- net: hns3: fix set cpu affinity when state down
|
||||
- net: hns3: restore user pause configure when disable autoneg
|
||||
- net: hns3: add tm flush when setting tm
|
||||
- net: hns3: fix the imp capability bit cannot exceed 32 bits issue
|
||||
- net: hns3: fix GRE checksum offload issue
|
||||
- net: hns3: fix strncpy() not using dest-buf length as length issue
|
||||
- net: hns3: add support config dscp map to tc
|
||||
- net: hns3: refactor hclge_update_desc_vfid for extension
|
||||
- net:ethtool Fix the Kabi problem is caused by the new FEC callback function in ethtool_ops
|
||||
- net:hns3 The kabi issue is resolved when the lane members are added to the ethtool_link_ksettings structure
|
||||
- net: hns3: add querying fec statistics
|
||||
- ethtool: add FEC statistics
|
||||
- ethtool: fec_prepare_data() - jump to error handling
|
||||
- ethtool: support FEC settings over netlink
|
||||
- ethtool: netlink bitset handling
|
||||
- net: hns3: avoid mult + div op in critical data path
|
||||
- net: hns3: add support to query and set lane number by ethtool
|
||||
- ethtool: Extend link modes settings uAPI with lanes
|
||||
- net: hns3: Resolved the kabi change issue caused by new members in the devlink structure
|
||||
- The kabi issue is resolved when the rx_buf_len extension ring is used to set parameters or obtain APIs
|
||||
- net: hns3: Fix for the compilation problem of hclge_comm_cmd
|
||||
- net: hns3: remove always exist devlink pointer check
|
||||
- net: hns3: add support for registering devlink for VF
|
||||
- net: hns3: add support for registering devlink for PF
|
||||
- net: hns3: fix output information incomplete for dumping tx queue info with debugfs
|
||||
- net: hns3: fix reset timeout when enable full VF
|
||||
- net: hns3: modify reset delay time to avoid configuration timeout
|
||||
- net: hns3: add support for getting GE port lanes
|
||||
- net: hns3: Use the correct style for SPDX License Identifier
|
||||
- net: hns3: support set/get VxLAN rule of rx flow director by ethtool
|
||||
- net: hns3: refactor for function hclge_fd_convert_tuple
|
||||
- net: hns3: PF supports to set and query lane_num by sysfs
|
||||
- net: ethtool: add VxLAN to the NFC API
|
||||
- net: hns3: add extend interface support for read and write phy register
|
||||
- net: hns3: add support set led
|
||||
- net: hns3: add support set mac state
|
||||
- net: hns3: add support detect port wire type
|
||||
- net: hns3: add support PF provides customized interfaces to detect port faults.
|
||||
- net: hns3: add support disable nic clock
|
||||
- net: hns3: add support config and query serdes lane status
|
||||
- net: hns3: add supports configure optical module enable
|
||||
- net: hns3: add support query the presence of optical module
|
||||
- net: hns3: disbable pfc en before the reset
|
||||
- net: hns3: support set pfc pause trans time
|
||||
- net: hns3: add support query port ext information
|
||||
- net: hns3: add support to get/set 1d torus param
|
||||
- net: hns3: add supports fast reporting of faulty nodes
|
||||
- net: hns3: add support configuring function-level interrupt affinity
|
||||
- net: hns3: add support clear mac statistics
|
||||
- net: hns3: add support customized exception handling interfaces.
|
||||
- net: hns3: fix miss L3E checking for rx packet
|
||||
- net: hns3: support wake on lan configuration and query
|
||||
- net: hns3: refactor the debugfs for dumping FD tcam
|
||||
- net: hns3: allocate fd counter for queue bonding
|
||||
- net: hns3: add queue bonding mode support for VF
|
||||
- net: hns3: add support for queue bonding mode of flow director
|
||||
- net: hns3: refine the handling for VF heartbeat
|
||||
- net: hns3: fix setting incorrect phy link ksettings for firmware in resetting process
|
||||
- net: hns3: add support for external loopback test
|
||||
- net: hns3: net: hns3: add querying and setting fec off mode from firmware
|
||||
- net: hns3: add querying and setting fec llrs mode from firmware
|
||||
- net: hns3: add querying fec ability from firmware
|
||||
- net: hns3: fix software vlan talbe of vlan 0 inconsistent with hardware
|
||||
- net: hns3: handle empty unknown interrupt for VF
|
||||
- net: hns3: add support for TX push mode
|
||||
- net: hns3: create new set of unified hclge_comm_cmd_send APIs
|
||||
- net: hns3: use struct hclge_desc to replace hclgevf_desc in VF cmdq module
|
||||
- net: hns3: create new cmdq hardware description structure hclge_comm_hw
|
||||
- net: hns3: fix incorrect components info of ethtool --reset command
|
||||
- net: hns3: add dql info when tx timeout
|
||||
- net: hns3: debugfs add drop packet statistics of multicast and broadcast for igu
|
||||
- net: hns3: remove the way to set tx spare buf via module parameter
|
||||
- net: hns3: add support to set/get rx buf len via ethtool for hns3 driver
|
||||
- ethtool: add support to set/get rx buf len via ethtool
|
||||
- net: hns3: add support to set/get tx copybreak buf size via ethtool for hns3 driver
|
||||
- ethtool: add support to set/get tx copybreak buf size via ethtool
|
||||
- ethtool: set device ring sizes with RINGS_SET request
|
||||
- ethtool: provide ring sizes with RINGS_GET request
|
||||
- ethtool: helper functions for netlink interface
|
||||
- ethtool: introduce ethtool netlink interface
|
||||
- ethtool: provide link mode names as a string set
|
||||
- ethtool: move string arrays into common file
|
||||
- ethtool: move to its own directory
|
||||
- net: hns3: allow configure ETS bandwidth of all TCs
|
||||
- net: hns3: fix some mac statistics is always 0 in device version V2
|
||||
- net: hns3: sync rx ring head in echo common pull
|
||||
- net: hns3: fix ROCE base interrupt vector initialization bug
|
||||
- net: hns3: add support for pf querying new interrupt resources
|
||||
- net: hisilicon: fix hsn3_ethtool kernel-doc warnings
|
||||
- net: hns3: adjust string spaces of some parameters of tx bd info in debugfs
|
||||
- net: hns3: add more string spaces for dumping packets number of queue info in debugfs
|
||||
- net: hns3: fix data endian problem of some functions of debugfs
|
||||
- net: hns3: add error recovery module and type for himac
|
||||
- net: hns3: add new ras error type for roce
|
||||
- net: hns3: add update ethtool advertised link modes for FIBRE port when autoneg off
|
||||
- net: hns3: modify functions of converting speed ability to ethtool link mode
|
||||
- net: hns3: add support pause/pfc durations for mac statistics
|
||||
- net: hns3: device specifications add number of mac statistics
|
||||
- net: hns3: modify mac statistics update process for compatibility
|
||||
- net: hns3: schedule the polling again when allocation fails
|
||||
- net: hns3: fix for miscalculation of rx unused desc
|
||||
- net: hns3: PF enable promisc for VF when mac table is overflow
|
||||
- net: hns3: don't rollback when destroy mqprio fail
|
||||
- net: hns3: fix hclge_dbg_dump_tm_pg() stack usage
|
||||
- xdp: Fixed an issue where the trace_mem_disconnect function cannot find the definition.
|
||||
- net: hns3: fix the max tx size according to user manual
|
||||
- net: hns3: disable sriov before unload hclge layer
|
||||
- net: hns3: add limit ets dwrr bandwidth cannot be 0
|
||||
- net: hns3: fix always enable rx vlan filter problem after selftest
|
||||
- net: hns3: fix show wrong state when add existing uc mac address
|
||||
- net: hns3: do not allow call hns3_nic_net_open repeatedly
|
||||
- net: hns3: optimize the rx page reuse handling process
|
||||
- net: hns3: fix misuse vf id and vport id in some logs
|
||||
- net: hns3: make hclgevf_cmd_caps_bit_map0 and hclge_cmd_caps_bit_map0 static
|
||||
- net: hns3: remove unnecessary spaces
|
||||
- net: hns3: add some required spaces
|
||||
- net: hns3: clean up a type mismatch warning
|
||||
- net: hns3: refine function hns3_set_default_feature()
|
||||
- net: hns3: uniform parameter name of hclge_ptp_clean_tx_hwts()
|
||||
- net: hnss3: use max() to simplify code
|
||||
- net: hns3: refine function hclge_dbg_dump_tm_pri()
|
||||
- net: hns3: reconstruct function hclge_ets_validate()
|
||||
- net: hns3: reconstruct function hns3_self_test
|
||||
- net: hns3: initialize each member of structure array on a separate line
|
||||
- net: hns3: add required space in comment
|
||||
- net: hns3: remove unnecessary "static" of local variables in function
|
||||
- net: hns3: don't config TM DWRR twice when set ETS
|
||||
- net: hns3: add new function hclge_get_speed_bit()
|
||||
- net: hns3: refactor function hclgevf_parse_capability()
|
||||
- net: hns3: refactor function hclge_parse_capability()
|
||||
- net: hns3: uniform type of function parameter cmd
|
||||
- net: hns3: merge some repetitive macros
|
||||
- net: hns3: package new functions to simplify hclgevf_mbx_handler code
|
||||
- net: hns3: remove redundant param to simplify code
|
||||
- net: hns3: use memcpy to simplify code
|
||||
- net: hns3: add hns3_state_init() to do state initialization
|
||||
- net: hns3: add macros for mac speeds of firmware command
|
||||
- net: hns3: fix GRO configuration error after reset
|
||||
- net: hns3: fix speed unknown issue in bond 4
|
||||
- net: hns3: add support ethtool extended link state
|
||||
- net: hns3: add header file hns3_ethtoo.h
|
||||
- ethtool: add two link extended substates of bad signal integrity
|
||||
- docs: ethtool: Add two link extended substates of bad signal integrity
|
||||
- net: hns3: add support for triggering reset by ethtool
|
||||
- net: hns3: change the method of obtaining default ptp cycle
|
||||
- net: hns3: fix rx VLAN offload state inconsistent issue
|
||||
- net: hns3: add support for FD counter in debugfs
|
||||
- net: hns3: Fix a memory leak in an error handling path in 'hclge_handle_error_info_log()'
|
||||
- net: hns3: fix different snprintf() limit
|
||||
- net: hns3: use bounce buffer when rx page can not be reused
|
||||
- net: hns3: support dma_map_sg() for multi frags skb
|
||||
- net: hns3: add support to query tx spare buffer size for pf
|
||||
- net: hns3: use tx bounce buffer for small packets
|
||||
- net: hns3: add priv flags support to switch limit promisc mode
|
||||
- net: hns3: refactor for hns3_fill_desc() function
|
||||
- net: hns3: minor refactor related to desc_cb handling
|
||||
- net: hns3: fix a double shift bug
|
||||
- net: hns3: add support for PTP
|
||||
- net: hns3: refactor dev capability and dev spec of debugfs
|
||||
- net: hns3: use list_move_tail instead of list_del/list_add_tail in hclgevf_main.c
|
||||
- net: hns3: add error handling compatibility during initialization
|
||||
- net: hns3: update error recovery module and type
|
||||
- net: hns3: add support for imp-handle ras capability
|
||||
- net: hns3: add the RAS compatibility adaptation solution
|
||||
- net: hns3: add support for handling all errors through MSI-X
|
||||
- net: hns3: remove now redundant logic related to HNAE3_UNKNOWN_RESET
|
||||
- net: hns3: add log for workqueue scheduled late
|
||||
- net: hns3: add scheduling logic for error handling task
|
||||
- net: hns3: add a separate error handling task
|
||||
- net: hns3: use HCLGE_VPORT_STATE_PROMISC_CHANGE to replace HCLGE_STATE_PROMISC_CHANGED
|
||||
- net: hns3: fix user's coalesce configuration lost issue
|
||||
- net: hns3: add support for configuring interrupt quantity limiting
|
||||
- net: hns3: clear unnecessary reset request in hclge_reset_rebuild
|
||||
- net: hns3: cleanup inappropriate spaces in struct hlcgevf_tqp_stats
|
||||
- net: hns3: Trivial spell fix in hns3 driver
|
||||
- net: hns3: split out hclge_tm_vport_tc_info_update()
|
||||
- net: hns3: split function hclge_reset_rebuild()
|
||||
- net: hns3: remove redundant query in hclge_config_tm_hw_err_int()
|
||||
- net: hns3: remove redundant blank lines
|
||||
- net: hns3: remove unused code of vmdq
|
||||
- net: hns3: add support to query device specifications
|
||||
- net: hns3: add phy loopback support for imp-controlled PHYs
|
||||
- net: hns3: add ioctl support for imp-controlled PHYs
|
||||
- net: hns3: add get/set pause parameters support for imp-controlled PHYs
|
||||
- net: hns3: add support for imp-controlled PHYs
|
||||
- net:hns3 Fix KABI for The dev_version & caps element is added to the hnae3_ae_dev structure.
|
||||
- net:hns3 Fix KABI for deletion of hnae3_unic_private_info in hnae3_handle
|
||||
- net:hns3 Fix KABI for ethtools->supported_coalesce_params
|
||||
- net: hns3: split out hclgevf_cmd_send()
|
||||
- net: hns3: split out hclge_cmd_send()
|
||||
- net: hns3: refactor out hclgevf_get_rss_tuple()
|
||||
- net: hns3: refactor out hclge_get_rss_tuple()
|
||||
- net: hns3: refactor out hclge_set_vf_vlan_common()
|
||||
- net: hns3: use ipv6_addr_any() helper
|
||||
- net: hns3: refactor out hclgevf_cmd_convert_err_code()
|
||||
- net: hns3: refactor out hclge_cmd_convert_err_code()
|
||||
- net: hns3: remove unused macro definition
|
||||
- net: hns3: change hclge_query_bd_num() param type
|
||||
- net: hns3: change hclge_parse_speed() param type
|
||||
- net: hns3: clean up unnecessary parentheses in macro definitions
|
||||
- net: hns3: remove the shaper param magic number
|
||||
- net: hns3: add a structure for IR shaper's parameter in hclge_shaper_para_calc()
|
||||
- net: hns3: add support for TX hardware checksum offload
|
||||
- net: hns3: initialize the message content in hclge_get_link_mode()
|
||||
- net: hns3: add UDP segmentation offload support
|
||||
- net: hns3: use capabilities queried from firmware
|
||||
- net: hns3: add support to query device capability
|
||||
- net: hns3: add device version to replace pci revision
|
||||
- net: hns3: remove some unused macros
|
||||
- net: hns3: remove some unused codes in hns3_nic_set_features()
|
||||
- net: hns3: fix two coding style issues in hclgevf_main.c
|
||||
- net: hns3: remove two unused macros in hclgevf_cmd.c
|
||||
- net: hns3: remove an unused macro hclge_is_csq
|
||||
- net: hns3: fix a print format issue in hclge_mac_mdio_config()
|
||||
- net: hns3: remove some unused fields in struct hclge_dev
|
||||
- net: hns3: remove two duplicated register macros in hclgevf_main.h
|
||||
- net: hns3: remove unused struct hnae3_unic_private_info
|
||||
- net: hns3: remove some unused fields in struct hns3_nic_priv
|
||||
- net: hns3: modify an incorrect type in struct hclgevf_cfg_gro_status_cmd
|
||||
- net: hns3: modify an incorrect type in struct hclge_cfg_gro_status_cmd
|
||||
- net: hns3: refactor hclge_query_bd_num_cmd_send()
|
||||
- net: hns3: refactor hclge_config_tso()
|
||||
- net: hns3: remove a duplicated printing in hclge_configure()
|
||||
- net: hns3: modify two uncorrect macro names
|
||||
- net: hns3: remove a redundant register macro definition
|
||||
- net/hns: Remove custom driver version in favour of global one
|
||||
- net: hns3: clear port base VLAN when unload PF
|
||||
- net: hns3: reject unsupported coalescing params
|
||||
- net: hns3: modify an unsuitable log in hclge_map_ring_to_vector()
|
||||
- net: hns3: remove unused macros
|
||||
- net: hns3: adjust hns3_uninit_phy()'s location in the hns3_client_uninit()
|
||||
- net: hns3: fix compile warning without CONFIG_RFS_ACCEL
|
||||
- net: hns3: Use LLDP ethertype define ETH_P_LLDP
|
||||
- net: hns3: return 0 and print warning when hit duplicate MAC
|
||||
- net: hns3: make function hclge_set_all_vf_rst() static
|
||||
- net: phy: Move linkmode helpers to somewhere public
|
||||
- net: hns3: Add unlikely for buf_num check
|
||||
- net: hns3: Add default irq affinity
|
||||
- net: hns3: Only update mac configuation when necessary
|
||||
- net: hns3: Fix for loopback selftest failed problem
|
||||
|
||||
* Wed Nov 15 2023 Luo Shengwei <luoshengwei@huawei.com> - 4.19.90-2311.3.0.0244
|
||||
- !2803 drivers/gmjstcm: fix a dev_err() call in spi tcm device probe
|
||||
- !2841 drm/qxl: fix UAF on handle creation
|
||||
|
||||
@ -0,0 +1,54 @@
|
||||
From 06d65b6bd4d2fe5a1c020dda207b70d4211caf50 Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Mon, 3 Sep 2018 11:21:50 +0100
|
||||
Subject: [PATCH 001/283] net: hns3: Fix for loopback selftest failed problem
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v4.20-rc1
|
||||
commit 0f29fc23b21d3cbd966537bfabba07c00466b787
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0f29fc23b21d3cbd966537bfabba07c00466b787
|
||||
|
||||
--------------------------------
|
||||
|
||||
Tqp and mac need to be enabled when doing loopback selftest,
|
||||
ae_algo->ops->start/stop is used to do the job, there is a
|
||||
time window between ae_algo->ops->start/stop and loopback setup,
|
||||
which will cause selftest failed problem when there is frame
|
||||
coming in during that time window.
|
||||
|
||||
This patch fixes it by enabling the tqp and mac during loopback
|
||||
setup process.
|
||||
|
||||
Fixes: c39c4d98dc65 ("net: hns3: Add mac loopback selftest support in hns3 driver")
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index be771c75e37e..d18e8141f7e4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -125,7 +125,7 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
|
||||
ret = hns3_lp_setup(ndev, loop_mode, true);
|
||||
usleep_range(HNS3_NIC_LB_SETUP_USEC, HNS3_NIC_LB_SETUP_USEC * 2);
|
||||
|
||||
- return ret;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
From 3cd7ff62b371e10e7f66cee74c75e69708a98c63 Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Mon, 3 Sep 2018 11:21:53 +0100
|
||||
Subject: [PATCH 002/283] net: hns3: Only update mac configuation when
|
||||
necessary
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v4.20-rc1
|
||||
commit 2d03eacc0b7e7aeedce6032f79872f3fd3d1a94f
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2d03eacc0b7e7aeedce6032f79872f3fd3d1a94f
|
||||
|
||||
--------------------------------
|
||||
|
||||
Currently only fiber port checks if it is necessay to set the
|
||||
mac through firmware when link is changed, this patch unify the
|
||||
checking to allow the copper port do the checking too.
|
||||
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index b4b1e440fba4..9f9edbdc518a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -2424,7 +2424,7 @@ static u8 hclge_check_speed_dup(u8 duplex, int speed)
|
||||
return duplex;
|
||||
}
|
||||
|
||||
-static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
|
||||
+int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
|
||||
u8 duplex)
|
||||
{
|
||||
struct hclge_config_mac_speed_dup_cmd *req;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
57
patches/0364-net-hns3-Add-default-irq-affinity.patch
Normal file
57
patches/0364-net-hns3-Add-default-irq-affinity.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From a5bb8b792691fabf9bb61ae5328eb47d7d5da7fb Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Wed, 19 Sep 2018 18:29:47 +0100
|
||||
Subject: [PATCH 003/283] net: hns3: Add default irq affinity
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v4.20-rc1
|
||||
commit 874bff0ba6cf884dde0220bfa8945f164e6da1d1
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=874bff0ba6cf884dde0220bfa8945f164e6da1d1
|
||||
|
||||
--------------------------------
|
||||
|
||||
All irq will float to cpu0 if do not set irq affinity.
|
||||
This patch adds default irq affinity in hns3 driver, users can
|
||||
also change the irq affinity in OS.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 20703ce86281..1495e972dc89 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -100,6 +100,10 @@ static irqreturn_t hns3_irq_handle(int irq, void *vector)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
+/* This callback function is used to set affinity changes to the irq affinity
|
||||
+ * masks when the irq_set_affinity_notifier function is used.
|
||||
+ */
|
||||
+
|
||||
static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv)
|
||||
{
|
||||
struct hns3_enet_tqp_vector *tqp_vectors;
|
||||
@@ -3673,6 +3677,8 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
|
||||
|
||||
hns3_nic_set_cpumask(priv);
|
||||
|
||||
+ hns3_nic_set_cpumask(priv);
|
||||
+
|
||||
for (i = 0; i < priv->vector_num; i++) {
|
||||
tqp_vector = &priv->tqp_vector[i];
|
||||
hns3_vector_gl_rl_init_hw(tqp_vector, priv);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
73
patches/0365-net-hns3-Add-unlikely-for-buf_num-check.patch
Normal file
73
patches/0365-net-hns3-Add-unlikely-for-buf_num-check.patch
Normal file
@ -0,0 +1,73 @@
|
||||
From 1c09e1a8da3599ede304788c1af8cb8345d3b634 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Wed, 19 Sep 2018 18:29:48 +0100
|
||||
Subject: [PATCH 004/283] net: hns3: Add unlikely for buf_num check
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v4.20-rc1
|
||||
commit 932d1252aded755bfd6f53183ab6211f711c6435
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=932d1252aded755bfd6f53183ab6211f711c6435
|
||||
|
||||
--------------------------------
|
||||
|
||||
This patch adds unlikely for buf_num check.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 8 ++------
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 7 +++++++
|
||||
2 files changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 1495e972dc89..b184c3e83e05 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -1282,16 +1282,12 @@ static int hns3_skb_linearize(struct hns3_enet_ring *ring, struct sk_buff *skb,
|
||||
*/
|
||||
if (skb->len > HNS3_MAX_TSO_SIZE ||
|
||||
(!skb_is_gso(skb) && skb->len > HNS3_MAX_NON_TSO_SIZE)) {
|
||||
- u64_stats_update_begin(&ring->syncp);
|
||||
- ring->stats.hw_limitation++;
|
||||
- u64_stats_update_end(&ring->syncp);
|
||||
+ hns3_ring_stats_update(ring, hw_limitation);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (__skb_linearize(skb)) {
|
||||
- u64_stats_update_begin(&ring->syncp);
|
||||
- ring->stats.sw_err_cnt++;
|
||||
- u64_stats_update_end(&ring->syncp);
|
||||
+ hns3_ring_stats_update(ring, sw_err_cnt);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index ef4463ae26cf..19f83dfb32aa 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -604,6 +604,13 @@ static inline bool hns3_nic_resetting(struct net_device *netdev)
|
||||
|
||||
#define hns3_buf_size(_ring) ((_ring)->buf_size)
|
||||
|
||||
+#define hns3_ring_stats_update(ring, cnt) do { \
|
||||
+ typeof(ring) (tmp) = (ring); \
|
||||
+ u64_stats_update_begin(&(tmp)->syncp); \
|
||||
+ ((tmp)->stats.cnt)++; \
|
||||
+ u64_stats_update_end(&(tmp)->syncp); \
|
||||
+} while (0) \
|
||||
+
|
||||
static inline unsigned int hns3_page_order(struct hns3_enet_ring *ring)
|
||||
{
|
||||
#if (PAGE_SIZE < 8192)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,201 @@
|
||||
From d6164056687c7cd8ab664995c7a386c257a6b5a3 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Lunn <andrew@lunn.ch>
|
||||
Date: Sat, 29 Sep 2018 23:04:09 +0200
|
||||
Subject: [PATCH 005/283] net: phy: Move linkmode helpers to somewhere public
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v4.20-rc1
|
||||
commit b31cdffa2329fe330cd304ca26c250dd1520fb0a
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b31cdffa2329fe330cd304ca26c250dd1520fb0a
|
||||
|
||||
--------------------------------
|
||||
|
||||
phylink has some useful helpers to working with linkmode bitmaps.
|
||||
Move them to there own header so other code can use them.
|
||||
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/kcompat.h | 20 ------
|
||||
drivers/net/phy/phylink.c | 27 --------
|
||||
include/linux/linkmode.h | 67 +++++++++++++++++++
|
||||
include/linux/mii.h | 1 +
|
||||
include/linux/phy.h | 1 +
|
||||
5 files changed, 69 insertions(+), 47 deletions(-)
|
||||
create mode 100644 include/linux/linkmode.h
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/kcompat.h b/drivers/net/ethernet/hisilicon/hns3/kcompat.h
|
||||
index 5cf3a35ca607..8b5de09fa7f7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/kcompat.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/kcompat.h
|
||||
@@ -383,26 +383,6 @@ static inline __must_check size_t array3_size(size_t a, size_t b, size_t c)
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
|
||||
-static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
|
||||
-{
|
||||
- __set_bit(nr, addr);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
|
||||
-{
|
||||
- bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
|
||||
-{
|
||||
- __clear_bit(nr, addr);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_zero(unsigned long *dst)
|
||||
-{
|
||||
- bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
#else
|
||||
|
||||
#define HAS_LINK_MODE_OPS
|
||||
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
|
||||
index 723611ac9102..227d5a1ef963 100644
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -72,33 +72,6 @@ struct phylink {
|
||||
struct sfp_bus *sfp_bus;
|
||||
};
|
||||
|
||||
-static inline void linkmode_zero(unsigned long *dst)
|
||||
-{
|
||||
- bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
|
||||
-{
|
||||
- bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
|
||||
- const unsigned long *b)
|
||||
-{
|
||||
- bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
-static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
|
||||
- const unsigned long *b)
|
||||
-{
|
||||
- bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
-static inline bool linkmode_empty(const unsigned long *src)
|
||||
-{
|
||||
- return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* phylink_set_port_modes() - set the port type modes in the ethtool mask
|
||||
* @mask: ethtool link mode mask
|
||||
diff --git a/include/linux/linkmode.h b/include/linux/linkmode.h
|
||||
new file mode 100644
|
||||
index 000000000000..014fb86c7114
|
||||
--- /dev/null
|
||||
+++ b/include/linux/linkmode.h
|
||||
@@ -0,0 +1,67 @@
|
||||
+#ifndef __LINKMODE_H
|
||||
+#define __LINKMODE_H
|
||||
+
|
||||
+#include <linux/bitmap.h>
|
||||
+#include <linux/ethtool.h>
|
||||
+#include <uapi/linux/ethtool.h>
|
||||
+
|
||||
+static inline void linkmode_zero(unsigned long *dst)
|
||||
+{
|
||||
+ bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_copy(unsigned long *dst, const unsigned long *src)
|
||||
+{
|
||||
+ bitmap_copy(dst, src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_and(unsigned long *dst, const unsigned long *a,
|
||||
+ const unsigned long *b)
|
||||
+{
|
||||
+ bitmap_and(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_or(unsigned long *dst, const unsigned long *a,
|
||||
+ const unsigned long *b)
|
||||
+{
|
||||
+ bitmap_or(dst, a, b, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline bool linkmode_empty(const unsigned long *src)
|
||||
+{
|
||||
+ return bitmap_empty(src, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline int linkmode_andnot(unsigned long *dst, const unsigned long *src1,
|
||||
+ const unsigned long *src2)
|
||||
+{
|
||||
+ return bitmap_andnot(dst, src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
|
||||
+{
|
||||
+ __set_bit(nr, addr);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
|
||||
+{
|
||||
+ __clear_bit(nr, addr);
|
||||
+}
|
||||
+
|
||||
+static inline void linkmode_change_bit(int nr, volatile unsigned long *addr)
|
||||
+{
|
||||
+ __change_bit(nr, addr);
|
||||
+}
|
||||
+
|
||||
+static inline int linkmode_test_bit(int nr, volatile unsigned long *addr)
|
||||
+{
|
||||
+ return test_bit(nr, addr);
|
||||
+}
|
||||
+
|
||||
+static inline int linkmode_equal(const unsigned long *src1,
|
||||
+ const unsigned long *src2)
|
||||
+{
|
||||
+ return bitmap_equal(src1, src2, __ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
+}
|
||||
+
|
||||
+#endif /* __LINKMODE_H */
|
||||
diff --git a/include/linux/mii.h b/include/linux/mii.h
|
||||
index 55000ee5c6ad..567047ef0309 100644
|
||||
--- a/include/linux/mii.h
|
||||
+++ b/include/linux/mii.h
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
|
||||
#include <linux/if.h>
|
||||
+#include <linux/linkmode.h>
|
||||
#include <uapi/linux/mii.h>
|
||||
|
||||
struct ethtool_cmd;
|
||||
diff --git a/include/linux/phy.h b/include/linux/phy.h
|
||||
index cd6f637cbbfb..81532a61e995 100644
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ethtool.h>
|
||||
+#include <linux/linkmode.h>
|
||||
#include <linux/mdio.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/module.h>
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,45 @@
|
||||
From 9207408757116d3192c5a1e9e630e1419c81a85c Mon Sep 17 00:00:00 2001
|
||||
From: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Date: Sat, 16 Feb 2019 08:15:52 +0000
|
||||
Subject: [PATCH 006/283] net: hns3: make function hclge_set_all_vf_rst()
|
||||
static
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit e511f17b1fb40248e63677a6ab81a29b9b32080d
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e511f17b1fb40248e63677a6ab81a29b9b32080d
|
||||
|
||||
--------------------------------
|
||||
|
||||
Fixes the following sparse warning:
|
||||
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c:2431:5: warning:
|
||||
symbol 'hclge_set_all_vf_rst' was not declared. Should it be static?
|
||||
|
||||
Fixes: aa5c4f175be6 ("net: hns3: add reset handling for VF when doing PF reset")
|
||||
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 9f9edbdc518a..118e5097b384 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3361,7 +3361,7 @@ static int hclge_set_vf_rst(struct hclge_dev *hdev, int func_id, bool reset)
|
||||
return hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
}
|
||||
|
||||
-int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
|
||||
+static int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
|
||||
{
|
||||
int i;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,84 @@
|
||||
From 1bd2f0085ef31d7db11f198e41d08f20295b9f01 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Thu, 4 Apr 2019 16:17:51 +0800
|
||||
Subject: [PATCH 007/283] net: hns3: return 0 and print warning when hit
|
||||
duplicate MAC
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.2-rc1
|
||||
commit 72110b567479f0282489a9b3747e76d8c67d75f5
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=72110b567479f0282489a9b3747e76d8c67d75f5
|
||||
|
||||
--------------------------------
|
||||
|
||||
When set 2 same MAC to different function of one port, IMP
|
||||
will return error as the later one may modify the origin one.
|
||||
This will cause bond fail for 2 VFs of one port.
|
||||
|
||||
Driver just print warning and return 0 with this patch, so
|
||||
if set same MAC address, it will return 0 but do not really
|
||||
configure HW.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 10 +++++++++-
|
||||
drivers/scsi/smartpqi/smartpqi_init.c | 6 +++---
|
||||
2 files changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 118e5097b384..3c68cbf19d48 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -7565,7 +7565,7 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_mac_vlan_tbl_entry_cmd req;
|
||||
u16 egress_port = 0;
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
|
||||
/* mac addr check */
|
||||
if (is_zero_ether_addr(addr) ||
|
||||
@@ -7604,6 +7604,14 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
|
||||
dev_err(&hdev->pdev->dev, "UC MAC table full(%u)\n",
|
||||
hdev->priv_umv_size);
|
||||
|
||||
+ /* check if we just hit the duplicate */
|
||||
+ if (!ret)
|
||||
+ return -EEXIST;
|
||||
+
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "PF failed to add unicast entry(%pM) in the MAC table\n",
|
||||
+ addr);
|
||||
+
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
index d9df5627cfb6..ed046c586724 100644
|
||||
--- a/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
@@ -3374,9 +3374,9 @@ static int pqi_alloc_admin_queues(struct pqi_ctrl_info *ctrl_info)
|
||||
|
||||
ctrl_info->admin_queue_memory_base =
|
||||
dma_zalloc_coherent(&ctrl_info->pci_dev->dev,
|
||||
- alloc_length,
|
||||
- &ctrl_info->admin_queue_memory_base_dma_handle,
|
||||
- GFP_KERNEL);
|
||||
+ alloc_length,
|
||||
+ &ctrl_info->admin_queue_memory_base_dma_handle,
|
||||
+ GFP_KERNEL);
|
||||
|
||||
if (!ctrl_info->admin_queue_memory_base)
|
||||
return -ENOMEM;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
From b95d33965a3e12cf307ea8d33cfef022a110b711 Mon Sep 17 00:00:00 2001
|
||||
From: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
|
||||
Date: Thu, 11 Apr 2019 09:11:36 -0700
|
||||
Subject: [PATCH 008/283] net: hns3: Use LLDP ethertype define ETH_P_LLDP
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.3-rc1
|
||||
commit 7efffc64435e51a5fc21baee5988769538aabc63
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7efffc64435e51a5fc21baee5988769538aabc63
|
||||
|
||||
--------------------------------
|
||||
|
||||
Remove references to HCLGE_MAC_ETHERTYPE_LLDP and use ETH_P_LLDP instead.
|
||||
|
||||
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
|
||||
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
|
||||
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 1 -
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
include/uapi/linux/if_ether.h | 1 +
|
||||
3 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 9c49d2760ab5..c57f0ccf624f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -727,7 +727,6 @@ struct hclge_umv_spc_alc_cmd {
|
||||
#define HCLGE_MAC_MGR_MASK_VLAN_B BIT(0)
|
||||
#define HCLGE_MAC_MGR_MASK_MAC_B BIT(1)
|
||||
#define HCLGE_MAC_MGR_MASK_ETHERTYPE_B BIT(2)
|
||||
-#define HCLGE_MAC_ETHERTYPE_LLDP 0x88cc
|
||||
|
||||
struct hclge_mac_mgr_tbl_entry_cmd {
|
||||
u8 flags;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 3c68cbf19d48..e34611e70699 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -323,8 +323,8 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
|
||||
static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = {
|
||||
{
|
||||
.flags = HCLGE_MAC_MGR_MASK_VLAN_B,
|
||||
- .ethter_type = cpu_to_le16(HCLGE_MAC_ETHERTYPE_LLDP),
|
||||
.mac_addr = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e},
|
||||
+ .ethter_type = cpu_to_le16(ETH_P_LLDP),
|
||||
.i_port_bitmap = 0x1,
|
||||
},
|
||||
};
|
||||
diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h
|
||||
index 3a45b4ad71a3..0e706a76418c 100644
|
||||
--- a/include/uapi/linux/if_ether.h
|
||||
+++ b/include/uapi/linux/if_ether.h
|
||||
@@ -91,6 +91,7 @@
|
||||
#define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */
|
||||
#define ETH_P_PREAUTH 0x88C7 /* 802.11 Preauthentication */
|
||||
#define ETH_P_TIPC 0x88CA /* TIPC */
|
||||
+#define ETH_P_LLDP 0x88CC /* Link Layer Discovery Protocol */
|
||||
#define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */
|
||||
#define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */
|
||||
#define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From eb53e8ee1acddb28605ba4b2c718ca350f4233df Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Tue, 28 May 2019 17:02:51 +0800
|
||||
Subject: [PATCH 009/283] net: hns3: fix compile warning without
|
||||
CONFIG_RFS_ACCEL
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.3-rc1
|
||||
commit 4c1522765ca84e45d147557bf7f19e85e40c81e0
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4c1522765ca84e45d147557bf7f19e85e40c81e0
|
||||
|
||||
--------------------------------
|
||||
|
||||
The ifdef condition of function hclge_add_fd_entry_by_arfs() is
|
||||
unnecessary. It may cause compile warning when CONFIG_RFS_ACCEL
|
||||
is not chosen. This patch fixes it by removing the ifdef condition.
|
||||
|
||||
Fixes: d93ed94fbeaf ("net: hns3: add aRFS support for PF")
|
||||
Reported-by: kbuild test robot <lkp@intel.com>
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index e34611e70699..35a08f8b97ed 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -6401,7 +6401,6 @@ static void hclge_fd_build_arfs_rule(const struct hclge_fd_rule_tuples *tuples,
|
||||
static int hclge_add_fd_entry_by_arfs(struct hnae3_handle *handle, u16 queue_id,
|
||||
u16 flow_id, struct flow_keys *fkeys)
|
||||
{
|
||||
-#ifdef CONFIG_RFS_ACCEL
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_fd_rule_tuples new_tuples;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
@@ -6473,7 +6472,6 @@ static int hclge_add_fd_entry_by_arfs(struct hnae3_handle *handle, u16 queue_id,
|
||||
}
|
||||
|
||||
return rule->location;
|
||||
-#endif
|
||||
}
|
||||
|
||||
static void hclge_rfs_filter_expire(struct hclge_dev *hdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
From f0fe0a6e0c0030488aacf862fdabbbc93f95e9a5 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Tue, 28 May 2019 17:03:01 +0800
|
||||
Subject: [PATCH 010/283] net: hns3: adjust hns3_uninit_phy()'s location in the
|
||||
hns3_client_uninit()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.3-rc1
|
||||
commit 0d2f68c7bcf4c7bbdd6f810f7b6e658f43d4461e
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0d2f68c7bcf4c7bbdd6f810f7b6e658f43d4461e
|
||||
|
||||
--------------------------------
|
||||
|
||||
hns3_uninit_phy() should be called before checking
|
||||
HNS3_NIC_STATE_INITED flags, otherwise when this checking fails,
|
||||
there is nobody to call hns3_uninit_phy().
|
||||
|
||||
Fixes: c8a8045b2d0a ("net: hns3: Fix NULL deref when unloading driver")
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 14 +-------------
|
||||
1 file changed, 1 insertion(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index b184c3e83e05..6c474df3e5c4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -4111,14 +4111,6 @@ static void hns3_uninit_phy(struct net_device *netdev)
|
||||
h->ae_algo->ops->mac_disconnect_phy(h);
|
||||
}
|
||||
|
||||
-static void hns3_del_all_fd_rules(struct net_device *netdev, bool clear_list)
|
||||
-{
|
||||
- struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
-
|
||||
- if (h->ae_algo->ops->del_all_fd_entries)
|
||||
- h->ae_algo->ops->del_all_fd_entries(h, clear_list);
|
||||
-}
|
||||
-
|
||||
static int hns3_client_start(struct hnae3_handle *handle)
|
||||
{
|
||||
if (!handle->ae_algo->ops->client_start)
|
||||
@@ -4299,7 +4291,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
|
||||
{
|
||||
struct net_device *netdev = handle->kinfo.netdev;
|
||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
- int ret;
|
||||
|
||||
if (netdev->reg_state != NETREG_UNINITIALIZED)
|
||||
unregister_netdev(netdev);
|
||||
@@ -4317,7 +4308,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
|
||||
|
||||
hns3_nic_uninit_irq(priv);
|
||||
|
||||
- hns3_del_all_fd_rules(netdev, true);
|
||||
|
||||
hns3_clear_all_ring(handle, true);
|
||||
|
||||
@@ -4325,9 +4315,7 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
|
||||
|
||||
hns3_nic_dealloc_vector_data(priv);
|
||||
|
||||
- ret = hns3_uninit_all_ring(priv);
|
||||
- if (ret)
|
||||
- netdev_err(netdev, "uninit ring error\n");
|
||||
+ hns3_uninit_all_ring(priv);
|
||||
|
||||
hns3_put_ring_config(priv);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
42
patches/0372-net-hns3-remove-unused-macros.patch
Normal file
42
patches/0372-net-hns3-remove-unused-macros.patch
Normal file
@ -0,0 +1,42 @@
|
||||
From 6e95de54372965e1b91ff655a93c91ac2e94de29 Mon Sep 17 00:00:00 2001
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
Date: Sun, 3 Nov 2019 13:15:38 +0000
|
||||
Subject: [PATCH 011/283] net: hns3: remove unused macros
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.5-rc1
|
||||
commit a5ec65169c6000bb525b45cb5615dd98356dbf73
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a5ec65169c6000bb525b45cb5615dd98356dbf73
|
||||
|
||||
--------------------------------
|
||||
|
||||
The macros HCLGE_MPF_ENBALE and HCLGEVF_MPF_ENBALE are defined but never
|
||||
used. I was going to fix the spelling mistake "ENBALE" -> "ENABLE" but
|
||||
found these macros are not used, so they can be removed.
|
||||
|
||||
Signed-off-by: Colin Ian King <colin.king@canonical.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 2a84772783ef..7c1bbe626b17 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -235,8 +235,6 @@ enum hclge_evt_cause {
|
||||
HCLGE_VECTOR0_EVENT_OTHER,
|
||||
};
|
||||
|
||||
-#define HCLGE_MPF_ENBALE 1
|
||||
-
|
||||
enum HCLGE_MAC_SPEED {
|
||||
HCLGE_MAC_SPEED_UNKNOWN = 0, /* unknown */
|
||||
HCLGE_MAC_SPEED_10M = 10, /* 10 Mbps */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 74a9e760c255fdfc577b7d5020b88d91628ce178 Mon Sep 17 00:00:00 2001
|
||||
From: Yonglong Liu <liuyonglong@huawei.com>
|
||||
Date: Sat, 4 Jan 2020 10:49:27 +0800
|
||||
Subject: [PATCH 012/283] net: hns3: modify an unsuitable log in
|
||||
hclge_map_ring_to_vector()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.6-rc1
|
||||
commit 7ab2b53e4657ee0289878b09f9748a35b0e6010b
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7ab2b53e4657ee0289878b09f9748a35b0e6010b
|
||||
|
||||
--------------------------------
|
||||
|
||||
When the returned vector_id less than 0, the message should print
|
||||
out the vector who is getting vector index fail.
|
||||
|
||||
So this patch replaces vector_id with vector, and re-format the
|
||||
message.
|
||||
|
||||
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 35a08f8b97ed..7b60829d8bba 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -4791,7 +4791,7 @@ static int hclge_map_ring_to_vector(struct hnae3_handle *handle, int vector,
|
||||
vector_id = hclge_get_vector_index(hdev, vector);
|
||||
if (vector_id < 0) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "Get vector index fail. vector_id =%d\n", vector_id);
|
||||
+ "failed to get vector index. vector=%d\n", vector);
|
||||
return vector_id;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
138
patches/0374-net-hns3-reject-unsupported-coalescing-params.patch
Normal file
138
patches/0374-net-hns3-reject-unsupported-coalescing-params.patch
Normal file
@ -0,0 +1,138 @@
|
||||
From 9c0ab6c6b497b9f9c37c1f9ab3da570122d47151 Mon Sep 17 00:00:00 2001
|
||||
From: Jakub Kicinski <kuba@kernel.org>
|
||||
Date: Wed, 11 Mar 2020 15:32:53 -0700
|
||||
Subject: [PATCH 013/283] net: hns3: reject unsupported coalescing params
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.7-rc1
|
||||
commit 7b8fda64b29d433712575c99eb97545899667d06
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7b8fda64b29d433712575c99eb97545899667d06
|
||||
|
||||
--------------------------------
|
||||
|
||||
Set ethtool_ops->supported_coalesce_params to let
|
||||
the core reject unsupported coalescing parameters.
|
||||
|
||||
This driver did not previously reject unsupported parameters.
|
||||
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 7 +++
|
||||
include/linux/ethtool.h | 44 +++++++++++++++++--
|
||||
2 files changed, 48 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index d18e8141f7e4..cfd35b5f14b7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -1483,7 +1483,13 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
||||
return ops->get_module_eeprom(handle, ee->offset, ee->len, data);
|
||||
}
|
||||
|
||||
+#define HNS3_ETHTOOL_COALESCE (ETHTOOL_COALESCE_USECS | \
|
||||
+ ETHTOOL_COALESCE_USE_ADAPTIVE | \
|
||||
+ ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
+ ETHTOOL_COALESCE_TX_USECS_HIGH)
|
||||
+
|
||||
static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
+ .supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
||||
.get_drvinfo = hns3_get_drvinfo,
|
||||
.get_ringparam = hns3_get_ringparam,
|
||||
.set_ringparam = hns3_set_ringparam,
|
||||
@@ -1509,6 +1515,7 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
};
|
||||
|
||||
static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
+ .supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
||||
.self_test = hns3_self_test,
|
||||
.get_drvinfo = hns3_get_drvinfo,
|
||||
.get_link = hns3_get_link,
|
||||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
|
||||
index 3e398b8ac212..217f56d2462c 100644
|
||||
--- a/include/linux/ethtool.h
|
||||
+++ b/include/linux/ethtool.h
|
||||
@@ -182,8 +182,43 @@ void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
|
||||
bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
const unsigned long *src);
|
||||
|
||||
+#define ETHTOOL_COALESCE_RX_USECS BIT(0)
|
||||
+#define ETHTOOL_COALESCE_RX_MAX_FRAMES BIT(1)
|
||||
+#define ETHTOOL_COALESCE_RX_USECS_IRQ BIT(2)
|
||||
+#define ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ BIT(3)
|
||||
+#define ETHTOOL_COALESCE_TX_USECS BIT(4)
|
||||
+#define ETHTOOL_COALESCE_TX_MAX_FRAMES BIT(5)
|
||||
+#define ETHTOOL_COALESCE_TX_USECS_IRQ BIT(6)
|
||||
+#define ETHTOOL_COALESCE_TX_MAX_FRAMES_IRQ BIT(7)
|
||||
+#define ETHTOOL_COALESCE_STATS_BLOCK_USECS BIT(8)
|
||||
+#define ETHTOOL_COALESCE_USE_ADAPTIVE_RX BIT(9)
|
||||
+#define ETHTOOL_COALESCE_USE_ADAPTIVE_TX BIT(10)
|
||||
+#define ETHTOOL_COALESCE_PKT_RATE_LOW BIT(11)
|
||||
+#define ETHTOOL_COALESCE_RX_USECS_LOW BIT(12)
|
||||
+#define ETHTOOL_COALESCE_RX_MAX_FRAMES_LOW BIT(13)
|
||||
+#define ETHTOOL_COALESCE_TX_USECS_LOW BIT(14)
|
||||
+#define ETHTOOL_COALESCE_TX_MAX_FRAMES_LOW BIT(15)
|
||||
+#define ETHTOOL_COALESCE_PKT_RATE_HIGH BIT(16)
|
||||
+#define ETHTOOL_COALESCE_RX_USECS_HIGH BIT(17)
|
||||
+#define ETHTOOL_COALESCE_RX_MAX_FRAMES_HIGH BIT(18)
|
||||
+#define ETHTOOL_COALESCE_TX_USECS_HIGH BIT(19)
|
||||
+#define ETHTOOL_COALESCE_TX_MAX_FRAMES_HIGH BIT(20)
|
||||
+#define ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL BIT(21)
|
||||
+
|
||||
+#define ETHTOOL_COALESCE_USECS \
|
||||
+ (ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_TX_USECS)
|
||||
+#define ETHTOOL_COALESCE_MAX_FRAMES \
|
||||
+ (ETHTOOL_COALESCE_RX_MAX_FRAMES | ETHTOOL_COALESCE_TX_MAX_FRAMES)
|
||||
+#define ETHTOOL_COALESCE_USECS_IRQ \
|
||||
+ (ETHTOOL_COALESCE_RX_USECS_IRQ | ETHTOOL_COALESCE_TX_USECS_IRQ)
|
||||
+#define ETHTOOL_COALESCE_MAX_FRAMES_IRQ \
|
||||
+ (ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ | \
|
||||
+ ETHTOOL_COALESCE_TX_MAX_FRAMES_IRQ)
|
||||
+#define ETHTOOL_COALESCE_USE_ADAPTIVE \
|
||||
+ (ETHTOOL_COALESCE_USE_ADAPTIVE_RX | ETHTOOL_COALESCE_USE_ADAPTIVE_TX)
|
||||
/**
|
||||
* struct ethtool_ops - optional netdev operations
|
||||
+ * @supported_coalesce_params: supported types of interrupt coalescing.
|
||||
* @get_settings: DEPRECATED, use %get_link_ksettings/%set_link_ksettings
|
||||
* API. Get various device settings including Ethernet link
|
||||
* settings. The @cmd parameter is expected to have been cleared
|
||||
@@ -220,8 +255,9 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* or zero.
|
||||
* @get_coalesce: Get interrupt coalescing parameters. Returns a negative
|
||||
* error code or zero.
|
||||
- * @set_coalesce: Set interrupt coalescing parameters. Returns a negative
|
||||
- * error code or zero.
|
||||
+ * @set_coalesce: Set interrupt coalescing parameters. Supported coalescing
|
||||
+ * types should be set in @supported_coalesce_params.
|
||||
+ * Returns a negative error code or zero.
|
||||
* @get_ringparam: Report ring sizes
|
||||
* @set_ringparam: Set ring sizes. Returns a negative error code or zero.
|
||||
* @get_pauseparam: Report pause parameters
|
||||
@@ -291,7 +327,8 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* @get_per_queue_coalesce: Get interrupt coalescing parameters per queue.
|
||||
* It must check that the given queue number is valid. If neither a RX nor
|
||||
* a TX queue has this number, return -EINVAL. If only a RX queue or a TX
|
||||
- * queue has this number, set the inapplicable fields to ~0 and return 0.
|
||||
+ * queue has this number, ignore the inapplicable fields. Supported
|
||||
+ * coalescing types should be set in @supported_coalesce_params.
|
||||
* Returns a negative error code or zero.
|
||||
* @set_per_queue_coalesce: Set interrupt coalescing parameters per queue.
|
||||
* It must check that the given queue number is valid. If neither a RX nor
|
||||
@@ -330,6 +367,7 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* of the generic netdev features interface.
|
||||
*/
|
||||
struct ethtool_ops {
|
||||
+ u32 supported_coalesce_params;
|
||||
int (*get_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
int (*set_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,72 @@
|
||||
From c0087473b7918d790771c873f0e63afb381ad5c2 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Thu, 12 Mar 2020 15:11:06 +0800
|
||||
Subject: [PATCH 014/283] net: hns3: clear port base VLAN when unload PF
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.6-rc1
|
||||
commit 59359fc8a2f7af062777692e6a7aae73483729ec
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=59359fc8a2f7af062777692e6a7aae73483729ec
|
||||
|
||||
--------------------------------
|
||||
|
||||
Currently, PF missed to clear the port base VLAN for VF when
|
||||
unload. In this case, the VLAN id will remain in the VLAN
|
||||
table. This patch fixes it.
|
||||
|
||||
Fixes: 92f11ea177cd ("net: hns3: fix set port based VLAN issue for VF")
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 23 +++++++++++++++++++
|
||||
1 file changed, 23 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 7b60829d8bba..fa19e8514710 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -9307,6 +9307,28 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void hclge_clear_vf_vlan(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hclge_vlan_info *vlan_info;
|
||||
+ struct hclge_vport *vport;
|
||||
+ int ret;
|
||||
+ int vf;
|
||||
+
|
||||
+ /* clear port base vlan for all vf */
|
||||
+ for (vf = HCLGE_VF_VPORT_START_NUM; vf < hdev->num_alloc_vport; vf++) {
|
||||
+ vport = &hdev->vport[vf];
|
||||
+ vlan_info = &vport->port_base_vlan_cfg.vlan_info;
|
||||
+
|
||||
+ ret = hclge_set_vlan_filter_hw(hdev, htons(ETH_P_8021Q),
|
||||
+ vport->vport_id,
|
||||
+ vlan_info->vlan_tag, true);
|
||||
+ if (ret)
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to clear vf vlan for vf%d, ret = %d\n",
|
||||
+ vf - HCLGE_VF_VPORT_START_NUM, ret);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
|
||||
u16 vlan_id, bool is_kill)
|
||||
{
|
||||
@@ -10843,6 +10865,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
struct hclge_mac *mac = &hdev->hw.mac;
|
||||
|
||||
hclge_reset_vf_rate(hdev);
|
||||
+ hclge_clear_vf_vlan(hdev);
|
||||
hclge_misc_affinity_teardown(hdev);
|
||||
hclge_state_uninit(hdev);
|
||||
hclge_uninit_vport_mac_table(hdev);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,128 @@
|
||||
From db462fe92a37cfabd1fe29f9f0f4e46dd8fb7130 Mon Sep 17 00:00:00 2001
|
||||
From: Leon Romanovsky <leonro@mellanox.com>
|
||||
Date: Sun, 19 Apr 2020 17:18:48 +0300
|
||||
Subject: [PATCH 015/283] net/hns: Remove custom driver version in favour of
|
||||
global one
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit cad99e506887e257ce8bce826ec25f7854b7e69a
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cad99e506887e257ce8bce826ec25f7854b7e69a
|
||||
|
||||
--------------------------------
|
||||
|
||||
Use globally defined kernel version instead of custom driver variant.
|
||||
|
||||
Reported-by: Borislav Petkov <bp@suse.de>
|
||||
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 7 ++-----
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 4 ----
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 4 ----
|
||||
.../ethernet/hisilicon/hns3/hns3_extension/hns3_enet_it.c | 8 +++-----
|
||||
4 files changed, 5 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 6c474df3e5c4..384ee4606051 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/aer.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/sctp.h>
|
||||
-#include <linux/vermagic.h>
|
||||
#include <net/gre.h>
|
||||
#include <net/ip6_checksum.h>
|
||||
#include <net/pkt_cls.h>
|
||||
@@ -43,9 +42,8 @@
|
||||
|
||||
static void hns3_clear_all_ring(struct hnae3_handle *h, bool force);
|
||||
|
||||
-const char hns3_driver_name[] = "hns3";
|
||||
-char hns3_driver_version[] = VERMAGIC_STRING;
|
||||
-const char hns3_driver_string[] =
|
||||
+static const char hns3_driver_name[] = "hns3";
|
||||
+static const char hns3_driver_string[] =
|
||||
"Hisilicon Ethernet Network Driver for Hip08 Family";
|
||||
const char hns3_copyright[] = "Copyright (c) 2017 Huawei Corporation.";
|
||||
struct hnae3_client client;
|
||||
@@ -4847,4 +4845,3 @@ MODULE_DESCRIPTION("HNS3: Hisilicon Ethernet Driver");
|
||||
MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("pci:hns-nic");
|
||||
-MODULE_VERSION(HNS3_MOD_VERSION);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 19f83dfb32aa..ac1659c18b16 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -8,10 +8,6 @@
|
||||
|
||||
#include "hnae3.h"
|
||||
|
||||
-#define HNS3_MOD_VERSION "23.7.1"
|
||||
-
|
||||
-extern char hns3_driver_version[];
|
||||
-
|
||||
enum hns3_nic_state {
|
||||
HNS3_NIC_STATE_TESTING,
|
||||
HNS3_NIC_STATE_RESETTING,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index cfd35b5f14b7..11480bb99055 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -562,10 +562,6 @@ static void hns3_get_drvinfo(struct net_device *netdev,
|
||||
return;
|
||||
}
|
||||
|
||||
- strncpy(drvinfo->version, hns3_driver_version,
|
||||
- sizeof(drvinfo->version));
|
||||
- drvinfo->version[sizeof(drvinfo->version) - 1] = '\0';
|
||||
-
|
||||
strncpy(drvinfo->driver, h->pdev->driver->name,
|
||||
sizeof(drvinfo->driver));
|
||||
drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0';
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_extension/hns3_enet_it.c b/drivers/net/ethernet/hisilicon/hns3/hns3_extension/hns3_enet_it.c
|
||||
index a6a724da0548..9a4ac499fbb2 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_extension/hns3_enet_it.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_extension/hns3_enet_it.c
|
||||
@@ -12,7 +12,6 @@
|
||||
#include "hns3_enet_it.h"
|
||||
#include "hns3_enet.h"
|
||||
|
||||
-extern const char hns3_driver_string[];
|
||||
extern const char hns3_copyright[];
|
||||
|
||||
#ifdef CONFIG_IT_VALIDATION
|
||||
@@ -21,7 +20,9 @@ extern struct net_device_ops hns3_nic_netdev_ops;
|
||||
extern const struct hnae3_client_ops client_ops;
|
||||
extern struct hnae3_client client;
|
||||
extern struct pci_driver hns3_driver;
|
||||
-extern const char hns3_driver_name[];
|
||||
+static const char hns3_driver_name[] = "hns3";
|
||||
+static const char hns3_driver_string[] =
|
||||
+ "Hisilicon Ethernet Network Driver for Hip08 Family";
|
||||
|
||||
#if (KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE)
|
||||
u16 hns3_nic_select_queue_it(struct net_device *ndev, struct sk_buff *skb,
|
||||
@@ -51,9 +52,6 @@ static int __init hns3_init_module_it(void)
|
||||
pr_info("%s: %s - version\n", hns3_driver_name, hns3_driver_string);
|
||||
pr_info("%s: %s\n", hns3_driver_name, hns3_copyright);
|
||||
|
||||
- strncpy(hns3_driver_version, HNS3_MOD_VERSION,
|
||||
- strlen(hns3_driver_version));
|
||||
-
|
||||
client.type = HNAE3_CLIENT_KNIC;
|
||||
snprintf(client.name, HNAE3_CLIENT_NAME_LENGTH, "%s", hns3_driver_name);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,95 @@
|
||||
From 9c269c2d725496997391d87a01f5fc11c05c441d Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 9 May 2020 17:27:37 +0800
|
||||
Subject: [PATCH 016/283] net: hns3: remove a redundant register macro
|
||||
definition
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 5705b45155c404a1eb2ccc92e95851cfa21d4f37
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5705b45155c404a1eb2ccc92e95851cfa21d4f37
|
||||
|
||||
--------------------------------
|
||||
|
||||
HCLGE_MISC_VECTOR_INT_STS and HCLGE_VECTOR_PF_OTHER_INT_STS_REG
|
||||
both represent the misc interrupt status register(0x20800), so
|
||||
removes HCLGE_VECTOR_PF_OTHER_INT_STS_REG and replaces it with
|
||||
HCLGE_MISC_VECTOR_INT_STS.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h | 1 -
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 13 +++++--------
|
||||
2 files changed, 5 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
index 67e972a25f47..fcaf4f472379 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
@@ -19,7 +19,6 @@
|
||||
#define HCLGE_RAS_REG_NFE_MASK 0xFF00
|
||||
#define HCLGE_RAS_REG_ROCEE_ERR_MASK 0x3000000
|
||||
|
||||
-#define HCLGE_VECTOR0_PF_OTHER_INT_STS_REG 0x20800
|
||||
#define HCLGE_VECTOR0_REG_MSIX_MASK 0x1FF00
|
||||
|
||||
#define HCLGE_IMP_TCM_ECC_ERR_INT_EN 0xFFFF0000
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index fa19e8514710..b405a9d7f365 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3039,13 +3039,11 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
|
||||
|
||||
static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
{
|
||||
- u32 rst_src_reg, cmdq_src_reg, msix_src_reg;
|
||||
+ u32 cmdq_src_reg, msix_src_reg;
|
||||
|
||||
/* fetch the events from their corresponding regs */
|
||||
- rst_src_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
cmdq_src_reg = hclge_read_dev(&hdev->hw, HCLGE_VECTOR0_CMDQ_SRC_REG);
|
||||
- msix_src_reg = hclge_read_dev(&hdev->hw,
|
||||
- HCLGE_VECTOR0_PF_OTHER_INT_STS_REG);
|
||||
+ msix_src_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
|
||||
/* Assumption: If by any chance reset and mailbox events are reported
|
||||
* together then we will only process reset event in this go and will
|
||||
@@ -3055,7 +3053,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
*
|
||||
* check for vector0 reset event sources
|
||||
*/
|
||||
- if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & rst_src_reg) {
|
||||
+ if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & msix_src_reg) {
|
||||
dev_info(&hdev->pdev->dev, "IMP reset interrupt\n");
|
||||
set_bit(HNAE3_IMP_RESET, &hdev->reset_pending);
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
@@ -3064,7 +3062,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
return HCLGE_VECTOR0_EVENT_RST;
|
||||
}
|
||||
|
||||
- if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & rst_src_reg) {
|
||||
+ if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & msix_src_reg) {
|
||||
dev_info(&hdev->pdev->dev, "global reset interrupt\n");
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
set_bit(HNAE3_GLOBAL_RESET, &hdev->reset_pending);
|
||||
@@ -3998,8 +3996,7 @@ static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
||||
struct device *dev = &hdev->pdev->dev;
|
||||
u32 msix_sts_reg;
|
||||
|
||||
- msix_sts_reg = hclge_read_dev(&hdev->hw,
|
||||
- HCLGE_VECTOR0_PF_OTHER_INT_STS_REG);
|
||||
+ msix_sts_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
|
||||
if (msix_sts_reg & HCLGE_VECTOR0_REG_MSIX_MASK) {
|
||||
if (hclge_handle_hw_msix_error(hdev,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
70
patches/0378-net-hns3-modify-two-uncorrect-macro-names.patch
Normal file
70
patches/0378-net-hns3-modify-two-uncorrect-macro-names.patch
Normal file
@ -0,0 +1,70 @@
|
||||
From 8bfab91ccbe8979e74fd89575d4bb468f1b8ed53 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 9 May 2020 17:27:38 +0800
|
||||
Subject: [PATCH 017/283] net: hns3: modify two uncorrect macro names
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 4279b4d5ec9c58f63fde23b2d86de4a1e494dc06
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4279b4d5ec9c58f63fde23b2d86de4a1e494dc06
|
||||
|
||||
--------------------------------
|
||||
|
||||
According to the UM, command 0x0B03 and 0x0B13 are used to
|
||||
query the statistics about TX and RX, not the status, so
|
||||
modifies the unsuitable macro name of these two command.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 ++--
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++--
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index c57f0ccf624f..013292889601 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -187,11 +187,11 @@ enum hclge_opcode_type {
|
||||
/* TQP commands */
|
||||
HCLGE_OPC_CFG_TX_QUEUE = 0x0B01,
|
||||
HCLGE_OPC_QUERY_TX_POINTER = 0x0B02,
|
||||
- HCLGE_OPC_QUERY_TX_STATUS = 0x0B03,
|
||||
+ HCLGE_OPC_QUERY_TX_STATS = 0x0B03,
|
||||
HCLGE_OPC_TQP_TX_QUEUE_TC = 0x0B04,
|
||||
HCLGE_OPC_CFG_RX_QUEUE = 0x0B11,
|
||||
HCLGE_OPC_QUERY_RX_POINTER = 0x0B12,
|
||||
- HCLGE_OPC_QUERY_RX_STATUS = 0x0B13,
|
||||
+ HCLGE_OPC_QUERY_RX_STATS = 0x0B13,
|
||||
HCLGE_OPC_STASH_RX_QUEUE_LRO = 0x0B16,
|
||||
HCLGE_OPC_CFG_RX_QUEUE_LRO = 0x0B17,
|
||||
HCLGE_OPC_CFG_COM_TQP_QUEUE = 0x0B20,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index b405a9d7f365..57a8cb114e28 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -552,7 +552,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
|
||||
queue = handle->kinfo.tqp[i];
|
||||
tqp = container_of(queue, struct hclge_tqp, q);
|
||||
/* command : HCLGE_OPC_QUERY_IGU_STAT */
|
||||
- hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_RX_STATUS,
|
||||
+ hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_RX_STATS,
|
||||
true);
|
||||
|
||||
desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
|
||||
@@ -572,7 +572,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
|
||||
tqp = container_of(queue, struct hclge_tqp, q);
|
||||
/* command : HCLGE_OPC_QUERY_IGU_STAT */
|
||||
hclge_cmd_setup_basic_desc(&desc[0],
|
||||
- HCLGE_OPC_QUERY_TX_STATUS,
|
||||
+ HCLGE_OPC_QUERY_TX_STATS,
|
||||
true);
|
||||
|
||||
desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 5b602038a70319bf26e3b7b75eedfa05cd47dbc6 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 14 May 2020 20:41:23 +0800
|
||||
Subject: [PATCH 018/283] net: hns3: remove a duplicated printing in
|
||||
hclge_configure()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 727f514bd677420d4253ad84509710040e808899
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=727f514bd677420d4253ad84509710040e808899
|
||||
|
||||
--------------------------------
|
||||
|
||||
Since hclge_get_cfg() already has error print, so hclge_configure()
|
||||
should not print error when calling hclge_get_cfg() fail.
|
||||
|
||||
Reported-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 57a8cb114e28..14c7ef0fe807 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1395,10 +1395,8 @@ static int hclge_configure(struct hclge_dev *hdev)
|
||||
int node, ret;
|
||||
|
||||
ret = hclge_get_cfg(hdev, &cfg);
|
||||
- if (ret) {
|
||||
- dev_err(&hdev->pdev->dev, "get mac mode error %d.\n", ret);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
hdev->num_vmdq_vport = cfg.vmdq_vport_num;
|
||||
hdev->base_tqp_pid = 0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
65
patches/0380-net-hns3-refactor-hclge_config_tso.patch
Normal file
65
patches/0380-net-hns3-refactor-hclge_config_tso.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From 2cf7b0ff6f0f960fbccfc32ead53d4362baa85a0 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:10 +0800
|
||||
Subject: [PATCH 019/283] net: hns3: refactor hclge_config_tso()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 9f5a9816065f92683fd5f23cd8ec98719f20144f
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9f5a9816065f92683fd5f23cd8ec98719f20144f
|
||||
|
||||
--------------------------------
|
||||
|
||||
Since parameters 'tso_mss_min' and 'tso_mss_max' only indicate
|
||||
the minimum and maximum MSS, the hnae3_set_field() calls are
|
||||
meaningless, remove them and change the type of these two
|
||||
parameters to u16.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 17 ++++-------------
|
||||
1 file changed, 4 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 14c7ef0fe807..cc2be3366409 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1466,26 +1466,17 @@ static int hclge_configure(struct hclge_dev *hdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int hclge_config_tso(struct hclge_dev *hdev, unsigned int tso_mss_min,
|
||||
- unsigned int tso_mss_max)
|
||||
+static int hclge_config_tso(struct hclge_dev *hdev, u16 tso_mss_min,
|
||||
+ u16 tso_mss_max)
|
||||
{
|
||||
struct hclge_cfg_tso_status_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
- u16 tso_mss;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TSO_GENERIC_CONFIG, false);
|
||||
|
||||
req = (struct hclge_cfg_tso_status_cmd *)desc.data;
|
||||
-
|
||||
- tso_mss = 0;
|
||||
- hnae3_set_field(tso_mss, HCLGE_TSO_MSS_MIN_M,
|
||||
- HCLGE_TSO_MSS_MIN_S, tso_mss_min);
|
||||
- req->tso_mss_min = cpu_to_le16(tso_mss);
|
||||
-
|
||||
- tso_mss = 0;
|
||||
- hnae3_set_field(tso_mss, HCLGE_TSO_MSS_MIN_M,
|
||||
- HCLGE_TSO_MSS_MIN_S, tso_mss_max);
|
||||
- req->tso_mss_max = cpu_to_le16(tso_mss);
|
||||
+ req->tso_mss_min = cpu_to_le16(tso_mss_min);
|
||||
+ req->tso_mss_max = cpu_to_le16(tso_mss_max);
|
||||
|
||||
return hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
From 3b5b110024e122cc3578d8b5e3a581cee79175ab Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:11 +0800
|
||||
Subject: [PATCH 020/283] net: hns3: refactor hclge_query_bd_num_cmd_send()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 5caa039f320d023fb2a40c8c7ededfca3ce85501
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5caa039f320d023fb2a40c8c7ededfca3ce85501
|
||||
|
||||
--------------------------------
|
||||
|
||||
In order to improve code maintainability and readability, rewrite
|
||||
the process of BDs' initialization in hclge_query_bd_num_cmd_send().
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 21 +++++++++++--------
|
||||
1 file changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index cc2be3366409..65af9a80f17e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -11115,16 +11115,19 @@ static int hclge_get_64_bit_regs(struct hclge_dev *hdev, u32 regs_num,
|
||||
|
||||
int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc)
|
||||
{
|
||||
- /*prepare 4 commands to query DFX BD number*/
|
||||
- hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_DFX_BD_NUM, true);
|
||||
- desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
- hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_DFX_BD_NUM, true);
|
||||
- desc[1].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
- hclge_cmd_setup_basic_desc(&desc[2], HCLGE_OPC_DFX_BD_NUM, true);
|
||||
- desc[2].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
- hclge_cmd_setup_basic_desc(&desc[3], HCLGE_OPC_DFX_BD_NUM, true);
|
||||
+ int i;
|
||||
+
|
||||
+ /* initialize command BD except the last one */
|
||||
+ for (i = 0; i < HCLGE_GET_DFX_REG_TYPE_CNT - 1; i++) {
|
||||
+ hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM,
|
||||
+ true);
|
||||
+ desc[i].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
+ }
|
||||
+
|
||||
+ /* initialize the last command BD */
|
||||
+ hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, true);
|
||||
|
||||
- return hclge_cmd_send(&hdev->hw, desc, 4);
|
||||
+ return hclge_cmd_send(&hdev->hw, desc, HCLGE_GET_DFX_REG_TYPE_CNT);
|
||||
}
|
||||
|
||||
static int hclge_get_dfx_reg_bd_num(struct hclge_dev *hdev,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
From 235e2439919790fe01c2faad087fc9a4460bf080 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:12 +0800
|
||||
Subject: [PATCH 021/283] net: hns3: modify an incorrect type in struct
|
||||
hclge_cfg_gro_status_cmd
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 639d84d0c4281e6d8814bb2cc230bfe7ccf5019d
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=639d84d0c4281e6d8814bb2cc230bfe7ccf5019d
|
||||
|
||||
--------------------------------
|
||||
|
||||
Modify field .gro_en in struct hclge_cfg_gro_status_cmd to u8
|
||||
according to the UM, otherwise, it will overwrite the reserved
|
||||
byte which may be used for other purpose.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 ++--
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 013292889601..aacb75eb8ea8 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -918,8 +918,8 @@ struct hclge_cfg_tso_status_cmd {
|
||||
|
||||
#define HCLGE_GRO_EN_B 0
|
||||
struct hclge_cfg_gro_status_cmd {
|
||||
- __le16 gro_en;
|
||||
- u8 rsv[22];
|
||||
+ u8 gro_en;
|
||||
+ u8 rsv[23];
|
||||
};
|
||||
|
||||
#define HCLGE_TSO_MSS_MIN 256
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 65af9a80f17e..e0ab39ae5c91 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1493,7 +1493,7 @@ static int hclge_config_gro(struct hclge_dev *hdev, bool en)
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_GRO_GENERIC_CONFIG, false);
|
||||
req = (struct hclge_cfg_gro_status_cmd *)desc.data;
|
||||
|
||||
- req->gro_en = cpu_to_le16(en ? 1 : 0);
|
||||
+ req->gro_en = en ? 1 : 0;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
From 9d2581a53f40fb8e2b932e234b6be0d33efc4845 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:13 +0800
|
||||
Subject: [PATCH 022/283] net: hns3: modify an incorrect type in struct
|
||||
hclgevf_cfg_gro_status_cmd
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit fb9e44d63dc33b455a50b772a37faf43e793da91
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fb9e44d63dc33b455a50b772a37faf43e793da91
|
||||
|
||||
--------------------------------
|
||||
|
||||
Modify field .gro_en in struct hclgevf_cfg_gro_status_cmd to u8
|
||||
according to the UM, otherwise, it will overwrite the reserved
|
||||
byte which may be used for other purpose.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h | 4 ++--
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index c87ec29f4f38..69ddfad488a5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -162,8 +162,8 @@ struct hclgevf_query_res_cmd {
|
||||
|
||||
#define HCLGEVF_GRO_EN_B 0
|
||||
struct hclgevf_cfg_gro_status_cmd {
|
||||
- __le16 gro_en;
|
||||
- u8 rsv[22];
|
||||
+ u8 gro_en;
|
||||
+ u8 rsv[23];
|
||||
};
|
||||
|
||||
#define HCLGEVF_RSS_DEFAULT_OUTPORT_B 4
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index ebe09a304aed..35a2f0415ef5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -2488,7 +2488,7 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
|
||||
false);
|
||||
req = (struct hclgevf_cfg_gro_status_cmd *)desc.data;
|
||||
|
||||
- req->gro_en = cpu_to_le16(en ? 1 : 0);
|
||||
+ req->gro_en = en ? 1 : 0;
|
||||
|
||||
ret = hclgevf_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,76 @@
|
||||
From 33c240aba8e2f8b7e8f7bba2e60739d3dcf942cd Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:14 +0800
|
||||
Subject: [PATCH 023/283] net: hns3: remove some unused fields in struct
|
||||
hns3_nic_priv
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 5e86178dcead4941fcdadc963f31ed4e859e58ce
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e86178dcead4941fcdadc963f31ed4e859e58ce
|
||||
|
||||
--------------------------------
|
||||
|
||||
Remove some fileds which defined in struct hns3_nic_priv,
|
||||
but not used, and remove the related definition of struct
|
||||
hns3_udp_tunnel and enum hns3_udp_tnl_type.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 22 -------------------
|
||||
1 file changed, 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index ac1659c18b16..7f19a8b82036 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -493,21 +493,8 @@ struct hns3_enet_tqp_vector {
|
||||
unsigned long last_jiffies;
|
||||
} ____cacheline_internodealigned_in_smp;
|
||||
|
||||
-enum hns3_udp_tnl_type {
|
||||
- HNS3_UDP_TNL_VXLAN,
|
||||
- HNS3_UDP_TNL_GENEVE,
|
||||
- HNS3_UDP_TNL_MAX,
|
||||
-};
|
||||
-
|
||||
-struct hns3_udp_tunnel {
|
||||
- u16 dst_port;
|
||||
- int used;
|
||||
-};
|
||||
-
|
||||
struct hns3_nic_priv {
|
||||
struct hnae3_handle *ae_handle;
|
||||
- u32 enet_ver;
|
||||
- u32 port_id;
|
||||
struct net_device *netdev;
|
||||
struct device *dev;
|
||||
|
||||
@@ -519,19 +506,10 @@ struct hns3_nic_priv {
|
||||
struct hns3_enet_tqp_vector *tqp_vector;
|
||||
u16 vector_num;
|
||||
|
||||
- /* The most recently read link state */
|
||||
- int link;
|
||||
u64 tx_timeout_count;
|
||||
|
||||
unsigned long state;
|
||||
|
||||
- struct timer_list service_timer;
|
||||
-
|
||||
- struct work_struct service_task;
|
||||
-
|
||||
- struct notifier_block notifier_block;
|
||||
- /* Vxlan/Geneve information */
|
||||
- struct hns3_udp_tunnel udp_tnl[HNS3_UDP_TNL_MAX];
|
||||
struct hns3_enet_coalesce tx_coal;
|
||||
struct hns3_enet_coalesce rx_coal;
|
||||
};
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,58 @@
|
||||
From eadef93b6f79f1abad6d60d4bd8328a111ce7396 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:16 +0800
|
||||
Subject: [PATCH 024/283] net: hns3: remove unused struct
|
||||
hnae3_unic_private_info
|
||||
|
||||
ainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 4828b5766a69e93ca76b15f820c97f03ebd3a48c
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4828b5766a69e93ca76b15f820c97f03ebd3a48c
|
||||
|
||||
--------------------------------
|
||||
|
||||
Since field .uinfo in struct hnae3_handle never be used,
|
||||
so remove it and its structure definition.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 11 -----------
|
||||
1 file changed, 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index a978ab96c7ad..7ab3c4012b44 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -718,16 +718,6 @@ struct hnae3_roce_private_info {
|
||||
unsigned long state;
|
||||
};
|
||||
|
||||
-struct hnae3_unic_private_info {
|
||||
- struct net_device *netdev;
|
||||
- u16 rx_buf_len;
|
||||
- u16 num_tx_desc;
|
||||
- u16 num_rx_desc;
|
||||
-
|
||||
- u16 num_tqps; /* total number of tqps in this handle */
|
||||
- struct hnae3_queue **tqp; /* array base of all TQPs of this instance */
|
||||
-};
|
||||
-
|
||||
#define HNAE3_SUPPORT_APP_LOOPBACK BIT(0)
|
||||
#define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1)
|
||||
#define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2)
|
||||
@@ -754,7 +744,6 @@ struct hnae3_handle {
|
||||
union {
|
||||
struct net_device *netdev; /* first member */
|
||||
struct hnae3_knic_private_info kinfo;
|
||||
- struct hnae3_unic_private_info uinfo;
|
||||
struct hnae3_roce_private_info rinfo;
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,86 @@
|
||||
From 6224bf81772210b3564b1aacef98ce13a0841ab6 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:17 +0800
|
||||
Subject: [PATCH 025/283] net: hns3: remove two duplicated register macros in
|
||||
hclgevf_main.h
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 9cee2e8d303940a413d20c5d275bdaf418b09b17
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9cee2e8d303940a413d20c5d275bdaf418b09b17
|
||||
|
||||
--------------------------------
|
||||
|
||||
HCLGEVF_CMDQ_INTR_SRC_REG and HCLGEVF_CMDQ_INTR_STS_REG are same
|
||||
as HCLGEVF_VECTOR0_CMDQ_SRC_REG and HCLGEVF_VECTOR0_CMDQ_STAT_REG,
|
||||
replace the former with the latter, and rename macro
|
||||
HCLGEVF_VECTOR0_CMDQ_STAT_REG since 'stat' is not abbreviation of
|
||||
'state'.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 6 +++---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 4 +---
|
||||
2 files changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index 35a2f0415ef5..0ff126b5d688 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -47,7 +47,7 @@ static const u32 cmdq_reg_addr_list[] = {HCLGEVF_CMDQ_TX_ADDR_L_REG,
|
||||
HCLGEVF_CMDQ_RX_TAIL_REG,
|
||||
HCLGEVF_CMDQ_RX_HEAD_REG,
|
||||
HCLGEVF_VECTOR0_CMDQ_SRC_REG,
|
||||
- HCLGEVF_CMDQ_INTR_STS_REG,
|
||||
+ HCLGEVF_VECTOR0_CMDQ_STATE_REG,
|
||||
HCLGEVF_CMDQ_INTR_EN_REG,
|
||||
HCLGEVF_CMDQ_INTR_GEN_REG};
|
||||
|
||||
@@ -1904,7 +1904,7 @@ static void hclgevf_dump_rst_info(struct hclgevf_dev *hdev)
|
||||
dev_info(&hdev->pdev->dev, "vector0 interrupt enable status: 0x%x\n",
|
||||
hclgevf_read_dev(&hdev->hw, HCLGEVF_MISC_VECTOR_REG_BASE));
|
||||
dev_info(&hdev->pdev->dev, "vector0 interrupt status: 0x%x\n",
|
||||
- hclgevf_read_dev(&hdev->hw, HCLGEVF_VECTOR0_CMDQ_STAT_REG));
|
||||
+ hclgevf_read_dev(&hdev->hw, HCLGEVF_VECTOR0_CMDQ_STATE_REG));
|
||||
dev_info(&hdev->pdev->dev, "handshake status: 0x%x\n",
|
||||
hclgevf_read_dev(&hdev->hw, HCLGEVF_CMDQ_TX_DEPTH_REG));
|
||||
dev_info(&hdev->pdev->dev, "function reset status: 0x%x\n",
|
||||
@@ -2336,7 +2336,7 @@ static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,
|
||||
|
||||
/* fetch the events from their corresponding regs */
|
||||
cmdq_stat_reg = hclgevf_read_dev(&hdev->hw,
|
||||
- HCLGEVF_VECTOR0_CMDQ_STAT_REG);
|
||||
+ HCLGEVF_VECTOR0_CMDQ_STATE_REG);
|
||||
|
||||
if (BIT(HCLGEVF_VECTOR0_RST_INT_B) & cmdq_stat_reg) {
|
||||
rst_ing_reg = hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
index 101b3fa9e2db..fe0c87a9e2ff 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
@@ -42,8 +42,6 @@
|
||||
#define HCLGEVF_CMDQ_RX_DEPTH_REG 0x27020
|
||||
#define HCLGEVF_CMDQ_RX_TAIL_REG 0x27024
|
||||
#define HCLGEVF_CMDQ_RX_HEAD_REG 0x27028
|
||||
-#define HCLGEVF_CMDQ_INTR_SRC_REG 0x27100
|
||||
-#define HCLGEVF_CMDQ_INTR_STS_REG 0x27104
|
||||
#define HCLGEVF_CMDQ_INTR_EN_REG 0x27108
|
||||
#define HCLGEVF_CMDQ_INTR_GEN_REG 0x2710C
|
||||
|
||||
@@ -88,7 +86,7 @@
|
||||
/* Vector0 interrupt CMDQ event source register(RW) */
|
||||
#define HCLGEVF_VECTOR0_CMDQ_SRC_REG 0x27100
|
||||
/* Vector0 interrupt CMDQ event status register(RO) */
|
||||
-#define HCLGEVF_VECTOR0_CMDQ_STAT_REG 0x27104
|
||||
+#define HCLGEVF_VECTOR0_CMDQ_STATE_REG 0x27104
|
||||
/* CMDQ register bits for RX event(=MBX event) */
|
||||
#define HCLGEVF_VECTOR0_RX_CMDQ_INT_B 1
|
||||
/* RST register bits for RESET event */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,45 @@
|
||||
From 8f9fda742f4c45d483b6876033d754878117054b Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 28 May 2020 21:48:18 +0800
|
||||
Subject: [PATCH 026/283] net: hns3: remove some unused fields in struct
|
||||
hclge_dev
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 7c6643cac0ed78395ec10fe5b3b279e61b0ee51f
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7c6643cac0ed78395ec10fe5b3b279e61b0ee51f
|
||||
|
||||
--------------------------------
|
||||
|
||||
Remove some fields in struct hclge_dev which have not been used.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 6 ------
|
||||
1 file changed, 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 7c1bbe626b17..c5cad1122788 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -817,12 +817,6 @@ struct hclge_dev {
|
||||
u16 num_roce_msi; /* Num of roce vectors for this PF */
|
||||
int roce_base_vector;
|
||||
|
||||
- u16 pending_udp_bitmap;
|
||||
-
|
||||
- u16 rx_itr_default;
|
||||
- u16 tx_itr_default;
|
||||
-
|
||||
- u16 adminq_work_limit; /* Num of admin receive queue desc to process */
|
||||
unsigned long service_timer_period;
|
||||
unsigned long service_timer_previous;
|
||||
struct timer_list reset_timer;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
From a96f4ce9ec69c9bdd8b5fc10cbfbbf5e83d12ff6 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 30 May 2020 09:08:27 +0800
|
||||
Subject: [PATCH 027/283] net: hns3: fix a print format issue in
|
||||
hclge_mac_mdio_config()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 1f4982ef56f794101cae7ec0fa3b7605f78bd25f
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1f4982ef56f794101cae7ec0fa3b7605f78bd25f
|
||||
|
||||
--------------------------------
|
||||
|
||||
Use %d to print int variable 'ret' in hclge_mac_mdio_config().
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
index d0247f4ab1e8..3eea4870a56a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
@@ -155,7 +155,7 @@ int hclge_mac_mdio_config(struct hclge_dev *hdev)
|
||||
ret = mdiobus_register(mdio_bus);
|
||||
if (ret) {
|
||||
dev_err(mdio_bus->parent,
|
||||
- "Failed to register MDIO bus ret = %#x\n", ret);
|
||||
+ "failed to register MDIO bus, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
From f38968ed91f63e71c5ff5431902ea1e6e4ebad02 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 30 May 2020 09:08:28 +0800
|
||||
Subject: [PATCH 028/283] net: hns3: remove an unused macro hclge_is_csq
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit d62805087e7fbbd7582403b972dd75581256e585
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d62805087e7fbbd7582403b972dd75581256e585
|
||||
|
||||
--------------------------------
|
||||
|
||||
Macro hclge_is_csq defined in hcgle_cmd.c has not been used,
|
||||
so remove it.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 16262eb39605..55bdfd95a0fd 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -12,8 +12,6 @@
|
||||
#include "hnae3.h"
|
||||
#include "hclge_main.h"
|
||||
|
||||
-#define hclge_is_csq(ring) ((ring)->flag & HCLGE_TYPE_CSQ)
|
||||
-
|
||||
#define cmq_ring_to_dev(ring) (&(ring)->dev->pdev->dev)
|
||||
|
||||
static int hclge_ring_space(struct hclge_cmq_ring *ring)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
From 5c278cc123c9987e3b5692da81156605c9c10618 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 30 May 2020 09:08:29 +0800
|
||||
Subject: [PATCH 029/283] net: hns3: remove two unused macros in hclgevf_cmd.c
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit fc68aed15648c70db0377a6abd2b34ec328dd12a
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fc68aed15648c70db0377a6abd2b34ec328dd12a
|
||||
|
||||
--------------------------------
|
||||
|
||||
Macro hclgevf_ring_to_dma_dir and hclgevf_is_csq defined in
|
||||
hclgevf_cmd.c, but not used, so remove them.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index 84f54a7c2e4d..842c37d2a4fe 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -12,9 +12,6 @@
|
||||
#include "hclgevf_main.h"
|
||||
#include "hnae3.h"
|
||||
|
||||
-#define hclgevf_is_csq(ring) ((ring)->flag & HCLGEVF_TYPE_CSQ)
|
||||
-#define hclgevf_ring_to_dma_dir(ring) (hclgevf_is_csq(ring) ? \
|
||||
- DMA_TO_DEVICE : DMA_FROM_DEVICE)
|
||||
#define cmq_ring_to_dev(ring) (&(ring)->dev->pdev->dev)
|
||||
|
||||
static int hclgevf_ring_space(struct hclgevf_cmq_ring *ring)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 13f4fb34280d2e2c92e7f8ba8eda9fce4291ca0e Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 30 May 2020 09:08:31 +0800
|
||||
Subject: [PATCH 030/283] net: hns3: fix two coding style issues in
|
||||
hclgevf_main.c
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 2adb8187e5439e5066c9893586e5079e89f9060a
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2adb8187e5439e5066c9893586e5079e89f9060a
|
||||
|
||||
--------------------------------
|
||||
|
||||
Remove a redundant blank line in hclgevf_cmd_set_promisc_mode(),
|
||||
and fix a reverse xmas tree coding style issue in
|
||||
hclgevf_set_rss_tc_mode().
|
||||
|
||||
Reported-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index 0ff126b5d688..c8b7b3ede445 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -677,8 +677,8 @@ static int hclgevf_set_rss_tc_mode(struct hclgevf_dev *hdev, u16 rss_size)
|
||||
u16 tc_size[HCLGEVF_MAX_TC_NUM];
|
||||
struct hclgevf_desc desc;
|
||||
u16 roundup_size;
|
||||
- int status;
|
||||
unsigned int i;
|
||||
+ int status;
|
||||
|
||||
req = (struct hclgevf_rss_tc_mode_cmd *)desc.data;
|
||||
|
||||
@@ -1171,7 +1171,6 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
|
||||
send_msg.en_mc = en_mc_pmc ? 1 : 0;
|
||||
|
||||
ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
|
||||
-
|
||||
if (ret)
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Set promisc mode fail, status is %d.\n", ret);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 5edf6687e835e1f3e0104d52e5fb7abe29b2cabe Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 30 May 2020 09:08:32 +0800
|
||||
Subject: [PATCH 031/283] net: hns3: remove some unused codes in
|
||||
hns3_nic_set_features()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit 996aade998ac0e9f6f0bf09531c32f1106d9d559
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=996aade998ac0e9f6f0bf09531c32f1106d9d559
|
||||
|
||||
--------------------------------
|
||||
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER is not set in netdev->hw_feature for
|
||||
the HNS3 driver, so the handler of NETIF_F_HW_VLAN_CTAG_FILTER
|
||||
in hns3_nic_set_features() won't be called, remove it.
|
||||
|
||||
Reported-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 8 --------
|
||||
1 file changed, 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 384ee4606051..8279aa124ac9 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -1596,14 +1596,6 @@ static int hns3_nic_set_features(struct net_device *netdev,
|
||||
}
|
||||
#endif
|
||||
|
||||
- if ((changed & NETIF_F_HW_VLAN_CTAG_FILTER) &&
|
||||
- h->ae_algo->ops->enable_vlan_filter) {
|
||||
- enable = !!(features & NETIF_F_HW_VLAN_CTAG_FILTER);
|
||||
- ret = h->ae_algo->ops->enable_vlan_filter(h, enable);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
if ((changed & NETIF_F_HW_VLAN_CTAG_RX) &&
|
||||
h->ae_algo->ops->enable_hw_strip_rxvtag) {
|
||||
enable = !!(features & NETIF_F_HW_VLAN_CTAG_RX);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
57
patches/0393-net-hns3-remove-some-unused-macros.patch
Normal file
57
patches/0393-net-hns3-remove-some-unused-macros.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From 9fb48951348ec72c4f9de5edc0282329a2a4c3ca Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 14 May 2020 20:41:25 +0800
|
||||
Subject: [PATCH 032/283] net: hns3: remove some unused macros
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.8-rc1
|
||||
commit bd13f7e12936b83a363ffada725bdf0fe229f337
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EJ0A
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bd13f7e12936b83a363ffada725bdf0fe229f337
|
||||
|
||||
--------------------------------
|
||||
|
||||
There are some macros defined in hns3_enet.h, but not used in
|
||||
anywhere.
|
||||
|
||||
Reported-by: Yonglong Liu <liuyonglong@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 17 -----------------
|
||||
1 file changed, 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 7f19a8b82036..0588642f906c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -46,23 +46,6 @@ enum hns3_nic_state {
|
||||
#define HNS3_RING_CFG_VF_NUM_REG 0x00080
|
||||
#define HNS3_RING_ASID_REG 0x0008C
|
||||
#define HNS3_RING_EN_REG 0x00090
|
||||
-#define HNS3_RING_T0_BE_RST 0x00094
|
||||
-#define HNS3_RING_COULD_BE_RST 0x00098
|
||||
-#define HNS3_RING_WRR_WEIGHT_REG 0x0009c
|
||||
-
|
||||
-#define HNS3_RING_INTMSK_RXWL_REG 0x000A0
|
||||
-#define HNS3_RING_INTSTS_RX_RING_REG 0x000A4
|
||||
-#define HNS3_RX_RING_INT_STS_REG 0x000A8
|
||||
-#define HNS3_RING_INTMSK_TXWL_REG 0x000AC
|
||||
-#define HNS3_RING_INTSTS_TX_RING_REG 0x000B0
|
||||
-#define HNS3_TX_RING_INT_STS_REG 0x000B4
|
||||
-#define HNS3_RING_INTMSK_RX_OVERTIME_REG 0x000B8
|
||||
-#define HNS3_RING_INTSTS_RX_OVERTIME_REG 0x000BC
|
||||
-#define HNS3_RING_INTMSK_TX_OVERTIME_REG 0x000C4
|
||||
-#define HNS3_RING_INTSTS_TX_OVERTIME_REG 0x000C8
|
||||
-
|
||||
-#define HNS3_RING_MB_CTRL_REG 0x00100
|
||||
-#define HNS3_RING_MB_DATA_BASE_REG 0x00200
|
||||
|
||||
#define HNS3_TX_REG_OFFSET 0x40
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,692 @@
|
||||
From 00ebd53ab1af1addac638a8b012daa03ee396f9b Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Thu, 15 Jun 2023 14:40:50 +0800
|
||||
Subject: [PATCH 033/283] net: hns3: add device version to replace pci revision
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit 295ba232a8c3c5547f9fb470a62f3585025ccd00
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=295ba232a8c3c5547f9fb470a62f3585025ccd00
|
||||
|
||||
--------------------------------
|
||||
|
||||
To better identify the device version, struct hnae3_handle adds a
|
||||
member dev_version to replace pci revision. The dev_version consists
|
||||
of hardware version and PCI revision. The hardware version is queried
|
||||
from firmware by an existing firmware version query command.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 7 ++++
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 7 ++--
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 30 +++++++++-----
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 38 ++++++++++--------
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 3 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.c | 13 +++---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 33 +++++++--------
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 40 ++++++++++---------
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 3 +-
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 17 ++++----
|
||||
10 files changed, 110 insertions(+), 81 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 7ab3c4012b44..61e549bbbf9a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -36,6 +36,12 @@
|
||||
|
||||
#define HNAE3_MIN_VECTOR_NUM 2 /* first one for misc, another for IO */
|
||||
|
||||
+/* Device version */
|
||||
+#define HNAE3_DEVICE_VERSION_V1 0x00020
|
||||
+#define HNAE3_DEVICE_VERSION_V2 0x00021
|
||||
+#define HNAE3_DEVICE_VERSION_V3 0x00030
|
||||
+
|
||||
+#define HNAE3_PCI_REVISION_BIT_SIZE 8
|
||||
/* Device IDs */
|
||||
#define HNAE3_DEV_ID_GE 0xA220
|
||||
#define HNAE3_DEV_ID_25GE 0xA221
|
||||
@@ -288,6 +294,7 @@ struct hnae3_ae_dev {
|
||||
struct list_head node;
|
||||
u32 flag;
|
||||
unsigned long hw_err_reset_req;
|
||||
+ u32 dev_version;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 8279aa124ac9..3784001b09a7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -2165,7 +2165,7 @@ static void hns3_disable_sriov(struct pci_dev *pdev)
|
||||
static void hns3_get_dev_capability(struct pci_dev *pdev,
|
||||
struct hnae3_ae_dev *ae_dev)
|
||||
{
|
||||
- if (pdev->revision >= 0x21) {
|
||||
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
}
|
||||
@@ -2424,7 +2424,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC |
|
||||
NETIF_F_FRAGLIST;
|
||||
|
||||
- if (pdev->revision > HNAE3_REVISION_ID_20) {
|
||||
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
#ifdef NETIF_F_GRO_HW
|
||||
netdev->features |= NETIF_F_GRO_HW;
|
||||
netdev->hw_features |= NETIF_F_GRO_HW;
|
||||
@@ -2930,8 +2930,9 @@ static bool hns3_parse_vlan_tag(struct hns3_enet_ring *ring,
|
||||
{
|
||||
struct hnae3_handle *handle = ring->tqp->handle;
|
||||
struct pci_dev *pdev = ring->tqp->handle->pdev;
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
|
||||
|
||||
- if (pdev->revision == HNAE3_REVISION_ID_20) {
|
||||
+ if (unlikely(ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)) {
|
||||
*vlan_tag = le16_to_cpu(desc->rx.ot_vlan_tag);
|
||||
if (!(*vlan_tag & VLAN_VID_MASK))
|
||||
*vlan_tag = le16_to_cpu(desc->rx.vlan_tag);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 11480bb99055..e38fb6ef3e75 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -83,6 +83,7 @@ static const struct hns3_stats hns3_rxq_stats[] = {
|
||||
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(ndev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
int ret;
|
||||
|
||||
if (!h->ae_algo->ops->set_loopback ||
|
||||
@@ -101,7 +102,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
|
||||
break;
|
||||
}
|
||||
|
||||
- if (ret || h->pdev->revision >= 0x21)
|
||||
+ if (ret || ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
return ret;
|
||||
|
||||
if (en)
|
||||
@@ -149,6 +150,7 @@ static void hns3_lp_setup_skb(struct sk_buff *skb)
|
||||
|
||||
struct net_device *ndev = skb->dev;
|
||||
struct hnae3_handle *handle;
|
||||
+ struct hnae3_ae_dev *ae_dev;
|
||||
unsigned char *packet;
|
||||
struct ethhdr *ethh;
|
||||
unsigned int i;
|
||||
@@ -170,7 +172,8 @@ static void hns3_lp_setup_skb(struct sk_buff *skb)
|
||||
* the purpose of mac or serdes selftest.
|
||||
*/
|
||||
handle = hns3_get_handle(ndev);
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ ae_dev = pci_get_drvdata(handle->pdev);
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
ethh->h_dest[5] += HNS3_NIC_LB_DST_MAC_ADDR;
|
||||
eth_zero_addr(ethh->h_source);
|
||||
ethh->h_proto = htons(ETH_P_ARP);
|
||||
@@ -771,6 +774,7 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
||||
const struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
int ret;
|
||||
|
||||
@@ -794,7 +798,7 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
||||
return phy_ethtool_ksettings_set(netdev->phydev, cmd);
|
||||
}
|
||||
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = hns3_check_ksettings_param(netdev, cmd);
|
||||
@@ -858,11 +862,12 @@ static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
|
||||
const u8 *key, const u8 hfunc)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
|
||||
if (!h->ae_algo->ops->set_rss)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
- if ((h->pdev->revision == HNAE3_REVISION_ID_20 &&
|
||||
+ if ((ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 &&
|
||||
hfunc != ETH_RSS_HASH_TOP) || (hfunc != ETH_RSS_HASH_NO_CHANGE &&
|
||||
hfunc != ETH_RSS_HASH_TOP && hfunc != ETH_RSS_HASH_XOR)) {
|
||||
netdev_err(netdev, "hash func not supported\n");
|
||||
@@ -1055,6 +1060,7 @@ static int hns3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
|
||||
static int hns3_nway_reset(struct net_device *netdev)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
struct phy_device *phy = netdev->phydev;
|
||||
int autoneg;
|
||||
@@ -1084,7 +1090,7 @@ static int hns3_nway_reset(struct net_device *netdev)
|
||||
if (phy)
|
||||
return genphy_restart_aneg(phy);
|
||||
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return ops->restart_autoneg(handle);
|
||||
@@ -1374,11 +1380,12 @@ static int hns3_get_fecparam(struct net_device *netdev,
|
||||
struct ethtool_fecparam *fec)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
u8 fec_ability;
|
||||
u8 fec_mode;
|
||||
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ops->get_fec)
|
||||
@@ -1396,10 +1403,11 @@ static int hns3_set_fecparam(struct net_device *netdev,
|
||||
struct ethtool_fecparam *fec)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
u32 fec_mode;
|
||||
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ops->set_fec)
|
||||
@@ -1418,11 +1426,13 @@ static int hns3_get_module_info(struct net_device *netdev,
|
||||
#define HNS3_SFF_8636_V1_3 0x03
|
||||
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
struct hns3_sfp_type sfp_type;
|
||||
int ret;
|
||||
|
||||
- if (handle->pdev->revision == 0x20 || !ops->get_module_eeprom)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
||||
+ !ops->get_module_eeprom)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
memset(&sfp_type, 0, sizeof(sfp_type));
|
||||
@@ -1466,9 +1476,11 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
||||
struct ethtool_eeprom *ee, u8 *data)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
|
||||
- if (handle->pdev->revision == 0x20 || !ops->get_module_eeprom)
|
||||
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
||||
+ !ops->get_module_eeprom)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ee->len)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 55bdfd95a0fd..114970c8e21a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -346,9 +346,9 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
return retval;
|
||||
}
|
||||
|
||||
-static enum hclge_cmd_status hclge_cmd_query_firmware_version(
|
||||
- struct hclge_hw *hw, u32 *version)
|
||||
+static enum hclge_cmd_status hclge_cmd_query_version(struct hclge_dev *hdev)
|
||||
{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclge_query_version_cmd *resp;
|
||||
struct hclge_desc desc;
|
||||
int ret;
|
||||
@@ -356,9 +356,15 @@ static enum hclge_cmd_status hclge_cmd_query_firmware_version(
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_FW_VER, 1);
|
||||
resp = (struct hclge_query_version_cmd *)desc.data;
|
||||
|
||||
- ret = hclge_cmd_send(hw, &desc, 1);
|
||||
- if (!ret)
|
||||
- *version = le32_to_cpu(resp->firmware);
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ hdev->fw_version = le32_to_cpu(resp->firmware);
|
||||
+
|
||||
+ ae_dev->dev_version = le32_to_cpu(resp->hardware) <<
|
||||
+ HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
+ ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -426,7 +432,6 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev, bool en)
|
||||
|
||||
int hclge_cmd_init(struct hclge_dev *hdev)
|
||||
{
|
||||
- u32 version;
|
||||
int ret;
|
||||
|
||||
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
||||
@@ -455,23 +460,22 @@ int hclge_cmd_init(struct hclge_dev *hdev)
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
- ret = hclge_cmd_query_firmware_version(&hdev->hw, &version);
|
||||
+ ret = hclge_cmd_query_version(hdev);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "firmware version query failed %d\n", ret);
|
||||
+ "failed to query version ret=%d\n", ret);
|
||||
goto err_cmd_init;
|
||||
}
|
||||
- hdev->fw_version = version;
|
||||
|
||||
dev_info(&hdev->pdev->dev, "The firmware version is %lu.%lu.%lu.%lu\n",
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE3_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE3_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE2_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE2_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE1_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE1_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE0_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE0_SHIFT));
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE3_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE2_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE1_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE0_SHIFT));
|
||||
|
||||
/* ask the firmware to enable some features, driver can work without
|
||||
* it.
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index aacb75eb8ea8..c43bae3ecbfe 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -371,7 +371,8 @@ struct hclge_rx_priv_buff_cmd {
|
||||
|
||||
struct hclge_query_version_cmd {
|
||||
__le32 firmware;
|
||||
- __le32 firmware_rsv[5];
|
||||
+ __le32 hardware;
|
||||
+ __le32 rsv[4];
|
||||
};
|
||||
|
||||
#define HCLGE_RX_PRIV_EN_B 15
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 9338f030842c..55990ba4b30e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -729,7 +729,7 @@ static int hclge_config_ncsi_hw_err_int(struct hclge_dev *hdev, bool en)
|
||||
struct hclge_desc desc;
|
||||
int ret;
|
||||
|
||||
- if (hdev->pdev->revision < 0x21)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return 0;
|
||||
|
||||
/* configure NCSI error interrupts */
|
||||
@@ -809,7 +809,7 @@ static int hclge_config_ppp_error_interrupt(struct hclge_dev *hdev, u32 cmd,
|
||||
cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT0_EN_MASK);
|
||||
desc[1].data[1] =
|
||||
cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT1_EN_MASK);
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
desc[1].data[2] =
|
||||
cpu_to_le32(HCLGE_PPP_PF_ERR_INT_EN_MASK);
|
||||
} else if (cmd == HCLGE_PPP_CMD1_INT_CMD) {
|
||||
@@ -1042,7 +1042,7 @@ static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en)
|
||||
hclge_cmd_setup_basic_desc(&desc[1], HCLGE_SSU_COMMON_INT_CMD, false);
|
||||
|
||||
if (en) {
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
desc[0].data[0] =
|
||||
cpu_to_le32(HCLGE_SSU_COMMON_INT_EN);
|
||||
else
|
||||
@@ -1551,7 +1551,8 @@ int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en)
|
||||
struct hclge_desc desc;
|
||||
int ret;
|
||||
|
||||
- if (hdev->pdev->revision < 0x21 || !hnae3_dev_roce_supported(hdev))
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
||||
+ !hnae3_dev_roce_supported(hdev))
|
||||
return 0;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_CONFIG_ROCEE_RAS_INT_EN, false);
|
||||
@@ -1578,7 +1579,7 @@ int hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
|
||||
struct hclge_dev *hdev = ae_dev->priv;
|
||||
|
||||
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
|
||||
- hdev->pdev->revision < 0x21)
|
||||
+ hdev->pdev->revision < HNAE3_DEVICE_VERSION_V2)
|
||||
return reset_type;
|
||||
|
||||
reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
|
||||
@@ -1666,7 +1667,7 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
|
||||
}
|
||||
|
||||
/* Handling Non-fatal Rocee RAS errors */
|
||||
- if (hdev->pdev->revision >= 0x21 &&
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2 &&
|
||||
status & HCLGE_RAS_REG_ROCEE_ERR_MASK) {
|
||||
dev_err(dev, "ROCEE Non-Fatal RAS error identified\n");
|
||||
hclge_handle_rocee_ras_error(ae_dev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index e0ab39ae5c91..307907896ff4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -739,7 +739,7 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
|
||||
if (stringset == ETH_SS_TEST) {
|
||||
/* clear loopback bit flags at first */
|
||||
handle->flags = (handle->flags & (~HCLGE_LOOPBACK_TEST_FLAGS));
|
||||
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21 ||
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2 ||
|
||||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_10M ||
|
||||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_100M ||
|
||||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_1G) {
|
||||
@@ -1139,7 +1139,7 @@ static void hclge_parse_fiber_link_mode(struct hclge_dev *hdev,
|
||||
hclge_convert_setting_sr(mac, speed_ability);
|
||||
hclge_convert_setting_lr(mac, speed_ability);
|
||||
hclge_convert_setting_cr(mac, speed_ability);
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
hclge_convert_setting_fec(mac);
|
||||
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, mac->supported);
|
||||
@@ -1168,7 +1168,7 @@ static void hclge_parse_backplane_link_mode(struct hclge_dev *hdev,
|
||||
|
||||
#ifdef HAVE_ETHTOOL_CONVERT_U32_AND_LINK_MODE
|
||||
hclge_convert_setting_kr(mac, speed_ability);
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
hclge_convert_setting_fec(mac);
|
||||
#else
|
||||
if (speed_ability & HCLGE_SUPPORT_1G_BIT)
|
||||
@@ -2916,7 +2916,7 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
|
||||
if (!hdev->support_sfp_query)
|
||||
return 0;
|
||||
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
ret = hclge_get_sfp_info(hdev, mac);
|
||||
else
|
||||
ret = hclge_get_sfp_speed(hdev, &speed);
|
||||
@@ -2928,7 +2928,7 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (hdev->pdev->revision >= 0x21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
if (mac->speed_type == QUERY_ACTIVE_SPEED) {
|
||||
hclge_update_port_capability(mac);
|
||||
return 0;
|
||||
@@ -3567,7 +3567,7 @@ static void hclge_clear_reset_cause(struct hclge_dev *hdev)
|
||||
/* For revision 0x20, the reset interrupt source
|
||||
* can only be cleared after hardware reset done
|
||||
*/
|
||||
- if (hdev->pdev->revision == 0x20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
hclge_write_dev(&hdev->hw, HCLGE_MISC_RESET_STS_REG,
|
||||
clearval);
|
||||
|
||||
@@ -4671,7 +4671,7 @@ static void hclge_rss_init_cfg(struct hclge_dev *hdev)
|
||||
int i, rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
||||
struct hclge_vport *vport = hdev->vport;
|
||||
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
rss_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
|
||||
|
||||
for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
@@ -4871,13 +4871,14 @@ static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
||||
bool en_mc_pmc)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
+ struct hclge_dev *hdev = vport->back;
|
||||
bool en_bc_pmc = true;
|
||||
|
||||
- /* For revision 0x20, if broadcast promisc enabled, vlan filter is
|
||||
- * always bypassed. So broadcast promisc should be disabled until
|
||||
- * user enable promisc mode
|
||||
+ /* For device whose version below V2, if broadcast promisc enabled,
|
||||
+ * vlan filter is always bypassed. So broadcast promisc should be
|
||||
+ * disabled until user enable promisc mode
|
||||
*/
|
||||
- if (handle->pdev->revision == 0x20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
en_bc_pmc = handle->netdev_flags & HNAE3_BPE ? true : false;
|
||||
|
||||
return hclge_set_vport_promisc_mode(vport, en_uc_pmc, en_mc_pmc,
|
||||
@@ -6921,7 +6922,7 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
|
||||
* the same, the packets are looped back in the SSU. If SSU loopback
|
||||
* is disabled, packets can reach MAC even if SMAC is the same as DMAC.
|
||||
*/
|
||||
- if (hdev->pdev->revision >= 0x21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
u8 switch_param = en ? 0 : BIT(HCLGE_SWITCH_ALW_LPBK_B);
|
||||
|
||||
ret = hclge_config_switch_param(hdev, PF_VPORT_ID, switch_param,
|
||||
@@ -8795,7 +8796,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
/* for revision 0x21, vf vlan filter is per function */
|
||||
for (i = 0; i < hdev->num_alloc_vport; i++) {
|
||||
vport = &hdev->vport[i];
|
||||
@@ -9251,7 +9252,7 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
||||
u16 state;
|
||||
int ret;
|
||||
|
||||
- if (hdev->pdev->revision == 0x20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
vport = hclge_get_vf_vport(hdev, vfid);
|
||||
@@ -10548,7 +10549,7 @@ static int hclge_set_vf_spoofchk(struct hnae3_handle *handle, int vf,
|
||||
u32 new_spoofchk = enable ? 1 : 0;
|
||||
int ret;
|
||||
|
||||
- if (hdev->pdev->revision == 0x20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
vport = hclge_get_vf_vport(hdev, vf);
|
||||
@@ -10581,7 +10582,7 @@ static int hclge_reset_vport_spoofchk(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
- if (hdev->pdev->revision == 0x20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return 0;
|
||||
|
||||
/* resume the vf spoof check state after reset */
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index 842c37d2a4fe..4585a22f0003 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -329,9 +329,9 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
||||
return status;
|
||||
}
|
||||
|
||||
-static int hclgevf_cmd_query_firmware_version(struct hclgevf_hw *hw,
|
||||
- u32 *version)
|
||||
+static int hclgevf_cmd_query_version(struct hclgevf_dev *hdev)
|
||||
{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclgevf_query_version_cmd *resp;
|
||||
struct hclgevf_desc desc;
|
||||
int status;
|
||||
@@ -339,9 +339,15 @@ static int hclgevf_cmd_query_firmware_version(struct hclgevf_hw *hw,
|
||||
resp = (struct hclgevf_query_version_cmd *)desc.data;
|
||||
|
||||
hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_QUERY_FW_VER, 1);
|
||||
- status = hclgevf_cmd_send(hw, &desc, 1);
|
||||
- if (!status)
|
||||
- *version = le32_to_cpu(resp->firmware);
|
||||
+ status = hclgevf_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (status)
|
||||
+ return status;
|
||||
+
|
||||
+ hdev->fw_version = le32_to_cpu(resp->firmware);
|
||||
+
|
||||
+ ae_dev->dev_version = le32_to_cpu(resp->hardware) <<
|
||||
+ HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
+ ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -385,7 +391,6 @@ int hclgevf_cmd_queue_init(struct hclgevf_dev *hdev)
|
||||
|
||||
int hclgevf_cmd_init(struct hclgevf_dev *hdev)
|
||||
{
|
||||
- u32 version;
|
||||
int ret;
|
||||
|
||||
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
||||
@@ -416,24 +421,21 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
- /* get firmware version */
|
||||
- ret = hclgevf_cmd_query_firmware_version(&hdev->hw, &version);
|
||||
+ ret = hclgevf_cmd_query_version(hdev);
|
||||
if (ret) {
|
||||
- dev_err(&hdev->pdev->dev,
|
||||
- "failed(%d) to query firmware version\n", ret);
|
||||
+ dev_err(&hdev->pdev->dev, "failed(%d) to query version\n", ret);
|
||||
goto err_cmd_init;
|
||||
}
|
||||
- hdev->fw_version = version;
|
||||
|
||||
dev_info(&hdev->pdev->dev, "The firmware version is %lu.%lu.%lu.%lu\n",
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE3_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE3_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE2_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE2_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE1_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE1_SHIFT),
|
||||
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE0_MASK,
|
||||
- HNAE3_FW_VERSION_BYTE0_SHIFT));
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE3_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE2_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE1_SHIFT),
|
||||
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
|
||||
+ HNAE3_FW_VERSION_BYTE0_SHIFT));
|
||||
|
||||
return 0;
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index 69ddfad488a5..a797f770a9fa 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -144,7 +144,8 @@ struct hclgevf_ctrl_vector_chain {
|
||||
|
||||
struct hclgevf_query_version_cmd {
|
||||
__le32 firmware;
|
||||
- __le32 firmware_rsv[5];
|
||||
+ __le32 hardware;
|
||||
+ __le32 rsv[4];
|
||||
};
|
||||
|
||||
#define HCLGEVF_MSIX_OFT_ROCEE_S 0
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index c8b7b3ede445..f688217d4c59 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -757,7 +757,7 @@ static int hclgevf_get_rss(struct hnae3_handle *handle, u32 *indir, u8 *key,
|
||||
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
||||
int i, ret;
|
||||
|
||||
- if (handle->pdev->revision >= HNAE3_REVISION_ID_21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
/* Get hash algorithm */
|
||||
if (hfunc) {
|
||||
switch (rss_cfg->hash_algo) {
|
||||
@@ -822,7 +822,7 @@ static int hclgevf_set_rss(struct hnae3_handle *handle, const u32 *indir,
|
||||
u8 hash_algo;
|
||||
int ret, i;
|
||||
|
||||
- if (handle->pdev->revision >= HNAE3_REVISION_ID_21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
ret = hclgevf_parse_rss_hfunc(hdev, hfunc, &hash_algo);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -891,7 +891,7 @@ static int hclgevf_set_rss_tuple(struct hnae3_handle *handle,
|
||||
u8 tuple_sets;
|
||||
int ret;
|
||||
|
||||
- if (handle->pdev->revision == HNAE3_REVISION_ID_20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (nfc->data &
|
||||
@@ -969,7 +969,7 @@ static int hclgevf_get_rss_tuple(struct hnae3_handle *handle,
|
||||
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
||||
u8 tuple_sets;
|
||||
|
||||
- if (handle->pdev->revision == HNAE3_REVISION_ID_20)
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
nfc->data = 0;
|
||||
@@ -1182,10 +1182,9 @@ static int hclgevf_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
||||
bool en_mc_pmc)
|
||||
{
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
- struct pci_dev *pdev = hdev->pdev;
|
||||
bool en_bc_pmc;
|
||||
|
||||
- en_bc_pmc = pdev->revision != 0x20;
|
||||
+ en_bc_pmc = hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2;
|
||||
|
||||
return hclgevf_cmd_set_promisc_mode(hdev, en_uc_pmc, en_mc_pmc,
|
||||
en_bc_pmc);
|
||||
@@ -2364,7 +2363,7 @@ static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,
|
||||
* register, so we should just write 0 to the bit we are
|
||||
* handling, and keep other bits as cmdq_stat_reg.
|
||||
*/
|
||||
- if (hdev->pdev->revision >= 0x21)
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
*clearval = ~(1U << HCLGEVF_VECTOR0_RX_CMDQ_INT_B);
|
||||
else
|
||||
*clearval = cmdq_stat_reg &
|
||||
@@ -2506,7 +2505,7 @@ static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
|
||||
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
|
||||
rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
|
||||
tuple_sets = &rss_cfg->rss_tuple_sets;
|
||||
- if (hdev->pdev->revision >= 0x21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
|
||||
memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
|
||||
HCLGEVF_RSS_KEY_SIZE);
|
||||
@@ -2531,7 +2530,7 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
|
||||
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
||||
int ret;
|
||||
|
||||
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21) {
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
|
||||
rss_cfg->rss_hash_key);
|
||||
if (ret)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,185 @@
|
||||
From 90b0e05e773e5dbdf603a7efa64e90e5e9aa42d0 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sun, 27 Sep 2020 15:12:41 +0800
|
||||
Subject: [PATCH 034/283] net: hns3: add support to query device capability
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit ca850f2b0ecbb24f03a706d4d11203565030570a
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ca850f2b0ecbb24f03a706d4d11203565030570a
|
||||
|
||||
--------------------------------
|
||||
|
||||
In order to improve code maintainability and compatibility,
|
||||
add support to query the device capability by expanding the
|
||||
existing version query command. The device capability refers
|
||||
to the features supported by the device.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 10 ----------
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 15 ++++++++++++---
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 +++-
|
||||
.../ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c | 15 ++++++++++++---
|
||||
.../ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h | 4 +++-
|
||||
5 files changed, 30 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 3784001b09a7..f55dd10ab554 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -2162,15 +2162,6 @@ static void hns3_disable_sriov(struct pci_dev *pdev)
|
||||
pci_disable_sriov(pdev);
|
||||
}
|
||||
|
||||
-static void hns3_get_dev_capability(struct pci_dev *pdev,
|
||||
- struct hnae3_ae_dev *ae_dev)
|
||||
-{
|
||||
- if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
/* hns3_probe - Device initialization routine
|
||||
* @pdev: PCI device information struct
|
||||
* @ent: entry in hns3_pci_tbl
|
||||
@@ -2192,7 +2183,6 @@ static int hns3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
ae_dev->pdev = pdev;
|
||||
ae_dev->flag = ent->driver_data;
|
||||
- hns3_get_dev_capability(pdev, ae_dev);
|
||||
pci_set_drvdata(pdev, ae_dev);
|
||||
|
||||
ret = hnae3_register_ae_dev(ae_dev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 114970c8e21a..d9c4e82b0d21 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -346,7 +346,8 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
return retval;
|
||||
}
|
||||
|
||||
-static enum hclge_cmd_status hclge_cmd_query_version(struct hclge_dev *hdev)
|
||||
+static enum hclge_cmd_status
|
||||
+hclge_cmd_query_version_and_capability(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclge_query_version_cmd *resp;
|
||||
@@ -366,6 +367,12 @@ static enum hclge_cmd_status hclge_cmd_query_version(struct hclge_dev *hdev)
|
||||
HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
+ if (!resp->caps[0] &&
|
||||
+ ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
+ hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
+ hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
+ }
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -460,10 +467,12 @@ int hclge_cmd_init(struct hclge_dev *hdev)
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
- ret = hclge_cmd_query_version(hdev);
|
||||
+ /* get version and device capabilities */
|
||||
+ ret = hclge_cmd_query_version_and_capability(hdev);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "failed to query version ret=%d\n", ret);
|
||||
+ "failed to query version and capabilities, ret = %d\n",
|
||||
+ ret);
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index c43bae3ecbfe..d565633abab3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -369,10 +369,12 @@ struct hclge_rx_priv_buff_cmd {
|
||||
u8 rsv[6];
|
||||
};
|
||||
|
||||
+#define HCLGE_QUERY_CAP_LENGTH 3
|
||||
struct hclge_query_version_cmd {
|
||||
__le32 firmware;
|
||||
__le32 hardware;
|
||||
- __le32 rsv[4];
|
||||
+ __le32 rsv;
|
||||
+ __le32 caps[HCLGE_QUERY_CAP_LENGTH]; /* capabilities of device */
|
||||
};
|
||||
|
||||
#define HCLGE_RX_PRIV_EN_B 15
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index 4585a22f0003..20db8fb98604 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -329,7 +329,7 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
||||
return status;
|
||||
}
|
||||
|
||||
-static int hclgevf_cmd_query_version(struct hclgevf_dev *hdev)
|
||||
+static int hclgevf_cmd_query_version_and_capability(struct hclgevf_dev *hdev)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclgevf_query_version_cmd *resp;
|
||||
@@ -349,6 +349,12 @@ static int hclgevf_cmd_query_version(struct hclgevf_dev *hdev)
|
||||
HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
+ if (!resp->caps[0] &&
|
||||
+ ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
+ hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
+ hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
+ }
|
||||
+
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -421,9 +427,12 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
- ret = hclgevf_cmd_query_version(hdev);
|
||||
+ /* get version and device capabilities */
|
||||
+ ret = hclgevf_cmd_query_version_and_capability(hdev);
|
||||
if (ret) {
|
||||
- dev_err(&hdev->pdev->dev, "failed(%d) to query version\n", ret);
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to query version and capabilities, ret = %d\n",
|
||||
+ ret);
|
||||
goto err_cmd_init;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index a797f770a9fa..b59ca89f52cc 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -142,10 +142,12 @@ struct hclgevf_ctrl_vector_chain {
|
||||
u8 resv;
|
||||
};
|
||||
|
||||
+#define HCLGEVF_QUERY_CAP_LENGTH 3
|
||||
struct hclgevf_query_version_cmd {
|
||||
__le32 firmware;
|
||||
__le32 hardware;
|
||||
- __le32 rsv[4];
|
||||
+ __le32 rsv;
|
||||
+ __le32 caps[HCLGEVF_QUERY_CAP_LENGTH]; /* capabilities of device */
|
||||
};
|
||||
|
||||
#define HCLGEVF_MSIX_OFT_ROCEE_S 0
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,324 @@
|
||||
From 6594dcb8488bb746c54752493f35816816904e42 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sun, 27 Sep 2020 15:12:43 +0800
|
||||
Subject: [PATCH 035/283] net: hns3: use capabilities queried from firmware
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit 4cc86cb58a9993a318a56aff1d7dacdf5252b2bc
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4cc86cb58a9993a318a56aff1d7dacdf5252b2bc
|
||||
|
||||
--------------------------------
|
||||
|
||||
In order to improve code maintainability and compatibility, the
|
||||
capabilities of new features are queried from firmware.
|
||||
|
||||
The member flag in struct hnae3_ae_dev indicates not only
|
||||
capabilities, but some initialized status. As capabilities bits
|
||||
queried from firmware is too many, it is better to use new member
|
||||
to indicate them. So adds member capabs in struce hnae3_ae_dev.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 62 +++++++++++++++++--
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 4 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 36 +++++++++--
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 14 +++++
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 34 ++++++++--
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 14 +++++
|
||||
6 files changed, 147 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 61e549bbbf9a..7c00830b712e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -64,10 +64,7 @@
|
||||
#define HNAE3_KNIC_CLIENT_INITED_B 0x3
|
||||
#define HNAE3_UNIC_CLIENT_INITED_B 0x4
|
||||
#define HNAE3_ROCE_CLIENT_INITED_B 0x5
|
||||
-#define HNAE3_DEV_SUPPORT_FD_B 0x6
|
||||
-#define HNAE3_DEV_SUPPORT_GRO_B 0x7
|
||||
#define HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B 0x8
|
||||
-
|
||||
#define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\
|
||||
BIT(HNAE3_DEV_SUPPORT_ROCE_B))
|
||||
|
||||
@@ -77,15 +74,68 @@
|
||||
#define hnae3_dev_dcb_supported(hdev) \
|
||||
hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B)
|
||||
|
||||
+enum HNAE3_DEV_CAP_BITS {
|
||||
+ HNAE3_DEV_SUPPORT_FD_B,
|
||||
+ HNAE3_DEV_SUPPORT_GRO_B,
|
||||
+ HNAE3_DEV_SUPPORT_FEC_B,
|
||||
+ HNAE3_DEV_SUPPORT_UDP_GSO_B,
|
||||
+ HNAE3_DEV_SUPPORT_QB_B,
|
||||
+ HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B,
|
||||
+ HNAE3_DEV_SUPPORT_PTP_B,
|
||||
+ HNAE3_DEV_SUPPORT_INT_QL_B,
|
||||
+ HNAE3_DEV_SUPPORT_SIMPLE_BD_B,
|
||||
+ HNAE3_DEV_SUPPORT_TX_PUSH_B,
|
||||
+ HNAE3_DEV_SUPPORT_PHY_IMP_B,
|
||||
+ HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B,
|
||||
+ HNAE3_DEV_SUPPORT_HW_PAD_B,
|
||||
+ HNAE3_DEV_SUPPORT_STASH_B,
|
||||
+};
|
||||
+
|
||||
#define hnae3_dev_fd_supported(hdev) \
|
||||
- hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B)
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_FD_B, (hdev)->ae_dev->caps)
|
||||
|
||||
#define hnae3_dev_gro_supported(hdev) \
|
||||
- hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B)
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_GRO_B, (hdev)->ae_dev->caps)
|
||||
|
||||
#define hnae3_dev_vlan_fltr_mdf_supported(hdev) \
|
||||
hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B)
|
||||
|
||||
+#define hnae3_dev_fec_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_FEC_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_udp_gso_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_qb_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_QB_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_fd_forward_tc_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_ptp_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_PTP_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_int_ql_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_INT_QL_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_simple_bd_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_SIMPLE_BD_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_tx_push_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_phy_imp_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_tqp_txrx_indep_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_hw_pad_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_HW_PAD_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
+#define hnae3_dev_stash_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_STASH_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
enum HNAE3_PF_CAP_BITS {
|
||||
HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
|
||||
};
|
||||
@@ -288,6 +338,7 @@ struct hnae3_client {
|
||||
struct list_head node;
|
||||
};
|
||||
|
||||
+#define HNAE3_DEV_CAPS_MAX_NUM 96
|
||||
struct hnae3_ae_dev {
|
||||
struct pci_dev *pdev;
|
||||
const struct hnae3_ae_ops *ops;
|
||||
@@ -295,6 +346,7 @@ struct hnae3_ae_dev {
|
||||
u32 flag;
|
||||
unsigned long hw_err_reset_req;
|
||||
u32 dev_version;
|
||||
+ unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)];
|
||||
void *priv;
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index e38fb6ef3e75..2eb3aac3c711 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -1385,7 +1385,7 @@ static int hns3_get_fecparam(struct net_device *netdev,
|
||||
u8 fec_ability;
|
||||
u8 fec_mode;
|
||||
|
||||
- if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
+ if (!test_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ops->get_fec)
|
||||
@@ -1407,7 +1407,7 @@ static int hns3_set_fecparam(struct net_device *netdev,
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
u32 fec_mode;
|
||||
|
||||
- if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
+ if (!test_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ops->set_fec)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index d9c4e82b0d21..d1e963195259 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -346,6 +346,33 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
return retval;
|
||||
}
|
||||
|
||||
+static void hclge_set_default_capability(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_FD_B, ae_dev->caps);
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_GRO_B, ae_dev->caps);
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps);
|
||||
+}
|
||||
+
|
||||
+static void hclge_parse_capability(struct hclge_dev *hdev,
|
||||
+ struct hclge_query_version_cmd *cmd)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ u32 caps;
|
||||
+
|
||||
+ caps = __le32_to_cpu(cmd->caps[0]);
|
||||
+
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_UDP_GSO_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_PTP_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_PTP_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_INT_QL_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_INT_QL_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_TQP_TXRX_INDEP_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, ae_dev->caps);
|
||||
+}
|
||||
+
|
||||
static enum hclge_cmd_status
|
||||
hclge_cmd_query_version_and_capability(struct hclge_dev *hdev)
|
||||
{
|
||||
@@ -367,11 +394,10 @@ hclge_cmd_query_version_and_capability(struct hclge_dev *hdev)
|
||||
HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
- if (!resp->caps[0] &&
|
||||
- ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
- }
|
||||
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
+ hclge_set_default_capability(hdev);
|
||||
+
|
||||
+ hclge_parse_capability(hdev, resp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index d565633abab3..bd4238f3009c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -369,6 +369,20 @@ struct hclge_rx_priv_buff_cmd {
|
||||
u8 rsv[6];
|
||||
};
|
||||
|
||||
+enum HCLGE_CAP_BITS {
|
||||
+ HCLGE_CAP_UDP_GSO_B,
|
||||
+ HCLGE_CAP_QB_B,
|
||||
+ HCLGE_CAP_FD_FORWARD_TC_B,
|
||||
+ HCLGE_CAP_PTP_B,
|
||||
+ HCLGE_CAP_INT_QL_B,
|
||||
+ HCLGE_CAP_SIMPLE_BD_B,
|
||||
+ HCLGE_CAP_TX_PUSH_B,
|
||||
+ HCLGE_CAP_PHY_IMP_B,
|
||||
+ HCLGE_CAP_TQP_TXRX_INDEP_B,
|
||||
+ HCLGE_CAP_HW_PAD_B,
|
||||
+ HCLGE_CAP_STASH_B,
|
||||
+};
|
||||
+
|
||||
#define HCLGE_QUERY_CAP_LENGTH 3
|
||||
struct hclge_query_version_cmd {
|
||||
__le32 firmware;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index 20db8fb98604..d120211c3ef5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -329,6 +329,31 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
||||
return status;
|
||||
}
|
||||
|
||||
+static void hclgevf_set_default_capability(struct hclgevf_dev *hdev)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_FD_B, ae_dev->caps);
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_GRO_B, ae_dev->caps);
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps);
|
||||
+}
|
||||
+
|
||||
+static void hclgevf_parse_capability(struct hclgevf_dev *hdev,
|
||||
+ struct hclgevf_query_version_cmd *cmd)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ u32 caps;
|
||||
+
|
||||
+ caps = __le32_to_cpu(cmd->caps[0]);
|
||||
+
|
||||
+ if (hnae3_get_bit(caps, HCLGEVF_CAP_UDP_GSO_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGEVF_CAP_INT_QL_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_INT_QL_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGEVF_CAP_TQP_TXRX_INDEP_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, ae_dev->caps);
|
||||
+}
|
||||
+
|
||||
static int hclgevf_cmd_query_version_and_capability(struct hclgevf_dev *hdev)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
@@ -349,11 +374,10 @@ static int hclgevf_cmd_query_version_and_capability(struct hclgevf_dev *hdev)
|
||||
HNAE3_PCI_REVISION_BIT_SIZE;
|
||||
ae_dev->dev_version |= hdev->pdev->revision;
|
||||
|
||||
- if (!resp->caps[0] &&
|
||||
- ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
||||
- hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
||||
- }
|
||||
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
+ hclgevf_set_default_capability(hdev);
|
||||
+
|
||||
+ hclgevf_parse_capability(hdev, resp);
|
||||
|
||||
return status;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index b59ca89f52cc..0d1690d9fecf 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -142,6 +142,20 @@ struct hclgevf_ctrl_vector_chain {
|
||||
u8 resv;
|
||||
};
|
||||
|
||||
+enum HCLGEVF_CAP_BITS {
|
||||
+ HCLGEVF_CAP_UDP_GSO_B,
|
||||
+ HCLGEVF_CAP_QB_B,
|
||||
+ HCLGEVF_CAP_FD_FORWARD_TC_B,
|
||||
+ HCLGEVF_CAP_PTP_B,
|
||||
+ HCLGEVF_CAP_INT_QL_B,
|
||||
+ HCLGEVF_CAP_SIMPLE_BD_B,
|
||||
+ HCLGEVF_CAP_TX_PUSH_B,
|
||||
+ HCLGEVF_CAP_PHY_IMP_B,
|
||||
+ HCLGEVF_CAP_TQP_TXRX_INDEP_B,
|
||||
+ HCLGEVF_CAP_HW_PAD_B,
|
||||
+ HCLGEVF_CAP_STASH_B,
|
||||
+};
|
||||
+
|
||||
#define HCLGEVF_QUERY_CAP_LENGTH 3
|
||||
struct hclgevf_query_version_cmd {
|
||||
__le32 firmware;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,73 @@
|
||||
From c50c8d104add5d3d4c9a8cf5de7aa26f3088cb38 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Tue, 29 Sep 2020 17:32:01 +0800
|
||||
Subject: [PATCH 036/283] net: hns3: add UDP segmentation offload support
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit 0692cfe94a760d17793d2e1c8ca2fe10118e55de
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0692cfe94a760d17793d2e1c8ca2fe10118e55de
|
||||
|
||||
--------------------------------
|
||||
|
||||
Add support for UDP segmentation offload to the HNS3 driver
|
||||
when the device can do it.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 21 ++++++++++++++-----
|
||||
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index f55dd10ab554..a06c01cd3efe 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -674,12 +674,19 @@ static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
|
||||
|
||||
/* normal or tunnel packet */
|
||||
l4_offset = l4.hdr - skb->data;
|
||||
- hdr_len = (l4.tcp->doff << 2) + l4_offset;
|
||||
|
||||
/* remove payload length from inner pseudo checksum when tso */
|
||||
l4_paylen = skb->len - l4_offset;
|
||||
- csum_replace_by_diff(&l4.tcp->check,
|
||||
- (__force __wsum)htonl(l4_paylen));
|
||||
+
|
||||
+ if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
|
||||
+ hdr_len = sizeof(*l4.udp) + l4_offset;
|
||||
+ csum_replace_by_diff(&l4.udp->check,
|
||||
+ (__force __wsum)htonl(l4_paylen));
|
||||
+ } else {
|
||||
+ hdr_len = (l4.tcp->doff << 2) + l4_offset;
|
||||
+ csum_replace_by_diff(&l4.tcp->check,
|
||||
+ (__force __wsum)htonl(l4_paylen));
|
||||
+ }
|
||||
|
||||
*send_bytes = (skb_shinfo(skb)->gso_segs - 1) * hdr_len + skb->len;
|
||||
|
||||
@@ -2425,8 +2432,12 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
}
|
||||
}
|
||||
|
||||
- if (hnae3_get_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B))
|
||||
- netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
+ if (test_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps)) {
|
||||
+ netdev->hw_features |= NETIF_F_GSO_UDP_L4;
|
||||
+ netdev->features |= NETIF_F_GSO_UDP_L4;
|
||||
+ netdev->vlan_features |= NETIF_F_GSO_UDP_L4;
|
||||
+ netdev->hw_enc_features |= NETIF_F_GSO_UDP_L4;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
From b86c90458d7f560c59dc9d7cd6bb15eb27c60e55 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Tue, 25 May 2021 15:30:01 +0000
|
||||
Subject: [PATCH 037/283] net: hns3: initialize the message content in
|
||||
hclge_get_link_mode()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 568a54bdf70b143f3e0befa298e22ad469ffc732
|
||||
category: cleanup
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=568a54bdf70b143f3e0befa298e22ad469ffc732
|
||||
|
||||
--------------------------------
|
||||
|
||||
[ Upstream commit 568a54bdf70b143f3e0befa298e22ad469ffc732 ]
|
||||
|
||||
The message sent to VF should be initialized, otherwise random
|
||||
value of some contents may cause improper processing by the target.
|
||||
So add a initialization to message in hclge_get_link_mode().
|
||||
|
||||
Fixes: 9194d18b0577 ("net: hns3: fix the problem that the supported port is empty")
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
Signed-off-by: Chen Jun <chenjun102@huawei.com>
|
||||
Acked-by: Weilong Chen <chenweilong@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
index 893f6e0ce473..ff283ac443e5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
@@ -583,7 +583,7 @@ static void hclge_get_link_mode(struct hclge_vport *vport,
|
||||
unsigned long advertising;
|
||||
unsigned long supported;
|
||||
unsigned long send_data;
|
||||
- u8 msg_data[10];
|
||||
+ u8 msg_data[10] = {};
|
||||
u8 dest_vfid;
|
||||
|
||||
memset(msg_data, 0, sizeof(msg_data));
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,343 @@
|
||||
From f697e257f1481fdbbc7d4ac580ee606d2ee760c5 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Fri, 16 Jul 2021 13:23:28 +0800
|
||||
Subject: [PATCH 038/283] net: hns3: add support for TX hardware checksum
|
||||
offload
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.11-rc1
|
||||
commit 66d52f3bf385c8d969e9ca6b281ddf773c9691d7
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=66d52f3bf385c8d969e9ca6b281ddf773c9691d7
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
For the device that supports TX hardware checksum, the hardware
|
||||
can calculate the checksum from the start and fill the checksum
|
||||
to the offset position, which reduces the operations of
|
||||
calculating the type and header length of L3/L4. So add this
|
||||
feature for the HNS3 ethernet driver.
|
||||
|
||||
The previous simple BD description is unsuitable, rename it as
|
||||
HW TX CSUM.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: li yongxin <liyongxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 6 +-
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 2 +-
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 63 +++++++++++++++----
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 10 ++-
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 2 +
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 2 +-
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 2 +
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 2 +-
|
||||
8 files changed, 71 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 7c00830b712e..509bf4f4de1d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -83,7 +83,7 @@ enum HNAE3_DEV_CAP_BITS {
|
||||
HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B,
|
||||
HNAE3_DEV_SUPPORT_PTP_B,
|
||||
HNAE3_DEV_SUPPORT_INT_QL_B,
|
||||
- HNAE3_DEV_SUPPORT_SIMPLE_BD_B,
|
||||
+ HNAE3_DEV_SUPPORT_HW_TX_CSUM_B,
|
||||
HNAE3_DEV_SUPPORT_TX_PUSH_B,
|
||||
HNAE3_DEV_SUPPORT_PHY_IMP_B,
|
||||
HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B,
|
||||
@@ -118,8 +118,8 @@ enum HNAE3_DEV_CAP_BITS {
|
||||
#define hnae3_dev_int_ql_supported(hdev) \
|
||||
test_bit(HNAE3_DEV_SUPPORT_INT_QL_B, (hdev)->ae_dev->caps)
|
||||
|
||||
-#define hnae3_dev_simple_bd_supported(hdev) \
|
||||
- test_bit(HNAE3_DEV_SUPPORT_SIMPLE_BD_B, (hdev)->ae_dev->caps)
|
||||
+#define hnae3_dev_hw_csum_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, (hdev)->ae_dev->caps)
|
||||
|
||||
#define hnae3_dev_tx_push_supported(hdev) \
|
||||
test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, (hdev)->ae_dev->caps)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index 8dbbf597d8a2..59d9dda8f325 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -684,7 +684,7 @@ static void hns3_dump_tx_bd_info(struct hns3_nic_priv *priv,
|
||||
le32_to_cpu(desc->tx.ol_type_vlan_len_msec));
|
||||
sprintf(result[j++], "%#x", le32_to_cpu(desc->tx.paylen));
|
||||
sprintf(result[j++], "%#x", le16_to_cpu(desc->tx.bdtp_fe_sc_vld_ra_ri));
|
||||
- sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.mss));
|
||||
+ sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.mss_hw_csum));
|
||||
}
|
||||
|
||||
static int hns3_dbg_tx_bd_info(struct hns3_dbg_data *d, char *buf, int len)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index a06c01cd3efe..3e3c5b27567e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -997,6 +997,22 @@ static int hns3_handle_vtags(struct hns3_enet_ring *tx_ring,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* check if the hardware is capable of checksum offloading */
|
||||
+static bool hns3_check_hw_tx_csum(struct sk_buff *skb)
|
||||
+{
|
||||
+ struct hns3_nic_priv *priv = netdev_priv(skb->dev);
|
||||
+
|
||||
+ /* Kindly note, due to backward compatibility of the TX descriptor,
|
||||
+ * HW checksum of the non-IP packets and GSO packets is handled at
|
||||
+ * different place in the following code
|
||||
+ */
|
||||
+ if (skb->csum_not_inet || skb_is_gso(skb) ||
|
||||
+ !test_bit(HNS3_NIC_STATE_HW_TX_CSUM_ENABLE, &priv->state))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
struct sk_buff *skb, struct hns3_desc *desc,
|
||||
struct hns3_desc_cb *desc_cb)
|
||||
@@ -1004,9 +1020,9 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
u32 ol_type_vlan_len_msec = 0;
|
||||
u32 type_cs_vlan_tso = 0;
|
||||
u32 paylen = skb->len;
|
||||
+ u16 mss_hw_csum = 0;
|
||||
u16 inner_vtag = 0;
|
||||
u16 out_vtag = 0;
|
||||
- u16 mss = 0;
|
||||
int ret;
|
||||
|
||||
ret = hns3_handle_vtags(ring, skb);
|
||||
@@ -1033,6 +1049,17 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
u8 ol4_proto, il4_proto;
|
||||
|
||||
+ if (hns3_check_hw_tx_csum(skb)) {
|
||||
+ /* set checksum start and offset, defined in 2 Bytes */
|
||||
+ hns3_set_field(type_cs_vlan_tso, HNS3_TXD_CSUM_START_S,
|
||||
+ skb_checksum_start_offset(skb) >> 1);
|
||||
+ hns3_set_field(ol_type_vlan_len_msec,
|
||||
+ HNS3_TXD_CSUM_OFFSET_S,
|
||||
+ skb->csum_offset >> 1);
|
||||
+ mss_hw_csum |= BIT(HNS3_TXD_HW_CS_B);
|
||||
+ goto out_hw_tx_csum;
|
||||
+ }
|
||||
+
|
||||
skb_reset_mac_len(skb);
|
||||
|
||||
ret = hns3_get_l4_protocol(skb, &ol4_proto, &il4_proto);
|
||||
@@ -1053,7 +1080,7 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = hns3_set_tso(skb, &paylen, &mss,
|
||||
+ ret = hns3_set_tso(skb, &paylen, &mss_hw_csum,
|
||||
&type_cs_vlan_tso, &desc_cb->send_bytes);
|
||||
if (unlikely(ret < 0)) {
|
||||
u64_stats_update_begin(&ring->syncp);
|
||||
@@ -1063,12 +1090,13 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
}
|
||||
}
|
||||
|
||||
+out_hw_tx_csum:
|
||||
/* Set txbd */
|
||||
desc->tx.ol_type_vlan_len_msec =
|
||||
cpu_to_le32(ol_type_vlan_len_msec);
|
||||
desc->tx.type_cs_vlan_tso_len = cpu_to_le32(type_cs_vlan_tso);
|
||||
desc->tx.paylen = cpu_to_le32(paylen);
|
||||
- desc->tx.mss = cpu_to_le16(mss);
|
||||
+ desc->tx.mss_hw_csum = cpu_to_le16(mss_hw_csum);
|
||||
desc->tx.vlan_tag = cpu_to_le16(inner_vtag);
|
||||
desc->tx.outer_vlan_tag = cpu_to_le16(out_vtag);
|
||||
|
||||
@@ -2383,8 +2411,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
|
||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
- netdev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
- NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
+ netdev->hw_enc_features |= NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC |
|
||||
@@ -2396,8 +2423,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
|
||||
#endif
|
||||
|
||||
- netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
- NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||
+ netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
|
||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
@@ -2405,16 +2431,15 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC |
|
||||
NETIF_F_FRAGLIST;
|
||||
|
||||
- netdev->vlan_features |=
|
||||
- NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
|
||||
+ netdev->vlan_features |= NETIF_F_RXCSUM |
|
||||
NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO |
|
||||
NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC |
|
||||
NETIF_F_FRAGLIST;
|
||||
|
||||
- netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
- NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||
+ netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX |
|
||||
+ NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
|
||||
@@ -2438,6 +2463,18 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
||||
netdev->vlan_features |= NETIF_F_GSO_UDP_L4;
|
||||
netdev->hw_enc_features |= NETIF_F_GSO_UDP_L4;
|
||||
}
|
||||
+
|
||||
+ if (test_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps)) {
|
||||
+ netdev->hw_features |= NETIF_F_HW_CSUM;
|
||||
+ netdev->features |= NETIF_F_HW_CSUM;
|
||||
+ netdev->vlan_features |= NETIF_F_HW_CSUM;
|
||||
+ netdev->hw_enc_features |= NETIF_F_HW_CSUM;
|
||||
+ } else {
|
||||
+ netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
+ netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
+ netdev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
+ netdev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
|
||||
@@ -4147,6 +4184,7 @@ static void hns3_state_uninit(struct hnae3_handle *handle)
|
||||
static int hns3_client_init(struct hnae3_handle *handle)
|
||||
{
|
||||
struct pci_dev *pdev = handle->pdev;
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
|
||||
u16 alloc_tqps, max_rss_size;
|
||||
struct hns3_nic_priv *priv;
|
||||
struct net_device *netdev;
|
||||
@@ -4243,6 +4281,9 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||
netdev->max_mtu = HNS3_MAX_MTU;
|
||||
#endif
|
||||
|
||||
+ if (test_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps))
|
||||
+ set_bit(HNS3_NIC_STATE_HW_TX_CSUM_ENABLE, &priv->state);
|
||||
+
|
||||
set_bit(HNS3_NIC_STATE_INITED, &priv->state);
|
||||
|
||||
ret = register_netdev(netdev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 0588642f906c..00a164343f0c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -18,6 +18,7 @@ enum hns3_nic_state {
|
||||
HNS3_NIC_STATE_SERVICE_INITED,
|
||||
HNS3_NIC_STATE_SERVICE_SCHED,
|
||||
HNS3_NIC_STATE2_RESET_REQUESTED,
|
||||
+ HNS3_NIC_STATE_HW_TX_CSUM_ENABLE,
|
||||
HNS3_NIC_STATE_MAX
|
||||
};
|
||||
|
||||
@@ -142,6 +143,9 @@ enum hns3_nic_state {
|
||||
#define HNS3_TXD_L4LEN_S 24
|
||||
#define HNS3_TXD_L4LEN_M (0xff << HNS3_TXD_L4LEN_S)
|
||||
|
||||
+#define HNS3_TXD_CSUM_START_S 8
|
||||
+#define HNS3_TXD_CSUM_START_M (0xffff << HNS3_TXD_CSUM_START_S)
|
||||
+
|
||||
#define HNS3_TXD_OL3T_S 0
|
||||
#define HNS3_TXD_OL3T_M (0x3 << HNS3_TXD_OL3T_S)
|
||||
#define HNS3_TXD_OVLAN_B 2
|
||||
@@ -149,6 +153,9 @@ enum hns3_nic_state {
|
||||
#define HNS3_TXD_TUNTYPE_S 4
|
||||
#define HNS3_TXD_TUNTYPE_M (0xf << HNS3_TXD_TUNTYPE_S)
|
||||
|
||||
+#define HNS3_TXD_CSUM_OFFSET_S 8
|
||||
+#define HNS3_TXD_CSUM_OFFSET_M (0xffff << HNS3_TXD_CSUM_OFFSET_S)
|
||||
+
|
||||
#define HNS3_TXD_BDTYPE_S 0
|
||||
#define HNS3_TXD_BDTYPE_M (0xf << HNS3_TXD_BDTYPE_S)
|
||||
#define HNS3_TXD_FE_B 4
|
||||
@@ -164,6 +171,7 @@ enum hns3_nic_state {
|
||||
|
||||
#define HNS3_TXD_MSS_S 0
|
||||
#define HNS3_TXD_MSS_M (0x3fff << HNS3_TXD_MSS_S)
|
||||
+#define HNS3_TXD_HW_CS_B 14
|
||||
|
||||
#define HNS3_VECTOR_TX_IRQ BIT_ULL(0)
|
||||
#define HNS3_VECTOR_RX_IRQ BIT_ULL(1)
|
||||
@@ -254,7 +262,7 @@ struct __packed hns3_desc {
|
||||
|
||||
__le32 paylen;
|
||||
__le16 bdtp_fe_sc_vld_ra_ri;
|
||||
- __le16 mss;
|
||||
+ __le16 mss_hw_csum;
|
||||
} tx;
|
||||
|
||||
struct {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index d1e963195259..1b986185d145 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -371,6 +371,8 @@ static void hclge_parse_capability(struct hclge_dev *hdev,
|
||||
set_bit(HNAE3_DEV_SUPPORT_INT_QL_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGE_CAP_TQP_TXRX_INDEP_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_HW_TX_CSUM_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps);
|
||||
}
|
||||
|
||||
static enum hclge_cmd_status
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index bd4238f3009c..ed737e7d740a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -375,7 +375,7 @@ enum HCLGE_CAP_BITS {
|
||||
HCLGE_CAP_FD_FORWARD_TC_B,
|
||||
HCLGE_CAP_PTP_B,
|
||||
HCLGE_CAP_INT_QL_B,
|
||||
- HCLGE_CAP_SIMPLE_BD_B,
|
||||
+ HCLGE_CAP_HW_TX_CSUM_B,
|
||||
HCLGE_CAP_TX_PUSH_B,
|
||||
HCLGE_CAP_PHY_IMP_B,
|
||||
HCLGE_CAP_TQP_TXRX_INDEP_B,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index d120211c3ef5..d0bbbf213d06 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -352,6 +352,8 @@ static void hclgevf_parse_capability(struct hclgevf_dev *hdev,
|
||||
set_bit(HNAE3_DEV_SUPPORT_INT_QL_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGEVF_CAP_TQP_TXRX_INDEP_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGEVF_CAP_HW_TX_CSUM_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps);
|
||||
}
|
||||
|
||||
static int hclgevf_cmd_query_version_and_capability(struct hclgevf_dev *hdev)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index 0d1690d9fecf..40632d8b6d79 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -148,7 +148,7 @@ enum HCLGEVF_CAP_BITS {
|
||||
HCLGEVF_CAP_FD_FORWARD_TC_B,
|
||||
HCLGEVF_CAP_PTP_B,
|
||||
HCLGEVF_CAP_INT_QL_B,
|
||||
- HCLGEVF_CAP_SIMPLE_BD_B,
|
||||
+ HCLGEVF_CAP_HW_TX_CSUM_B,
|
||||
HCLGEVF_CAP_TX_PUSH_B,
|
||||
HCLGEVF_CAP_PHY_IMP_B,
|
||||
HCLGEVF_CAP_TQP_TXRX_INDEP_B,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,272 @@
|
||||
From d2ce4553eb212e9b361ad185abdfb64e18c75c5c Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 17 Jun 2023 12:14:34 +0800
|
||||
Subject: [PATCH 039/283] net: hns3: add a structure for IR shaper's parameter
|
||||
in hclge_shaper_para_calc()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit ff7e4d0df83b8029ee42d3dea5d1939b1ff5446f
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ff7e4d0df83b8029ee42d3dea5d1939b1ff5446f
|
||||
|
||||
--------------------------------
|
||||
|
||||
As function hclge_shaper_para_calc() has too many arguments to add
|
||||
more, so encapsulate its three arguments ir_b, ir_u, ir_s into a
|
||||
structure.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 71 ++++++++++---------
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 6 ++
|
||||
2 files changed, 45 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
index f5b59c1c9435..b3564e38eba0 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
@@ -28,9 +28,8 @@ enum hclge_shaper_level {
|
||||
/* hclge_shaper_para_calc: calculate ir parameter for the shaper
|
||||
* @ir: Rate to be config, its unit is Mbps
|
||||
* @shaper_level: the shaper level. eg: port, pg, priority, queueset
|
||||
- * @ir_b: IR_B parameter of IR shaper
|
||||
- * @ir_u: IR_U parameter of IR shaper
|
||||
- * @ir_s: IR_S parameter of IR shaper
|
||||
+ * @ir_para: parameters of IR shaper
|
||||
+ * @max_tm_rate: max tm rate is available to config
|
||||
*
|
||||
* the formula:
|
||||
*
|
||||
@@ -41,7 +40,7 @@ enum hclge_shaper_level {
|
||||
* @return: 0: calculate sucessful, negative: fail
|
||||
*/
|
||||
static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
- u8 *ir_b, u8 *ir_u, u8 *ir_s)
|
||||
+ struct hclge_shaper_ir_para *ir_para)
|
||||
{
|
||||
#define DIVISOR_CLK (1000 * 8)
|
||||
#define DIVISOR_IR_B_126 (126 * DIVISOR_CLK)
|
||||
@@ -74,10 +73,10 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
ir_calc = (DIVISOR_IR_B_126 + (tick >> 1) - 1) / tick;
|
||||
|
||||
if (ir_calc == ir) {
|
||||
- *ir_b = 126;
|
||||
- *ir_u = 0;
|
||||
- *ir_s = 0;
|
||||
-
|
||||
+ ir_para->ir_b = 126;
|
||||
+ ir_para->ir_u = 0;
|
||||
+ ir_para->ir_s = 0;
|
||||
+
|
||||
return 0;
|
||||
} else if (ir_calc > ir) {
|
||||
/* Increasing the denominator to select ir_s value */
|
||||
@@ -85,9 +84,9 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
ir_s_calc++;
|
||||
ir_calc = DIVISOR_IR_B_126 / (tick * (1 << ir_s_calc));
|
||||
}
|
||||
+ ir_para->ir_b = (ir * tick * (1 << ir_s_calc) +
|
||||
+ (DIVISOR_CLK >> 1)) / DIVISOR_CLK;
|
||||
|
||||
- *ir_b = (ir * tick * (1 << ir_s_calc) + (DIVISOR_CLK >> 1)) /
|
||||
- DIVISOR_CLK;
|
||||
} else {
|
||||
/* Increasing the numerator to select ir_u value */
|
||||
u32 numerator;
|
||||
@@ -99,15 +98,16 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
}
|
||||
|
||||
if (ir_calc == ir) {
|
||||
- *ir_b = 126;
|
||||
+ ir_para->ir_b = 126;
|
||||
} else {
|
||||
u32 denominator = DIVISOR_CLK * (1 << --ir_u_calc);
|
||||
- *ir_b = (ir * tick + (denominator >> 1)) / denominator;
|
||||
+ ir_para->ir_b = (ir * tick + (denominator >> 1)) /
|
||||
+ denominator;
|
||||
}
|
||||
}
|
||||
|
||||
- *ir_u = ir_u_calc;
|
||||
- *ir_s = ir_s_calc;
|
||||
+ ir_para->ir_u = ir_u_calc;
|
||||
+ ir_para->ir_s = ir_s_calc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -400,21 +400,21 @@ static int hclge_tm_pg_shapping_cfg(struct hclge_dev *hdev,
|
||||
static int hclge_tm_port_shaper_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_port_shapping_cmd *shap_cfg_cmd;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
struct hclge_desc desc;
|
||||
- u8 ir_u, ir_b, ir_s;
|
||||
u32 shapping_para;
|
||||
int ret;
|
||||
|
||||
- ret = hclge_shaper_para_calc(hdev->hw.mac.speed,
|
||||
- HCLGE_SHAPER_LVL_PORT,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ ret = hclge_shaper_para_calc(hdev->hw.mac.speed, HCLGE_SHAPER_LVL_PORT,
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TM_PORT_SHAPPING, false);
|
||||
shap_cfg_cmd = (struct hclge_port_shapping_cmd *)desc.data;
|
||||
|
||||
- shapping_para = hclge_tm_get_shapping_para(ir_b, ir_u, ir_s,
|
||||
+ shapping_para = hclge_tm_get_shapping_para(ir_para.ir_b, ir_para.ir_u,
|
||||
+ ir_para.ir_s,
|
||||
HCLGE_SHAPER_BS_U_DEF,
|
||||
HCLGE_SHAPER_BS_S_DEF);
|
||||
|
||||
@@ -515,6 +515,7 @@ int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate)
|
||||
{
|
||||
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
|
||||
struct hclge_qs_shapping_cmd *shap_cfg_cmd;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_desc desc;
|
||||
u8 ir_b, ir_u, ir_s;
|
||||
@@ -525,11 +526,12 @@ int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate)
|
||||
max_tx_rate = HCLGE_ETHER_MAX_RATE;
|
||||
|
||||
ret = hclge_shaper_para_calc(max_tx_rate, HCLGE_SHAPER_LVL_QSET,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- shaper_para = hclge_tm_get_shapping_para(ir_b, ir_u, ir_s,
|
||||
+ shaper_para = hclge_tm_get_shapping_para(ir_para.ir_b, ir_para.ir_u,
|
||||
+ ir_para.ir_s,
|
||||
HCLGE_SHAPER_BS_U_DEF,
|
||||
HCLGE_SHAPER_BS_S_DEF);
|
||||
|
||||
@@ -754,7 +756,7 @@ static int hclge_tm_pg_to_pri_map(struct hclge_dev *hdev)
|
||||
|
||||
static int hclge_tm_pg_shaper_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
- u8 ir_u, ir_b, ir_s;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
u32 shaper_para;
|
||||
int ret;
|
||||
u32 i;
|
||||
@@ -769,7 +771,7 @@ static int hclge_tm_pg_shaper_cfg(struct hclge_dev *hdev)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.pg_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_PG,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -782,7 +784,9 @@ static int hclge_tm_pg_shaper_cfg(struct hclge_dev *hdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- shaper_para = hclge_tm_get_shapping_para(ir_b, ir_u, ir_s,
|
||||
+ shaper_para = hclge_tm_get_shapping_para(ir_para.ir_b,
|
||||
+ ir_para.ir_u,
|
||||
+ ir_para.ir_s,
|
||||
HCLGE_SHAPER_BS_U_DEF,
|
||||
HCLGE_SHAPER_BS_S_DEF);
|
||||
ret = hclge_tm_pg_shapping_cfg(hdev,
|
||||
@@ -885,7 +889,7 @@ static int hclge_tm_pri_q_qs_cfg(struct hclge_dev *hdev)
|
||||
|
||||
static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
- u8 ir_u, ir_b, ir_s;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
u32 shaper_para;
|
||||
int ret;
|
||||
u32 i;
|
||||
@@ -894,7 +898,7 @@ static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.tc_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_PRI,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -906,7 +910,9 @@ static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- shaper_para = hclge_tm_get_shapping_para(ir_b, ir_u, ir_s,
|
||||
+ shaper_para = hclge_tm_get_shapping_para(ir_para.ir_b,
|
||||
+ ir_para.ir_u,
|
||||
+ ir_para.ir_s,
|
||||
HCLGE_SHAPER_BS_U_DEF,
|
||||
HCLGE_SHAPER_BS_S_DEF);
|
||||
ret = hclge_tm_pri_shapping_cfg(hdev, HCLGE_TM_SHAP_P_BUCKET, i,
|
||||
@@ -921,12 +927,12 @@ static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
static int hclge_tm_pri_vnet_base_shaper_pri_cfg(struct hclge_vport *vport)
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
- u8 ir_u, ir_b, ir_s;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
u32 shaper_para;
|
||||
int ret;
|
||||
|
||||
ret = hclge_shaper_para_calc(vport->bw_limit, HCLGE_SHAPER_LVL_VF,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -938,7 +944,8 @@ static int hclge_tm_pri_vnet_base_shaper_pri_cfg(struct hclge_vport *vport)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- shaper_para = hclge_tm_get_shapping_para(ir_b, ir_u, ir_s,
|
||||
+ shaper_para = hclge_tm_get_shapping_para(ir_para.ir_b, ir_para.ir_u,
|
||||
+ ir_para.ir_s,
|
||||
HCLGE_SHAPER_BS_U_DEF,
|
||||
HCLGE_SHAPER_BS_S_DEF);
|
||||
ret = hclge_tm_pri_shapping_cfg(hdev, HCLGE_TM_SHAP_P_BUCKET,
|
||||
@@ -953,7 +960,7 @@ static int hclge_tm_pri_vnet_base_shaper_qs_cfg(struct hclge_vport *vport)
|
||||
{
|
||||
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
- u8 ir_u, ir_b, ir_s;
|
||||
+ struct hclge_shaper_ir_para ir_para;
|
||||
u32 i;
|
||||
int ret;
|
||||
|
||||
@@ -961,7 +968,7 @@ static int hclge_tm_pri_vnet_base_shaper_qs_cfg(struct hclge_vport *vport)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.tc_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_QSET,
|
||||
- &ir_b, &ir_u, &ir_s);
|
||||
+ &ir_para);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
index f172ce32af20..f2dfffbba8c8 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
@@ -166,6 +166,12 @@ struct hclge_tm_shaper_para {
|
||||
u8 flag;
|
||||
};
|
||||
|
||||
+struct hclge_shaper_ir_para {
|
||||
+ u8 ir_b; /* IR_B parameter of IR shaper */
|
||||
+ u8 ir_u; /* IR_U parameter of IR shaper */
|
||||
+ u8 ir_s; /* IR_S parameter of IR shaper */
|
||||
+};
|
||||
+
|
||||
#define hclge_tm_set_field(dest, string, val) \
|
||||
hnae3_set_field((dest), \
|
||||
(HCLGE_TM_SHAP_##string##_MSK), \
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,89 @@
|
||||
From cfcca4d7c0378e05efb0d33a5f9e5af32e76194c Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:23 +0800
|
||||
Subject: [PATCH 040/283] net: hns3: remove the shaper param magic number
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 9d2a1cea6997ecd4f05833dfffb9907ffaa41bf5
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9d2a1cea6997ecd4f05833dfffb9907ffaa41bf5
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To make the code more readable, this patch adds a definition for
|
||||
the magic number 126 used for the default shaper param ir_b, and
|
||||
rename macro DIVISOR_IR_B_126.
|
||||
|
||||
No functional change.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
index b3564e38eba0..14e8a93bdc31 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
@@ -42,8 +42,9 @@ enum hclge_shaper_level {
|
||||
static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
struct hclge_shaper_ir_para *ir_para)
|
||||
{
|
||||
+#define DEFAULT_SHAPER_IR_B 126
|
||||
#define DIVISOR_CLK (1000 * 8)
|
||||
-#define DIVISOR_IR_B_126 (126 * DIVISOR_CLK)
|
||||
+#define DEFAULT_DIVISOR_IR_B (DEFAULT_SHAPER_IR_B * DIVISOR_CLK)
|
||||
|
||||
static const u16 tick_array[HCLGE_SHAPER_LVL_CNT] = {
|
||||
6 * 256, /* Prioriy level */
|
||||
@@ -70,10 +71,10 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
* ir_calc = ---------------- * 1000
|
||||
* tick * 1
|
||||
*/
|
||||
- ir_calc = (DIVISOR_IR_B_126 + (tick >> 1) - 1) / tick;
|
||||
+ ir_calc = (DEFAULT_DIVISOR_IR_B + (tick >> 1) - 1) / tick;
|
||||
|
||||
if (ir_calc == ir) {
|
||||
- ir_para->ir_b = 126;
|
||||
+ ir_para->ir_b = DEFAULT_SHAPER_IR_B;
|
||||
ir_para->ir_u = 0;
|
||||
ir_para->ir_s = 0;
|
||||
|
||||
@@ -82,7 +83,8 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
/* Increasing the denominator to select ir_s value */
|
||||
while (ir_calc >= ir && ir) {
|
||||
ir_s_calc++;
|
||||
- ir_calc = DIVISOR_IR_B_126 / (tick * (1 << ir_s_calc));
|
||||
+ ir_calc = DEFAULT_DIVISOR_IR_B /
|
||||
+ (tick * (1 << ir_s_calc));
|
||||
}
|
||||
ir_para->ir_b = (ir * tick * (1 << ir_s_calc) +
|
||||
(DIVISOR_CLK >> 1)) / DIVISOR_CLK;
|
||||
@@ -93,12 +95,12 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
|
||||
while (ir_calc < ir) {
|
||||
ir_u_calc++;
|
||||
- numerator = DIVISOR_IR_B_126 * (1 << ir_u_calc);
|
||||
+ numerator = DEFAULT_DIVISOR_IR_B * (1 << ir_u_calc);
|
||||
ir_calc = (numerator + (tick >> 1)) / tick;
|
||||
}
|
||||
|
||||
if (ir_calc == ir) {
|
||||
- ir_para->ir_b = 126;
|
||||
+ ir_para->ir_b = DEFAULT_SHAPER_IR_B;
|
||||
} else {
|
||||
u32 denominator = DIVISOR_CLK * (1 << --ir_u_calc);
|
||||
ir_para->ir_b = (ir * tick + (denominator >> 1)) /
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,196 @@
|
||||
From a52f2923c4b1884ad5ac32d962c54c91d0648eac Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:24 +0800
|
||||
Subject: [PATCH 041/283] net: hns3: clean up unnecessary parentheses in macro
|
||||
definitions
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 9393eb5034a040931120f9c6eed9bf0e78029192
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9393eb5034a040931120f9c6eed9bf0e78029192
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
In macro definitions, parentheses are unnecessary in some cases,
|
||||
such as the calling parameter of a function, the left variable
|
||||
of the equal sign, and so on. So remove these unnecessary
|
||||
parentheses according to these rules.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 6 +++---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 4 ++--
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 10 +++++-----
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 ++--
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 2 +-
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 6 +++---
|
||||
.../net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h | 4 ++--
|
||||
7 files changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 509bf4f4de1d..eef5f7a5eb63 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -317,7 +317,7 @@ struct hnae3_ring_chain_node {
|
||||
};
|
||||
|
||||
#define HNAE3_IS_TX_RING(node) \
|
||||
- (((node)->flag & (1 << HNAE3_RING_TYPE_B)) == HNAE3_RING_TYPE_TX)
|
||||
+ (((node)->flag & 1 << HNAE3_RING_TYPE_B) == HNAE3_RING_TYPE_TX)
|
||||
|
||||
struct hnae3_client_ops {
|
||||
int (*init_instance)(struct hnae3_handle *handle);
|
||||
@@ -832,9 +832,9 @@ struct hnae3_handle {
|
||||
#define hnae3_get_field(origin, mask, shift) (((origin) & (mask)) >> (shift))
|
||||
|
||||
#define hnae3_set_bit(origin, shift, val) \
|
||||
- hnae3_set_field((origin), (0x1 << (shift)), (shift), (val))
|
||||
+ hnae3_set_field(origin, 0x1 << (shift), shift, val)
|
||||
#define hnae3_get_bit(origin, shift) \
|
||||
- hnae3_get_field((origin), (0x1 << (shift)), (shift))
|
||||
+ hnae3_get_field(origin, 0x1 << (shift), shift)
|
||||
|
||||
int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
|
||||
void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 3e3c5b27567e..d2284ce2c250 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -31,8 +31,8 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "hns3_trace.h"
|
||||
|
||||
-#define hns3_set_field(origin, shift, val) ((origin) |= ((val) << (shift)))
|
||||
-#define hns3_tx_bd_count(S) DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE)
|
||||
+#define hns3_set_field(origin, shift, val) ((origin) |= (val) << (shift))
|
||||
+#define hns3_tx_bd_count(S) DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE)
|
||||
|
||||
#define hns3_rl_err(fmt, ...) \
|
||||
do { \
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 00a164343f0c..c337e4dbe2c6 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -548,7 +548,7 @@ static inline void hns3_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
}
|
||||
|
||||
#define hns3_read_dev(a, reg) \
|
||||
- hns3_read_reg((a)->io_base, (reg))
|
||||
+ hns3_read_reg((a)->io_base, reg)
|
||||
|
||||
static inline bool hns3_nic_resetting(struct net_device *netdev)
|
||||
{
|
||||
@@ -558,7 +558,7 @@ static inline bool hns3_nic_resetting(struct net_device *netdev)
|
||||
}
|
||||
|
||||
#define hns3_write_dev(a, reg, value) \
|
||||
- hns3_write_reg((a)->io_base, (reg), (value))
|
||||
+ hns3_write_reg((a)->io_base, reg, value)
|
||||
|
||||
#define ring_to_dev(ring) ((ring)->dev)
|
||||
|
||||
@@ -589,15 +589,15 @@ static inline unsigned int hns3_page_order(struct hns3_enet_ring *ring)
|
||||
|
||||
/* iterator for handling rings in ring group */
|
||||
#define hns3_for_each_ring(pos, head) \
|
||||
- for (pos = (head).ring; pos; pos = pos->next)
|
||||
+ for (pos = (head).ring; (pos); pos = (pos)->next)
|
||||
|
||||
#define hns3_get_handle(ndev) \
|
||||
(((struct hns3_nic_priv *)netdev_priv(ndev))->ae_handle)
|
||||
|
||||
-#define hns3_gl_usec_to_reg(int_gl) (int_gl >> 1)
|
||||
+#define hns3_gl_usec_to_reg(int_gl) ((int_gl) >> 1)
|
||||
#define hns3_gl_round_down(int_gl) round_down(int_gl, 2)
|
||||
|
||||
-#define hns3_rl_usec_to_reg(int_rl) (int_rl >> 2)
|
||||
+#define hns3_rl_usec_to_reg(int_rl) ((int_rl) >> 2)
|
||||
#define hns3_rl_round_down(int_rl) round_down(int_rl, 4)
|
||||
|
||||
void hns3_ethtool_set_ops(struct net_device *netdev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index ed737e7d740a..e6727366028e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -1132,9 +1132,9 @@ static inline void hclge_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
}
|
||||
|
||||
#define hclge_write_dev(a, reg, value) \
|
||||
- hclge_write_reg((a)->io_base, (reg), (value))
|
||||
+ hclge_write_reg((a)->io_base, reg, value)
|
||||
#define hclge_read_dev(a, reg) \
|
||||
- hclge_read_reg((a)->io_base, (reg))
|
||||
+ hclge_read_reg((a)->io_base, reg)
|
||||
|
||||
static inline u32 hclge_read_reg(u8 __iomem *base, u32 reg)
|
||||
{
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index c5cad1122788..cd98f4821641 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -743,7 +743,7 @@ struct hclge_vf_vlan_cfg {
|
||||
* x = (~k) & v
|
||||
* y = (k ^ ~v) & k
|
||||
*/
|
||||
-#define calc_x(x, k, v) ((x) = (~(k) & (v)))
|
||||
+#define calc_x(x, k, v) (x = ~(k) & (v))
|
||||
#define calc_y(y, k, v) \
|
||||
do { \
|
||||
const typeof(k) _k_ = (k); \
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
index f2dfffbba8c8..f4fb9c7e9c5f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
/* SP or DWRR */
|
||||
#define HCLGE_TM_TX_SCHD_DWRR_MSK BIT(0)
|
||||
-#define HCLGE_TM_TX_SCHD_SP_MSK (0xFE)
|
||||
+#define HCLGE_TM_TX_SCHD_SP_MSK 0xFE
|
||||
|
||||
#define HCLGE_TM_PF_MAX_PRI_NUM 8
|
||||
#define HCLGE_TM_PF_MAX_QSET_NUM 8
|
||||
@@ -177,8 +177,8 @@ struct hclge_shaper_ir_para {
|
||||
(HCLGE_TM_SHAP_##string##_MSK), \
|
||||
(HCLGE_TM_SHAP_##string##_LSH), val)
|
||||
#define hclge_tm_get_field(src, string) \
|
||||
- hnae3_get_field((src), (HCLGE_TM_SHAP_##string##_MSK), \
|
||||
- (HCLGE_TM_SHAP_##string##_LSH))
|
||||
+ hnae3_get_field((src), HCLGE_TM_SHAP_##string##_MSK, \
|
||||
+ HCLGE_TM_SHAP_##string##_LSH)
|
||||
|
||||
int hclge_tm_schd_init(struct hclge_dev *hdev);
|
||||
int hclge_tm_vport_map_update(struct hclge_dev *hdev);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index 40632d8b6d79..cb502d88af5f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -286,9 +286,9 @@ static inline u32 hclgevf_read_reg(u8 __iomem *base, u32 reg)
|
||||
}
|
||||
|
||||
#define hclgevf_write_dev(a, reg, value) \
|
||||
- hclgevf_write_reg((a)->io_base, (reg), (value))
|
||||
+ hclgevf_write_reg((a)->io_base, reg, value)
|
||||
#define hclgevf_read_dev(a, reg) \
|
||||
- hclgevf_read_reg((a)->io_base, (reg))
|
||||
+ hclgevf_read_reg((a)->io_base, reg)
|
||||
|
||||
#define HCLGEVF_SEND_SYNC(flag) \
|
||||
((flag) & HCLGEVF_CMD_FLAG_NO_INTR)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 2c11c385ef2ec0799953db5568a81a6d70bc8002 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:26 +0800
|
||||
Subject: [PATCH 042/283] net: hns3: change hclge_parse_speed() param type
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 6e7f109ee9d8ed94a8c403e4daf34e752602148b
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6e7f109ee9d8ed94a8c403e4daf34e752602148b
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
The type of parameters in hclge_parse_speed() should be
|
||||
unsigned type, so change them.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 307907896ff4..a7fa93715f73 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -939,7 +939,7 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hclge_parse_speed(int speed_cmd, int *speed)
|
||||
+static int hclge_parse_speed(u8 speed_cmd, u32 *speed)
|
||||
{
|
||||
switch (speed_cmd) {
|
||||
case 6:
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,56 @@
|
||||
From 789c7d8513f196c27f42ef08e98719743c0d95bb Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:27 +0800
|
||||
Subject: [PATCH 043/283] net: hns3: change hclge_query_bd_num() param type
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit cad8dfe82a9eb8d889cc550ceb8e61112376ae6f
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cad8dfe82a9eb8d889cc550ceb8e61112376ae6f
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
The type of parameter mpf_bd_num and pf_bd_num in
|
||||
hclge_query_bd_num() should be u32* instead of int*,
|
||||
so change them.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 55990ba4b30e..9265243fbb84 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -1074,7 +1074,7 @@ static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en)
|
||||
* This function querys number of mpf and pf buffer descriptors.
|
||||
*/
|
||||
static int hclge_query_bd_num(struct hclge_dev *hdev, bool is_ras,
|
||||
- int *mpf_bd_num, int *pf_bd_num)
|
||||
+ u32 *mpf_bd_num, u32 *pf_bd_num)
|
||||
{
|
||||
struct device *dev = &hdev->pdev->dev;
|
||||
u32 mpf_min_bd_num, pf_min_bd_num;
|
||||
@@ -1103,7 +1103,7 @@ static int hclge_query_bd_num(struct hclge_dev *hdev, bool is_ras,
|
||||
*mpf_bd_num = le32_to_cpu(desc_bd.data[0]);
|
||||
*pf_bd_num = le32_to_cpu(desc_bd.data[1]);
|
||||
if (*mpf_bd_num < mpf_min_bd_num || *pf_bd_num < pf_min_bd_num) {
|
||||
- dev_err(dev, "Invalid bd num: mpf(%d), pf(%d)\n",
|
||||
+ dev_err(dev, "Invalid bd num: mpf(%u), pf(%u)\n",
|
||||
*mpf_bd_num, *pf_bd_num);
|
||||
return -EINVAL;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
65
patches/0405-net-hns3-remove-unused-macro-definition.patch
Normal file
65
patches/0405-net-hns3-remove-unused-macro-definition.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From 7ae37b7ed54610c699e1c217f6cec32a2cf11ce7 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:30 +0800
|
||||
Subject: [PATCH 044/283] net: hns3: remove unused macro definition
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 7ceb40b8207ea4aefed96c6dd22625b93aa121f9
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7ceb40b8207ea4aefed96c6dd22625b93aa121f9
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Some macros are defined but unused, so remove them.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 3 ---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h | 1 -
|
||||
2 files changed, 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index cd98f4821641..138358b3b16b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -44,15 +44,12 @@
|
||||
#define HCLGE_CMDQ_RX_DEPTH_REG 0x27020
|
||||
#define HCLGE_CMDQ_RX_TAIL_REG 0x27024
|
||||
#define HCLGE_CMDQ_RX_HEAD_REG 0x27028
|
||||
-#define HCLGE_CMDQ_INTR_SRC_REG 0x27100
|
||||
#define HCLGE_CMDQ_INTR_STS_REG 0x27104
|
||||
#define HCLGE_CMDQ_INTR_EN_REG 0x27108
|
||||
#define HCLGE_CMDQ_INTR_GEN_REG 0x2710C
|
||||
|
||||
/* bar registers for common func */
|
||||
#define HCLGE_VECTOR0_OTER_EN_REG 0x20600
|
||||
-#define HCLGE_RAS_OTHER_STS_REG 0x20B00
|
||||
-#define HCLGE_FUNC_RESET_STS_REG 0x20C00
|
||||
#define HCLGE_GRO_EN_REG 0x28000
|
||||
|
||||
/* bar registers for rcb */
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index cb502d88af5f..7d021cb394c5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -269,7 +269,6 @@ struct hclgevf_cfg_tx_queue_pointer_cmd {
|
||||
|
||||
#define HCLGEVF_NIC_CMQ_DESC_NUM 1024
|
||||
#define HCLGEVF_NIC_CMQ_DESC_NUM_S 3
|
||||
-#define HCLGEVF_NIC_CMDQ_INT_SRC_REG 0x27100
|
||||
|
||||
#define HCLGEVF_RING_BASEADDR_SHIFT 32
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,102 @@
|
||||
From c01583344fb7e63df204849214c1a8da0c033e03 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:33 +0800
|
||||
Subject: [PATCH 045/283] net: hns3: refactor out hclge_cmd_convert_err_code()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 1c9a98b0ba1f16490ea0d492a1cd606f3a4b1bee
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1c9a98b0ba1f16490ea0d492a1cd606f3a4b1bee
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To improve code readability and maintainability, refactor
|
||||
hclge_cmd_convert_err_code() with an array of imp_errcode
|
||||
and common_errno mapping, instead of a bloated switch/case.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 55 +++++++++----------
|
||||
1 file changed, 27 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 1b986185d145..5f0c645eb292 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -205,36 +205,35 @@ static bool hclge_is_special_opcode(u16 opcode)
|
||||
return false;
|
||||
}
|
||||
|
||||
+struct errcode {
|
||||
+ u32 imp_errcode;
|
||||
+ int common_errno;
|
||||
+};
|
||||
+
|
||||
static int hclge_cmd_convert_err_code(u16 desc_ret)
|
||||
{
|
||||
- switch (desc_ret) {
|
||||
- case HCLGE_CMD_EXEC_SUCCESS:
|
||||
- return 0;
|
||||
- case HCLGE_CMD_NO_AUTH:
|
||||
- return -EPERM;
|
||||
- case HCLGE_CMD_NOT_SUPPORTED:
|
||||
- return -EOPNOTSUPP;
|
||||
- case HCLGE_CMD_QUEUE_FULL:
|
||||
- return -EXFULL;
|
||||
- case HCLGE_CMD_NEXT_ERR:
|
||||
- return -ENOSR;
|
||||
- case HCLGE_CMD_UNEXE_ERR:
|
||||
- return -ENOTBLK;
|
||||
- case HCLGE_CMD_PARA_ERR:
|
||||
- return -EINVAL;
|
||||
- case HCLGE_CMD_RESULT_ERR:
|
||||
- return -ERANGE;
|
||||
- case HCLGE_CMD_TIMEOUT:
|
||||
- return -ETIME;
|
||||
- case HCLGE_CMD_HILINK_ERR:
|
||||
- return -ENOLINK;
|
||||
- case HCLGE_CMD_QUEUE_ILLEGAL:
|
||||
- return -ENXIO;
|
||||
- case HCLGE_CMD_INVALID:
|
||||
- return -EBADR;
|
||||
- default:
|
||||
- return -EIO;
|
||||
- }
|
||||
+ struct errcode hclge_cmd_errcode[] = {
|
||||
+ {HCLGE_CMD_EXEC_SUCCESS, 0},
|
||||
+ {HCLGE_CMD_NO_AUTH, -EPERM},
|
||||
+ {HCLGE_CMD_NOT_SUPPORTED, -EOPNOTSUPP},
|
||||
+ {HCLGE_CMD_QUEUE_FULL, -EXFULL},
|
||||
+ {HCLGE_CMD_NEXT_ERR, -ENOSR},
|
||||
+ {HCLGE_CMD_UNEXE_ERR, -ENOTBLK},
|
||||
+ {HCLGE_CMD_PARA_ERR, -EINVAL},
|
||||
+ {HCLGE_CMD_RESULT_ERR, -ERANGE},
|
||||
+ {HCLGE_CMD_TIMEOUT, -ETIME},
|
||||
+ {HCLGE_CMD_HILINK_ERR, -ENOLINK},
|
||||
+ {HCLGE_CMD_QUEUE_ILLEGAL, -ENXIO},
|
||||
+ {HCLGE_CMD_INVALID, -EBADR},
|
||||
+ };
|
||||
+ u32 errcode_count = ARRAY_SIZE(hclge_cmd_errcode);
|
||||
+ u32 i;
|
||||
+
|
||||
+ for (i = 0; i < errcode_count; i++)
|
||||
+ if (hclge_cmd_errcode[i].imp_errcode == desc_ret)
|
||||
+ return hclge_cmd_errcode[i].common_errno;
|
||||
+
|
||||
+ return -EIO;
|
||||
}
|
||||
|
||||
static int hclge_cmd_check_retval(struct hclge_hw *hw, struct hclge_desc *desc,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,103 @@
|
||||
From 1bf6959cfefbdfa21139f1e04bbc36bdffcdeaa9 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:34 +0800
|
||||
Subject: [PATCH 046/283] net: hns3: refactor out
|
||||
hclgevf_cmd_convert_err_code()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 433e2802775c370604b74378c00977b86623fa12
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=433e2802775c370604b74378c00977b86623fa12
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To improve code readability and maintainability, refactor
|
||||
hclgevf_cmd_convert_err_code() with an array of imp_errcode
|
||||
and common_errno mapping, instead of a bloated switch/case.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 55 +++++++++----------
|
||||
1 file changed, 27 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index d0bbbf213d06..a09b63a031a5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -192,36 +192,35 @@ void hclgevf_cmd_setup_basic_desc(struct hclgevf_desc *desc,
|
||||
desc->flag &= cpu_to_le16(~HCLGEVF_CMD_FLAG_WR);
|
||||
}
|
||||
|
||||
+struct vf_errcode {
|
||||
+ u32 imp_errcode;
|
||||
+ int common_errno;
|
||||
+};
|
||||
+
|
||||
static int hclgevf_cmd_convert_err_code(u16 desc_ret)
|
||||
{
|
||||
- switch (desc_ret) {
|
||||
- case HCLGEVF_CMD_EXEC_SUCCESS:
|
||||
- return 0;
|
||||
- case HCLGEVF_CMD_NO_AUTH:
|
||||
- return -EPERM;
|
||||
- case HCLGEVF_CMD_NOT_SUPPORTED:
|
||||
- return -EOPNOTSUPP;
|
||||
- case HCLGEVF_CMD_QUEUE_FULL:
|
||||
- return -EXFULL;
|
||||
- case HCLGEVF_CMD_NEXT_ERR:
|
||||
- return -ENOSR;
|
||||
- case HCLGEVF_CMD_UNEXE_ERR:
|
||||
- return -ENOTBLK;
|
||||
- case HCLGEVF_CMD_PARA_ERR:
|
||||
- return -EINVAL;
|
||||
- case HCLGEVF_CMD_RESULT_ERR:
|
||||
- return -ERANGE;
|
||||
- case HCLGEVF_CMD_TIMEOUT:
|
||||
- return -ETIME;
|
||||
- case HCLGEVF_CMD_HILINK_ERR:
|
||||
- return -ENOLINK;
|
||||
- case HCLGEVF_CMD_QUEUE_ILLEGAL:
|
||||
- return -ENXIO;
|
||||
- case HCLGEVF_CMD_INVALID:
|
||||
- return -EBADR;
|
||||
- default:
|
||||
- return -EIO;
|
||||
- }
|
||||
+ struct vf_errcode hclgevf_cmd_errcode[] = {
|
||||
+ {HCLGEVF_CMD_EXEC_SUCCESS, 0},
|
||||
+ {HCLGEVF_CMD_NO_AUTH, -EPERM},
|
||||
+ {HCLGEVF_CMD_NOT_SUPPORTED, -EOPNOTSUPP},
|
||||
+ {HCLGEVF_CMD_QUEUE_FULL, -EXFULL},
|
||||
+ {HCLGEVF_CMD_NEXT_ERR, -ENOSR},
|
||||
+ {HCLGEVF_CMD_UNEXE_ERR, -ENOTBLK},
|
||||
+ {HCLGEVF_CMD_PARA_ERR, -EINVAL},
|
||||
+ {HCLGEVF_CMD_RESULT_ERR, -ERANGE},
|
||||
+ {HCLGEVF_CMD_TIMEOUT, -ETIME},
|
||||
+ {HCLGEVF_CMD_HILINK_ERR, -ENOLINK},
|
||||
+ {HCLGEVF_CMD_QUEUE_ILLEGAL, -ENXIO},
|
||||
+ {HCLGEVF_CMD_INVALID, -EBADR},
|
||||
+ };
|
||||
+ u32 errcode_count = ARRAY_SIZE(hclgevf_cmd_errcode);
|
||||
+ u32 i;
|
||||
+
|
||||
+ for (i = 0; i < errcode_count; i++)
|
||||
+ if (hclgevf_cmd_errcode[i].imp_errcode == desc_ret)
|
||||
+ return hclgevf_cmd_errcode[i].common_errno;
|
||||
+
|
||||
+ return -EIO;
|
||||
}
|
||||
|
||||
/* hclgevf_cmd_send - send command to command queue
|
||||
--
|
||||
2.34.1
|
||||
|
||||
74
patches/0408-net-hns3-use-ipv6_addr_any-helper.patch
Normal file
74
patches/0408-net-hns3-use-ipv6_addr_any-helper.patch
Normal file
@ -0,0 +1,74 @@
|
||||
From 7fbc8c268682d044347f911c7df4723ff237809b Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:36 +0800
|
||||
Subject: [PATCH 047/283] net: hns3: use ipv6_addr_any() helper
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit eaede835675cbae3b84309255f81e9a5e1b502a2
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=eaede835675cbae3b84309255f81e9a5e1b502a2
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Use common ipv6_addr_any() to determine if an addr is ipv6 any addr.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 13 +++++--------
|
||||
1 file changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index a7fa93715f73..f4421e6861cb 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/crash_dump.h>
|
||||
+#include <net/ipv6.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include "kcompat.h"
|
||||
#include "hclge_cmd.h"
|
||||
@@ -5426,12 +5427,10 @@ static int hclge_fd_check_tcpip6_tuple(struct ethtool_tcpip6_spec *spec,
|
||||
BIT(INNER_IP_TOS);
|
||||
|
||||
/* check whether src/dst ip address used */
|
||||
- if (!spec->ip6src[0] && !spec->ip6src[1] &&
|
||||
- !spec->ip6src[2] && !spec->ip6src[3])
|
||||
+ if (ipv6_addr_any((struct in6_addr *)spec->ip6src))
|
||||
*unused_tuple |= BIT(INNER_SRC_IP);
|
||||
|
||||
- if (!spec->ip6dst[0] && !spec->ip6dst[1] &&
|
||||
- !spec->ip6dst[2] && !spec->ip6dst[3])
|
||||
+ if (ipv6_addr_any((struct in6_addr *)spec->ip6dst))
|
||||
*unused_tuple |= BIT(INNER_DST_IP);
|
||||
|
||||
if (!spec->psrc)
|
||||
@@ -5456,12 +5455,10 @@ static int hclge_fd_check_ip6_tuple(struct ethtool_usrip6_spec *spec,
|
||||
BIT(INNER_IP_TOS) | BIT(INNER_SRC_PORT) | BIT(INNER_DST_PORT);
|
||||
|
||||
/* check whether src/dst ip address used */
|
||||
- if (!spec->ip6src[0] && !spec->ip6src[1] &&
|
||||
- !spec->ip6src[2] && !spec->ip6src[3])
|
||||
+ if (ipv6_addr_any((struct in6_addr *)spec->ip6src))
|
||||
*unused_tuple |= BIT(INNER_SRC_IP);
|
||||
|
||||
- if (!spec->ip6dst[0] && !spec->ip6dst[1] &&
|
||||
- !spec->ip6dst[2] && !spec->ip6dst[3])
|
||||
+ if (ipv6_addr_any((struct in6_addr *)spec->ip6dst))
|
||||
*unused_tuple |= BIT(INNER_DST_IP);
|
||||
|
||||
if (!spec->l4_proto)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,190 @@
|
||||
From 3845cf59d67da6a4877d342fd3af9d3a09a6bbbc Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:37 +0800
|
||||
Subject: [PATCH 048/283] net: hns3: refactor out hclge_set_vf_vlan_common()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 88936e320c1a9971b6b78a38e6bf737e43744f5e
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=88936e320c1a9971b6b78a38e6bf737e43744f5e
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To improve code readability and maintainability, separate
|
||||
the command handling part and the status parsing part from
|
||||
bloated hclge_set_vf_vlan_common().
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 71 ++++++++++++-------
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 1 -
|
||||
include/linux/ethtool.h | 2 +
|
||||
3 files changed, 49 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index f4421e6861cb..e26373b1f38e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -8447,31 +8447,16 @@ static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
|
||||
return hclge_enable_vport_vlan_filter(vport, enable);
|
||||
}
|
||||
|
||||
-static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
|
||||
- bool is_kill, u16 vlan)
|
||||
+static int hclge_set_vf_vlan_filter_cmd(struct hclge_dev *hdev, u16 vfid,
|
||||
+ bool is_kill, u16 vlan,
|
||||
+ struct hclge_desc *desc)
|
||||
{
|
||||
- struct hclge_vport *vport = &hdev->vport[vfid];
|
||||
struct hclge_vlan_filter_vf_cfg_cmd *req0;
|
||||
struct hclge_vlan_filter_vf_cfg_cmd *req1;
|
||||
- struct hclge_desc desc[2];
|
||||
u8 vf_byte_val;
|
||||
u8 vf_byte_off;
|
||||
int ret;
|
||||
|
||||
- /* if vf vlan table is full, firmware will close vf vlan filter, it
|
||||
- * is unable and unnecessary to add new vlan id to vf vlan filter.
|
||||
- * If spoof check is enable, and vf vlan is full, it shouldn't add
|
||||
- * new vlan, because tx packets with these vlan id will be dropped.
|
||||
- */
|
||||
- if (test_bit(vfid, hdev->vf_vlan_full) && !is_kill) {
|
||||
- if (vport->vf_info.spoofchk && vlan) {
|
||||
- dev_err(&hdev->pdev->dev,
|
||||
- "Can't add vlan due to spoof check is on and vf vlan table is full\n");
|
||||
- return -EPERM;
|
||||
- }
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
hclge_cmd_setup_basic_desc(&desc[0],
|
||||
HCLGE_OPC_VLAN_FILTER_VF_CFG, false);
|
||||
hclge_cmd_setup_basic_desc(&desc[1],
|
||||
@@ -8501,12 +8486,22 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hclge_check_vf_vlan_cmd_status(struct hclge_dev *hdev, u16 vfid,
|
||||
+ bool is_kill, struct hclge_desc *desc)
|
||||
+{
|
||||
+ struct hclge_vlan_filter_vf_cfg_cmd *req;
|
||||
+
|
||||
+ req = (struct hclge_vlan_filter_vf_cfg_cmd *)desc[0].data;
|
||||
+
|
||||
if (!is_kill) {
|
||||
#define HCLGE_VF_VLAN_NO_ENTRY 2
|
||||
- if (!req0->resp_code || req0->resp_code == 1)
|
||||
+ if (!req->resp_code || req->resp_code == 1)
|
||||
return 0;
|
||||
|
||||
- if (req0->resp_code == HCLGE_VF_VLAN_NO_ENTRY) {
|
||||
+ if (req->resp_code == HCLGE_VF_VLAN_NO_ENTRY) {
|
||||
set_bit(vfid, hdev->vf_vlan_full);
|
||||
dev_warn(&hdev->pdev->dev,
|
||||
"vf vlan table is full, vf vlan filter is disabled\n");
|
||||
@@ -8515,10 +8510,10 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
|
||||
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Add vf vlan filter fail, ret =%u.\n",
|
||||
- req0->resp_code);
|
||||
+ req->resp_code);
|
||||
} else {
|
||||
#define HCLGE_VF_VLAN_DEL_NO_FOUND 1
|
||||
- if (!req0->resp_code)
|
||||
+ if (!req->resp_code)
|
||||
return 0;
|
||||
|
||||
/* vf vlan filter is disabled when vf vlan table is full,
|
||||
@@ -8526,17 +8521,45 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
|
||||
* Just return 0 without warning, avoid massive verbose
|
||||
* print logs when unload.
|
||||
*/
|
||||
- if (req0->resp_code == HCLGE_VF_VLAN_DEL_NO_FOUND)
|
||||
+ if (req->resp_code == HCLGE_VF_VLAN_DEL_NO_FOUND)
|
||||
return 0;
|
||||
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Kill vf vlan filter fail, ret =%u.\n",
|
||||
- req0->resp_code);
|
||||
+ req->resp_code);
|
||||
}
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
+static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
|
||||
+ bool is_kill, u16 vlan)
|
||||
+{
|
||||
+ struct hclge_vport *vport = &hdev->vport[vfid];
|
||||
+ struct hclge_desc desc[2];
|
||||
+ int ret;
|
||||
+
|
||||
+ /* if vf vlan table is full, firmware will close vf vlan filter, it
|
||||
+ * is unable and unnecessary to add new vlan id to vf vlan filter.
|
||||
+ * If spoof check is enable, and vf vlan is full, it shouldn't add
|
||||
+ * new vlan, because tx packets with these vlan id will be dropped.
|
||||
+ */
|
||||
+ if (test_bit(vfid, hdev->vf_vlan_full) && !is_kill) {
|
||||
+ if (vport->vf_info.spoofchk && vlan) {
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "Can't add vlan due to spoof check is on and vf vlan table is full\n");
|
||||
+ return -EPERM;
|
||||
+ }
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ ret = hclge_set_vf_vlan_filter_cmd(hdev, vfid, is_kill, vlan, desc);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return hclge_check_vf_vlan_cmd_status(hdev, vfid, is_kill, desc);
|
||||
+}
|
||||
+
|
||||
static int hclge_set_port_vlan_filter(struct hclge_dev *hdev, __be16 proto,
|
||||
u16 vlan_id, bool is_kill)
|
||||
{
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
index 14e8a93bdc31..be641288651f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
@@ -520,7 +520,6 @@ int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate)
|
||||
struct hclge_shaper_ir_para ir_para;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_desc desc;
|
||||
- u8 ir_b, ir_u, ir_s;
|
||||
u32 shaper_para;
|
||||
int ret, i;
|
||||
|
||||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
|
||||
index 217f56d2462c..65c244c2dc97 100644
|
||||
--- a/include/linux/ethtool.h
|
||||
+++ b/include/linux/ethtool.h
|
||||
@@ -367,7 +367,9 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* of the generic netdev features interface.
|
||||
*/
|
||||
struct ethtool_ops {
|
||||
+#ifndef __GENKSYMS__
|
||||
u32 supported_coalesce_params;
|
||||
+#endif
|
||||
int (*get_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
int (*set_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
129
patches/0410-net-hns3-refactor-out-hclge_get_rss_tuple.patch
Normal file
129
patches/0410-net-hns3-refactor-out-hclge_get_rss_tuple.patch
Normal file
@ -0,0 +1,129 @@
|
||||
From 611f7edcab5623afa0d88da000b9320c0c111d94 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:38 +0800
|
||||
Subject: [PATCH 049/283] net: hns3: refactor out hclge_get_rss_tuple()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 405642a15cba0c01d14fc6aa9b8deadf325ab7c3
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=405642a15cba0c01d14fc6aa9b8deadf325ab7c3
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To improve code readability and maintainability, separate
|
||||
the flow type parsing part and the converting part from
|
||||
bloated hclge_get_rss_tuple().
|
||||
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 59 ++++++++++++-------
|
||||
1 file changed, 38 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index e26373b1f38e..986d9e5acb3b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -4532,52 +4532,69 @@ static int hclge_set_rss_tuple(struct hnae3_handle *handle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hclge_get_rss_tuple(struct hnae3_handle *handle,
|
||||
- struct ethtool_rxnfc *nfc)
|
||||
+static int hclge_get_vport_rss_tuple(struct hclge_vport *vport, int flow_type,
|
||||
+ u8 *tuple_sets)
|
||||
{
|
||||
- struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
- u8 tuple_sets;
|
||||
-
|
||||
- nfc->data = 0;
|
||||
-
|
||||
- switch (nfc->flow_type) {
|
||||
+ switch (flow_type) {
|
||||
case TCP_V4_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv4_tcp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv4_tcp_en;
|
||||
break;
|
||||
case UDP_V4_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv4_udp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv4_udp_en;
|
||||
break;
|
||||
case TCP_V6_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv6_tcp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv6_tcp_en;
|
||||
break;
|
||||
case UDP_V6_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv6_udp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv6_udp_en;
|
||||
break;
|
||||
case SCTP_V4_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv4_sctp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv4_sctp_en;
|
||||
break;
|
||||
case SCTP_V6_FLOW:
|
||||
- tuple_sets = vport->rss_tuple_sets.ipv6_sctp_en;
|
||||
+ *tuple_sets = vport->rss_tuple_sets.ipv6_sctp_en;
|
||||
break;
|
||||
case IPV4_FLOW:
|
||||
case IPV6_FLOW:
|
||||
- tuple_sets = HCLGE_S_IP_BIT | HCLGE_D_IP_BIT;
|
||||
+ *tuple_sets = HCLGE_S_IP_BIT | HCLGE_D_IP_BIT;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if (!tuple_sets)
|
||||
- return 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static u64 hclge_convert_rss_tuple(u8 tuple_sets)
|
||||
+{
|
||||
+ u64 tuple_data = 0;
|
||||
|
||||
if (tuple_sets & HCLGE_D_PORT_BIT)
|
||||
- nfc->data |= RXH_L4_B_2_3;
|
||||
+ tuple_data |= RXH_L4_B_2_3;
|
||||
if (tuple_sets & HCLGE_S_PORT_BIT)
|
||||
- nfc->data |= RXH_L4_B_0_1;
|
||||
+ tuple_data |= RXH_L4_B_0_1;
|
||||
if (tuple_sets & HCLGE_D_IP_BIT)
|
||||
- nfc->data |= RXH_IP_DST;
|
||||
+ tuple_data |= RXH_IP_DST;
|
||||
if (tuple_sets & HCLGE_S_IP_BIT)
|
||||
- nfc->data |= RXH_IP_SRC;
|
||||
+ tuple_data |= RXH_IP_SRC;
|
||||
+
|
||||
+ return tuple_data;
|
||||
+}
|
||||
+
|
||||
+static int hclge_get_rss_tuple(struct hnae3_handle *handle,
|
||||
+ struct ethtool_rxnfc *nfc)
|
||||
+{
|
||||
+ struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
+ u8 tuple_sets;
|
||||
+ int ret;
|
||||
+
|
||||
+ nfc->data = 0;
|
||||
+
|
||||
+ ret = hclge_get_vport_rss_tuple(vport, nfc->flow_type, &tuple_sets);
|
||||
+ if (ret || !tuple_sets)
|
||||
+ return ret;
|
||||
+
|
||||
+ nfc->data = hclge_convert_rss_tuple(tuple_sets);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
137
patches/0411-net-hns3-refactor-out-hclgevf_get_rss_tuple.patch
Normal file
137
patches/0411-net-hns3-refactor-out-hclgevf_get_rss_tuple.patch
Normal file
@ -0,0 +1,137 @@
|
||||
From 40ebbda8bdcaa94f9a971b9546a54050e7f3ccf9 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:39 +0800
|
||||
Subject: [PATCH 050/283] net: hns3: refactor out hclgevf_get_rss_tuple()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 73f7767ed0f93cd3269e7f5af75902a351faf5da
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=73f7767ed0f93cd3269e7f5af75902a351faf5da
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To improve code readability and maintainability, separate
|
||||
the flow type parsing part and the converting part from
|
||||
bloated hclgevf_get_rss_tuple().
|
||||
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 67 ++++++++++++-------
|
||||
1 file changed, 42 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index f688217d4c59..accec5762d91 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -962,56 +962,73 @@ static int hclgevf_set_rss_tuple(struct hnae3_handle *handle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hclgevf_get_rss_tuple(struct hnae3_handle *handle,
|
||||
- struct ethtool_rxnfc *nfc)
|
||||
+static int hclgevf_get_rss_tuple_by_flow_type(struct hclgevf_dev *hdev,
|
||||
+ int flow_type, u8 *tuple_sets)
|
||||
{
|
||||
- struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
- struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
||||
- u8 tuple_sets;
|
||||
-
|
||||
- if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
- return -EOPNOTSUPP;
|
||||
-
|
||||
- nfc->data = 0;
|
||||
-
|
||||
- switch (nfc->flow_type) {
|
||||
+ switch (flow_type) {
|
||||
case TCP_V4_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv4_tcp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv4_tcp_en;
|
||||
break;
|
||||
case UDP_V4_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv4_udp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv4_udp_en;
|
||||
break;
|
||||
case TCP_V6_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv6_tcp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv6_tcp_en;
|
||||
break;
|
||||
case UDP_V6_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv6_udp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv6_udp_en;
|
||||
break;
|
||||
case SCTP_V4_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv4_sctp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv4_sctp_en;
|
||||
break;
|
||||
case SCTP_V6_FLOW:
|
||||
- tuple_sets = rss_cfg->rss_tuple_sets.ipv6_sctp_en;
|
||||
+ *tuple_sets = hdev->rss_cfg.rss_tuple_sets.ipv6_sctp_en;
|
||||
break;
|
||||
case IPV4_FLOW:
|
||||
case IPV6_FLOW:
|
||||
- tuple_sets = HCLGEVF_S_IP_BIT | HCLGEVF_D_IP_BIT;
|
||||
+ *tuple_sets = HCLGEVF_S_IP_BIT | HCLGEVF_D_IP_BIT;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if (!tuple_sets)
|
||||
- return 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static u64 hclgevf_convert_rss_tuple(u8 tuple_sets)
|
||||
+{
|
||||
+ u64 tuple_data = 0;
|
||||
|
||||
if (tuple_sets & HCLGEVF_D_PORT_BIT)
|
||||
- nfc->data |= RXH_L4_B_2_3;
|
||||
+ tuple_data |= RXH_L4_B_2_3;
|
||||
if (tuple_sets & HCLGEVF_S_PORT_BIT)
|
||||
- nfc->data |= RXH_L4_B_0_1;
|
||||
+ tuple_data |= RXH_L4_B_0_1;
|
||||
if (tuple_sets & HCLGEVF_D_IP_BIT)
|
||||
- nfc->data |= RXH_IP_DST;
|
||||
+ tuple_data |= RXH_IP_DST;
|
||||
if (tuple_sets & HCLGEVF_S_IP_BIT)
|
||||
- nfc->data |= RXH_IP_SRC;
|
||||
+ tuple_data |= RXH_IP_SRC;
|
||||
+
|
||||
+ return tuple_data;
|
||||
+}
|
||||
+
|
||||
+static int hclgevf_get_rss_tuple(struct hnae3_handle *handle,
|
||||
+ struct ethtool_rxnfc *nfc)
|
||||
+{
|
||||
+ struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
+ u8 tuple_sets;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ nfc->data = 0;
|
||||
+
|
||||
+ ret = hclgevf_get_rss_tuple_by_flow_type(hdev, nfc->flow_type,
|
||||
+ &tuple_sets);
|
||||
+ if (ret || !tuple_sets)
|
||||
+ return ret;
|
||||
+
|
||||
+ nfc->data = hclgevf_convert_rss_tuple(tuple_sets);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
172
patches/0412-net-hns3-split-out-hclge_cmd_send.patch
Normal file
172
patches/0412-net-hns3-split-out-hclge_cmd_send.patch
Normal file
@ -0,0 +1,172 @@
|
||||
From 33374df5fd3f1c4d0da46856e84e1afd4a16d0fb Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:41 +0800
|
||||
Subject: [PATCH 051/283] net: hns3: split out hclge_cmd_send()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit 76f82fd9b1230332db2b3bc3916d097b92acbf29
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76f82fd9b1230332db2b3bc3916d097b92acbf29
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
hclge_cmd_send() is bloated, so split it into separate
|
||||
functions for readability and maintainability.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 100 +++++++++++-------
|
||||
1 file changed, 59 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 5f0c645eb292..64476a2629ba 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -210,6 +210,22 @@ struct errcode {
|
||||
int common_errno;
|
||||
};
|
||||
|
||||
+static void hclge_cmd_copy_desc(struct hclge_hw *hw, struct hclge_desc *desc,
|
||||
+ int num)
|
||||
+{
|
||||
+ struct hclge_desc *desc_to_use;
|
||||
+ int handle = 0;
|
||||
+
|
||||
+ while (handle < num) {
|
||||
+ desc_to_use = &hw->cmq.csq.desc[hw->cmq.csq.next_to_use];
|
||||
+ *desc_to_use = desc[handle];
|
||||
+ (hw->cmq.csq.next_to_use)++;
|
||||
+ if (hw->cmq.csq.next_to_use >= hw->cmq.csq.desc_num)
|
||||
+ hw->cmq.csq.next_to_use = 0;
|
||||
+ handle++;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int hclge_cmd_convert_err_code(u16 desc_ret)
|
||||
{
|
||||
struct errcode hclge_cmd_errcode[] = {
|
||||
@@ -259,6 +275,44 @@ static int hclge_cmd_check_retval(struct hclge_hw *hw, struct hclge_desc *desc,
|
||||
return hclge_cmd_convert_err_code(desc_ret);
|
||||
}
|
||||
|
||||
+static int hclge_cmd_check_result(struct hclge_hw *hw, struct hclge_desc *desc,
|
||||
+ int num, int ntc)
|
||||
+{
|
||||
+ struct hclge_dev *hdev = container_of(hw, struct hclge_dev, hw);
|
||||
+ bool is_completed = false;
|
||||
+ u32 timeout = 0;
|
||||
+ int handle, ret;
|
||||
+
|
||||
+ /**
|
||||
+ * If the command is sync, wait for the firmware to write back,
|
||||
+ * if multi descriptors to be sent, use the first one to check
|
||||
+ */
|
||||
+ if (HCLGE_SEND_SYNC(le16_to_cpu(desc->flag))) {
|
||||
+ do {
|
||||
+ if (hclge_cmd_csq_done(hw)) {
|
||||
+ is_completed = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ udelay(1);
|
||||
+ timeout++;
|
||||
+ } while (timeout < hw->cmq.tx_timeout);
|
||||
+ }
|
||||
+
|
||||
+ if (!is_completed)
|
||||
+ ret = -EBADE;
|
||||
+ else
|
||||
+ ret = hclge_cmd_check_retval(hw, desc, num, ntc);
|
||||
+
|
||||
+ /* Clean the command send queue */
|
||||
+ handle = hclge_cmd_csq_clean(hw);
|
||||
+ if (handle < 0)
|
||||
+ ret = handle;
|
||||
+ else if (handle != num)
|
||||
+ dev_warn(&hdev->pdev->dev,
|
||||
+ "cleaned %d, need to clean %d\n", handle, num);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* hclge_cmd_send - send command to command queue
|
||||
* @hw: pointer to the hw struct
|
||||
@@ -272,11 +326,7 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
{
|
||||
struct hclge_dev *hdev = container_of(hw, struct hclge_dev, hw);
|
||||
struct hclge_cmq_ring *csq = &hw->cmq.csq;
|
||||
- struct hclge_desc *desc_to_use;
|
||||
- bool complete = false;
|
||||
- u32 timeout = 0;
|
||||
- int handle = 0;
|
||||
- int retval;
|
||||
+ int ret;
|
||||
int ntc;
|
||||
|
||||
spin_lock_bh(&hw->cmq.csq.lock);
|
||||
@@ -300,49 +350,17 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
||||
* which will be use for hardware to write back
|
||||
*/
|
||||
ntc = hw->cmq.csq.next_to_use;
|
||||
- while (handle < num) {
|
||||
- desc_to_use = &hw->cmq.csq.desc[hw->cmq.csq.next_to_use];
|
||||
- *desc_to_use = desc[handle];
|
||||
- (hw->cmq.csq.next_to_use)++;
|
||||
- if (hw->cmq.csq.next_to_use >= hw->cmq.csq.desc_num)
|
||||
- hw->cmq.csq.next_to_use = 0;
|
||||
- handle++;
|
||||
- }
|
||||
+
|
||||
+ hclge_cmd_copy_desc(hw, desc, num);
|
||||
|
||||
/* Write to hardware */
|
||||
hclge_write_dev(hw, HCLGE_NIC_CSQ_TAIL_REG, hw->cmq.csq.next_to_use);
|
||||
|
||||
- /**
|
||||
- * If the command is sync, wait for the firmware to write back,
|
||||
- * if multi descriptors to be sent, use the first one to check
|
||||
- */
|
||||
- if (HCLGE_SEND_SYNC(le16_to_cpu(desc->flag))) {
|
||||
- do {
|
||||
- if (hclge_cmd_csq_done(hw)) {
|
||||
- complete = true;
|
||||
- break;
|
||||
- }
|
||||
- udelay(1);
|
||||
- timeout++;
|
||||
- } while (timeout < hw->cmq.tx_timeout);
|
||||
- }
|
||||
-
|
||||
- if (!complete)
|
||||
- retval = -EBADE;
|
||||
- else
|
||||
- retval = hclge_cmd_check_retval(hw, desc, num, ntc);
|
||||
-
|
||||
- /* Clean the command send queue */
|
||||
- handle = hclge_cmd_csq_clean(hw);
|
||||
- if (handle < 0)
|
||||
- retval = handle;
|
||||
- else if (handle != num)
|
||||
- dev_warn(&hdev->pdev->dev,
|
||||
- "cleaned %d, need to clean %d\n", handle, num);
|
||||
+ ret = hclge_cmd_check_result(hw, desc, num, ntc);
|
||||
|
||||
spin_unlock_bh(&hw->cmq.csq.lock);
|
||||
|
||||
- return retval;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static void hclge_set_default_capability(struct hclge_dev *hdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
242
patches/0413-net-hns3-split-out-hclgevf_cmd_send.patch
Normal file
242
patches/0413-net-hns3-split-out-hclgevf_cmd_send.patch
Normal file
@ -0,0 +1,242 @@
|
||||
From b7b863887a881e152602febf43715e366f714497 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:42 +0800
|
||||
Subject: [PATCH 052/283] net: hns3: split out hclgevf_cmd_send()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc1-dontuse
|
||||
commit eb0faf32b86e208049b6432197bfeeeac8580fe1
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=eb0faf32b86e208049b6432197bfeeeac8580fe1
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
hclgevf_cmd_send() is bloated, so split it into separate
|
||||
functions for readability and maintainability.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 141 ++++++++++--------
|
||||
include/linux/ethtool.h | 2 -
|
||||
include/linux/phy.h | 1 -
|
||||
3 files changed, 81 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index a09b63a031a5..9430334e1c22 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -197,6 +197,22 @@ struct vf_errcode {
|
||||
int common_errno;
|
||||
};
|
||||
|
||||
+static void hclgevf_cmd_copy_desc(struct hclgevf_hw *hw,
|
||||
+ struct hclgevf_desc *desc, int num)
|
||||
+{
|
||||
+ struct hclgevf_desc *desc_to_use;
|
||||
+ int handle = 0;
|
||||
+
|
||||
+ while (handle < num) {
|
||||
+ desc_to_use = &hw->cmq.csq.desc[hw->cmq.csq.next_to_use];
|
||||
+ *desc_to_use = desc[handle];
|
||||
+ (hw->cmq.csq.next_to_use)++;
|
||||
+ if (hw->cmq.csq.next_to_use == hw->cmq.csq.desc_num)
|
||||
+ hw->cmq.csq.next_to_use = 0;
|
||||
+ handle++;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int hclgevf_cmd_convert_err_code(u16 desc_ret)
|
||||
{
|
||||
struct vf_errcode hclgevf_cmd_errcode[] = {
|
||||
@@ -223,6 +239,66 @@ static int hclgevf_cmd_convert_err_code(u16 desc_ret)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
+static int hclgevf_cmd_check_retval(struct hclgevf_hw *hw,
|
||||
+ struct hclgevf_desc *desc, int num, int ntc)
|
||||
+{
|
||||
+ u16 opcode, desc_ret;
|
||||
+ int handle;
|
||||
+
|
||||
+ opcode = le16_to_cpu(desc[0].opcode);
|
||||
+ for (handle = 0; handle < num; handle++) {
|
||||
+ /* Get the result of hardware write back */
|
||||
+ desc[handle] = hw->cmq.csq.desc[ntc];
|
||||
+ ntc++;
|
||||
+ if (ntc == hw->cmq.csq.desc_num)
|
||||
+ ntc = 0;
|
||||
+ }
|
||||
+ if (likely(!hclgevf_is_special_opcode(opcode)))
|
||||
+ desc_ret = le16_to_cpu(desc[num - 1].retval);
|
||||
+ else
|
||||
+ desc_ret = le16_to_cpu(desc[0].retval);
|
||||
+ hw->cmq.last_status = desc_ret;
|
||||
+
|
||||
+ return hclgevf_cmd_convert_err_code(desc_ret);
|
||||
+}
|
||||
+
|
||||
+static int hclgevf_cmd_check_result(struct hclgevf_hw *hw,
|
||||
+ struct hclgevf_desc *desc, int num, int ntc)
|
||||
+{
|
||||
+ struct hclgevf_dev *hdev = (struct hclgevf_dev *)hw->hdev;
|
||||
+ bool is_completed = false;
|
||||
+ u32 timeout = 0;
|
||||
+ int handle, ret;
|
||||
+
|
||||
+ /* If the command is sync, wait for the firmware to write back,
|
||||
+ * if multi descriptors to be sent, use the first one to check
|
||||
+ */
|
||||
+ if (HCLGEVF_SEND_SYNC(le16_to_cpu(desc->flag))) {
|
||||
+ do {
|
||||
+ if (hclgevf_cmd_csq_done(hw)) {
|
||||
+ is_completed = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ udelay(1);
|
||||
+ timeout++;
|
||||
+ } while (timeout < hw->cmq.tx_timeout);
|
||||
+ }
|
||||
+
|
||||
+ if (!is_completed)
|
||||
+ ret = -EBADE;
|
||||
+ else
|
||||
+ ret = hclgevf_cmd_check_retval(hw, desc, num, ntc);
|
||||
+
|
||||
+ /* Clean the command send queue */
|
||||
+ handle = hclgevf_cmd_csq_clean(hw);
|
||||
+ if (handle < 0)
|
||||
+ ret = handle;
|
||||
+ else if (handle != num)
|
||||
+ dev_warn(&hdev->pdev->dev,
|
||||
+ "cleaned %d, need to clean %d\n", handle, num);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/* hclgevf_cmd_send - send command to command queue
|
||||
* @hw: pointer to the hw struct
|
||||
* @desc: prefilled descriptor for describing the command
|
||||
@@ -235,13 +311,7 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
||||
{
|
||||
struct hclgevf_dev *hdev = (struct hclgevf_dev *)hw->hdev;
|
||||
struct hclgevf_cmq_ring *csq = &hw->cmq.csq;
|
||||
- struct hclgevf_desc *desc_to_use;
|
||||
- bool complete = false;
|
||||
- u32 timeout = 0;
|
||||
- int handle = 0;
|
||||
- int status = 0;
|
||||
- u16 retval;
|
||||
- u16 opcode;
|
||||
+ int ret;
|
||||
int ntc;
|
||||
|
||||
spin_lock_bh(&hw->cmq.csq.lock);
|
||||
@@ -265,67 +335,18 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
||||
* which will be use for hardware to write back
|
||||
*/
|
||||
ntc = hw->cmq.csq.next_to_use;
|
||||
- opcode = le16_to_cpu(desc[0].opcode);
|
||||
- while (handle < num) {
|
||||
- desc_to_use = &hw->cmq.csq.desc[hw->cmq.csq.next_to_use];
|
||||
- *desc_to_use = desc[handle];
|
||||
- (hw->cmq.csq.next_to_use)++;
|
||||
- if (hw->cmq.csq.next_to_use == hw->cmq.csq.desc_num)
|
||||
- hw->cmq.csq.next_to_use = 0;
|
||||
- handle++;
|
||||
- }
|
||||
+
|
||||
+ hclgevf_cmd_copy_desc(hw, desc, num);
|
||||
|
||||
/* Write to hardware */
|
||||
hclgevf_write_dev(hw, HCLGEVF_NIC_CSQ_TAIL_REG,
|
||||
hw->cmq.csq.next_to_use);
|
||||
|
||||
- /* If the command is sync, wait for the firmware to write back,
|
||||
- * if multi descriptors to be sent, use the first one to check
|
||||
- */
|
||||
- if (HCLGEVF_SEND_SYNC(le16_to_cpu(desc->flag))) {
|
||||
- do {
|
||||
- if (hclgevf_cmd_csq_done(hw))
|
||||
- break;
|
||||
- udelay(1);
|
||||
- timeout++;
|
||||
- } while (timeout < hw->cmq.tx_timeout);
|
||||
- }
|
||||
-
|
||||
- if (hclgevf_cmd_csq_done(hw)) {
|
||||
- complete = true;
|
||||
- handle = 0;
|
||||
-
|
||||
- while (handle < num) {
|
||||
- /* Get the result of hardware write back */
|
||||
- desc_to_use = &hw->cmq.csq.desc[ntc];
|
||||
- desc[handle] = *desc_to_use;
|
||||
-
|
||||
- if (likely(!hclgevf_is_special_opcode(opcode)))
|
||||
- retval = le16_to_cpu(desc[handle].retval);
|
||||
- else
|
||||
- retval = le16_to_cpu(desc[0].retval);
|
||||
-
|
||||
- status = hclgevf_cmd_convert_err_code(retval);
|
||||
- hw->cmq.last_status = (enum hclgevf_cmd_status)retval;
|
||||
- ntc++;
|
||||
- handle++;
|
||||
- if (ntc == hw->cmq.csq.desc_num)
|
||||
- ntc = 0;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (!complete)
|
||||
- status = -EBADE;
|
||||
-
|
||||
- /* Clean the command send queue */
|
||||
- handle = hclgevf_cmd_csq_clean(hw);
|
||||
- if (handle != num)
|
||||
- dev_warn(&hdev->pdev->dev,
|
||||
- "cleaned %d, need to clean %d\n", handle, num);
|
||||
+ ret = hclgevf_cmd_check_result(hw, desc, num, ntc);
|
||||
|
||||
spin_unlock_bh(&hw->cmq.csq.lock);
|
||||
|
||||
- return status;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static void hclgevf_set_default_capability(struct hclgevf_dev *hdev)
|
||||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
|
||||
index 65c244c2dc97..217f56d2462c 100644
|
||||
--- a/include/linux/ethtool.h
|
||||
+++ b/include/linux/ethtool.h
|
||||
@@ -367,9 +367,7 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* of the generic netdev features interface.
|
||||
*/
|
||||
struct ethtool_ops {
|
||||
-#ifndef __GENKSYMS__
|
||||
u32 supported_coalesce_params;
|
||||
-#endif
|
||||
int (*get_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
int (*set_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
|
||||
diff --git a/include/linux/phy.h b/include/linux/phy.h
|
||||
index 81532a61e995..d428623582e5 100644
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -418,7 +418,6 @@ struct phy_device {
|
||||
unsigned autoneg:1;
|
||||
/* The most recently read link state */
|
||||
unsigned link:1;
|
||||
-
|
||||
enum phy_state state;
|
||||
|
||||
u32 dev_flags;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
From b29f0fd02ffd9facaedb99ff4a5f713a318c56e6 Mon Sep 17 00:00:00 2001
|
||||
From: Algernon <lixiaodong67@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 10:33:29 +0800
|
||||
Subject: [PATCH 053/283] net:hns3 Fix KABI for
|
||||
ethtools->supported_coalesce_params
|
||||
|
||||
driver inclusion
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
--------------------------------
|
||||
|
||||
Fix ethtool_ Added supported in the ops structure_ Coalesce_ Kabi
|
||||
changes caused by params members.
|
||||
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
include/linux/ethtool.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
|
||||
index 217f56d2462c..65c244c2dc97 100644
|
||||
--- a/include/linux/ethtool.h
|
||||
+++ b/include/linux/ethtool.h
|
||||
@@ -367,7 +367,9 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
* of the generic netdev features interface.
|
||||
*/
|
||||
struct ethtool_ops {
|
||||
+#ifndef __GENKSYMS__
|
||||
u32 supported_coalesce_params;
|
||||
+#endif
|
||||
int (*get_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
int (*set_settings)(struct net_device *, struct ethtool_cmd *);
|
||||
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,55 @@
|
||||
From c7aa853001a92e3cab9f3bc03fba411ef52458fa Mon Sep 17 00:00:00 2001
|
||||
From: Algernon <lixiaodong67@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 10:40:59 +0800
|
||||
Subject: [PATCH 054/283] net:hns3 Fix KABI for deletion of
|
||||
hnae3_unic_private_info in hnae3_handle
|
||||
|
||||
driver inclusion
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
--------------------------------
|
||||
|
||||
Fixed due to removal of hnae3_ Unic_ Private_ Kabi
|
||||
changes caused by info structure
|
||||
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index eef5f7a5eb63..6d58e1ccec78 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -776,7 +776,17 @@ struct hnae3_roce_private_info {
|
||||
unsigned long instance_state;
|
||||
unsigned long state;
|
||||
};
|
||||
+#ifdef __GENKSYMS__
|
||||
+struct hnae3_unic_private_info {
|
||||
+ struct net_device *netdev;
|
||||
+ u16 rx_buf_len;
|
||||
+ u16 num_tx_desc;
|
||||
+ u16 num_rx_desc;
|
||||
|
||||
+ u16 num_tqps; /* total number of tqps in this handle */
|
||||
+ struct hnae3_queue **tqp; /* array base of all TQPs of this instance */
|
||||
+};
|
||||
+#endif
|
||||
#define HNAE3_SUPPORT_APP_LOOPBACK BIT(0)
|
||||
#define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1)
|
||||
#define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2)
|
||||
@@ -803,6 +813,9 @@ struct hnae3_handle {
|
||||
union {
|
||||
struct net_device *netdev; /* first member */
|
||||
struct hnae3_knic_private_info kinfo;
|
||||
+#ifdef __GENKSYMS__
|
||||
+ struct hnae3_unic_private_info uinfo;
|
||||
+#endif
|
||||
struct hnae3_roce_private_info rinfo;
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
From fd278a93071f924014782c34e84f48832e5d52a5 Mon Sep 17 00:00:00 2001
|
||||
From: Algernon <lixiaodong67@huawei.com>
|
||||
Date: Tue, 20 Jun 2023 14:23:51 +0800
|
||||
Subject: [PATCH 055/283] net:hns3 Fix KABI for The dev_version & caps element
|
||||
is added to the hnae3_ae_dev structure.
|
||||
|
||||
driver inclusion
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
|
||||
--------------------------------
|
||||
|
||||
Fix it because hnae3_ Ae_ Add dev to the dev structure_ Kabi
|
||||
changes caused by version and caps members
|
||||
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 6d58e1ccec78..0ffb8109fba9 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -345,8 +345,10 @@ struct hnae3_ae_dev {
|
||||
struct list_head node;
|
||||
u32 flag;
|
||||
unsigned long hw_err_reset_req;
|
||||
+#ifndef __GENKSYMS__
|
||||
u32 dev_version;
|
||||
unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)];
|
||||
+#endif
|
||||
void *priv;
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
413
patches/0417-net-hns3-add-support-for-imp-controlled-PHYs.patch
Normal file
413
patches/0417-net-hns3-add-support-for-imp-controlled-PHYs.patch
Normal file
@ -0,0 +1,413 @@
|
||||
From aec0faec2bfbd8d5a18f52d1778519911fdb3831 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:48 +0800
|
||||
Subject: [PATCH 056/283] net: hns3: add support for imp-controlled PHYs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit f5f2b3e4dcc0e944dc33b522df84576679fbd8eb
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5f2b3e4dcc0e944dc33b522df84576679fbd8eb
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
IMP(Intelligent Management Processor) firmware add a new feature
|
||||
to take control of PHYs for some new devices, PF driver adds
|
||||
support for this feature.
|
||||
|
||||
Driver queries device's capability to check whether IMP supports
|
||||
this feature, it will tell IMP to enable this feature by firmware
|
||||
compatible command if it is supported.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 7 +-
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 9 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 4 +
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 50 ++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 149 +++++++++++++++++-
|
||||
include/uapi/linux/ethtool.h | 8 +-
|
||||
6 files changed, 222 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 0ffb8109fba9..99fe5603ef1c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -89,6 +89,8 @@ enum HNAE3_DEV_CAP_BITS {
|
||||
HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B,
|
||||
HNAE3_DEV_SUPPORT_HW_PAD_B,
|
||||
HNAE3_DEV_SUPPORT_STASH_B,
|
||||
+ HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B,
|
||||
+ HNAE3_DEV_SUPPORT_PAUSE_B,
|
||||
};
|
||||
|
||||
#define hnae3_dev_fd_supported(hdev) \
|
||||
@@ -680,7 +682,10 @@ struct hnae3_ae_ops {
|
||||
int (*get_module_eeprom)(struct hnae3_handle *handle, u32 offset,
|
||||
u32 len, u8 *data);
|
||||
bool (*get_cmdq_stat)(struct hnae3_handle *handle);
|
||||
-
|
||||
+ int (*get_phy_link_ksettings)(struct hnae3_handle *handle,
|
||||
+ struct ethtool_link_ksettings *cmd);
|
||||
+ int (*set_phy_link_ksettings)(struct hnae3_handle *handle,
|
||||
+ const struct ethtool_link_ksettings *cmd);
|
||||
/* Notice! If the function is not for test, the definition must before
|
||||
* CONFIG_HNS3_TEST! Because RoCE will use this head file, and it won't
|
||||
* set CONFIG_HNS3_TEST, that may cause RoCE calling the wrong function.
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 2eb3aac3c711..3bad65d1a49d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -671,6 +671,7 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
const struct hnae3_ae_ops *ops;
|
||||
u8 module_type;
|
||||
u8 media_type;
|
||||
@@ -701,7 +702,10 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
|
||||
break;
|
||||
case HNAE3_MEDIA_TYPE_COPPER:
|
||||
cmd->base.port = PORT_TP;
|
||||
- if (!netdev->phydev)
|
||||
+ if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) &&
|
||||
+ ops->get_phy_link_ksettings)
|
||||
+ ops->get_phy_link_ksettings(h, cmd);
|
||||
+ else if (!netdev->phydev)
|
||||
hns3_get_ksettings(h, cmd);
|
||||
else
|
||||
phy_ethtool_ksettings_get(netdev->phydev, cmd);
|
||||
@@ -796,6 +800,9 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
||||
return -EINVAL;
|
||||
|
||||
return phy_ethtool_ksettings_set(netdev->phydev, cmd);
|
||||
+ } else if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) &&
|
||||
+ ops->set_phy_link_ksettings) {
|
||||
+ return ops->set_phy_link_ksettings(handle, cmd);
|
||||
}
|
||||
|
||||
if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 64476a2629ba..c4d30bcc8fa3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -390,6 +390,8 @@ static void hclge_parse_capability(struct hclge_dev *hdev,
|
||||
set_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGE_CAP_HW_TX_CSUM_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_PHY_IMP_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps);
|
||||
}
|
||||
|
||||
static enum hclge_cmd_status
|
||||
@@ -476,6 +478,8 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev, bool en)
|
||||
|
||||
hnae3_set_bit(compat, HCLGE_LINK_EVENT_REPORT_EN_B, 1);
|
||||
hnae3_set_bit(compat, HCLGE_NCSI_ERROR_REPORT_EN_B, 1);
|
||||
+ if (hnae3_dev_phy_imp_supported(hdev))
|
||||
+ hnae3_set_bit(compat, HCLGE_PHY_IMP_EN_B, 1);
|
||||
req->compat = cpu_to_le32(compat);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index e6727366028e..2922cd1bc859 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -308,6 +308,9 @@ enum hclge_opcode_type {
|
||||
HCLGE_PPP_MAC_VLAN_IDX_RD = 0x2104,
|
||||
HCLGE_MAC_ETHERTYPE_IDX_RD = 0x2105,
|
||||
HCLGE_NCSI_INT_EN = 0x2401,
|
||||
+
|
||||
+ /* PHY command */
|
||||
+ HCLGE_OPC_PHY_LINK_KSETTING = 0x7025,
|
||||
};
|
||||
|
||||
#define HCLGE_TQP_REG_OFFSET 0x80000
|
||||
@@ -1107,6 +1110,7 @@ struct hclge_query_ppu_pf_other_int_dfx_cmd {
|
||||
|
||||
#define HCLGE_LINK_EVENT_REPORT_EN_B 0
|
||||
#define HCLGE_NCSI_ERROR_REPORT_EN_B 1
|
||||
+#define HCLGE_PHY_IMP_EN_B 2
|
||||
struct hclge_firmware_compat_cmd {
|
||||
__le32 compat;
|
||||
u8 rsv[20];
|
||||
@@ -1125,6 +1129,52 @@ struct hclge_sfp_info_bd0_cmd {
|
||||
u8 data[HCLGE_SFP_INFO_BD0_LEN];
|
||||
};
|
||||
|
||||
+#define HCLGE_QUERY_DEV_SPECS_BD_NUM 4
|
||||
+
|
||||
+struct hclge_dev_specs_0_cmd {
|
||||
+ __le32 rsv0;
|
||||
+ __le32 mac_entry_num;
|
||||
+ __le32 mng_entry_num;
|
||||
+ __le16 rss_ind_tbl_size;
|
||||
+ __le16 rss_key_size;
|
||||
+ __le16 int_ql_max;
|
||||
+ u8 max_non_tso_bd_num;
|
||||
+ u8 rsv1;
|
||||
+ __le32 max_tm_rate;
|
||||
+};
|
||||
+
|
||||
+#define HCLGE_DEF_MAX_INT_GL 0x1FE0U
|
||||
+
|
||||
+struct hclge_dev_specs_1_cmd {
|
||||
+ __le16 max_frm_size;
|
||||
+ __le16 max_qset_num;
|
||||
+ __le16 max_int_gl;
|
||||
+ u8 rsv1[18];
|
||||
+};
|
||||
+
|
||||
+#define HCLGE_PHY_LINK_SETTING_BD_NUM 2
|
||||
+
|
||||
+struct hclge_phy_link_ksetting_0_cmd {
|
||||
+ __le32 speed;
|
||||
+ u8 duplex;
|
||||
+ u8 autoneg;
|
||||
+ u8 eth_tp_mdix;
|
||||
+ u8 eth_tp_mdix_ctrl;
|
||||
+ u8 port;
|
||||
+ u8 transceiver;
|
||||
+ u8 phy_address;
|
||||
+ u8 rsv;
|
||||
+ __le32 supported;
|
||||
+ __le32 advertising;
|
||||
+ __le32 lp_advertising;
|
||||
+};
|
||||
+
|
||||
+struct hclge_phy_link_ksetting_1_cmd {
|
||||
+ u8 master_slave_cfg;
|
||||
+ u8 master_slave_state;
|
||||
+ u8 rsv[22];
|
||||
+};
|
||||
+
|
||||
int hclge_cmd_init(struct hclge_dev *hdev);
|
||||
static inline void hclge_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
{
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 986d9e5acb3b..115e70fcce36 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -2903,6 +2903,141 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int hclge_get_phy_link_ksettings(struct hnae3_handle *handle,
|
||||
+ struct ethtool_link_ksettings *cmd)
|
||||
+{
|
||||
+ struct hclge_desc desc[HCLGE_PHY_LINK_SETTING_BD_NUM];
|
||||
+ struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
+ struct hclge_phy_link_ksetting_0_cmd *req0;
|
||||
+ struct hclge_phy_link_ksetting_1_cmd *req1;
|
||||
+ u32 supported, advertising, lp_advertising;
|
||||
+ struct hclge_dev *hdev = vport->back;
|
||||
+ int ret;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_PHY_LINK_KSETTING,
|
||||
+ true);
|
||||
+ desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
+ hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_PHY_LINK_KSETTING,
|
||||
+ true);
|
||||
+
|
||||
+ ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_PHY_LINK_SETTING_BD_NUM);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to get phy link ksetting, ret = %d.\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ req0 = (struct hclge_phy_link_ksetting_0_cmd *)desc[0].data;
|
||||
+ cmd->base.autoneg = req0->autoneg;
|
||||
+ cmd->base.speed = le32_to_cpu(req0->speed);
|
||||
+ cmd->base.duplex = req0->duplex;
|
||||
+ cmd->base.port = req0->port;
|
||||
+ cmd->base.transceiver = req0->transceiver;
|
||||
+ cmd->base.phy_address = req0->phy_address;
|
||||
+ cmd->base.eth_tp_mdix = req0->eth_tp_mdix;
|
||||
+ cmd->base.eth_tp_mdix_ctrl = req0->eth_tp_mdix_ctrl;
|
||||
+ supported = le32_to_cpu(req0->supported);
|
||||
+ advertising = le32_to_cpu(req0->advertising);
|
||||
+ lp_advertising = le32_to_cpu(req0->lp_advertising);
|
||||
+ ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
|
||||
+ supported);
|
||||
+ ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
|
||||
+ advertising);
|
||||
+ ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising,
|
||||
+ lp_advertising);
|
||||
+
|
||||
+ req1 = (struct hclge_phy_link_ksetting_1_cmd *)desc[1].data;
|
||||
+ cmd->base.master_slave_cfg = req1->master_slave_cfg;
|
||||
+ cmd->base.master_slave_state = req1->master_slave_state;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+hclge_set_phy_link_ksettings(struct hnae3_handle *handle,
|
||||
+ const struct ethtool_link_ksettings *cmd)
|
||||
+{
|
||||
+ struct hclge_desc desc[HCLGE_PHY_LINK_SETTING_BD_NUM];
|
||||
+ struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
+ struct hclge_phy_link_ksetting_0_cmd *req0;
|
||||
+ struct hclge_phy_link_ksetting_1_cmd *req1;
|
||||
+ struct hclge_dev *hdev = vport->back;
|
||||
+ u32 advertising;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (cmd->base.autoneg == AUTONEG_DISABLE &&
|
||||
+ ((cmd->base.speed != SPEED_100 && cmd->base.speed != SPEED_10) ||
|
||||
+ (cmd->base.duplex != DUPLEX_HALF &&
|
||||
+ cmd->base.duplex != DUPLEX_FULL)))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_PHY_LINK_KSETTING,
|
||||
+ false);
|
||||
+ desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
+ hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_PHY_LINK_KSETTING,
|
||||
+ false);
|
||||
+
|
||||
+ req0 = (struct hclge_phy_link_ksetting_0_cmd *)desc[0].data;
|
||||
+ req0->autoneg = cmd->base.autoneg;
|
||||
+ req0->speed = cpu_to_le32(cmd->base.speed);
|
||||
+ req0->duplex = cmd->base.duplex;
|
||||
+ ethtool_convert_link_mode_to_legacy_u32(&advertising,
|
||||
+ cmd->link_modes.advertising);
|
||||
+ req0->advertising = cpu_to_le32(advertising);
|
||||
+ req0->eth_tp_mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;
|
||||
+
|
||||
+ req1 = (struct hclge_phy_link_ksetting_1_cmd *)desc[1].data;
|
||||
+ req1->master_slave_cfg = cmd->base.master_slave_cfg;
|
||||
+
|
||||
+ ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_PHY_LINK_SETTING_BD_NUM);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to set phy link ksettings, ret = %d.\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ hdev->hw.mac.autoneg = cmd->base.autoneg;
|
||||
+ hdev->hw.mac.speed = cmd->base.speed;
|
||||
+ hdev->hw.mac.duplex = cmd->base.duplex;
|
||||
+ linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hclge_update_tp_port_info(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct ethtool_link_ksettings cmd;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!hnae3_dev_phy_imp_supported(hdev))
|
||||
+ return 0;
|
||||
+
|
||||
+ ret = hclge_get_phy_link_ksettings(&hdev->vport->nic, &cmd);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ hdev->hw.mac.autoneg = cmd.base.autoneg;
|
||||
+ hdev->hw.mac.speed = cmd.base.speed;
|
||||
+ hdev->hw.mac.duplex = cmd.base.duplex;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hclge_tp_port_init(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct ethtool_link_ksettings cmd;
|
||||
+
|
||||
+ if (!hnae3_dev_phy_imp_supported(hdev))
|
||||
+ return 0;
|
||||
+
|
||||
+ cmd.base.autoneg = hdev->hw.mac.autoneg;
|
||||
+ cmd.base.speed = hdev->hw.mac.speed;
|
||||
+ cmd.base.duplex = hdev->hw.mac.duplex;
|
||||
+ linkmode_copy(cmd.link_modes.advertising, hdev->hw.mac.advertising);
|
||||
+
|
||||
+ return hclge_set_phy_link_ksettings(&hdev->vport->nic, &cmd);
|
||||
+}
|
||||
+
|
||||
static int hclge_update_port_info(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_mac *mac = &hdev->hw.mac;
|
||||
@@ -2911,7 +3046,7 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
|
||||
|
||||
/* get the port info from SFP cmd if not copper port */
|
||||
if (mac->media_type == HNAE3_MEDIA_TYPE_COPPER)
|
||||
- return 0;
|
||||
+ return hclge_update_tp_port_info(hdev);
|
||||
|
||||
/* if IMP does not support get SFP/qSFP info, return directly */
|
||||
if (!hdev->support_sfp_query)
|
||||
@@ -10419,7 +10554,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
if (ret)
|
||||
goto err_msi_irq_uninit;
|
||||
|
||||
- if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER) {
|
||||
+ if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER &&
|
||||
+ !hnae3_dev_phy_imp_supported(hdev)) {
|
||||
ret = hclge_mac_mdio_config(hdev);
|
||||
if (ret)
|
||||
goto err_msi_irq_uninit;
|
||||
@@ -10796,6 +10932,13 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ ret = hclge_tp_port_init(hdev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to init tp port, ret = %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
ret = hclge_config_tso(hdev, HCLGE_TSO_MSS_MIN, HCLGE_TSO_MSS_MAX);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Enable tso fail, ret =%d\n", ret);
|
||||
@@ -11791,6 +11934,8 @@ struct hnae3_ae_ops hclge_ops = {
|
||||
.set_vf_mac = hclge_set_vf_mac,
|
||||
.get_module_eeprom = hclge_get_module_eeprom,
|
||||
.get_cmdq_stat = hclge_get_cmdq_stat,
|
||||
+ .get_phy_link_ksettings = hclge_get_phy_link_ksettings,
|
||||
+ .set_phy_link_ksettings = hclge_set_phy_link_ksettings,
|
||||
};
|
||||
|
||||
static struct hnae3_ae_algo ae_algo = {
|
||||
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
|
||||
index dc69391d2bba..4a43996de6d0 100644
|
||||
--- a/include/uapi/linux/ethtool.h
|
||||
+++ b/include/uapi/linux/ethtool.h
|
||||
@@ -1836,7 +1836,13 @@ struct ethtool_link_settings {
|
||||
__u8 eth_tp_mdix_ctrl;
|
||||
__s8 link_mode_masks_nwords;
|
||||
__u8 transceiver;
|
||||
- __u8 reserved1[3];
|
||||
+#ifndef __GENKSYMS__
|
||||
+ __u8 master_slave_cfg;
|
||||
+ __u8 master_slave_state;
|
||||
+ __u8 reserved1[1];
|
||||
+#else
|
||||
+ __u8 reserved1[3];
|
||||
+#endif
|
||||
__u32 reserved[7];
|
||||
__u32 link_mode_masks[0];
|
||||
/* layout of link_mode_masks fields:
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,75 @@
|
||||
From 161e7c4611fd6cebddc02d77b245236cb5c87b96 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:49 +0800
|
||||
Subject: [PATCH 057/283] net: hns3: add get/set pause parameters support for
|
||||
imp-controlled PHYs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 57a8f46b1bd3f5f43b06f48aab7c1f7ca0936be3
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=57a8f46b1bd3f5f43b06f48aab7c1f7ca0936be3
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
When the imp-controlled PHYs feature is enabled, phydev is NULL.
|
||||
In this case, the autoneg is always off when user uses ethtool -a
|
||||
command to get pause parameters because hclge_get_pauseparam()
|
||||
uses phydev to check whether device is TP port. To fit this new
|
||||
feature, use media type to check whether device is TP port.
|
||||
|
||||
And when user set pause parameters, these parameters need to
|
||||
always set to mac, no matter whether autoneg is off.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 115e70fcce36..c73348bc7706 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -9935,9 +9935,10 @@ static void hclge_get_pauseparam(struct hnae3_handle *handle, u32 *auto_neg,
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
- struct phy_device *phydev = hdev->hw.mac.phydev;
|
||||
+ u8 media_type = hdev->hw.mac.media_type;
|
||||
|
||||
- *auto_neg = phydev ? hclge_get_autoneg(handle) : 0;
|
||||
+ *auto_neg = (media_type == HNAE3_MEDIA_TYPE_COPPER) ?
|
||||
+ hclge_get_autoneg(handle) : 0;
|
||||
|
||||
if (hdev->tm_info.fc_mode == HCLGE_FC_PFC) {
|
||||
*rx_en = 0;
|
||||
@@ -9983,7 +9984,7 @@ static int hclge_set_pauseparam(struct hnae3_handle *handle, u32 auto_neg,
|
||||
struct phy_device *phydev = hdev->hw.mac.phydev;
|
||||
u32 fc_autoneg;
|
||||
|
||||
- if (phydev) {
|
||||
+ if (phydev || hnae3_dev_phy_imp_supported(hdev)) {
|
||||
fc_autoneg = hclge_get_autoneg(handle);
|
||||
if (auto_neg != fc_autoneg) {
|
||||
dev_info(&hdev->pdev->dev,
|
||||
@@ -10002,7 +10003,7 @@ static int hclge_set_pauseparam(struct hnae3_handle *handle, u32 auto_neg,
|
||||
|
||||
hclge_record_user_pauseparam(hdev, rx_en, tx_en);
|
||||
|
||||
- if (!auto_neg)
|
||||
+ if (!auto_neg || hnae3_dev_phy_imp_supported(hdev))
|
||||
return hclge_cfg_pauseparam(hdev, rx_en, tx_en);
|
||||
|
||||
if (phydev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,168 @@
|
||||
From 42e18be60daee3fa262b80bf8dff791862fb1137 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:50 +0800
|
||||
Subject: [PATCH 058/283] net: hns3: add ioctl support for imp-controlled PHYs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 024712f51e5711d69ced729fb3398819ed6e8b53
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=024712f51e5711d69ced729fb3398819ed6e8b53
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
When the imp-controlled PHYs feature is enabled, driver will not
|
||||
register mdio bus. In order to support ioctl ops for phy tool to
|
||||
read or write phy register in this case, the firmware implement
|
||||
a new command for driver and driver implement ioctl by using this
|
||||
new command.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 8 ++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 26 ++++++++++++-
|
||||
.../hisilicon/hns3/hns3pf/hclge_mdio.c | 39 +++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_mdio.h | 2 +
|
||||
4 files changed, 74 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 2922cd1bc859..88aefd3685a7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -311,6 +311,7 @@ enum hclge_opcode_type {
|
||||
|
||||
/* PHY command */
|
||||
HCLGE_OPC_PHY_LINK_KSETTING = 0x7025,
|
||||
+ HCLGE_OPC_PHY_REG = 0x7026,
|
||||
};
|
||||
|
||||
#define HCLGE_TQP_REG_OFFSET 0x80000
|
||||
@@ -1175,6 +1176,13 @@ struct hclge_phy_link_ksetting_1_cmd {
|
||||
u8 rsv[22];
|
||||
};
|
||||
|
||||
+struct hclge_phy_reg_cmd {
|
||||
+ __le16 reg_addr;
|
||||
+ u8 rsv0[2];
|
||||
+ __le16 reg_val;
|
||||
+ u8 rsv1[18];
|
||||
+};
|
||||
+
|
||||
int hclge_cmd_init(struct hclge_dev *hdev);
|
||||
static inline void hclge_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
{
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index c73348bc7706..abd79d4bc56d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -8457,6 +8457,30 @@ static int hclge_set_mac_addr(struct hnae3_handle *handle, void *p,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int hclge_mii_ioctl(struct hclge_dev *hdev, struct ifreq *ifr, int cmd)
|
||||
+{
|
||||
+ struct mii_ioctl_data *data = if_mii(ifr);
|
||||
+
|
||||
+ if (!hnae3_dev_phy_imp_supported(hdev))
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case SIOCGMIIPHY:
|
||||
+ data->phy_id = hdev->hw.mac.phy_addr;
|
||||
+ data->val_out = hclge_read_phy_reg(hdev, data->reg_num);
|
||||
+ return 0;
|
||||
+ /* this command reads phy id and register at the same time */
|
||||
+ case SIOCGMIIREG:
|
||||
+ data->val_out = hclge_read_phy_reg(hdev, data->reg_num);
|
||||
+ return 0;
|
||||
+
|
||||
+ case SIOCSMIIREG:
|
||||
+ return hclge_write_phy_reg(hdev, data->reg_num, data->val_in);
|
||||
+ default:
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int hclge_do_ioctl(struct hnae3_handle *handle, struct ifreq *ifr,
|
||||
int cmd)
|
||||
{
|
||||
@@ -8464,7 +8488,7 @@ static int hclge_do_ioctl(struct hnae3_handle *handle, struct ifreq *ifr,
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
if (!hdev->hw.mac.phydev)
|
||||
- return -EOPNOTSUPP;
|
||||
+ return hclge_mii_ioctl(hdev, ifr, cmd);
|
||||
|
||||
return phy_mii_ioctl(hdev->hw.mac.phydev, ifr, cmd);
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
index 3eea4870a56a..b9c81e2e60b2 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
|
||||
@@ -293,3 +293,42 @@ void hclge_mac_stop_phy(struct hclge_dev *hdev)
|
||||
|
||||
phy_stop(phydev);
|
||||
}
|
||||
+
|
||||
+u16 hclge_read_phy_reg(struct hclge_dev *hdev, u16 reg_addr)
|
||||
+{
|
||||
+ struct hclge_phy_reg_cmd *req;
|
||||
+ struct hclge_desc desc;
|
||||
+ int ret;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PHY_REG, true);
|
||||
+
|
||||
+ req = (struct hclge_phy_reg_cmd *)desc.data;
|
||||
+ req->reg_addr = cpu_to_le16(reg_addr);
|
||||
+
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (ret)
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to read phy reg, ret = %d.\n", ret);
|
||||
+
|
||||
+ return le16_to_cpu(req->reg_val);
|
||||
+}
|
||||
+
|
||||
+int hclge_write_phy_reg(struct hclge_dev *hdev, u16 reg_addr, u16 val)
|
||||
+{
|
||||
+ struct hclge_phy_reg_cmd *req;
|
||||
+ struct hclge_desc desc;
|
||||
+ int ret;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PHY_REG, false);
|
||||
+
|
||||
+ req = (struct hclge_phy_reg_cmd *)desc.data;
|
||||
+ req->reg_addr = cpu_to_le16(reg_addr);
|
||||
+ req->reg_val = cpu_to_le16(val);
|
||||
+
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (ret)
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to write phy reg, ret = %d.\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
|
||||
index ef095d9c566f..7e019be3816a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
|
||||
@@ -9,5 +9,7 @@ int hclge_mac_connect_phy(struct hnae3_handle *handle);
|
||||
void hclge_mac_disconnect_phy(struct hnae3_handle *handle);
|
||||
void hclge_mac_start_phy(struct hclge_dev *hdev);
|
||||
void hclge_mac_stop_phy(struct hclge_dev *hdev);
|
||||
+u16 hclge_read_phy_reg(struct hclge_dev *hdev, u16 reg_addr);
|
||||
+int hclge_write_phy_reg(struct hclge_dev *hdev, u16 reg_addr, u16 val);
|
||||
|
||||
#endif
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,314 @@
|
||||
From 2c4c382df8cddb5878faaf8ec544ddaf2ae276e2 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:51 +0800
|
||||
Subject: [PATCH 059/283] net: hns3: add phy loopback support for
|
||||
imp-controlled PHYs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit b47cfe1f402dbf10279b8f12131388fdff9d2259
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b47cfe1f402dbf10279b8f12131388fdff9d2259
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
If the imp-controlled PHYs feature is enabled, driver can not
|
||||
call phy driver interface to set loopback anymore and needs
|
||||
to send command to firmware to start phy loopback.
|
||||
|
||||
Driver reuses the existing firmware command 0x0315 to start
|
||||
phy loopback, just add a setting bit in this command. As this
|
||||
command is not only for serdes loopback anymore, rename this
|
||||
command to "xxx_COMMON_LOOPBACK", and modify function name,
|
||||
macro name and logs related to it.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3_cae/hns3_cae_mac.c | 4 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 9 +--
|
||||
.../hisilicon/hns3/hns3pf/hclge_debugfs.c | 32 ++++++----
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 64 ++++++++++---------
|
||||
4 files changed, 58 insertions(+), 51 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_cae_mac.c b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_cae_mac.c
|
||||
index acbb684cf43b..fe71b673e00d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_cae_mac.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_cae_mac.c
|
||||
@@ -61,7 +61,7 @@ int hns3_cae_mac_loop_cfg(const struct hns3_nic_priv *net_priv,
|
||||
out_info->rx2tx_loop_en =
|
||||
hnae3_get_bit(req2->txrx_pad_fcs_loop_en,
|
||||
HCLGE_MAC_LINE_LP_B);
|
||||
- hns3_cae_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK,
|
||||
+ hns3_cae_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK,
|
||||
true);
|
||||
ret = hns3_cae_cmd_send(hdev, &desc, 1);
|
||||
if (ret) {
|
||||
@@ -111,7 +111,7 @@ int hns3_cae_mac_loop_cfg(const struct hns3_nic_priv *net_priv,
|
||||
}
|
||||
} else {
|
||||
hns3_cae_cmd_setup_basic_desc(&desc,
|
||||
- HCLGE_OPC_SERDES_LOOPBACK,
|
||||
+ HCLGE_OPC_COMMON_LOOPBACK,
|
||||
true);
|
||||
ret = hns3_cae_cmd_send(hdev, &desc, 1);
|
||||
if (ret) {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 88aefd3685a7..028ff1722614 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -127,7 +127,7 @@ enum hclge_opcode_type {
|
||||
HCLGE_OPC_QUERY_MAC_TNL_INT = 0x0310,
|
||||
HCLGE_OPC_MAC_TNL_INT_EN = 0x0311,
|
||||
HCLGE_OPC_CLEAR_MAC_TNL_INT = 0x0312,
|
||||
- HCLGE_OPC_SERDES_LOOPBACK = 0x0315,
|
||||
+ HCLGE_OPC_COMMON_LOOPBACK = 0x0315,
|
||||
HCLGE_OPC_CONFIG_FEC_MODE = 0x031A,
|
||||
/* check sum command */
|
||||
HCLGE_OPC_CFG_CHECKSUM_EN = 0x0601,
|
||||
@@ -976,9 +976,10 @@ struct hclge_pf_rst_done_cmd {
|
||||
|
||||
#define HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B BIT(0)
|
||||
#define HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B BIT(2)
|
||||
-#define HCLGE_CMD_SERDES_DONE_B BIT(0)
|
||||
-#define HCLGE_CMD_SERDES_SUCCESS_B BIT(1)
|
||||
-struct hclge_serdes_lb_cmd {
|
||||
+#define HCLGE_CMD_GE_PHY_INNER_LOOP_B BIT(3)
|
||||
+#define HCLGE_CMD_COMMON_LB_DONE_B BIT(0)
|
||||
+#define HCLGE_CMD_COMMON_LB_SUCCESS_B BIT(1)
|
||||
+struct hclge_common_lb_cmd {
|
||||
u8 mask;
|
||||
u8 enable;
|
||||
u8 result;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
index e73e10d17222..c65abb2c2b09 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
@@ -1845,14 +1845,14 @@ static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len)
|
||||
{
|
||||
struct phy_device *phydev = hdev->hw.mac.phydev;
|
||||
struct hclge_config_mac_mode_cmd *req_app;
|
||||
- struct hclge_serdes_lb_cmd *req_serdes;
|
||||
+ struct hclge_common_lb_cmd *req_common;
|
||||
struct hclge_desc desc;
|
||||
u8 loopback_en;
|
||||
int pos = 0;
|
||||
int ret;
|
||||
|
||||
req_app = (struct hclge_config_mac_mode_cmd *)desc.data;
|
||||
- req_serdes = (struct hclge_serdes_lb_cmd *)desc.data;
|
||||
+ req_common = (struct hclge_common_lb_cmd *)desc.data;
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos, "mac id: %u\n",
|
||||
hdev->hw.mac.mac_id);
|
||||
@@ -1870,28 +1870,32 @@ static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len)
|
||||
pos += scnprintf(buf + pos, len - pos, "app loopback: %s\n",
|
||||
state_str[loopback_en]);
|
||||
|
||||
- hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK, true);
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK, true);
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "failed to dump serdes loopback status, ret = %d\n",
|
||||
+ "failed to dump common loopback status, ret = %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
- loopback_en = req_serdes->enable & HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
|
||||
- pos += scnprintf(buf + pos, len - pos, "serdes serial loopback: %s\n",
|
||||
- state_str[loopback_en]);
|
||||
+ loopback_en = req_common->enable & HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
|
||||
+ dev_info(&hdev->pdev->dev, "serdes serial loopback: %s\n",
|
||||
+ loopback_en ? "on" : "off");
|
||||
|
||||
- loopback_en = req_serdes->enable &
|
||||
- HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B ? 1 : 0;
|
||||
- pos += scnprintf(buf + pos, len - pos, "serdes parallel loopback: %s\n",
|
||||
- state_str[loopback_en]);
|
||||
+ loopback_en = req_common->enable &
|
||||
+ HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B;
|
||||
+ dev_info(&hdev->pdev->dev, "serdes parallel loopback: %s\n",
|
||||
+ loopback_en ? "on" : "off");
|
||||
|
||||
if (phydev) {
|
||||
- loopback_en = phydev->loopback_enabled;
|
||||
- pos += scnprintf(buf + pos, len - pos, "phy loopback: %s\n",
|
||||
- state_str[loopback_en]);
|
||||
+ dev_info(&hdev->pdev->dev, "phy loopback: %s\n",
|
||||
+ phydev->loopback_enabled ? "on" : "off");
|
||||
+ } else if (hnae3_dev_phy_imp_supported(hdev)) {
|
||||
+ loopback_en = req_common->enable &
|
||||
+ HCLGE_CMD_GE_PHY_INNER_LOOP_B;
|
||||
+ dev_info(&hdev->pdev->dev, "phy loopback: %s\n",
|
||||
+ loopback_en ? "on" : "off");
|
||||
}
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index abd79d4bc56d..949dfc433e3e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -752,8 +752,9 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
|
||||
handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
|
||||
handle->flags |= HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
|
||||
|
||||
- if (hdev->hw.mac.phydev && hdev->hw.mac.phydev->drv &&
|
||||
- hdev->hw.mac.phydev->drv->set_loopback) {
|
||||
+ if ((hdev->hw.mac.phydev && hdev->hw.mac.phydev->drv &&
|
||||
+ hdev->hw.mac.phydev->drv->set_loopback) ||
|
||||
+ hnae3_dev_phy_imp_supported(hdev)) {
|
||||
count += 1;
|
||||
handle->flags |= HNAE3_SUPPORT_PHY_LOOPBACK;
|
||||
}
|
||||
@@ -6863,19 +6864,19 @@ static int hclge_set_app_loopback(struct hclge_dev *hdev, bool en)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int hclge_cfg_serdes_loopback(struct hclge_dev *hdev, bool en,
|
||||
+static int hclge_cfg_common_loopback(struct hclge_dev *hdev, bool en,
|
||||
enum hnae3_loop loop_mode)
|
||||
{
|
||||
-#define HCLGE_SERDES_RETRY_MS 10
|
||||
-#define HCLGE_SERDES_RETRY_NUM 100
|
||||
+#define HCLGE_COMMON_LB_RETRY_MS 10
|
||||
+#define HCLGE_COMMON_LB_RETRY_NUM 100
|
||||
|
||||
- struct hclge_serdes_lb_cmd *req;
|
||||
+ struct hclge_common_lb_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
int ret, i = 0;
|
||||
u8 loop_mode_b;
|
||||
|
||||
- req = (struct hclge_serdes_lb_cmd *)desc.data;
|
||||
- hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK, false);
|
||||
+ req = (struct hclge_common_lb_cmd *)desc.data;
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK, false);
|
||||
|
||||
switch (loop_mode) {
|
||||
case HNAE3_LOOP_SERIAL_SERDES:
|
||||
@@ -6884,9 +6885,12 @@ static int hclge_cfg_serdes_loopback(struct hclge_dev *hdev, bool en,
|
||||
case HNAE3_LOOP_PARALLEL_SERDES:
|
||||
loop_mode_b = HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B;
|
||||
break;
|
||||
+ case HNAE3_LOOP_PHY:
|
||||
+ loop_mode_b = HCLGE_CMD_GE_PHY_INNER_LOOP_B;
|
||||
+ break;
|
||||
default:
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "unsupported serdes loopback mode %d\n", loop_mode);
|
||||
+ "unsupported common loopback mode %d\n", loop_mode);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
@@ -6900,45 +6904,39 @@ static int hclge_cfg_serdes_loopback(struct hclge_dev *hdev, bool en,
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "serdes loopback set fail, ret = %d\n", ret);
|
||||
+ "common loopback set fail, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
do {
|
||||
- msleep(HCLGE_SERDES_RETRY_MS);
|
||||
- hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK,
|
||||
+ msleep(HCLGE_COMMON_LB_RETRY_MS);
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK,
|
||||
true);
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "serdes loopback get, ret = %d\n", ret);
|
||||
+ "common loopback get, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
- } while (++i < HCLGE_SERDES_RETRY_NUM &&
|
||||
- !(req->result & HCLGE_CMD_SERDES_DONE_B));
|
||||
+ } while (++i < HCLGE_COMMON_LB_RETRY_NUM &&
|
||||
+ !(req->result & HCLGE_CMD_COMMON_LB_DONE_B));
|
||||
|
||||
- if (!(req->result & HCLGE_CMD_SERDES_DONE_B)) {
|
||||
- dev_err(&hdev->pdev->dev, "serdes loopback set timeout\n");
|
||||
+ if (!(req->result & HCLGE_CMD_COMMON_LB_DONE_B)) {
|
||||
+ dev_err(&hdev->pdev->dev, "common loopback set timeout\n");
|
||||
return -EBUSY;
|
||||
- } else if (!(req->result & HCLGE_CMD_SERDES_SUCCESS_B)) {
|
||||
- dev_err(&hdev->pdev->dev, "serdes loopback set failed in fw\n");
|
||||
+ } else if (!(req->result & HCLGE_CMD_COMMON_LB_SUCCESS_B)) {
|
||||
+ dev_err(&hdev->pdev->dev, "common loopback set failed in fw\n");
|
||||
return -EIO;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
|
||||
+static int hclge_set_common_loopback(struct hclge_dev *hdev, bool en,
|
||||
enum hnae3_loop loop_mode)
|
||||
{
|
||||
- u8 duplex;
|
||||
int ret;
|
||||
|
||||
- duplex = en ? DUPLEX_FULL : hdev->hw.mac.duplex;
|
||||
- ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, duplex);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- ret = hclge_cfg_serdes_loopback(hdev, en, loop_mode);
|
||||
+ ret = hclge_cfg_common_loopback(hdev, en, loop_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -7000,8 +6998,12 @@ static int hclge_set_phy_loopback(struct hclge_dev *hdev, bool en)
|
||||
u8 duplex;
|
||||
int ret;
|
||||
|
||||
- if (!phydev)
|
||||
+ if (!phydev) {
|
||||
+ if (hnae3_dev_phy_imp_supported(hdev))
|
||||
+ return hclge_set_common_loopback(hdev, en,
|
||||
+ HNAE3_LOOP_PHY);
|
||||
return -ENOTSUPP;
|
||||
+ }
|
||||
|
||||
duplex = en ? DUPLEX_FULL : hdev->hw.mac.duplex;
|
||||
ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, duplex);
|
||||
@@ -7086,7 +7088,7 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
|
||||
break;
|
||||
case HNAE3_LOOP_SERIAL_SERDES:
|
||||
case HNAE3_LOOP_PARALLEL_SERDES:
|
||||
- ret = hclge_set_serdes_loopback(hdev, en, loop_mode);
|
||||
+ ret = hclge_set_common_loopback(hdev, en, loop_mode);
|
||||
break;
|
||||
case HNAE3_LOOP_PHY:
|
||||
ret = hclge_set_phy_loopback(hdev, en);
|
||||
@@ -7117,11 +7119,11 @@ static int hclge_set_default_loopback(struct hclge_dev *hdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = hclge_cfg_serdes_loopback(hdev, false, HNAE3_LOOP_SERIAL_SERDES);
|
||||
+ ret = hclge_cfg_common_loopback(hdev, false, HNAE3_LOOP_SERIAL_SERDES);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- return hclge_cfg_serdes_loopback(hdev, false,
|
||||
+ return hclge_cfg_common_loopback(hdev, false,
|
||||
HNAE3_LOOP_PARALLEL_SERDES);
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,286 @@
|
||||
From a5121f5fd129c3af716088c90b4e986466bd27b7 Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sun, 27 Sep 2020 15:12:45 +0800
|
||||
Subject: [PATCH 060/283] net: hns3: add support to query device specifications
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.10-rc1
|
||||
commit af2aedc57277dfd1d9ebe16777cf84dccce8e68d
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=af2aedc57277dfd1d9ebe16777cf84dccce8e68d
|
||||
--------------------------------
|
||||
|
||||
To improve code maintainability and compatibility, new commands
|
||||
HCLGE_OPC_QUERY_DEV_SPECS for PF and HCLGEVF_OPC_QUERY_DEV_SPECS
|
||||
for VF are introduced to query device specifications, instead of
|
||||
statically defining specifications by checking the hardware version
|
||||
or other methods.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 11 ++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 6 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 62 ++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 15 +++++
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 64 +++++++++++++++++++
|
||||
5 files changed, 155 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 99fe5603ef1c..6a21c1b0434e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -321,6 +321,16 @@ struct hnae3_ring_chain_node {
|
||||
#define HNAE3_IS_TX_RING(node) \
|
||||
(((node)->flag & 1 << HNAE3_RING_TYPE_B) == HNAE3_RING_TYPE_TX)
|
||||
|
||||
+/* device specification info from firmware */
|
||||
+struct hnae3_dev_specs {
|
||||
+ u32 mac_entry_num; /* number of mac-vlan table entry */
|
||||
+ u32 mng_entry_num; /* number of manager table entry */
|
||||
+ u16 rss_ind_tbl_size;
|
||||
+ u16 rss_key_size;
|
||||
+ u16 int_ql_max; /* max value of interrupt coalesce based on INT_QL */
|
||||
+ u8 max_non_tso_bd_num; /* max BD number of one non-TSO packet */
|
||||
+};
|
||||
+
|
||||
struct hnae3_client_ops {
|
||||
int (*init_instance)(struct hnae3_handle *handle);
|
||||
void (*uninit_instance)(struct hnae3_handle *handle, bool reset);
|
||||
@@ -348,6 +358,7 @@ struct hnae3_ae_dev {
|
||||
u32 flag;
|
||||
unsigned long hw_err_reset_req;
|
||||
#ifndef __GENKSYMS__
|
||||
+ struct hnae3_dev_specs dev_specs;
|
||||
u32 dev_version;
|
||||
unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)];
|
||||
#endif
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 028ff1722614..865316591916 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -116,7 +116,8 @@ enum hclge_opcode_type {
|
||||
HCLGE_OPC_DFX_RCB_REG = 0x004D,
|
||||
HCLGE_OPC_DFX_TQP_REG = 0x004E,
|
||||
HCLGE_OPC_DFX_SSU_REG_2 = 0x004F,
|
||||
- HCLGE_OPC_DFX_QUERY_CHIP_CAP = 0x0050,
|
||||
+
|
||||
+ HCLGE_OPC_QUERY_DEV_SPECS = 0x0050,
|
||||
|
||||
/* MAC command */
|
||||
HCLGE_OPC_CONFIG_MAC_MODE = 0x0301,
|
||||
@@ -1141,8 +1142,7 @@ struct hclge_dev_specs_0_cmd {
|
||||
__le16 rss_key_size;
|
||||
__le16 int_ql_max;
|
||||
u8 max_non_tso_bd_num;
|
||||
- u8 rsv1;
|
||||
- __le32 max_tm_rate;
|
||||
+ u8 rsv1[5];
|
||||
};
|
||||
|
||||
#define HCLGE_DEF_MAX_INT_GL 0x1FE0U
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 949dfc433e3e..67b0279303cd 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1356,6 +1356,61 @@ static int hclge_get_cfg(struct hclge_dev *hdev, struct hclge_cfg *hcfg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void hclge_set_default_dev_specs(struct hclge_dev *hdev)
|
||||
+{
|
||||
+#define HCLGE_MAX_NON_TSO_BD_NUM 8U
|
||||
+
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+
|
||||
+ ae_dev->dev_specs.max_non_tso_bd_num = HCLGE_MAX_NON_TSO_BD_NUM;
|
||||
+ ae_dev->dev_specs.rss_ind_tbl_size = HCLGE_RSS_IND_TBL_SIZE;
|
||||
+ ae_dev->dev_specs.rss_key_size = HCLGE_RSS_KEY_SIZE;
|
||||
+}
|
||||
+
|
||||
+static void hclge_parse_dev_specs(struct hclge_dev *hdev,
|
||||
+ struct hclge_desc *desc)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ struct hclge_dev_specs_0_cmd *req0;
|
||||
+
|
||||
+ req0 = (struct hclge_dev_specs_0_cmd *)desc[0].data;
|
||||
+
|
||||
+ ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
+ ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
+ le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
+ ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
+}
|
||||
+
|
||||
+static int hclge_query_dev_specs(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hclge_desc desc[HCLGE_QUERY_DEV_SPECS_BD_NUM];
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+
|
||||
+ /* set default specifications as devices lower than version V3 do not
|
||||
+ * support querying specifications from firmware.
|
||||
+ */
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3) {
|
||||
+ hclge_set_default_dev_specs(hdev);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < HCLGE_QUERY_DEV_SPECS_BD_NUM - 1; i++) {
|
||||
+ hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_QUERY_DEV_SPECS,
|
||||
+ true);
|
||||
+ desc[i].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
+ }
|
||||
+ hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_QUERY_DEV_SPECS, true);
|
||||
+
|
||||
+ ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_QUERY_DEV_SPECS_BD_NUM);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ hclge_parse_dev_specs(hdev, desc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int hclge_get_cap(struct hclge_dev *hdev)
|
||||
{
|
||||
int ret;
|
||||
@@ -10551,6 +10606,13 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
if (ret)
|
||||
goto err_cmd_uninit;
|
||||
|
||||
+ ret = hclge_query_dev_specs(hdev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to query dev specifications, ret = %d.\n",
|
||||
+ ret);
|
||||
+ goto err_cmd_uninit;
|
||||
+ }
|
||||
+
|
||||
ret = hclge_configure(hdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Configure dev error, ret = %d.\n", ret);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index 7d021cb394c5..942a1d7406a0 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -92,6 +92,8 @@ enum hclgevf_opcode_type {
|
||||
/* Generic command */
|
||||
HCLGEVF_OPC_QUERY_FW_VER = 0x0001,
|
||||
HCLGEVF_OPC_QUERY_VF_RSRC = 0x0024,
|
||||
+ HCLGEVF_OPC_QUERY_DEV_SPECS = 0x0050,
|
||||
+
|
||||
/* TQP command */
|
||||
HCLGEVF_OPC_QUERY_TX_STATUS = 0x0B03,
|
||||
HCLGEVF_OPC_QUERY_RX_STATUS = 0x0B13,
|
||||
@@ -272,6 +274,19 @@ struct hclgevf_cfg_tx_queue_pointer_cmd {
|
||||
|
||||
#define HCLGEVF_RING_BASEADDR_SHIFT 32
|
||||
|
||||
+#define HCLGEVF_QUERY_DEV_SPECS_BD_NUM 4
|
||||
+
|
||||
+struct hclgevf_dev_specs_0_cmd {
|
||||
+ __le32 rsv0;
|
||||
+ __le32 mac_entry_num;
|
||||
+ __le32 mng_entry_num;
|
||||
+ __le16 rss_ind_tbl_size;
|
||||
+ __le16 rss_key_size;
|
||||
+ __le16 int_ql_max;
|
||||
+ u8 max_non_tso_bd_num;
|
||||
+ u8 rsv1[5];
|
||||
+};
|
||||
+
|
||||
static inline void hclgevf_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
{
|
||||
writel(value, base + reg);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index accec5762d91..eed608ebe0a6 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -3038,6 +3038,63 @@ static int hclgevf_query_vf_resource(struct hclgevf_dev *hdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void hclgevf_set_default_dev_specs(struct hclgevf_dev *hdev)
|
||||
+{
|
||||
+#define HCLGEVF_MAX_NON_TSO_BD_NUM 8U
|
||||
+
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+
|
||||
+ ae_dev->dev_specs.max_non_tso_bd_num =
|
||||
+ HCLGEVF_MAX_NON_TSO_BD_NUM;
|
||||
+ ae_dev->dev_specs.rss_ind_tbl_size = HCLGEVF_RSS_IND_TBL_SIZE;
|
||||
+ ae_dev->dev_specs.rss_key_size = HCLGEVF_RSS_KEY_SIZE;
|
||||
+}
|
||||
+
|
||||
+static void hclgevf_parse_dev_specs(struct hclgevf_dev *hdev,
|
||||
+ struct hclgevf_desc *desc)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ struct hclgevf_dev_specs_0_cmd *req0;
|
||||
+
|
||||
+ req0 = (struct hclgevf_dev_specs_0_cmd *)desc[0].data;
|
||||
+
|
||||
+ ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
+ ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
+ le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
+ ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
+}
|
||||
+
|
||||
+static int hclgevf_query_dev_specs(struct hclgevf_dev *hdev)
|
||||
+{
|
||||
+ struct hclgevf_desc desc[HCLGEVF_QUERY_DEV_SPECS_BD_NUM];
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+
|
||||
+ /* set default specifications as devices lower than version V3 do not
|
||||
+ * support querying specifications from firmware.
|
||||
+ */
|
||||
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3) {
|
||||
+ hclgevf_set_default_dev_specs(hdev);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < HCLGEVF_QUERY_DEV_SPECS_BD_NUM - 1; i++) {
|
||||
+ hclgevf_cmd_setup_basic_desc(&desc[i],
|
||||
+ HCLGEVF_OPC_QUERY_DEV_SPECS, true);
|
||||
+ desc[i].flag |= cpu_to_le16(HCLGEVF_CMD_FLAG_NEXT);
|
||||
+ }
|
||||
+ hclgevf_cmd_setup_basic_desc(&desc[i], HCLGEVF_OPC_QUERY_DEV_SPECS,
|
||||
+ true);
|
||||
+
|
||||
+ ret = hclgevf_cmd_send(&hdev->hw, desc, HCLGEVF_QUERY_DEV_SPECS_BD_NUM);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ hclgevf_parse_dev_specs(hdev, desc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int hclgevf_pci_reset(struct hclgevf_dev *hdev)
|
||||
{
|
||||
struct pci_dev *pdev = hdev->pdev;
|
||||
@@ -3147,6 +3204,13 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
|
||||
if (ret)
|
||||
goto err_cmd_init;
|
||||
|
||||
+ ret = hclgevf_query_dev_specs(hdev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev,
|
||||
+ "failed to query dev specifications, ret = %d\n", ret);
|
||||
+ goto err_cmd_init;
|
||||
+ }
|
||||
+
|
||||
ret = hclgevf_init_msi(hdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed(%d) to init MSI/MSI-X\n", ret);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
497
patches/0422-net-hns3-remove-unused-code-of-vmdq.patch
Normal file
497
patches/0422-net-hns3-remove-unused-code-of-vmdq.patch
Normal file
@ -0,0 +1,497 @@
|
||||
From ec9d476015ea7b74fc96fb7e6215d1efcf5f542a Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:43:59 +0800
|
||||
Subject: [PATCH 061/283] net: hns3: remove unused code of vmdq
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 43f8b9333d86d4e3a42e55a6e41c78c249ac0216
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=43f8b9333d86d4e3a42e55a6e41c78c249ac0216
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Vmdq is not supported yet, the num_vmdq_vport is always 0,
|
||||
it's a bit confusing when using the num_vport, so remove
|
||||
these unused codes of vmdq.
|
||||
|
||||
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 2 -
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 247 ++++++++----------
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 2 -
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 1 -
|
||||
4 files changed, 102 insertions(+), 150 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 865316591916..b6498f8ce224 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -500,8 +500,6 @@ struct hclge_pf_res_cmd {
|
||||
#define HCLGE_CFG_RD_LEN_BYTES 16
|
||||
#define HCLGE_CFG_RD_LEN_UNIT 4
|
||||
|
||||
-#define HCLGE_CFG_VMDQ_S 0
|
||||
-#define HCLGE_CFG_VMDQ_M GENMASK(7, 0)
|
||||
#define HCLGE_CFG_TC_NUM_S 8
|
||||
#define HCLGE_CFG_TC_NUM_M GENMASK(15, 8)
|
||||
#define HCLGE_CFG_TQP_DESC_N_S 16
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 67b0279303cd..5885e1181517 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1266,9 +1266,6 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
|
||||
req = (struct hclge_cfg_param_cmd *)desc[0].data;
|
||||
|
||||
/* get the configuration */
|
||||
- cfg->vmdq_vport_num = hnae3_get_field(__le32_to_cpu(req->param[0]),
|
||||
- HCLGE_CFG_VMDQ_M,
|
||||
- HCLGE_CFG_VMDQ_S);
|
||||
cfg->tc_num = hnae3_get_field(__le32_to_cpu(req->param[0]),
|
||||
HCLGE_CFG_TC_NUM_M, HCLGE_CFG_TC_NUM_S);
|
||||
cfg->tqp_desc_num = hnae3_get_field(__le32_to_cpu(req->param[0]),
|
||||
@@ -1438,7 +1435,7 @@ static void hclge_init_kdump_kernel_config(struct hclge_dev *hdev)
|
||||
"Running kdump kernel. Using minimal resources\n");
|
||||
|
||||
/* minimal queue pairs equals to the number of vports */
|
||||
- hdev->num_tqps = hdev->num_vmdq_vport + hdev->num_req_vfs + 1;
|
||||
+ hdev->num_tqps = hdev->num_req_vfs + 1;
|
||||
hdev->num_tx_desc = HCLGE_MIN_TX_DESC;
|
||||
hdev->num_rx_desc = HCLGE_MIN_RX_DESC;
|
||||
}
|
||||
@@ -1455,7 +1452,6 @@ static int hclge_configure(struct hclge_dev *hdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- hdev->num_vmdq_vport = cfg.vmdq_vport_num;
|
||||
hdev->base_tqp_pid = 0;
|
||||
hdev->rss_size_max = cfg.rss_size_max;
|
||||
hdev->rx_buf_len = cfg.rx_buf_len;
|
||||
@@ -1697,8 +1693,8 @@ static int hclge_map_tqp(struct hclge_dev *hdev)
|
||||
struct hclge_vport *vport = hdev->vport;
|
||||
u16 i, num_vport;
|
||||
|
||||
- num_vport = hdev->num_vmdq_vport + hdev->num_req_vfs + 1;
|
||||
- for (i = 0; i < num_vport; i++) {
|
||||
+ num_vport = hdev->num_req_vfs + 1;
|
||||
+ for (i = 0; i < num_vport; i++) {
|
||||
int ret;
|
||||
|
||||
ret = hclge_map_tqp_to_vport(hdev, vport);
|
||||
@@ -1739,7 +1735,7 @@ static int hclge_alloc_vport(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
|
||||
/* We need to alloc a vport for main NIC of PF */
|
||||
- num_vport = hdev->num_vmdq_vport + hdev->num_req_vfs + 1;
|
||||
+ num_vport = hdev->num_req_vfs + 1;
|
||||
|
||||
if (hdev->num_tqps < num_vport) {
|
||||
dev_err(&hdev->pdev->dev, "tqps(%u) is less than vports(%d)",
|
||||
@@ -2825,13 +2821,12 @@ static void hclge_push_link_status(struct hclge_dev *hdev)
|
||||
|
||||
static void hclge_update_link_status(struct hclge_dev *hdev)
|
||||
{
|
||||
+ struct hnae3_handle *rhandle = &hdev->vport[0].roce;
|
||||
+ struct hnae3_handle *handle = &hdev->vport[0].nic;
|
||||
struct hnae3_client *rclient = hdev->roce_client;
|
||||
struct hnae3_client *client = hdev->nic_client;
|
||||
- struct hnae3_handle *rhandle;
|
||||
- struct hnae3_handle *handle;
|
||||
int state;
|
||||
int ret;
|
||||
- int i;
|
||||
|
||||
if (!client)
|
||||
return;
|
||||
@@ -2847,15 +2842,10 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
|
||||
|
||||
if (state != hdev->hw.mac.link) {
|
||||
hdev->hw.mac.link = state;
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- handle = &hdev->vport[i].nic;
|
||||
- client->ops->link_status_change(handle, state);
|
||||
- hclge_config_mac_tnl_int(hdev, state);
|
||||
- rhandle = &hdev->vport[i].roce;
|
||||
- if (rclient && rclient->ops->link_status_change)
|
||||
- rclient->ops->link_status_change(rhandle,
|
||||
- state);
|
||||
- }
|
||||
+ client->ops->link_status_change(handle, state);
|
||||
+ hclge_config_mac_tnl_int(hdev, state);
|
||||
+ if (rclient && rclient->ops->link_status_change)
|
||||
+ rclient->ops->link_status_change(rhandle, state);
|
||||
|
||||
hclge_push_link_status(hdev);
|
||||
}
|
||||
@@ -3429,8 +3419,9 @@ static void hclge_misc_irq_uninit(struct hclge_dev *hdev)
|
||||
int hclge_notify_client(struct hclge_dev *hdev,
|
||||
enum hnae3_reset_notify_type type)
|
||||
{
|
||||
+ struct hnae3_handle *handle = &hdev->vport[0].nic;
|
||||
struct hnae3_client *client = hdev->nic_client;
|
||||
- u16 i;
|
||||
+ int ret;
|
||||
|
||||
if (!test_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state) || !client)
|
||||
return 0;
|
||||
@@ -3438,27 +3429,20 @@ int hclge_notify_client(struct hclge_dev *hdev,
|
||||
if (!client->ops->reset_notify)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- struct hnae3_handle *handle = &hdev->vport[i].nic;
|
||||
- int ret;
|
||||
-
|
||||
- ret = client->ops->reset_notify(handle, type);
|
||||
- if (ret) {
|
||||
- dev_err(&hdev->pdev->dev,
|
||||
- "notify nic client failed %d(%d)\n", type, ret);
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
+ ret = client->ops->reset_notify(handle, type);
|
||||
+ if (ret)
|
||||
+ dev_err(&hdev->pdev->dev, "notify nic client failed %d(%d)\n",
|
||||
+ type, ret);
|
||||
|
||||
- return 0;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int hclge_notify_roce_client(struct hclge_dev *hdev,
|
||||
enum hnae3_reset_notify_type type)
|
||||
{
|
||||
+ struct hnae3_handle *handle = &hdev->vport[0].roce;
|
||||
struct hnae3_client *client = hdev->roce_client;
|
||||
- int ret = 0;
|
||||
- u16 i;
|
||||
+ int ret;
|
||||
|
||||
if (!test_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state) || !client)
|
||||
return 0;
|
||||
@@ -3466,17 +3450,10 @@ static int hclge_notify_roce_client(struct hclge_dev *hdev,
|
||||
if (!client->ops->reset_notify)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- struct hnae3_handle *handle = &hdev->vport[i].roce;
|
||||
-
|
||||
- ret = client->ops->reset_notify(handle, type);
|
||||
- if (ret) {
|
||||
- dev_err(&hdev->pdev->dev,
|
||||
- "notify roce client failed %d(%d)",
|
||||
- type, ret);
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
+ ret = client->ops->reset_notify(handle, type);
|
||||
+ if (ret)
|
||||
+ dev_err(&hdev->pdev->dev, "notify roce client failed %d(%d)",
|
||||
+ type, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -3544,7 +3521,7 @@ static int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
|
||||
{
|
||||
int i;
|
||||
|
||||
- for (i = hdev->num_vmdq_vport + 1; i < hdev->num_alloc_vport; i++) {
|
||||
+ for (i = HCLGE_VF_VPORT_START_NUM; i < hdev->num_alloc_vport; i++) {
|
||||
struct hclge_vport *vport = &hdev->vport[i];
|
||||
int ret;
|
||||
|
||||
@@ -3627,14 +3604,12 @@ void hclge_report_hw_error(struct hclge_dev *hdev,
|
||||
enum hnae3_hw_error_type type)
|
||||
{
|
||||
struct hnae3_client *client = hdev->nic_client;
|
||||
- u16 i;
|
||||
|
||||
if (!client || !client->ops->process_hw_error ||
|
||||
!test_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state))
|
||||
return;
|
||||
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++)
|
||||
- client->ops->process_hw_error(&hdev->vport[i].nic, type);
|
||||
+ client->ops->process_hw_error(&hdev->vport[0].nic, type);
|
||||
}
|
||||
|
||||
static void hclge_handle_imp_error(struct hclge_dev *hdev)
|
||||
@@ -4424,7 +4399,7 @@ static int hclge_set_rss_algo_key(struct hclge_dev *hdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hclge_set_rss_indir_table(struct hclge_dev *hdev, const u8 *indir)
|
||||
+static int hclge_set_rss_indir_table(struct hclge_dev *hdev, const u16 *indir)
|
||||
{
|
||||
struct hclge_rss_indirection_table_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
@@ -4843,7 +4818,7 @@ static int hclge_init_rss_tc_mode(struct hclge_dev *hdev)
|
||||
int hclge_rss_init_hw(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_vport *vport = hdev->vport;
|
||||
- u8 *rss_indir = vport[0].rss_indirection_tbl;
|
||||
+ u16 *rss_indir = vport[0].rss_indirection_tbl;
|
||||
u8 *key = vport[0].rss_hash_key;
|
||||
u8 hfunc = vport[0].rss_algo;
|
||||
int ret;
|
||||
@@ -4865,49 +4840,48 @@ int hclge_rss_init_hw(struct hclge_dev *hdev)
|
||||
|
||||
void hclge_rss_indir_init_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
- struct hclge_vport *vport = hdev->vport;
|
||||
- int i, j;
|
||||
+ struct hclge_vport *vport = &hdev->vport[0];
|
||||
+ int i;
|
||||
|
||||
- for (j = 0; j < hdev->num_vmdq_vport + 1; j++) {
|
||||
- for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++)
|
||||
- vport[j].rss_indirection_tbl[i] =
|
||||
- i % vport[j].alloc_rss_size;
|
||||
- }
|
||||
+ for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)
|
||||
+ vport->rss_indirection_tbl[i] = i % vport->alloc_rss_size;
|
||||
}
|
||||
|
||||
-static void hclge_rss_init_cfg(struct hclge_dev *hdev)
|
||||
+static int hclge_rss_init_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
- int i, rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
||||
- struct hclge_vport *vport = hdev->vport;
|
||||
+ u16 rss_ind_tbl_size = hdev->ae_dev->dev_specs.rss_ind_tbl_size;
|
||||
+ int rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
||||
+ struct hclge_vport *vport = &hdev->vport[0];
|
||||
+ u16 *rss_ind_tbl;
|
||||
|
||||
if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
||||
rss_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
|
||||
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- vport[i].rss_tuple_sets.ipv4_tcp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
- vport[i].rss_tuple_sets.ipv4_udp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
- vport[i].rss_tuple_sets.ipv4_sctp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_SCTP4;
|
||||
- vport[i].rss_tuple_sets.ipv4_fragment_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
- vport[i].rss_tuple_sets.ipv6_tcp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
- vport[i].rss_tuple_sets.ipv6_udp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
- vport[i].rss_tuple_sets.ipv6_sctp_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_SCTP6;
|
||||
- vport[i].rss_tuple_sets.ipv6_fragment_en =
|
||||
- HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
-
|
||||
- vport[i].rss_algo = rss_algo;
|
||||
-
|
||||
- memcpy(vport[i].rss_hash_key, hclge_hash_key,
|
||||
- HCLGE_RSS_KEY_SIZE);
|
||||
- }
|
||||
+ vport->rss_tuple_sets.ipv4_tcp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+ vport->rss_tuple_sets.ipv4_udp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+ vport->rss_tuple_sets.ipv4_sctp_en = HCLGE_RSS_INPUT_TUPLE_SCTP4;
|
||||
+ vport->rss_tuple_sets.ipv4_fragment_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+ vport->rss_tuple_sets.ipv6_tcp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+ vport->rss_tuple_sets.ipv6_udp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+ vport->rss_tuple_sets.ipv6_sctp_en =
|
||||
+ hdev->ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 ?
|
||||
+ HCLGE_RSS_INPUT_TUPLE_SCTP6 :
|
||||
+ HCLGE_RSS_INPUT_TUPLE_SCTP4;
|
||||
+ vport->rss_tuple_sets.ipv6_fragment_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
|
||||
+
|
||||
+ vport->rss_algo = rss_algo;
|
||||
+
|
||||
+ rss_ind_tbl = devm_kcalloc(&hdev->pdev->dev, rss_ind_tbl_size,
|
||||
+ sizeof(*rss_ind_tbl), GFP_KERNEL);
|
||||
+ if (!rss_ind_tbl)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ vport->rss_indirection_tbl = rss_ind_tbl;
|
||||
+ memcpy(vport->rss_hash_key, hclge_hash_key, HCLGE_RSS_KEY_SIZE);
|
||||
|
||||
hclge_rss_indir_init_cfg(hdev);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
int hclge_bind_ring_with_vector(struct hclge_vport *vport,
|
||||
@@ -10186,7 +10160,6 @@ static void hclge_info_show(struct hclge_dev *hdev)
|
||||
dev_info(dev, "Desc num per TX queue: %u\n", hdev->num_tx_desc);
|
||||
dev_info(dev, "Desc num per RX queue: %u\n", hdev->num_rx_desc);
|
||||
dev_info(dev, "Numbers of vports: %u\n", hdev->num_alloc_vport);
|
||||
- dev_info(dev, "Numbers of vmdp vports: %u\n", hdev->num_vmdq_vport);
|
||||
dev_info(dev, "Numbers of VF for this PF: %u\n", hdev->num_req_vfs);
|
||||
dev_info(dev, "HW tc map: %u\n", hdev->hw_tc_map);
|
||||
dev_info(dev, "Total buffer size for TX/RX: %u\n", hdev->pkt_buf_size);
|
||||
@@ -10306,39 +10279,35 @@ static int hclge_init_client_instance(struct hnae3_client *client,
|
||||
struct hnae3_ae_dev *ae_dev)
|
||||
{
|
||||
struct hclge_dev *hdev = ae_dev->priv;
|
||||
- struct hclge_vport *vport;
|
||||
- int i, ret;
|
||||
-
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- vport = &hdev->vport[i];
|
||||
+ struct hclge_vport *vport = &hdev->vport[0];
|
||||
+ int ret;
|
||||
|
||||
- switch (client->type) {
|
||||
- case HNAE3_CLIENT_KNIC:
|
||||
- hdev->nic_client = client;
|
||||
- vport->nic.client = client;
|
||||
- ret = hclge_init_nic_client_instance(ae_dev, vport);
|
||||
- if (ret)
|
||||
- goto clear_nic;
|
||||
+ switch (client->type) {
|
||||
+ case HNAE3_CLIENT_KNIC:
|
||||
+ hdev->nic_client = client;
|
||||
+ vport->nic.client = client;
|
||||
+ ret = hclge_init_nic_client_instance(ae_dev, vport);
|
||||
+ if (ret)
|
||||
+ goto clear_nic;
|
||||
|
||||
- ret = hclge_init_roce_client_instance(ae_dev, vport);
|
||||
- if (ret)
|
||||
- goto clear_roce;
|
||||
+ ret = hclge_init_roce_client_instance(ae_dev, vport);
|
||||
+ if (ret)
|
||||
+ goto clear_roce;
|
||||
|
||||
- break;
|
||||
- case HNAE3_CLIENT_ROCE:
|
||||
- if (hnae3_dev_roce_supported(hdev)) {
|
||||
- hdev->roce_client = client;
|
||||
- vport->roce.client = client;
|
||||
- }
|
||||
+ break;
|
||||
+ case HNAE3_CLIENT_ROCE:
|
||||
+ if (hnae3_dev_roce_supported(hdev)) {
|
||||
+ hdev->roce_client = client;
|
||||
+ vport->roce.client = client;
|
||||
+ }
|
||||
|
||||
- ret = hclge_init_roce_client_instance(ae_dev, vport);
|
||||
- if (ret)
|
||||
- goto clear_roce;
|
||||
+ ret = hclge_init_roce_client_instance(ae_dev, vport);
|
||||
+ if (ret)
|
||||
+ goto clear_roce;
|
||||
|
||||
- break;
|
||||
- default:
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -10357,39 +10326,27 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
|
||||
struct hnae3_ae_dev *ae_dev)
|
||||
{
|
||||
struct hclge_dev *hdev = ae_dev->priv;
|
||||
- struct hclge_vport *vport;
|
||||
- int i;
|
||||
+ struct hclge_vport *vport = &hdev->vport[0];
|
||||
|
||||
-#ifdef CONFIG_HNS3_TEST
|
||||
- if (ae_dev->ops->ext_uninit) {
|
||||
- vport = &hdev->vport[0];
|
||||
- ae_dev->ops->ext_uninit(&vport->nic);
|
||||
- }
|
||||
-#endif
|
||||
+ if (hdev->roce_client) {
|
||||
+ clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
|
||||
+ while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
|
||||
+ msleep(HCLGE_WAIT_RESET_DONE);
|
||||
|
||||
- for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
||||
- vport = &hdev->vport[i];
|
||||
- if (hdev->roce_client) {
|
||||
- clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
|
||||
- while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
|
||||
- msleep(HCLGE_WAIT_RESET_DONE);
|
||||
-
|
||||
- hdev->roce_client->ops->uninit_instance(&vport->roce,
|
||||
- 0);
|
||||
- hdev->roce_client = NULL;
|
||||
- vport->roce.client = NULL;
|
||||
- }
|
||||
- if (client->type == HNAE3_CLIENT_ROCE)
|
||||
- return;
|
||||
- if (hdev->nic_client && client->ops->uninit_instance) {
|
||||
- clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
|
||||
- while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
|
||||
- msleep(HCLGE_WAIT_RESET_DONE);
|
||||
-
|
||||
- client->ops->uninit_instance(&vport->nic, 0);
|
||||
- hdev->nic_client = NULL;
|
||||
- vport->nic.client = NULL;
|
||||
- }
|
||||
+ hdev->roce_client->ops->uninit_instance(&vport->roce, 0);
|
||||
+ hdev->roce_client = NULL;
|
||||
+ vport->roce.client = NULL;
|
||||
+ }
|
||||
+ if (client->type == HNAE3_CLIENT_ROCE)
|
||||
+ return;
|
||||
+ if (hdev->nic_client && client->ops->uninit_instance) {
|
||||
+ clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
|
||||
+ while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
|
||||
+ msleep(HCLGE_WAIT_RESET_DONE);
|
||||
+
|
||||
+ client->ops->uninit_instance(&vport->nic, 0);
|
||||
+ hdev->nic_client = NULL;
|
||||
+ vport->nic.client = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 138358b3b16b..ac88f2dd9f3b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -361,7 +361,6 @@ struct hclge_tc_info {
|
||||
};
|
||||
|
||||
struct hclge_cfg {
|
||||
- u8 vmdq_vport_num;
|
||||
u8 tc_num;
|
||||
u8 vlan_fliter_cap;
|
||||
u16 tqp_desc_num;
|
||||
@@ -772,7 +771,6 @@ struct hclge_dev {
|
||||
struct semaphore reset_sem; /* protect reset process */
|
||||
u32 reset_fail_cnt;
|
||||
u32 fw_version;
|
||||
- u16 num_vmdq_vport; /* Num vmdq vport this PF has set up */
|
||||
u16 num_tqps; /* Num task queue pairs of this PF */
|
||||
u16 num_req_vfs; /* Num VFs requested for this PF */
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
index fe0c87a9e2ff..a35bbfd93384 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
@@ -191,7 +191,6 @@ struct hclgevf_tqp {
|
||||
};
|
||||
|
||||
struct hclgevf_cfg {
|
||||
- u8 vmdq_vport_num;
|
||||
u8 tc_num;
|
||||
u16 tqp_desc_num;
|
||||
u16 rx_buf_len;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
206
patches/0423-net-hns3-remove-redundant-blank-lines.patch
Normal file
206
patches/0423-net-hns3-remove-redundant-blank-lines.patch
Normal file
@ -0,0 +1,206 @@
|
||||
From b0653457f736251682d9068068c758eeb967b7d4 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Li <lipeng321@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:00 +0800
|
||||
Subject: [PATCH 062/283] net: hns3: remove redundant blank lines
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit c0127115ee2329dd57a65dceb139ec7cc39f48c7
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c0127115ee2329dd57a65dceb139ec7cc39f48c7
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Remove some redundant blank lines.
|
||||
|
||||
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 5 -----
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 1 -
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 2 --
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 -----
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 2 +-
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c | 1 -
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 --
|
||||
7 files changed, 1 insertion(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index d2284ce2c250..b78f2fe7f39c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -1234,7 +1234,6 @@ static unsigned int hns3_tx_bd_num(struct sk_buff *skb, unsigned int *bd_size,
|
||||
return UINT_MAX;
|
||||
|
||||
bd_num = hns3_skb_bd_num(skb, bd_size, bd_num);
|
||||
-
|
||||
if (!skb_has_frag_list(skb) || bd_num > HNS3_MAX_TSO_BD_NUM)
|
||||
return bd_num;
|
||||
|
||||
@@ -2940,7 +2939,6 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb,
|
||||
HNS3_RXD_L3ID_S);
|
||||
l4_type = hnae3_get_field(l234info, HNS3_RXD_L4ID_M,
|
||||
HNS3_RXD_L4ID_S);
|
||||
-
|
||||
/* Can checksum ipv4 or ipv6 + UDP/TCP/SCTP packets */
|
||||
if ((l3_type == HNS3_L3_TYPE_IPV4 ||
|
||||
l3_type == HNS3_L3_TYPE_IPV6) &&
|
||||
@@ -3282,7 +3280,6 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring)
|
||||
|
||||
if (!skb) {
|
||||
bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
|
||||
-
|
||||
/* Check valid BD */
|
||||
if (unlikely(!(bd_base_info & BIT(HNS3_RXD_VLD_B))))
|
||||
return -ENXIO;
|
||||
@@ -3547,7 +3544,6 @@ static int hns3_nic_common_poll(struct napi_struct *napi, int budget)
|
||||
hns3_for_each_ring(ring, tqp_vector->rx_group) {
|
||||
int rx_cleaned = hns3_clean_rx_ring(ring, rx_budget,
|
||||
hns3_rx_skb);
|
||||
-
|
||||
if (rx_cleaned >= rx_budget)
|
||||
clean_complete = false;
|
||||
|
||||
@@ -4021,7 +4017,6 @@ static void hns3_init_ring_hw(struct hns3_enet_ring *ring)
|
||||
hns3_buf_size2type(ring->buf_size));
|
||||
hns3_write_dev(q, HNS3_RING_RX_RING_BD_NUM_REG,
|
||||
ring->desc_num / 8 - 1);
|
||||
-
|
||||
} else {
|
||||
hns3_write_dev(q, HNS3_RING_TX_RING_BASEADDR_L_REG,
|
||||
(u32)dma);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index c4d30bcc8fa3..7646e510c0e7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -379,7 +379,6 @@ static void hclge_parse_capability(struct hclge_dev *hdev,
|
||||
u32 caps;
|
||||
|
||||
caps = __le32_to_cpu(cmd->caps[0]);
|
||||
-
|
||||
if (hnae3_get_bit(caps, HCLGE_CAP_UDP_GSO_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGE_CAP_PTP_B))
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 9265243fbb84..7d72e30d0d16 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -1498,7 +1498,6 @@ hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
|
||||
}
|
||||
|
||||
status = le32_to_cpu(desc[0].data[0]);
|
||||
-
|
||||
if (status & HCLGE_ROCEE_AXI_ERR_INT_MASK) {
|
||||
if (status & HCLGE_ROCEE_RERR_INT_MASK)
|
||||
dev_err(dev, "ROCEE RAS AXI rresp error\n");
|
||||
@@ -1651,7 +1650,6 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
|
||||
}
|
||||
|
||||
status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
|
||||
-
|
||||
if (status & HCLGE_RAS_REG_NFE_MASK ||
|
||||
status & HCLGE_RAS_REG_ROCEE_ERR_MASK)
|
||||
ae_dev->hw_err_reset_req = 0;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 5885e1181517..6c2960df62a6 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -527,7 +527,6 @@ int hclge_mac_update_stats(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
|
||||
ret = hclge_mac_query_reg_num(hdev, &desc_num);
|
||||
-
|
||||
/* The firmware supports the new statistics acquisition method */
|
||||
if (!ret)
|
||||
ret = hclge_mac_update_stats_complete(hdev, desc_num);
|
||||
@@ -758,7 +757,6 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
|
||||
count += 1;
|
||||
handle->flags |= HNAE3_SUPPORT_PHY_LOOPBACK;
|
||||
}
|
||||
-
|
||||
} else if (stringset == ETH_SS_STATS) {
|
||||
count = ARRAY_SIZE(g_mac_stats_string) +
|
||||
hclge_tqps_get_sset_count(handle, stringset);
|
||||
@@ -2113,7 +2111,6 @@ static int hclge_only_alloc_priv_buff(struct hclge_dev *hdev,
|
||||
COMPENSATE_HALF_MPS_NUM * half_mps;
|
||||
min_rx_priv = round_up(min_rx_priv, HCLGE_BUF_SIZE_UNIT);
|
||||
rx_priv = round_down(rx_priv, HCLGE_BUF_SIZE_UNIT);
|
||||
-
|
||||
if (rx_priv < min_rx_priv)
|
||||
return false;
|
||||
|
||||
@@ -7860,7 +7857,6 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
|
||||
if (status)
|
||||
return status;
|
||||
status = hclge_add_mac_vlan_tbl(vport, &req, desc);
|
||||
-
|
||||
/* if already overflow, not to print each time */
|
||||
if (status == -ENOSPC &&
|
||||
!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_MPE)) {
|
||||
@@ -7912,7 +7908,6 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
|
||||
else
|
||||
/* Not all the vfid is zero, update the vfid */
|
||||
status = hclge_add_mac_vlan_tbl(vport, &req, desc);
|
||||
-
|
||||
} else if (status == -ENOENT) {
|
||||
status = 0;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index ac88f2dd9f3b..56a7c6a3e1d9 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -946,7 +946,7 @@ struct hclge_vport {
|
||||
|
||||
u8 rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */
|
||||
/* User configured lookup table entries */
|
||||
- u8 rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE];
|
||||
+ u16 *rss_indirection_tbl;
|
||||
int rss_algo; /* User configured hash algorithm */
|
||||
/* User configured rss tuple sets */
|
||||
struct hclge_rss_tuple_cfg rss_tuple_sets;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
index 9430334e1c22..67d44d21814e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
||||
@@ -365,7 +365,6 @@ static void hclgevf_parse_capability(struct hclgevf_dev *hdev,
|
||||
u32 caps;
|
||||
|
||||
caps = __le32_to_cpu(cmd->caps[0]);
|
||||
-
|
||||
if (hnae3_get_bit(caps, HCLGEVF_CAP_UDP_GSO_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGEVF_CAP_INT_QL_B))
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index eed608ebe0a6..9368e6ab8310 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -487,7 +487,6 @@ void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state)
|
||||
|
||||
link_state =
|
||||
test_bit(HCLGEVF_STATE_DOWN, &hdev->state) ? 0 : link_state;
|
||||
-
|
||||
if (link_state != hdev->hw.mac.link) {
|
||||
hdev->hw.mac.link = link_state;
|
||||
client->ops->link_status_change(handle, !!link_state);
|
||||
@@ -2352,7 +2351,6 @@ static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,
|
||||
/* fetch the events from their corresponding regs */
|
||||
cmdq_stat_reg = hclgevf_read_dev(&hdev->hw,
|
||||
HCLGEVF_VECTOR0_CMDQ_STATE_REG);
|
||||
-
|
||||
if (BIT(HCLGEVF_VECTOR0_RST_INT_B) & cmdq_stat_reg) {
|
||||
rst_ing_reg = hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING);
|
||||
dev_info(&hdev->pdev->dev,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 4ee2e9ca379a23b990b6e46bcc68b94eb6fd09c6 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:01 +0800
|
||||
Subject: [PATCH 063/283] net: hns3: remove redundant query in
|
||||
hclge_config_tm_hw_err_int()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit d914971df022e7abdb5f8fdfd901a655c9786c05
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d914971df022e7abdb5f8fdfd901a655c9786c05
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
According to the HW manual, the query operation is unnecessary
|
||||
when the TM QCN error event is enabled, so remove it.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 8 +-------
|
||||
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 7d72e30d0d16..494498629317 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -866,13 +866,7 @@ static int hclge_config_tm_hw_err_int(struct hclge_dev *hdev, bool en)
|
||||
}
|
||||
|
||||
/* configure TM QCN hw errors */
|
||||
- ret = hclge_cmd_query_error(hdev, &desc, HCLGE_TM_QCN_MEM_INT_CFG, 0);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "fail(%d) to read TM QCN CFG status\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- hclge_cmd_reuse_desc(&desc, false);
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_TM_QCN_MEM_INT_CFG, false);
|
||||
if (en)
|
||||
desc.data[1] = cpu_to_le32(HCLGE_TM_QCN_MEM_ERR_INT_EN);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,91 @@
|
||||
From e5abebab275bf375c2c8f2a44e6a5587192857d7 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:06 +0800
|
||||
Subject: [PATCH 064/283] net: hns3: split function hclge_reset_rebuild()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 74d439b74ad3e05780d4cf3ab047345b443f7e67
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=74d439b74ad3e05780d4cf3ab047345b443f7e67
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
hclge_reset_rebuild() is a bit too long. So add a new function
|
||||
hclge_update_reset_level() to improve readability.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 30 ++++++++++---------
|
||||
1 file changed, 16 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 6c2960df62a6..69ab9c00af4a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3866,6 +3866,21 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev)
|
||||
return false;
|
||||
}
|
||||
|
||||
+static void hclge_update_reset_level(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ enum hnae3_reset_type reset_level;
|
||||
+
|
||||
+ /* if default_reset_request has a higher level reset request,
|
||||
+ * it should be handled as soon as possible. since some errors
|
||||
+ * need this kind of reset to fix.
|
||||
+ */
|
||||
+ reset_level = hclge_get_reset_level(ae_dev,
|
||||
+ &hdev->default_reset_request);
|
||||
+ if (reset_level != HNAE3_NONE_RESET)
|
||||
+ set_bit(reset_level, &hdev->reset_request);
|
||||
+}
|
||||
+
|
||||
static int hclge_set_rst_done(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_pf_rst_done_cmd *req;
|
||||
@@ -3955,9 +3970,6 @@ static int hclge_reset_prepare(struct hclge_dev *hdev)
|
||||
|
||||
static int hclge_reset_rebuild(struct hclge_dev *hdev)
|
||||
{
|
||||
- struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
- struct hnae3_handle *handle = &hdev->vport[0].nic;
|
||||
- enum hnae3_reset_type reset_level;
|
||||
int ret;
|
||||
|
||||
hdev->rst_stats.hw_reset_done_cnt++;
|
||||
@@ -4001,17 +4013,7 @@ static int hclge_reset_rebuild(struct hclge_dev *hdev)
|
||||
hdev->rst_stats.reset_done_cnt++;
|
||||
clear_bit(HCLGE_STATE_RST_FAIL, &hdev->state);
|
||||
|
||||
- /* if default_reset_request has a higher level reset request,
|
||||
- * it should be handled as soon as possible. since some errors
|
||||
- * need this kind of reset to fix.
|
||||
- */
|
||||
- reset_level = hclge_get_reset_level(ae_dev,
|
||||
- &hdev->default_reset_request);
|
||||
- if (reset_level != HNAE3_NONE_RESET)
|
||||
- set_bit(reset_level, &hdev->reset_request);
|
||||
-
|
||||
- if (handle && handle->ae_algo->ops->reset_end)
|
||||
- handle->ae_algo->ops->reset_end(handle, true);
|
||||
+ hclge_update_reset_level(hdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,67 @@
|
||||
From 090f4c65c7addfe624049fb1d8ba3ed1be7340a7 Mon Sep 17 00:00:00 2001
|
||||
From: Guojia Liao <liaoguojia@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:07 +0800
|
||||
Subject: [PATCH 065/283] net: hns3: split out hclge_tm_vport_tc_info_update()
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit b1261897b0902d870c483fb006a9443723a3d58b
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b1261897b0902d870c483fb006a9443723a3d58b
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
hclge_tm_vport_tc_info_update() is bloated, so split it into
|
||||
separate functions for readability and maintainability.
|
||||
|
||||
Signed-off-by: Guojia Liao <liaoguojia@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
index be641288651f..c92d084bb798 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
@@ -597,12 +597,11 @@ static u16 hclge_vport_get_tqp_num(struct hclge_vport *vport)
|
||||
return sum;
|
||||
}
|
||||
|
||||
-static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)
|
||||
+static void hclge_tm_update_kinfo_rss_size(struct hclge_vport *vport)
|
||||
{
|
||||
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u16 max_rss_size;
|
||||
- u8 i;
|
||||
|
||||
/* TC configuration is shared by PF/VF in one port, only allow
|
||||
* one tc for VF for simplicity. VF's vport_id is non zero.
|
||||
@@ -626,7 +625,15 @@ static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)
|
||||
/* Set to the maximum specification value (max_rss_size). */
|
||||
kinfo->rss_size = max_rss_size;
|
||||
}
|
||||
+}
|
||||
+
|
||||
+static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)
|
||||
+{
|
||||
+ struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
|
||||
+ struct hclge_dev *hdev = vport->back;
|
||||
+ u8 i;
|
||||
|
||||
+ hclge_tm_update_kinfo_rss_size(vport);
|
||||
kinfo->num_tqps = hclge_vport_get_tqp_num(vport);
|
||||
vport->dwrr = 100; /* 100 percent as init */
|
||||
vport->alloc_rss_size = kinfo->rss_size;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
69
patches/0427-net-hns3-Trivial-spell-fix-in-hns3-driver.patch
Normal file
69
patches/0427-net-hns3-Trivial-spell-fix-in-hns3-driver.patch
Normal file
@ -0,0 +1,69 @@
|
||||
From 053856ded21ec0f1a60e12926dfc9f5a7b271f12 Mon Sep 17 00:00:00 2001
|
||||
From: Salil Mehta <salil.mehta@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:20 +0800
|
||||
Subject: [PATCH 066/283] net: hns3: Trivial spell fix in hns3 driver
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.12-rc7
|
||||
commit cd7e963d2f0875789ddb5c3746b628716bd0a8c9
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cd7e963d2f0875789ddb5c3746b628716bd0a8c9
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Some trivial spelling mistakes which caught my eye during the
|
||||
review of the code.
|
||||
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Link: https://lore.kernel.org/r/20210409074223.32480-1-salil.mehta@huawei.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 69ab9c00af4a..0f5bb93927f7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -11168,7 +11168,7 @@ static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- /* RSS indirection table has been configuared by user */
|
||||
+ /* RSS indirection table has been configured by user */
|
||||
if (rxfh_configured)
|
||||
goto out;
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index 9368e6ab8310..ea1313a8e9da 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -2187,7 +2187,7 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
|
||||
|
||||
if (test_and_clear_bit(HCLGEVF_RESET_PENDING,
|
||||
&hdev->reset_state)) {
|
||||
- /* PF has initmated that it is about to reset the hardware.
|
||||
+ /* PF has intimated that it is about to reset the hardware.
|
||||
* We now have to poll & check if hardware has actually
|
||||
* completed the reset sequence. On hardware reset completion,
|
||||
* VF needs to reset the client and ae device.
|
||||
@@ -3424,7 +3424,7 @@ static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- /* RSS indirection table has been configuared by user */
|
||||
+ /* RSS indirection table has been configured by user */
|
||||
if (rxfh_configured)
|
||||
goto out;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
From 1c9929559bc4d9566052be19536581979167f2a3 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:25 +0800
|
||||
Subject: [PATCH 067/283] net: hns3: cleanup inappropriate spaces in struct
|
||||
hlcgevf_tqp_stats
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 8ed64dbe0bdf39479772896b2b4e5cbbdf89f086
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8ed64dbe0bdf39479772896b2b4e5cbbdf89f086
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Modify some inappropriate spaces in comments of struct
|
||||
hlcgevf_tqp_stats.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
index a35bbfd93384..e75e1b437585 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
||||
@@ -175,9 +175,9 @@ struct hclgevf_hw {
|
||||
|
||||
/* TQP stats */
|
||||
struct hlcgevf_tqp_stats {
|
||||
- /* query_tqp_tx_queue_statistics ,opcode id: 0x0B03 */
|
||||
+ /* query_tqp_tx_queue_statistics, opcode id: 0x0B03 */
|
||||
u64 rcb_tx_ring_pktnum_rcd; /* 32bit */
|
||||
- /* query_tqp_rx_queue_statistics ,opcode id: 0x0B13 */
|
||||
+ /* query_tqp_rx_queue_statistics, opcode id: 0x0B13 */
|
||||
u64 rcb_rx_ring_pktnum_rcd; /* 32bit */
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,55 @@
|
||||
From 44d9658f603e15947345c1ea3732fe504a3f7843 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:27 +0800
|
||||
Subject: [PATCH 068/283] net: hns3: clear unnecessary reset request in
|
||||
hclge_reset_rebuild
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc1
|
||||
commit 8c9200e387721c597baabb319b4bd1cdf1155e35
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8c9200e387721c597baabb319b4bd1cdf1155e35
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
HW error and global reset are reported through MSIX interrupts.
|
||||
The same error may be reported to different functions at the
|
||||
same time. When global reset begins, the pending reset request
|
||||
set by this error is unnecessary. So clear the pending reset
|
||||
request after the reset is complete to avoid the repeated reset.
|
||||
|
||||
Fixes: f6162d44126c ("net: hns3: add handling of hw errors reported through MSIX")
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 0f5bb93927f7..bc70eb4fae64 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3871,6 +3871,12 @@ static void hclge_update_reset_level(struct hclge_dev *hdev)
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
enum hnae3_reset_type reset_level;
|
||||
|
||||
+ /* reset request will not be set during reset, so clear
|
||||
+ * pending reset request to avoid unnecessary reset
|
||||
+ * caused by the same reason.
|
||||
+ */
|
||||
+ hclge_get_reset_level(ae_dev, &hdev->reset_request);
|
||||
+
|
||||
/* if default_reset_request has a higher level reset request,
|
||||
* it should be handled as soon as possible. since some errors
|
||||
* need this kind of reset to fix.
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,297 @@
|
||||
From 70a8b68f854337fc619fdfd150a037b3352563ee Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Wed, 14 Jul 2021 20:55:24 +0800
|
||||
Subject: [PATCH 069/283] net: hns3: add support for configuring interrupt
|
||||
quantity limiting
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.11-rc1
|
||||
commit 91bfae25eedd981b384339c7b12bef9eeaba0f34
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=91bfae25eedd981b384339c7b12bef9eeaba0f34
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
QL(quantity limiting) means that hardware supports the interrupt
|
||||
coalesce based on the frame quantity. QL can be configured when
|
||||
int_ql_max in device's specification is non-zero, so add support
|
||||
to configure it. Also, rename two coalesce init function to fit
|
||||
their purpose.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: li yongxin <liyongxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 65 ++++++++++++++-----
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 13 +++-
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 43 +++++++++++-
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 1 +
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 1 +
|
||||
5 files changed, 105 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index b78f2fe7f39c..dcf65dce1240 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -239,35 +239,68 @@ void hns3_set_vector_coalesce_tx_gl(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
writel(tx_gl_reg, tqp_vector->mask_addr + HNS3_VECTOR_GL1_OFFSET);
|
||||
}
|
||||
|
||||
-static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
- struct hns3_nic_priv *priv)
|
||||
+void hns3_set_vector_coalesce_tx_ql(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ u32 ql_value)
|
||||
{
|
||||
+ writel(ql_value, tqp_vector->mask_addr + HNS3_VECTOR_TX_QL_OFFSET);
|
||||
+}
|
||||
+
|
||||
+void hns3_set_vector_coalesce_rx_ql(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ u32 ql_value)
|
||||
+{
|
||||
+ writel(ql_value, tqp_vector->mask_addr + HNS3_VECTOR_RX_QL_OFFSET);
|
||||
+}
|
||||
+
|
||||
+static void hns3_vector_coalesce_init(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ struct hns3_nic_priv *priv)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(priv->ae_handle->pdev);
|
||||
+ struct hns3_enet_coalesce *tx_coal = &tqp_vector->tx_group.coal;
|
||||
+ struct hns3_enet_coalesce *rx_coal = &tqp_vector->rx_group.coal;
|
||||
+
|
||||
/* initialize the configuration for interrupt coalescing.
|
||||
* 1. GL (Interrupt Gap Limiter)
|
||||
* 2. RL (Interrupt Rate Limiter)
|
||||
+ * 3. QL (Interrupt Quantity Limiter)
|
||||
*
|
||||
* Default: enable interrupt coalescing self-adaptive and GL
|
||||
*/
|
||||
- tqp_vector->tx_group.coal.gl_adapt_enable = 1;
|
||||
- tqp_vector->rx_group.coal.gl_adapt_enable = 1;
|
||||
+ tx_coal->gl_adapt_enable = 1;
|
||||
+ rx_coal->gl_adapt_enable = 1;
|
||||
+
|
||||
+ tx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
+ rx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
|
||||
- tqp_vector->tx_group.coal.int_gl = HNS3_INT_GL_50K;
|
||||
- tqp_vector->rx_group.coal.int_gl = HNS3_INT_GL_50K;
|
||||
+ rx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
+ tx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
|
||||
- tqp_vector->rx_group.coal.flow_level = HNS3_FLOW_LOW;
|
||||
- tqp_vector->tx_group.coal.flow_level = HNS3_FLOW_LOW;
|
||||
+ if (ae_dev->dev_specs.int_ql_max) {
|
||||
+ tx_coal->ql_enable = 1;
|
||||
+ rx_coal->ql_enable = 1;
|
||||
+ tx_coal->int_ql_max = ae_dev->dev_specs.int_ql_max;
|
||||
+ rx_coal->int_ql_max = ae_dev->dev_specs.int_ql_max;
|
||||
+ tx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
+ rx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
+ }
|
||||
}
|
||||
|
||||
-static void hns3_vector_gl_rl_init_hw(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
- struct hns3_nic_priv *priv)
|
||||
+static void
|
||||
+hns3_vector_coalesce_init_hw(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ struct hns3_nic_priv *priv)
|
||||
{
|
||||
+ struct hns3_enet_coalesce *tx_coal = &tqp_vector->tx_group.coal;
|
||||
+ struct hns3_enet_coalesce *rx_coal = &tqp_vector->rx_group.coal;
|
||||
struct hnae3_handle *h = priv->ae_handle;
|
||||
|
||||
- hns3_set_vector_coalesce_tx_gl(tqp_vector,
|
||||
- tqp_vector->tx_group.coal.int_gl);
|
||||
- hns3_set_vector_coalesce_rx_gl(tqp_vector,
|
||||
- tqp_vector->rx_group.coal.int_gl);
|
||||
+ hns3_set_vector_coalesce_tx_gl(tqp_vector, tx_coal->int_gl);
|
||||
+ hns3_set_vector_coalesce_rx_gl(tqp_vector, rx_coal->int_gl);
|
||||
hns3_set_vector_coalesce_rl(tqp_vector, h->kinfo.int_rl_setting);
|
||||
+
|
||||
+ if (tx_coal->ql_enable)
|
||||
+ hns3_set_vector_coalesce_tx_ql(tqp_vector, tx_coal->int_ql);
|
||||
+
|
||||
+ if (rx_coal->ql_enable)
|
||||
+ hns3_set_vector_coalesce_rx_ql(tqp_vector, rx_coal->int_ql);
|
||||
}
|
||||
|
||||
static int hns3_nic_set_real_num_queue(struct net_device *netdev)
|
||||
@@ -3702,7 +3735,7 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
|
||||
|
||||
for (i = 0; i < priv->vector_num; i++) {
|
||||
tqp_vector = &priv->tqp_vector[i];
|
||||
- hns3_vector_gl_rl_init_hw(tqp_vector, priv);
|
||||
+ hns3_vector_coalesce_init_hw(tqp_vector, priv);
|
||||
tqp_vector->num_tqps = 0;
|
||||
}
|
||||
|
||||
@@ -3798,7 +3831,7 @@ static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv)
|
||||
tqp_vector->idx = i;
|
||||
tqp_vector->mask_addr = vector[i].io_addr;
|
||||
tqp_vector->vector_irq = vector[i].vector;
|
||||
- hns3_vector_gl_rl_init(tqp_vector, priv);
|
||||
+ hns3_vector_coalesce_init(tqp_vector, priv);
|
||||
}
|
||||
|
||||
out:
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index c337e4dbe2c6..0d9d46be1415 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -193,6 +193,8 @@ enum hns3_nic_state {
|
||||
#define HNS3_VECTOR_GL2_OFFSET 0x300
|
||||
#define HNS3_VECTOR_RL_OFFSET 0x900
|
||||
#define HNS3_VECTOR_RL_EN_B 6
|
||||
+#define HNS3_VECTOR_TX_QL_OFFSET 0xe00
|
||||
+#define HNS3_VECTOR_RX_QL_OFFSET 0xf00
|
||||
|
||||
#define HNS3_RING_EN_B 0
|
||||
|
||||
@@ -447,9 +449,14 @@ enum hns3_flow_level_range {
|
||||
#define HNS3_INT_RL_MAX 0x00EC
|
||||
#define HNS3_INT_RL_ENABLE_MASK 0x40
|
||||
|
||||
+#define HNS3_INT_QL_DEFAULT_CFG 0x20
|
||||
+
|
||||
struct hns3_enet_coalesce {
|
||||
u16 int_gl;
|
||||
- u8 gl_adapt_enable;
|
||||
+ u16 int_ql;
|
||||
+ u16 int_ql_max;
|
||||
+ u8 gl_adapt_enable:1;
|
||||
+ u8 ql_enable:1;
|
||||
enum hns3_flow_level_range flow_level;
|
||||
};
|
||||
|
||||
@@ -621,6 +628,10 @@ void hns3_set_vector_coalesce_tx_gl(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
u32 gl_value);
|
||||
void hns3_set_vector_coalesce_rl(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
u32 rl_value);
|
||||
+void hns3_set_vector_coalesce_rx_ql(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ u32 ql_value);
|
||||
+void hns3_set_vector_coalesce_tx_ql(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
+ u32 ql_value);
|
||||
|
||||
void hns3_request_update_promisc_mode(struct hnae3_handle *handle);
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 3bad65d1a49d..7ed5f9a2ae38 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -1144,6 +1144,9 @@ static int hns3_get_coalesce_per_queue(struct net_device *netdev, u32 queue,
|
||||
cmd->tx_coalesce_usecs_high = h->kinfo.int_rl_setting;
|
||||
cmd->rx_coalesce_usecs_high = h->kinfo.int_rl_setting;
|
||||
|
||||
+ cmd->tx_max_coalesced_frames = tx_vector->tx_group.coal.int_ql;
|
||||
+ cmd->rx_max_coalesced_frames = rx_vector->rx_group.coal.int_ql;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1217,6 +1220,29 @@ static int hns3_check_rl_coalesce_para(struct net_device *netdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int hns3_check_ql_coalesce_param(struct net_device *netdev,
|
||||
+ struct ethtool_coalesce *cmd)
|
||||
+{
|
||||
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
+
|
||||
+ if ((cmd->tx_max_coalesced_frames || cmd->rx_max_coalesced_frames) &&
|
||||
+ !ae_dev->dev_specs.int_ql_max) {
|
||||
+ netdev_err(netdev, "coalesced frames is not supported\n");
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ if (cmd->tx_max_coalesced_frames > ae_dev->dev_specs.int_ql_max ||
|
||||
+ cmd->rx_max_coalesced_frames > ae_dev->dev_specs.int_ql_max) {
|
||||
+ netdev_err(netdev,
|
||||
+ "invalid coalesced_frames value, range is 0-%u\n",
|
||||
+ ae_dev->dev_specs.int_ql_max);
|
||||
+ return -ERANGE;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int hns3_check_coalesce_para(struct net_device *netdev,
|
||||
struct ethtool_coalesce *cmd)
|
||||
{
|
||||
@@ -1236,6 +1262,10 @@ static int hns3_check_coalesce_para(struct net_device *netdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ ret = hns3_check_ql_coalesce_param(netdev, cmd);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
if (cmd->use_adaptive_tx_coalesce == 1 ||
|
||||
cmd->use_adaptive_rx_coalesce == 1) {
|
||||
netdev_info(netdev,
|
||||
@@ -1267,6 +1297,9 @@ static void hns3_set_coalesce_per_queue(struct net_device *netdev,
|
||||
tx_vector->tx_group.coal.int_gl = cmd->tx_coalesce_usecs;
|
||||
rx_vector->rx_group.coal.int_gl = cmd->rx_coalesce_usecs;
|
||||
|
||||
+ tx_vector->tx_group.coal.int_ql = cmd->tx_max_coalesced_frames;
|
||||
+ rx_vector->rx_group.coal.int_ql = cmd->rx_max_coalesced_frames;
|
||||
+
|
||||
hns3_set_vector_coalesce_tx_gl(tx_vector,
|
||||
tx_vector->tx_group.coal.int_gl);
|
||||
hns3_set_vector_coalesce_rx_gl(rx_vector,
|
||||
@@ -1274,6 +1307,13 @@ static void hns3_set_coalesce_per_queue(struct net_device *netdev,
|
||||
|
||||
hns3_set_vector_coalesce_rl(tx_vector, h->kinfo.int_rl_setting);
|
||||
hns3_set_vector_coalesce_rl(rx_vector, h->kinfo.int_rl_setting);
|
||||
+
|
||||
+ if (tx_vector->tx_group.coal.ql_enable)
|
||||
+ hns3_set_vector_coalesce_tx_ql(tx_vector,
|
||||
+ tx_vector->tx_group.coal.int_ql);
|
||||
+ if (rx_vector->rx_group.coal.ql_enable)
|
||||
+ hns3_set_vector_coalesce_rx_ql(rx_vector,
|
||||
+ rx_vector->rx_group.coal.int_ql);
|
||||
}
|
||||
|
||||
static int hns3_set_coalesce(struct net_device *netdev,
|
||||
@@ -1501,7 +1541,8 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
||||
#define HNS3_ETHTOOL_COALESCE (ETHTOOL_COALESCE_USECS | \
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE | \
|
||||
ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
- ETHTOOL_COALESCE_TX_USECS_HIGH)
|
||||
+ ETHTOOL_COALESCE_TX_USECS_HIGH | \
|
||||
+ ETHTOOL_COALESCE_MAX_FRAMES)
|
||||
|
||||
static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index bc70eb4fae64..3b4b1c8be8a3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1373,6 +1373,7 @@ static void hclge_parse_dev_specs(struct hclge_dev *hdev,
|
||||
ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
+ ae_dev->dev_specs.int_ql_max = le16_to_cpu(req0->int_ql_max);
|
||||
ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index ea1313a8e9da..b9a1b8032c5c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -3059,6 +3059,7 @@ static void hclgevf_parse_dev_specs(struct hclgevf_dev *hdev,
|
||||
ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
+ ae_dev->dev_specs.int_ql_max = le16_to_cpu(req0->int_ql_max);
|
||||
ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,352 @@
|
||||
From 928e13b775e8d61b7ba04900551ef54c0fd82a97 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:40 +0800
|
||||
Subject: [PATCH 070/283] net: hns3: fix user's coalesce configuration lost
|
||||
issue
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.13-rc4
|
||||
commit 73a13d8dbe33e53a12400f2be0f5af169816c67f
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=73a13d8dbe33e53a12400f2be0f5af169816c67f
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, when adaptive is on, the user's coalesce configuration
|
||||
may be overwritten by the dynamic one. The reason is that user's
|
||||
configurations are saved in struct hns3_enet_tqp_vector whose
|
||||
value maybe changed by the dynamic algorithm. To fix it, use
|
||||
struct hns3_nic_priv instead of struct hns3_enet_tqp_vector to
|
||||
save and get the user's configuration.
|
||||
|
||||
BTW, operations of storing and restoring coalesce info in the reset
|
||||
process are unnecessary now, so remove them as well.
|
||||
|
||||
Fixes: 434776a5fae2 ("net: hns3: add ethtool_ops.set_coalesce support to PF")
|
||||
Fixes: 7e96adc46633 ("net: hns3: add ethtool_ops.get_coalesce support to PF")
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 92 +++++++++----------
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 2 +-
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 68 +++++---------
|
||||
3 files changed, 70 insertions(+), 92 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index dcf65dce1240..6d9be3895f5a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -213,8 +213,8 @@ void hns3_set_vector_coalesce_rl(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
* GL and RL(Rate Limiter) are 2 ways to acheive interrupt coalescing
|
||||
*/
|
||||
|
||||
- if (rl_reg > 0 && !tqp_vector->tx_group.coal.gl_adapt_enable &&
|
||||
- !tqp_vector->rx_group.coal.gl_adapt_enable)
|
||||
+ if (rl_reg > 0 && !tqp_vector->tx_group.coal.adapt_enable &&
|
||||
+ !tqp_vector->rx_group.coal.adapt_enable)
|
||||
/* According to the hardware, the range of rl_reg is
|
||||
* 0-59 and the unit is 4.
|
||||
*/
|
||||
@@ -257,30 +257,25 @@ static void hns3_vector_coalesce_init(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(priv->ae_handle->pdev);
|
||||
struct hns3_enet_coalesce *tx_coal = &tqp_vector->tx_group.coal;
|
||||
struct hns3_enet_coalesce *rx_coal = &tqp_vector->rx_group.coal;
|
||||
+ struct hns3_enet_coalesce *ptx_coal = &priv->tx_coal;
|
||||
+ struct hns3_enet_coalesce *prx_coal = &priv->rx_coal;
|
||||
|
||||
- /* initialize the configuration for interrupt coalescing.
|
||||
- * 1. GL (Interrupt Gap Limiter)
|
||||
- * 2. RL (Interrupt Rate Limiter)
|
||||
- * 3. QL (Interrupt Quantity Limiter)
|
||||
- *
|
||||
- * Default: enable interrupt coalescing self-adaptive and GL
|
||||
- */
|
||||
- tx_coal->gl_adapt_enable = 1;
|
||||
- rx_coal->gl_adapt_enable = 1;
|
||||
+ tx_coal->adapt_enable = ptx_coal->adapt_enable;
|
||||
+ rx_coal->adapt_enable = prx_coal->adapt_enable;
|
||||
|
||||
- tx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
- rx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
+ tx_coal->int_gl = ptx_coal->int_gl;
|
||||
+ rx_coal->int_gl = prx_coal->int_gl;
|
||||
|
||||
- rx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
- tx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
+ rx_coal->flow_level = prx_coal->flow_level;
|
||||
+ tx_coal->flow_level = ptx_coal->flow_level;
|
||||
|
||||
if (ae_dev->dev_specs.int_ql_max) {
|
||||
tx_coal->ql_enable = 1;
|
||||
rx_coal->ql_enable = 1;
|
||||
tx_coal->int_ql_max = ae_dev->dev_specs.int_ql_max;
|
||||
rx_coal->int_ql_max = ae_dev->dev_specs.int_ql_max;
|
||||
- tx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
- rx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
+ tx_coal->int_ql = ptx_coal->int_ql;
|
||||
+ rx_coal->int_ql = prx_coal->int_ql;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3531,14 +3526,14 @@ static void hns3_update_new_int_gl(struct hns3_enet_tqp_vector *tqp_vector)
|
||||
tqp_vector->last_jiffies + msecs_to_jiffies(1000)))
|
||||
return;
|
||||
|
||||
- if (rx_group->coal.gl_adapt_enable) {
|
||||
+ if (rx_group->coal.adapt_enable) {
|
||||
rx_update = hns3_get_new_int_gl(rx_group);
|
||||
if (rx_update)
|
||||
hns3_set_vector_coalesce_rx_gl(tqp_vector,
|
||||
rx_group->coal.int_gl);
|
||||
}
|
||||
|
||||
- if (tx_group->coal.gl_adapt_enable) {
|
||||
+ if (tx_group->coal.adapt_enable) {
|
||||
tx_update = hns3_get_new_int_gl(tx_group);
|
||||
if (tx_update)
|
||||
hns3_set_vector_coalesce_tx_gl(tqp_vector,
|
||||
@@ -3791,6 +3786,34 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void hns3_nic_init_coal_cfg(struct hns3_nic_priv *priv)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(priv->ae_handle->pdev);
|
||||
+ struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
|
||||
+ struct hns3_enet_coalesce *rx_coal = &priv->rx_coal;
|
||||
+
|
||||
+ /* initialize the configuration for interrupt coalescing.
|
||||
+ * 1. GL (Interrupt Gap Limiter)
|
||||
+ * 2. RL (Interrupt Rate Limiter)
|
||||
+ * 3. QL (Interrupt Quantity Limiter)
|
||||
+ *
|
||||
+ * Default: enable interrupt coalescing self-adaptive and GL
|
||||
+ */
|
||||
+ tx_coal->adapt_enable = 1;
|
||||
+ rx_coal->adapt_enable = 1;
|
||||
+
|
||||
+ tx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
+ rx_coal->int_gl = HNS3_INT_GL_50K;
|
||||
+
|
||||
+ rx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
+ tx_coal->flow_level = HNS3_FLOW_LOW;
|
||||
+
|
||||
+ if (ae_dev->dev_specs.int_ql_max) {
|
||||
+ tx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
+ rx_coal->int_ql = HNS3_INT_QL_DEFAULT_CFG;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv)
|
||||
{
|
||||
#define HNS3_VECTOR_PF_MAX_NUM 64
|
||||
@@ -4255,6 +4278,8 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||
goto out_get_ring_cfg;
|
||||
}
|
||||
|
||||
+ hns3_nic_init_coal_cfg(priv);
|
||||
+
|
||||
ret = hns3_nic_alloc_vector_data(priv);
|
||||
if (ret) {
|
||||
ret = -ENOMEM;
|
||||
@@ -4539,31 +4564,6 @@ int hns3_nic_reset_all_ring(struct hnae3_handle *h)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void hns3_store_coal(struct hns3_nic_priv *priv)
|
||||
-{
|
||||
- /* ethtool only support setting and querying one coal
|
||||
- * configuration for now, so save the vector 0' coal
|
||||
- * configuration here in order to restore it.
|
||||
- */
|
||||
- memcpy(&priv->tx_coal, &priv->tqp_vector[0].tx_group.coal,
|
||||
- sizeof(struct hns3_enet_coalesce));
|
||||
- memcpy(&priv->rx_coal, &priv->tqp_vector[0].rx_group.coal,
|
||||
- sizeof(struct hns3_enet_coalesce));
|
||||
-}
|
||||
-
|
||||
-static void hns3_restore_coal(struct hns3_nic_priv *priv)
|
||||
-{
|
||||
- u16 vector_num = priv->vector_num;
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < vector_num; i++) {
|
||||
- memcpy(&priv->tqp_vector[i].tx_group.coal, &priv->tx_coal,
|
||||
- sizeof(struct hns3_enet_coalesce));
|
||||
- memcpy(&priv->tqp_vector[i].rx_group.coal, &priv->rx_coal,
|
||||
- sizeof(struct hns3_enet_coalesce));
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static int hns3_reset_notify_down_enet(struct hnae3_handle *handle)
|
||||
{
|
||||
struct hnae3_knic_private_info *kinfo = &handle->kinfo;
|
||||
@@ -4622,8 +4622,6 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
|
||||
if (ret)
|
||||
goto err_put_ring;
|
||||
|
||||
- hns3_restore_coal(priv);
|
||||
-
|
||||
ret = hns3_nic_init_vector_data(priv);
|
||||
if (ret)
|
||||
goto err_dealloc_vector;
|
||||
@@ -4690,8 +4688,6 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
|
||||
|
||||
hns3_nic_uninit_vector_data(priv);
|
||||
|
||||
- hns3_store_coal(priv);
|
||||
-
|
||||
hns3_nic_dealloc_vector_data(priv);
|
||||
|
||||
ret = hns3_uninit_all_ring(priv);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 0d9d46be1415..c2b465415e8c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -455,7 +455,7 @@ struct hns3_enet_coalesce {
|
||||
u16 int_gl;
|
||||
u16 int_ql;
|
||||
u16 int_ql_max;
|
||||
- u8 gl_adapt_enable:1;
|
||||
+ u8 adapt_enable:1;
|
||||
u8 ql_enable:1;
|
||||
enum hns3_flow_level_range flow_level;
|
||||
};
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 7ed5f9a2ae38..4d982cb80f8b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -1112,50 +1112,32 @@ static void hns3_get_channels(struct net_device *netdev,
|
||||
h->ae_algo->ops->get_channels(h, ch);
|
||||
}
|
||||
|
||||
-static int hns3_get_coalesce_per_queue(struct net_device *netdev, u32 queue,
|
||||
- struct ethtool_coalesce *cmd)
|
||||
+static int hns3_get_coalesce(struct net_device *netdev,
|
||||
+ struct ethtool_coalesce *cmd)
|
||||
{
|
||||
- struct hns3_enet_tqp_vector *tx_vector, *rx_vector;
|
||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
+ struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
|
||||
+ struct hns3_enet_coalesce *rx_coal = &priv->rx_coal;
|
||||
struct hnae3_handle *h = priv->ae_handle;
|
||||
- u16 queue_num = h->kinfo.num_tqps;
|
||||
|
||||
if (hns3_nic_resetting(netdev))
|
||||
return -EBUSY;
|
||||
|
||||
- if (queue >= queue_num) {
|
||||
- netdev_err(netdev,
|
||||
- "Invalid queue value %u! Queue max id=%u\n",
|
||||
- queue, queue_num - 1);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- tx_vector = priv->ring[queue].tqp_vector;
|
||||
- rx_vector = priv->ring[queue_num + queue].tqp_vector;
|
||||
+ cmd->use_adaptive_tx_coalesce = tx_coal->adapt_enable;
|
||||
+ cmd->use_adaptive_rx_coalesce = rx_coal->adapt_enable;
|
||||
|
||||
- cmd->use_adaptive_tx_coalesce =
|
||||
- tx_vector->tx_group.coal.gl_adapt_enable;
|
||||
- cmd->use_adaptive_rx_coalesce =
|
||||
- rx_vector->rx_group.coal.gl_adapt_enable;
|
||||
-
|
||||
- cmd->tx_coalesce_usecs = tx_vector->tx_group.coal.int_gl;
|
||||
- cmd->rx_coalesce_usecs = rx_vector->rx_group.coal.int_gl;
|
||||
+ cmd->tx_coalesce_usecs = tx_coal->int_gl;
|
||||
+ cmd->rx_coalesce_usecs = rx_coal->int_gl;
|
||||
|
||||
cmd->tx_coalesce_usecs_high = h->kinfo.int_rl_setting;
|
||||
cmd->rx_coalesce_usecs_high = h->kinfo.int_rl_setting;
|
||||
|
||||
- cmd->tx_max_coalesced_frames = tx_vector->tx_group.coal.int_ql;
|
||||
- cmd->rx_max_coalesced_frames = rx_vector->rx_group.coal.int_ql;
|
||||
+ cmd->tx_max_coalesced_frames = tx_coal->int_ql;
|
||||
+ cmd->rx_max_coalesced_frames = rx_coal->int_ql;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hns3_get_coalesce(struct net_device *netdev,
|
||||
- struct ethtool_coalesce *cmd)
|
||||
-{
|
||||
- return hns3_get_coalesce_per_queue(netdev, 0, cmd);
|
||||
-}
|
||||
-
|
||||
static int hns3_check_gl_coalesce_para(struct net_device *netdev,
|
||||
struct ethtool_coalesce *cmd)
|
||||
{
|
||||
@@ -1262,19 +1244,7 @@ static int hns3_check_coalesce_para(struct net_device *netdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = hns3_check_ql_coalesce_param(netdev, cmd);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- if (cmd->use_adaptive_tx_coalesce == 1 ||
|
||||
- cmd->use_adaptive_rx_coalesce == 1) {
|
||||
- netdev_info(netdev,
|
||||
- "adaptive-tx=%u and adaptive-rx=%u, tx_usecs or rx_usecs will changed dynamically.\n",
|
||||
- cmd->use_adaptive_tx_coalesce,
|
||||
- cmd->use_adaptive_rx_coalesce);
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
+ return hns3_check_ql_coalesce_param(netdev, cmd);
|
||||
}
|
||||
|
||||
static void hns3_set_coalesce_per_queue(struct net_device *netdev,
|
||||
@@ -1289,9 +1259,9 @@ static void hns3_set_coalesce_per_queue(struct net_device *netdev,
|
||||
tx_vector = priv->ring[queue].tqp_vector;
|
||||
rx_vector = priv->ring[queue_num + queue].tqp_vector;
|
||||
|
||||
- tx_vector->tx_group.coal.gl_adapt_enable =
|
||||
+ tx_vector->tx_group.coal.adapt_enable =
|
||||
cmd->use_adaptive_tx_coalesce;
|
||||
- rx_vector->rx_group.coal.gl_adapt_enable =
|
||||
+ rx_vector->rx_group.coal.adapt_enable =
|
||||
cmd->use_adaptive_rx_coalesce;
|
||||
|
||||
tx_vector->tx_group.coal.int_gl = cmd->tx_coalesce_usecs;
|
||||
@@ -1320,6 +1290,9 @@ static int hns3_set_coalesce(struct net_device *netdev,
|
||||
struct ethtool_coalesce *cmd)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
+ struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
+ struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
|
||||
+ struct hns3_enet_coalesce *rx_coal = &priv->rx_coal;
|
||||
u16 queue_num = h->kinfo.num_tqps;
|
||||
int ret;
|
||||
int i;
|
||||
@@ -1334,6 +1307,15 @@ static int hns3_set_coalesce(struct net_device *netdev,
|
||||
h->kinfo.int_rl_setting =
|
||||
hns3_rl_round_down(cmd->rx_coalesce_usecs_high);
|
||||
|
||||
+ tx_coal->adapt_enable = cmd->use_adaptive_tx_coalesce;
|
||||
+ rx_coal->adapt_enable = cmd->use_adaptive_rx_coalesce;
|
||||
+
|
||||
+ tx_coal->int_gl = cmd->tx_coalesce_usecs;
|
||||
+ rx_coal->int_gl = cmd->rx_coalesce_usecs;
|
||||
+
|
||||
+ tx_coal->int_ql = cmd->tx_max_coalesced_frames;
|
||||
+ rx_coal->int_ql = cmd->rx_max_coalesced_frames;
|
||||
+
|
||||
for (i = 0; i < queue_num; i++)
|
||||
hns3_set_coalesce_per_queue(netdev, cmd, i);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,125 @@
|
||||
From f3f3f7ffce8d19629e5318531208b5c40cdfb267 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:58 +0800
|
||||
Subject: [PATCH 071/283] net: hns3: use HCLGE_VPORT_STATE_PROMISC_CHANGE to
|
||||
replace HCLGE_STATE_PROMISC_CHANGED
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 4e2471f7b6ef5a564cd05bc5fb9f3ce71b7b7942
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4e2471f7b6ef5a564cd05bc5fb9f3ce71b7b7942
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, PF is using HCLGE_STATE_PROMISC_CHANGED to indicate
|
||||
need synchronize the promisc mode for itself, and using flag
|
||||
HCLGE_VPORT_STATE_PROMISC_CHANGE for its VF. To keep consistent,
|
||||
remove flag HCLGE_STATE_PROMISC_CHANGED, and use flag
|
||||
HCLGE_VPORT_STATE_PROMISC_CHANGE instead.
|
||||
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 21 ++++++++++---------
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 4 +++-
|
||||
2 files changed, 14 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 3b4b1c8be8a3..9634927949f9 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -5077,9 +5077,8 @@ static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
||||
static void hclge_request_update_promisc_mode(struct hnae3_handle *handle)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
- struct hclge_dev *hdev = vport->back;
|
||||
|
||||
- set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
+ set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
|
||||
}
|
||||
|
||||
static int hclge_get_fd_mode(struct hclge_dev *hdev, u8 *fd_mode)
|
||||
@@ -7266,6 +7265,8 @@ int hclge_vport_start(struct hclge_vport *vport)
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
+ set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
|
||||
+ set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
|
||||
vport->last_active_jiffies = jiffies;
|
||||
set_bit(HCLGE_VPORT_STATE_START, &vport->state);
|
||||
set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
|
||||
@@ -9305,8 +9306,7 @@ static void hclge_restore_hw_table(struct hclge_dev *hdev)
|
||||
hclge_restore_mac_table_common(vport);
|
||||
hclge_restore_vport_port_base_vlan_config(hdev);
|
||||
hclge_restore_vport_vlan_table(vport);
|
||||
- set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
-
|
||||
+ set_bit(HCLGE_STATE_FD_USER_DEF_CHANGED, &hdev->state);
|
||||
hclge_restore_fd_entries(handle);
|
||||
}
|
||||
|
||||
@@ -11030,7 +11030,7 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
+ set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &hdev->state);
|
||||
|
||||
/* Log and clear the hw errors those already occurred */
|
||||
hclge_handle_all_hns_hw_errors(ae_dev);
|
||||
@@ -11745,18 +11745,19 @@ static void hclge_sync_promisc_mode(struct hclge_dev *hdev)
|
||||
int i;
|
||||
|
||||
if (vport->last_promisc_flags != vport->overflow_promisc_flags) {
|
||||
- set_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
+ set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
|
||||
vport->last_promisc_flags = vport->overflow_promisc_flags;
|
||||
}
|
||||
|
||||
- if (test_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state)) {
|
||||
+ if (test_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state)) {
|
||||
tmp_flags = handle->netdev_flags | vport->last_promisc_flags;
|
||||
ret = hclge_set_promisc_mode(handle, tmp_flags & HNAE3_UPE,
|
||||
tmp_flags & HNAE3_MPE);
|
||||
if (!ret) {
|
||||
- clear_bit(HCLGE_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
- set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE,
|
||||
- &vport->state);
|
||||
+ clear_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE,
|
||||
+ &vport->state);
|
||||
+ hclge_enable_vlan_filter(handle,
|
||||
+ tmp_flags & HNAE3_VLAN_FLTR);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 56a7c6a3e1d9..97916f0fdf50 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -220,8 +220,10 @@ enum HCLGE_DEV_STATE {
|
||||
HCLGE_STATE_STATISTICS_UPDATING,
|
||||
HCLGE_STATE_CMD_DISABLE,
|
||||
HCLGE_STATE_LINK_UPDATING,
|
||||
- HCLGE_STATE_PROMISC_CHANGED,
|
||||
HCLGE_STATE_RST_FAIL,
|
||||
+ HCLGE_STATE_FD_TBL_CHANGED,
|
||||
+ HCLGE_STATE_FD_CLEAR_ALL,
|
||||
+ HCLGE_STATE_FD_USER_DEF_CHANGED,
|
||||
HCLGE_STATE_MAX
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
111
patches/0433-net-hns3-add-a-separate-error-handling-task.patch
Normal file
111
patches/0433-net-hns3-add-a-separate-error-handling-task.patch
Normal file
@ -0,0 +1,111 @@
|
||||
From 06cb892ebf06734ffa1a5d51f0b0efcea5fe00c8 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:08 +0800
|
||||
Subject: [PATCH 072/283] net: hns3: add a separate error handling task
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit d991452dd7900cf152ffb43db3b1d385e1a01579
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d991452dd7900cf152ffb43db3b1d385e1a01579
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Error handling and recovery logic are intertwined. Error handling (i.e.
|
||||
error identification, clearing error sources and initiation of recovery)
|
||||
is done in context of reset task. If certain hardware errors get
|
||||
delivered during driver init time, which can cause driver init/loading
|
||||
to fail.
|
||||
|
||||
Introduce a separate error handling task to ensure below:
|
||||
|
||||
1. Reset logic remains independent of the error handling logic.
|
||||
2. Add the hclge_errhand_task_schedule to schedule error recovery
|
||||
tasks, This will ensure that common misellaneous MSI-X interrupt are
|
||||
re-enabled quickly.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 4 ++--
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 16 ++++++++++++++++
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 1 +
|
||||
3 files changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 494498629317..18c60ea70fc4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -1943,8 +1943,8 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
|
||||
|
||||
if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
|
||||
dev_err(dev,
|
||||
- "Can't handle - MSIx error reported during dev init\n");
|
||||
- return 0;
|
||||
+ "failed to handle msix error during dev init\n");
|
||||
+ return -EAGAIN;
|
||||
}
|
||||
|
||||
return hclge_handle_all_hw_msix_error(hdev, reset_requests);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 9634927949f9..8d69e4568baf 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -2752,6 +2752,14 @@ static void hclge_reset_task_schedule(struct hclge_dev *hdev)
|
||||
mod_delayed_work(hclge_wq, &hdev->service_task, 0);
|
||||
}
|
||||
|
||||
+static void hclge_errhand_task_schedule(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
||||
+ !test_and_set_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
||||
+ mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
|
||||
+ hclge_wq, &hdev->service_task, 0);
|
||||
+}
|
||||
+
|
||||
void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
|
||||
{
|
||||
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
||||
@@ -4174,6 +4182,14 @@ static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
||||
hclge_enable_vector(&hdev->misc_vector, true);
|
||||
}
|
||||
|
||||
+static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ if (!test_and_clear_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
||||
+ return;
|
||||
+
|
||||
+ hclge_misc_err_recovery(hdev);
|
||||
+}
|
||||
+
|
||||
static void hclge_reset_service_task(struct hclge_dev *hdev)
|
||||
{
|
||||
if (!test_and_clear_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 97916f0fdf50..ffe21f617a63 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -217,6 +217,7 @@ enum HCLGE_DEV_STATE {
|
||||
HCLGE_STATE_RST_HANDLING,
|
||||
HCLGE_STATE_MBX_SERVICE_SCHED,
|
||||
HCLGE_STATE_MBX_HANDLING,
|
||||
+ HCLGE_STATE_ERR_SERVICE_SCHED,
|
||||
HCLGE_STATE_STATISTICS_UPDATING,
|
||||
HCLGE_STATE_CMD_DISABLE,
|
||||
HCLGE_STATE_LINK_UPDATING,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,85 @@
|
||||
From 675855af069cab3fd5d9ef5da1e3459ef83a208a Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:09 +0800
|
||||
Subject: [PATCH 073/283] net: hns3: add scheduling logic for error handling
|
||||
task
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit aff399a638da7e56680cdf6fa7544b67e0373a4e
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aff399a638da7e56680cdf6fa7544b67e0373a4e
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Error handling & recovery is done in context of reset task which
|
||||
gets scheduled from misc interrupt handler in existing code. But
|
||||
since error handling has been moved to new task, it should get
|
||||
scheduled instead of the reset task from the interrupt handler.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 20 ++++++-------------
|
||||
1 file changed, 6 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 8d69e4568baf..0ec52f603fc5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3311,18 +3311,8 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
|
||||
/* vector 0 interrupt is shared with reset and mailbox source events.*/
|
||||
switch (event_cause) {
|
||||
case HCLGE_VECTOR0_EVENT_ERR:
|
||||
- /* we do not know what type of reset is required now. This could
|
||||
- * only be decided after we fetch the type of errors which
|
||||
- * caused this event. Therefore, we will do below for now:
|
||||
- * 1. Assert HNAE3_UNKNOWN_RESET type of reset. This means we
|
||||
- * have defered type of reset to be used.
|
||||
- * 2. Schedule the reset serivce task.
|
||||
- * 3. When service task receives HNAE3_UNKNOWN_RESET type it
|
||||
- * will fetch the correct type of reset. This would be done
|
||||
- * by first decoding the types of errors.
|
||||
- */
|
||||
- set_bit(HNAE3_UNKNOWN_RESET, &hdev->reset_request);
|
||||
- /* fall through */
|
||||
+ hclge_errhand_task_schedule(hdev);
|
||||
+ break;
|
||||
case HCLGE_VECTOR0_EVENT_RST:
|
||||
hclge_reset_task_schedule(hdev);
|
||||
break;
|
||||
@@ -4285,14 +4275,16 @@ static void hclge_service_task(struct work_struct *work)
|
||||
struct hclge_dev *hdev =
|
||||
container_of(work, struct hclge_dev, service_task.work);
|
||||
|
||||
+ hclge_errhand_service_task(hdev);
|
||||
hclge_reset_service_task(hdev);
|
||||
hclge_mailbox_service_task(hdev);
|
||||
hclge_periodic_service_task(hdev);
|
||||
|
||||
- /* Handle reset and mbx again in case periodical task delays the
|
||||
- * handling by calling hclge_task_schedule() in
|
||||
+ /* Handle error recovery, reset and mbx again in case periodical task
|
||||
+ * delays the handling by calling hclge_task_schedule() in
|
||||
* hclge_periodic_service_task().
|
||||
*/
|
||||
+ hclge_errhand_service_task(hdev);
|
||||
hclge_reset_service_task(hdev);
|
||||
hclge_mailbox_service_task(hdev);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
143
patches/0435-net-hns3-add-log-for-workqueue-scheduled-late.patch
Normal file
143
patches/0435-net-hns3-add-log-for-workqueue-scheduled-late.patch
Normal file
@ -0,0 +1,143 @@
|
||||
From c311d421d90c808afb638faff4d51c2d255854fe Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Wed, 24 Nov 2021 09:06:51 +0800
|
||||
Subject: [PATCH 074/283] net: hns3: add log for workqueue scheduled late
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.17-rc1
|
||||
commit d9069dab207534d9f6f41993ee78a651733becea
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d9069dab207534d9f6f41993ee78a651733becea
|
||||
|
||||
--------------------------------
|
||||
|
||||
When the mbx or reset message arrives, the driver is informed
|
||||
through an interrupt. This task can be processed only after
|
||||
the workqueue is scheduled. In some cases, this workqueue
|
||||
scheduling takes a long time. As a result, the mbx or reset
|
||||
service task cannot be processed in time. So add some warning
|
||||
message to improve debugging efficiency for this case.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hclge_mbx.h | 3 +++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 25 ++++++++++++++-----
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 2 ++
|
||||
.../hisilicon/hns3/hns3pf/hclge_mbx.c | 8 ++++++
|
||||
4 files changed, 32 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
index 5ab56fd90738..bfd6f19aa65a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
@@ -81,6 +81,9 @@ enum hclge_mbx_tbl_cfg_subcode {
|
||||
#define HCLGE_MBX_MAX_RESP_DATA_SIZE 8U
|
||||
#define HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM 4
|
||||
|
||||
+#define HCLGE_RESET_SCHED_TIMEOUT (3 * HZ)
|
||||
+#define HCLGE_MBX_SCHED_TIMEOUT (HZ / 2)
|
||||
+
|
||||
struct hclge_ring_chain_param {
|
||||
u8 ring_type;
|
||||
u8 tqp_index;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 0ec52f603fc5..062572b2f779 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -2740,16 +2740,20 @@ static int hclge_mac_init(struct hclge_dev *hdev)
|
||||
static void hclge_mbx_task_schedule(struct hclge_dev *hdev)
|
||||
{
|
||||
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
||||
- !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
|
||||
+ !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state)) {
|
||||
+ hdev->last_mbx_scheduled = jiffies;
|
||||
mod_delayed_work(hclge_wq, &hdev->service_task, 0);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void hclge_reset_task_schedule(struct hclge_dev *hdev)
|
||||
{
|
||||
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
||||
test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state) &&
|
||||
- !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
|
||||
+ !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state)) {
|
||||
+ hdev->last_rst_scheduled = jiffies;
|
||||
mod_delayed_work(hclge_wq, &hdev->service_task, 0);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void hclge_errhand_task_schedule(struct hclge_dev *hdev)
|
||||
@@ -3556,6 +3560,13 @@ static void hclge_mailbox_service_task(struct hclge_dev *hdev)
|
||||
test_and_set_bit(HCLGE_STATE_MBX_HANDLING, &hdev->state))
|
||||
return;
|
||||
|
||||
+ if (time_is_before_jiffies(hdev->last_mbx_scheduled +
|
||||
+ HCLGE_MBX_SCHED_TIMEOUT))
|
||||
+ dev_warn(&hdev->pdev->dev,
|
||||
+ "mbx service task is scheduled after %ums on cpu%u!\n",
|
||||
+ jiffies_to_msecs(jiffies - hdev->last_mbx_scheduled),
|
||||
+ smp_processor_id());
|
||||
+
|
||||
hclge_mbx_handler(hdev);
|
||||
|
||||
clear_bit(HCLGE_STATE_MBX_HANDLING, &hdev->state);
|
||||
@@ -4185,10 +4196,12 @@ static void hclge_reset_service_task(struct hclge_dev *hdev)
|
||||
if (!test_and_clear_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
|
||||
return;
|
||||
|
||||
- if (test_and_clear_bit(HNAE3_UNKNOWN_RESET, &hdev->reset_request)) {
|
||||
- hclge_misc_err_recovery(hdev);
|
||||
- return;
|
||||
- }
|
||||
+ if (time_is_before_jiffies(hdev->last_rst_scheduled +
|
||||
+ HCLGE_RESET_SCHED_TIMEOUT))
|
||||
+ dev_warn(&hdev->pdev->dev,
|
||||
+ "reset service task is scheduled after %ums on cpu%u!\n",
|
||||
+ jiffies_to_msecs(jiffies - hdev->last_rst_scheduled),
|
||||
+ smp_processor_id());
|
||||
|
||||
down(&hdev->reset_sem);
|
||||
set_bit(HCLGE_STATE_RST_HANDLING, &hdev->state);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index ffe21f617a63..c8eb73b58326 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -858,6 +858,8 @@ struct hclge_dev {
|
||||
u16 hclge_fd_rule_num;
|
||||
unsigned long serv_processed_cnt;
|
||||
unsigned long last_serv_processed;
|
||||
+ unsigned long last_rst_scheduled;
|
||||
+ unsigned long last_mbx_scheduled;
|
||||
unsigned long fd_bmap[BITS_TO_LONGS(MAX_FD_FILTER_NUM)];
|
||||
enum HCLGE_FD_ACTIVE_RULE_TYPE fd_active_type;
|
||||
u8 fd_en;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
index ff283ac443e5..841c9b0c9fe4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
@@ -951,6 +951,14 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
|
||||
if (hnae3_get_bit(req->mbx_need_resp, HCLGE_MBX_NEED_RESP_B) &&
|
||||
req->msg.code < HCLGE_MBX_GET_VF_FLR_STATUS) {
|
||||
resp_msg.status = ret;
|
||||
+ if (time_is_before_jiffies(hdev->last_mbx_scheduled +
|
||||
+ HCLGE_MBX_SCHED_TIMEOUT))
|
||||
+ dev_warn(&hdev->pdev->dev,
|
||||
+ "resp vport%u mbx(%u,%u) late\n",
|
||||
+ req->mbx_src_vfid,
|
||||
+ req->msg.code,
|
||||
+ req->msg.subcode);
|
||||
+
|
||||
hclge_gen_resp_to_vf(vport, req, &resp_msg);
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
From b91dbf7afeac98f63bca87ee6c37921bb7a925bc Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:10 +0800
|
||||
Subject: [PATCH 075/283] net: hns3: remove now redundant logic related to
|
||||
HNAE3_UNKNOWN_RESET
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit e0fe0a38371b6d2d669e231c1fd68ce620dfa6b2
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e0fe0a38371b6d2d669e231c1fd68ce620dfa6b2
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Earlier patches have decoupled the MSI-X conveyed error handling
|
||||
and recovery logic. This earlier concept code is no longer required.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 6a21c1b0434e..6a93ea356234 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -234,7 +234,9 @@ enum hnae3_reset_type {
|
||||
HNAE3_FUNC_RESET,
|
||||
HNAE3_GLOBAL_RESET,
|
||||
HNAE3_IMP_RESET,
|
||||
+#ifdef __GENKSYMS__
|
||||
HNAE3_UNKNOWN_RESET,
|
||||
+#endif
|
||||
HNAE3_NONE_RESET,
|
||||
HNAE3_MAX_RESET,
|
||||
};
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,187 @@
|
||||
From 1405375054d9e15c95982cd1eb6608a7dad08de7 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:11 +0800
|
||||
Subject: [PATCH 076/283] net: hns3: add support for handling all errors
|
||||
through MSI-X
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 17f59244029bf9c0673725efdd0386ed95e127a7
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=17f59244029bf9c0673725efdd0386ed95e127a7
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, hardware errors can be reported through AER or MSI-X mode.
|
||||
However, the AER mode is intended to handle only bus errors, but not
|
||||
hardware errors. On the other hand, virtual machines cannot handle
|
||||
AER errors. When an AER error is reported, virtual machines will be
|
||||
suspended. So add support for handling all these hardware errors
|
||||
through MSI-X mode which depends on a newer version of firmware,
|
||||
and reserve the handler of the AER mode for compatibility.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.c | 16 +++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 47 ++++++++++---------
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 1 +
|
||||
3 files changed, 41 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 18c60ea70fc4..3855c029829a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -1614,11 +1614,27 @@ static const struct hclge_hw_blk hw_blk[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
+static void hclge_config_all_msix_error(struct hclge_dev *hdev, bool enable)
|
||||
+{
|
||||
+ u32 reg_val;
|
||||
+
|
||||
+ reg_val = hclge_read_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG);
|
||||
+
|
||||
+ if (enable)
|
||||
+ reg_val |= BIT(HCLGE_VECTOR0_ALL_MSIX_ERR_B);
|
||||
+ else
|
||||
+ reg_val &= ~BIT(HCLGE_VECTOR0_ALL_MSIX_ERR_B);
|
||||
+
|
||||
+ hclge_write_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG, reg_val);
|
||||
+}
|
||||
+
|
||||
int hclge_config_nic_hw_error(struct hclge_dev *hdev, bool state)
|
||||
{
|
||||
const struct hclge_hw_blk *module = hw_blk;
|
||||
int ret = 0;
|
||||
|
||||
+ hclge_config_all_msix_error(hdev, state);
|
||||
+
|
||||
while (module->name) {
|
||||
if (module->config_err_int) {
|
||||
ret = module->config_err_int(hdev, state);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 062572b2f779..f56cc318e2ad 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3220,11 +3220,13 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
|
||||
|
||||
static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
{
|
||||
- u32 cmdq_src_reg, msix_src_reg;
|
||||
+ u32 cmdq_src_reg, msix_src_reg, hw_err_src_reg;
|
||||
|
||||
/* fetch the events from their corresponding regs */
|
||||
cmdq_src_reg = hclge_read_dev(&hdev->hw, HCLGE_VECTOR0_CMDQ_SRC_REG);
|
||||
msix_src_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
+ hw_err_src_reg = hclge_read_dev(&hdev->hw,
|
||||
+ HCLGE_RAS_PF_OTHER_INT_STS_REG);
|
||||
|
||||
/* Assumption: If by any chance reset and mailbox events are reported
|
||||
* together then we will only process reset event in this go and will
|
||||
@@ -3252,11 +3254,11 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
return HCLGE_VECTOR0_EVENT_RST;
|
||||
}
|
||||
|
||||
- /* check for vector0 msix event source */
|
||||
- if (msix_src_reg & HCLGE_VECTOR0_REG_MSIX_MASK) {
|
||||
- *clearval = msix_src_reg;
|
||||
+ /* check for vector0 msix event and hardware error event source */
|
||||
+ if (msix_src_reg & HCLGE_VECTOR0_REG_MSIX_MASK ||
|
||||
+ hw_err_src_reg & HCLGE_RAS_REG_NFE_MASK ||
|
||||
+ hw_err_src_reg & HCLGE_RAS_REG_ROCEE_ERR_MASK)
|
||||
return HCLGE_VECTOR0_EVENT_ERR;
|
||||
- }
|
||||
|
||||
/* check for vector0 mailbox(=CMDQ RX) event source */
|
||||
if (BIT(HCLGE_VECTOR0_RX_CMDQ_INT_B) & cmdq_src_reg) {
|
||||
@@ -3267,9 +3269,8 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
|
||||
/* print other vector0 event source */
|
||||
dev_info(&hdev->pdev->dev,
|
||||
- "CMDQ INT status:0x%x, other INT status:0x%x\n",
|
||||
- cmdq_src_reg, msix_src_reg);
|
||||
- *clearval = msix_src_reg;
|
||||
+ "INT status: CMDQ(%#x) HW errors(%#x) other(%#x)\n",
|
||||
+ cmdq_src_reg, hw_err_src_reg, msix_src_reg);
|
||||
|
||||
return HCLGE_VECTOR0_EVENT_OTHER;
|
||||
}
|
||||
@@ -3340,15 +3341,10 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
|
||||
|
||||
hclge_clear_event_cause(hdev, event_cause, clearval);
|
||||
|
||||
- /* Enable interrupt if it is not cause by reset. And when
|
||||
- * clearval equal to 0, it means interrupt status may be
|
||||
- * cleared by hardware before driver reads status register.
|
||||
- * For this case, vector0 interrupt also should be enabled.
|
||||
- */
|
||||
- if (!clearval ||
|
||||
- event_cause == HCLGE_VECTOR0_EVENT_MBX) {
|
||||
+ /* Enable interrupt if it is not caused by reset event or error event */
|
||||
+ if (event_cause == HCLGE_VECTOR0_EVENT_MBX ||
|
||||
+ event_cause == HCLGE_VECTOR0_EVENT_OTHER)
|
||||
hclge_enable_vector(&hdev->misc_vector, true);
|
||||
- }
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -4165,22 +4161,27 @@ static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct device *dev = &hdev->pdev->dev;
|
||||
+ enum hnae3_reset_type reset_type;
|
||||
u32 msix_sts_reg;
|
||||
|
||||
msix_sts_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
-
|
||||
if (msix_sts_reg & HCLGE_VECTOR0_REG_MSIX_MASK) {
|
||||
- if (hclge_handle_hw_msix_error(hdev,
|
||||
- &hdev->default_reset_request))
|
||||
+ if (hclge_handle_hw_msix_error
|
||||
+ (hdev, &hdev->default_reset_request))
|
||||
dev_info(dev, "received msix interrupt 0x%x\n",
|
||||
msix_sts_reg);
|
||||
+ }
|
||||
+ hclge_enable_vector(&hdev->misc_vector, true);
|
||||
|
||||
- if (hdev->default_reset_request)
|
||||
- if (ae_dev->ops->reset_event)
|
||||
- ae_dev->ops->reset_event(hdev->pdev, NULL);
|
||||
+ hclge_handle_hw_ras_error(ae_dev);
|
||||
+ if (ae_dev->hw_err_reset_req) {
|
||||
+ reset_type = hclge_get_reset_level(ae_dev,
|
||||
+ &ae_dev->hw_err_reset_req);
|
||||
+ hclge_set_def_reset_request(ae_dev, reset_type);
|
||||
}
|
||||
|
||||
- hclge_enable_vector(&hdev->misc_vector, true);
|
||||
+ if (hdev->default_reset_request && ae_dev->ops->reset_event)
|
||||
+ ae_dev->ops->reset_event(hdev->pdev, NULL);
|
||||
}
|
||||
|
||||
static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index c8eb73b58326..1a262a247701 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -187,6 +187,7 @@ enum HLCGE_PORT_TYPE {
|
||||
#define HCLGE_VECTOR0_IMP_RESET_INT_B 1
|
||||
#define HCLGE_VECTOR0_IMP_CMDQ_ERR_B 4U
|
||||
#define HCLGE_VECTOR0_IMP_RD_POISON_B 5U
|
||||
+#define HCLGE_VECTOR0_ALL_MSIX_ERR_B 6U
|
||||
|
||||
#define HCLGE_MAC_DEFAULT_FRAME \
|
||||
(ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN + ETH_DATA_LEN)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,625 @@
|
||||
From ff05551bfec7c306b38bdb056f0e1203b8f01980 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:12 +0800
|
||||
Subject: [PATCH 077/283] net: hns3: add the RAS compatibility adaptation
|
||||
solution
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 2e2deee7618b062efe3aba9fcb017dadcf148819
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2e2deee7618b062efe3aba9fcb017dadcf148819
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
To adapt to hardware modification and ensure that the driver is
|
||||
compatible with the original error handling content, we need to add the
|
||||
RAS compatibility adaptation solution.
|
||||
|
||||
Add a processing branch to the driver during error handling. In the new
|
||||
processing branch, NIC fault information is integrated by the IMP. An
|
||||
interaction command is added between the driver and IMP to query
|
||||
and clear the fault source and interrupt source. The IMP integrates
|
||||
error information and reports the highest reset level to the driver.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 3 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 2 +
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.c | 324 ++++++++++++++++--
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.h | 68 ++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 54 ++-
|
||||
5 files changed, 410 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index 7646e510c0e7..e127ca7106b7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -194,7 +194,8 @@ static bool hclge_is_special_opcode(u16 opcode)
|
||||
HCLGE_QUERY_CLEAR_MPF_RAS_INT,
|
||||
HCLGE_QUERY_CLEAR_PF_RAS_INT,
|
||||
HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT,
|
||||
- HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT};
|
||||
+ HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT,
|
||||
+ HCLGE_QUERY_ALL_ERR_INFO};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(spec_opcode); i++) {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index b6498f8ce224..81b726e557df 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -296,6 +296,8 @@ enum hclge_opcode_type {
|
||||
HCLGE_QUERY_MSIX_INT_STS_BD_NUM = 0x1513,
|
||||
HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT = 0x1514,
|
||||
HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT = 0x1515,
|
||||
+ HCLGE_QUERY_ALL_ERR_BD_NUM = 0x1516,
|
||||
+ HCLGE_QUERY_ALL_ERR_INFO = 0x1517,
|
||||
HCLGE_CONFIG_ROCEE_RAS_INT_EN = 0x1580,
|
||||
HCLGE_QUERY_CLEAR_ROCEE_RAS_INT = 0x1581,
|
||||
HCLGE_ROCEE_PF_RAS_INT_CMD = 0x1584,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index 3855c029829a..cf4afddad526 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -631,9 +631,101 @@ const struct hclge_hw_error hclge_rocee_qmm_ovf_err_int[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
+static const struct hclge_hw_module_id hclge_hw_module_id_st[] = {
|
||||
+ {
|
||||
+ .module_id = MODULE_NONE,
|
||||
+ .msg = "MODULE_NONE"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_BIOS_COMMON,
|
||||
+ .msg = "MODULE_BIOS_COMMON"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_GE,
|
||||
+ .msg = "MODULE_GE"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_IGU_EGU,
|
||||
+ .msg = "MODULE_IGU_EGU"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_LGE,
|
||||
+ .msg = "MODULE_LGE"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_NCSI,
|
||||
+ .msg = "MODULE_NCSI"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_PPP,
|
||||
+ .msg = "MODULE_PPP"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_QCN,
|
||||
+ .msg = "MODULE_QCN"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_RCB_RX,
|
||||
+ .msg = "MODULE_RCB_RX"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_RTC,
|
||||
+ .msg = "MODULE_RTC"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_SSU,
|
||||
+ .msg = "MODULE_SSU"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_TM,
|
||||
+ .msg = "MODULE_TM"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_RCB_TX,
|
||||
+ .msg = "MODULE_RCB_TX"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_TXDMA,
|
||||
+ .msg = "MODULE_TXDMA"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_MASTER,
|
||||
+ .msg = "MODULE_MASTER"
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static const struct hclge_hw_type_id hclge_hw_type_id_st[] = {
|
||||
+ {
|
||||
+ .type_id = NONE_ERROR,
|
||||
+ .msg = "none_error"
|
||||
+ }, {
|
||||
+ .type_id = FIFO_ERROR,
|
||||
+ .msg = "fifo_error"
|
||||
+ }, {
|
||||
+ .type_id = MEMORY_ERROR,
|
||||
+ .msg = "memory_error"
|
||||
+ }, {
|
||||
+ .type_id = POISON_ERROR,
|
||||
+ .msg = "poison_error"
|
||||
+ }, {
|
||||
+ .type_id = MSIX_ECC_ERROR,
|
||||
+ .msg = "msix_ecc_error"
|
||||
+ }, {
|
||||
+ .type_id = TQP_INT_ECC_ERROR,
|
||||
+ .msg = "tqp_int_ecc_error"
|
||||
+ }, {
|
||||
+ .type_id = PF_ABNORMAL_INT_ERROR,
|
||||
+ .msg = "pf_abnormal_int_error"
|
||||
+ }, {
|
||||
+ .type_id = MPF_ABNORMAL_INT_ERROR,
|
||||
+ .msg = "mpf_abnormal_int_error"
|
||||
+ }, {
|
||||
+ .type_id = COMMON_ERROR,
|
||||
+ .msg = "common_error"
|
||||
+ }, {
|
||||
+ .type_id = PORT_ERROR,
|
||||
+ .msg = "port_error"
|
||||
+ }, {
|
||||
+ .type_id = ETS_ERROR,
|
||||
+ .msg = "ets_error"
|
||||
+ }, {
|
||||
+ .type_id = NCSI_ERROR,
|
||||
+ .msg = "ncsi_error"
|
||||
+ }, {
|
||||
+ .type_id = GLB_ERROR,
|
||||
+ .msg = "glb_error"
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
void hclge_log_error(struct device *dev, char *reg,
|
||||
- const struct hclge_hw_error *err,
|
||||
- u32 err_sts, unsigned long *reset_requests)
|
||||
+ const struct hclge_hw_error *err,
|
||||
+ u32 err_sts, unsigned long *reset_requests)
|
||||
{
|
||||
while (err->msg) {
|
||||
if (err->int_msk & err_sts) {
|
||||
@@ -1895,11 +1987,8 @@ static int hclge_handle_pf_msix_error(struct hclge_dev *hdev,
|
||||
static int hclge_handle_all_hw_msix_error(struct hclge_dev *hdev,
|
||||
unsigned long *reset_requests)
|
||||
{
|
||||
- struct hclge_mac_tnl_stats mac_tnl_stats;
|
||||
- struct device *dev = &hdev->pdev->dev;
|
||||
u32 mpf_bd_num, pf_bd_num, bd_num;
|
||||
struct hclge_desc *desc;
|
||||
- u32 status;
|
||||
int ret;
|
||||
|
||||
/* query the number of bds for the MSIx int status */
|
||||
@@ -1922,29 +2011,7 @@ static int hclge_handle_all_hw_msix_error(struct hclge_dev *hdev,
|
||||
if (ret)
|
||||
goto msi_error;
|
||||
|
||||
- /* query and clear mac tnl interruptions */
|
||||
- hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_MAC_TNL_INT,
|
||||
- true);
|
||||
- ret = hclge_cmd_send(&hdev->hw, &desc[0], 1);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "query mac tnl int cmd failed (%d)\n", ret);
|
||||
- goto msi_error;
|
||||
- }
|
||||
-
|
||||
- status = le32_to_cpu(desc->data[0]);
|
||||
- if (status) {
|
||||
- /* When mac tnl interrupt occurs, we record current time and
|
||||
- * register status here in a fifo, then clear the status. So
|
||||
- * that if link status changes suddenly at some time, we can
|
||||
- * query them by debugfs.
|
||||
- */
|
||||
- mac_tnl_stats.time = local_clock();
|
||||
- mac_tnl_stats.status = status;
|
||||
- kfifo_put(&hdev->mac_tnl_log, mac_tnl_stats);
|
||||
- ret = hclge_clear_mac_tnl_int(hdev);
|
||||
- if (ret)
|
||||
- dev_err(dev, "clear mac tnl int failed (%d)\n", ret);
|
||||
- }
|
||||
+ ret = hclge_handle_mac_tnl(hdev);
|
||||
|
||||
msi_error:
|
||||
kfree(desc);
|
||||
@@ -1966,10 +2033,43 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
|
||||
return hclge_handle_all_hw_msix_error(hdev, reset_requests);
|
||||
}
|
||||
|
||||
-void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
|
||||
+int hclge_handle_mac_tnl(struct hclge_dev *hdev)
|
||||
{
|
||||
-#define HCLGE_DESC_NO_DATA_LEN 8
|
||||
+ struct hclge_mac_tnl_stats mac_tnl_stats;
|
||||
+ struct device *dev = &hdev->pdev->dev;
|
||||
+ struct hclge_desc desc;
|
||||
+ u32 status;
|
||||
+ int ret;
|
||||
|
||||
+ /* query and clear mac tnl interruptions */
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_TNL_INT, true);
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to query mac tnl int, ret = %d.\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ status = le32_to_cpu(desc.data[0]);
|
||||
+ if (status) {
|
||||
+ /* When mac tnl interrupt occurs, we record current time and
|
||||
+ * register status here in a fifo, then clear the status. So
|
||||
+ * that if link status changes suddenly at some time, we can
|
||||
+ * query them by debugfs.
|
||||
+ */
|
||||
+ mac_tnl_stats.time = local_clock();
|
||||
+ mac_tnl_stats.status = status;
|
||||
+ kfifo_put(&hdev->mac_tnl_log, mac_tnl_stats);
|
||||
+ ret = hclge_clear_mac_tnl_int(hdev);
|
||||
+ if (ret)
|
||||
+ dev_err(dev, "failed to clear mac tnl int, ret = %d.\n",
|
||||
+ ret);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
|
||||
+{
|
||||
struct hclge_dev *hdev = ae_dev->priv;
|
||||
struct device *dev = &hdev->pdev->dev;
|
||||
u32 mpf_bd_num, pf_bd_num, bd_num;
|
||||
@@ -2018,3 +2118,167 @@ void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
|
||||
msi_error:
|
||||
kfree(desc);
|
||||
}
|
||||
+
|
||||
+static void
|
||||
+hclge_handle_error_type_reg_log(struct device *dev,
|
||||
+ struct hclge_mod_err_info *mod_info,
|
||||
+ struct hclge_type_reg_err_info *type_reg_info)
|
||||
+{
|
||||
+#define HCLGE_ERR_TYPE_MASK 0x7F
|
||||
+#define HCLGE_ERR_TYPE_IS_RAS_OFFSET 7
|
||||
+
|
||||
+ u8 mod_id, total_module, type_id, total_type, i, is_ras;
|
||||
+
|
||||
+ mod_id = mod_info->mod_id;
|
||||
+ type_id = type_reg_info->type_id & HCLGE_ERR_TYPE_MASK;
|
||||
+ is_ras = type_reg_info->type_id >> HCLGE_ERR_TYPE_IS_RAS_OFFSET;
|
||||
+
|
||||
+ total_module = ARRAY_SIZE(hclge_hw_module_id_st);
|
||||
+ total_type = ARRAY_SIZE(hclge_hw_type_id_st);
|
||||
+
|
||||
+ if (mod_id < total_module && type_id < total_type)
|
||||
+ dev_err(dev,
|
||||
+ "found %s %s, is %s error.\n",
|
||||
+ hclge_hw_module_id_st[mod_id].msg,
|
||||
+ hclge_hw_type_id_st[type_id].msg,
|
||||
+ is_ras ? "ras" : "msix");
|
||||
+ else
|
||||
+ dev_err(dev,
|
||||
+ "unknown module[%u] or type[%u].\n", mod_id, type_id);
|
||||
+
|
||||
+ dev_err(dev, "reg_value:\n");
|
||||
+ for (i = 0; i < type_reg_info->reg_num; i++)
|
||||
+ dev_err(dev, "0x%08x\n", type_reg_info->hclge_reg[i]);
|
||||
+}
|
||||
+
|
||||
+static void hclge_handle_error_module_log(struct hnae3_ae_dev *ae_dev,
|
||||
+ const u32 *buf, u32 buf_size)
|
||||
+{
|
||||
+ struct hclge_type_reg_err_info *type_reg_info;
|
||||
+ struct hclge_dev *hdev = ae_dev->priv;
|
||||
+ struct device *dev = &hdev->pdev->dev;
|
||||
+ struct hclge_mod_err_info *mod_info;
|
||||
+ struct hclge_sum_err_info *sum_info;
|
||||
+ u8 mod_num, err_num, i;
|
||||
+ u32 offset = 0;
|
||||
+
|
||||
+ sum_info = (struct hclge_sum_err_info *)&buf[offset++];
|
||||
+ if (sum_info->reset_type &&
|
||||
+ sum_info->reset_type != HNAE3_NONE_RESET)
|
||||
+ set_bit(sum_info->reset_type, &ae_dev->hw_err_reset_req);
|
||||
+ mod_num = sum_info->mod_num;
|
||||
+
|
||||
+ while (mod_num--) {
|
||||
+ if (offset >= buf_size) {
|
||||
+ dev_err(dev, "The offset(%u) exceeds buf's size(%u).\n",
|
||||
+ offset, buf_size);
|
||||
+ return;
|
||||
+ }
|
||||
+ mod_info = (struct hclge_mod_err_info *)&buf[offset++];
|
||||
+ err_num = mod_info->err_num;
|
||||
+
|
||||
+ for (i = 0; i < err_num; i++) {
|
||||
+ if (offset >= buf_size) {
|
||||
+ dev_err(dev,
|
||||
+ "The offset(%u) exceeds buf size(%u).\n",
|
||||
+ offset, buf_size);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ type_reg_info = (struct hclge_type_reg_err_info *)
|
||||
+ &buf[offset++];
|
||||
+ hclge_handle_error_type_reg_log(dev, mod_info,
|
||||
+ type_reg_info);
|
||||
+
|
||||
+ offset += type_reg_info->reg_num;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int hclge_query_all_err_bd_num(struct hclge_dev *hdev, u32 *bd_num)
|
||||
+{
|
||||
+ struct device *dev = &hdev->pdev->dev;
|
||||
+ struct hclge_desc desc_bd;
|
||||
+ int ret;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(&desc_bd, HCLGE_QUERY_ALL_ERR_BD_NUM, true);
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to query error bd_num, ret = %d.\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ *bd_num = le32_to_cpu(desc_bd.data[0]);
|
||||
+ if (!(*bd_num)) {
|
||||
+ dev_err(dev, "The value of bd_num is 0!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hclge_query_all_err_info(struct hclge_dev *hdev,
|
||||
+ struct hclge_desc *desc, u32 bd_num)
|
||||
+{
|
||||
+ struct device *dev = &hdev->pdev->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ hclge_cmd_setup_basic_desc(desc, HCLGE_QUERY_ALL_ERR_INFO, true);
|
||||
+ ret = hclge_cmd_send(&hdev->hw, desc, bd_num);
|
||||
+ if (ret)
|
||||
+ dev_err(dev, "failed to query error info, ret = %d.\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int hclge_handle_error_info_log(struct hnae3_ae_dev *ae_dev)
|
||||
+{
|
||||
+ u32 bd_num, desc_len, buf_len, buf_size, i;
|
||||
+ struct hclge_dev *hdev = ae_dev->priv;
|
||||
+ struct hclge_desc *desc;
|
||||
+ __le32 *desc_data;
|
||||
+ u32 *buf;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = hclge_query_all_err_bd_num(hdev, &bd_num);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
+ desc_len = bd_num * sizeof(struct hclge_desc);
|
||||
+ desc = kzalloc(desc_len, GFP_KERNEL);
|
||||
+ if (!desc) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = hclge_query_all_err_info(hdev, desc, bd_num);
|
||||
+ if (ret)
|
||||
+ goto err_desc;
|
||||
+
|
||||
+ buf_len = bd_num * sizeof(struct hclge_desc) - HCLGE_DESC_NO_DATA_LEN;
|
||||
+ buf_size = buf_len / sizeof(u32);
|
||||
+
|
||||
+ desc_data = kzalloc(buf_len, GFP_KERNEL);
|
||||
+ if (!desc_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ buf = kzalloc(buf_len, GFP_KERNEL);
|
||||
+ if (!buf) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err_buf_alloc;
|
||||
+ }
|
||||
+
|
||||
+ memcpy(desc_data, &desc[0].data[0], buf_len);
|
||||
+ for (i = 0; i < buf_size; i++)
|
||||
+ buf[i] = le32_to_cpu(desc_data[i]);
|
||||
+
|
||||
+ hclge_handle_error_module_log(ae_dev, buf, buf_size);
|
||||
+ kfree(buf);
|
||||
+
|
||||
+err_buf_alloc:
|
||||
+ kfree(desc_data);
|
||||
+err_desc:
|
||||
+ kfree(desc);
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
index fcaf4f472379..6cc225a5cfbe 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
@@ -110,6 +110,10 @@
|
||||
#define HCLGE_ROCEE_OVF_ERR_INT_MASK 0x10000
|
||||
#define HCLGE_ROCEE_OVF_ERR_TYPE_MASK 0x3F
|
||||
|
||||
+#define HCLGE_DESC_DATA_MAX 8
|
||||
+#define HCLGE_REG_NUM_MAX 256
|
||||
+#define HCLGE_DESC_NO_DATA_LEN 8
|
||||
+
|
||||
enum hclge_err_int_type {
|
||||
HCLGE_ERR_INT_MSIX = 0,
|
||||
HCLGE_ERR_INT_RAS_CE = 1,
|
||||
@@ -117,6 +121,40 @@ enum hclge_err_int_type {
|
||||
HCLGE_ERR_INT_RAS_FE = 3,
|
||||
};
|
||||
|
||||
+enum hclge_mod_name_list {
|
||||
+ MODULE_NONE = 0,
|
||||
+ MODULE_BIOS_COMMON = 1,
|
||||
+ MODULE_GE = 2,
|
||||
+ MODULE_IGU_EGU = 3,
|
||||
+ MODULE_LGE = 4,
|
||||
+ MODULE_NCSI = 5,
|
||||
+ MODULE_PPP = 6,
|
||||
+ MODULE_QCN = 7,
|
||||
+ MODULE_RCB_RX = 8,
|
||||
+ MODULE_RTC = 9,
|
||||
+ MODULE_SSU = 10,
|
||||
+ MODULE_TM = 11,
|
||||
+ MODULE_RCB_TX = 12,
|
||||
+ MODULE_TXDMA = 13,
|
||||
+ MODULE_MASTER = 14,
|
||||
+};
|
||||
+
|
||||
+enum hclge_err_type_list {
|
||||
+ NONE_ERROR = 0,
|
||||
+ FIFO_ERROR = 1,
|
||||
+ MEMORY_ERROR = 2,
|
||||
+ POISON_ERROR = 3,
|
||||
+ MSIX_ECC_ERROR = 4,
|
||||
+ TQP_INT_ECC_ERROR = 5,
|
||||
+ PF_ABNORMAL_INT_ERROR = 6,
|
||||
+ MPF_ABNORMAL_INT_ERROR = 7,
|
||||
+ COMMON_ERROR = 8,
|
||||
+ PORT_ERROR = 9,
|
||||
+ ETS_ERROR = 10,
|
||||
+ NCSI_ERROR = 11,
|
||||
+ GLB_ERROR = 12,
|
||||
+};
|
||||
+
|
||||
struct hclge_hw_blk {
|
||||
u32 msk;
|
||||
const char *name;
|
||||
@@ -153,6 +191,34 @@ extern const struct hclge_hw_error hclge_ssu_fifo_overflow_int[];
|
||||
extern const struct hclge_hw_error hclge_ssu_ets_tcg_int[];
|
||||
extern const struct hclge_hw_error hclge_ssu_port_based_pf_int[];
|
||||
extern const struct hclge_hw_error hclge_rocee_qmm_ovf_err_int[];
|
||||
+struct hclge_hw_module_id {
|
||||
+ enum hclge_mod_name_list module_id;
|
||||
+ const char *msg;
|
||||
+};
|
||||
+
|
||||
+struct hclge_hw_type_id {
|
||||
+ enum hclge_err_type_list type_id;
|
||||
+ const char *msg;
|
||||
+};
|
||||
+
|
||||
+struct hclge_sum_err_info {
|
||||
+ u8 reset_type;
|
||||
+ u8 mod_num;
|
||||
+ u8 rsv[2];
|
||||
+};
|
||||
+
|
||||
+struct hclge_mod_err_info {
|
||||
+ u8 mod_id;
|
||||
+ u8 err_num;
|
||||
+ u8 rsv[2];
|
||||
+};
|
||||
+
|
||||
+struct hclge_type_reg_err_info {
|
||||
+ u8 type_id;
|
||||
+ u8 reg_num;
|
||||
+ u8 rsv[2];
|
||||
+ u32 hclge_reg[HCLGE_REG_NUM_MAX];
|
||||
+};
|
||||
|
||||
int hclge_config_mac_tnl_int(struct hclge_dev *hdev, bool en);
|
||||
int hclge_config_nic_hw_error(struct hclge_dev *hdev, bool state);
|
||||
@@ -166,4 +232,6 @@ int hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev);
|
||||
void hclge_log_error(struct device *dev, char *reg,
|
||||
const struct hclge_hw_error *err,
|
||||
u32 err_sts, unsigned long *reset_requests);
|
||||
+int hclge_handle_error_info_log(struct hnae3_ae_dev *ae_dev);
|
||||
+int hclge_handle_mac_tnl(struct hclge_dev *hdev);
|
||||
#endif
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index f56cc318e2ad..59d81b0f48c5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -4157,11 +4157,49 @@ static void hclge_reset_subtask(struct hclge_dev *hdev)
|
||||
hdev->reset_type = HNAE3_NONE_RESET;
|
||||
}
|
||||
|
||||
+static void hclge_handle_err_reset_request(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ enum hnae3_reset_type reset_type;
|
||||
+
|
||||
+ if (ae_dev->hw_err_reset_req) {
|
||||
+ reset_type = hclge_get_reset_level(ae_dev,
|
||||
+ &ae_dev->hw_err_reset_req);
|
||||
+ hclge_set_def_reset_request(ae_dev, reset_type);
|
||||
+ }
|
||||
+
|
||||
+ if (hdev->default_reset_request && ae_dev->ops->reset_event)
|
||||
+ ae_dev->ops->reset_event(hdev->pdev, NULL);
|
||||
+
|
||||
+ /* enable interrupt after error handling complete */
|
||||
+ hclge_enable_vector(&hdev->misc_vector, true);
|
||||
+}
|
||||
+
|
||||
+static void hclge_handle_err_recovery(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ u32 mask_val = HCLGE_RAS_REG_NFE_MASK | HCLGE_RAS_REG_ROCEE_ERR_MASK;
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+ u32 msix_src_flag, hw_err_src_flag;
|
||||
+
|
||||
+ msix_src_flag = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS) &
|
||||
+ HCLGE_VECTOR0_REG_MSIX_MASK;
|
||||
+
|
||||
+ hw_err_src_flag = hclge_read_dev(&hdev->hw,
|
||||
+ HCLGE_RAS_PF_OTHER_INT_STS_REG) &
|
||||
+ mask_val;
|
||||
+
|
||||
+ if (msix_src_flag || hw_err_src_flag) {
|
||||
+ hclge_handle_error_info_log(ae_dev);
|
||||
+ hclge_handle_mac_tnl(hdev);
|
||||
+ }
|
||||
+
|
||||
+ hclge_handle_err_reset_request(hdev);
|
||||
+}
|
||||
+
|
||||
static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct device *dev = &hdev->pdev->dev;
|
||||
- enum hnae3_reset_type reset_type;
|
||||
u32 msix_sts_reg;
|
||||
|
||||
msix_sts_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
@@ -4171,17 +4209,10 @@ static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
||||
dev_info(dev, "received msix interrupt 0x%x\n",
|
||||
msix_sts_reg);
|
||||
}
|
||||
- hclge_enable_vector(&hdev->misc_vector, true);
|
||||
|
||||
hclge_handle_hw_ras_error(ae_dev);
|
||||
- if (ae_dev->hw_err_reset_req) {
|
||||
- reset_type = hclge_get_reset_level(ae_dev,
|
||||
- &ae_dev->hw_err_reset_req);
|
||||
- hclge_set_def_reset_request(ae_dev, reset_type);
|
||||
- }
|
||||
|
||||
- if (hdev->default_reset_request && ae_dev->ops->reset_event)
|
||||
- ae_dev->ops->reset_event(hdev->pdev, NULL);
|
||||
+ hclge_handle_err_reset_request(hdev);
|
||||
}
|
||||
|
||||
static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
||||
@@ -4189,7 +4220,10 @@ static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
||||
if (!test_and_clear_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
||||
return;
|
||||
|
||||
- hclge_misc_err_recovery(hdev);
|
||||
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
|
||||
+ hclge_handle_err_recovery(hdev);
|
||||
+ else
|
||||
+ hclge_misc_err_recovery(hdev);
|
||||
}
|
||||
|
||||
static void hclge_reset_service_task(struct hclge_dev *hdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,205 @@
|
||||
From cae1920670d4a53a2baca8fa36a2218583cfa9c0 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:13 +0800
|
||||
Subject: [PATCH 078/283] net: hns3: add support for imp-handle ras capability
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit e65e9f5c2e4efc17657d016d767eb7010d9dd598
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e65e9f5c2e4efc17657d016d767eb7010d9dd598
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
IMP(Intelligent Management Processor) firmware add a new feature to
|
||||
handle and consolidate RAS information for new devices, NIC driver
|
||||
only needs to query the reported RAS information. NIC driver adds
|
||||
support for this feature.
|
||||
|
||||
Driver queries device capability to check whether IMP support this
|
||||
feature, If yes, execute the new RAS processing branch.
|
||||
|
||||
In order to add a method to check whether PF supports imp-handle RAS
|
||||
feature, add dumping this info in debugfs.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 8 +++-
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 46 +++++++++++++++++++
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.h | 5 ++
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 8 ++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 6 +++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
|
||||
6 files changed, 73 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 6a93ea356234..26286e76877c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -64,7 +64,6 @@
|
||||
#define HNAE3_KNIC_CLIENT_INITED_B 0x3
|
||||
#define HNAE3_UNIC_CLIENT_INITED_B 0x4
|
||||
#define HNAE3_ROCE_CLIENT_INITED_B 0x5
|
||||
-#define HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B 0x8
|
||||
#define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\
|
||||
BIT(HNAE3_DEV_SUPPORT_ROCE_B))
|
||||
|
||||
@@ -91,6 +90,10 @@ enum HNAE3_DEV_CAP_BITS {
|
||||
HNAE3_DEV_SUPPORT_STASH_B,
|
||||
HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B,
|
||||
HNAE3_DEV_SUPPORT_PAUSE_B,
|
||||
+ HNAE3_DEV_SUPPORT_RAS_IMP_B,
|
||||
+ HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
|
||||
+ HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B,
|
||||
+ HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B,
|
||||
};
|
||||
|
||||
#define hnae3_dev_fd_supported(hdev) \
|
||||
@@ -129,6 +132,9 @@ enum HNAE3_DEV_CAP_BITS {
|
||||
#define hnae3_dev_phy_imp_supported(hdev) \
|
||||
test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, (hdev)->ae_dev->caps)
|
||||
|
||||
+#define hnae3_dev_ras_imp_supported(hdev) \
|
||||
+ test_bit(HNAE3_DEV_SUPPORT_RAS_IMP_B, (hdev)->ae_dev->caps)
|
||||
+
|
||||
#define hnae3_dev_tqp_txrx_indep_supported(hdev) \
|
||||
test_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, (hdev)->ae_dev->caps)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index 59d9dda8f325..1d86debdc09e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -318,6 +318,52 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
|
||||
+ {
|
||||
+ .name = "support FD",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_FD_B,
|
||||
+ }, {
|
||||
+ .name = "support GRO",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_GRO_B,
|
||||
+ }, {
|
||||
+ .name = "support FEC",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_FEC_B,
|
||||
+ }, {
|
||||
+ .name = "support UDP GSO",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_UDP_GSO_B,
|
||||
+ }, {
|
||||
+ .name = "support PTP",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_PTP_B,
|
||||
+ }, {
|
||||
+ .name = "support INT QL",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_INT_QL_B,
|
||||
+ }, {
|
||||
+ .name = "support HW TX csum",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_HW_TX_CSUM_B,
|
||||
+ }, {
|
||||
+ .name = "support UDP tunnel csum",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B,
|
||||
+ }, {
|
||||
+ .name = "support TX push",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_TX_PUSH_B,
|
||||
+ }, {
|
||||
+ .name = "support imp-controlled PHY",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_PHY_IMP_B,
|
||||
+ }, {
|
||||
+ .name = "support imp-controlled RAS",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_RAS_IMP_B,
|
||||
+ }, {
|
||||
+ .name = "support rxd advanced layout",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
|
||||
+ }, {
|
||||
+ .name = "support port vlan bypass",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B,
|
||||
+ }, {
|
||||
+ .name = "support modify vlan filter state",
|
||||
+ .cap_bit = HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static void hns3_dbg_fill_content(char *content, u16 len,
|
||||
const struct hns3_dbg_item *items,
|
||||
const char **result, u16 size)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
|
||||
index 902e16d99fb7..97578eabb7d8 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
|
||||
@@ -58,4 +58,9 @@ struct hns3_dbg_func {
|
||||
int (*dbg_dump_bd)(struct hns3_dbg_data *data, char *buf, int len);
|
||||
};
|
||||
|
||||
+struct hns3_dbg_cap_info {
|
||||
+ const char *name;
|
||||
+ enum HNAE3_DEV_CAP_BITS cap_bit;
|
||||
+};
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
index e127ca7106b7..26e9d03da720 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
||||
@@ -392,6 +392,14 @@ static void hclge_parse_capability(struct hclge_dev *hdev,
|
||||
set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps);
|
||||
if (hnae3_get_bit(caps, HCLGE_CAP_PHY_IMP_B))
|
||||
set_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_RAS_IMP_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_RAS_IMP_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_RXD_ADV_LAYOUT_B))
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, ae_dev->caps);
|
||||
+ if (hnae3_get_bit(caps, HCLGE_CAP_PORT_VLAN_BYPASS_B)) {
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B, ae_dev->caps);
|
||||
+ set_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps);
|
||||
+ }
|
||||
}
|
||||
|
||||
static enum hclge_cmd_status
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 81b726e557df..022e58235a58 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -388,6 +388,12 @@ enum HCLGE_CAP_BITS {
|
||||
HCLGE_CAP_TQP_TXRX_INDEP_B,
|
||||
HCLGE_CAP_HW_PAD_B,
|
||||
HCLGE_CAP_STASH_B,
|
||||
+ HCLGE_CAP_UDP_TUNNEL_CSUM_B,
|
||||
+ HCLGE_CAP_RAS_IMP_B = 12,
|
||||
+ HCLGE_CAP_FEC_B = 13,
|
||||
+ HCLGE_CAP_PAUSE_B = 14,
|
||||
+ HCLGE_CAP_RXD_ADV_LAYOUT_B = 15,
|
||||
+ HCLGE_CAP_PORT_VLAN_BYPASS_B = 17,
|
||||
};
|
||||
|
||||
#define HCLGE_QUERY_CAP_LENGTH 3
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 59d81b0f48c5..46a3bc0a9df3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -4220,7 +4220,7 @@ static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
||||
if (!test_and_clear_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
||||
return;
|
||||
|
||||
- if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
|
||||
+ if (hnae3_dev_ras_imp_supported(hdev))
|
||||
hclge_handle_err_recovery(hdev);
|
||||
else
|
||||
hclge_misc_err_recovery(hdev);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,191 @@
|
||||
From 20e92bdb92a37e27ce6c102a5338ded5a4962780 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:14 +0800
|
||||
Subject: [PATCH 079/283] net: hns3: update error recovery module and type
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 8a95e360fd512f1cb55239645879b15d26bc7e21
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a95e360fd512f1cb55239645879b15d26bc7e21
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Update error recovery module and type for RoCE.
|
||||
|
||||
The enumeration values of module names and error types are not sorted
|
||||
in sequence. If use the current printing mode, they cannot be correctly
|
||||
printed.
|
||||
|
||||
Use the index mode, If mod_id and type_id match the enumerated value,
|
||||
display the corresponding information.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Weihang Li <liweihang@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.c | 58 ++++++++++++++++++-
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.h | 18 ++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 3 +-
|
||||
3 files changed, 74 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index cf4afddad526..b303cf2d72bf 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -677,6 +677,36 @@ static const struct hclge_hw_module_id hclge_hw_module_id_st[] = {
|
||||
}, {
|
||||
.module_id = MODULE_MASTER,
|
||||
.msg = "MODULE_MASTER"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_TOP,
|
||||
+ .msg = "MODULE_ROCEE_TOP"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_TIMER,
|
||||
+ .msg = "MODULE_ROCEE_TIMER"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_MDB,
|
||||
+ .msg = "MODULE_ROCEE_MDB"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_TSP,
|
||||
+ .msg = "MODULE_ROCEE_TSP"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_TRP,
|
||||
+ .msg = "MODULE_ROCEE_TRP"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_SCC,
|
||||
+ .msg = "MODULE_ROCEE_SCC"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_CAEP,
|
||||
+ .msg = "MODULE_ROCEE_CAEP"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_GEN_AC,
|
||||
+ .msg = "MODULE_ROCEE_GEN_AC"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_QMM,
|
||||
+ .msg = "MODULE_ROCEE_QMM"
|
||||
+ }, {
|
||||
+ .module_id = MODULE_ROCEE_LSAN,
|
||||
+ .msg = "MODULE_ROCEE_LSAN"
|
||||
}
|
||||
};
|
||||
|
||||
@@ -720,6 +750,12 @@ static const struct hclge_hw_type_id hclge_hw_type_id_st[] = {
|
||||
}, {
|
||||
.type_id = GLB_ERROR,
|
||||
.msg = "glb_error"
|
||||
+ }, {
|
||||
+ .type_id = ROCEE_NORMAL_ERR,
|
||||
+ .msg = "rocee_normal_error"
|
||||
+ }, {
|
||||
+ .type_id = ROCEE_OVF_ERR,
|
||||
+ .msg = "rocee_ovf_error"
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2128,6 +2164,8 @@ hclge_handle_error_type_reg_log(struct device *dev,
|
||||
#define HCLGE_ERR_TYPE_IS_RAS_OFFSET 7
|
||||
|
||||
u8 mod_id, total_module, type_id, total_type, i, is_ras;
|
||||
+ u8 index_module = MODULE_NONE;
|
||||
+ u8 index_type = NONE_ERROR;
|
||||
|
||||
mod_id = mod_info->mod_id;
|
||||
type_id = type_reg_info->type_id & HCLGE_ERR_TYPE_MASK;
|
||||
@@ -2136,11 +2174,25 @@ hclge_handle_error_type_reg_log(struct device *dev,
|
||||
total_module = ARRAY_SIZE(hclge_hw_module_id_st);
|
||||
total_type = ARRAY_SIZE(hclge_hw_type_id_st);
|
||||
|
||||
- if (mod_id < total_module && type_id < total_type)
|
||||
+ for (i = 0; i < total_module; i++) {
|
||||
+ if (mod_id == hclge_hw_module_id_st[i].module_id) {
|
||||
+ index_module = i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < total_type; i++) {
|
||||
+ if (type_id == hclge_hw_type_id_st[i].type_id) {
|
||||
+ index_type = i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (index_module != MODULE_NONE && index_type != NONE_ERROR)
|
||||
dev_err(dev,
|
||||
"found %s %s, is %s error.\n",
|
||||
- hclge_hw_module_id_st[mod_id].msg,
|
||||
- hclge_hw_type_id_st[type_id].msg,
|
||||
+ hclge_hw_module_id_st[index_module].msg,
|
||||
+ hclge_hw_type_id_st[index_type].msg,
|
||||
is_ras ? "ras" : "msix");
|
||||
else
|
||||
dev_err(dev,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
index 6cc225a5cfbe..aa9bd5a5e7dd 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
@@ -18,6 +18,8 @@
|
||||
BIT(HCLGE_VECTOR0_IMP_CMDQ_ERR_B)
|
||||
#define HCLGE_RAS_REG_NFE_MASK 0xFF00
|
||||
#define HCLGE_RAS_REG_ROCEE_ERR_MASK 0x3000000
|
||||
+#define HCLGE_RAS_REG_ERR_MASK \
|
||||
+ (HCLGE_RAS_REG_NFE_MASK | HCLGE_RAS_REG_ROCEE_ERR_MASK)
|
||||
|
||||
#define HCLGE_VECTOR0_REG_MSIX_MASK 0x1FF00
|
||||
|
||||
@@ -137,6 +139,18 @@ enum hclge_mod_name_list {
|
||||
MODULE_RCB_TX = 12,
|
||||
MODULE_TXDMA = 13,
|
||||
MODULE_MASTER = 14,
|
||||
+ /* add new MODULE NAME for NIC here in order */
|
||||
+ MODULE_ROCEE_TOP = 40,
|
||||
+ MODULE_ROCEE_TIMER = 41,
|
||||
+ MODULE_ROCEE_MDB = 42,
|
||||
+ MODULE_ROCEE_TSP = 43,
|
||||
+ MODULE_ROCEE_TRP = 44,
|
||||
+ MODULE_ROCEE_SCC = 45,
|
||||
+ MODULE_ROCEE_CAEP = 46,
|
||||
+ MODULE_ROCEE_GEN_AC = 47,
|
||||
+ MODULE_ROCEE_QMM = 48,
|
||||
+ MODULE_ROCEE_LSAN = 49,
|
||||
+ /* add new MODULE NAME for RoCEE here in order */
|
||||
};
|
||||
|
||||
enum hclge_err_type_list {
|
||||
@@ -153,6 +167,10 @@ enum hclge_err_type_list {
|
||||
ETS_ERROR = 10,
|
||||
NCSI_ERROR = 11,
|
||||
GLB_ERROR = 12,
|
||||
+ /* add new ERROR TYPE for NIC here in order */
|
||||
+ ROCEE_NORMAL_ERR = 40,
|
||||
+ ROCEE_OVF_ERR = 41,
|
||||
+ /* add new ERROR TYPE for ROCEE here in order */
|
||||
};
|
||||
|
||||
struct hclge_hw_blk {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 46a3bc0a9df3..b7e3b4e399c9 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3256,8 +3256,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
|
||||
/* check for vector0 msix event and hardware error event source */
|
||||
if (msix_src_reg & HCLGE_VECTOR0_REG_MSIX_MASK ||
|
||||
- hw_err_src_reg & HCLGE_RAS_REG_NFE_MASK ||
|
||||
- hw_err_src_reg & HCLGE_RAS_REG_ROCEE_ERR_MASK)
|
||||
+ hw_err_src_reg & HCLGE_RAS_REG_ERR_MASK)
|
||||
return HCLGE_VECTOR0_EVENT_ERR;
|
||||
|
||||
/* check for vector0 mailbox(=CMDQ RX) event source */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,134 @@
|
||||
From a396cef35ddf1a20786e8bd5e08396af11906316 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:15 +0800
|
||||
Subject: [PATCH 080/283] net: hns3: add error handling compatibility during
|
||||
initialization
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 1c360a4a077fc0f74a350fe2ef267cbe8a9388e3
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1c360a4a077fc0f74a350fe2ef267cbe8a9388e3
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
During initialization, the driver logs and clears the hw errors that
|
||||
already occurred. For device supports imp-handle ras capability, it
|
||||
needs handle different error status, otherwise it may cause wrong reset.
|
||||
|
||||
So fix it by adding a new processing branch.
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.c | 22 +++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_err.h | 2 ++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 21 +++++++++---------
|
||||
3 files changed, 34 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index b303cf2d72bf..a4e9aa9c5d6f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -2155,6 +2155,28 @@ void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
|
||||
kfree(desc);
|
||||
}
|
||||
|
||||
+bool hclge_find_error_source(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ u32 msix_src_flag, hw_err_src_flag;
|
||||
+
|
||||
+ msix_src_flag = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS) &
|
||||
+ HCLGE_VECTOR0_REG_MSIX_MASK;
|
||||
+
|
||||
+ hw_err_src_flag = hclge_read_dev(&hdev->hw,
|
||||
+ HCLGE_RAS_PF_OTHER_INT_STS_REG) &
|
||||
+ HCLGE_RAS_REG_ERR_MASK;
|
||||
+
|
||||
+ return msix_src_flag || hw_err_src_flag;
|
||||
+}
|
||||
+
|
||||
+void hclge_handle_occurred_error(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
+
|
||||
+ if (hclge_find_error_source(hdev))
|
||||
+ hclge_handle_error_info_log(ae_dev);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
hclge_handle_error_type_reg_log(struct device *dev,
|
||||
struct hclge_mod_err_info *mod_info,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
index aa9bd5a5e7dd..a53781491473 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h
|
||||
@@ -242,6 +242,8 @@ int hclge_config_mac_tnl_int(struct hclge_dev *hdev, bool en);
|
||||
int hclge_config_nic_hw_error(struct hclge_dev *hdev, bool state);
|
||||
int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en);
|
||||
void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev);
|
||||
+bool hclge_find_error_source(struct hclge_dev *hdev);
|
||||
+void hclge_handle_occurred_error(struct hclge_dev *hdev);
|
||||
pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev);
|
||||
int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
|
||||
unsigned long *reset_requests);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index b7e3b4e399c9..f81c6f8bb030 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -4176,18 +4176,11 @@ static void hclge_handle_err_reset_request(struct hclge_dev *hdev)
|
||||
|
||||
static void hclge_handle_err_recovery(struct hclge_dev *hdev)
|
||||
{
|
||||
- u32 mask_val = HCLGE_RAS_REG_NFE_MASK | HCLGE_RAS_REG_ROCEE_ERR_MASK;
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
- u32 msix_src_flag, hw_err_src_flag;
|
||||
|
||||
- msix_src_flag = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS) &
|
||||
- HCLGE_VECTOR0_REG_MSIX_MASK;
|
||||
+ ae_dev->hw_err_reset_req = 0;
|
||||
|
||||
- hw_err_src_flag = hclge_read_dev(&hdev->hw,
|
||||
- HCLGE_RAS_PF_OTHER_INT_STS_REG) &
|
||||
- mask_val;
|
||||
-
|
||||
- if (msix_src_flag || hw_err_src_flag) {
|
||||
+ if (hclge_find_error_source(hdev)) {
|
||||
hclge_handle_error_info_log(ae_dev);
|
||||
hclge_handle_mac_tnl(hdev);
|
||||
}
|
||||
@@ -10734,7 +10727,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
hclge_clear_resetting_state(hdev);
|
||||
|
||||
/* Log and clear the hw errors those already occurred */
|
||||
- hclge_handle_all_hns_hw_errors(ae_dev);
|
||||
+ if (hnae3_dev_ras_imp_supported(hdev))
|
||||
+ hclge_handle_occurred_error(hdev);
|
||||
+ else
|
||||
+ hclge_handle_all_hns_hw_errors(ae_dev);
|
||||
|
||||
/* request delayed reset for the error recovery because an immediate
|
||||
* global reset on a PF affecting pending initialization of other PFs
|
||||
@@ -11088,7 +11084,10 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &hdev->state);
|
||||
|
||||
/* Log and clear the hw errors those already occurred */
|
||||
- hclge_handle_all_hns_hw_errors(ae_dev);
|
||||
+ if (hnae3_dev_ras_imp_supported(hdev))
|
||||
+ hclge_handle_occurred_error(hdev);
|
||||
+ else
|
||||
+ hclge_handle_all_hns_hw_errors(ae_dev);
|
||||
|
||||
/* Re-enable the hw error interrupts because
|
||||
* the interrupts get disabled on global reset.
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,67 @@
|
||||
From abf30a8ed22d235661b84b3c7fbfc3f9beabbfca Mon Sep 17 00:00:00 2001
|
||||
From: Baokun Li <libaokun1@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:16 +0800
|
||||
Subject: [PATCH 081/283] net: hns3: use list_move_tail instead of
|
||||
list_del/list_add_tail in hclgevf_main.c
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 49768ce98c2c1766619dfd6d157dd87826738fa7
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=49768ce98c2c1766619dfd6d157dd87826738fa7
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Using list_move_tail() instead of list_del() + list_add_tail() in hclgevf_main.c.
|
||||
|
||||
Reported-by: Hulk Robot <hulkci@huawei.com>
|
||||
Signed-off-by: Baokun Li <libaokun1@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 9 +++------
|
||||
1 file changed, 3 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index b9a1b8032c5c..74d2aef34315 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -1515,8 +1515,7 @@ static void hclgevf_sync_from_add_list(struct list_head *add_list,
|
||||
kfree(mac_node);
|
||||
} else if (mac_node->state == HCLGEVF_MAC_ACTIVE) {
|
||||
mac_node->state = HCLGEVF_MAC_TO_DEL;
|
||||
- list_del(&mac_node->node);
|
||||
- list_add_tail(&mac_node->node, mac_list);
|
||||
+ list_move_tail(&mac_node->node, mac_list);
|
||||
} else {
|
||||
list_del(&mac_node->node);
|
||||
kfree(mac_node);
|
||||
@@ -1541,8 +1540,7 @@ static void hclgevf_sync_from_del_list(struct list_head *del_list,
|
||||
list_del(&mac_node->node);
|
||||
kfree(mac_node);
|
||||
} else {
|
||||
- list_del(&mac_node->node);
|
||||
- list_add_tail(&mac_node->node, mac_list);
|
||||
+ list_move_tail(&mac_node->node, mac_list);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1578,8 +1576,7 @@ static void hclgevf_sync_mac_list(struct hclgevf_dev *hdev,
|
||||
list_for_each_entry_safe(mac_node, tmp, list, node) {
|
||||
switch (mac_node->state) {
|
||||
case HCLGEVF_MAC_TO_DEL:
|
||||
- list_del(&mac_node->node);
|
||||
- list_add_tail(&mac_node->node, &tmp_del_list);
|
||||
+ list_move_tail(&mac_node->node, &tmp_del_list);
|
||||
break;
|
||||
case HCLGEVF_MAC_TO_ADD:
|
||||
new_node = kzalloc(sizeof(*new_node), GFP_ATOMIC);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,697 @@
|
||||
From c1ae2604ddee1c0aab234155abcf65a3ca50ab62 Mon Sep 17 00:00:00 2001
|
||||
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:44:31 +0800
|
||||
Subject: [PATCH 082/283] net: hns3: refactor dev capability and dev spec of
|
||||
debugfs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit c929bc2ac36efa9344e6c8b8f55f6b8eeebb4393
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c929bc2ac36efa9344e6c8b8f55f6b8eeebb4393
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, the debugfs command for dev capability and dev spec
|
||||
are implemented by "echo xxxx > cmd", and record the information
|
||||
in dmesg. It's unnecessary and heavy. To improve it, create a
|
||||
single file "dev_info" for them, and query them by command
|
||||
"cat dev_info", return the result to userspace, rather than
|
||||
record in dmesg.
|
||||
|
||||
The display style is below:
|
||||
$cat dev_info
|
||||
dev capability:
|
||||
support FD: yes
|
||||
support GRO: yes
|
||||
support FEC: yes
|
||||
support UDP GSO: no
|
||||
support PTP: no
|
||||
support INT QL: no
|
||||
support HW TX csum: no
|
||||
support UDP tunnel csum: no
|
||||
support TX push: no
|
||||
support imp-controlled PHY: no
|
||||
support rxd advanced layout: no
|
||||
|
||||
dev spec:
|
||||
MAC entry num: 0
|
||||
MNG entry num: 0
|
||||
MAX non tso bd num: 8
|
||||
RSS ind tbl size: 512
|
||||
RSS key size: 40
|
||||
RSS size: 1
|
||||
Allocated RSS size: 0
|
||||
Task queue pairs numbers: 1
|
||||
RX buffer length: 2048
|
||||
Desc num per TX queue: 1024
|
||||
Desc num per RX queue: 1024
|
||||
Total number of enabled TCs: 1
|
||||
MAX INT QL: 0
|
||||
MAX INT GL: 8160
|
||||
MAX TM RATE: 100000
|
||||
MAX QSET number: 1024
|
||||
|
||||
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 11 +++
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 92 +++++++++++++++++--
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 1 -
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 14 +--
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 3 +-
|
||||
.../hisilicon/hns3/hns3pf/hclge_debugfs.c | 70 +++++++-------
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 8 ++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 2 +
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 27 +++---
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 2 +
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 8 ++
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 4 +
|
||||
12 files changed, 180 insertions(+), 62 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 26286e76877c..6b2969e1346a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -255,6 +255,7 @@ enum hnae3_port_base_vlan_state {
|
||||
};
|
||||
|
||||
enum hnae3_dbg_cmd {
|
||||
+ HNAE3_DBG_CMD_TM_NODES,
|
||||
HNAE3_DBG_CMD_TM_PRI,
|
||||
HNAE3_DBG_CMD_TM_QSET,
|
||||
HNAE3_DBG_CMD_TM_MAP,
|
||||
@@ -263,7 +264,9 @@ enum hnae3_dbg_cmd {
|
||||
HNAE3_DBG_CMD_TC_SCH_INFO,
|
||||
HNAE3_DBG_CMD_QOS_PAUSE_CFG,
|
||||
HNAE3_DBG_CMD_QOS_PRI_MAP,
|
||||
+ HNAE3_DBG_CMD_QOS_DSCP_MAP,
|
||||
HNAE3_DBG_CMD_QOS_BUF_CFG,
|
||||
+ HNAE3_DBG_CMD_DEV_INFO,
|
||||
HNAE3_DBG_CMD_TX_BD,
|
||||
HNAE3_DBG_CMD_RX_BD,
|
||||
HNAE3_DBG_CMD_MAC_UC,
|
||||
@@ -271,6 +274,7 @@ enum hnae3_dbg_cmd {
|
||||
HNAE3_DBG_CMD_MAC_TBL,
|
||||
HNAE3_DBG_CMD_MNG_TBL,
|
||||
HNAE3_DBG_CMD_LOOPBACK,
|
||||
+ HNAE3_DBG_CMD_PTP_INFO,
|
||||
HNAE3_DBG_CMD_INTERRUPT_INFO,
|
||||
HNAE3_DBG_CMD_RESET_INFO,
|
||||
HNAE3_DBG_CMD_IMP_INFO,
|
||||
@@ -291,9 +295,13 @@ enum hnae3_dbg_cmd {
|
||||
HNAE3_DBG_CMD_RX_QUEUE_INFO,
|
||||
HNAE3_DBG_CMD_TX_QUEUE_INFO,
|
||||
HNAE3_DBG_CMD_FD_TCAM,
|
||||
+ HNAE3_DBG_CMD_FD_COUNTER,
|
||||
HNAE3_DBG_CMD_MAC_TNL_STATUS,
|
||||
HNAE3_DBG_CMD_SERV_INFO,
|
||||
HNAE3_DBG_CMD_UMV_INFO,
|
||||
+ HNAE3_DBG_CMD_PAGE_POOL_INFO,
|
||||
+ HNAE3_DBG_CMD_COAL_INFO,
|
||||
+ HNAE3_DBG_CMD_WOL_INFO,
|
||||
HNAE3_DBG_CMD_UNKNOWN,
|
||||
};
|
||||
|
||||
@@ -333,10 +341,13 @@ struct hnae3_ring_chain_node {
|
||||
struct hnae3_dev_specs {
|
||||
u32 mac_entry_num; /* number of mac-vlan table entry */
|
||||
u32 mng_entry_num; /* number of manager table entry */
|
||||
+ u32 max_tm_rate;
|
||||
u16 rss_ind_tbl_size;
|
||||
u16 rss_key_size;
|
||||
u16 int_ql_max; /* max value of interrupt coalesce based on INT_QL */
|
||||
+ u16 max_int_gl; /* max value of interrupt coalesce based on INT_GL */
|
||||
u8 max_non_tso_bd_num; /* max BD number of one non-TSO packet */
|
||||
+ u16 max_qset_num;
|
||||
};
|
||||
|
||||
struct hnae3_client_ops {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index 1d86debdc09e..ad7015b3ec80 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -134,13 +134,6 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
|
||||
.buf_len = HNS3_DBG_READ_LEN,
|
||||
.init = hns3_dbg_common_file_init,
|
||||
},
|
||||
- {
|
||||
- .name = "mac_tbl",
|
||||
- .cmd = HNAE3_DBG_CMD_MAC_TBL,
|
||||
- .dentry = HNS3_DBG_DENTRY_COMMON,
|
||||
- .buf_len = HNS3_DBG_READ_LEN_1MB,
|
||||
- .init = hns3_dbg_common_file_init,
|
||||
- },
|
||||
{
|
||||
.name = "mng_tbl",
|
||||
.cmd = HNAE3_DBG_CMD_MNG_TBL,
|
||||
@@ -316,6 +309,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
|
||||
.buf_len = HNS3_DBG_READ_LEN,
|
||||
.init = hns3_dbg_common_file_init,
|
||||
},
|
||||
+ {
|
||||
+ .name = "dev_info",
|
||||
+ .cmd = HNAE3_DBG_CMD_DEV_INFO,
|
||||
+ .dentry = HNS3_DBG_DENTRY_COMMON,
|
||||
+ .buf_len = HNS3_DBG_READ_LEN,
|
||||
+ .init = hns3_dbg_common_file_init,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
|
||||
@@ -659,6 +659,80 @@ static void hns3_dump_rx_bd_info(struct hns3_nic_priv *priv,
|
||||
sprintf(result[j++], "NA");
|
||||
}
|
||||
|
||||
+static void
|
||||
+hns3_dbg_dev_caps(struct hnae3_handle *h, char *buf, int len, int *pos)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
+ static const char * const str[] = {"no", "yes"};
|
||||
+ unsigned long *caps = ae_dev->caps;
|
||||
+ u32 i, state;
|
||||
+
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "dev capability:\n");
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(hns3_dbg_cap); i++) {
|
||||
+ state = test_bit(hns3_dbg_cap[i].cap_bit, caps);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "%s: %s\n",
|
||||
+ hns3_dbg_cap[i].name, str[state]);
|
||||
+ }
|
||||
+
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "\n");
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+hns3_dbg_dev_specs(struct hnae3_handle *h, char *buf, int len, int *pos)
|
||||
+{
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
+ struct hnae3_dev_specs *dev_specs = &ae_dev->dev_specs;
|
||||
+ struct hnae3_knic_private_info *kinfo = &h->kinfo;
|
||||
+
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "dev_spec:\n");
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAC entry num: %u\n",
|
||||
+ dev_specs->mac_entry_num);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MNG entry num: %u\n",
|
||||
+ dev_specs->mng_entry_num);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAX non tso bd num: %u\n",
|
||||
+ dev_specs->max_non_tso_bd_num);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "RSS ind tbl size: %u\n",
|
||||
+ dev_specs->rss_ind_tbl_size);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "RSS key size: %u\n",
|
||||
+ dev_specs->rss_key_size);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "RSS size: %u\n",
|
||||
+ kinfo->rss_size);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "Allocated RSS size: %u\n",
|
||||
+ kinfo->req_rss_size);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos,
|
||||
+ "Task queue pairs numbers: %u\n",
|
||||
+ kinfo->num_tqps);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "RX buffer length: %u\n",
|
||||
+ kinfo->rx_buf_len);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "Desc num per TX queue: %u\n",
|
||||
+ kinfo->num_tx_desc);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "Desc num per RX queue: %u\n",
|
||||
+ kinfo->num_rx_desc);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos,
|
||||
+ "Total number of enabled TCs: %u\n",
|
||||
+ kinfo->tc_info.num_tc);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAX INT QL: %u\n",
|
||||
+ dev_specs->int_ql_max);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAX INT GL: %u\n",
|
||||
+ dev_specs->max_int_gl);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAX TM RATE: %u\n",
|
||||
+ dev_specs->max_tm_rate);
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "MAX QSET number: %u\n",
|
||||
+ dev_specs->max_qset_num);
|
||||
+}
|
||||
+
|
||||
+static int hns3_dbg_dev_info(struct hnae3_handle *h, char *buf, int len)
|
||||
+{
|
||||
+ int pos = 0;
|
||||
+
|
||||
+ hns3_dbg_dev_caps(h, buf, len, &pos);
|
||||
+
|
||||
+ hns3_dbg_dev_specs(h, buf, len, &pos);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int hns3_dbg_rx_bd_info(struct hns3_dbg_data *d, char *buf, int len)
|
||||
{
|
||||
char data_str[ARRAY_SIZE(rx_bd_info_items)][HNS3_DBG_DATA_STR_LEN];
|
||||
@@ -810,6 +884,10 @@ static const struct hns3_dbg_func hns3_dbg_cmd_func[] = {
|
||||
.cmd = HNAE3_DBG_CMD_TX_QUEUE_INFO,
|
||||
.dbg_dump = hns3_dbg_tx_queue_info,
|
||||
},
|
||||
+ {
|
||||
+ .cmd = HNAE3_DBG_CMD_DEV_INFO,
|
||||
+ .dbg_dump = hns3_dbg_dev_info,
|
||||
+ },
|
||||
};
|
||||
|
||||
static int hns3_dbg_read_cmd(struct hns3_dbg_data *dbg_data,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index c2b465415e8c..85002d1c1fb7 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -440,7 +440,6 @@ enum hns3_flow_level_range {
|
||||
HNS3_FLOW_ULTRA = 3,
|
||||
};
|
||||
|
||||
-#define HNS3_INT_GL_MAX 0x1FE0
|
||||
#define HNS3_INT_GL_50K 0x0014
|
||||
#define HNS3_INT_GL_20K 0x0032
|
||||
#define HNS3_INT_GL_18K 0x0036
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 4d982cb80f8b..ea26a3fce66b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -1141,19 +1141,21 @@ static int hns3_get_coalesce(struct net_device *netdev,
|
||||
static int hns3_check_gl_coalesce_para(struct net_device *netdev,
|
||||
struct ethtool_coalesce *cmd)
|
||||
{
|
||||
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
u32 rx_gl, tx_gl;
|
||||
|
||||
- if (cmd->rx_coalesce_usecs > HNS3_INT_GL_MAX) {
|
||||
+ if (cmd->rx_coalesce_usecs > ae_dev->dev_specs.max_int_gl) {
|
||||
netdev_err(netdev,
|
||||
- "Invalid rx-usecs value, rx-usecs range is 0-%d\n",
|
||||
- HNS3_INT_GL_MAX);
|
||||
+ "invalid rx-usecs value, rx-usecs range is 0-%u\n",
|
||||
+ ae_dev->dev_specs.max_int_gl);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if (cmd->tx_coalesce_usecs > HNS3_INT_GL_MAX) {
|
||||
+ if (cmd->tx_coalesce_usecs > ae_dev->dev_specs.max_int_gl) {
|
||||
netdev_err(netdev,
|
||||
- "Invalid tx-usecs value, tx-usecs range is 0-%d\n",
|
||||
- HNS3_INT_GL_MAX);
|
||||
+ "invalid tx-usecs value, tx-usecs range is 0-%u\n",
|
||||
+ ae_dev->dev_specs.max_int_gl);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 022e58235a58..d28546b5af0b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -1148,7 +1148,8 @@ struct hclge_dev_specs_0_cmd {
|
||||
__le16 rss_key_size;
|
||||
__le16 int_ql_max;
|
||||
u8 max_non_tso_bd_num;
|
||||
- u8 rsv1[5];
|
||||
+ u8 rsv1;
|
||||
+ __le32 max_tm_rate;
|
||||
};
|
||||
|
||||
#define HCLGE_DEF_MAX_INT_GL 0x1FE0U
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
index c65abb2c2b09..0517dedae55f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
@@ -1324,16 +1324,16 @@ static int hclge_dbg_dump_mac_table(struct hclge_dev *hdev, char *buf, int len)
|
||||
int j;
|
||||
|
||||
mc_tbl_len = sizeof(struct hclge_mac_vlan_idx_rd_mc) *
|
||||
- HCLGE_DBG_MAC_TBL_MAX;
|
||||
+ HCLGE_DBG_MAC_TBL_MAX;
|
||||
mc_mac_tbl = kzalloc(mc_tbl_len, GFP_KERNEL);
|
||||
if (!mc_mac_tbl)
|
||||
return -ENOMEM;
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos, "Unicast tab:\n");
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- " index mac_addr vlan_id VMDq1 ");
|
||||
+ " index mac_addr vlan_id VMDq1 ");
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- "U_M mac_en in_port E_type E_Port\n");
|
||||
+ "U_M mac_en in_port E_type E_Port\n");
|
||||
|
||||
mc_tbl_idx = 0;
|
||||
for (i = 0; i < HCLGE_DBG_MAC_TBL_MAX; i++) {
|
||||
@@ -1342,13 +1342,13 @@ static int hclge_dbg_dump_mac_table(struct hclge_dev *hdev, char *buf, int len)
|
||||
msleep(HCLGE_DBG_PAUSE_TIME);
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_PPP_MAC_VLAN_IDX_RD,
|
||||
- true);
|
||||
+ true);
|
||||
desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
hclge_cmd_setup_basic_desc(&desc[1], HCLGE_PPP_MAC_VLAN_IDX_RD,
|
||||
- true);
|
||||
+ true);
|
||||
desc[1].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
|
||||
hclge_cmd_setup_basic_desc(&desc[2], HCLGE_PPP_MAC_VLAN_IDX_RD,
|
||||
- true);
|
||||
+ true);
|
||||
|
||||
mac_rd_cmd = (struct hclge_mac_vlan_idx_rd_cmd *)desc[0].data;
|
||||
|
||||
@@ -1356,7 +1356,7 @@ static int hclge_dbg_dump_mac_table(struct hclge_dev *hdev, char *buf, int len)
|
||||
ret = hclge_cmd_send(&hdev->hw, desc, 3);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "failed to dump mac table, ret = %d\n", ret);
|
||||
+ "failed to dump mac table, ret = %d\n", ret);
|
||||
kfree(mc_mac_tbl);
|
||||
return ret;
|
||||
}
|
||||
@@ -1367,58 +1367,58 @@ static int hclge_dbg_dump_mac_table(struct hclge_dev *hdev, char *buf, int len)
|
||||
if (mac_rd_cmd->entry_type == HCLGE_DBG_MAC_MC_TBL) {
|
||||
mc_mac_tbl[mc_tbl_idx].index = i;
|
||||
memcpy(mc_mac_tbl[mc_tbl_idx].mac_addr,
|
||||
- mac_rd_cmd->mac_addr, ETH_ALEN);
|
||||
+ mac_rd_cmd->mac_addr, ETH_ALEN);
|
||||
memcpy(mc_mac_tbl[mc_tbl_idx].mg_vf_mb,
|
||||
- desc[1].data, 24);
|
||||
+ desc[1].data, 24);
|
||||
memcpy(&mc_mac_tbl[mc_tbl_idx].mg_vf_mb[24],
|
||||
- desc[2].data, 8);
|
||||
+ desc[2].data, 8);
|
||||
mc_tbl_idx++;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos, " %04u %pM ",
|
||||
- i, mac_rd_cmd->mac_addr);
|
||||
+ i, mac_rd_cmd->mac_addr);
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- " %04u %u %u %u %u ",
|
||||
- le16_to_cpu(mac_rd_cmd->vlan_tag),
|
||||
- mac_rd_cmd->entry_type &
|
||||
- HCLGE_DBG_MAC_TBL_EN_TYPE,
|
||||
- mac_rd_cmd->entry_type &
|
||||
- HCLGE_DBG_MAC_TBL_MC_TYPE,
|
||||
- mac_rd_cmd->mc_mac_en &
|
||||
- HCLGE_DBG_MAC_TBL_MAC_EN,
|
||||
- le16_to_cpu(mac_rd_cmd->port) &
|
||||
- HCLGE_DBG_MAC_TBL_IN_PORT);
|
||||
+ " %04u %u %u %u %u ",
|
||||
+ le16_to_cpu(mac_rd_cmd->vlan_tag),
|
||||
+ mac_rd_cmd->entry_type &
|
||||
+ HCLGE_DBG_MAC_TBL_EN_TYPE,
|
||||
+ mac_rd_cmd->entry_type &
|
||||
+ HCLGE_DBG_MAC_TBL_MC_TYPE,
|
||||
+ mac_rd_cmd->mc_mac_en &
|
||||
+ HCLGE_DBG_MAC_TBL_MAC_EN,
|
||||
+ le16_to_cpu(mac_rd_cmd->port) &
|
||||
+ HCLGE_DBG_MAC_TBL_IN_PORT);
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- "%lu %04x\n",
|
||||
- le16_to_cpu(mac_rd_cmd->egress_port) &
|
||||
- HCLGE_DBG_MAC_TBL_E_PORT_B,
|
||||
- le16_to_cpu(mac_rd_cmd->egress_port) &
|
||||
- HCLGE_DBG_MAC_TBL_E_PORT);
|
||||
+ "%lu %04x\n",
|
||||
+ le16_to_cpu(mac_rd_cmd->egress_port) &
|
||||
+ HCLGE_DBG_MAC_TBL_E_PORT_B,
|
||||
+ le16_to_cpu(mac_rd_cmd->egress_port) &
|
||||
+ HCLGE_DBG_MAC_TBL_E_PORT);
|
||||
}
|
||||
|
||||
if (mc_tbl_idx > 0) {
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- "Multicast tab: entry number = %u\n",
|
||||
- mc_tbl_idx);
|
||||
+ "Multicast tab: entry number = %u\n",
|
||||
+ mc_tbl_idx);
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- " index mac_addr UM_MC_RDATA\n");
|
||||
+ " index mac_addr UM_MC_RDATA\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < mc_tbl_idx; i++) {
|
||||
pos += scnprintf(buf + pos, len - pos, " %04u %pM ",
|
||||
- mc_mac_tbl[i].index, mc_mac_tbl[i].mac_addr);
|
||||
+ mc_mac_tbl[i].index, mc_mac_tbl[i].mac_addr);
|
||||
|
||||
for (j = 31; j >= 3; j -= 4)
|
||||
pos += scnprintf(buf + pos, len - pos,
|
||||
- "%02x%02x%02x%02x ",
|
||||
- mc_mac_tbl[i].mg_vf_mb[j],
|
||||
- mc_mac_tbl[i].mg_vf_mb[j - 1],
|
||||
- mc_mac_tbl[i].mg_vf_mb[j - 2],
|
||||
- mc_mac_tbl[i].mg_vf_mb[j - 3]);
|
||||
+ "%02x%02x%02x%02x ",
|
||||
+ mc_mac_tbl[i].mg_vf_mb[j],
|
||||
+ mc_mac_tbl[i].mg_vf_mb[j - 1],
|
||||
+ mc_mac_tbl[i].mg_vf_mb[j - 2],
|
||||
+ mc_mac_tbl[i].mg_vf_mb[j - 3]);
|
||||
|
||||
pos += scnprintf(buf + pos, len - pos, "\n");
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index f81c6f8bb030..358d41ab9bfc 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1360,6 +1360,9 @@ static void hclge_set_default_dev_specs(struct hclge_dev *hdev)
|
||||
ae_dev->dev_specs.max_non_tso_bd_num = HCLGE_MAX_NON_TSO_BD_NUM;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size = HCLGE_RSS_IND_TBL_SIZE;
|
||||
ae_dev->dev_specs.rss_key_size = HCLGE_RSS_KEY_SIZE;
|
||||
+ ae_dev->dev_specs.max_qset_num = HCLGE_MAX_QSET_NUM;
|
||||
+ ae_dev->dev_specs.max_tm_rate = HCLGE_ETHER_MAX_RATE;
|
||||
+ ae_dev->dev_specs.max_int_gl = HCLGE_DEF_MAX_INT_GL;
|
||||
}
|
||||
|
||||
static void hclge_parse_dev_specs(struct hclge_dev *hdev,
|
||||
@@ -1367,14 +1370,19 @@ static void hclge_parse_dev_specs(struct hclge_dev *hdev,
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclge_dev_specs_0_cmd *req0;
|
||||
+ struct hclge_dev_specs_1_cmd *req1;
|
||||
|
||||
req0 = (struct hclge_dev_specs_0_cmd *)desc[0].data;
|
||||
+ req1 = (struct hclge_dev_specs_1_cmd *)desc[1].data;
|
||||
|
||||
ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
+ ae_dev->dev_specs.max_qset_num = le16_to_cpu(req1->max_qset_num);
|
||||
ae_dev->dev_specs.int_ql_max = le16_to_cpu(req0->int_ql_max);
|
||||
ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
+ ae_dev->dev_specs.max_tm_rate = le32_to_cpu(req0->max_tm_rate);
|
||||
+ ae_dev->dev_specs.max_int_gl = le16_to_cpu(req1->max_int_gl);
|
||||
}
|
||||
|
||||
static int hclge_query_dev_specs(struct hclge_dev *hdev)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 1a262a247701..081f03e8eae5 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -145,6 +145,8 @@
|
||||
/* Factor used to calculate offset and bitmap of VF num */
|
||||
#define HCLGE_VF_NUM_PER_CMD 64
|
||||
|
||||
+#define HCLGE_MAX_QSET_NUM 1024
|
||||
+
|
||||
#define HCLGE_DBG_RESET_INFO_LEN 1024
|
||||
|
||||
enum HLCGE_PORT_TYPE {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
index c92d084bb798..434e6dfca032 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
|
||||
@@ -23,8 +23,6 @@ enum hclge_shaper_level {
|
||||
#define HCLGE_SHAPER_BS_U_DEF 5
|
||||
#define HCLGE_SHAPER_BS_S_DEF 20
|
||||
|
||||
-#define HCLGE_ETHER_MAX_RATE 100000
|
||||
-
|
||||
/* hclge_shaper_para_calc: calculate ir parameter for the shaper
|
||||
* @ir: Rate to be config, its unit is Mbps
|
||||
* @shaper_level: the shaper level. eg: port, pg, priority, queueset
|
||||
@@ -40,7 +38,8 @@ enum hclge_shaper_level {
|
||||
* @return: 0: calculate sucessful, negative: fail
|
||||
*/
|
||||
static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
- struct hclge_shaper_ir_para *ir_para)
|
||||
+ struct hclge_shaper_ir_para *ir_para,
|
||||
+ u32 max_tm_rate)
|
||||
{
|
||||
#define DEFAULT_SHAPER_IR_B 126
|
||||
#define DIVISOR_CLK (1000 * 8)
|
||||
@@ -59,7 +58,7 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
|
||||
|
||||
/* Calc tick */
|
||||
if (shaper_level >= HCLGE_SHAPER_LVL_CNT ||
|
||||
- ir > HCLGE_ETHER_MAX_RATE)
|
||||
+ ir > max_tm_rate)
|
||||
return -EINVAL;
|
||||
|
||||
tick = tick_array[shaper_level];
|
||||
@@ -408,7 +407,7 @@ static int hclge_tm_port_shaper_cfg(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
|
||||
ret = hclge_shaper_para_calc(hdev->hw.mac.speed, HCLGE_SHAPER_LVL_PORT,
|
||||
- &ir_para);
|
||||
+ &ir_para, hdev->ae_dev->dev_specs.max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -524,10 +523,10 @@ int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate)
|
||||
int ret, i;
|
||||
|
||||
if (!max_tx_rate)
|
||||
- max_tx_rate = HCLGE_ETHER_MAX_RATE;
|
||||
+ max_tx_rate = hdev->ae_dev->dev_specs.max_tm_rate;
|
||||
|
||||
ret = hclge_shaper_para_calc(max_tx_rate, HCLGE_SHAPER_LVL_QSET,
|
||||
- &ir_para);
|
||||
+ &ir_para, hdev->ae_dev->dev_specs.max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -701,7 +700,8 @@ static void hclge_tm_pg_info_init(struct hclge_dev *hdev)
|
||||
hdev->tm_info.pg_info[i].pg_id = i;
|
||||
hdev->tm_info.pg_info[i].pg_sch_mode = HCLGE_SCH_MODE_DWRR;
|
||||
|
||||
- hdev->tm_info.pg_info[i].bw_limit = HCLGE_ETHER_MAX_RATE;
|
||||
+ hdev->tm_info.pg_info[i].bw_limit =
|
||||
+ hdev->ae_dev->dev_specs.max_tm_rate;
|
||||
|
||||
if (i != 0)
|
||||
continue;
|
||||
@@ -764,6 +764,7 @@ static int hclge_tm_pg_to_pri_map(struct hclge_dev *hdev)
|
||||
|
||||
static int hclge_tm_pg_shaper_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
+ u32 max_tm_rate = hdev->ae_dev->dev_specs.max_tm_rate;
|
||||
struct hclge_shaper_ir_para ir_para;
|
||||
u32 shaper_para;
|
||||
int ret;
|
||||
@@ -779,7 +780,7 @@ static int hclge_tm_pg_shaper_cfg(struct hclge_dev *hdev)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.pg_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_PG,
|
||||
- &ir_para);
|
||||
+ &ir_para, max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -897,6 +898,7 @@ static int hclge_tm_pri_q_qs_cfg(struct hclge_dev *hdev)
|
||||
|
||||
static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
{
|
||||
+ u32 max_tm_rate = hdev->ae_dev->dev_specs.max_tm_rate;
|
||||
struct hclge_shaper_ir_para ir_para;
|
||||
u32 shaper_para;
|
||||
int ret;
|
||||
@@ -906,7 +908,7 @@ static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.tc_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_PRI,
|
||||
- &ir_para);
|
||||
+ &ir_para, max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -940,7 +942,7 @@ static int hclge_tm_pri_vnet_base_shaper_pri_cfg(struct hclge_vport *vport)
|
||||
int ret;
|
||||
|
||||
ret = hclge_shaper_para_calc(vport->bw_limit, HCLGE_SHAPER_LVL_VF,
|
||||
- &ir_para);
|
||||
+ &ir_para, hdev->ae_dev->dev_specs.max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -969,6 +971,7 @@ static int hclge_tm_pri_vnet_base_shaper_qs_cfg(struct hclge_vport *vport)
|
||||
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_shaper_ir_para ir_para;
|
||||
+ u32 max_tm_rate = hdev->ae_dev->dev_specs.max_tm_rate;
|
||||
u32 i;
|
||||
int ret;
|
||||
|
||||
@@ -976,7 +979,7 @@ static int hclge_tm_pri_vnet_base_shaper_qs_cfg(struct hclge_vport *vport)
|
||||
ret = hclge_shaper_para_calc(
|
||||
hdev->tm_info.tc_info[i].bw_limit,
|
||||
HCLGE_SHAPER_LVL_QSET,
|
||||
- &ir_para);
|
||||
+ &ir_para, max_tm_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
index f4fb9c7e9c5f..8abb89beaae1 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
|
||||
@@ -19,6 +19,8 @@
|
||||
#define HCLGE_TM_TX_SCHD_DWRR_MSK BIT(0)
|
||||
#define HCLGE_TM_TX_SCHD_SP_MSK 0xFE
|
||||
|
||||
+#define HCLGE_ETHER_MAX_RATE 100000
|
||||
+
|
||||
#define HCLGE_TM_PF_MAX_PRI_NUM 8
|
||||
#define HCLGE_TM_PF_MAX_QSET_NUM 8
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
index 942a1d7406a0..2e857063a6b1 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
||||
@@ -287,6 +287,14 @@ struct hclgevf_dev_specs_0_cmd {
|
||||
u8 rsv1[5];
|
||||
};
|
||||
|
||||
+#define HCLGEVF_DEF_MAX_INT_GL 0x1FE0U
|
||||
+
|
||||
+struct hclgevf_dev_specs_1_cmd {
|
||||
+ __le32 rsv0;
|
||||
+ __le16 max_int_gl;
|
||||
+ u8 rsv1[18];
|
||||
+};
|
||||
+
|
||||
static inline void hclgevf_write_reg(void __iomem *base, u32 reg, u32 value)
|
||||
{
|
||||
writel(value, base + reg);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index 74d2aef34315..db292ca270b8 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -3043,6 +3043,7 @@ static void hclgevf_set_default_dev_specs(struct hclgevf_dev *hdev)
|
||||
HCLGEVF_MAX_NON_TSO_BD_NUM;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size = HCLGEVF_RSS_IND_TBL_SIZE;
|
||||
ae_dev->dev_specs.rss_key_size = HCLGEVF_RSS_KEY_SIZE;
|
||||
+ ae_dev->dev_specs.max_int_gl = HCLGEVF_DEF_MAX_INT_GL;
|
||||
}
|
||||
|
||||
static void hclgevf_parse_dev_specs(struct hclgevf_dev *hdev,
|
||||
@@ -3050,14 +3051,17 @@ static void hclgevf_parse_dev_specs(struct hclgevf_dev *hdev,
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||
struct hclgevf_dev_specs_0_cmd *req0;
|
||||
+ struct hclgevf_dev_specs_1_cmd *req1;
|
||||
|
||||
req0 = (struct hclgevf_dev_specs_0_cmd *)desc[0].data;
|
||||
+ req1 = (struct hclgevf_dev_specs_1_cmd *)desc[1].data;
|
||||
|
||||
ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;
|
||||
ae_dev->dev_specs.rss_ind_tbl_size =
|
||||
le16_to_cpu(req0->rss_ind_tbl_size);
|
||||
ae_dev->dev_specs.int_ql_max = le16_to_cpu(req0->int_ql_max);
|
||||
ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);
|
||||
+ ae_dev->dev_specs.max_int_gl = le16_to_cpu(req1->max_int_gl);
|
||||
}
|
||||
|
||||
static int hclgevf_query_dev_specs(struct hclgevf_dev *hdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
1167
patches/0444-net-hns3-add-support-for-PTP.patch
Normal file
1167
patches/0444-net-hns3-add-support-for-PTP.patch
Normal file
File diff suppressed because it is too large
Load Diff
56
patches/0445-net-hns3-fix-a-double-shift-bug.patch
Normal file
56
patches/0445-net-hns3-fix-a-double-shift-bug.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 0c48a7c9c98be4713a7bd1628773c2b8a09d56e9 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:20 +0800
|
||||
Subject: [PATCH 084/283] net: hns3: fix a double shift bug
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 956c3ae411b2746c5018e0454909eb8c662b31ef
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=956c3ae411b2746c5018e0454909eb8c662b31ef
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
These flags are used to set and test bits like this:
|
||||
|
||||
if (!test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) ||
|
||||
|
||||
The issue is that test_bit() takes a bit number like 1, but we are
|
||||
passing BIT(1) instead and it's testing BIT(BIT(1)). This does not
|
||||
cause a problem because it is always done consistently and the bit
|
||||
values are very small.
|
||||
|
||||
Fixes: 0bf5eb788512 ("net: hns3: add support for PTP")
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
index b3ca7afdaaa6..5a202b775471 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
@@ -43,9 +43,9 @@
|
||||
#define HCLGE_PTP_SEC_H_OFFSET 32u
|
||||
#define HCLGE_PTP_SEC_L_MASK GENMASK(31, 0)
|
||||
|
||||
-#define HCLGE_PTP_FLAG_EN BIT(0)
|
||||
-#define HCLGE_PTP_FLAG_TX_EN BIT(1)
|
||||
-#define HCLGE_PTP_FLAG_RX_EN BIT(2)
|
||||
+#define HCLGE_PTP_FLAG_EN 0
|
||||
+#define HCLGE_PTP_FLAG_TX_EN 1
|
||||
+#define HCLGE_PTP_FLAG_RX_EN 2
|
||||
|
||||
struct hclge_ptp {
|
||||
struct hclge_dev *hdev;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,180 @@
|
||||
From e5560ec3d352948a28a8f0e0c5f773421b429fe8 Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:21 +0800
|
||||
Subject: [PATCH 085/283] net: hns3: minor refactor related to desc_cb handling
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 26f1ccdf609a9fb087f49a3782fdc2ade23cde82
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=26f1ccdf609a9fb087f49a3782fdc2ade23cde82
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
desc_cb is used to store mapping and freeing info for the
|
||||
corresponding desc, which is used in the cleaning process.
|
||||
There will be more desc_cb type coming up when supporting the
|
||||
tx bounce buffer, change desc_cb type to bit-wise value in order
|
||||
to reduce the desc_cb type checking operation in the data path.
|
||||
|
||||
Also move the desc_cb type definition to hns3_enet.h because it
|
||||
is only used in hns3_enet.c, and declare a local variable desc_cb
|
||||
in hns3_clear_desc() to reduce lines of code.
|
||||
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 7 ----
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 40 +++++++++----------
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 7 ++++
|
||||
3 files changed, 25 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 9e5a62a4f549..5c38c7a02912 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -152,13 +152,6 @@ enum HNAE3_PF_CAP_BITS {
|
||||
#define ring_ptr_move_bw(ring, p) \
|
||||
((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num)
|
||||
|
||||
-enum hns_desc_type {
|
||||
- DESC_TYPE_UNKNOWN,
|
||||
- DESC_TYPE_SKB,
|
||||
- DESC_TYPE_FRAGLIST_SKB,
|
||||
- DESC_TYPE_PAGE,
|
||||
-};
|
||||
-
|
||||
struct hnae3_handle;
|
||||
|
||||
struct hnae3_queue {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index ddf8644e9111..6f3465df40ca 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -1132,7 +1132,7 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
}
|
||||
|
||||
static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
- unsigned int size, enum hns_desc_type type)
|
||||
+ unsigned int size, unsigned int type)
|
||||
{
|
||||
#define HNS3_LIKELY_BD_NUM 1
|
||||
|
||||
@@ -1144,8 +1144,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
int k, sizeoflast;
|
||||
dma_addr_t dma;
|
||||
|
||||
- if (type == DESC_TYPE_FRAGLIST_SKB ||
|
||||
- type == DESC_TYPE_SKB) {
|
||||
+ if (type & (DESC_TYPE_FRAGLIST_SKB | DESC_TYPE_SKB)) {
|
||||
struct sk_buff *skb = (struct sk_buff *)priv;
|
||||
|
||||
dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
|
||||
@@ -1411,6 +1410,7 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
||||
|
||||
for (i = 0; i < ring->desc_num; i++) {
|
||||
struct hns3_desc *desc = &ring->desc[ring->next_to_use];
|
||||
+ struct hns3_desc_cb *desc_cb;
|
||||
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
|
||||
@@ -1421,31 +1421,27 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
||||
/* rollback one */
|
||||
ring_ptr_move_bw(ring, next_to_use);
|
||||
|
||||
- if (!ring->desc_cb[ring->next_to_use].dma)
|
||||
+ desc_cb = &ring->desc_cb[ring->next_to_use];
|
||||
+
|
||||
+ if (!desc_cb->dma)
|
||||
continue;
|
||||
|
||||
/* unmap the descriptor dma address */
|
||||
- if (ring->desc_cb[ring->next_to_use].type == DESC_TYPE_SKB ||
|
||||
- ring->desc_cb[ring->next_to_use].type ==
|
||||
- DESC_TYPE_FRAGLIST_SKB)
|
||||
- dma_unmap_single(dev,
|
||||
- ring->desc_cb[ring->next_to_use].dma,
|
||||
- ring->desc_cb[ring->next_to_use].length,
|
||||
- DMA_TO_DEVICE);
|
||||
- else if (ring->desc_cb[ring->next_to_use].length)
|
||||
- dma_unmap_page(dev,
|
||||
- ring->desc_cb[ring->next_to_use].dma,
|
||||
- ring->desc_cb[ring->next_to_use].length,
|
||||
+ if (desc_cb->type & (DESC_TYPE_SKB | DESC_TYPE_FRAGLIST_SKB))
|
||||
+ dma_unmap_single(dev, desc_cb->dma, desc_cb->length,
|
||||
+ DMA_TO_DEVICE);
|
||||
+ else if (desc_cb->length)
|
||||
+ dma_unmap_page(dev, desc_cb->dma, desc_cb->length,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
- ring->desc_cb[ring->next_to_use].length = 0;
|
||||
- ring->desc_cb[ring->next_to_use].dma = 0;
|
||||
- ring->desc_cb[ring->next_to_use].type = DESC_TYPE_UNKNOWN;
|
||||
+ desc_cb->length = 0;
|
||||
+ desc_cb->dma = 0;
|
||||
+ desc_cb->type = DESC_TYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
static int hns3_fill_skb_to_desc(struct hns3_enet_ring *ring,
|
||||
- struct sk_buff *skb, enum hns_desc_type type)
|
||||
+ struct sk_buff *skb, unsigned int type)
|
||||
{
|
||||
unsigned int size = skb_headlen(skb);
|
||||
struct sk_buff *frag_skb;
|
||||
@@ -2547,7 +2543,7 @@ static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
|
||||
static void hns3_free_buffer(struct hns3_enet_ring *ring,
|
||||
struct hns3_desc_cb *cb, int budget)
|
||||
{
|
||||
- if (cb->type == DESC_TYPE_SKB)
|
||||
+ if (cb->type & DESC_TYPE_SKB)
|
||||
napi_consume_skb(cb->priv, budget);
|
||||
else if (!HNAE3_IS_TX_RING(ring) && cb->pagecnt_bias)
|
||||
__page_frag_cache_drain(cb->priv, cb->pagecnt_bias);
|
||||
@@ -2568,7 +2564,7 @@ static int hns3_map_buffer(struct hns3_enet_ring *ring, struct hns3_desc_cb *cb)
|
||||
static void hns3_unmap_buffer(struct hns3_enet_ring *ring,
|
||||
struct hns3_desc_cb *cb)
|
||||
{
|
||||
- if (cb->type == DESC_TYPE_SKB || cb->type == DESC_TYPE_FRAGLIST_SKB)
|
||||
+ if (cb->type & (DESC_TYPE_SKB | DESC_TYPE_FRAGLIST_SKB))
|
||||
dma_unmap_single(ring_to_dev(ring), cb->dma, cb->length,
|
||||
ring_to_dma_dir(ring));
|
||||
else if (cb->length)
|
||||
@@ -2724,7 +2720,7 @@ static bool hns3_nic_reclaim_desc(struct hns3_enet_ring *ring,
|
||||
|
||||
desc_cb = &ring->desc_cb[ntc];
|
||||
|
||||
- if (desc_cb->type == DESC_TYPE_SKB) {
|
||||
+ if (desc_cb->type & DESC_TYPE_SKB) {
|
||||
(*pkts)++;
|
||||
(*bytes) += desc_cb->send_bytes;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 70662c84cb57..4b035c458a58 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -297,6 +297,13 @@ struct __packed hns3_desc {
|
||||
};
|
||||
};
|
||||
|
||||
+enum hns3_desc_type {
|
||||
+ DESC_TYPE_UNKNOWN = 0,
|
||||
+ DESC_TYPE_SKB = 1 << 0,
|
||||
+ DESC_TYPE_FRAGLIST_SKB = 1 << 1,
|
||||
+ DESC_TYPE_PAGE = 1 << 2,
|
||||
+};
|
||||
+
|
||||
struct hns3_desc_cb {
|
||||
dma_addr_t dma; /* dma address of this desc */
|
||||
void *buf; /* cpu addr for a desc */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
159
patches/0447-net-hns3-refactor-for-hns3_fill_desc-function.patch
Normal file
159
patches/0447-net-hns3-refactor-for-hns3_fill_desc-function.patch
Normal file
@ -0,0 +1,159 @@
|
||||
From c142070dd4b17fc1d4a60214f12d6300c6d5fb94 Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:22 +0800
|
||||
Subject: [PATCH 086/283] net: hns3: refactor for hns3_fill_desc() function
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 8677d78c3d860c156ccd335e2b97728298c2cbb1
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8677d78c3d860c156ccd335e2b97728298c2cbb1
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Factor out hns3_fill_desc() so that it can be reused in the
|
||||
tx bounce supporting.
|
||||
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 87 ++++++++++---------
|
||||
1 file changed, 48 insertions(+), 39 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 6f3465df40ca..3ca646e15345 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -1131,39 +1131,14 @@ static int hns3_fill_skb_desc(struct hns3_enet_ring *ring,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
- unsigned int size, unsigned int type)
|
||||
+static int hns3_fill_desc(struct hns3_enet_ring *ring, dma_addr_t dma,
|
||||
+ unsigned int size)
|
||||
{
|
||||
#define HNS3_LIKELY_BD_NUM 1
|
||||
|
||||
- struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
|
||||
struct hns3_desc *desc = &ring->desc[ring->next_to_use];
|
||||
- struct device *dev = ring_to_dev(ring);
|
||||
- struct skb_frag_struct *frag;
|
||||
unsigned int frag_buf_num;
|
||||
int k, sizeoflast;
|
||||
- dma_addr_t dma;
|
||||
-
|
||||
- if (type & (DESC_TYPE_FRAGLIST_SKB | DESC_TYPE_SKB)) {
|
||||
- struct sk_buff *skb = (struct sk_buff *)priv;
|
||||
-
|
||||
- dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
|
||||
- } else {
|
||||
- frag = (struct skb_frag_struct *)priv;
|
||||
- dma = skb_frag_dma_map(dev, frag, 0, size, DMA_TO_DEVICE);
|
||||
- }
|
||||
-
|
||||
- if (unlikely(dma_mapping_error(dev, dma))) {
|
||||
- u64_stats_update_begin(&ring->syncp);
|
||||
- ring->stats.sw_err_cnt++;
|
||||
- u64_stats_update_end(&ring->syncp);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- desc_cb->priv = priv;
|
||||
- desc_cb->length = size;
|
||||
- desc_cb->dma = dma;
|
||||
- desc_cb->type = type;
|
||||
|
||||
if (likely(size <= HNS3_MAX_BD_SIZE)) {
|
||||
desc->addr = cpu_to_le64(dma);
|
||||
@@ -1199,6 +1174,47 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
return frag_buf_num;
|
||||
}
|
||||
|
||||
+static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
+ unsigned int type)
|
||||
+{
|
||||
+ struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
|
||||
+ struct device *dev = ring_to_dev(ring);
|
||||
+ unsigned int size;
|
||||
+ dma_addr_t dma;
|
||||
+
|
||||
+ if (type & (DESC_TYPE_FRAGLIST_SKB | DESC_TYPE_SKB)) {
|
||||
+ struct sk_buff *skb = (struct sk_buff *)priv;
|
||||
+
|
||||
+ size = skb_headlen(skb);
|
||||
+ if (!size)
|
||||
+ return 0;
|
||||
+
|
||||
+ dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
|
||||
+ } else {
|
||||
+ struct skb_frag_struct *frag = (struct skb_frag_struct *)priv;
|
||||
+
|
||||
+ size = skb_frag_size(frag);
|
||||
+ if (!size)
|
||||
+ return 0;
|
||||
+
|
||||
+ dma = skb_frag_dma_map(dev, frag, 0, size, DMA_TO_DEVICE);
|
||||
+ }
|
||||
+
|
||||
+ if (unlikely(dma_mapping_error(dev, dma))) {
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.sw_err_cnt++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ desc_cb->priv = priv;
|
||||
+ desc_cb->length = size;
|
||||
+ desc_cb->dma = dma;
|
||||
+ desc_cb->type = type;
|
||||
+
|
||||
+ return hns3_fill_desc(ring, dma, size);
|
||||
+}
|
||||
+
|
||||
static unsigned int hns3_skb_bd_num(struct sk_buff *skb, unsigned int *bd_size,
|
||||
unsigned int bd_num)
|
||||
{
|
||||
@@ -1443,26 +1459,19 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
||||
static int hns3_fill_skb_to_desc(struct hns3_enet_ring *ring,
|
||||
struct sk_buff *skb, unsigned int type)
|
||||
{
|
||||
- unsigned int size = skb_headlen(skb);
|
||||
struct sk_buff *frag_skb;
|
||||
int i, ret, bd_num = 0;
|
||||
|
||||
- if (size) {
|
||||
- ret = hns3_fill_desc(ring, skb, size, type);
|
||||
- if (unlikely(ret < 0))
|
||||
- return ret;
|
||||
+ ret = hns3_map_and_fill_desc(ring, skb, type);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ return ret;
|
||||
|
||||
- bd_num += ret;
|
||||
- }
|
||||
+ bd_num += ret;
|
||||
|
||||
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
||||
struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i];
|
||||
|
||||
- size = skb_frag_size(frag);
|
||||
- if (!size)
|
||||
- continue;
|
||||
-
|
||||
- ret = hns3_fill_desc(ring, frag, size, DESC_TYPE_PAGE);
|
||||
+ ret = hns3_map_and_fill_desc(ring, frag, DESC_TYPE_PAGE);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,382 @@
|
||||
From f4b6431fab7c7162824b541cb194b476e5f7bfe6 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sun, 6 Dec 2020 12:06:14 +0800
|
||||
Subject: [PATCH 087/283] net: hns3: add priv flags support to switch limit
|
||||
promisc mode
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.11-rc1
|
||||
commit 5e7414cdf1abea7e2fc19a3190aa7b0d0b1e629d
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5e7414cdf1abea7e2fc19a3190aa7b0d0b1e629d
|
||||
|
||||
--------------------------------
|
||||
|
||||
Currently, the tx unicast promisc is always enabled when promisc
|
||||
mode on. If tx unicast promisc on, a function will receive all
|
||||
unicast packet from other functions belong to the same port.
|
||||
Add a ethtool private flag to control whether enable tx
|
||||
unicast promisc. Then the function is able to filter the
|
||||
unknown unicast packets from other function.
|
||||
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hclge_mbx.h | 1 +
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 10 +++
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 86 +++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 17 ++--
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 10 +--
|
||||
.../hisilicon/hns3/hns3pf/hclge_mbx.c | 6 ++
|
||||
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 7 ++
|
||||
8 files changed, 127 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
index bfd6f19aa65a..5a13eea2742d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
|
||||
@@ -122,6 +122,7 @@ struct hclge_vf_to_pf_msg {
|
||||
u8 en_bc;
|
||||
u8 en_uc;
|
||||
u8 en_mc;
|
||||
+ u8 en_limit_promisc;
|
||||
};
|
||||
struct {
|
||||
u8 vector_id;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 5c38c7a02912..738baccf5a8a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -853,6 +853,11 @@ struct hnae3_unic_private_info {
|
||||
#define HNAE3_MPE (HNAE3_USER_MPE | HNAE3_OVERFLOW_MPE)
|
||||
#define HNAE3_OVERFLOW_UMPE (HNAE3_OVERFLOW_UPE | HNAE3_OVERFLOW_MPE)
|
||||
|
||||
+enum hnae3_pflag {
|
||||
+ HNAE3_PFLAG_LIMIT_PROMISC,
|
||||
+ HNAE3_PFLAG_MAX
|
||||
+};
|
||||
+
|
||||
struct hnae3_handle {
|
||||
struct hnae3_client *client;
|
||||
struct pci_dev *pdev;
|
||||
@@ -885,6 +890,11 @@ struct hnae3_handle {
|
||||
/* for sysfs */
|
||||
struct kobject *kobj;
|
||||
#endif
|
||||
+
|
||||
+#ifndef __GENKSYMS__
|
||||
+ unsigned long supported_pflags;
|
||||
+ unsigned long priv_flags;
|
||||
+#endif
|
||||
};
|
||||
|
||||
#define hnae3_set_field(origin, mask, shift, val) \
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 3ca646e15345..7600a2e4a645 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -4371,6 +4371,9 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||
|
||||
set_bit(HNS3_NIC_STATE_INITED, &priv->state);
|
||||
|
||||
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
|
||||
+ set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->supported_pflags);
|
||||
+
|
||||
ret = register_netdev(netdev);
|
||||
if (ret) {
|
||||
dev_err(priv->dev, "probe register netdev fail!\n");
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index c42c6163ac80..ae22adfe5740 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -22,6 +22,11 @@ struct hns3_sfp_type {
|
||||
u8 ext_type;
|
||||
};
|
||||
|
||||
+struct hns3_pflag_desc {
|
||||
+ char name[ETH_GSTRING_LEN];
|
||||
+ void (*handler)(struct net_device *netdev, bool enable);
|
||||
+};
|
||||
+
|
||||
/* tqp related stats */
|
||||
#define HNS3_TQP_STAT(_string, _member) { \
|
||||
.stats_string = _string, \
|
||||
@@ -65,6 +70,8 @@ static const struct hns3_stats hns3_rxq_stats[] = {
|
||||
HNS3_TQP_STAT("non_reuse_pg", non_reuse_pg),
|
||||
};
|
||||
|
||||
+#define HNS3_PRIV_FLAGS_LEN ARRAY_SIZE(hns3_priv_flags)
|
||||
+
|
||||
#define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)
|
||||
|
||||
#define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
|
||||
@@ -408,6 +415,23 @@ static void hns3_self_test(struct net_device *ndev,
|
||||
netdev_info(ndev, "self test end\n");
|
||||
}
|
||||
|
||||
+static void hns3_update_limit_promisc_mode(struct net_device *netdev,
|
||||
+ bool enable)
|
||||
+{
|
||||
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+
|
||||
+ if (enable)
|
||||
+ set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
+ else
|
||||
+ clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
+
|
||||
+ hns3_request_update_promisc_mode(handle);
|
||||
+}
|
||||
+
|
||||
+static const struct hns3_pflag_desc hns3_priv_flags[HNAE3_PFLAG_MAX] = {
|
||||
+ { "limit_promisc", hns3_update_limit_promisc_mode }
|
||||
+};
|
||||
+
|
||||
static int hns3_get_sset_count(struct net_device *netdev, int stringset)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
@@ -424,6 +448,9 @@ static int hns3_get_sset_count(struct net_device *netdev, int stringset)
|
||||
case ETH_SS_TEST:
|
||||
return ops->get_sset_count(h, stringset);
|
||||
|
||||
+ case ETH_SS_PRIV_FLAGS:
|
||||
+ return HNAE3_PFLAG_MAX;
|
||||
+
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -477,6 +504,7 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
const struct hnae3_ae_ops *ops = h->ae_algo->ops;
|
||||
char *buff = (char *)data;
|
||||
+ int i;
|
||||
|
||||
if (!ops->get_strings)
|
||||
return;
|
||||
@@ -489,6 +517,13 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
|
||||
case ETH_SS_TEST:
|
||||
ops->get_strings(h, stringset, data);
|
||||
break;
|
||||
+ case ETH_SS_PRIV_FLAGS:
|
||||
+ for (i = 0; i < HNS3_PRIV_FLAGS_LEN; i++) {
|
||||
+ snprintf(buff, ETH_GSTRING_LEN, "%s",
|
||||
+ hns3_priv_flags[i].name);
|
||||
+ buff += ETH_GSTRING_LEN;
|
||||
+ }
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1522,6 +1557,53 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
||||
return ops->get_module_eeprom(handle, ee->offset, ee->len, data);
|
||||
}
|
||||
|
||||
+static u32 hns3_get_priv_flags(struct net_device *netdev)
|
||||
+{
|
||||
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+
|
||||
+ return handle->priv_flags;
|
||||
+}
|
||||
+
|
||||
+static int hns3_check_priv_flags(struct hnae3_handle *h, u32 changed)
|
||||
+{
|
||||
+ u32 i;
|
||||
+
|
||||
+ for (i = 0; i < HNAE3_PFLAG_MAX; i++)
|
||||
+ if ((changed & BIT(i)) && !test_bit(i, &h->supported_pflags)) {
|
||||
+ netdev_err(h->netdev, "%s is unsupported\n",
|
||||
+ hns3_priv_flags[i].name);
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hns3_set_priv_flags(struct net_device *netdev, u32 pflags)
|
||||
+{
|
||||
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
+ u32 changed = pflags ^ handle->priv_flags;
|
||||
+ int ret;
|
||||
+ u32 i;
|
||||
+
|
||||
+ ret = hns3_check_priv_flags(handle, changed);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ for (i = 0; i < HNAE3_PFLAG_MAX; i++) {
|
||||
+ if (changed & BIT(i)) {
|
||||
+ bool enable = !(handle->priv_flags & BIT(i));
|
||||
+
|
||||
+ if (enable)
|
||||
+ handle->priv_flags |= BIT(i);
|
||||
+ else
|
||||
+ handle->priv_flags &= ~BIT(i);
|
||||
+ hns3_priv_flags[i].handler(netdev, enable);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#define HNS3_ETHTOOL_COALESCE (ETHTOOL_COALESCE_USECS | \
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE | \
|
||||
ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
@@ -1563,6 +1645,8 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
.get_link = hns3_get_link,
|
||||
.get_msglevel = hns3_get_msglevel,
|
||||
.set_msglevel = hns3_set_msglevel,
|
||||
+ .get_priv_flags = hns3_get_priv_flags,
|
||||
+ .set_priv_flags = hns3_set_priv_flags,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
@@ -1599,6 +1683,8 @@ static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
.set_fecparam = hns3_set_fecparam,
|
||||
.get_module_info = hns3_get_module_info,
|
||||
.get_module_eeprom = hns3_get_module_eeprom,
|
||||
+ .get_priv_flags = hns3_get_priv_flags,
|
||||
+ .set_priv_flags = hns3_set_priv_flags,
|
||||
.get_ts_info = hns3_get_ts_info,
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 4d89efaf4aed..ba10e18ddb7e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -599,23 +599,24 @@ struct hclge_link_status_cmd {
|
||||
u8 rsv[23];
|
||||
};
|
||||
|
||||
+#define HCLGE_PROMISC_TX_EN_B BIT(4)
|
||||
+#define HCLGE_PROMISC_RX_EN_B BIT(5)
|
||||
+#define HCLGE_PROMISC_EN_B 1
|
||||
+#define HCLGE_PROMISC_EN_ALL 0x7
|
||||
+#define HCLGE_PROMISC_EN_UC 0x1
|
||||
+#define HCLGE_PROMISC_EN_MC 0x2
|
||||
+#define HCLGE_PROMISC_EN_BC 0x4
|
||||
+
|
||||
struct hclge_promisc_param {
|
||||
u8 vf_id;
|
||||
u8 enable;
|
||||
};
|
||||
|
||||
-#define HCLGE_PROMISC_TX_EN_B BIT(4)
|
||||
-#define HCLGE_PROMISC_RX_EN_B BIT(5)
|
||||
-#define HCLGE_PROMISC_EN_B 1
|
||||
-#define HCLGE_PROMISC_EN_ALL 0x7
|
||||
-#define HCLGE_PROMISC_EN_UC 0x1
|
||||
-#define HCLGE_PROMISC_EN_MC 0x2
|
||||
-#define HCLGE_PROMISC_EN_BC 0x4
|
||||
struct hclge_promisc_cfg_cmd {
|
||||
u8 flag;
|
||||
u8 vf_id;
|
||||
__le16 rsv0;
|
||||
- u8 rsv1[20];
|
||||
+ u8 rsv1[21];
|
||||
};
|
||||
|
||||
enum hclge_promisc_type {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index d4db7a84f279..d46a1d31c701 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -5109,20 +5109,20 @@ static int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
|
||||
* send command to fireware in revision(0x20).
|
||||
*/
|
||||
req->flag = (param->enable << HCLGE_PROMISC_EN_B) |
|
||||
- HCLGE_PROMISC_TX_EN_B | HCLGE_PROMISC_RX_EN_B;
|
||||
+ HCLGE_PROMISC_TX_EN_B | HCLGE_PROMISC_RX_EN_B;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
dev_err(&hdev->pdev->dev,
|
||||
- "Set vport %d promisc mode fail, ret = %d.\n",
|
||||
- param->vf_id, ret);
|
||||
+ "failed to set vport %d promisc mode, ret = %d.\n",
|
||||
+ param->vf_id, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void hclge_promisc_param_init(struct hclge_promisc_param *param,
|
||||
- bool en_uc, bool en_mc, bool en_bc,
|
||||
- int vport_id)
|
||||
+ bool en_uc, bool en_mc, bool en_bc,
|
||||
+ int vport_id)
|
||||
{
|
||||
if (!param)
|
||||
return;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
index 841c9b0c9fe4..a9dd7d0601ab 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
||||
@@ -327,11 +327,17 @@ static void hclge_set_vf_promisc_mode(struct hclge_vport *vport,
|
||||
struct hclge_mbx_vf_to_pf_cmd *req)
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
+ struct hnae3_handle *handle = &vport->nic;
|
||||
|
||||
vport->vf_info.request_uc_en = req->msg.en_uc;
|
||||
vport->vf_info.request_mc_en = req->msg.en_mc;
|
||||
vport->vf_info.request_bc_en = req->msg.en_bc;
|
||||
|
||||
+ if (req->msg.en_limit_promisc)
|
||||
+ set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
+ else
|
||||
+ clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
+
|
||||
set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
|
||||
hclge_task_schedule(hdev, 0);
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index db292ca270b8..d58b4e4780a8 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -15,6 +15,9 @@
|
||||
#define HCLGEVF_RESET_MAX_FAIL_CNT 5
|
||||
|
||||
static int hclgevf_reset_hdev(struct hclgevf_dev *hdev);
|
||||
+static void hclgevf_task_schedule(struct hclgevf_dev *hdev,
|
||||
+ unsigned long delay);
|
||||
+
|
||||
static struct hnae3_ae_algo ae_algovf;
|
||||
|
||||
static struct workqueue_struct *hclgevf_wq;
|
||||
@@ -1177,6 +1180,7 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
|
||||
bool en_uc_pmc, bool en_mc_pmc,
|
||||
bool en_bc_pmc)
|
||||
{
|
||||
+ struct hnae3_handle *handle = &hdev->nic;
|
||||
struct hclge_vf_to_pf_msg send_msg;
|
||||
int ret;
|
||||
|
||||
@@ -1185,6 +1189,8 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
|
||||
send_msg.en_bc = en_bc_pmc ? 1 : 0;
|
||||
send_msg.en_uc = en_uc_pmc ? 1 : 0;
|
||||
send_msg.en_mc = en_mc_pmc ? 1 : 0;
|
||||
+ send_msg.en_limit_promisc = test_bit(HNAE3_PFLAG_LIMIT_PROMISC,
|
||||
+ &handle->priv_flags) ? 1 : 0;
|
||||
|
||||
ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
|
||||
if (ret)
|
||||
@@ -1211,6 +1217,7 @@ static void hclgevf_request_update_promisc_mode(struct hnae3_handle *handle)
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
|
||||
set_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
+ hclgevf_task_schedule(hdev, 0);
|
||||
}
|
||||
|
||||
static void hclgevf_sync_promisc_mode(struct hclgevf_dev *hdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,719 @@
|
||||
From 576d5899a183853648fdf5e9bfd9fd50951153b9 Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:23 +0800
|
||||
Subject: [PATCH 088/283] net: hns3: use tx bounce buffer for small packets
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 907676b130711fd1f627824559e92259db2061d1
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=907676b130711fd1f627824559e92259db2061d1
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
when the packet or frag size is small, it causes both security and
|
||||
performance issue. As dma can't map sub-page, this means some extra
|
||||
kernel data is visible to devices. On the other hand, the overhead
|
||||
of dma map and unmap is huge when IOMMU is on.
|
||||
|
||||
So add a queue based tx shared bounce buffer to memcpy the small
|
||||
packet when the len of the xmitted skb is below tx_copybreak.
|
||||
Add tx_spare_buf_size module param to set the size of tx spare
|
||||
buffer, and add set/get_tunable to set or query the tx_copybreak.
|
||||
|
||||
The throughtput improves from 30 Gbps to 90+ Gbps when running 16
|
||||
netperf threads with 32KB UDP message size when IOMMU is in the
|
||||
strict mode(tx_copybreak = 2000 and mtu = 1500).
|
||||
|
||||
Suggested-by: Barry Song <song.bao.hua@hisilicon.com>
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 54 +++-
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 294 +++++++++++++++++-
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 43 ++-
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 51 +++
|
||||
4 files changed, 423 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index ad7015b3ec80..6b2179516fff 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -385,6 +385,56 @@ static void hns3_dbg_fill_content(char *content, u16 len,
|
||||
*pos++ = '\0';
|
||||
}
|
||||
|
||||
+static const struct hns3_dbg_item tx_spare_info_items[] = {
|
||||
+ { "QUEUE_ID", 2 },
|
||||
+ { "COPYBREAK", 2 },
|
||||
+ { "LEN", 7 },
|
||||
+ { "NTU", 4 },
|
||||
+ { "NTC", 4 },
|
||||
+ { "LTC", 4 },
|
||||
+ { "DMA", 17 },
|
||||
+};
|
||||
+
|
||||
+static void hns3_dbg_tx_spare_info(struct hns3_enet_ring *ring, char *buf,
|
||||
+ int len, u32 ring_num, int *pos)
|
||||
+{
|
||||
+ char data_str[ARRAY_SIZE(tx_spare_info_items)][HNS3_DBG_DATA_STR_LEN];
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+ char *result[ARRAY_SIZE(tx_spare_info_items)];
|
||||
+ char content[HNS3_DBG_INFO_LEN];
|
||||
+ u32 i, j;
|
||||
+
|
||||
+ if (!tx_spare) {
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos,
|
||||
+ "tx spare buffer is not enabled\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(tx_spare_info_items); i++)
|
||||
+ result[i] = &data_str[i][0];
|
||||
+
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "tx spare buffer info\n");
|
||||
+ hns3_dbg_fill_content(content, sizeof(content), tx_spare_info_items,
|
||||
+ NULL, ARRAY_SIZE(tx_spare_info_items));
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "%s", content);
|
||||
+
|
||||
+ for (i = 0; i < ring_num; i++) {
|
||||
+ j = 0;
|
||||
+ sprintf(result[j++], "%8u", i);
|
||||
+ sprintf(result[j++], "%9u", ring->tx_copybreak);
|
||||
+ sprintf(result[j++], "%3u", tx_spare->len);
|
||||
+ sprintf(result[j++], "%3u", tx_spare->next_to_use);
|
||||
+ sprintf(result[j++], "%3u", tx_spare->next_to_clean);
|
||||
+ sprintf(result[j++], "%3u", tx_spare->last_to_clean);
|
||||
+ sprintf(result[j++], "%pad", &tx_spare->dma);
|
||||
+ hns3_dbg_fill_content(content, sizeof(content),
|
||||
+ tx_spare_info_items,
|
||||
+ (const char **)result,
|
||||
+ ARRAY_SIZE(tx_spare_info_items));
|
||||
+ *pos += scnprintf(buf + *pos, len - *pos, "%s", content);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static const struct hns3_dbg_item rx_queue_info_items[] = {
|
||||
{ "QUEUE_ID", 2 },
|
||||
{ "BD_NUM", 2 },
|
||||
@@ -544,7 +594,7 @@ static int hns3_dbg_tx_queue_info(struct hnae3_handle *h,
|
||||
char *result[ARRAY_SIZE(tx_queue_info_items)];
|
||||
struct hns3_nic_priv *priv = h->priv;
|
||||
char content[HNS3_DBG_INFO_LEN];
|
||||
- struct hns3_enet_ring *ring;
|
||||
+ struct hns3_enet_ring *ring = NULL;
|
||||
int pos = 0;
|
||||
u32 i;
|
||||
|
||||
@@ -578,6 +628,8 @@ static int hns3_dbg_tx_queue_info(struct hnae3_handle *h,
|
||||
pos += scnprintf(buf + pos, len - pos, "%s", content);
|
||||
}
|
||||
|
||||
+ hns3_dbg_tx_spare_info(ring, buf, len, h->kinfo.num_tqps, &pos);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 7600a2e4a645..fd800aa35f3e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -52,6 +52,10 @@ static int debug = -1;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, " Network interface message level setting");
|
||||
|
||||
+static unsigned int tx_spare_buf_size;
|
||||
+module_param(tx_spare_buf_size, uint, 0400);
|
||||
+MODULE_PARM_DESC(tx_spare_buf_size, "Size used to allocate tx spare buffer");
|
||||
+
|
||||
#define DEFAULT_MSG_LEVEL (NETIF_MSG_PROBE | NETIF_MSG_LINK | \
|
||||
NETIF_MSG_IFDOWN | NETIF_MSG_IFUP)
|
||||
|
||||
@@ -645,7 +649,178 @@ void hns3_request_update_promisc_mode(struct hnae3_handle *handle)
|
||||
ops->request_update_promisc_mode(handle);
|
||||
}
|
||||
|
||||
-static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
|
||||
+static u32 hns3_tx_spare_space(struct hns3_enet_ring *ring)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+ u32 ntc, ntu;
|
||||
+
|
||||
+ /* This smp_load_acquire() pairs with smp_store_release() in
|
||||
+ * hns3_tx_spare_update() called in tx desc cleaning process.
|
||||
+ */
|
||||
+ ntc = smp_load_acquire(&tx_spare->last_to_clean);
|
||||
+ ntu = tx_spare->next_to_use;
|
||||
+
|
||||
+ if (ntc > ntu)
|
||||
+ return ntc - ntu - 1;
|
||||
+
|
||||
+ /* The free tx buffer is divided into two part, so pick the
|
||||
+ * larger one.
|
||||
+ */
|
||||
+ return (ntc > (tx_spare->len - ntu) ? ntc :
|
||||
+ (tx_spare->len - ntu)) - 1;
|
||||
+}
|
||||
+
|
||||
+static void hns3_tx_spare_update(struct hns3_enet_ring *ring)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+
|
||||
+ if (!tx_spare ||
|
||||
+ tx_spare->last_to_clean == tx_spare->next_to_clean)
|
||||
+ return;
|
||||
+
|
||||
+ /* This smp_store_release() pairs with smp_load_acquire() in
|
||||
+ * hns3_tx_spare_space() called in xmit process.
|
||||
+ */
|
||||
+ smp_store_release(&tx_spare->last_to_clean,
|
||||
+ tx_spare->next_to_clean);
|
||||
+}
|
||||
+
|
||||
+static bool hns3_can_use_tx_bounce(struct hns3_enet_ring *ring,
|
||||
+ struct sk_buff *skb,
|
||||
+ u32 space)
|
||||
+{
|
||||
+ u32 len = skb->len <= ring->tx_copybreak ? skb->len :
|
||||
+ skb_headlen(skb);
|
||||
+
|
||||
+ if (len > ring->tx_copybreak)
|
||||
+ return false;
|
||||
+
|
||||
+ if (ALIGN(len, dma_get_cache_alignment()) > space) {
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.tx_spare_full++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare;
|
||||
+ struct page *page;
|
||||
+ dma_addr_t dma;
|
||||
+ int order;
|
||||
+
|
||||
+ if (!tx_spare_buf_size)
|
||||
+ return;
|
||||
+
|
||||
+ order = get_order(tx_spare_buf_size);
|
||||
+ tx_spare = devm_kzalloc(ring_to_dev(ring), sizeof(*tx_spare),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!tx_spare) {
|
||||
+ /* The driver still work without the tx spare buffer */
|
||||
+ dev_warn(ring_to_dev(ring), "failed to allocate hns3_tx_spare\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ page = alloc_pages_node(dev_to_node(ring_to_dev(ring)),
|
||||
+ GFP_KERNEL, order);
|
||||
+ if (!page) {
|
||||
+ dev_warn(ring_to_dev(ring), "failed to allocate tx spare pages\n");
|
||||
+ devm_kfree(ring_to_dev(ring), tx_spare);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ dma = dma_map_page(ring_to_dev(ring), page, 0,
|
||||
+ PAGE_SIZE << order, DMA_TO_DEVICE);
|
||||
+ if (dma_mapping_error(ring_to_dev(ring), dma)) {
|
||||
+ dev_warn(ring_to_dev(ring), "failed to map pages for tx spare\n");
|
||||
+ put_page(page);
|
||||
+ devm_kfree(ring_to_dev(ring), tx_spare);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ tx_spare->dma = dma;
|
||||
+ tx_spare->buf = page_address(page);
|
||||
+ tx_spare->len = PAGE_SIZE << order;
|
||||
+ ring->tx_spare = tx_spare;
|
||||
+}
|
||||
+
|
||||
+/* Use hns3_tx_spare_space() to make sure there is enough buffer
|
||||
+ * before calling below function to allocate tx buffer.
|
||||
+ */
|
||||
+static void *hns3_tx_spare_alloc(struct hns3_enet_ring *ring,
|
||||
+ unsigned int size, dma_addr_t *dma,
|
||||
+ u32 *cb_len)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+ u32 ntu = tx_spare->next_to_use;
|
||||
+
|
||||
+ size = ALIGN(size, dma_get_cache_alignment());
|
||||
+ *cb_len = size;
|
||||
+
|
||||
+ /* Tx spare buffer wraps back here because the end of
|
||||
+ * freed tx buffer is not enough.
|
||||
+ */
|
||||
+ if (ntu + size > tx_spare->len) {
|
||||
+ *cb_len += (tx_spare->len - ntu);
|
||||
+ ntu = 0;
|
||||
+ }
|
||||
+
|
||||
+ tx_spare->next_to_use = ntu + size;
|
||||
+ if (tx_spare->next_to_use == tx_spare->len)
|
||||
+ tx_spare->next_to_use = 0;
|
||||
+
|
||||
+ *dma = tx_spare->dma + ntu;
|
||||
+
|
||||
+ return tx_spare->buf + ntu;
|
||||
+}
|
||||
+
|
||||
+static void hns3_tx_spare_rollback(struct hns3_enet_ring *ring, u32 len)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+
|
||||
+ if (len > tx_spare->next_to_use) {
|
||||
+ len -= tx_spare->next_to_use;
|
||||
+ tx_spare->next_to_use = tx_spare->len - len;
|
||||
+ } else {
|
||||
+ tx_spare->next_to_use -= len;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void hns3_tx_spare_reclaim_cb(struct hns3_enet_ring *ring,
|
||||
+ struct hns3_desc_cb *cb)
|
||||
+{
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+ u32 ntc = tx_spare->next_to_clean;
|
||||
+ u32 len = cb->length;
|
||||
+
|
||||
+ tx_spare->next_to_clean += len;
|
||||
+
|
||||
+ if (tx_spare->next_to_clean >= tx_spare->len) {
|
||||
+ tx_spare->next_to_clean -= tx_spare->len;
|
||||
+
|
||||
+ if (tx_spare->next_to_clean) {
|
||||
+ ntc = 0;
|
||||
+ len = tx_spare->next_to_clean;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* This tx spare buffer is only really reclaimed after calling
|
||||
+ * hns3_tx_spare_update(), so it is still safe to use the info in
|
||||
+ * the tx buffer to do the dma sync after tx_spare->next_to_clean
|
||||
+ * is moved forword.
|
||||
+ */
|
||||
+ if (cb->type & (DESC_TYPE_BOUNCE_HEAD | DESC_TYPE_BOUNCE_ALL)) {
|
||||
+ dma_addr_t dma = tx_spare->dma + ntc;
|
||||
+
|
||||
+ dma_sync_single_for_cpu(ring_to_dev(ring), dma, len,
|
||||
+ DMA_TO_DEVICE);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int hns3_set_tso(struct sk_buff *skb, u32 *paylen_fdop_ol4cs,
|
||||
u16 *mss, u32 *type_cs_vlan_tso, u32 *send_bytes)
|
||||
{
|
||||
u32 l4_offset, hdr_len;
|
||||
@@ -719,7 +894,7 @@ static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
|
||||
*send_bytes = (skb_shinfo(skb)->gso_segs - 1) * hdr_len + skb->len;
|
||||
|
||||
/* find the txbd field values */
|
||||
- *paylen = skb->len - hdr_len;
|
||||
+ *paylen_fdop_ol4cs = skb->len - hdr_len;
|
||||
hns3_set_field(*type_cs_vlan_tso, HNS3_TXD_TSO_B, 1);
|
||||
|
||||
/* get MSS for TSO */
|
||||
@@ -1190,6 +1365,11 @@ static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
return 0;
|
||||
|
||||
dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
|
||||
+ } else if (type & DESC_TYPE_BOUNCE_HEAD) {
|
||||
+ /* Head data has been filled in hns3_handle_tx_bounce(),
|
||||
+ * just return 0 here.
|
||||
+ */
|
||||
+ return 0;
|
||||
} else {
|
||||
struct skb_frag_struct *frag = (struct skb_frag_struct *)priv;
|
||||
|
||||
@@ -1446,6 +1626,9 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
||||
if (desc_cb->type & (DESC_TYPE_SKB | DESC_TYPE_FRAGLIST_SKB))
|
||||
dma_unmap_single(dev, desc_cb->dma, desc_cb->length,
|
||||
DMA_TO_DEVICE);
|
||||
+ else if (desc_cb->type &
|
||||
+ (DESC_TYPE_BOUNCE_HEAD | DESC_TYPE_BOUNCE_ALL))
|
||||
+ hns3_tx_spare_rollback(ring, desc_cb->length);
|
||||
else if (desc_cb->length)
|
||||
dma_unmap_page(dev, desc_cb->dma, desc_cb->length,
|
||||
DMA_TO_DEVICE);
|
||||
@@ -1527,6 +1710,79 @@ static void hns3_tsyn(struct net_device *netdev, struct sk_buff *skb,
|
||||
desc->tx.bdtp_fe_sc_vld_ra_ri |= cpu_to_le16(BIT(HNS3_TXD_TSYN_B));
|
||||
}
|
||||
|
||||
+static int hns3_handle_tx_bounce(struct hns3_enet_ring *ring,
|
||||
+ struct sk_buff *skb)
|
||||
+{
|
||||
+ struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
|
||||
+ unsigned int type = DESC_TYPE_BOUNCE_HEAD;
|
||||
+ unsigned int size = skb_headlen(skb);
|
||||
+ dma_addr_t dma;
|
||||
+ int bd_num = 0;
|
||||
+ u32 cb_len;
|
||||
+ void *buf;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (skb->len <= ring->tx_copybreak) {
|
||||
+ size = skb->len;
|
||||
+ type = DESC_TYPE_BOUNCE_ALL;
|
||||
+ }
|
||||
+
|
||||
+ /* hns3_can_use_tx_bounce() is called to ensure the below
|
||||
+ * function can always return the tx buffer.
|
||||
+ */
|
||||
+ buf = hns3_tx_spare_alloc(ring, size, &dma, &cb_len);
|
||||
+
|
||||
+ ret = skb_copy_bits(skb, 0, buf, size);
|
||||
+ if (unlikely(ret < 0)) {
|
||||
+ hns3_tx_spare_rollback(ring, cb_len);
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.copy_bits_err++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ desc_cb->priv = skb;
|
||||
+ desc_cb->length = cb_len;
|
||||
+ desc_cb->dma = dma;
|
||||
+ desc_cb->type = type;
|
||||
+
|
||||
+ bd_num += hns3_fill_desc(ring, dma, size);
|
||||
+
|
||||
+ if (type == DESC_TYPE_BOUNCE_HEAD) {
|
||||
+ ret = hns3_fill_skb_to_desc(ring, skb,
|
||||
+ DESC_TYPE_BOUNCE_HEAD);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ return ret;
|
||||
+
|
||||
+ bd_num += ret;
|
||||
+ }
|
||||
+
|
||||
+ dma_sync_single_for_device(ring_to_dev(ring), dma, size,
|
||||
+ DMA_TO_DEVICE);
|
||||
+
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.tx_bounce++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return bd_num;
|
||||
+}
|
||||
+
|
||||
+static int hns3_handle_desc_filling(struct hns3_enet_ring *ring,
|
||||
+ struct sk_buff *skb)
|
||||
+{
|
||||
+ u32 space;
|
||||
+
|
||||
+ if (!ring->tx_spare)
|
||||
+ goto out;
|
||||
+
|
||||
+ space = hns3_tx_spare_space(ring);
|
||||
+
|
||||
+ if (hns3_can_use_tx_bounce(ring, skb, space))
|
||||
+ return hns3_handle_tx_bounce(ring, skb);
|
||||
+
|
||||
+out:
|
||||
+ return hns3_fill_skb_to_desc(ring, skb, DESC_TYPE_SKB);
|
||||
+}
|
||||
+
|
||||
netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
{
|
||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
@@ -1572,7 +1828,7 @@ netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
* zero, which is unlikely, and 'ret > 0' means how many tx desc
|
||||
* need to be notified to the hw.
|
||||
*/
|
||||
- ret = hns3_fill_skb_to_desc(ring, skb, DESC_TYPE_SKB);
|
||||
+ ret = hns3_handle_desc_filling(ring, skb);
|
||||
if (unlikely(ret <= 0))
|
||||
goto fill_err;
|
||||
|
||||
@@ -1778,6 +2034,7 @@ static struct rtnl_link_stats64 *hns3_nic_get_stats64(struct net_device *netdev,
|
||||
tx_drop += ring->stats.tx_tso_err;
|
||||
tx_drop += ring->stats.over_max_recursion;
|
||||
tx_drop += ring->stats.hw_limitation;
|
||||
+ tx_drop += ring->stats.copy_bits_err;
|
||||
tx_errors += ring->stats.sw_err_cnt;
|
||||
tx_errors += ring->stats.tx_vlan_err;
|
||||
tx_errors += ring->stats.tx_l4_proto_err;
|
||||
@@ -1785,6 +2042,7 @@ static struct rtnl_link_stats64 *hns3_nic_get_stats64(struct net_device *netdev,
|
||||
tx_errors += ring->stats.tx_tso_err;
|
||||
tx_errors += ring->stats.over_max_recursion;
|
||||
tx_errors += ring->stats.hw_limitation;
|
||||
+ tx_errors += ring->stats.copy_bits_err;
|
||||
} while (u64_stats_fetch_retry_irq(&ring->syncp, start));
|
||||
|
||||
/* fetch the rx stats */
|
||||
@@ -2552,7 +2810,8 @@ static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
|
||||
static void hns3_free_buffer(struct hns3_enet_ring *ring,
|
||||
struct hns3_desc_cb *cb, int budget)
|
||||
{
|
||||
- if (cb->type & DESC_TYPE_SKB)
|
||||
+ if (cb->type & (DESC_TYPE_SKB | DESC_TYPE_BOUNCE_HEAD |
|
||||
+ DESC_TYPE_BOUNCE_ALL))
|
||||
napi_consume_skb(cb->priv, budget);
|
||||
else if (!HNAE3_IS_TX_RING(ring) && cb->pagecnt_bias)
|
||||
__page_frag_cache_drain(cb->priv, cb->pagecnt_bias);
|
||||
@@ -2576,9 +2835,11 @@ static void hns3_unmap_buffer(struct hns3_enet_ring *ring,
|
||||
if (cb->type & (DESC_TYPE_SKB | DESC_TYPE_FRAGLIST_SKB))
|
||||
dma_unmap_single(ring_to_dev(ring), cb->dma, cb->length,
|
||||
ring_to_dma_dir(ring));
|
||||
- else if (cb->length)
|
||||
+ else if ((cb->type & DESC_TYPE_PAGE) && cb->length)
|
||||
dma_unmap_page(ring_to_dev(ring), cb->dma, cb->length,
|
||||
ring_to_dma_dir(ring));
|
||||
+ else if (cb->type & (DESC_TYPE_BOUNCE_ALL | DESC_TYPE_BOUNCE_HEAD))
|
||||
+ hns3_tx_spare_reclaim_cb(ring, cb);
|
||||
}
|
||||
|
||||
static void hns3_buffer_detach(struct hns3_enet_ring *ring, int i)
|
||||
@@ -2729,7 +2990,8 @@ static bool hns3_nic_reclaim_desc(struct hns3_enet_ring *ring,
|
||||
|
||||
desc_cb = &ring->desc_cb[ntc];
|
||||
|
||||
- if (desc_cb->type & DESC_TYPE_SKB) {
|
||||
+ if (desc_cb->type & (DESC_TYPE_SKB | DESC_TYPE_BOUNCE_ALL |
|
||||
+ DESC_TYPE_BOUNCE_HEAD)) {
|
||||
(*pkts)++;
|
||||
(*bytes) += desc_cb->send_bytes;
|
||||
}
|
||||
@@ -2752,6 +3014,9 @@ static bool hns3_nic_reclaim_desc(struct hns3_enet_ring *ring,
|
||||
* ring_space called by hns3_nic_net_xmit.
|
||||
*/
|
||||
smp_store_release(&ring->next_to_clean, ntc);
|
||||
+
|
||||
+ hns3_tx_spare_update(ring);
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3960,7 +4225,8 @@ static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
||||
ring = &priv->ring[q->tqp_index];
|
||||
desc_num = priv->ae_handle->kinfo.num_tx_desc;
|
||||
ring->queue_index = q->tqp_index;
|
||||
- ring->io_base = (u8 __iomem *)q->io_base + HNS3_TX_REG_OFFSET;
|
||||
+ ring->tx_copybreak = priv->tx_copybreak;
|
||||
+ ring->last_to_use = 0;
|
||||
} else {
|
||||
ring = &priv->ring[q->tqp_index + queue_num];
|
||||
desc_num = priv->ae_handle->kinfo.num_rx_desc;
|
||||
@@ -3979,7 +4245,6 @@ static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
||||
ring->desc_num = desc_num;
|
||||
ring->next_to_use = 0;
|
||||
ring->next_to_clean = 0;
|
||||
- ring->last_to_use = 0;
|
||||
}
|
||||
|
||||
static void hns3_queue_to_ring(struct hnae3_queue *tqp,
|
||||
@@ -4039,6 +4304,8 @@ static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring)
|
||||
ret = hns3_alloc_ring_buffers(ring);
|
||||
if (ret)
|
||||
goto out_with_desc;
|
||||
+ } else {
|
||||
+ hns3_init_tx_spare_buffer(ring);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -4061,9 +4328,18 @@ void hns3_fini_ring(struct hns3_enet_ring *ring)
|
||||
ring->next_to_use = 0;
|
||||
ring->last_to_use = 0;
|
||||
ring->pending_buf = 0;
|
||||
- if (ring->skb) {
|
||||
+ if (!HNAE3_IS_TX_RING(ring) && ring->skb) {
|
||||
dev_kfree_skb_any(ring->skb);
|
||||
ring->skb = NULL;
|
||||
+ } else if (HNAE3_IS_TX_RING(ring) && ring->tx_spare) {
|
||||
+ struct hns3_tx_spare *tx_spare = ring->tx_spare;
|
||||
+
|
||||
+ dma_unmap_page(ring_to_dev(ring), tx_spare->dma, tx_spare->len,
|
||||
+ DMA_TO_DEVICE);
|
||||
+ free_pages((unsigned long)tx_spare->buf,
|
||||
+ get_order(tx_spare->len));
|
||||
+ devm_kfree(ring_to_dev(ring), tx_spare);
|
||||
+ ring->tx_spare = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 4b035c458a58..7d0d9c3eb53c 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -302,6 +302,8 @@ enum hns3_desc_type {
|
||||
DESC_TYPE_SKB = 1 << 0,
|
||||
DESC_TYPE_FRAGLIST_SKB = 1 << 1,
|
||||
DESC_TYPE_PAGE = 1 << 2,
|
||||
+ DESC_TYPE_BOUNCE_ALL = 1 << 3,
|
||||
+ DESC_TYPE_BOUNCE_HEAD = 1 << 4,
|
||||
};
|
||||
|
||||
struct hns3_desc_cb {
|
||||
@@ -395,6 +397,9 @@ struct ring_stats {
|
||||
u64 tx_tso_err;
|
||||
u64 over_max_recursion;
|
||||
u64 hw_limitation;
|
||||
+ u64 tx_bounce;
|
||||
+ u64 tx_spare_full;
|
||||
+ u64 copy_bits_err;
|
||||
};
|
||||
struct {
|
||||
u64 rx_pkts;
|
||||
@@ -411,6 +416,15 @@ struct ring_stats {
|
||||
};
|
||||
};
|
||||
|
||||
+struct hns3_tx_spare {
|
||||
+ dma_addr_t dma;
|
||||
+ void *buf;
|
||||
+ u32 next_to_use;
|
||||
+ u32 next_to_clean;
|
||||
+ u32 last_to_clean;
|
||||
+ u32 len;
|
||||
+};
|
||||
+
|
||||
struct hns3_enet_ring {
|
||||
u8 __iomem *io_base; /* base io address for the ring */
|
||||
struct hns3_desc *desc; /* dma map address space */
|
||||
@@ -434,18 +448,28 @@ struct hns3_enet_ring {
|
||||
* next_to_use
|
||||
*/
|
||||
int next_to_clean;
|
||||
- union {
|
||||
- int last_to_use; /* last idx used by xmit */
|
||||
- u32 pull_len; /* memcpy len for current rx packet */
|
||||
- };
|
||||
- u32 frag_num;
|
||||
- void *va; /* first buffer address for current packet */
|
||||
-
|
||||
u32 flag; /* ring attribute */
|
||||
|
||||
int pending_buf;
|
||||
- struct sk_buff *skb;
|
||||
- struct sk_buff *tail_skb;
|
||||
+ union {
|
||||
+ /* for Tx ring */
|
||||
+ struct {
|
||||
+ u32 fd_qb_tx_sample;
|
||||
+ int last_to_use; /* last idx used by xmit */
|
||||
+ u32 tx_copybreak;
|
||||
+ struct hns3_tx_spare *tx_spare;
|
||||
+ };
|
||||
+
|
||||
+ /* for Rx ring */
|
||||
+ struct {
|
||||
+ u32 pull_len; /* memcpy len for current rx packet */
|
||||
+ u32 frag_num;
|
||||
+ /* first buffer address for current packet */
|
||||
+ unsigned char *va;
|
||||
+ struct sk_buff *skb;
|
||||
+ struct sk_buff *tail_skb;
|
||||
+ };
|
||||
+ };
|
||||
} ____cacheline_internodealigned_in_smp;
|
||||
|
||||
enum hns3_flow_level_range {
|
||||
@@ -524,6 +548,7 @@ struct hns3_nic_priv {
|
||||
|
||||
struct hns3_enet_coalesce tx_coal;
|
||||
struct hns3_enet_coalesce rx_coal;
|
||||
+ u32 tx_copybreak;
|
||||
};
|
||||
|
||||
union l3_hdr_info {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index ae22adfe5740..5b5780a59d3e 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -50,6 +50,9 @@ static const struct hns3_stats hns3_txq_stats[] = {
|
||||
HNS3_TQP_STAT("tso_err", tx_tso_err),
|
||||
HNS3_TQP_STAT("over_max_recursion", over_max_recursion),
|
||||
HNS3_TQP_STAT("hw_limitation", hw_limitation),
|
||||
+ HNS3_TQP_STAT("bounce", tx_bounce),
|
||||
+ HNS3_TQP_STAT("spare_full", tx_spare_full),
|
||||
+ HNS3_TQP_STAT("copy_bits_err", copy_bits_err),
|
||||
};
|
||||
|
||||
#define HNS3_TXQ_STATS_COUNT ARRAY_SIZE(hns3_txq_stats)
|
||||
@@ -1604,6 +1607,50 @@ static int hns3_set_priv_flags(struct net_device *netdev, u32 pflags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int hns3_get_tunable(struct net_device *netdev,
|
||||
+ const struct ethtool_tunable *tuna,
|
||||
+ void *data)
|
||||
+{
|
||||
+ struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ switch (tuna->id) {
|
||||
+ case ETHTOOL_TX_COPYBREAK:
|
||||
+ /* all the tx rings have the same tx_copybreak */
|
||||
+ *(u32 *)data = priv->tx_copybreak;
|
||||
+ break;
|
||||
+ default:
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int hns3_set_tunable(struct net_device *netdev,
|
||||
+ const struct ethtool_tunable *tuna,
|
||||
+ const void *data)
|
||||
+{
|
||||
+ struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
+ struct hnae3_handle *h = priv->ae_handle;
|
||||
+ int i, ret = 0;
|
||||
+
|
||||
+ switch (tuna->id) {
|
||||
+ case ETHTOOL_TX_COPYBREAK:
|
||||
+ priv->tx_copybreak = *(u32 *)data;
|
||||
+
|
||||
+ for (i = 0; i < h->kinfo.num_tqps; i++)
|
||||
+ priv->ring[i].tx_copybreak = priv->tx_copybreak;
|
||||
+
|
||||
+ break;
|
||||
+ default:
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
#define HNS3_ETHTOOL_COALESCE (ETHTOOL_COALESCE_USECS | \
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE | \
|
||||
ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
@@ -1647,6 +1694,8 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
.set_msglevel = hns3_set_msglevel,
|
||||
.get_priv_flags = hns3_get_priv_flags,
|
||||
.set_priv_flags = hns3_set_priv_flags,
|
||||
+ .get_tunable = hns3_get_tunable,
|
||||
+ .set_tunable = hns3_set_tunable,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
@@ -1686,6 +1735,8 @@ static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
.get_priv_flags = hns3_get_priv_flags,
|
||||
.set_priv_flags = hns3_set_priv_flags,
|
||||
.get_ts_info = hns3_get_ts_info,
|
||||
+ .get_tunable = hns3_get_tunable,
|
||||
+ .set_tunable = hns3_set_tunable,
|
||||
};
|
||||
|
||||
void hns3_ethtool_set_ops(struct net_device *netdev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,172 @@
|
||||
From 246537a68b01bb2e12a9251437731d92eaa32905 Mon Sep 17 00:00:00 2001
|
||||
From: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:24 +0800
|
||||
Subject: [PATCH 089/283] net: hns3: add support to query tx spare buffer size
|
||||
for pf
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 1a00197b7d2fe57f0be93037d5090e19a9b178c8
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1a00197b7d2fe57f0be93037d5090e19a9b178c8
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Add support to query tx spare buffer size from configuration
|
||||
file, and use this info to do spare buffer initialization when
|
||||
the module parameter 'tx_spare_buf_size' is not specified.
|
||||
|
||||
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 3 +++
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 7 +++++--
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 ++++
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 15 +++++++++++++++
|
||||
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 4 ++++
|
||||
5 files changed, 31 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
index 738baccf5a8a..58022716456d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
@@ -801,6 +801,9 @@ struct hnae3_knic_private_info {
|
||||
u16 rx_buf_len;
|
||||
u16 num_tx_desc;
|
||||
u16 num_rx_desc;
|
||||
+#ifndef __GENKSYMS__
|
||||
+ u32 tx_spare_buf_size;
|
||||
+#endif
|
||||
|
||||
struct hnae3_tc_info tc_info;
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index fd800aa35f3e..6fbc211facbb 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -709,13 +709,16 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
||||
{
|
||||
struct hns3_tx_spare *tx_spare;
|
||||
struct page *page;
|
||||
+ u32 alloc_size;
|
||||
dma_addr_t dma;
|
||||
int order;
|
||||
|
||||
- if (!tx_spare_buf_size)
|
||||
+ alloc_size = tx_spare_buf_size ? tx_spare_buf_size :
|
||||
+ ring->tqp->handle->kinfo.tx_spare_buf_size;
|
||||
+ if (!alloc_size)
|
||||
return;
|
||||
|
||||
- order = get_order(tx_spare_buf_size);
|
||||
+ order = get_order(alloc_size);
|
||||
tx_spare = devm_kzalloc(ring_to_dev(ring), sizeof(*tx_spare),
|
||||
GFP_KERNEL);
|
||||
if (!tx_spare) {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index ba10e18ddb7e..08e02c1c6eb2 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -534,6 +534,10 @@ struct hclge_pf_res_cmd {
|
||||
#define HCLGE_CFG_VLAN_FLTR_CAP_M GENMASK(9, 8)
|
||||
#define HCLGE_CFG_UMV_TBL_SPACE_S 16
|
||||
#define HCLGE_CFG_UMV_TBL_SPACE_M GENMASK(31, 16)
|
||||
+#define HCLGE_CFG_PF_RSS_SIZE_S 0
|
||||
+#define HCLGE_CFG_PF_RSS_SIZE_M GENMASK(3, 0)
|
||||
+#define HCLGE_CFG_TX_SPARE_BUF_SIZE_S 4
|
||||
+#define HCLGE_CFG_TX_SPARE_BUF_SIZE_M GENMASK(15, 4)
|
||||
|
||||
#define HCLGE_CFG_CMD_CNT 4
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index d46a1d31c701..047423fd4084 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -1256,6 +1256,8 @@ static u32 hclge_get_max_speed(u8 speed_ability)
|
||||
|
||||
static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
|
||||
{
|
||||
+#define HCLGE_TX_SPARE_SIZE_UNIT 4096
|
||||
+
|
||||
struct hclge_cfg_param_cmd *req;
|
||||
u64 mac_addr_tmp_high;
|
||||
u64 mac_addr_tmp;
|
||||
@@ -1313,6 +1315,15 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
|
||||
HCLGE_CFG_UMV_TBL_SPACE_S);
|
||||
if (!cfg->umv_space)
|
||||
cfg->umv_space = HCLGE_DEFAULT_UMV_SPACE_PER_PF;
|
||||
+
|
||||
+ /* The unit of the tx spare buffer size queried from configuration
|
||||
+ * file is HCLGE_TX_SPARE_SIZE_UNIT(4096) bytes, so a conversion is
|
||||
+ * needed here.
|
||||
+ */
|
||||
+ cfg->tx_spare_buf_size = hnae3_get_field(__le32_to_cpu(req->param[2]),
|
||||
+ HCLGE_CFG_TX_SPARE_BUF_SIZE_M,
|
||||
+ HCLGE_CFG_TX_SPARE_BUF_SIZE_S);
|
||||
+ cfg->tx_spare_buf_size *= HCLGE_TX_SPARE_SIZE_UNIT;
|
||||
}
|
||||
|
||||
/* hclge_get_cfg: query the static parameter from flash
|
||||
@@ -1471,6 +1482,7 @@ static int hclge_configure(struct hclge_dev *hdev)
|
||||
hdev->tc_max = cfg.tc_num;
|
||||
hdev->tm_info.hw_pfc_map = 0;
|
||||
hdev->wanted_umv_size = cfg.umv_space;
|
||||
+ hdev->tx_spare_buf_size = cfg.tx_spare_buf_size;
|
||||
if (cfg.vlan_fliter_cap == HCLGE_VLAN_FLTR_CAN_MDF)
|
||||
hnae3_set_bit(ae_dev->flag,
|
||||
HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, 1);
|
||||
@@ -1658,6 +1670,7 @@ static int hclge_knic_setup(struct hclge_vport *vport, u16 num_tqps,
|
||||
kinfo->num_rx_desc = num_rx_desc;
|
||||
|
||||
kinfo->rx_buf_len = hdev->rx_buf_len;
|
||||
+ kinfo->tx_spare_buf_size = hdev->tx_spare_buf_size;
|
||||
|
||||
kinfo->tqp = devm_kcalloc(&hdev->pdev->dev, num_tqps,
|
||||
sizeof(struct hnae3_queue *), GFP_KERNEL);
|
||||
@@ -10274,6 +10287,8 @@ static void hclge_info_show(struct hclge_dev *hdev)
|
||||
hdev->flag & HCLGE_FLAG_DCB_ENABLE ? "enable" : "disable");
|
||||
dev_info(dev, "MQPRIO %s\n",
|
||||
hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE ? "enable" : "disable");
|
||||
+ dev_info(dev, "Default tx spare buffer size: %u\n",
|
||||
+ hdev->tx_spare_buf_size);
|
||||
|
||||
dev_info(dev, "PF info end.\n");
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 660201b8bd11..07a1e7ed734b 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -382,6 +382,7 @@ struct hclge_cfg {
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
u8 default_speed;
|
||||
u32 numa_node_map;
|
||||
+ u32 tx_spare_buf_size;
|
||||
u8 speed_ability;
|
||||
u16 umv_space;
|
||||
};
|
||||
@@ -788,6 +789,9 @@ struct hclge_dev {
|
||||
u16 base_tqp_pid; /* Base task tqp physical id of this PF */
|
||||
u16 alloc_rss_size; /* Allocated RSS task queue */
|
||||
u16 rss_size_max; /* HW defined max RSS task queue */
|
||||
+ u16 vf_rss_size_max; /* HW defined VF max RSS task queue */
|
||||
+ u16 pf_rss_size_max; /* HW defined PF max RSS task queue */
|
||||
+ u32 tx_spare_buf_size; /* HW defined TX spare buffer size */
|
||||
|
||||
u16 fdir_pf_filter_count; /* Num of guaranteed filters for this PF */
|
||||
u16 num_alloc_vport; /* Num vports this driver supports */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,276 @@
|
||||
From 1f7cc1d8d8904beb52079cf0fc7ae819161bb0ed Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:25 +0800
|
||||
Subject: [PATCH 090/283] net: hns3: support dma_map_sg() for multi frags skb
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 7459775e9f658a2d5f3ff9d4d087e86f4d4e5b83
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7459775e9f658a2d5f3ff9d4d087e86f4d4e5b83
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Using the queue based tx buffer, it is also possible to allocate a
|
||||
sgl buffer, and use skb_to_sgvec() to convert the skb to the sgvec
|
||||
in order to support the dma_map_sg() to decreases the overhead of
|
||||
IOMMU mapping and unmapping.
|
||||
|
||||
Firstly, it reduces the number of buffers. For example, a tcp skb
|
||||
may have a 66-byte header and 3 fragments of 4328, 32768, and 28064
|
||||
bytes. With this patch, dma_map_sg() will combine them into two
|
||||
buffers, 66-bytes header and one 65160-bytes fragment by using IOMMU.
|
||||
|
||||
Secondly, it reduces the number of dma mapping and unmapping. All the
|
||||
original 4 buffers are mapped only once rather than 4 times.
|
||||
|
||||
The throughput improves above 10% when running single thread of iperf
|
||||
using TCP when IOMMU is in strict mode.
|
||||
|
||||
Suggested-by: Barry Song <song.bao.hua@hisilicon.com>
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 111 +++++++++++++++++-
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 4 +
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 3 +
|
||||
3 files changed, 113 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 6fbc211facbb..5bb5b8a5e5a0 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -56,6 +56,15 @@ static unsigned int tx_spare_buf_size;
|
||||
module_param(tx_spare_buf_size, uint, 0400);
|
||||
MODULE_PARM_DESC(tx_spare_buf_size, "Size used to allocate tx spare buffer");
|
||||
|
||||
+static unsigned int tx_sgl = 1;
|
||||
+module_param(tx_sgl, uint, 0600);
|
||||
+MODULE_PARM_DESC(tx_sgl, "Minimum number of frags when using dma_map_sg() to optimize the IOMMU mapping");
|
||||
+
|
||||
+#define HNS3_SGL_SIZE(nfrag) (sizeof(struct scatterlist) * (nfrag) + \
|
||||
+ sizeof(struct sg_table))
|
||||
+#define HNS3_MAX_SGL_SIZE ALIGN(HNS3_SGL_SIZE(HNS3_MAX_TSO_BD_NUM),\
|
||||
+ dma_get_cache_alignment())
|
||||
+
|
||||
#define DEFAULT_MSG_LEVEL (NETIF_MSG_PROBE | NETIF_MSG_LINK | \
|
||||
NETIF_MSG_IFDOWN | NETIF_MSG_IFUP)
|
||||
|
||||
@@ -705,6 +714,25 @@ static bool hns3_can_use_tx_bounce(struct hns3_enet_ring *ring,
|
||||
return true;
|
||||
}
|
||||
|
||||
+static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring,
|
||||
+ struct sk_buff *skb,
|
||||
+ u32 space)
|
||||
+{
|
||||
+ if (skb->len <= ring->tx_copybreak || !tx_sgl ||
|
||||
+ (!skb_has_frag_list(skb) &&
|
||||
+ skb_shinfo(skb)->nr_frags < tx_sgl))
|
||||
+ return false;
|
||||
+
|
||||
+ if (space < HNS3_MAX_SGL_SIZE) {
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.tx_spare_full++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
||||
{
|
||||
struct hns3_tx_spare *tx_spare;
|
||||
@@ -812,14 +840,19 @@ static void hns3_tx_spare_reclaim_cb(struct hns3_enet_ring *ring,
|
||||
|
||||
/* This tx spare buffer is only really reclaimed after calling
|
||||
* hns3_tx_spare_update(), so it is still safe to use the info in
|
||||
- * the tx buffer to do the dma sync after tx_spare->next_to_clean
|
||||
- * is moved forword.
|
||||
+ * the tx buffer to do the dma sync or sg unmapping after
|
||||
+ * tx_spare->next_to_clean is moved forword.
|
||||
*/
|
||||
if (cb->type & (DESC_TYPE_BOUNCE_HEAD | DESC_TYPE_BOUNCE_ALL)) {
|
||||
dma_addr_t dma = tx_spare->dma + ntc;
|
||||
|
||||
dma_sync_single_for_cpu(ring_to_dev(ring), dma, len,
|
||||
DMA_TO_DEVICE);
|
||||
+ } else {
|
||||
+ struct sg_table *sgt = tx_spare->buf + ntc;
|
||||
+
|
||||
+ dma_unmap_sg(ring_to_dev(ring), sgt->sgl, sgt->orig_nents,
|
||||
+ DMA_TO_DEVICE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1769,6 +1802,65 @@ static int hns3_handle_tx_bounce(struct hns3_enet_ring *ring,
|
||||
return bd_num;
|
||||
}
|
||||
|
||||
+static int hns3_handle_tx_sgl(struct hns3_enet_ring *ring,
|
||||
+ struct sk_buff *skb)
|
||||
+{
|
||||
+ struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
|
||||
+ u32 nfrag = skb_shinfo(skb)->nr_frags + 1;
|
||||
+ struct sg_table *sgt;
|
||||
+ int i, bd_num = 0;
|
||||
+ dma_addr_t dma;
|
||||
+ u32 cb_len;
|
||||
+ int nents;
|
||||
+
|
||||
+ if (skb_has_frag_list(skb))
|
||||
+ nfrag = HNS3_MAX_TSO_BD_NUM;
|
||||
+
|
||||
+ /* hns3_can_use_tx_sgl() is called to ensure the below
|
||||
+ * function can always return the tx buffer.
|
||||
+ */
|
||||
+ sgt = hns3_tx_spare_alloc(ring, HNS3_SGL_SIZE(nfrag),
|
||||
+ &dma, &cb_len);
|
||||
+
|
||||
+ /* scatterlist follows by the sg table */
|
||||
+ sgt->sgl = (struct scatterlist *)(sgt + 1);
|
||||
+ sg_init_table(sgt->sgl, nfrag);
|
||||
+ nents = skb_to_sgvec(skb, sgt->sgl, 0, skb->len);
|
||||
+ if (unlikely(nents < 0)) {
|
||||
+ hns3_tx_spare_rollback(ring, cb_len);
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.skb2sgl_err++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ sgt->orig_nents = nents;
|
||||
+ sgt->nents = dma_map_sg(ring_to_dev(ring), sgt->sgl, sgt->orig_nents,
|
||||
+ DMA_TO_DEVICE);
|
||||
+ if (unlikely(!sgt->nents)) {
|
||||
+ hns3_tx_spare_rollback(ring, cb_len);
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.map_sg_err++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ desc_cb->priv = skb;
|
||||
+ desc_cb->length = cb_len;
|
||||
+ desc_cb->dma = dma;
|
||||
+ desc_cb->type = DESC_TYPE_SGL_SKB;
|
||||
+
|
||||
+ for (i = 0; i < sgt->nents; i++)
|
||||
+ bd_num += hns3_fill_desc(ring, sg_dma_address(sgt->sgl + i),
|
||||
+ sg_dma_len(sgt->sgl + i));
|
||||
+
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.tx_sgl++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+
|
||||
+ return bd_num;
|
||||
+}
|
||||
+
|
||||
static int hns3_handle_desc_filling(struct hns3_enet_ring *ring,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
@@ -1779,6 +1871,9 @@ static int hns3_handle_desc_filling(struct hns3_enet_ring *ring,
|
||||
|
||||
space = hns3_tx_spare_space(ring);
|
||||
|
||||
+ if (hns3_can_use_tx_sgl(ring, skb, space))
|
||||
+ return hns3_handle_tx_sgl(ring, skb);
|
||||
+
|
||||
if (hns3_can_use_tx_bounce(ring, skb, space))
|
||||
return hns3_handle_tx_bounce(ring, skb);
|
||||
|
||||
@@ -2038,6 +2133,8 @@ static struct rtnl_link_stats64 *hns3_nic_get_stats64(struct net_device *netdev,
|
||||
tx_drop += ring->stats.over_max_recursion;
|
||||
tx_drop += ring->stats.hw_limitation;
|
||||
tx_drop += ring->stats.copy_bits_err;
|
||||
+ tx_drop += ring->stats.skb2sgl_err;
|
||||
+ tx_drop += ring->stats.map_sg_err;
|
||||
tx_errors += ring->stats.sw_err_cnt;
|
||||
tx_errors += ring->stats.tx_vlan_err;
|
||||
tx_errors += ring->stats.tx_l4_proto_err;
|
||||
@@ -2046,6 +2143,8 @@ static struct rtnl_link_stats64 *hns3_nic_get_stats64(struct net_device *netdev,
|
||||
tx_errors += ring->stats.over_max_recursion;
|
||||
tx_errors += ring->stats.hw_limitation;
|
||||
tx_errors += ring->stats.copy_bits_err;
|
||||
+ tx_errors += ring->stats.skb2sgl_err;
|
||||
+ tx_errors += ring->stats.map_sg_err;
|
||||
} while (u64_stats_fetch_retry_irq(&ring->syncp, start));
|
||||
|
||||
/* fetch the rx stats */
|
||||
@@ -2814,7 +2913,7 @@ static void hns3_free_buffer(struct hns3_enet_ring *ring,
|
||||
struct hns3_desc_cb *cb, int budget)
|
||||
{
|
||||
if (cb->type & (DESC_TYPE_SKB | DESC_TYPE_BOUNCE_HEAD |
|
||||
- DESC_TYPE_BOUNCE_ALL))
|
||||
+ DESC_TYPE_BOUNCE_ALL | DESC_TYPE_SGL_SKB))
|
||||
napi_consume_skb(cb->priv, budget);
|
||||
else if (!HNAE3_IS_TX_RING(ring) && cb->pagecnt_bias)
|
||||
__page_frag_cache_drain(cb->priv, cb->pagecnt_bias);
|
||||
@@ -2841,7 +2940,8 @@ static void hns3_unmap_buffer(struct hns3_enet_ring *ring,
|
||||
else if ((cb->type & DESC_TYPE_PAGE) && cb->length)
|
||||
dma_unmap_page(ring_to_dev(ring), cb->dma, cb->length,
|
||||
ring_to_dma_dir(ring));
|
||||
- else if (cb->type & (DESC_TYPE_BOUNCE_ALL | DESC_TYPE_BOUNCE_HEAD))
|
||||
+ else if (cb->type & (DESC_TYPE_BOUNCE_ALL | DESC_TYPE_BOUNCE_HEAD |
|
||||
+ DESC_TYPE_SGL_SKB))
|
||||
hns3_tx_spare_reclaim_cb(ring, cb);
|
||||
}
|
||||
|
||||
@@ -2994,7 +3094,8 @@ static bool hns3_nic_reclaim_desc(struct hns3_enet_ring *ring,
|
||||
desc_cb = &ring->desc_cb[ntc];
|
||||
|
||||
if (desc_cb->type & (DESC_TYPE_SKB | DESC_TYPE_BOUNCE_ALL |
|
||||
- DESC_TYPE_BOUNCE_HEAD)) {
|
||||
+ DESC_TYPE_BOUNCE_HEAD |
|
||||
+ DESC_TYPE_SGL_SKB)) {
|
||||
(*pkts)++;
|
||||
(*bytes) += desc_cb->send_bytes;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index 7d0d9c3eb53c..d9a0fa3e8308 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -304,6 +304,7 @@ enum hns3_desc_type {
|
||||
DESC_TYPE_PAGE = 1 << 2,
|
||||
DESC_TYPE_BOUNCE_ALL = 1 << 3,
|
||||
DESC_TYPE_BOUNCE_HEAD = 1 << 4,
|
||||
+ DESC_TYPE_SGL_SKB = 1 << 5,
|
||||
};
|
||||
|
||||
struct hns3_desc_cb {
|
||||
@@ -400,6 +401,9 @@ struct ring_stats {
|
||||
u64 tx_bounce;
|
||||
u64 tx_spare_full;
|
||||
u64 copy_bits_err;
|
||||
+ u64 tx_sgl;
|
||||
+ u64 skb2sgl_err;
|
||||
+ u64 map_sg_err;
|
||||
};
|
||||
struct {
|
||||
u64 rx_pkts;
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 5b5780a59d3e..18627c510617 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -53,6 +53,9 @@ static const struct hns3_stats hns3_txq_stats[] = {
|
||||
HNS3_TQP_STAT("bounce", tx_bounce),
|
||||
HNS3_TQP_STAT("spare_full", tx_spare_full),
|
||||
HNS3_TQP_STAT("copy_bits_err", copy_bits_err),
|
||||
+ HNS3_TQP_STAT("sgl", tx_sgl),
|
||||
+ HNS3_TQP_STAT("skb2sgl_err", skb2sgl_err),
|
||||
+ HNS3_TQP_STAT("map_sg_err", map_sg_err),
|
||||
};
|
||||
|
||||
#define HNS3_TXQ_STATS_COUNT ARRAY_SIZE(hns3_txq_stats)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,245 @@
|
||||
From 1f3e5811640bf5e354b7d19adf5a98c52b4ea81c Mon Sep 17 00:00:00 2001
|
||||
From: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:27 +0800
|
||||
Subject: [PATCH 091/283] net: hns3: use bounce buffer when rx page can not be
|
||||
reused
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 99f6b5fb5f63cf69c6e56bba8e5492c98c521a63
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=99f6b5fb5f63cf69c6e56bba8e5492c98c521a63
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently rx page will be reused to receive future packet when
|
||||
the stack releases the previous skb quickly. If the old page
|
||||
can not be reused, a new page will be allocated and mapped,
|
||||
which comsumes a lot of cpu when IOMMU is in the strict mode,
|
||||
especially when the application and irq/NAPI happens to run on
|
||||
the same cpu.
|
||||
|
||||
So allocate a new frag to memcpy the data to avoid the costly
|
||||
IOMMU unmapping/mapping operation, and add "frag_alloc_err"
|
||||
and "frag_alloc" stats in "ethtool -S ethX" cmd.
|
||||
|
||||
The throughput improves above 50% when running single thread of
|
||||
iperf using TCP when IOMMU is in strict mode and iperf shares the
|
||||
same cpu with irq/NAPI(rx_copybreak = 2048 and mtu = 1500).
|
||||
|
||||
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 4 +-
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 67 ++++++++++++++-----
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 4 ++
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 12 ++++
|
||||
4 files changed, 71 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index 6b2179516fff..91a063ec9105 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -442,7 +442,8 @@ static const struct hns3_dbg_item rx_queue_info_items[] = {
|
||||
{ "TAIL", 2 },
|
||||
{ "HEAD", 2 },
|
||||
{ "FBDNUM", 2 },
|
||||
- { "PKTNUM", 5 },
|
||||
+ { "PKTNUM", 2 },
|
||||
+ { "COPYBREAK", 2 },
|
||||
{ "RING_EN", 2 },
|
||||
{ "RX_RING_EN", 2 },
|
||||
{ "BASE_ADDR", 10 },
|
||||
@@ -474,6 +475,7 @@ static void hns3_dump_rx_queue_info(struct hns3_enet_ring *ring,
|
||||
|
||||
sprintf(result[j++], "%6u", readl_relaxed(ring->tqp->io_base +
|
||||
HNS3_RING_RX_RING_PKTNUM_RECORD_REG));
|
||||
+ sprintf(result[j++], "%9u", ring->rx_copybreak);
|
||||
|
||||
sprintf(result[j++], "%7s", readl_relaxed(ring->tqp->io_base +
|
||||
HNS3_RING_EN_REG) ? "on" : "off");
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
index 5bb5b8a5e5a0..046c696df091 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
||||
@@ -3226,39 +3226,76 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
|
||||
struct hns3_desc_cb *desc_cb)
|
||||
{
|
||||
struct hns3_desc *desc = &ring->desc[ring->next_to_clean];
|
||||
+ u32 frag_offset = desc_cb->page_offset + pull_len;
|
||||
int size = le16_to_cpu(desc->rx.size);
|
||||
u32 truesize = hns3_buf_size(ring);
|
||||
+ u32 frag_size = size - pull_len;
|
||||
+ bool reused;
|
||||
|
||||
- desc_cb->pagecnt_bias--;
|
||||
- skb_add_rx_frag(skb, i, desc_cb->priv, desc_cb->page_offset + pull_len,
|
||||
- size - pull_len, truesize);
|
||||
-
|
||||
- /* Avoid re-using remote pages, or the stack is still using the page
|
||||
- * when page_offset rollback to zero, flag default unreuse
|
||||
- */
|
||||
if (unlikely(!hns3_page_is_reusable(desc_cb->priv)) ||
|
||||
(!desc_cb->page_offset && !hns3_can_reuse_page(desc_cb))) {
|
||||
__page_frag_cache_drain(desc_cb->priv, desc_cb->pagecnt_bias);
|
||||
return;
|
||||
}
|
||||
|
||||
- /* Move offset up to the next cache line */
|
||||
- desc_cb->page_offset += truesize;
|
||||
+ reused = hns3_can_reuse_page(desc_cb);
|
||||
|
||||
- if (desc_cb->page_offset + truesize <= hns3_page_size(ring)) {
|
||||
- desc_cb->reuse_flag = 1;
|
||||
- } else if (hns3_can_reuse_page(desc_cb)) {
|
||||
+ /* Rx page can be reused when:
|
||||
+ * 1. Rx page is only owned by the driver when page_offset
|
||||
+ * is zero, which means 0 @ truesize will be used by
|
||||
+ * stack after skb_add_rx_frag() is called, and the rest
|
||||
+ * of rx page can be reused by driver.
|
||||
+ * Or
|
||||
+ * 2. Rx page is only owned by the driver when page_offset
|
||||
+ * is non-zero, which means page_offset @ truesize will
|
||||
+ * be used by stack after skb_add_rx_frag() is called,
|
||||
+ * and 0 @ truesize can be reused by driver.
|
||||
+ */
|
||||
+ if ((!desc_cb->page_offset && reused) ||
|
||||
+ ((desc_cb->page_offset + truesize + truesize) <=
|
||||
+ hns3_page_size(ring) && desc_cb->page_offset)) {
|
||||
+ desc_cb->page_offset += truesize;
|
||||
desc_cb->reuse_flag = 1;
|
||||
+ } else if (desc_cb->page_offset && reused) {
|
||||
desc_cb->page_offset = 0;
|
||||
- } else if (desc_cb->pagecnt_bias) {
|
||||
- __page_frag_cache_drain(desc_cb->priv, desc_cb->pagecnt_bias);
|
||||
+ desc_cb->reuse_flag = 1;
|
||||
+ } else if (frag_size <= ring->rx_copybreak) {
|
||||
+ void *frag = napi_alloc_frag(frag_size);
|
||||
+
|
||||
+ if (unlikely(!frag)) {
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.frag_alloc_err++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
+
|
||||
+ hns3_rl_err(ring_to_netdev(ring),
|
||||
+ "failed to allocate rx frag\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ desc_cb->reuse_flag = 1;
|
||||
+ memcpy(frag, desc_cb->buf + frag_offset, frag_size);
|
||||
+ skb_add_rx_frag(skb, i, virt_to_page(frag),
|
||||
+ offset_in_page(frag), frag_size, frag_size);
|
||||
+
|
||||
+ u64_stats_update_begin(&ring->syncp);
|
||||
+ ring->stats.frag_alloc++;
|
||||
+ u64_stats_update_end(&ring->syncp);
|
||||
return;
|
||||
}
|
||||
|
||||
+out:
|
||||
+ desc_cb->pagecnt_bias--;
|
||||
+
|
||||
if (unlikely(!desc_cb->pagecnt_bias)) {
|
||||
page_ref_add(desc_cb->priv, USHRT_MAX);
|
||||
desc_cb->pagecnt_bias = USHRT_MAX;
|
||||
}
|
||||
+
|
||||
+ skb_add_rx_frag(skb, i, desc_cb->priv, frag_offset,
|
||||
+ frag_size, truesize);
|
||||
+
|
||||
+ if (unlikely(!desc_cb->reuse_flag))
|
||||
+ __page_frag_cache_drain(desc_cb->priv, desc_cb->pagecnt_bias);
|
||||
}
|
||||
|
||||
static int hns3_gro_complete(struct sk_buff *skb, u32 l234info)
|
||||
@@ -4335,7 +4372,7 @@ static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
||||
ring = &priv->ring[q->tqp_index + queue_num];
|
||||
desc_num = priv->ae_handle->kinfo.num_rx_desc;
|
||||
ring->queue_index = q->tqp_index;
|
||||
- ring->io_base = q->io_base;
|
||||
+ ring->rx_copybreak = priv->rx_copybreak;
|
||||
}
|
||||
|
||||
hnae3_set_bit(ring->flag, HNAE3_RING_TYPE_B, ring_type);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index d9a0fa3e8308..d7238d0744f3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -416,6 +416,8 @@ struct ring_stats {
|
||||
u64 l3l4_csum_err;
|
||||
u64 rx_multicast;
|
||||
u64 non_reuse_pg;
|
||||
+ u64 frag_alloc_err;
|
||||
+ u64 frag_alloc;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -467,6 +469,7 @@ struct hns3_enet_ring {
|
||||
/* for Rx ring */
|
||||
struct {
|
||||
u32 pull_len; /* memcpy len for current rx packet */
|
||||
+ u32 rx_copybreak;
|
||||
u32 frag_num;
|
||||
/* first buffer address for current packet */
|
||||
unsigned char *va;
|
||||
@@ -553,6 +556,7 @@ struct hns3_nic_priv {
|
||||
struct hns3_enet_coalesce tx_coal;
|
||||
struct hns3_enet_coalesce rx_coal;
|
||||
u32 tx_copybreak;
|
||||
+ u32 rx_copybreak;
|
||||
};
|
||||
|
||||
union l3_hdr_info {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 18627c510617..8d73f15be8d6 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -74,6 +74,8 @@ static const struct hns3_stats hns3_rxq_stats[] = {
|
||||
HNS3_TQP_STAT("l3l4_csum_err", l3l4_csum_err),
|
||||
HNS3_TQP_STAT("multicast", rx_multicast),
|
||||
HNS3_TQP_STAT("non_reuse_pg", non_reuse_pg),
|
||||
+ HNS3_TQP_STAT("frag_alloc_err", frag_alloc_err),
|
||||
+ HNS3_TQP_STAT("frag_alloc", frag_alloc),
|
||||
};
|
||||
|
||||
#define HNS3_PRIV_FLAGS_LEN ARRAY_SIZE(hns3_priv_flags)
|
||||
@@ -1622,6 +1624,9 @@ static int hns3_get_tunable(struct net_device *netdev,
|
||||
/* all the tx rings have the same tx_copybreak */
|
||||
*(u32 *)data = priv->tx_copybreak;
|
||||
break;
|
||||
+ case ETHTOOL_RX_COPYBREAK:
|
||||
+ *(u32 *)data = priv->rx_copybreak;
|
||||
+ break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
@@ -1645,6 +1650,13 @@ static int hns3_set_tunable(struct net_device *netdev,
|
||||
for (i = 0; i < h->kinfo.num_tqps; i++)
|
||||
priv->ring[i].tx_copybreak = priv->tx_copybreak;
|
||||
|
||||
+ break;
|
||||
+ case ETHTOOL_RX_COPYBREAK:
|
||||
+ priv->rx_copybreak = *(u32 *)data;
|
||||
+
|
||||
+ for (i = h->kinfo.num_tqps; i < h->kinfo.num_tqps * 2; i++)
|
||||
+ priv->ring[i].rx_copybreak = priv->rx_copybreak;
|
||||
+
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
58
patches/0453-net-hns3-fix-different-snprintf-limit.patch
Normal file
58
patches/0453-net-hns3-fix-different-snprintf-limit.patch
Normal file
@ -0,0 +1,58 @@
|
||||
From 524cc5fcd2276d672246471272e57fe85f68cde0 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:29 +0800
|
||||
Subject: [PATCH 092/283] net: hns3: fix different snprintf() limit
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit faebad853455b7126450c1690f7c31e048213543
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=faebad853455b7126450c1690f7c31e048213543
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
This patch doesn't affect runtime at all, it's just a correctness issue.
|
||||
|
||||
The ptp->info.name[] buffer has 16 characters but the snprintf() limit
|
||||
was capped at 32 characters. Fortunately, HCLGE_DRIVER_NAME is "hclge"
|
||||
which isn't close to 16 characters so we're fine.
|
||||
|
||||
Fixes: 0bf5eb788512 ("net: hns3: add support for PTP")
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
index b3eb8f109dbb..3b1f84502e36 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
@@ -415,8 +415,6 @@ int hclge_ptp_get_ts_info(struct hnae3_handle *handle,
|
||||
|
||||
static int hclge_ptp_create_clock(struct hclge_dev *hdev)
|
||||
{
|
||||
-#define HCLGE_PTP_NAME_LEN 32
|
||||
-
|
||||
struct hclge_ptp *ptp;
|
||||
|
||||
ptp = devm_kzalloc(&hdev->pdev->dev, sizeof(*ptp), GFP_KERNEL);
|
||||
@@ -424,7 +422,7 @@ static int hclge_ptp_create_clock(struct hclge_dev *hdev)
|
||||
return -ENOMEM;
|
||||
|
||||
ptp->hdev = hdev;
|
||||
- snprintf(ptp->info.name, HCLGE_PTP_NAME_LEN, "%s",
|
||||
+ snprintf(ptp->info.name, sizeof(ptp->info.name), "%s",
|
||||
HCLGE_DRIVER_NAME);
|
||||
ptp->info.owner = THIS_MODULE;
|
||||
ptp->info.max_adj = HCLGE_PTP_CYCLE_ADJ_MAX;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
From 3e89e60f27d5085eac6cfbaedbc209c781b486f7 Mon Sep 17 00:00:00 2001
|
||||
From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Date: Sat, 24 Jul 2021 15:45:30 +0800
|
||||
Subject: [PATCH 093/283] net: hns3: Fix a memory leak in an error handling
|
||||
path in 'hclge_handle_error_info_log()'
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit b40d7af798a0a459d65bd95f34e3dff004eb554a
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b40d7af798a0a459d65bd95f34e3dff004eb554a
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
If this 'kzalloc()' fails we must free some resources as in all the other
|
||||
error handling paths of this function.
|
||||
|
||||
Fixes: 2e2deee7618b ("net: hns3: add the RAS compatibility adaptation solution")
|
||||
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Reviewed-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
index a4e9aa9c5d6f..3d3057fed4bb 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
||||
@@ -2333,8 +2333,10 @@ int hclge_handle_error_info_log(struct hnae3_ae_dev *ae_dev)
|
||||
buf_size = buf_len / sizeof(u32);
|
||||
|
||||
desc_data = kzalloc(buf_len, GFP_KERNEL);
|
||||
- if (!desc_data)
|
||||
- return -ENOMEM;
|
||||
+ if (!desc_data) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err_desc;
|
||||
+ }
|
||||
|
||||
buf = kzalloc(buf_len, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,184 @@
|
||||
From 878e201d94598190fdece0eb9df35c2fab61a0e0 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Sat, 24 Jul 2021 15:45:31 +0800
|
||||
Subject: [PATCH 094/283] net: hns3: add support for FD counter in debugfs
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc1
|
||||
commit 03a92fe8cedb6f619df416d38d0b57fd55070cd7
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=03a92fe8cedb6f619df416d38d0b57fd55070cd7
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Previously, the flow director counter is not enabled. To improve the
|
||||
maintainability for chechking whether flow director hit or not, enable
|
||||
flow director counter for each function, and add debugfs query inerface
|
||||
to query the counters for each function.
|
||||
|
||||
The debugfs command is below:
|
||||
cat fd_counter
|
||||
func_id hit_times
|
||||
pf 0
|
||||
vf0 0
|
||||
vf1 0
|
||||
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
||||
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
---
|
||||
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 7 ++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 23 ++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_debugfs.c | 37 +++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 10 ++++-
|
||||
4 files changed, 75 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
index 91a063ec9105..6c2decba5ac4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
||||
@@ -316,6 +316,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
|
||||
.buf_len = HNS3_DBG_READ_LEN,
|
||||
.init = hns3_dbg_common_file_init,
|
||||
},
|
||||
+ {
|
||||
+ .name = "fd_counter",
|
||||
+ .cmd = HNAE3_DBG_CMD_FD_COUNTER,
|
||||
+ .dentry = HNS3_DBG_DENTRY_FD,
|
||||
+ .buf_len = HNS3_DBG_READ_LEN,
|
||||
+ .init = hns3_dbg_common_file_init,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
index 08e02c1c6eb2..75cf58c5f0b3 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
||||
@@ -249,6 +249,8 @@ enum hclge_opcode_type {
|
||||
HCLGE_OPC_FD_KEY_CONFIG = 0x1202,
|
||||
HCLGE_OPC_FD_TCAM_OP = 0x1203,
|
||||
HCLGE_OPC_FD_AD_OP = 0x1204,
|
||||
+ HCLGE_OPC_FD_CNT_OP = 0x1205,
|
||||
+ HCLGE_OPC_FD_USER_DEF_OP = 0x1207,
|
||||
|
||||
/* MDIO command */
|
||||
HCLGE_OPC_MDIO_CONFIG = 0x1900,
|
||||
@@ -1107,6 +1109,27 @@ struct hclge_fd_ad_config_cmd {
|
||||
u8 rsv2[8];
|
||||
};
|
||||
|
||||
+struct hclge_fd_ad_cnt_read_cmd {
|
||||
+ u8 rsv0[4];
|
||||
+ __le16 index;
|
||||
+ u8 rsv1[2];
|
||||
+ __le64 cnt;
|
||||
+ u8 rsv2[8];
|
||||
+};
|
||||
+
|
||||
+#define HCLGE_FD_USER_DEF_OFT_S 0
|
||||
+#define HCLGE_FD_USER_DEF_OFT_M GENMASK(14, 0)
|
||||
+#define HCLGE_FD_USER_DEF_EN_B 15
|
||||
+struct hclge_fd_user_def_cfg_cmd {
|
||||
+ __le16 ol2_cfg;
|
||||
+ __le16 l2_cfg;
|
||||
+ __le16 ol3_cfg;
|
||||
+ __le16 l3_cfg;
|
||||
+ __le16 ol4_cfg;
|
||||
+ __le16 l4_cfg;
|
||||
+ u8 rsv[12];
|
||||
+};
|
||||
+
|
||||
struct hclge_get_imp_bd_cmd {
|
||||
__le32 bd_num;
|
||||
u8 rsv[20];
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
index 0517dedae55f..6350ad7353d1 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
||||
@@ -1629,6 +1629,39 @@ static int hclge_dbg_dump_fd_tcam(struct hclge_dev *hdev, char *buf, int len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int hclge_dbg_dump_fd_counter(struct hclge_dev *hdev, char *buf, int len)
|
||||
+{
|
||||
+ u8 func_num = pci_num_vf(hdev->pdev) + 1; /* pf and enabled vf num */
|
||||
+ struct hclge_fd_ad_cnt_read_cmd *req;
|
||||
+ char str_id[HCLGE_DBG_ID_LEN];
|
||||
+ struct hclge_desc desc;
|
||||
+ int pos = 0;
|
||||
+ int ret;
|
||||
+ u64 cnt;
|
||||
+ u8 i;
|
||||
+
|
||||
+ pos += scnprintf(buf + pos, len - pos,
|
||||
+ "func_id\thit_times\n");
|
||||
+
|
||||
+ for (i = 0; i < func_num; i++) {
|
||||
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_FD_CNT_OP, true);
|
||||
+ req = (struct hclge_fd_ad_cnt_read_cmd *)desc.data;
|
||||
+ req->index = cpu_to_le16(i);
|
||||
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->pdev->dev, "failed to get fd counter, ret = %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ cnt = le64_to_cpu(req->cnt);
|
||||
+ hclge_dbg_get_func_id_str(str_id, i);
|
||||
+ pos += scnprintf(buf + pos, len - pos,
|
||||
+ "%s\t%llu\n", str_id, cnt);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len)
|
||||
{
|
||||
int pos = 0;
|
||||
@@ -2392,6 +2425,10 @@ static const struct hclge_dbg_func hclge_dbg_cmd_func[] = {
|
||||
.cmd = HNAE3_DBG_CMD_VLAN_CONFIG,
|
||||
.dbg_dump = hclge_dbg_dump_vlan_config,
|
||||
},
|
||||
+ {
|
||||
+ .cmd = HNAE3_DBG_CMD_FD_COUNTER,
|
||||
+ .dbg_dump = hclge_dbg_dump_fd_counter,
|
||||
+ },
|
||||
};
|
||||
|
||||
int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd,
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 047423fd4084..7196dd27e230 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -5641,8 +5641,14 @@ static int hclge_config_action(struct hclge_dev *hdev, u8 stage,
|
||||
ad_data.queue_id = rule->queue_id;
|
||||
}
|
||||
|
||||
- ad_data.use_counter = false;
|
||||
- ad_data.counter_id = 0;
|
||||
+ if (hdev->fd_cfg.cnt_num[HCLGE_FD_STAGE_1]) {
|
||||
+ ad_data.use_counter = true;
|
||||
+ ad_data.counter_id = rule->vf_id %
|
||||
+ hdev->fd_cfg.cnt_num[HCLGE_FD_STAGE_1];
|
||||
+ } else {
|
||||
+ ad_data.use_counter = false;
|
||||
+ ad_data.counter_id = 0;
|
||||
+ }
|
||||
|
||||
ad_data.use_next_stage = false;
|
||||
ad_data.next_input_key = 0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
From a0b1a84acf061473902e6fa2abf848e2ff537513 Mon Sep 17 00:00:00 2001
|
||||
From: Jian Shen <shenjian15@huawei.com>
|
||||
Date: Tue, 27 Jul 2021 15:10:37 +0800
|
||||
Subject: [PATCH 095/283] net: hns3: fix rx VLAN offload state inconsistent
|
||||
issue
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc3
|
||||
commit bbfd4506f962e7e6fff8f37f017154a3c3791264
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bbfd4506f962e7e6fff8f37f017154a3c3791264
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, VF doesn't enable rx VLAN offload when initializating,
|
||||
and PF does it for VFs. If user disable the rx VLAN offload for
|
||||
VF with ethtool -K, and reload the VF driver, it may cause the
|
||||
rx VLAN offload state being inconsistent between hardware and
|
||||
software.
|
||||
|
||||
Fixes it by enabling rx VLAN offload when VF initializing.
|
||||
|
||||
Fixes: e2cb1dec9779 ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
|
||||
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
index d58b4e4780a8..4cab9c19031a 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
||||
@@ -2569,6 +2569,16 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
|
||||
|
||||
static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev)
|
||||
{
|
||||
+ struct hnae3_handle *nic = &hdev->nic;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = hclgevf_en_hw_strip_rxvtag(nic, true);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->pdev->dev,
|
||||
+ "failed to enable rx vlan offload, ret = %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
return hclgevf_set_vlan_filter(&hdev->nic, htons(ETH_P_8021Q), 0,
|
||||
false);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,156 @@
|
||||
From 97e76592c5f727ec2475f6052a56bde969232d16 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Fri, 30 Jul 2021 15:43:57 +0800
|
||||
Subject: [PATCH 096/283] net: hns3: change the method of obtaining default ptp
|
||||
cycle
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.14-rc4
|
||||
commit 8373cd38a8888549ace7c7617163a2e826970a92
|
||||
category: bugfix
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8373cd38a8888549ace7c7617163a2e826970a92
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
The ptp cycle is related to the hardware, so it may cause compatibility
|
||||
issues if a fixed value is used in driver. Therefore, the method of
|
||||
obtaining this value is changed to read from the register rather than
|
||||
use a fixed value in driver.
|
||||
|
||||
Fixes: 0bf5eb788512 ("net: hns3: add support for PTP")
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../hisilicon/hns3/hns3pf/hclge_ptp.c | 36 +++++++++++++++----
|
||||
.../hisilicon/hns3/hns3pf/hclge_ptp.h | 10 ++++--
|
||||
2 files changed, 37 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
index 3b1f84502e36..befa9bcc2f2f 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c
|
||||
@@ -5,9 +5,27 @@
|
||||
#include "hclge_main.h"
|
||||
#include "hnae3.h"
|
||||
|
||||
+static int hclge_ptp_get_cycle(struct hclge_dev *hdev)
|
||||
+{
|
||||
+ struct hclge_ptp *ptp = hdev->ptp;
|
||||
+
|
||||
+ ptp->cycle.quo = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG) &
|
||||
+ HCLGE_PTP_CYCLE_QUO_MASK;
|
||||
+ ptp->cycle.numer = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG);
|
||||
+ ptp->cycle.den = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG);
|
||||
+
|
||||
+ if (ptp->cycle.den == 0) {
|
||||
+ dev_err(&hdev->pdev->dev, "invalid ptp cycle denominator!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int hclge_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
||||
{
|
||||
struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp);
|
||||
+ struct hclge_ptp_cycle *cycle = &hdev->ptp->cycle;
|
||||
u64 adj_val, adj_base, diff;
|
||||
unsigned long flags;
|
||||
bool is_neg = false;
|
||||
@@ -18,7 +36,7 @@ static int hclge_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
||||
is_neg = true;
|
||||
}
|
||||
|
||||
- adj_base = HCLGE_PTP_CYCLE_ADJ_BASE * HCLGE_PTP_CYCLE_ADJ_UNIT;
|
||||
+ adj_base = (u64)cycle->quo * (u64)cycle->den + (u64)cycle->numer;
|
||||
adj_val = adj_base * ppb;
|
||||
diff = div_u64(adj_val, 1000000000ULL);
|
||||
|
||||
@@ -29,16 +47,16 @@ static int hclge_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
||||
|
||||
/* This clock cycle is defined by three part: quotient, numerator
|
||||
* and denominator. For example, 2.5ns, the quotient is 2,
|
||||
- * denominator is fixed to HCLGE_PTP_CYCLE_ADJ_UNIT, and numerator
|
||||
- * is 0.5 * HCLGE_PTP_CYCLE_ADJ_UNIT.
|
||||
+ * denominator is fixed to ptp->cycle.den, and numerator
|
||||
+ * is 0.5 * ptp->cycle.den.
|
||||
*/
|
||||
- quo = div_u64_rem(adj_val, HCLGE_PTP_CYCLE_ADJ_UNIT, &numerator);
|
||||
+ quo = div_u64_rem(adj_val, cycle->den, &numerator);
|
||||
|
||||
spin_lock_irqsave(&hdev->ptp->lock, flags);
|
||||
- writel(quo, hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG);
|
||||
+ writel(quo & HCLGE_PTP_CYCLE_QUO_MASK,
|
||||
+ hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG);
|
||||
writel(numerator, hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG);
|
||||
- writel(HCLGE_PTP_CYCLE_ADJ_UNIT,
|
||||
- hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG);
|
||||
+ writel(cycle->den, hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG);
|
||||
writel(HCLGE_PTP_CYCLE_ADJ_EN,
|
||||
hdev->ptp->io_base + HCLGE_PTP_CYCLE_CFG_REG);
|
||||
spin_unlock_irqrestore(&hdev->ptp->lock, flags);
|
||||
@@ -475,6 +493,10 @@ int hclge_ptp_init(struct hclge_dev *hdev)
|
||||
ret = hclge_ptp_create_clock(hdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
+
|
||||
+ ret = hclge_ptp_get_cycle(hdev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
ret = hclge_ptp_int_en(hdev, true);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
index 5a202b775471..dbf5f4c08019 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#define HCLGE_PTP_TIME_ADJ_REG 0x60
|
||||
#define HCLGE_PTP_TIME_ADJ_EN BIT(0)
|
||||
#define HCLGE_PTP_CYCLE_QUO_REG 0x64
|
||||
+#define HCLGE_PTP_CYCLE_QUO_MASK GENMASK(7, 0)
|
||||
#define HCLGE_PTP_CYCLE_DEN_REG 0x68
|
||||
#define HCLGE_PTP_CYCLE_NUM_REG 0x6C
|
||||
#define HCLGE_PTP_CYCLE_CFG_REG 0x70
|
||||
@@ -37,9 +38,7 @@
|
||||
#define HCLGE_PTP_CUR_TIME_SEC_L_REG 0x78
|
||||
#define HCLGE_PTP_CUR_TIME_NSEC_REG 0x7C
|
||||
|
||||
-#define HCLGE_PTP_CYCLE_ADJ_BASE 2
|
||||
#define HCLGE_PTP_CYCLE_ADJ_MAX 500000000
|
||||
-#define HCLGE_PTP_CYCLE_ADJ_UNIT 100000000
|
||||
#define HCLGE_PTP_SEC_H_OFFSET 32u
|
||||
#define HCLGE_PTP_SEC_L_MASK GENMASK(31, 0)
|
||||
|
||||
@@ -47,6 +46,12 @@
|
||||
#define HCLGE_PTP_FLAG_TX_EN 1
|
||||
#define HCLGE_PTP_FLAG_RX_EN 2
|
||||
|
||||
+struct hclge_ptp_cycle {
|
||||
+ u32 quo;
|
||||
+ u32 numer;
|
||||
+ u32 den;
|
||||
+};
|
||||
+
|
||||
struct hclge_ptp {
|
||||
struct hclge_dev *hdev;
|
||||
struct ptp_clock *clock;
|
||||
@@ -58,6 +63,7 @@ struct hclge_ptp {
|
||||
spinlock_t lock; /* protects ptp registers */
|
||||
u32 ptp_cfg;
|
||||
u32 last_tx_seqid;
|
||||
+ struct hclge_ptp_cycle cycle;
|
||||
unsigned long tx_start;
|
||||
unsigned long tx_cnt;
|
||||
unsigned long tx_skipped;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,171 @@
|
||||
From a239416d71310c1163a9ea05016aabcb6d8cdd25 Mon Sep 17 00:00:00 2001
|
||||
From: Yufeng Mo <moyufeng@huawei.com>
|
||||
Date: Sat, 21 Aug 2021 17:00:37 +0800
|
||||
Subject: [PATCH 097/283] net: hns3: add support for triggering reset by
|
||||
ethtool
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.15-rc1
|
||||
commit ddccc5e368a33daeb6862192d4dca8e59af9234a
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ddccc5e368a33daeb6862192d4dca8e59af9234a
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Currently, four reset types are supported for the HNS3 ethernet
|
||||
driver: IMP reset, global reset, function reset, and FLR. Only
|
||||
FLR can now be triggered by the user. To restore the device when
|
||||
an exception occurs, add support for triggering reset by ethtool.
|
||||
|
||||
Run the "ethtool --reset DEVNAME mgmt | all | dedicated" to
|
||||
trigger the IMP | global | function reset manually.
|
||||
|
||||
In addition, VF can only trigger function reset.
|
||||
|
||||
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Link: https://lore.kernel.org/r/1628602128-15640-1-git-send-email-huangguangbin2@huawei.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
---
|
||||
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 5 ++
|
||||
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 56 +++++++++++++++++++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.c | 6 ++
|
||||
.../hisilicon/hns3/hns3pf/hclge_main.h | 1 +
|
||||
4 files changed, 68 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
index d7238d0744f3..416c0c44b11d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
||||
@@ -577,6 +577,11 @@ struct hns3_hw_error_info {
|
||||
const char *msg;
|
||||
};
|
||||
|
||||
+struct hns3_reset_type_map {
|
||||
+ enum ethtool_reset_flags rst_flags;
|
||||
+ enum hnae3_reset_type rst_type;
|
||||
+};
|
||||
+
|
||||
static inline int ring_space(struct hns3_enet_ring *ring)
|
||||
{
|
||||
/* This smp_load_acquire() pairs with smp_store_release() in
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
index 8d73f15be8d6..4197d40471f4 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
||||
@@ -965,6 +965,60 @@ static int hns3_get_rxnfc(struct net_device *netdev,
|
||||
}
|
||||
}
|
||||
|
||||
+static const struct hns3_reset_type_map hns3_reset_type[] = {
|
||||
+ {ETH_RESET_MGMT, HNAE3_IMP_RESET},
|
||||
+ {ETH_RESET_ALL, HNAE3_GLOBAL_RESET},
|
||||
+ {ETH_RESET_DEDICATED, HNAE3_FUNC_RESET},
|
||||
+};
|
||||
+
|
||||
+static const struct hns3_reset_type_map hns3vf_reset_type[] = {
|
||||
+ {ETH_RESET_DEDICATED, HNAE3_VF_FUNC_RESET},
|
||||
+};
|
||||
+
|
||||
+static int hns3_set_reset(struct net_device *netdev, u32 *flags)
|
||||
+{
|
||||
+ enum hnae3_reset_type rst_type = HNAE3_NONE_RESET;
|
||||
+ struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
||||
+ const struct hnae3_ae_ops *ops = h->ae_algo->ops;
|
||||
+ const struct hns3_reset_type_map *rst_type_map;
|
||||
+ u32 i, size;
|
||||
+
|
||||
+ if (ops->ae_dev_resetting && ops->ae_dev_resetting(h))
|
||||
+ return -EBUSY;
|
||||
+
|
||||
+ if (!ops->set_default_reset_request || !ops->reset_event)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (h->flags & HNAE3_SUPPORT_VF) {
|
||||
+ rst_type_map = hns3vf_reset_type;
|
||||
+ size = ARRAY_SIZE(hns3vf_reset_type);
|
||||
+ } else {
|
||||
+ rst_type_map = hns3_reset_type;
|
||||
+ size = ARRAY_SIZE(hns3_reset_type);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < size; i++) {
|
||||
+ if (rst_type_map[i].rst_flags == *flags) {
|
||||
+ rst_type = rst_type_map[i].rst_type;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (rst_type == HNAE3_NONE_RESET ||
|
||||
+ (rst_type == HNAE3_IMP_RESET &&
|
||||
+ ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2))
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ netdev_info(netdev, "Setting reset type %d\n", rst_type);
|
||||
+
|
||||
+ ops->set_default_reset_request(ae_dev, rst_type);
|
||||
+
|
||||
+ ops->reset_event(h->pdev, h);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void hns3_change_all_ring_bd_num(struct hns3_nic_priv *priv,
|
||||
u32 tx_desc_num, u32 rx_desc_num)
|
||||
{
|
||||
@@ -1711,6 +1765,7 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
||||
.set_priv_flags = hns3_set_priv_flags,
|
||||
.get_tunable = hns3_get_tunable,
|
||||
.set_tunable = hns3_set_tunable,
|
||||
+ .reset = hns3_set_reset,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
@@ -1752,6 +1807,7 @@ static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
.get_ts_info = hns3_get_ts_info,
|
||||
.get_tunable = hns3_get_tunable,
|
||||
.set_tunable = hns3_set_tunable,
|
||||
+ .reset = hns3_set_reset,
|
||||
};
|
||||
|
||||
void hns3_ethtool_set_ops(struct net_device *netdev)
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
index 7196dd27e230..359c6fc4ca1d 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
||||
@@ -3700,6 +3700,12 @@ static void hclge_do_reset(struct hclge_dev *hdev)
|
||||
}
|
||||
|
||||
switch (hdev->reset_type) {
|
||||
+ case HNAE3_IMP_RESET:
|
||||
+ dev_info(&pdev->dev, "IMP reset requested\n");
|
||||
+ val = hclge_read_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG);
|
||||
+ hnae3_set_bit(val, HCLGE_TRIGGER_IMP_RESET_B, 1);
|
||||
+ hclge_write_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG, val);
|
||||
+ break;
|
||||
case HNAE3_GLOBAL_RESET:
|
||||
dev_info(&pdev->dev, "global reset requested\n");
|
||||
val = hclge_read_dev(&hdev->hw, HCLGE_GLOBAL_RESET_REG);
|
||||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
index 07a1e7ed734b..e04488bb7278 100644
|
||||
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
||||
@@ -192,6 +192,7 @@ enum HLCGE_PORT_TYPE {
|
||||
#define HCLGE_VECTOR0_IMP_CMDQ_ERR_B 4U
|
||||
#define HCLGE_VECTOR0_IMP_RD_POISON_B 5U
|
||||
#define HCLGE_VECTOR0_ALL_MSIX_ERR_B 6U
|
||||
+#define HCLGE_TRIGGER_IMP_RESET_B 7U
|
||||
|
||||
#define HCLGE_MAC_DEFAULT_FRAME \
|
||||
(ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN + ETH_DATA_LEN)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,123 @@
|
||||
From b63dbee6334e1890f68376bf0ec734a2ef0f604c Mon Sep 17 00:00:00 2001
|
||||
From: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Date: Sat, 21 Aug 2021 17:00:39 +0800
|
||||
Subject: [PATCH 099/283] ethtool: add two link extended substates of bad
|
||||
signal integrity
|
||||
|
||||
mainline inclusion
|
||||
from mainline-v5.15-rc1
|
||||
commit 5b4ecc3d4c4aab8d002fe6358885c10e7b57e432
|
||||
category: feature
|
||||
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
||||
CVE: NA
|
||||
|
||||
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5b4ecc3d4c4aab8d002fe6358885c10e7b57e432
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST means the input
|
||||
external clock signal for SerDes is too weak or lost.
|
||||
|
||||
ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS means the received signal for
|
||||
SerDes is too weak because analog loss of signal.
|
||||
|
||||
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
||||
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
||||
(fix conflicts: replace the last line by "/**")
|
||||
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
||||
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
||||
|
||||
Conflicts:
|
||||
include/uapi/linux/ethtool.h
|
||||
---
|
||||
include/uapi/linux/ethtool.h | 72 ++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 72 insertions(+)
|
||||
|
||||
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
|
||||
index 4a43996de6d0..43ac4af42346 100644
|
||||
--- a/include/uapi/linux/ethtool.h
|
||||
+++ b/include/uapi/linux/ethtool.h
|
||||
@@ -553,6 +553,78 @@ struct ethtool_pauseparam {
|
||||
__u32 tx_pause;
|
||||
};
|
||||
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_state - link extended state
|
||||
+ */
|
||||
+enum ethtool_link_ext_state {
|
||||
+ ETHTOOL_LINK_EXT_STATE_AUTONEG,
|
||||
+ ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE,
|
||||
+ ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH,
|
||||
+ ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY,
|
||||
+ ETHTOOL_LINK_EXT_STATE_NO_CABLE,
|
||||
+ ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE,
|
||||
+ ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE,
|
||||
+ ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE,
|
||||
+ ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
|
||||
+ ETHTOOL_LINK_EXT_STATE_OVERHEAT,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_substate_autoneg - more information in addition to
|
||||
+ * ETHTOOL_LINK_EXT_STATE_AUTONEG.
|
||||
+ */
|
||||
+enum ethtool_link_ext_substate_autoneg {
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_substate_link_training - more information
|
||||
+ * in addition to ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE.
|
||||
+ */
|
||||
+enum ethtool_link_ext_substate_link_training {
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_substate_logical_mismatch - more information
|
||||
+ * in addition to ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH.
|
||||
+ */
|
||||
+enum ethtool_link_ext_substate_link_logical_mismatch {
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_substate_bad_signal_integrity - more information in
|
||||
+ * addition to ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY.
|
||||
+ */
|
||||
+enum ethtool_link_ext_substate_bad_signal_integrity {
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum ethtool_link_ext_substate_cable_issue - more information in
|
||||
+ * addition to ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE.
|
||||
+ */
|
||||
+enum ethtool_link_ext_substate_cable_issue {
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1,
|
||||
+ ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE,
|
||||
+};
|
||||
+
|
||||
#define ETH_GSTRING_LEN 32
|
||||
|
||||
/**
|
||||
--
|
||||
2.34.1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user