Commit 02b0442c authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents df2c2ba8 7f39febf
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
# Makefile for the HISILICON network device drivers. # Makefile for the HISILICON network device drivers.
# #
ccflags-y += -I$(srctree)/$(src)
obj-$(CONFIG_HNS3) += hns3pf/ obj-$(CONFIG_HNS3) += hns3pf/
obj-$(CONFIG_HNS3) += hns3vf/ obj-$(CONFIG_HNS3) += hns3vf/
......
...@@ -164,6 +164,7 @@ enum hnae3_reset_type { ...@@ -164,6 +164,7 @@ enum hnae3_reset_type {
HNAE3_IMP_RESET, HNAE3_IMP_RESET,
HNAE3_UNKNOWN_RESET, HNAE3_UNKNOWN_RESET,
HNAE3_NONE_RESET, HNAE3_NONE_RESET,
HNAE3_MAX_RESET,
}; };
enum hnae3_flr_state { enum hnae3_flr_state {
...@@ -575,8 +576,7 @@ struct hnae3_ae_algo { ...@@ -575,8 +576,7 @@ struct hnae3_ae_algo {
const struct pci_device_id *pdev_id_table; const struct pci_device_id *pdev_id_table;
}; };
#define HNAE3_INT_NAME_EXT_LEN 32 /* Max extra information length */ #define HNAE3_INT_NAME_LEN 32
#define HNAE3_INT_NAME_LEN (IFNAMSIZ + HNAE3_INT_NAME_EXT_LEN)
#define HNAE3_ITR_COUNTDOWN_START 100 #define HNAE3_ITR_COUNTDOWN_START 100
struct hnae3_tc_info { struct hnae3_tc_info {
......
...@@ -24,6 +24,12 @@ ...@@ -24,6 +24,12 @@
#include "hnae3.h" #include "hnae3.h"
#include "hns3_enet.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_set_field(origin, shift, val) ((origin) |= ((val) << (shift)))
#define hns3_tx_bd_count(S) DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE) #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) ...@@ -127,18 +133,21 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
continue; continue;
if (tqp_vectors->tx_group.ring && tqp_vectors->rx_group.ring) { if (tqp_vectors->tx_group.ring && tqp_vectors->rx_group.ring) {
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1, snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
"%s-%s-%d", priv->netdev->name, "TxRx", "%s-%s-%s-%d", hns3_driver_name,
txrx_int_idx++); pci_name(priv->ae_handle->pdev),
"TxRx", txrx_int_idx++);
txrx_int_idx++; txrx_int_idx++;
} else if (tqp_vectors->rx_group.ring) { } else if (tqp_vectors->rx_group.ring) {
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1, snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
"%s-%s-%d", priv->netdev->name, "Rx", "%s-%s-%s-%d", hns3_driver_name,
rx_int_idx++); pci_name(priv->ae_handle->pdev),
"Rx", rx_int_idx++);
} else if (tqp_vectors->tx_group.ring) { } else if (tqp_vectors->tx_group.ring) {
snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN - 1, snprintf(tqp_vectors->name, HNAE3_INT_NAME_LEN,
"%s-%s-%d", priv->netdev->name, "Tx", "%s-%s-%s-%d", hns3_driver_name,
tx_int_idx++); pci_name(priv->ae_handle->pdev),
"Tx", tx_int_idx++);
} else { } else {
/* Skip this unused q_vector */ /* Skip this unused q_vector */
continue; continue;
...@@ -155,6 +164,8 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv) ...@@ -155,6 +164,8 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
return ret; return ret;
} }
disable_irq(tqp_vectors->vector_irq);
irq_set_affinity_hint(tqp_vectors->vector_irq, irq_set_affinity_hint(tqp_vectors->vector_irq,
&tqp_vectors->affinity_mask); &tqp_vectors->affinity_mask);
...@@ -173,6 +184,7 @@ static void hns3_mask_vector_irq(struct hns3_enet_tqp_vector *tqp_vector, ...@@ -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) static void hns3_vector_enable(struct hns3_enet_tqp_vector *tqp_vector)
{ {
napi_enable(&tqp_vector->napi); napi_enable(&tqp_vector->napi);
enable_irq(tqp_vector->vector_irq);
/* enable vector */ /* enable vector */
hns3_mask_vector_irq(tqp_vector, 1); hns3_mask_vector_irq(tqp_vector, 1);
...@@ -372,18 +384,6 @@ static int hns3_nic_net_up(struct net_device *netdev) ...@@ -372,18 +384,6 @@ static int hns3_nic_net_up(struct net_device *netdev)
if (ret) if (ret)
return 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); clear_bit(HNS3_NIC_STATE_DOWN, &priv->state);
/* enable the vectors */ /* enable the vectors */
...@@ -396,22 +396,15 @@ static int hns3_nic_net_up(struct net_device *netdev) ...@@ -396,22 +396,15 @@ static int hns3_nic_net_up(struct net_device *netdev)
/* start the ae_dev */ /* start the ae_dev */
ret = h->ae_algo->ops->start ? h->ae_algo->ops->start(h) : 0; ret = h->ae_algo->ops->start ? h->ae_algo->ops->start(h) : 0;
if (ret) if (ret) {
goto out_start_err;
return 0;
out_start_err:
set_bit(HNS3_NIC_STATE_DOWN, &priv->state); set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
while (j--) while (j--)
hns3_tqp_disable(h->kinfo.tqp[j]); hns3_tqp_disable(h->kinfo.tqp[j]);
for (j = i - 1; j >= 0; j--) for (j = i - 1; j >= 0; j--)
hns3_vector_disable(&priv->tqp_vector[j]); hns3_vector_disable(&priv->tqp_vector[j]);
}
hns3_nic_uninit_irq(priv);
free_rmap:
hns3_free_rx_cpu_rmap(netdev);
return ret; return ret;
} }
...@@ -508,11 +501,6 @@ static void hns3_nic_net_down(struct net_device *netdev) ...@@ -508,11 +501,6 @@ static void hns3_nic_net_down(struct net_device *netdev)
if (ops->stop) if (ops->stop)
ops->stop(priv->ae_handle); 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 /* delay ring buffer clearing to hns3_reset_notify_uninit_enet
* during reset process, because driver may not be able * during reset process, because driver may not be able
* to disable the ring through firmware when downing the netdev. * 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, ...@@ -734,6 +722,8 @@ static int hns3_set_tso(struct sk_buff *skb, u32 *paylen,
/* get MSS for TSO */ /* get MSS for TSO */
*mss = skb_shinfo(skb)->gso_size; *mss = skb_shinfo(skb)->gso_size;
trace_hns3_tso(skb);
return 0; return 0;
} }
...@@ -1138,6 +1128,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv, ...@@ -1138,6 +1128,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
desc->tx.bdtp_fe_sc_vld_ra_ri = desc->tx.bdtp_fe_sc_vld_ra_ri =
cpu_to_le16(BIT(HNS3_TXD_VLD_B)); 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); ring_ptr_move_fw(ring, next_to_use);
return HNS3_LIKELY_BD_NUM; return HNS3_LIKELY_BD_NUM;
} }
...@@ -1161,6 +1152,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv, ...@@ -1161,6 +1152,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
desc->tx.bdtp_fe_sc_vld_ra_ri = desc->tx.bdtp_fe_sc_vld_ra_ri =
cpu_to_le16(BIT(HNS3_TXD_VLD_B)); cpu_to_le16(BIT(HNS3_TXD_VLD_B));
trace_hns3_tx_desc(ring, ring->next_to_use);
/* move ring pointer to next */ /* move ring pointer to next */
ring_ptr_move_fw(ring, next_to_use); 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, ...@@ -1286,6 +1278,14 @@ static bool hns3_skb_need_linearized(struct sk_buff *skb, unsigned int *bd_size,
return false; 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, static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring,
struct net_device *netdev, struct net_device *netdev,
struct sk_buff *skb) struct sk_buff *skb)
...@@ -1297,8 +1297,10 @@ static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring, ...@@ -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); bd_num = hns3_tx_bd_num(skb, bd_size);
if (unlikely(bd_num > HNS3_MAX_NON_TSO_BD_NUM)) { if (unlikely(bd_num > HNS3_MAX_NON_TSO_BD_NUM)) {
if (bd_num <= HNS3_MAX_TSO_BD_NUM && skb_is_gso(skb) && 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; goto out;
}
if (__skb_linearize(skb)) if (__skb_linearize(skb))
return -ENOMEM; return -ENOMEM;
...@@ -1306,8 +1308,10 @@ static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring, ...@@ -1306,8 +1308,10 @@ static int hns3_nic_maybe_stop_tx(struct hns3_enet_ring *ring,
bd_num = hns3_tx_bd_count(skb->len); bd_num = hns3_tx_bd_count(skb->len);
if ((skb_is_gso(skb) && bd_num > HNS3_MAX_TSO_BD_NUM) || if ((skb_is_gso(skb) && bd_num > HNS3_MAX_TSO_BD_NUM) ||
(!skb_is_gso(skb) && (!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; return -ENOMEM;
}
u64_stats_update_begin(&ring->syncp); u64_stats_update_begin(&ring->syncp);
ring->stats.tx_copy++; ring->stats.tx_copy++;
...@@ -1448,6 +1452,7 @@ netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -1448,6 +1452,7 @@ netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
(ring->desc_num - 1); (ring->desc_num - 1);
ring->desc[pre_ntu].tx.bdtp_fe_sc_vld_ra_ri |= ring->desc[pre_ntu].tx.bdtp_fe_sc_vld_ra_ri |=
cpu_to_le16(BIT(HNS3_TXD_FE_B)); cpu_to_le16(BIT(HNS3_TXD_FE_B));
trace_hns3_tx_desc(ring, pre_ntu);
/* Complete translate all packets */ /* Complete translate all packets */
dev_queue = netdev_get_tx_queue(netdev, ring->queue_index); 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) ...@@ -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_start = (unsigned char *)th - skb->head;
skb->csum_offset = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
skb->ip_summed = CHECKSUM_PARTIAL; skb->ip_summed = CHECKSUM_PARTIAL;
trace_hns3_gro(skb);
return 0; return 0;
} }
...@@ -2836,6 +2844,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, unsigned int length, ...@@ -2836,6 +2844,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, unsigned int length,
return -ENOMEM; return -ENOMEM;
} }
trace_hns3_rx_desc(ring);
prefetchw(skb->data); prefetchw(skb->data);
ring->pending_buf = 1; ring->pending_buf = 1;
...@@ -2910,6 +2919,7 @@ static int hns3_add_frag(struct hns3_enet_ring *ring) ...@@ -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); 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_ptr_move_fw(ring, next_to_clean);
ring->pending_buf++; ring->pending_buf++;
} while (!(bd_base_info & BIT(HNS3_RXD_FE_B))); } 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) ...@@ -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); 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->rx_group);
hns3_clear_ring_group(&tqp_vector->tx_group); hns3_clear_ring_group(&tqp_vector->tx_group);
netif_napi_del(&priv->tqp_vector[i].napi); 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 hnae3_handle *h = priv->ae_handle;
struct pci_dev *pdev = h->pdev; struct pci_dev *pdev = h->pdev;
...@@ -3638,11 +3642,10 @@ static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv) ...@@ -3638,11 +3642,10 @@ static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
tqp_vector = &priv->tqp_vector[i]; tqp_vector = &priv->tqp_vector[i];
ret = h->ae_algo->ops->put_vector(h, tqp_vector->vector_irq); ret = h->ae_algo->ops->put_vector(h, tqp_vector->vector_irq);
if (ret) if (ret)
return ret; return;
} }
devm_kfree(&pdev->dev, priv->tqp_vector); devm_kfree(&pdev->dev, priv->tqp_vector);
return 0;
} }
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,
...@@ -4041,6 +4044,18 @@ static int hns3_client_init(struct hnae3_handle *handle) ...@@ -4041,6 +4044,18 @@ static int hns3_client_init(struct hnae3_handle *handle)
goto out_reg_netdev_fail; 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); ret = hns3_client_start(handle);
if (ret) { if (ret) {
dev_err(priv->dev, "hns3_client_start fail! ret=%d\n", 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) ...@@ -4062,6 +4077,9 @@ static int hns3_client_init(struct hnae3_handle *handle)
return ret; return ret;
out_client_start: out_client_start:
hns3_free_rx_cpu_rmap(netdev);
hns3_nic_uninit_irq(priv);
out_init_irq_fail:
unregister_netdev(netdev); unregister_netdev(netdev);
out_reg_netdev_fail: out_reg_netdev_fail:
hns3_uninit_phy(netdev); hns3_uninit_phy(netdev);
...@@ -4099,15 +4117,17 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset) ...@@ -4099,15 +4117,17 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
goto out_netdev_free; goto out_netdev_free;
} }
hns3_free_rx_cpu_rmap(netdev);
hns3_nic_uninit_irq(priv);
hns3_del_all_fd_rules(netdev, true); hns3_del_all_fd_rules(netdev, true);
hns3_clear_all_ring(handle, true); hns3_clear_all_ring(handle, true);
hns3_nic_uninit_vector_data(priv); hns3_nic_uninit_vector_data(priv);
ret = hns3_nic_dealloc_vector_data(priv); hns3_nic_dealloc_vector_data(priv);
if (ret)
netdev_err(netdev, "dealloc vector error\n");
ret = hns3_uninit_all_ring(priv); ret = hns3_uninit_all_ring(priv);
if (ret) if (ret)
...@@ -4434,17 +4454,32 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle) ...@@ -4434,17 +4454,32 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
if (ret) if (ret)
goto err_uninit_vector; 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); ret = hns3_client_start(handle);
if (ret) { if (ret) {
dev_err(priv->dev, "hns3_client_start fail! ret=%d\n", 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); set_bit(HNS3_NIC_STATE_INITED, &priv->state);
return ret; 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); hns3_uninit_all_ring(priv);
err_uninit_vector: err_uninit_vector:
hns3_nic_uninit_vector_data(priv); hns3_nic_uninit_vector_data(priv);
...@@ -4494,6 +4529,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) ...@@ -4494,6 +4529,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
return 0; return 0;
} }
hns3_free_rx_cpu_rmap(netdev);
hns3_nic_uninit_irq(priv);
hns3_clear_all_ring(handle, true); hns3_clear_all_ring(handle, true);
hns3_reset_tx_queue(priv->ae_handle); hns3_reset_tx_queue(priv->ae_handle);
...@@ -4501,9 +4538,7 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) ...@@ -4501,9 +4538,7 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
hns3_store_coal(priv); hns3_store_coal(priv);
ret = hns3_nic_dealloc_vector_data(priv); hns3_nic_dealloc_vector_data(priv);
if (ret)
netdev_err(netdev, "dealloc vector error\n");
ret = hns3_uninit_all_ring(priv); ret = hns3_uninit_all_ring(priv);
if (ret) if (ret)
......
...@@ -673,4 +673,5 @@ void hns3_dbg_init(struct hnae3_handle *handle); ...@@ -673,4 +673,5 @@ void hns3_dbg_init(struct hnae3_handle *handle);
void hns3_dbg_uninit(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_register_debugfs(const char *debugfs_dir_name);
void hns3_dbg_unregister_debugfs(void); void hns3_dbg_unregister_debugfs(void);
void hns3_shinfo_pack(struct skb_shared_info *shinfo, __u32 *size);
#endif #endif
/* 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 @@ ...@@ -6,6 +6,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include "hnae3.h"
#define HCLGE_CMDQ_TX_TIMEOUT 30000 #define HCLGE_CMDQ_TX_TIMEOUT 30000
#define HCLGE_DESC_DATA_LEN 6 #define HCLGE_DESC_DATA_LEN 6
...@@ -63,6 +64,7 @@ enum hclge_cmd_status { ...@@ -63,6 +64,7 @@ enum hclge_cmd_status {
struct hclge_misc_vector { struct hclge_misc_vector {
u8 __iomem *addr; u8 __iomem *addr;
int vector_irq; int vector_irq;
char name[HNAE3_INT_NAME_LEN];
}; };
struct hclge_cmq { struct hclge_cmq {
......
...@@ -505,7 +505,7 @@ static const struct hclge_hw_error hclge_ssu_mem_ecc_err_int[] = { ...@@ -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[] = { static const struct hclge_hw_error hclge_ssu_port_based_err_int[] = {
{ .int_msk = BIT(0), .msg = "roc_pkt_without_key_port", { .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", { .int_msk = BIT(1), .msg = "tpu_pkt_without_key_port",
.reset_level = HNAE3_GLOBAL_RESET }, .reset_level = HNAE3_GLOBAL_RESET },
{ .int_msk = BIT(2), .msg = "igu_pkt_without_key_port", { .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[] = { ...@@ -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[] = { static const struct hclge_hw_error hclge_ssu_port_based_pf_int[] = {
{ .int_msk = BIT(0), .msg = "roc_pkt_without_key_port", { .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", { .int_msk = BIT(9), .msg = "low_water_line_err_port",
.reset_level = HNAE3_NONE_RESET }, .reset_level = HNAE3_NONE_RESET },
{ .int_msk = BIT(10), .msg = "hi_water_line_err_port", { .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) ...@@ -2835,6 +2835,12 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac)
return ret; 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); mac->speed = le32_to_cpu(resp->speed);
/* if resp->speed_ability is 0, it means it's an old version /* if resp->speed_ability is 0, it means it's an old version
* firmware, do not update these params * firmware, do not update these params
...@@ -3177,8 +3183,10 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev) ...@@ -3177,8 +3183,10 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
hclge_get_misc_vector(hdev); hclge_get_misc_vector(hdev);
/* this would be explicitly freed in the end */ /* 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, ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
0, "hclge_misc", hdev); 0, hdev->misc_vector.name, hdev);
if (ret) { if (ret) {
hclge_free_vector(hdev, 0); hclge_free_vector(hdev, 0);
dev_err(&hdev->pdev->dev, "request misc irq(%d) fail\n", 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, ...@@ -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); vector_id = hclge_get_vector_index(hdev, vector);
if (vector_id < 0) { if (vector_id < 0) {
dev_err(&hdev->pdev->dev, 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; return vector_id;
} }
......
...@@ -86,10 +86,12 @@ static int hclge_send_mbx_msg(struct hclge_vport *vport, u8 *msg, u16 msg_len, ...@@ -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) int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport)
{ {
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
enum hnae3_reset_type reset_type; u16 reset_type;
u8 msg_data[2]; u8 msg_data[2];
u8 dest_vfid; u8 dest_vfid;
BUILD_BUG_ON(HNAE3_MAX_RESET > U16_MAX);
dest_vfid = (u8)vport->vport_id; dest_vfid = (u8)vport->vport_id;
if (hdev->reset_type == HNAE3_FUNC_RESET) if (hdev->reset_type == HNAE3_FUNC_RESET)
......
...@@ -2376,8 +2376,10 @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev) ...@@ -2376,8 +2376,10 @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)
hclgevf_get_misc_vector(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, ret = request_irq(hdev->misc_vector.vector_irq, hclgevf_misc_irq_handle,
0, "hclgevf_cmd", hdev); 0, hdev->misc_vector.name, hdev);
if (ret) { if (ret) {
dev_err(&hdev->pdev->dev, "VF failed to request misc irq(%d)\n", dev_err(&hdev->pdev->dev, "VF failed to request misc irq(%d)\n",
hdev->misc_vector.vector_irq); hdev->misc_vector.vector_irq);
......
...@@ -221,6 +221,7 @@ struct hclgevf_rss_cfg { ...@@ -221,6 +221,7 @@ struct hclgevf_rss_cfg {
struct hclgevf_misc_vector { struct hclgevf_misc_vector {
u8 __iomem *addr; u8 __iomem *addr;
int vector_irq; int vector_irq;
char name[HNAE3_INT_NAME_LEN];
}; };
struct hclgevf_rst_stats { struct hclgevf_rst_stats {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment