diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c index 82ce3f5744a0d691a0725c9e9137a3d9fea5c6ae..0a6433cc6793f531f0965065086734cb6dd75e41 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c @@ -37,6 +37,21 @@ EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare); */ static DEFINE_MUTEX(hnae3_common_lock); +/* ensure the drivers being unloaded one by one */ +static DEFINE_MUTEX(hnae3_unload_lock); + +void hnae3_acquire_unload_lock(void) +{ + mutex_lock(&hnae3_unload_lock); +} +EXPORT_SYMBOL(hnae3_acquire_unload_lock); + +void hnae3_release_unload_lock(void) +{ + mutex_unlock(&hnae3_unload_lock); +} +EXPORT_SYMBOL(hnae3_release_unload_lock); + static bool hnae3_client_match(enum hnae3_client_type client_type) { if (client_type == HNAE3_CLIENT_KNIC || diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index 922f262f33c99acbb4323edc91d12b39738e8e59..2f0b375d5c4162df8bf964693b33e73c1b7ee6a1 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -1106,4 +1106,6 @@ int hnae3_register_client(struct hnae3_client *client); void hnae3_set_client_init_flag(struct hnae3_client *client, struct hnae3_ae_dev *ae_dev, unsigned int inited); +void hnae3_acquire_unload_lock(void); +void hnae3_release_unload_lock(void); #endif diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c index c4d62dbd71a541dfd985ad3011fd5ff5c3564cdc..76b4a97e9250dc9e866932c5ac69928d87d52ef6 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c @@ -474,7 +474,7 @@ static int hclge_comm_cmd_check_result(struct hclge_comm_hw *hw, int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc, int num) { - bool is_special = hclge_comm_is_special_opcode(desc->opcode); + bool is_special = hclge_comm_is_special_opcode(le16_to_cpu(desc->opcode)); struct hclge_comm_cmq_ring *csq = &hw->cmq.csq; int ret; int ntc; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c index 465b168f7e8929f2f20b1a25c86e53874e3c3211..c94c2c217156d1a1cb57fc0806d6f7f8d0afb86c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c @@ -1109,6 +1109,8 @@ hns3_dbg_dev_specs(struct hnae3_handle *h, char *buf, int len, int *pos) dev->watchdog_timeo / HZ); *pos += scnprintf(buf + *pos, len - *pos, "Hilink Version: %u\n", dev_specs->hilink_version); + pos += scnprintf(buf + *pos, len - *pos, "mac tunnel number: %u\n", + dev_specs->tnl_num); *pos += scnprintf(buf + *pos, len - *pos, "total rx buffer size: %u\n", dev_specs->total_rx_buffer_size); *pos += scnprintf(buf + *pos, len - *pos, "min rx buffer size per tc: %u\n", diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 742152e3f4944c8cd55226a84e0445b1e0ab325d..0f25d4fa94dd39a08c72dafe6546a22f45874cf8 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -6527,12 +6527,14 @@ module_init(hns3_init_module); */ static void __exit hns3_exit_module(void) { + hnae3_acquire_unload_lock(); #ifdef CONFIG_HNS3_UBL unregister_ipaddr_notifier(); #endif pci_unregister_driver(&hns3_driver); hnae3_unregister_client(&client); hns3_dbg_unregister_debugfs(); + hnae3_release_unload_lock(); } module_exit(hns3_exit_module); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index aceb28acf9ca88d6bfcc29eb96df2fb1ee5fa8e3..458c39c8fa6f8950c43127eab97aadd4cd43123d 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -41,7 +41,6 @@ #include "hclge_unic_guid.h" #include "hclge_unic_addr.h" #endif - #include "hclge_trace.h" #define HCLGE_NAME "hclge" @@ -429,7 +428,7 @@ static void hclge_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *de trace_hclge_pf_cmd_send(hw, &desc[i], i, num); } else { for (i = 1; i < num; i++) - trace_hclge_pf_special_cmd_send(hw, (u32 *)&desc[i], + trace_hclge_pf_special_cmd_send(hw, (__le32 *)&desc[i], i, num); } } @@ -449,7 +448,7 @@ static void hclge_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *des trace_hclge_pf_cmd_get(hw, &desc[i], i, num); } else { for (i = 1; i < num; i++) - trace_hclge_pf_special_cmd_get(hw, (u32 *)&desc[i], + trace_hclge_pf_special_cmd_get(hw, (__le32 *)&desc[i], i, num); } } @@ -13842,9 +13841,11 @@ static int hclge_init(void) static void hclge_exit(void) { + hnae3_acquire_unload_lock(); hnae3_unregister_ae_algo_prepare(&ae_algo); hnae3_unregister_ae_algo(&ae_algo); destroy_workqueue(hclge_wq); + hnae3_release_unload_lock(); } module_init(hclge_init); module_exit(hclge_exit); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h index d8afc2a052dc69c6af9b71f644df9b27eda4f71a..7e47f0c21d888c720e027ae797f75e3bf922ea9e 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h @@ -131,7 +131,7 @@ DEFINE_EVENT(hclge_pf_cmd_template, hclge_pf_cmd_get, DECLARE_EVENT_CLASS(hclge_pf_special_cmd_template, TP_PROTO(struct hclge_comm_hw *hw, - u32 *data, + __le32 *data, int index, int num), TP_ARGS(hw, data, index, num), @@ -158,14 +158,14 @@ DECLARE_EVENT_CLASS(hclge_pf_special_cmd_template, DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_send, TP_PROTO(struct hclge_comm_hw *hw, - u32 *desc, + __le32 *desc, int index, int num), TP_ARGS(hw, desc, index, num)); DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_get, TP_PROTO(struct hclge_comm_hw *hw, - u32 *desc, + __le32 *desc, int index, int num), TP_ARGS(hw, desc, index, num) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c index 050eeec02e5606b75cc76d2583057612bea4aabe..97a5605f42e1c71ecda654b6245551ee1db94e25 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c @@ -20,8 +20,8 @@ #include "hclgevf_unic_guid.h" #include "hclgevf_unic_addr.h" #endif -#include "hclgevf_trace.h" #include "hclgevf_dcb.h" +#include "hclgevf_trace.h" #define HCLGEVF_NAME "hclgevf" @@ -3735,8 +3735,10 @@ static int hclgevf_init(void) static void hclgevf_exit(void) { + hnae3_acquire_unload_lock(); hnae3_unregister_ae_algo(&ae_algovf); destroy_workqueue(hclgevf_wq); + hnae3_release_unload_lock(); } module_init(hclgevf_init); module_exit(hclgevf_exit);