mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
Merge branch 'hns3-next'
Huazhong Tan says: ==================== net: hns3: misc updates for -net-next This series includes some misc updates for the HNS3 ethernet driver. [patch 1] adds trace events support. [patch 2] re-organizes TQP's vector handling. [patch 3] renames the name of TQP vector. [patch 4] rewrites a log in the hclge_map_ring_to_vector(). [patch 5] modifies the name of misc IRQ vector. [patch 6] handles the unexpected speed 0 return from HW. [patch 7] replaces an unsuitable variable type. [patch 8] modifies an unsuitable reset level for HW error. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
02b0442c19
@ -3,6 +3,8 @@
|
||||
# Makefile for the HISILICON network device drivers.
|
||||
#
|
||||
|
||||
ccflags-y += -I$(srctree)/$(src)
|
||||
|
||||
obj-$(CONFIG_HNS3) += hns3pf/
|
||||
obj-$(CONFIG_HNS3) += hns3vf/
|
||||
|
||||
|
@ -164,6 +164,7 @@ enum hnae3_reset_type {
|
||||
HNAE3_IMP_RESET,
|
||||
HNAE3_UNKNOWN_RESET,
|
||||
HNAE3_NONE_RESET,
|
||||
HNAE3_MAX_RESET,
|
||||
};
|
||||
|
||||
enum hnae3_flr_state {
|
||||
@ -575,8 +576,7 @@ struct hnae3_ae_algo {
|
||||
const struct pci_device_id *pdev_id_table;
|
||||
};
|
||||
|
||||
#define HNAE3_INT_NAME_EXT_LEN 32 /* Max extra information length */
|
||||
#define HNAE3_INT_NAME_LEN (IFNAMSIZ + HNAE3_INT_NAME_EXT_LEN)
|
||||
#define HNAE3_INT_NAME_LEN 32
|
||||
#define HNAE3_ITR_COUNTDOWN_START 100
|
||||
|
||||
struct hnae3_tc_info {
|
||||
|
@ -24,6 +24,12 @@
|
||||
|
||||
#include "hnae3.h"
|
||||
#include "hns3_enet.h"
|
||||
/* All hns3 tracepoints are defined by the include below, which
|
||||
* must be included exactly once across the whole kernel with
|
||||
* CREATE_TRACE_POINTS defined
|
||||
*/
|
||||
#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)
|
||||
@ -127,18 +133,21 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
|
||||
continue;
|
||||
|
||||
if (tqp_vectors->tx_group.ring && tqp_vectors->rx_group.ring) {
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1,
|
||||
"%s-%s-%d", priv->netdev->name, "TxRx",
|
||||
txrx_int_idx++);
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
|
||||
"%s-%s-%s-%d", hns3_driver_name,
|
||||
pci_name(priv->ae_handle->pdev),
|
||||
"TxRx", txrx_int_idx++);
|
||||
txrx_int_idx++;
|
||||
} else if (tqp_vectors->rx_group.ring) {
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1,
|
||||
"%s-%s-%d", priv->netdev->name, "Rx",
|
||||
rx_int_idx++);
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
|
||||
"%s-%s-%s-%d", hns3_driver_name,
|
||||
pci_name(priv->ae_handle->pdev),
|
||||
"Rx", rx_int_idx++);
|
||||
} else if (tqp_vectors->tx_group.ring) {
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1,
|
||||
"%s-%s-%d", priv->netdev->name, "Tx",
|
||||
tx_int_idx++);
|
||||
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
|
||||
"%s-%s-%s-%d", hns3_driver_name,
|
||||
pci_name(priv->ae_handle->pdev),
|
||||
"Tx", tx_int_idx++);
|
||||
} else {
|
||||
/* Skip this unused q_vector */
|
||||
continue;
|
||||
@ -155,6 +164,8 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
disable_irq(tqp_vectors->vector_irq);
|
||||
|
||||
irq_set_affinity_hint(tqp_vectors->vector_irq,
|
||||
&tqp_vectors->affinity_mask);
|
||||
|
||||
@ -173,6 +184,7 @@ static void hns3_mask_vector_irq(struct hns3_enet_tqp_vector *tqp_vector,
|
||||
static void hns3_vector_enable(struct hns3_enet_tqp_vector *tqp_vector)
|
||||
{
|
||||
napi_enable(&tqp_vector->napi);
|
||||
enable_irq(tqp_vector->vector_irq);
|
||||
|
||||
/* enable vector */
|
||||
hns3_mask_vector_irq(tqp_vector, 1);
|
||||
@ -372,18 +384,6 @@ static int hns3_nic_net_up(struct net_device *netdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* the device can work without cpu rmap, only aRFS needs it */
|
||||
ret = hns3_set_rx_cpu_rmap(netdev);
|
||||
if (ret)
|
||||
netdev_warn(netdev, "set rx cpu rmap fail, ret=%d!\n", ret);
|
||||
|
||||
/* get irq resource for all vectors */
|
||||
ret = hns3_nic_init_irq(priv);
|
||||
if (ret) {
|
||||
netdev_err(netdev, "init irq failed! ret=%d\n", ret);
|
||||
goto free_rmap;
|
||||
}
|
||||
|
||||
clear_bit(HNS3_NIC_STATE_DOWN, &priv->state);
|
||||
|
||||
/* enable the vectors */
|
||||
@ -396,22 +396,15 @@ static int hns3_nic_net_up(struct net_device *netdev)
|
||||
|
||||
/* start the ae_dev */
|
||||
ret = h->ae_algo->ops->start ? h->ae_algo->ops->start(h) : 0;
|
||||
if (ret)
|
||||
goto out_start_err;
|
||||
if (ret) {
|
||||
set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
|
||||
while (j--)
|
||||
hns3_tqp_disable(h->kinfo.tqp[j]);
|
||||
|
||||
return 0;
|
||||
for (j = i - 1; j >= 0; j--)
|
||||
hns3_vector_disable(&priv->tqp_vector[j]);
|
||||
}
|
||||
|
||||
out_start_err:
|
||||
set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
|
||||
while (j--)
|
||||
hns3_tqp_disable(h->kinfo.tqp[j]);
|
||||
|
||||
for (j = i - 1; j >= 0; j--)
|
||||
hns3_vector_disable(&priv->tqp_vector[j]);
|
||||
|
||||
hns3_nic_uninit_irq(priv);
|
||||
free_rmap:
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -508,11 +501,6 @@ static void hns3_nic_net_down(struct net_device *netdev)
|
||||
if (ops->stop)
|
||||
ops->stop(priv->ae_handle);
|
||||
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
|
||||
/* free irq resources */
|
||||
hns3_nic_uninit_irq(priv);
|
||||
|
||||
/* delay ring buffer clearing to hns3_reset_notify_uninit_enet
|
||||
* during reset process, because driver may not be able
|
||||
* to disable the ring through firmware when downing the netdev.
|
||||
@ -734,6 +722,8 @@ static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
|
||||
/* get MSS for TSO */
|
||||
*mss = skb_shinfo(skb)->gso_size;
|
||||
|
||||
trace_hns3_tso(skb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1138,6 +1128,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
desc->tx.bdtp_fe_sc_vld_ra_ri =
|
||||
cpu_to_le16(BIT(HNS3_TXD_VLD_B));
|
||||
|
||||
trace_hns3_tx_desc(ring, ring->next_to_use);
|
||||
ring_ptr_move_fw(ring, next_to_use);
|
||||
return HNS3_LIKELY_BD_NUM;
|
||||
}
|
||||
@ -1161,6 +1152,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
||||
desc->tx.bdtp_fe_sc_vld_ra_ri =
|
||||
cpu_to_le16(BIT(HNS3_TXD_VLD_B));
|
||||
|
||||
trace_hns3_tx_desc(ring, ring->next_to_use);
|
||||
/* move ring pointer to next */
|
||||
ring_ptr_move_fw(ring, next_to_use);
|
||||
|
||||
@ -1286,6 +1278,14 @@ static bool hns3_skb_need_linearized(struct sk_buff *skb, unsigned int *bd_size,
|
||||
return false;
|
||||
}
|
||||
|
||||
void hns3_shinfo_pack(struct skb_shared_info *shinfo, __u32 *size)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < MAX_SKB_FRAGS; i++)
|
||||
size[i] = skb_frag_size(&shinfo->frags[i]);
|
||||
}
|
||||
|
||||
static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring,
|
||||
struct net_device *netdev,
|
||||
struct sk_buff *skb)
|
||||
@ -1297,8 +1297,10 @@ static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring,
|
||||
bd_num = hns3_tx_bd_num(skb, bd_size);
|
||||
if (unlikely(bd_num > HNS3_MAX_NON_TSO_BD_NUM)) {
|
||||
if (bd_num <= HNS3_MAX_TSO_BD_NUM && skb_is_gso(skb) &&
|
||||
!hns3_skb_need_linearized(skb, bd_size, bd_num))
|
||||
!hns3_skb_need_linearized(skb, bd_size, bd_num)) {
|
||||
trace_hns3_over_8bd(skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (__skb_linearize(skb))
|
||||
return -ENOMEM;
|
||||
@ -1306,8 +1308,10 @@ static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring,
|
||||
bd_num = hns3_tx_bd_count(skb->len);
|
||||
if ((skb_is_gso(skb) && bd_num > HNS3_MAX_TSO_BD_NUM) ||
|
||||
(!skb_is_gso(skb) &&
|
||||
bd_num > HNS3_MAX_NON_TSO_BD_NUM))
|
||||
bd_num > HNS3_MAX_NON_TSO_BD_NUM)) {
|
||||
trace_hns3_over_8bd(skb);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
u64_stats_update_begin(&ring->syncp);
|
||||
ring->stats.tx_copy++;
|
||||
@ -1448,6 +1452,7 @@ out:
|
||||
(ring->desc_num - 1);
|
||||
ring->desc[pre_ntu].tx.bdtp_fe_sc_vld_ra_ri |=
|
||||
cpu_to_le16(BIT(HNS3_TXD_FE_B));
|
||||
trace_hns3_tx_desc(ring, pre_ntu);
|
||||
|
||||
/* Complete translate all packets */
|
||||
dev_queue = netdev_get_tx_queue(netdev, ring->queue_index);
|
||||
@ -2700,6 +2705,9 @@ static int hns3_gro_complete(struct sk_buff *skb, u32 l234info)
|
||||
skb->csum_start = (unsigned char *)th - skb->head;
|
||||
skb->csum_offset = offsetof(struct tcphdr, check);
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
|
||||
trace_hns3_gro(skb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2836,6 +2844,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, unsigned int length,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
trace_hns3_rx_desc(ring);
|
||||
prefetchw(skb->data);
|
||||
|
||||
ring->pending_buf = 1;
|
||||
@ -2910,6 +2919,7 @@ static int hns3_add_frag(struct hns3_enet_ring *ring)
|
||||
}
|
||||
|
||||
hns3_nic_reuse_page(skb, ring->frag_num++, ring, 0, desc_cb);
|
||||
trace_hns3_rx_desc(ring);
|
||||
ring_ptr_move_fw(ring, next_to_clean);
|
||||
ring->pending_buf++;
|
||||
} while (!(bd_base_info & BIT(HNS3_RXD_FE_B)));
|
||||
@ -3614,19 +3624,13 @@ static void hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
|
||||
|
||||
hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain);
|
||||
|
||||
if (tqp_vector->irq_init_flag == HNS3_VECTOR_INITED) {
|
||||
irq_set_affinity_hint(tqp_vector->vector_irq, NULL);
|
||||
free_irq(tqp_vector->vector_irq, tqp_vector);
|
||||
tqp_vector->irq_init_flag = HNS3_VECTOR_NOT_INITED;
|
||||
}
|
||||
|
||||
hns3_clear_ring_group(&tqp_vector->rx_group);
|
||||
hns3_clear_ring_group(&tqp_vector->tx_group);
|
||||
netif_napi_del(&priv->tqp_vector[i].napi);
|
||||
}
|
||||
}
|
||||
|
||||
static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
|
||||
static void hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
|
||||
{
|
||||
struct hnae3_handle *h = priv->ae_handle;
|
||||
struct pci_dev *pdev = h->pdev;
|
||||
@ -3638,11 +3642,10 @@ static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
|
||||
tqp_vector = &priv->tqp_vector[i];
|
||||
ret = h->ae_algo->ops->put_vector(h, tqp_vector->vector_irq);
|
||||
if (ret)
|
||||
return ret;
|
||||
return;
|
||||
}
|
||||
|
||||
devm_kfree(&pdev->dev, priv->tqp_vector);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
|
||||
@ -4041,6 +4044,18 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||
goto out_reg_netdev_fail;
|
||||
}
|
||||
|
||||
/* the device can work without cpu rmap, only aRFS needs it */
|
||||
ret = hns3_set_rx_cpu_rmap(netdev);
|
||||
if (ret)
|
||||
dev_warn(priv->dev, "set rx cpu rmap fail, ret=%d\n", ret);
|
||||
|
||||
ret = hns3_nic_init_irq(priv);
|
||||
if (ret) {
|
||||
dev_err(priv->dev, "init irq failed! ret=%d\n", ret);
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
goto out_init_irq_fail;
|
||||
}
|
||||
|
||||
ret = hns3_client_start(handle);
|
||||
if (ret) {
|
||||
dev_err(priv->dev, "hns3_client_start fail! ret=%d\n", ret);
|
||||
@ -4062,6 +4077,9 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
||||
return ret;
|
||||
|
||||
out_client_start:
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
hns3_nic_uninit_irq(priv);
|
||||
out_init_irq_fail:
|
||||
unregister_netdev(netdev);
|
||||
out_reg_netdev_fail:
|
||||
hns3_uninit_phy(netdev);
|
||||
@ -4099,15 +4117,17 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
|
||||
goto out_netdev_free;
|
||||
}
|
||||
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
|
||||
hns3_nic_uninit_irq(priv);
|
||||
|
||||
hns3_del_all_fd_rules(netdev, true);
|
||||
|
||||
hns3_clear_all_ring(handle, true);
|
||||
|
||||
hns3_nic_uninit_vector_data(priv);
|
||||
|
||||
ret = hns3_nic_dealloc_vector_data(priv);
|
||||
if (ret)
|
||||
netdev_err(netdev, "dealloc vector error\n");
|
||||
hns3_nic_dealloc_vector_data(priv);
|
||||
|
||||
ret = hns3_uninit_all_ring(priv);
|
||||
if (ret)
|
||||
@ -4434,17 +4454,32 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
|
||||
if (ret)
|
||||
goto err_uninit_vector;
|
||||
|
||||
/* the device can work without cpu rmap, only aRFS needs it */
|
||||
ret = hns3_set_rx_cpu_rmap(netdev);
|
||||
if (ret)
|
||||
dev_warn(priv->dev, "set rx cpu rmap fail, ret=%d\n", ret);
|
||||
|
||||
ret = hns3_nic_init_irq(priv);
|
||||
if (ret) {
|
||||
dev_err(priv->dev, "init irq failed! ret=%d\n", ret);
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
goto err_init_irq_fail;
|
||||
}
|
||||
|
||||
ret = hns3_client_start(handle);
|
||||
if (ret) {
|
||||
dev_err(priv->dev, "hns3_client_start fail! ret=%d\n", ret);
|
||||
goto err_uninit_ring;
|
||||
goto err_client_start_fail;
|
||||
}
|
||||
|
||||
set_bit(HNS3_NIC_STATE_INITED, &priv->state);
|
||||
|
||||
return ret;
|
||||
|
||||
err_uninit_ring:
|
||||
err_client_start_fail:
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
hns3_nic_uninit_irq(priv);
|
||||
err_init_irq_fail:
|
||||
hns3_uninit_all_ring(priv);
|
||||
err_uninit_vector:
|
||||
hns3_nic_uninit_vector_data(priv);
|
||||
@ -4494,6 +4529,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
hns3_free_rx_cpu_rmap(netdev);
|
||||
hns3_nic_uninit_irq(priv);
|
||||
hns3_clear_all_ring(handle, true);
|
||||
hns3_reset_tx_queue(priv->ae_handle);
|
||||
|
||||
@ -4501,9 +4538,7 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
|
||||
|
||||
hns3_store_coal(priv);
|
||||
|
||||
ret = hns3_nic_dealloc_vector_data(priv);
|
||||
if (ret)
|
||||
netdev_err(netdev, "dealloc vector error\n");
|
||||
hns3_nic_dealloc_vector_data(priv);
|
||||
|
||||
ret = hns3_uninit_all_ring(priv);
|
||||
if (ret)
|
||||
|
@ -673,4 +673,5 @@ void hns3_dbg_init(struct hnae3_handle *handle);
|
||||
void hns3_dbg_uninit(struct hnae3_handle *handle);
|
||||
void hns3_dbg_register_debugfs(const char *debugfs_dir_name);
|
||||
void hns3_dbg_unregister_debugfs(void);
|
||||
void hns3_shinfo_pack(struct skb_shared_info *shinfo, __u32 *size);
|
||||
#endif
|
||||
|
139
drivers/net/ethernet/hisilicon/hns3/hns3_trace.h
Normal file
139
drivers/net/ethernet/hisilicon/hns3/hns3_trace.h
Normal file
@ -0,0 +1,139 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/* Copyright (c) 2018-2019 Hisilicon Limited. */
|
||||
|
||||
/* This must be outside ifdef _HNS3_TRACE_H */
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM hns3
|
||||
|
||||
#if !defined(_HNS3_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _HNS3_TRACE_H_
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#define DESC_NR (sizeof(struct hns3_desc) / sizeof(u32))
|
||||
|
||||
DECLARE_EVENT_CLASS(hns3_skb_template,
|
||||
TP_PROTO(struct sk_buff *skb),
|
||||
TP_ARGS(skb),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, headlen)
|
||||
__field(unsigned int, len)
|
||||
__field(__u8, nr_frags)
|
||||
__field(__u8, ip_summed)
|
||||
__field(unsigned int, hdr_len)
|
||||
__field(unsigned short, gso_size)
|
||||
__field(unsigned short, gso_segs)
|
||||
__field(unsigned int, gso_type)
|
||||
__field(bool, fraglist)
|
||||
__array(__u32, size, MAX_SKB_FRAGS)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->headlen = skb_headlen(skb);
|
||||
__entry->len = skb->len;
|
||||
__entry->nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
__entry->gso_size = skb_shinfo(skb)->gso_size;
|
||||
__entry->gso_segs = skb_shinfo(skb)->gso_segs;
|
||||
__entry->gso_type = skb_shinfo(skb)->gso_type;
|
||||
__entry->hdr_len = skb->encapsulation ?
|
||||
skb_inner_transport_offset(skb) + inner_tcp_hdrlen(skb) :
|
||||
skb_transport_offset(skb) + tcp_hdrlen(skb);
|
||||
__entry->ip_summed = skb->ip_summed;
|
||||
__entry->fraglist = skb_has_frag_list(skb);
|
||||
hns3_shinfo_pack(skb_shinfo(skb), __entry->size);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"len: %u, %u, %u, cs: %u, gso: %u, %u, %x, frag(%d %u): %s",
|
||||
__entry->headlen, __entry->len, __entry->hdr_len,
|
||||
__entry->ip_summed, __entry->gso_size, __entry->gso_segs,
|
||||
__entry->gso_type, __entry->fraglist, __entry->nr_frags,
|
||||
__print_array(__entry->size, MAX_SKB_FRAGS, sizeof(__u32))
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(hns3_skb_template, hns3_over_8bd,
|
||||
TP_PROTO(struct sk_buff *skb),
|
||||
TP_ARGS(skb));
|
||||
|
||||
DEFINE_EVENT(hns3_skb_template, hns3_gro,
|
||||
TP_PROTO(struct sk_buff *skb),
|
||||
TP_ARGS(skb));
|
||||
|
||||
DEFINE_EVENT(hns3_skb_template, hns3_tso,
|
||||
TP_PROTO(struct sk_buff *skb),
|
||||
TP_ARGS(skb));
|
||||
|
||||
TRACE_EVENT(hns3_tx_desc,
|
||||
TP_PROTO(struct hns3_enet_ring *ring, int cur_ntu),
|
||||
TP_ARGS(ring, cur_ntu),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, index)
|
||||
__field(int, ntu)
|
||||
__field(int, ntc)
|
||||
__field(dma_addr_t, desc_dma)
|
||||
__array(u32, desc, DESC_NR)
|
||||
__string(devname, ring->tqp->handle->kinfo.netdev->name)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->index = ring->tqp->tqp_index;
|
||||
__entry->ntu = ring->next_to_use;
|
||||
__entry->ntc = ring->next_to_clean;
|
||||
__entry->desc_dma = ring->desc_dma_addr,
|
||||
memcpy(__entry->desc, &ring->desc[cur_ntu],
|
||||
sizeof(struct hns3_desc));
|
||||
__assign_str(devname, ring->tqp->handle->kinfo.netdev->name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"%s-%d-%d/%d desc(%pad): %s",
|
||||
__get_str(devname), __entry->index, __entry->ntu,
|
||||
__entry->ntc, &__entry->desc_dma,
|
||||
__print_array(__entry->desc, DESC_NR, sizeof(u32))
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(hns3_rx_desc,
|
||||
TP_PROTO(struct hns3_enet_ring *ring),
|
||||
TP_ARGS(ring),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, index)
|
||||
__field(int, ntu)
|
||||
__field(int, ntc)
|
||||
__field(dma_addr_t, desc_dma)
|
||||
__field(dma_addr_t, buf_dma)
|
||||
__array(u32, desc, DESC_NR)
|
||||
__string(devname, ring->tqp->handle->kinfo.netdev->name)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->index = ring->tqp->tqp_index;
|
||||
__entry->ntu = ring->next_to_use;
|
||||
__entry->ntc = ring->next_to_clean;
|
||||
__entry->desc_dma = ring->desc_dma_addr;
|
||||
__entry->buf_dma = ring->desc_cb[ring->next_to_clean].dma;
|
||||
memcpy(__entry->desc, &ring->desc[ring->next_to_clean],
|
||||
sizeof(struct hns3_desc));
|
||||
__assign_str(devname, ring->tqp->handle->kinfo.netdev->name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"%s-%d-%d/%d desc(%pad) buf(%pad): %s",
|
||||
__get_str(devname), __entry->index, __entry->ntu,
|
||||
__entry->ntc, &__entry->desc_dma, &__entry->buf_dma,
|
||||
__print_array(__entry->desc, DESC_NR, sizeof(u32))
|
||||
)
|
||||
);
|
||||
|
||||
#endif /* _HNS3_TRACE_H_ */
|
||||
|
||||
/* This must be outside ifdef _HNS3_TRACE_H */
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE hns3_trace
|
||||
#include <trace/define_trace.h>
|
@ -6,6 +6,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include "hnae3.h"
|
||||
|
||||
#define HCLGE_CMDQ_TX_TIMEOUT 30000
|
||||
#define HCLGE_DESC_DATA_LEN 6
|
||||
@ -63,6 +64,7 @@ enum hclge_cmd_status {
|
||||
struct hclge_misc_vector {
|
||||
u8 __iomem *addr;
|
||||
int vector_irq;
|
||||
char name[HNAE3_INT_NAME_LEN];
|
||||
};
|
||||
|
||||
struct hclge_cmq {
|
||||
|
@ -505,7 +505,7 @@ static const struct hclge_hw_error hclge_ssu_mem_ecc_err_int[] = {
|
||||
|
||||
static const struct hclge_hw_error hclge_ssu_port_based_err_int[] = {
|
||||
{ .int_msk = BIT(0), .msg = "roc_pkt_without_key_port",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
.reset_level = HNAE3_FUNC_RESET },
|
||||
{ .int_msk = BIT(1), .msg = "tpu_pkt_without_key_port",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
{ .int_msk = BIT(2), .msg = "igu_pkt_without_key_port",
|
||||
@ -599,7 +599,7 @@ static const struct hclge_hw_error hclge_ssu_ets_tcg_int[] = {
|
||||
|
||||
static const struct hclge_hw_error hclge_ssu_port_based_pf_int[] = {
|
||||
{ .int_msk = BIT(0), .msg = "roc_pkt_without_key_port",
|
||||
.reset_level = HNAE3_GLOBAL_RESET },
|
||||
.reset_level = HNAE3_FUNC_RESET },
|
||||
{ .int_msk = BIT(9), .msg = "low_water_line_err_port",
|
||||
.reset_level = HNAE3_NONE_RESET },
|
||||
{ .int_msk = BIT(10), .msg = "hi_water_line_err_port",
|
||||
|
@ -2835,6 +2835,12 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* In some case, mac speed get from IMP may be 0, it shouldn't be
|
||||
* set to mac->speed.
|
||||
*/
|
||||
if (!le32_to_cpu(resp->speed))
|
||||
return 0;
|
||||
|
||||
mac->speed = le32_to_cpu(resp->speed);
|
||||
/* if resp->speed_ability is 0, it means it's an old version
|
||||
* firmware, do not update these params
|
||||
@ -3177,8 +3183,10 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
|
||||
hclge_get_misc_vector(hdev);
|
||||
|
||||
/* this would be explicitly freed in the end */
|
||||
snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",
|
||||
HCLGE_NAME, pci_name(hdev->pdev));
|
||||
ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
|
||||
0, "hclge_misc", hdev);
|
||||
0, hdev->misc_vector.name, hdev);
|
||||
if (ret) {
|
||||
hclge_free_vector(hdev, 0);
|
||||
dev_err(&hdev->pdev->dev, "request misc irq(%d) fail\n",
|
||||
@ -4698,7 +4706,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;
|
||||
}
|
||||
|
||||
|
@ -86,10 +86,12 @@ static int hclge_send_mbx_msg(struct hclge_vport *vport, u8 *msg, u16 msg_len,
|
||||
int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport)
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
enum hnae3_reset_type reset_type;
|
||||
u16 reset_type;
|
||||
u8 msg_data[2];
|
||||
u8 dest_vfid;
|
||||
|
||||
BUILD_BUG_ON(HNAE3_MAX_RESET > U16_MAX);
|
||||
|
||||
dest_vfid = (u8)vport->vport_id;
|
||||
|
||||
if (hdev->reset_type == HNAE3_FUNC_RESET)
|
||||
|
@ -2376,8 +2376,10 @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)
|
||||
|
||||
hclgevf_get_misc_vector(hdev);
|
||||
|
||||
snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",
|
||||
HCLGEVF_NAME, pci_name(hdev->pdev));
|
||||
ret = request_irq(hdev->misc_vector.vector_irq, hclgevf_misc_irq_handle,
|
||||
0, "hclgevf_cmd", hdev);
|
||||
0, hdev->misc_vector.name, hdev);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev, "VF failed to request misc irq(%d)\n",
|
||||
hdev->misc_vector.vector_irq);
|
||||
|
@ -221,6 +221,7 @@ struct hclgevf_rss_cfg {
|
||||
struct hclgevf_misc_vector {
|
||||
u8 __iomem *addr;
|
||||
int vector_irq;
|
||||
char name[HNAE3_INT_NAME_LEN];
|
||||
};
|
||||
|
||||
struct hclgevf_rst_stats {
|
||||
|
Loading…
Reference in New Issue
Block a user