Commit 26e392ca authored by David S. Miller's avatar David S. Miller

Merge branch 'hns3-next'

Huazhong Tan says:

====================
net: hns3: some code optimizations & cleanups & bugfixes

This patch-set includes code optimizations, cleanups and bugfixes for
the HNS3 ethernet controller driver.

[patch 1/12 - 6/12] adds some code optimizations and bugfixes about RAS
and MSI-X HW error.

[patch 7/12] fixes a loading issue.

[patch 8/12 - 11/12] adds some bugfixes.

[patch 12/12] adds some cleanups, which does not change the logic of code.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents cbbe9bd0 ebaf1908
...@@ -26,7 +26,8 @@ static bool hnae3_client_match(enum hnae3_client_type client_type) ...@@ -26,7 +26,8 @@ static bool hnae3_client_match(enum hnae3_client_type client_type)
} }
void hnae3_set_client_init_flag(struct hnae3_client *client, void hnae3_set_client_init_flag(struct hnae3_client *client,
struct hnae3_ae_dev *ae_dev, int inited) struct hnae3_ae_dev *ae_dev,
unsigned int inited)
{ {
if (!client || !ae_dev) if (!client || !ae_dev)
return; return;
......
...@@ -214,6 +214,7 @@ struct hnae3_ae_dev { ...@@ -214,6 +214,7 @@ struct hnae3_ae_dev {
struct list_head node; struct list_head node;
u32 flag; u32 flag;
u8 override_pci_need_reset; /* fix to stop multiple reset happening */ u8 override_pci_need_reset; /* fix to stop multiple reset happening */
unsigned long hw_err_reset_req;
enum hnae3_reset_type reset_type; enum hnae3_reset_type reset_type;
void *priv; void *priv;
}; };
...@@ -459,6 +460,8 @@ struct hnae3_ae_ops { ...@@ -459,6 +460,8 @@ struct hnae3_ae_ops {
u16 vlan, u8 qos, __be16 proto); u16 vlan, u8 qos, __be16 proto);
int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable); int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle); void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle);
enum hnae3_reset_type (*get_reset_level)(struct hnae3_ae_dev *ae_dev,
unsigned long *addr);
void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev, void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev,
enum hnae3_reset_type rst_type); enum hnae3_reset_type rst_type);
void (*get_channels)(struct hnae3_handle *handle, void (*get_channels)(struct hnae3_handle *handle,
...@@ -490,7 +493,7 @@ struct hnae3_ae_ops { ...@@ -490,7 +493,7 @@ struct hnae3_ae_ops {
void (*enable_fd)(struct hnae3_handle *handle, bool enable); void (*enable_fd)(struct hnae3_handle *handle, bool enable);
int (*add_arfs_entry)(struct hnae3_handle *handle, u16 queue_id, int (*add_arfs_entry)(struct hnae3_handle *handle, u16 queue_id,
u16 flow_id, struct flow_keys *fkeys); u16 flow_id, struct flow_keys *fkeys);
int (*dbg_run_cmd)(struct hnae3_handle *handle, char *cmd_buf); int (*dbg_run_cmd)(struct hnae3_handle *handle, const char *cmd_buf);
pci_ers_result_t (*handle_hw_ras_error)(struct hnae3_ae_dev *ae_dev); pci_ers_result_t (*handle_hw_ras_error)(struct hnae3_ae_dev *ae_dev);
bool (*get_hw_reset_stat)(struct hnae3_handle *handle); bool (*get_hw_reset_stat)(struct hnae3_handle *handle);
bool (*ae_dev_resetting)(struct hnae3_handle *handle); bool (*ae_dev_resetting)(struct hnae3_handle *handle);
...@@ -642,5 +645,6 @@ void hnae3_unregister_client(struct hnae3_client *client); ...@@ -642,5 +645,6 @@ void hnae3_unregister_client(struct hnae3_client *client);
int hnae3_register_client(struct hnae3_client *client); int hnae3_register_client(struct hnae3_client *client);
void hnae3_set_client_init_flag(struct hnae3_client *client, void hnae3_set_client_init_flag(struct hnae3_client *client,
struct hnae3_ae_dev *ae_dev, int inited); struct hnae3_ae_dev *ae_dev,
unsigned int inited);
#endif #endif
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
static struct dentry *hns3_dbgfs_root; static struct dentry *hns3_dbgfs_root;
static int hns3_dbg_queue_info(struct hnae3_handle *h, char *cmd_buf) static int hns3_dbg_queue_info(struct hnae3_handle *h,
const char *cmd_buf)
{ {
struct hns3_nic_priv *priv = h->priv; struct hns3_nic_priv *priv = h->priv;
struct hns3_nic_ring_data *ring_data; struct hns3_nic_ring_data *ring_data;
...@@ -155,7 +156,7 @@ static int hns3_dbg_queue_map(struct hnae3_handle *h) ...@@ -155,7 +156,7 @@ static int hns3_dbg_queue_map(struct hnae3_handle *h)
return 0; return 0;
} }
static int hns3_dbg_bd_info(struct hnae3_handle *h, char *cmd_buf) static int hns3_dbg_bd_info(struct hnae3_handle *h, const char *cmd_buf)
{ {
struct hns3_nic_priv *priv = h->priv; struct hns3_nic_priv *priv = h->priv;
struct hns3_nic_ring_data *ring_data; struct hns3_nic_ring_data *ring_data;
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#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)
static void hns3_clear_all_ring(struct hnae3_handle *h); static void hns3_clear_all_ring(struct hnae3_handle *h);
static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h); static void hns3_force_clear_all_ring(struct hnae3_handle *h);
static void hns3_remove_hw_addr(struct net_device *netdev); static void hns3_remove_hw_addr(struct net_device *netdev);
static const char hns3_driver_name[] = "hns3"; static const char hns3_driver_name[] = "hns3";
...@@ -143,6 +143,7 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv) ...@@ -143,6 +143,7 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
if (ret) { if (ret) {
netdev_err(priv->netdev, "request irq(%d) fail\n", netdev_err(priv->netdev, "request irq(%d) fail\n",
tqp_vectors->vector_irq); tqp_vectors->vector_irq);
hns3_nic_uninit_irq(priv);
return ret; return ret;
} }
...@@ -487,7 +488,12 @@ static void hns3_nic_net_down(struct net_device *netdev) ...@@ -487,7 +488,12 @@ static void hns3_nic_net_down(struct net_device *netdev)
/* free irq resources */ /* free irq resources */
hns3_nic_uninit_irq(priv); hns3_nic_uninit_irq(priv);
hns3_clear_all_ring(priv->ae_handle); /* 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.
*/
if (!hns3_nic_resetting(netdev))
hns3_clear_all_ring(priv->ae_handle);
} }
static int hns3_nic_net_stop(struct net_device *netdev) static int hns3_nic_net_stop(struct net_device *netdev)
...@@ -1005,7 +1011,8 @@ static int hns3_fill_desc_vtags(struct sk_buff *skb, ...@@ -1005,7 +1011,8 @@ static int hns3_fill_desc_vtags(struct sk_buff *skb,
} }
static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv, static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
int size, int frag_end, enum hns_desc_type type) unsigned int size, int frag_end,
enum hns_desc_type type)
{ {
struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use]; struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
struct hns3_desc *desc = &ring->desc[ring->next_to_use]; struct hns3_desc *desc = &ring->desc[ring->next_to_use];
...@@ -1509,12 +1516,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev, ...@@ -1509,12 +1516,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
static int hns3_setup_tc(struct net_device *netdev, void *type_data) static int hns3_setup_tc(struct net_device *netdev, void *type_data)
{ {
struct tc_mqprio_qopt_offload *mqprio_qopt = type_data; struct tc_mqprio_qopt_offload *mqprio_qopt = type_data;
struct hnae3_handle *h = hns3_get_handle(netdev);
struct hnae3_knic_private_info *kinfo = &h->kinfo;
u8 *prio_tc = mqprio_qopt->qopt.prio_tc_map; u8 *prio_tc = mqprio_qopt->qopt.prio_tc_map;
struct hnae3_knic_private_info *kinfo;
u8 tc = mqprio_qopt->qopt.num_tc; u8 tc = mqprio_qopt->qopt.num_tc;
u16 mode = mqprio_qopt->mode; u16 mode = mqprio_qopt->mode;
u8 hw = mqprio_qopt->qopt.hw; u8 hw = mqprio_qopt->qopt.hw;
struct hnae3_handle *h;
if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS && if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS &&
mode == TC_MQPRIO_MODE_CHANNEL) || (!hw && tc == 0))) mode == TC_MQPRIO_MODE_CHANNEL) || (!hw && tc == 0)))
...@@ -1526,6 +1533,9 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) ...@@ -1526,6 +1533,9 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
if (!netdev) if (!netdev)
return -EINVAL; return -EINVAL;
h = hns3_get_handle(netdev);
kinfo = &h->kinfo;
return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ?
kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP; kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP;
} }
...@@ -1930,17 +1940,22 @@ static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev, ...@@ -1930,17 +1940,22 @@ static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev,
static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev) static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev)
{ {
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev); struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
const struct hnae3_ae_ops *ops = ae_dev->ops;
enum hnae3_reset_type reset_type;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
dev_info(dev, "requesting reset due to PCI error\n");
if (!ae_dev || !ae_dev->ops) if (!ae_dev || !ae_dev->ops)
return PCI_ERS_RESULT_NONE; return PCI_ERS_RESULT_NONE;
/* request the reset */ /* request the reset */
if (ae_dev->ops->reset_event) { if (ops->reset_event) {
if (!ae_dev->override_pci_need_reset) if (!ae_dev->override_pci_need_reset) {
ae_dev->ops->reset_event(pdev, NULL); reset_type = ops->get_reset_level(ae_dev,
&ae_dev->hw_err_reset_req);
ops->set_default_reset_request(ae_dev, reset_type);
dev_info(dev, "requesting reset due to PCI error\n");
ops->reset_event(pdev, NULL);
}
return PCI_ERS_RESULT_RECOVERED; return PCI_ERS_RESULT_RECOVERED;
} }
...@@ -3410,7 +3425,7 @@ static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv) ...@@ -3410,7 +3425,7 @@ static int hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
} }
static int hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv, static int hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
int ring_type) unsigned int ring_type)
{ {
struct hns3_nic_ring_data *ring_data = priv->ring_data; struct hns3_nic_ring_data *ring_data = priv->ring_data;
int queue_num = priv->ae_handle->kinfo.num_tqps; int queue_num = priv->ae_handle->kinfo.num_tqps;
...@@ -3905,7 +3920,7 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset) ...@@ -3905,7 +3920,7 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
hns3_del_all_fd_rules(netdev, true); hns3_del_all_fd_rules(netdev, true);
hns3_force_clear_all_rx_ring(handle); hns3_force_clear_all_ring(handle);
hns3_nic_uninit_vector_data(priv); hns3_nic_uninit_vector_data(priv);
...@@ -4074,7 +4089,7 @@ static void hns3_force_clear_rx_ring(struct hns3_enet_ring *ring) ...@@ -4074,7 +4089,7 @@ static void hns3_force_clear_rx_ring(struct hns3_enet_ring *ring)
} }
} }
static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h) static void hns3_force_clear_all_ring(struct hnae3_handle *h)
{ {
struct net_device *ndev = h->kinfo.netdev; struct net_device *ndev = h->kinfo.netdev;
struct hns3_nic_priv *priv = netdev_priv(ndev); struct hns3_nic_priv *priv = netdev_priv(ndev);
...@@ -4082,6 +4097,9 @@ static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h) ...@@ -4082,6 +4097,9 @@ static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h)
u32 i; u32 i;
for (i = 0; i < h->kinfo.num_tqps; i++) { for (i = 0; i < h->kinfo.num_tqps; i++) {
ring = priv->ring_data[i].ring;
hns3_clear_tx_ring(ring);
ring = priv->ring_data[i + h->kinfo.num_tqps].ring; ring = priv->ring_data[i + h->kinfo.num_tqps].ring;
hns3_force_clear_rx_ring(ring); hns3_force_clear_rx_ring(ring);
} }
...@@ -4312,7 +4330,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) ...@@ -4312,7 +4330,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
return 0; return 0;
} }
hns3_force_clear_all_rx_ring(handle); hns3_clear_all_ring(handle);
hns3_force_clear_all_ring(handle);
hns3_nic_uninit_vector_data(priv); hns3_nic_uninit_vector_data(priv);
......
...@@ -417,7 +417,7 @@ struct hns3_enet_ring { ...@@ -417,7 +417,7 @@ struct hns3_enet_ring {
*/ */
int next_to_clean; int next_to_clean;
int pull_len; /* head length for current packet */ u32 pull_len; /* head length for current packet */
u32 frag_num; u32 frag_num;
unsigned char *va; /* first buffer address for current packet */ unsigned char *va; /* first buffer address for current packet */
......
...@@ -250,11 +250,13 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode) ...@@ -250,11 +250,13 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
skb_get(skb); skb_get(skb);
tx_ret = hns3_nic_net_xmit(skb, ndev); tx_ret = hns3_nic_net_xmit(skb, ndev);
if (tx_ret == NETDEV_TX_OK) if (tx_ret == NETDEV_TX_OK) {
good_cnt++; good_cnt++;
else } else {
kfree_skb(skb);
netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n", netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n",
tx_ret); tx_ret);
}
} }
if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) { if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) {
ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR; ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR;
......
...@@ -61,8 +61,8 @@ static int hclge_dbg_cmd_send(struct hclge_dev *hdev, ...@@ -61,8 +61,8 @@ static int hclge_dbg_cmd_send(struct hclge_dev *hdev,
static void hclge_dbg_dump_reg_common(struct hclge_dev *hdev, static void hclge_dbg_dump_reg_common(struct hclge_dev *hdev,
struct hclge_dbg_dfx_message *dfx_message, struct hclge_dbg_dfx_message *dfx_message,
char *cmd_buf, int msg_num, int offset, const char *cmd_buf, int msg_num,
enum hclge_opcode_type cmd) int offset, enum hclge_opcode_type cmd)
{ {
#define BD_DATA_NUM 6 #define BD_DATA_NUM 6
...@@ -111,7 +111,7 @@ static void hclge_dbg_dump_reg_common(struct hclge_dev *hdev, ...@@ -111,7 +111,7 @@ static void hclge_dbg_dump_reg_common(struct hclge_dev *hdev,
kfree(desc_src); kfree(desc_src);
} }
static void hclge_dbg_dump_dcb(struct hclge_dev *hdev, char *cmd_buf) static void hclge_dbg_dump_dcb(struct hclge_dev *hdev, const char *cmd_buf)
{ {
struct device *dev = &hdev->pdev->dev; struct device *dev = &hdev->pdev->dev;
struct hclge_dbg_bitmap_cmd *bitmap; struct hclge_dbg_bitmap_cmd *bitmap;
...@@ -211,7 +211,7 @@ static void hclge_dbg_dump_dcb(struct hclge_dev *hdev, char *cmd_buf) ...@@ -211,7 +211,7 @@ static void hclge_dbg_dump_dcb(struct hclge_dev *hdev, char *cmd_buf)
dev_info(dev, "IGU_TX_PRI_MAP_TC_CFG: 0x%x\n", desc[0].data[5]); dev_info(dev, "IGU_TX_PRI_MAP_TC_CFG: 0x%x\n", desc[0].data[5]);
} }
static void hclge_dbg_dump_reg_cmd(struct hclge_dev *hdev, char *cmd_buf) static void hclge_dbg_dump_reg_cmd(struct hclge_dev *hdev, const char *cmd_buf)
{ {
int msg_num; int msg_num;
...@@ -541,7 +541,8 @@ static void hclge_dbg_dump_tm(struct hclge_dev *hdev) ...@@ -541,7 +541,8 @@ static void hclge_dbg_dump_tm(struct hclge_dev *hdev)
cmd, ret); cmd, ret);
} }
static void hclge_dbg_dump_tm_map(struct hclge_dev *hdev, char *cmd_buf) static void hclge_dbg_dump_tm_map(struct hclge_dev *hdev,
const char *cmd_buf)
{ {
struct hclge_bp_to_qs_map_cmd *bp_to_qs_map_cmd; struct hclge_bp_to_qs_map_cmd *bp_to_qs_map_cmd;
struct hclge_nq_to_qs_link_cmd *nq_to_qs_map; struct hclge_nq_to_qs_link_cmd *nq_to_qs_map;
...@@ -984,7 +985,8 @@ void hclge_dbg_get_m7_stats_info(struct hclge_dev *hdev) ...@@ -984,7 +985,8 @@ void hclge_dbg_get_m7_stats_info(struct hclge_dev *hdev)
* @hdev: pointer to struct hclge_dev * @hdev: pointer to struct hclge_dev
* @cmd_buf: string that contains offset and length * @cmd_buf: string that contains offset and length
*/ */
static void hclge_dbg_dump_ncl_config(struct hclge_dev *hdev, char *cmd_buf) static void hclge_dbg_dump_ncl_config(struct hclge_dev *hdev,
const char *cmd_buf)
{ {
#define HCLGE_MAX_NCL_CONFIG_OFFSET 4096 #define HCLGE_MAX_NCL_CONFIG_OFFSET 4096
#define HCLGE_MAX_NCL_CONFIG_LENGTH (20 + 24 * 4) #define HCLGE_MAX_NCL_CONFIG_LENGTH (20 + 24 * 4)
...@@ -1063,7 +1065,7 @@ static void hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev) ...@@ -1063,7 +1065,7 @@ static void hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev)
} }
} }
int hclge_dbg_run_cmd(struct hnae3_handle *handle, char *cmd_buf) int hclge_dbg_run_cmd(struct hnae3_handle *handle, const char *cmd_buf)
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
......
...@@ -631,29 +631,20 @@ static const struct hclge_hw_error hclge_rocee_qmm_ovf_err_int[] = { ...@@ -631,29 +631,20 @@ static const struct hclge_hw_error hclge_rocee_qmm_ovf_err_int[] = {
{ /* sentinel */ } { /* sentinel */ }
}; };
static enum hnae3_reset_type hclge_log_error(struct device *dev, char *reg, static void hclge_log_error(struct device *dev, char *reg,
const struct hclge_hw_error *err, const struct hclge_hw_error *err,
u32 err_sts) u32 err_sts, unsigned long *reset_requests)
{ {
enum hnae3_reset_type reset_level = HNAE3_FUNC_RESET;
bool need_reset = false;
while (err->msg) { while (err->msg) {
if (err->int_msk & err_sts) { if (err->int_msk & err_sts) {
dev_warn(dev, "%s %s found [error status=0x%x]\n", dev_warn(dev, "%s %s found [error status=0x%x]\n",
reg, err->msg, err_sts); reg, err->msg, err_sts);
if (err->reset_level != HNAE3_NONE_RESET && if (err->reset_level &&
err->reset_level >= reset_level) { err->reset_level != HNAE3_NONE_RESET)
reset_level = err->reset_level; set_bit(err->reset_level, reset_requests);
need_reset = true;
}
} }
err++; err++;
} }
if (need_reset)
return reset_level;
else
return HNAE3_NONE_RESET;
} }
/* hclge_cmd_query_error: read the error information /* hclge_cmd_query_error: read the error information
...@@ -1069,13 +1060,6 @@ static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en) ...@@ -1069,13 +1060,6 @@ static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en)
return ret; return ret;
} }
#define HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type) \
do { \
if (ae_dev->ops->set_default_reset_request) \
ae_dev->ops->set_default_reset_request(ae_dev, \
reset_type); \
} while (0)
/* hclge_handle_mpf_ras_error: handle all main PF RAS errors /* hclge_handle_mpf_ras_error: handle all main PF RAS errors
* @hdev: pointer to struct hclge_dev * @hdev: pointer to struct hclge_dev
* @desc: descriptor for describing the command * @desc: descriptor for describing the command
...@@ -1089,7 +1073,6 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev, ...@@ -1089,7 +1073,6 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev,
int num) int num)
{ {
struct hnae3_ae_dev *ae_dev = hdev->ae_dev; struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
enum hnae3_reset_type reset_level;
struct device *dev = &hdev->pdev->dev; struct device *dev = &hdev->pdev->dev;
__le32 *desc_data; __le32 *desc_data;
u32 status; u32 status;
...@@ -1106,95 +1089,74 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev, ...@@ -1106,95 +1089,74 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev,
/* log HNS common errors */ /* log HNS common errors */
status = le32_to_cpu(desc[0].data[0]); status = le32_to_cpu(desc[0].data[0]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "IMP_TCM_ECC_INT_STS", hclge_log_error(dev, "IMP_TCM_ECC_INT_STS",
&hclge_imp_tcm_ecc_int[0], &hclge_imp_tcm_ecc_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(desc[0].data[1]); status = le32_to_cpu(desc[0].data[1]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "CMDQ_MEM_ECC_INT_STS", hclge_log_error(dev, "CMDQ_MEM_ECC_INT_STS",
&hclge_cmdq_nic_mem_ecc_int[0], &hclge_cmdq_nic_mem_ecc_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
if ((le32_to_cpu(desc[0].data[2])) & BIT(0)) { if ((le32_to_cpu(desc[0].data[2])) & BIT(0))
dev_warn(dev, "imp_rd_data_poison_err found\n"); dev_warn(dev, "imp_rd_data_poison_err found\n");
HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_NONE_RESET);
}
status = le32_to_cpu(desc[0].data[3]); status = le32_to_cpu(desc[0].data[3]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "TQP_INT_ECC_INT_STS", hclge_log_error(dev, "TQP_INT_ECC_INT_STS",
&hclge_tqp_int_ecc_int[0], &hclge_tqp_int_ecc_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(desc[0].data[4]); status = le32_to_cpu(desc[0].data[4]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "MSIX_ECC_INT_STS", hclge_log_error(dev, "MSIX_ECC_INT_STS",
&hclge_msix_sram_ecc_int[0], &hclge_msix_sram_ecc_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log SSU(Storage Switch Unit) errors */ /* log SSU(Storage Switch Unit) errors */
desc_data = (__le32 *)&desc[2]; desc_data = (__le32 *)&desc[2];
status = le32_to_cpu(*(desc_data + 2)); status = le32_to_cpu(*(desc_data + 2));
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_ECC_MULTI_BIT_INT_0", hclge_log_error(dev, "SSU_ECC_MULTI_BIT_INT_0",
&hclge_ssu_mem_ecc_err_int[0], &hclge_ssu_mem_ecc_err_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(*(desc_data + 3)) & BIT(0); status = le32_to_cpu(*(desc_data + 3)) & BIT(0);
if (status) { if (status) {
dev_warn(dev, "SSU_ECC_MULTI_BIT_INT_1 ssu_mem32_ecc_mbit_err found [error status=0x%x]\n", dev_warn(dev, "SSU_ECC_MULTI_BIT_INT_1 ssu_mem32_ecc_mbit_err found [error status=0x%x]\n",
status); status);
HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET); set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
} }
status = le32_to_cpu(*(desc_data + 4)) & HCLGE_SSU_COMMON_ERR_INT_MASK; status = le32_to_cpu(*(desc_data + 4)) & HCLGE_SSU_COMMON_ERR_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_COMMON_ERR_INT", hclge_log_error(dev, "SSU_COMMON_ERR_INT",
&hclge_ssu_com_err_int[0], &hclge_ssu_com_err_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log IGU(Ingress Unit) errors */ /* log IGU(Ingress Unit) errors */
desc_data = (__le32 *)&desc[3]; desc_data = (__le32 *)&desc[3];
status = le32_to_cpu(*desc_data) & HCLGE_IGU_INT_MASK; status = le32_to_cpu(*desc_data) & HCLGE_IGU_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "IGU_INT_STS", hclge_log_error(dev, "IGU_INT_STS",
&hclge_igu_int[0], status); &hclge_igu_int[0], status,
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level); &ae_dev->hw_err_reset_req);
}
/* log PPP(Programmable Packet Process) errors */ /* log PPP(Programmable Packet Process) errors */
desc_data = (__le32 *)&desc[4]; desc_data = (__le32 *)&desc[4];
status = le32_to_cpu(*(desc_data + 1)); status = le32_to_cpu(*(desc_data + 1));
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST1",
hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST1", &hclge_ppp_mpf_abnormal_int_st1[0], status,
&hclge_ppp_mpf_abnormal_int_st1[0], &ae_dev->hw_err_reset_req);
status);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPP_MPF_INT_ST3_MASK; status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPP_MPF_INT_ST3_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST3",
hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST3", &hclge_ppp_mpf_abnormal_int_st3[0], status,
&hclge_ppp_mpf_abnormal_int_st3[0], &ae_dev->hw_err_reset_req);
status);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log PPU(RCB) errors */ /* log PPU(RCB) errors */
desc_data = (__le32 *)&desc[5]; desc_data = (__le32 *)&desc[5];
...@@ -1202,61 +1164,50 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev, ...@@ -1202,61 +1164,50 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev,
if (status) { if (status) {
dev_warn(dev, "PPU_MPF_ABNORMAL_INT_ST1 %s found\n", dev_warn(dev, "PPU_MPF_ABNORMAL_INT_ST1 %s found\n",
"rpu_rx_pkt_ecc_mbit_err"); "rpu_rx_pkt_ecc_mbit_err");
HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET); set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
} }
status = le32_to_cpu(*(desc_data + 2)); status = le32_to_cpu(*(desc_data + 2));
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST2",
hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST2", &hclge_ppu_mpf_abnormal_int_st2[0], status,
&hclge_ppu_mpf_abnormal_int_st2[0], &ae_dev->hw_err_reset_req);
status);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPU_MPF_INT_ST3_MASK; status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPU_MPF_INT_ST3_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST3",
hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST3", &hclge_ppu_mpf_abnormal_int_st3[0], status,
&hclge_ppu_mpf_abnormal_int_st3[0], &ae_dev->hw_err_reset_req);
status);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log TM(Traffic Manager) errors */ /* log TM(Traffic Manager) errors */
desc_data = (__le32 *)&desc[6]; desc_data = (__le32 *)&desc[6];
status = le32_to_cpu(*desc_data); status = le32_to_cpu(*desc_data);
if (status) { if (status)
reset_level = hclge_log_error(dev, "TM_SCH_RINT", hclge_log_error(dev, "TM_SCH_RINT",
&hclge_tm_sch_rint[0], status); &hclge_tm_sch_rint[0], status,
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level); &ae_dev->hw_err_reset_req);
}
/* log QCN(Quantized Congestion Control) errors */ /* log QCN(Quantized Congestion Control) errors */
desc_data = (__le32 *)&desc[7]; desc_data = (__le32 *)&desc[7];
status = le32_to_cpu(*desc_data) & HCLGE_QCN_FIFO_INT_MASK; status = le32_to_cpu(*desc_data) & HCLGE_QCN_FIFO_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "QCN_FIFO_RINT", hclge_log_error(dev, "QCN_FIFO_RINT",
&hclge_qcn_fifo_rint[0], status); &hclge_qcn_fifo_rint[0], status,
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level); &ae_dev->hw_err_reset_req);
}
status = le32_to_cpu(*(desc_data + 1)) & HCLGE_QCN_ECC_INT_MASK; status = le32_to_cpu(*(desc_data + 1)) & HCLGE_QCN_ECC_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "QCN_ECC_RINT", hclge_log_error(dev, "QCN_ECC_RINT",
&hclge_qcn_ecc_rint[0], &hclge_qcn_ecc_rint[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log NCSI errors */ /* log NCSI errors */
desc_data = (__le32 *)&desc[9]; desc_data = (__le32 *)&desc[9];
status = le32_to_cpu(*desc_data) & HCLGE_NCSI_ECC_INT_MASK; status = le32_to_cpu(*desc_data) & HCLGE_NCSI_ECC_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "NCSI_ECC_INT_RPT", hclge_log_error(dev, "NCSI_ECC_INT_RPT",
&hclge_ncsi_err_int[0], status); &hclge_ncsi_err_int[0], status,
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level); &ae_dev->hw_err_reset_req);
}
/* clear all main PF RAS errors */ /* clear all main PF RAS errors */
hclge_cmd_reuse_desc(&desc[0], false); hclge_cmd_reuse_desc(&desc[0], false);
...@@ -1281,7 +1232,6 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev, ...@@ -1281,7 +1232,6 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev,
{ {
struct hnae3_ae_dev *ae_dev = hdev->ae_dev; struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
struct device *dev = &hdev->pdev->dev; struct device *dev = &hdev->pdev->dev;
enum hnae3_reset_type reset_level;
__le32 *desc_data; __le32 *desc_data;
u32 status; u32 status;
int ret; int ret;
...@@ -1297,48 +1247,38 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev, ...@@ -1297,48 +1247,38 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev,
/* log SSU(Storage Switch Unit) errors */ /* log SSU(Storage Switch Unit) errors */
status = le32_to_cpu(desc[0].data[0]); status = le32_to_cpu(desc[0].data[0]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT", hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT",
&hclge_ssu_port_based_err_int[0], &hclge_ssu_port_based_err_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(desc[0].data[1]); status = le32_to_cpu(desc[0].data[1]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_FIFO_OVERFLOW_INT", hclge_log_error(dev, "SSU_FIFO_OVERFLOW_INT",
&hclge_ssu_fifo_overflow_int[0], &hclge_ssu_fifo_overflow_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
status = le32_to_cpu(desc[0].data[2]); status = le32_to_cpu(desc[0].data[2]);
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_ETS_TCG_INT", hclge_log_error(dev, "SSU_ETS_TCG_INT",
&hclge_ssu_ets_tcg_int[0], &hclge_ssu_ets_tcg_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log IGU(Ingress Unit) EGU(Egress Unit) TNL errors */ /* log IGU(Ingress Unit) EGU(Egress Unit) TNL errors */
desc_data = (__le32 *)&desc[1]; desc_data = (__le32 *)&desc[1];
status = le32_to_cpu(*desc_data) & HCLGE_IGU_EGU_TNL_INT_MASK; status = le32_to_cpu(*desc_data) & HCLGE_IGU_EGU_TNL_INT_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "IGU_EGU_TNL_INT_STS", hclge_log_error(dev, "IGU_EGU_TNL_INT_STS",
&hclge_igu_egu_tnl_int[0], &hclge_igu_egu_tnl_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* log PPU(RCB) errors */ /* log PPU(RCB) errors */
desc_data = (__le32 *)&desc[3]; desc_data = (__le32 *)&desc[3];
status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_RAS_MASK; status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_RAS_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST0", hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST0",
&hclge_ppu_pf_abnormal_int[0], &hclge_ppu_pf_abnormal_int[0], status,
status); &ae_dev->hw_err_reset_req);
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
}
/* clear all PF RAS errors */ /* clear all PF RAS errors */
hclge_cmd_reuse_desc(&desc[0], false); hclge_cmd_reuse_desc(&desc[0], false);
...@@ -1597,7 +1537,7 @@ static void hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev) ...@@ -1597,7 +1537,7 @@ static void hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
reset_type = hclge_log_and_clear_rocee_ras_error(hdev); reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
if (reset_type != HNAE3_NONE_RESET) if (reset_type != HNAE3_NONE_RESET)
HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type); set_bit(reset_type, &ae_dev->hw_err_reset_req);
} }
static const struct hclge_hw_blk hw_blk[] = { static const struct hclge_hw_blk hw_blk[] = {
...@@ -1655,8 +1595,18 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev) ...@@ -1655,8 +1595,18 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
struct device *dev = &hdev->pdev->dev; struct device *dev = &hdev->pdev->dev;
u32 status; u32 status;
if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
dev_err(dev,
"Can't recover - RAS error reported during dev init\n");
return PCI_ERS_RESULT_NONE;
}
status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG); 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;
/* Handling Non-fatal HNS RAS errors */ /* Handling Non-fatal HNS RAS errors */
if (status & HCLGE_RAS_REG_NFE_MASK) { if (status & HCLGE_RAS_REG_NFE_MASK) {
dev_warn(dev, dev_warn(dev,
...@@ -1676,8 +1626,9 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev) ...@@ -1676,8 +1626,9 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
hclge_handle_rocee_ras_error(ae_dev); hclge_handle_rocee_ras_error(ae_dev);
} }
if (status & HCLGE_RAS_REG_NFE_MASK || if ((status & HCLGE_RAS_REG_NFE_MASK ||
status & HCLGE_RAS_REG_ROCEE_ERR_MASK) { status & HCLGE_RAS_REG_ROCEE_ERR_MASK) &&
ae_dev->hw_err_reset_req) {
ae_dev->override_pci_need_reset = 0; ae_dev->override_pci_need_reset = 0;
return PCI_ERS_RESULT_NEED_RESET; return PCI_ERS_RESULT_NEED_RESET;
} }
...@@ -1686,6 +1637,21 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev) ...@@ -1686,6 +1637,21 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
return PCI_ERS_RESULT_RECOVERED; return PCI_ERS_RESULT_RECOVERED;
} }
static int hclge_clear_hw_msix_error(struct hclge_dev *hdev,
struct hclge_desc *desc, bool is_mpf,
u32 bd_num)
{
if (is_mpf)
desc[0].opcode =
cpu_to_le16(HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT);
else
desc[0].opcode = cpu_to_le16(HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT);
desc[0].flag = cpu_to_le16(HCLGE_CMD_FLAG_NO_INTR | HCLGE_CMD_FLAG_IN);
return hclge_cmd_send(&hdev->hw, &desc[0], bd_num);
}
/* hclge_query_8bd_info: query information about over_8bd_nfe_err /* hclge_query_8bd_info: query information about over_8bd_nfe_err
* @hdev: pointer to struct hclge_dev * @hdev: pointer to struct hclge_dev
* @vf_id: Index of the virtual function with error * @vf_id: Index of the virtual function with error
...@@ -1761,130 +1727,159 @@ static void hclge_handle_over_8bd_err(struct hclge_dev *hdev, ...@@ -1761,130 +1727,159 @@ static void hclge_handle_over_8bd_err(struct hclge_dev *hdev,
} }
} }
int hclge_handle_hw_msix_error(struct hclge_dev *hdev, /* hclge_handle_mpf_msix_error: handle all main PF MSI-X errors
unsigned long *reset_requests) * @hdev: pointer to struct hclge_dev
* @desc: descriptor for describing the command
* @mpf_bd_num: number of extended command structures
* @reset_requests: record of the reset level that we need
*
* This function handles all the main PF MSI-X errors in the hw register/s
* using command.
*/
static int hclge_handle_mpf_msix_error(struct hclge_dev *hdev,
struct hclge_desc *desc,
int mpf_bd_num,
unsigned long *reset_requests)
{ {
struct hclge_mac_tnl_stats mac_tnl_stats;
struct device *dev = &hdev->pdev->dev; struct device *dev = &hdev->pdev->dev;
u32 mpf_bd_num, pf_bd_num, bd_num;
enum hnae3_reset_type reset_level;
struct hclge_desc desc_bd;
struct hclge_desc *desc;
__le32 *desc_data; __le32 *desc_data;
u32 status; u32 status;
int ret; int ret;
/* query the number of bds for the MSIx int status */
hclge_cmd_setup_basic_desc(&desc_bd, HCLGE_QUERY_MSIX_INT_STS_BD_NUM,
true);
ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
if (ret) {
dev_err(dev, "fail(%d) to query msix int status bd num\n",
ret);
return ret;
}
mpf_bd_num = le32_to_cpu(desc_bd.data[0]);
pf_bd_num = le32_to_cpu(desc_bd.data[1]);
bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
if (!desc)
goto out;
/* query all main PF MSIx errors */ /* query all main PF MSIx errors */
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT, hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT,
true); true);
ret = hclge_cmd_send(&hdev->hw, &desc[0], mpf_bd_num); ret = hclge_cmd_send(&hdev->hw, &desc[0], mpf_bd_num);
if (ret) { if (ret) {
dev_err(dev, "query all mpf msix int cmd failed (%d)\n", dev_err(dev, "query all mpf msix int cmd failed (%d)\n", ret);
ret); return ret;
goto msi_error;
} }
/* log MAC errors */ /* log MAC errors */
desc_data = (__le32 *)&desc[1]; desc_data = (__le32 *)&desc[1];
status = le32_to_cpu(*desc_data); status = le32_to_cpu(*desc_data);
if (status) { if (status)
reset_level = hclge_log_error(dev, "MAC_AFIFO_TNL_INT_R", hclge_log_error(dev, "MAC_AFIFO_TNL_INT_R",
&hclge_mac_afifo_tnl_int[0], &hclge_mac_afifo_tnl_int[0], status,
status); reset_requests);
set_bit(reset_level, reset_requests);
}
/* log PPU(RCB) MPF errors */ /* log PPU(RCB) MPF errors */
desc_data = (__le32 *)&desc[5]; desc_data = (__le32 *)&desc[5];
status = le32_to_cpu(*(desc_data + 2)) & status = le32_to_cpu(*(desc_data + 2)) &
HCLGE_PPU_MPF_INT_ST2_MSIX_MASK; HCLGE_PPU_MPF_INT_ST2_MSIX_MASK;
if (status) { if (status)
reset_level = dev_warn(dev, "PPU_MPF_ABNORMAL_INT_ST2 rx_q_search_miss found [dfx status=0x%x\n]",
hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST2", status);
&hclge_ppu_mpf_abnormal_int_st2[0],
status);
set_bit(reset_level, reset_requests);
}
/* clear all main PF MSIx errors */ /* clear all main PF MSIx errors */
hclge_cmd_reuse_desc(&desc[0], false); ret = hclge_clear_hw_msix_error(hdev, desc, true, mpf_bd_num);
ret = hclge_cmd_send(&hdev->hw, &desc[0], mpf_bd_num); if (ret)
if (ret) { dev_err(dev, "clear all mpf msix int cmd failed (%d)\n", ret);
dev_err(dev, "clear all mpf msix int cmd failed (%d)\n",
ret); return ret;
goto msi_error; }
}
/* hclge_handle_pf_msix_error: handle all PF MSI-X errors
* @hdev: pointer to struct hclge_dev
* @desc: descriptor for describing the command
* @mpf_bd_num: number of extended command structures
* @reset_requests: record of the reset level that we need
*
* This function handles all the PF MSI-X errors in the hw register/s using
* command.
*/
static int hclge_handle_pf_msix_error(struct hclge_dev *hdev,
struct hclge_desc *desc,
int pf_bd_num,
unsigned long *reset_requests)
{
struct device *dev = &hdev->pdev->dev;
__le32 *desc_data;
u32 status;
int ret;
/* query all PF MSIx errors */ /* query all PF MSIx errors */
memset(desc, 0, bd_num * sizeof(struct hclge_desc));
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT, hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT,
true); true);
ret = hclge_cmd_send(&hdev->hw, &desc[0], pf_bd_num); ret = hclge_cmd_send(&hdev->hw, &desc[0], pf_bd_num);
if (ret) { if (ret) {
dev_err(dev, "query all pf msix int cmd failed (%d)\n", dev_err(dev, "query all pf msix int cmd failed (%d)\n", ret);
ret); return ret;
goto msi_error;
} }
/* log SSU PF errors */ /* log SSU PF errors */
status = le32_to_cpu(desc[0].data[0]) & HCLGE_SSU_PORT_INT_MSIX_MASK; status = le32_to_cpu(desc[0].data[0]) & HCLGE_SSU_PORT_INT_MSIX_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT", hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT",
&hclge_ssu_port_based_pf_int[0], &hclge_ssu_port_based_pf_int[0],
status); status, reset_requests);
set_bit(reset_level, reset_requests);
}
/* read and log PPP PF errors */ /* read and log PPP PF errors */
desc_data = (__le32 *)&desc[2]; desc_data = (__le32 *)&desc[2];
status = le32_to_cpu(*desc_data); status = le32_to_cpu(*desc_data);
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPP_PF_ABNORMAL_INT_ST0", hclge_log_error(dev, "PPP_PF_ABNORMAL_INT_ST0",
&hclge_ppp_pf_abnormal_int[0], &hclge_ppp_pf_abnormal_int[0],
status); status, reset_requests);
set_bit(reset_level, reset_requests);
}
/* log PPU(RCB) PF errors */ /* log PPU(RCB) PF errors */
desc_data = (__le32 *)&desc[3]; desc_data = (__le32 *)&desc[3];
status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_MSIX_MASK; status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_MSIX_MASK;
if (status) { if (status)
reset_level = hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST", hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST",
&hclge_ppu_pf_abnormal_int[0], &hclge_ppu_pf_abnormal_int[0],
status); status, reset_requests);
set_bit(reset_level, reset_requests);
}
status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_OVER_8BD_ERR_MASK; status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_OVER_8BD_ERR_MASK;
if (status) if (status)
hclge_handle_over_8bd_err(hdev, reset_requests); hclge_handle_over_8bd_err(hdev, reset_requests);
/* clear all PF MSIx errors */ /* clear all PF MSIx errors */
hclge_cmd_reuse_desc(&desc[0], false); ret = hclge_clear_hw_msix_error(hdev, desc, false, pf_bd_num);
ret = hclge_cmd_send(&hdev->hw, &desc[0], pf_bd_num); if (ret)
dev_err(dev, "clear all pf msix int cmd failed (%d)\n", ret);
return ret;
}
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_bd;
struct hclge_desc *desc;
u32 status;
int ret;
/* query the number of bds for the MSIx int status */
hclge_cmd_setup_basic_desc(&desc_bd, HCLGE_QUERY_MSIX_INT_STS_BD_NUM,
true);
ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
if (ret) { if (ret) {
dev_err(dev, "clear all pf msix int cmd failed (%d)\n", dev_err(dev, "fail(%d) to query msix int status bd num\n",
ret); ret);
return ret;
} }
mpf_bd_num = le32_to_cpu(desc_bd.data[0]);
pf_bd_num = le32_to_cpu(desc_bd.data[1]);
bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
if (!desc)
goto out;
ret = hclge_handle_mpf_msix_error(hdev, desc, mpf_bd_num,
reset_requests);
if (ret)
goto msi_error;
memset(desc, 0, bd_num * sizeof(struct hclge_desc));
ret = hclge_handle_pf_msix_error(hdev, desc, pf_bd_num, reset_requests);
if (ret)
goto msi_error;
/* query and clear mac tnl interruptions */ /* query and clear mac tnl interruptions */
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_MAC_TNL_INT, hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_MAC_TNL_INT,
true); true);
...@@ -1914,3 +1909,79 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev, ...@@ -1914,3 +1909,79 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
out: out:
return ret; return ret;
} }
int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
unsigned long *reset_requests)
{
struct device *dev = &hdev->pdev->dev;
if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
dev_err(dev,
"Can't handle - MSIx error reported during dev init\n");
return 0;
}
return hclge_handle_all_hw_msix_error(hdev, reset_requests);
}
void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
{
#define HCLGE_DESC_NO_DATA_LEN 8
struct hclge_dev *hdev = ae_dev->priv;
struct device *dev = &hdev->pdev->dev;
u32 mpf_bd_num, pf_bd_num, bd_num;
struct hclge_desc desc_bd;
struct hclge_desc *desc;
u32 status;
int ret;
ae_dev->hw_err_reset_req = 0;
status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
/* query the number of bds for the MSIx int status */
hclge_cmd_setup_basic_desc(&desc_bd, HCLGE_QUERY_MSIX_INT_STS_BD_NUM,
true);
ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
if (ret) {
dev_err(dev, "fail(%d) to query msix int status bd num\n",
ret);
return;
}
mpf_bd_num = le32_to_cpu(desc_bd.data[0]);
pf_bd_num = le32_to_cpu(desc_bd.data[1]);
bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
if (!desc)
return;
/* Clear HNS hw errors reported through msix */
memset(&desc[0].data[0], 0xFF, mpf_bd_num * sizeof(struct hclge_desc) -
HCLGE_DESC_NO_DATA_LEN);
ret = hclge_clear_hw_msix_error(hdev, desc, true, mpf_bd_num);
if (ret) {
dev_err(dev, "fail(%d) to clear mpf msix int during init\n",
ret);
goto msi_error;
}
memset(&desc[0].data[0], 0xFF, pf_bd_num * sizeof(struct hclge_desc) -
HCLGE_DESC_NO_DATA_LEN);
ret = hclge_clear_hw_msix_error(hdev, desc, false, pf_bd_num);
if (ret) {
dev_err(dev, "fail(%d) to clear pf msix int during init\n",
ret);
goto msi_error;
}
/* Handle Non-fatal HNS RAS errors */
if (status & HCLGE_RAS_REG_NFE_MASK) {
dev_warn(dev, "HNS hw error(RAS) identified during init\n");
hclge_handle_all_ras_errors(hdev);
}
msi_error:
kfree(desc);
}
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
#define HCLGE_IGU_EGU_TNL_INT_MASK GENMASK(5, 0) #define HCLGE_IGU_EGU_TNL_INT_MASK GENMASK(5, 0)
#define HCLGE_PPP_MPF_INT_ST3_MASK GENMASK(5, 0) #define HCLGE_PPP_MPF_INT_ST3_MASK GENMASK(5, 0)
#define HCLGE_PPU_MPF_INT_ST3_MASK GENMASK(7, 0) #define HCLGE_PPU_MPF_INT_ST3_MASK GENMASK(7, 0)
#define HCLGE_PPU_MPF_INT_ST2_MSIX_MASK GENMASK(29, 28) #define HCLGE_PPU_MPF_INT_ST2_MSIX_MASK BIT(29)
#define HCLGE_PPU_PF_INT_RAS_MASK 0x18 #define HCLGE_PPU_PF_INT_RAS_MASK 0x18
#define HCLGE_PPU_PF_INT_MSIX_MASK 0x26 #define HCLGE_PPU_PF_INT_MSIX_MASK 0x26
#define HCLGE_PPU_PF_OVER_8BD_ERR_MASK 0x01 #define HCLGE_PPU_PF_OVER_8BD_ERR_MASK 0x01
...@@ -123,6 +123,7 @@ struct hclge_hw_error { ...@@ -123,6 +123,7 @@ struct hclge_hw_error {
int hclge_config_mac_tnl_int(struct hclge_dev *hdev, bool en); 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_nic_hw_error(struct hclge_dev *hdev, bool state);
int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en); 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);
pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev); 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, int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
unsigned long *reset_requests); unsigned long *reset_requests);
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#define HCLGE_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset)))) #define HCLGE_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset))))
#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f)) #define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))
#define HCLGE_BUF_SIZE_UNIT 256 #define HCLGE_BUF_SIZE_UNIT 256U
#define HCLGE_BUF_MUL_BY 2 #define HCLGE_BUF_MUL_BY 2
#define HCLGE_BUF_DIV_BY 2 #define HCLGE_BUF_DIV_BY 2
...@@ -41,6 +41,8 @@ static int hclge_set_umv_space(struct hclge_dev *hdev, u16 space_size, ...@@ -41,6 +41,8 @@ static int hclge_set_umv_space(struct hclge_dev *hdev, u16 space_size,
u16 *allocated_size, bool is_alloc); u16 *allocated_size, bool is_alloc);
static void hclge_rfs_filter_expire(struct hclge_dev *hdev); static void hclge_rfs_filter_expire(struct hclge_dev *hdev);
static void hclge_clear_arfs_rules(struct hnae3_handle *handle); static void hclge_clear_arfs_rules(struct hnae3_handle *handle);
static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
unsigned long *addr);
static struct hnae3_ae_algo ae_algo; static struct hnae3_ae_algo ae_algo;
...@@ -534,7 +536,7 @@ static u8 *hclge_tqps_get_strings(struct hnae3_handle *handle, u8 *data) ...@@ -534,7 +536,7 @@ static u8 *hclge_tqps_get_strings(struct hnae3_handle *handle, u8 *data)
return buff; return buff;
} }
static u64 *hclge_comm_get_stats(void *comm_stats, static u64 *hclge_comm_get_stats(const void *comm_stats,
const struct hclge_comm_stats_str strs[], const struct hclge_comm_stats_str strs[],
int size, u64 *data) int size, u64 *data)
{ {
...@@ -1074,7 +1076,7 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc) ...@@ -1074,7 +1076,7 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
struct hclge_cfg_param_cmd *req; struct hclge_cfg_param_cmd *req;
u64 mac_addr_tmp_high; u64 mac_addr_tmp_high;
u64 mac_addr_tmp; u64 mac_addr_tmp;
int i; unsigned int i;
req = (struct hclge_cfg_param_cmd *)desc[0].data; req = (struct hclge_cfg_param_cmd *)desc[0].data;
...@@ -1136,7 +1138,8 @@ static int hclge_get_cfg(struct hclge_dev *hdev, struct hclge_cfg *hcfg) ...@@ -1136,7 +1138,8 @@ static int hclge_get_cfg(struct hclge_dev *hdev, struct hclge_cfg *hcfg)
{ {
struct hclge_desc desc[HCLGE_PF_CFG_DESC_NUM]; struct hclge_desc desc[HCLGE_PF_CFG_DESC_NUM];
struct hclge_cfg_param_cmd *req; struct hclge_cfg_param_cmd *req;
int i, ret; unsigned int i;
int ret;
for (i = 0; i < HCLGE_PF_CFG_DESC_NUM; i++) { for (i = 0; i < HCLGE_PF_CFG_DESC_NUM; i++) {
u32 offset = 0; u32 offset = 0;
...@@ -1202,7 +1205,8 @@ static void hclge_init_kdump_kernel_config(struct hclge_dev *hdev) ...@@ -1202,7 +1205,8 @@ static void hclge_init_kdump_kernel_config(struct hclge_dev *hdev)
static int hclge_configure(struct hclge_dev *hdev) static int hclge_configure(struct hclge_dev *hdev)
{ {
struct hclge_cfg cfg; struct hclge_cfg cfg;
int ret, i; unsigned int i;
int ret;
ret = hclge_get_cfg(hdev, &cfg); ret = hclge_get_cfg(hdev, &cfg);
if (ret) { if (ret) {
...@@ -1265,8 +1269,8 @@ static int hclge_configure(struct hclge_dev *hdev) ...@@ -1265,8 +1269,8 @@ static int hclge_configure(struct hclge_dev *hdev)
return ret; return ret;
} }
static int hclge_config_tso(struct hclge_dev *hdev, int tso_mss_min, static int hclge_config_tso(struct hclge_dev *hdev, unsigned int tso_mss_min,
int tso_mss_max) unsigned int tso_mss_max)
{ {
struct hclge_cfg_tso_status_cmd *req; struct hclge_cfg_tso_status_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
...@@ -1578,7 +1582,8 @@ static int hclge_tx_buffer_alloc(struct hclge_dev *hdev, ...@@ -1578,7 +1582,8 @@ static int hclge_tx_buffer_alloc(struct hclge_dev *hdev,
static u32 hclge_get_tc_num(struct hclge_dev *hdev) static u32 hclge_get_tc_num(struct hclge_dev *hdev)
{ {
int i, cnt = 0; unsigned int i;
u32 cnt = 0;
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) for (i = 0; i < HCLGE_MAX_TC_NUM; i++)
if (hdev->hw_tc_map & BIT(i)) if (hdev->hw_tc_map & BIT(i))
...@@ -1591,7 +1596,8 @@ static int hclge_get_pfc_priv_num(struct hclge_dev *hdev, ...@@ -1591,7 +1596,8 @@ static int hclge_get_pfc_priv_num(struct hclge_dev *hdev,
struct hclge_pkt_buf_alloc *buf_alloc) struct hclge_pkt_buf_alloc *buf_alloc)
{ {
struct hclge_priv_buf *priv; struct hclge_priv_buf *priv;
int i, cnt = 0; unsigned int i;
int cnt = 0;
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
priv = &buf_alloc->priv_buf[i]; priv = &buf_alloc->priv_buf[i];
...@@ -1608,7 +1614,8 @@ static int hclge_get_no_pfc_priv_num(struct hclge_dev *hdev, ...@@ -1608,7 +1614,8 @@ static int hclge_get_no_pfc_priv_num(struct hclge_dev *hdev,
struct hclge_pkt_buf_alloc *buf_alloc) struct hclge_pkt_buf_alloc *buf_alloc)
{ {
struct hclge_priv_buf *priv; struct hclge_priv_buf *priv;
int i, cnt = 0; unsigned int i;
int cnt = 0;
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
priv = &buf_alloc->priv_buf[i]; priv = &buf_alloc->priv_buf[i];
...@@ -1738,7 +1745,7 @@ static bool hclge_rx_buf_calc_all(struct hclge_dev *hdev, bool max, ...@@ -1738,7 +1745,7 @@ static bool hclge_rx_buf_calc_all(struct hclge_dev *hdev, bool max,
{ {
u32 rx_all = hdev->pkt_buf_size - hclge_get_tx_buff_alloced(buf_alloc); u32 rx_all = hdev->pkt_buf_size - hclge_get_tx_buff_alloced(buf_alloc);
u32 aligned_mps = round_up(hdev->mps, HCLGE_BUF_SIZE_UNIT); u32 aligned_mps = round_up(hdev->mps, HCLGE_BUF_SIZE_UNIT);
int i; unsigned int i;
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i]; struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
...@@ -1779,9 +1786,10 @@ static bool hclge_drop_nopfc_buf_till_fit(struct hclge_dev *hdev, ...@@ -1779,9 +1786,10 @@ static bool hclge_drop_nopfc_buf_till_fit(struct hclge_dev *hdev,
/* let the last to be cleared first */ /* let the last to be cleared first */
for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) { for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) {
struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i]; struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
unsigned int mask = BIT((unsigned int)i);
if (hdev->hw_tc_map & BIT(i) && if (hdev->hw_tc_map & mask &&
!(hdev->tm_info.hw_pfc_map & BIT(i))) { !(hdev->tm_info.hw_pfc_map & mask)) {
/* Clear the no pfc TC private buffer */ /* Clear the no pfc TC private buffer */
priv->wl.low = 0; priv->wl.low = 0;
priv->wl.high = 0; priv->wl.high = 0;
...@@ -1808,9 +1816,10 @@ static bool hclge_drop_pfc_buf_till_fit(struct hclge_dev *hdev, ...@@ -1808,9 +1816,10 @@ static bool hclge_drop_pfc_buf_till_fit(struct hclge_dev *hdev,
/* let the last to be cleared first */ /* let the last to be cleared first */
for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) { for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) {
struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i]; struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
unsigned int mask = BIT((unsigned int)i);
if (hdev->hw_tc_map & BIT(i) && if (hdev->hw_tc_map & mask &&
hdev->tm_info.hw_pfc_map & BIT(i)) { hdev->tm_info.hw_pfc_map & mask) {
/* Reduce the number of pfc TC with private buffer */ /* Reduce the number of pfc TC with private buffer */
priv->wl.low = 0; priv->wl.low = 0;
priv->enable = 0; priv->enable = 0;
...@@ -2449,7 +2458,7 @@ static int hclge_get_mac_link_status(struct hclge_dev *hdev) ...@@ -2449,7 +2458,7 @@ static int hclge_get_mac_link_status(struct hclge_dev *hdev)
static int hclge_get_mac_phy_link(struct hclge_dev *hdev) static int hclge_get_mac_phy_link(struct hclge_dev *hdev)
{ {
int mac_state; unsigned int mac_state;
int link_stat; int link_stat;
if (test_bit(HCLGE_STATE_DOWN, &hdev->state)) if (test_bit(HCLGE_STATE_DOWN, &hdev->state))
...@@ -2744,8 +2753,8 @@ static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable) ...@@ -2744,8 +2753,8 @@ static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable)
static irqreturn_t hclge_misc_irq_handle(int irq, void *data) static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
{ {
struct hclge_dev *hdev = data; struct hclge_dev *hdev = data;
u32 clearval = 0;
u32 event_cause; u32 event_cause;
u32 clearval;
hclge_enable_vector(&hdev->misc_vector, false); hclge_enable_vector(&hdev->misc_vector, false);
event_cause = hclge_check_event_cause(hdev, &clearval); event_cause = hclge_check_event_cause(hdev, &clearval);
...@@ -3066,10 +3075,11 @@ static void hclge_do_reset(struct hclge_dev *hdev) ...@@ -3066,10 +3075,11 @@ static void hclge_do_reset(struct hclge_dev *hdev)
} }
} }
static enum hnae3_reset_type hclge_get_reset_level(struct hclge_dev *hdev, static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
unsigned long *addr) unsigned long *addr)
{ {
enum hnae3_reset_type rst_level = HNAE3_NONE_RESET; enum hnae3_reset_type rst_level = HNAE3_NONE_RESET;
struct hclge_dev *hdev = ae_dev->priv;
/* first, resolve any unknown reset type to the known type(s) */ /* first, resolve any unknown reset type to the known type(s) */
if (test_bit(HNAE3_UNKNOWN_RESET, addr)) { if (test_bit(HNAE3_UNKNOWN_RESET, addr)) {
...@@ -3233,6 +3243,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev, bool is_timeout) ...@@ -3233,6 +3243,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev, bool is_timeout)
dev_info(&hdev->pdev->dev, "Upgrade reset level\n"); dev_info(&hdev->pdev->dev, "Upgrade reset level\n");
hclge_clear_reset_cause(hdev); hclge_clear_reset_cause(hdev);
set_bit(HNAE3_GLOBAL_RESET, &hdev->default_reset_request);
mod_timer(&hdev->reset_timer, mod_timer(&hdev->reset_timer,
jiffies + HCLGE_RESET_INTERVAL); jiffies + HCLGE_RESET_INTERVAL);
...@@ -3398,7 +3409,7 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle) ...@@ -3398,7 +3409,7 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
return; return;
else if (hdev->default_reset_request) else if (hdev->default_reset_request)
hdev->reset_level = hdev->reset_level =
hclge_get_reset_level(hdev, hclge_get_reset_level(ae_dev,
&hdev->default_reset_request); &hdev->default_reset_request);
else if (time_after(jiffies, (hdev->last_reset_time + 4 * 5 * HZ))) else if (time_after(jiffies, (hdev->last_reset_time + 4 * 5 * HZ)))
hdev->reset_level = HNAE3_FUNC_RESET; hdev->reset_level = HNAE3_FUNC_RESET;
...@@ -3427,13 +3438,14 @@ static void hclge_reset_timer(struct timer_list *t) ...@@ -3427,13 +3438,14 @@ static void hclge_reset_timer(struct timer_list *t)
struct hclge_dev *hdev = from_timer(hdev, t, reset_timer); struct hclge_dev *hdev = from_timer(hdev, t, reset_timer);
dev_info(&hdev->pdev->dev, dev_info(&hdev->pdev->dev,
"triggering global reset in reset timer\n"); "triggering reset in reset timer\n");
set_bit(HNAE3_GLOBAL_RESET, &hdev->default_reset_request);
hclge_reset_event(hdev->pdev, NULL); hclge_reset_event(hdev->pdev, NULL);
} }
static void hclge_reset_subtask(struct hclge_dev *hdev) static void hclge_reset_subtask(struct hclge_dev *hdev)
{ {
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
/* check if there is any ongoing reset in the hardware. This status can /* check if there is any ongoing reset in the hardware. This status can
* be checked from reset_pending. If there is then, we need to wait for * be checked from reset_pending. If there is then, we need to wait for
* hardware to complete reset. * hardware to complete reset.
...@@ -3444,12 +3456,12 @@ static void hclge_reset_subtask(struct hclge_dev *hdev) ...@@ -3444,12 +3456,12 @@ static void hclge_reset_subtask(struct hclge_dev *hdev)
* now. * now.
*/ */
hdev->last_reset_time = jiffies; hdev->last_reset_time = jiffies;
hdev->reset_type = hclge_get_reset_level(hdev, &hdev->reset_pending); hdev->reset_type = hclge_get_reset_level(ae_dev, &hdev->reset_pending);
if (hdev->reset_type != HNAE3_NONE_RESET) if (hdev->reset_type != HNAE3_NONE_RESET)
hclge_reset(hdev); hclge_reset(hdev);
/* check if we got any *new* reset requests to be honored */ /* check if we got any *new* reset requests to be honored */
hdev->reset_type = hclge_get_reset_level(hdev, &hdev->reset_request); hdev->reset_type = hclge_get_reset_level(ae_dev, &hdev->reset_request);
if (hdev->reset_type != HNAE3_NONE_RESET) if (hdev->reset_type != HNAE3_NONE_RESET)
hclge_do_reset(hdev); hclge_do_reset(hdev);
...@@ -3613,8 +3625,8 @@ static int hclge_set_rss_algo_key(struct hclge_dev *hdev, ...@@ -3613,8 +3625,8 @@ static int hclge_set_rss_algo_key(struct hclge_dev *hdev,
const u8 hfunc, const u8 *key) const u8 hfunc, const u8 *key)
{ {
struct hclge_rss_config_cmd *req; struct hclge_rss_config_cmd *req;
unsigned int key_offset = 0;
struct hclge_desc desc; struct hclge_desc desc;
int key_offset = 0;
int key_counts; int key_counts;
int key_size; int key_size;
int ret; int ret;
...@@ -3999,7 +4011,8 @@ int hclge_rss_init_hw(struct hclge_dev *hdev) ...@@ -3999,7 +4011,8 @@ int hclge_rss_init_hw(struct hclge_dev *hdev)
u16 tc_valid[HCLGE_MAX_TC_NUM]; u16 tc_valid[HCLGE_MAX_TC_NUM];
u16 tc_size[HCLGE_MAX_TC_NUM]; u16 tc_size[HCLGE_MAX_TC_NUM];
u16 roundup_size; u16 roundup_size;
int i, ret; unsigned int i;
int ret;
ret = hclge_set_rss_indir_table(hdev, rss_indir); ret = hclge_set_rss_indir_table(hdev, rss_indir);
if (ret) if (ret)
...@@ -4612,7 +4625,7 @@ static void hclge_fd_convert_meta_data(struct hclge_fd_key_cfg *key_cfg, ...@@ -4612,7 +4625,7 @@ static void hclge_fd_convert_meta_data(struct hclge_fd_key_cfg *key_cfg,
{ {
u32 tuple_bit, meta_data = 0, tmp_x, tmp_y, port_number; u32 tuple_bit, meta_data = 0, tmp_x, tmp_y, port_number;
u8 cur_pos = 0, tuple_size, shift_bits; u8 cur_pos = 0, tuple_size, shift_bits;
int i; unsigned int i;
for (i = 0; i < MAX_META_DATA; i++) { for (i = 0; i < MAX_META_DATA; i++) {
tuple_size = meta_data_key_info[i].key_length; tuple_size = meta_data_key_info[i].key_length;
...@@ -4654,7 +4667,8 @@ static int hclge_config_key(struct hclge_dev *hdev, u8 stage, ...@@ -4654,7 +4667,8 @@ static int hclge_config_key(struct hclge_dev *hdev, u8 stage,
struct hclge_fd_key_cfg *key_cfg = &hdev->fd_cfg.key_cfg[stage]; struct hclge_fd_key_cfg *key_cfg = &hdev->fd_cfg.key_cfg[stage];
u8 key_x[MAX_KEY_BYTES], key_y[MAX_KEY_BYTES]; u8 key_x[MAX_KEY_BYTES], key_y[MAX_KEY_BYTES];
u8 *cur_key_x, *cur_key_y; u8 *cur_key_x, *cur_key_y;
int i, ret, tuple_size; unsigned int i;
int ret, tuple_size;
u8 meta_data_region; u8 meta_data_region;
memset(key_x, 0, sizeof(key_x)); memset(key_x, 0, sizeof(key_x));
...@@ -5978,7 +5992,7 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en, ...@@ -5978,7 +5992,7 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
return -EBUSY; return -EBUSY;
} }
static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id, static int hclge_tqp_enable(struct hclge_dev *hdev, unsigned int tqp_id,
int stream_id, bool enable) int stream_id, bool enable)
{ {
struct hclge_desc desc; struct hclge_desc desc;
...@@ -5989,7 +6003,8 @@ static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id, ...@@ -5989,7 +6003,8 @@ static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id,
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false); hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false);
req->tqp_id = cpu_to_le16(tqp_id & HCLGE_RING_ID_MASK); req->tqp_id = cpu_to_le16(tqp_id & HCLGE_RING_ID_MASK);
req->stream_id = cpu_to_le16(stream_id); req->stream_id = cpu_to_le16(stream_id);
req->enable |= enable << HCLGE_TQP_ENABLE_B; if (enable)
req->enable |= 1U << HCLGE_TQP_ENABLE_B;
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) if (ret)
...@@ -7019,7 +7034,7 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable) ...@@ -7019,7 +7034,7 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
handle->netdev_flags &= ~HNAE3_VLAN_FLTR; handle->netdev_flags &= ~HNAE3_VLAN_FLTR;
} }
static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, int vfid, static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
bool is_kill, u16 vlan, u8 qos, bool is_kill, u16 vlan, u8 qos,
__be16 proto) __be16 proto)
{ {
...@@ -8123,7 +8138,8 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle, ...@@ -8123,7 +8138,8 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
struct phy_device *phydev = hdev->hw.mac.phydev; struct phy_device *phydev = hdev->hw.mac.phydev;
int mdix_ctrl, mdix, retval, is_resolved; int mdix_ctrl, mdix, is_resolved;
unsigned int retval;
if (!phydev) { if (!phydev) {
*tp_mdix_ctrl = ETH_TP_MDI_INVALID; *tp_mdix_ctrl = ETH_TP_MDI_INVALID;
...@@ -8445,6 +8461,23 @@ static void hclge_flr_done(struct hnae3_ae_dev *ae_dev) ...@@ -8445,6 +8461,23 @@ static void hclge_flr_done(struct hnae3_ae_dev *ae_dev)
set_bit(HNAE3_FLR_DONE, &hdev->flr_state); set_bit(HNAE3_FLR_DONE, &hdev->flr_state);
} }
static void hclge_clear_resetting_state(struct hclge_dev *hdev)
{
u16 i;
for (i = 0; i < hdev->num_alloc_vport; i++) {
struct hclge_vport *vport = &hdev->vport[i];
int ret;
/* Send cmd to clear VF's FUNC_RST_ING */
ret = hclge_set_vf_rst(hdev, vport->vport_id, false);
if (ret)
dev_warn(&hdev->pdev->dev,
"clear vf(%d) rst failed %d!\n",
vport->vport_id, ret);
}
}
static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
{ {
struct pci_dev *pdev = ae_dev->pdev; struct pci_dev *pdev = ae_dev->pdev;
...@@ -8605,6 +8638,22 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -8605,6 +8638,22 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task); INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);
hclge_clear_all_event_cause(hdev); hclge_clear_all_event_cause(hdev);
hclge_clear_resetting_state(hdev);
/* Log and clear the hw errors those already occurred */
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
*/
if (ae_dev->hw_err_reset_req) {
enum hnae3_reset_type reset_level;
reset_level = hclge_get_reset_level(ae_dev,
&ae_dev->hw_err_reset_req);
hclge_set_def_reset_request(ae_dev, reset_level);
mod_timer(&hdev->reset_timer, jiffies + HCLGE_RESET_INTERVAL);
}
/* Enable MISC vector(vector0) */ /* Enable MISC vector(vector0) */
hclge_enable_vector(&hdev->misc_vector, true); hclge_enable_vector(&hdev->misc_vector, true);
...@@ -8817,7 +8866,8 @@ static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num, ...@@ -8817,7 +8866,8 @@ static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
u16 tc_size[HCLGE_MAX_TC_NUM]; u16 tc_size[HCLGE_MAX_TC_NUM];
u16 roundup_size; u16 roundup_size;
u32 *rss_indir; u32 *rss_indir;
int ret, i; unsigned int i;
int ret;
kinfo->req_rss_size = new_tqps_num; kinfo->req_rss_size = new_tqps_num;
...@@ -9231,6 +9281,7 @@ static const struct hnae3_ae_ops hclge_ops = { ...@@ -9231,6 +9281,7 @@ static const struct hnae3_ae_ops hclge_ops = {
.set_vf_vlan_filter = hclge_set_vf_vlan_filter, .set_vf_vlan_filter = hclge_set_vf_vlan_filter,
.enable_hw_strip_rxvtag = hclge_en_hw_strip_rxvtag, .enable_hw_strip_rxvtag = hclge_en_hw_strip_rxvtag,
.reset_event = hclge_reset_event, .reset_event = hclge_reset_event,
.get_reset_level = hclge_get_reset_level,
.set_default_reset_request = hclge_set_def_reset_request, .set_default_reset_request = hclge_set_def_reset_request,
.get_tqps_and_rss_info = hclge_get_tqps_and_rss_info, .get_tqps_and_rss_info = hclge_get_tqps_and_rss_info,
.set_channels = hclge_set_channels, .set_channels = hclge_set_channels,
......
...@@ -701,6 +701,17 @@ struct hclge_mac_tnl_stats { ...@@ -701,6 +701,17 @@ struct hclge_mac_tnl_stats {
#define HCLGE_RESET_INTERVAL (10 * HZ) #define HCLGE_RESET_INTERVAL (10 * HZ)
#pragma pack(1)
struct hclge_vf_vlan_cfg {
u8 mbx_cmd;
u8 subcode;
u8 is_kill;
u16 vlan;
u16 proto;
};
#pragma pack()
/* For each bit of TCAM entry, it uses a pair of 'x' and /* For each bit of TCAM entry, it uses a pair of 'x' and
* 'y' to indicate which value to match, like below: * 'y' to indicate which value to match, like below:
* ---------------------------------- * ----------------------------------
...@@ -924,7 +935,7 @@ struct hclge_vport { ...@@ -924,7 +935,7 @@ struct hclge_vport {
u16 used_umv_num; u16 used_umv_num;
int vport_id; u16 vport_id;
struct hclge_dev *back; /* Back reference to associated dev */ struct hclge_dev *back; /* Back reference to associated dev */
struct hnae3_handle nic; struct hnae3_handle nic;
struct hnae3_handle roce; struct hnae3_handle roce;
...@@ -986,7 +997,7 @@ int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id); ...@@ -986,7 +997,7 @@ int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id);
int hclge_vport_start(struct hclge_vport *vport); int hclge_vport_start(struct hclge_vport *vport);
void hclge_vport_stop(struct hclge_vport *vport); void hclge_vport_stop(struct hclge_vport *vport);
int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu); int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu);
int hclge_dbg_run_cmd(struct hnae3_handle *handle, char *cmd_buf); int hclge_dbg_run_cmd(struct hnae3_handle *handle, const char *cmd_buf);
u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle, u16 queue_id); u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle, u16 queue_id);
int hclge_notify_client(struct hclge_dev *hdev, int hclge_notify_client(struct hclge_dev *hdev,
enum hnae3_reset_notify_type type); enum hnae3_reset_notify_type type);
......
...@@ -306,21 +306,23 @@ int hclge_push_vf_port_base_vlan_info(struct hclge_vport *vport, u8 vfid, ...@@ -306,21 +306,23 @@ int hclge_push_vf_port_base_vlan_info(struct hclge_vport *vport, u8 vfid,
static int hclge_set_vf_vlan_cfg(struct hclge_vport *vport, static int hclge_set_vf_vlan_cfg(struct hclge_vport *vport,
struct hclge_mbx_vf_to_pf_cmd *mbx_req) struct hclge_mbx_vf_to_pf_cmd *mbx_req)
{ {
struct hclge_vf_vlan_cfg *msg_cmd;
int status = 0; int status = 0;
if (mbx_req->msg[1] == HCLGE_MBX_VLAN_FILTER) { msg_cmd = (struct hclge_vf_vlan_cfg *)mbx_req->msg;
if (msg_cmd->subcode == HCLGE_MBX_VLAN_FILTER) {
struct hnae3_handle *handle = &vport->nic; struct hnae3_handle *handle = &vport->nic;
u16 vlan, proto; u16 vlan, proto;
bool is_kill; bool is_kill;
is_kill = !!mbx_req->msg[2]; is_kill = !!msg_cmd->is_kill;
memcpy(&vlan, &mbx_req->msg[3], sizeof(vlan)); vlan = msg_cmd->vlan;
memcpy(&proto, &mbx_req->msg[5], sizeof(proto)); proto = msg_cmd->proto;
status = hclge_set_vlan_filter(handle, cpu_to_be16(proto), status = hclge_set_vlan_filter(handle, cpu_to_be16(proto),
vlan, is_kill); vlan, is_kill);
} else if (mbx_req->msg[1] == HCLGE_MBX_VLAN_RX_OFF_CFG) { } else if (msg_cmd->subcode == HCLGE_MBX_VLAN_RX_OFF_CFG) {
struct hnae3_handle *handle = &vport->nic; struct hnae3_handle *handle = &vport->nic;
bool en = mbx_req->msg[2] ? true : false; bool en = msg_cmd->is_kill ? true : false;
status = hclge_en_hw_strip_rxvtag(handle, en); status = hclge_en_hw_strip_rxvtag(handle, en);
} else if (mbx_req->msg[1] == HCLGE_MBX_PORT_BASE_VLAN_CFG) { } else if (mbx_req->msg[1] == HCLGE_MBX_PORT_BASE_VLAN_CFG) {
...@@ -363,7 +365,8 @@ static int hclge_get_vf_tcinfo(struct hclge_vport *vport, ...@@ -363,7 +365,8 @@ static int hclge_get_vf_tcinfo(struct hclge_vport *vport,
{ {
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo; struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
u8 vf_tc_map = 0; u8 vf_tc_map = 0;
int i, ret; unsigned int i;
int ret;
for (i = 0; i < kinfo->num_tc; i++) for (i = 0; i < kinfo->num_tc; i++)
vf_tc_map |= BIT(i); vf_tc_map |= BIT(i);
...@@ -551,7 +554,8 @@ void hclge_mbx_handler(struct hclge_dev *hdev) ...@@ -551,7 +554,8 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
struct hclge_mbx_vf_to_pf_cmd *req; struct hclge_mbx_vf_to_pf_cmd *req;
struct hclge_vport *vport; struct hclge_vport *vport;
struct hclge_desc *desc; struct hclge_desc *desc;
int ret, flag; unsigned int flag;
int ret;
/* handle all the mailbox requests in the queue */ /* handle all the mailbox requests in the queue */
while (!hclge_cmd_crq_empty(&hdev->hw)) { while (!hclge_cmd_crq_empty(&hdev->hw)) {
......
...@@ -55,9 +55,9 @@ static int hclge_mdio_write(struct mii_bus *bus, int phyid, int regnum, ...@@ -55,9 +55,9 @@ static int hclge_mdio_write(struct mii_bus *bus, int phyid, int regnum,
mdio_cmd = (struct hclge_mdio_cfg_cmd *)desc.data; mdio_cmd = (struct hclge_mdio_cfg_cmd *)desc.data;
hnae3_set_field(mdio_cmd->phyid, HCLGE_MDIO_PHYID_M, hnae3_set_field(mdio_cmd->phyid, HCLGE_MDIO_PHYID_M,
HCLGE_MDIO_PHYID_S, phyid); HCLGE_MDIO_PHYID_S, (u32)phyid);
hnae3_set_field(mdio_cmd->phyad, HCLGE_MDIO_PHYREG_M, hnae3_set_field(mdio_cmd->phyad, HCLGE_MDIO_PHYREG_M,
HCLGE_MDIO_PHYREG_S, regnum); HCLGE_MDIO_PHYREG_S, (u32)regnum);
hnae3_set_bit(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_START_B, 1); hnae3_set_bit(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_START_B, 1);
hnae3_set_field(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_ST_M, hnae3_set_field(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_ST_M,
...@@ -93,9 +93,9 @@ static int hclge_mdio_read(struct mii_bus *bus, int phyid, int regnum) ...@@ -93,9 +93,9 @@ static int hclge_mdio_read(struct mii_bus *bus, int phyid, int regnum)
mdio_cmd = (struct hclge_mdio_cfg_cmd *)desc.data; mdio_cmd = (struct hclge_mdio_cfg_cmd *)desc.data;
hnae3_set_field(mdio_cmd->phyid, HCLGE_MDIO_PHYID_M, hnae3_set_field(mdio_cmd->phyid, HCLGE_MDIO_PHYID_M,
HCLGE_MDIO_PHYID_S, phyid); HCLGE_MDIO_PHYID_S, (u32)phyid);
hnae3_set_field(mdio_cmd->phyad, HCLGE_MDIO_PHYREG_M, hnae3_set_field(mdio_cmd->phyad, HCLGE_MDIO_PHYREG_M,
HCLGE_MDIO_PHYREG_S, regnum); HCLGE_MDIO_PHYREG_S, (u32)regnum);
hnae3_set_bit(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_START_B, 1); hnae3_set_bit(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_START_B, 1);
hnae3_set_field(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_ST_M, hnae3_set_field(mdio_cmd->ctrl_bit, HCLGE_MDIO_CTRL_ST_M,
......
...@@ -976,7 +976,7 @@ static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev) ...@@ -976,7 +976,7 @@ static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev)
struct hclge_ets_tc_weight_cmd *ets_weight; struct hclge_ets_tc_weight_cmd *ets_weight;
struct hclge_desc desc; struct hclge_desc desc;
int i; unsigned int i;
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_ETS_TC_WEIGHT, false); hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_ETS_TC_WEIGHT, false);
ets_weight = (struct hclge_ets_tc_weight_cmd *)desc.data; ets_weight = (struct hclge_ets_tc_weight_cmd *)desc.data;
......
...@@ -382,7 +382,7 @@ static int hclgevf_knic_setup(struct hclgevf_dev *hdev) ...@@ -382,7 +382,7 @@ static int hclgevf_knic_setup(struct hclgevf_dev *hdev)
struct hnae3_handle *nic = &hdev->nic; struct hnae3_handle *nic = &hdev->nic;
struct hnae3_knic_private_info *kinfo; struct hnae3_knic_private_info *kinfo;
u16 new_tqps = hdev->num_tqps; u16 new_tqps = hdev->num_tqps;
int i; unsigned int i;
kinfo = &nic->kinfo; kinfo = &nic->kinfo;
kinfo->num_tc = 0; kinfo->num_tc = 0;
...@@ -540,8 +540,8 @@ static int hclgevf_set_rss_algo_key(struct hclgevf_dev *hdev, ...@@ -540,8 +540,8 @@ static int hclgevf_set_rss_algo_key(struct hclgevf_dev *hdev,
const u8 hfunc, const u8 *key) const u8 hfunc, const u8 *key)
{ {
struct hclgevf_rss_config_cmd *req; struct hclgevf_rss_config_cmd *req;
unsigned int key_offset = 0;
struct hclgevf_desc desc; struct hclgevf_desc desc;
int key_offset = 0;
int key_counts; int key_counts;
int key_size; int key_size;
int ret; int ret;
...@@ -626,7 +626,7 @@ static int hclgevf_set_rss_tc_mode(struct hclgevf_dev *hdev, u16 rss_size) ...@@ -626,7 +626,7 @@ static int hclgevf_set_rss_tc_mode(struct hclgevf_dev *hdev, u16 rss_size)
struct hclgevf_desc desc; struct hclgevf_desc desc;
u16 roundup_size; u16 roundup_size;
int status; int status;
int i; unsigned int i;
req = (struct hclgevf_rss_tc_mode_cmd *)desc.data; req = (struct hclgevf_rss_tc_mode_cmd *)desc.data;
...@@ -1129,7 +1129,7 @@ static int hclgevf_set_promisc_mode(struct hclgevf_dev *hdev, bool en_bc_pmc) ...@@ -1129,7 +1129,7 @@ static int hclgevf_set_promisc_mode(struct hclgevf_dev *hdev, bool en_bc_pmc)
return hclgevf_cmd_set_promisc_mode(hdev, en_bc_pmc); return hclgevf_cmd_set_promisc_mode(hdev, en_bc_pmc);
} }
static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, int tqp_id, static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, unsigned int tqp_id,
int stream_id, bool enable) int stream_id, bool enable)
{ {
struct hclgevf_cfg_com_tqp_queue_cmd *req; struct hclgevf_cfg_com_tqp_queue_cmd *req;
...@@ -1142,7 +1142,8 @@ static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, int tqp_id, ...@@ -1142,7 +1142,8 @@ static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, int tqp_id,
false); false);
req->tqp_id = cpu_to_le16(tqp_id & HCLGEVF_RING_ID_MASK); req->tqp_id = cpu_to_le16(tqp_id & HCLGEVF_RING_ID_MASK);
req->stream_id = cpu_to_le16(stream_id); req->stream_id = cpu_to_le16(stream_id);
req->enable |= enable << HCLGEVF_TQP_ENABLE_B; if (enable)
req->enable |= 1U << HCLGEVF_TQP_ENABLE_B;
status = hclgevf_cmd_send(&hdev->hw, &desc, 1); status = hclgevf_cmd_send(&hdev->hw, &desc, 1);
if (status) if (status)
......
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