mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
Merge branch 'there-are-some-bugfix-for-the-hns3-ethernet-driver'
Jijie Shao says: ==================== There are some bugfix for the HNS3 ethernet driver v1: https://lore.kernel.org/all/20250702130901.2879031-1-shaojijie@huawei.com/ ==================== Link: https://patch.msgid.link/20250722125423.1270673-1-shaojijie@huawei.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
89fd905dab
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/ip.h>
|
#include <linux/ip.h>
|
||||||
#include <linux/ipv6.h>
|
#include <linux/ipv6.h>
|
||||||
|
#include <linux/iommu.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
|
@ -1039,6 +1040,8 @@ static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring,
|
||||||
static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
||||||
{
|
{
|
||||||
u32 alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size;
|
u32 alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size;
|
||||||
|
struct net_device *netdev = ring_to_netdev(ring);
|
||||||
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||||
struct hns3_tx_spare *tx_spare;
|
struct hns3_tx_spare *tx_spare;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
dma_addr_t dma;
|
dma_addr_t dma;
|
||||||
|
@ -1080,6 +1083,7 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
|
||||||
tx_spare->buf = page_address(page);
|
tx_spare->buf = page_address(page);
|
||||||
tx_spare->len = PAGE_SIZE << order;
|
tx_spare->len = PAGE_SIZE << order;
|
||||||
ring->tx_spare = tx_spare;
|
ring->tx_spare = tx_spare;
|
||||||
|
ring->tx_copybreak = priv->tx_copybreak;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dma_mapping_error:
|
dma_mapping_error:
|
||||||
|
@ -4874,6 +4878,30 @@ static void hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
|
||||||
devm_kfree(&pdev->dev, priv->tqp_vector);
|
devm_kfree(&pdev->dev, priv->tqp_vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hns3_update_tx_spare_buf_config(struct hns3_nic_priv *priv)
|
||||||
|
{
|
||||||
|
#define HNS3_MIN_SPARE_BUF_SIZE (2 * 1024 * 1024)
|
||||||
|
#define HNS3_MAX_PACKET_SIZE (64 * 1024)
|
||||||
|
|
||||||
|
struct iommu_domain *domain = iommu_get_domain_for_dev(priv->dev);
|
||||||
|
struct hnae3_ae_dev *ae_dev = hns3_get_ae_dev(priv->ae_handle);
|
||||||
|
struct hnae3_handle *handle = priv->ae_handle;
|
||||||
|
|
||||||
|
if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(domain && iommu_is_dma_domain(domain)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->min_tx_copybreak = HNS3_MAX_PACKET_SIZE;
|
||||||
|
priv->min_tx_spare_buf_size = HNS3_MIN_SPARE_BUF_SIZE;
|
||||||
|
|
||||||
|
if (priv->tx_copybreak < priv->min_tx_copybreak)
|
||||||
|
priv->tx_copybreak = priv->min_tx_copybreak;
|
||||||
|
if (handle->kinfo.tx_spare_buf_size < priv->min_tx_spare_buf_size)
|
||||||
|
handle->kinfo.tx_spare_buf_size = priv->min_tx_spare_buf_size;
|
||||||
|
}
|
||||||
|
|
||||||
static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
||||||
unsigned int ring_type)
|
unsigned int ring_type)
|
||||||
{
|
{
|
||||||
|
@ -5107,6 +5135,7 @@ int hns3_init_all_ring(struct hns3_nic_priv *priv)
|
||||||
int i, j;
|
int i, j;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
hns3_update_tx_spare_buf_config(priv);
|
||||||
for (i = 0; i < ring_num; i++) {
|
for (i = 0; i < ring_num; i++) {
|
||||||
ret = hns3_alloc_ring_memory(&priv->ring[i]);
|
ret = hns3_alloc_ring_memory(&priv->ring[i]);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -5311,6 +5340,8 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||||
priv->ae_handle = handle;
|
priv->ae_handle = handle;
|
||||||
priv->tx_timeout_count = 0;
|
priv->tx_timeout_count = 0;
|
||||||
priv->max_non_tso_bd_num = ae_dev->dev_specs.max_non_tso_bd_num;
|
priv->max_non_tso_bd_num = ae_dev->dev_specs.max_non_tso_bd_num;
|
||||||
|
priv->min_tx_copybreak = 0;
|
||||||
|
priv->min_tx_spare_buf_size = 0;
|
||||||
set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
|
set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
|
||||||
|
|
||||||
handle->msg_enable = netif_msg_init(debug, DEFAULT_MSG_LEVEL);
|
handle->msg_enable = netif_msg_init(debug, DEFAULT_MSG_LEVEL);
|
||||||
|
|
|
@ -596,6 +596,8 @@ struct hns3_nic_priv {
|
||||||
struct hns3_enet_coalesce rx_coal;
|
struct hns3_enet_coalesce rx_coal;
|
||||||
u32 tx_copybreak;
|
u32 tx_copybreak;
|
||||||
u32 rx_copybreak;
|
u32 rx_copybreak;
|
||||||
|
u32 min_tx_copybreak;
|
||||||
|
u32 min_tx_spare_buf_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
union l3_hdr_info {
|
union l3_hdr_info {
|
||||||
|
|
|
@ -9576,33 +9576,36 @@ static bool hclge_need_enable_vport_vlan_filter(struct hclge_vport *vport)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en)
|
static int __hclge_enable_vport_vlan_filter(struct hclge_vport *vport,
|
||||||
|
bool request_en)
|
||||||
{
|
{
|
||||||
struct hclge_dev *hdev = vport->back;
|
|
||||||
bool need_en;
|
bool need_en;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mutex_lock(&hdev->vport_lock);
|
|
||||||
|
|
||||||
vport->req_vlan_fltr_en = request_en;
|
|
||||||
|
|
||||||
need_en = hclge_need_enable_vport_vlan_filter(vport);
|
need_en = hclge_need_enable_vport_vlan_filter(vport);
|
||||||
if (need_en == vport->cur_vlan_fltr_en) {
|
if (need_en == vport->cur_vlan_fltr_en)
|
||||||
mutex_unlock(&hdev->vport_lock);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
ret = hclge_set_vport_vlan_filter(vport, need_en);
|
ret = hclge_set_vport_vlan_filter(vport, need_en);
|
||||||
if (ret) {
|
if (ret)
|
||||||
mutex_unlock(&hdev->vport_lock);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
vport->cur_vlan_fltr_en = need_en;
|
vport->cur_vlan_fltr_en = need_en;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en)
|
||||||
|
{
|
||||||
|
struct hclge_dev *hdev = vport->back;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&hdev->vport_lock);
|
||||||
|
vport->req_vlan_fltr_en = request_en;
|
||||||
|
ret = __hclge_enable_vport_vlan_filter(vport, request_en);
|
||||||
mutex_unlock(&hdev->vport_lock);
|
mutex_unlock(&hdev->vport_lock);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
|
static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
|
||||||
|
@ -10623,16 +10626,19 @@ static void hclge_sync_vlan_fltr_state(struct hclge_dev *hdev)
|
||||||
&vport->state))
|
&vport->state))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ret = hclge_enable_vport_vlan_filter(vport,
|
mutex_lock(&hdev->vport_lock);
|
||||||
vport->req_vlan_fltr_en);
|
ret = __hclge_enable_vport_vlan_filter(vport,
|
||||||
|
vport->req_vlan_fltr_en);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&hdev->pdev->dev,
|
dev_err(&hdev->pdev->dev,
|
||||||
"failed to sync vlan filter state for vport%u, ret = %d\n",
|
"failed to sync vlan filter state for vport%u, ret = %d\n",
|
||||||
vport->vport_id, ret);
|
vport->vport_id, ret);
|
||||||
set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE,
|
set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE,
|
||||||
&vport->state);
|
&vport->state);
|
||||||
|
mutex_unlock(&hdev->vport_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&hdev->vport_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -497,14 +497,14 @@ int hclge_ptp_init(struct hclge_dev *hdev)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&hdev->pdev->dev,
|
dev_err(&hdev->pdev->dev,
|
||||||
"failed to init freq, ret = %d\n", ret);
|
"failed to init freq, ret = %d\n", ret);
|
||||||
goto out;
|
goto out_clear_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = hclge_ptp_set_ts_mode(hdev, &hdev->ptp->ts_cfg);
|
ret = hclge_ptp_set_ts_mode(hdev, &hdev->ptp->ts_cfg);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&hdev->pdev->dev,
|
dev_err(&hdev->pdev->dev,
|
||||||
"failed to init ts mode, ret = %d\n", ret);
|
"failed to init ts mode, ret = %d\n", ret);
|
||||||
goto out;
|
goto out_clear_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
ktime_get_real_ts64(&ts);
|
ktime_get_real_ts64(&ts);
|
||||||
|
@ -512,7 +512,7 @@ int hclge_ptp_init(struct hclge_dev *hdev)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&hdev->pdev->dev,
|
dev_err(&hdev->pdev->dev,
|
||||||
"failed to init ts time, ret = %d\n", ret);
|
"failed to init ts time, ret = %d\n", ret);
|
||||||
goto out;
|
goto out_clear_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bit(HCLGE_STATE_PTP_EN, &hdev->state);
|
set_bit(HCLGE_STATE_PTP_EN, &hdev->state);
|
||||||
|
@ -520,6 +520,9 @@ int hclge_ptp_init(struct hclge_dev *hdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_clear_int:
|
||||||
|
clear_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags);
|
||||||
|
hclge_ptp_int_en(hdev, false);
|
||||||
out:
|
out:
|
||||||
hclge_ptp_destroy_clock(hdev);
|
hclge_ptp_destroy_clock(hdev);
|
||||||
|
|
||||||
|
|
|
@ -3094,11 +3094,7 @@ static void hclgevf_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||||
|
|
||||||
static u32 hclgevf_get_max_channels(struct hclgevf_dev *hdev)
|
static u32 hclgevf_get_max_channels(struct hclgevf_dev *hdev)
|
||||||
{
|
{
|
||||||
struct hnae3_handle *nic = &hdev->nic;
|
return min(hdev->rss_size_max, hdev->num_tqps);
|
||||||
struct hnae3_knic_private_info *kinfo = &nic->kinfo;
|
|
||||||
|
|
||||||
return min_t(u32, hdev->rss_size_max,
|
|
||||||
hdev->num_tqps / kinfo->tc_info.num_tc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user