diff --git a/drivers/roh/core/core.c b/drivers/roh/core/core.c index 27f9625d707d4768092c8de756130177dc675ffb..a06d88670afeb0f4c931a4fbf37314a8249b6c81 100644 --- a/drivers/roh/core/core.c +++ b/drivers/roh/core/core.c @@ -99,6 +99,7 @@ void roh_dealloc_device(struct roh_device *device) WARN_ON(!xa_empty(&device->client_data)); WARN_ON(refcount_read(&device->refcount)); + /* put_device will call back the roh_device_release function to release the roh_device */ put_device(&device->dev); } EXPORT_SYMBOL(roh_dealloc_device); @@ -285,7 +286,7 @@ static int roh_ipv4_event(struct notifier_block *this, unsigned long event, void ret = roh_device_set_eid(device, &eid_attr); if (ret) { pr_err("failed to set eid by IP, ret = %d\n", ret); - return ret; + return NOTIFY_DONE; } return NOTIFY_DONE; @@ -391,19 +392,6 @@ void roh_unregister_device(struct roh_device *device) } EXPORT_SYMBOL(roh_unregister_device); -void roh_set_client_data(struct roh_device *device, struct roh_client *client, - void *data) -{ - void *rc; - - if (WARN_ON(IS_ERR(data))) - data = NULL; - - rc = xa_store(&device->client_data, client->client_id, data, - GFP_KERNEL); - WARN_ON(xa_is_err(rc)); -} - static void remove_client_context(struct roh_device *device, unsigned int client_id) { @@ -473,88 +461,6 @@ static int add_client_context(struct roh_device *device, return ret; } -static int assign_client_id(struct roh_client *client) -{ - int ret; - - down_write(&clients_rwsem); - - client->client_id = highest_client_id; - ret = xa_insert(&clients, client->client_id, client, GFP_KERNEL); - if (ret) - goto out; - - highest_client_id++; - xa_set_mark(&clients, client->client_id, CLIENT_REGISTERED); - -out: - up_write(&clients_rwsem); - return ret; -} - -static void remove_client_id(struct roh_client *client) -{ - down_write(&clients_rwsem); - xa_erase(&clients, client->client_id); - for (; highest_client_id; highest_client_id--) - if (xa_load(&clients, highest_client_id - 1)) - break; - up_write(&clients_rwsem); -} - -int roh_register_client(struct roh_client *client) -{ - struct roh_device *device; - unsigned long index; - int ret; - - refcount_set(&client->uses, 1); - init_completion(&client->uses_zero); - ret = assign_client_id(client); - if (ret) - return ret; - - down_read(&devices_rwsem); - xa_for_each_marked(&devices, index, device, DEVICE_REGISTERED) { - ret = add_client_context(device, client); - if (ret) { - up_read(&devices_rwsem); - roh_unregister_client(client); - return ret; - } - } - up_read(&devices_rwsem); - - return 0; -} - -void roh_unregister_client(struct roh_client *client) -{ - struct roh_device *device; - unsigned long index; - - down_write(&clients_rwsem); - roh_client_put(client); - xa_clear_mark(&clients, client->client_id, CLIENT_REGISTERED); - up_write(&clients_rwsem); - - rcu_read_lock(); - xa_for_each(&devices, index, device) { - if (!roh_device_try_get(device)) - continue; - rcu_read_unlock(); - - remove_client_context(device, client->client_id); - - roh_device_put(device); - rcu_read_lock(); - } - rcu_read_unlock(); - - wait_for_completion(&client->uses_zero); - remove_client_id(client); -} - static int roh_set_pf_mac_by_eid(struct roh_device *device, struct roh_eid_attr *eid_attr) { diff --git a/drivers/roh/core/core_priv.h b/drivers/roh/core/core_priv.h index 56f58182010026e8334d83681d4e3546a99c118f..fc67d99ce347d0ec6339c5d5eb515794aacc8114 100644 --- a/drivers/roh/core/core_priv.h +++ b/drivers/roh/core/core_priv.h @@ -15,11 +15,6 @@ struct roh_client { struct completion uses_zero; }; -int roh_register_client(struct roh_client *client); -void roh_unregister_client(struct roh_client *client); -void roh_set_client_data(struct roh_device *device, - struct roh_client *client, void *data); - int roh_device_register_sysfs(struct roh_device *device); void roh_device_unregister_sysfs(struct roh_device *device); diff --git a/drivers/roh/core/sysfs.c b/drivers/roh/core/sysfs.c index 6b7994a2432228d4ac9f78e835661e462a6b6c96..8776889d4fb3b657d72672f01e9dc8f4b2702f78 100644 --- a/drivers/roh/core/sysfs.c +++ b/drivers/roh/core/sysfs.c @@ -258,8 +258,9 @@ static int alloc_hsag(struct roh_device *device) return 0; err: for (j = i - 1; j >= 0; j--) - kfree(hsag->attrs[j]); + kfree(container_of(hsag->attrs[j], struct roh_hw_stats_attribute, attr)); kfree(hsag); + hsag = NULL; return ret; } diff --git a/drivers/roh/hw/hns3/hns3_cmdq.c b/drivers/roh/hw/hns3/hns3_cmdq.c index 96c0286779eb69c977b3ec0ae6999f2d2a9a8f8c..112add3905a8944614d9ef6426f9f8c6ad143433 100644 --- a/drivers/roh/hw/hns3/hns3_cmdq.c +++ b/drivers/roh/hw/hns3/hns3_cmdq.c @@ -107,7 +107,6 @@ int hns3_roh_cmdq_init(struct hns3_roh_device *hroh_dev) /* Setup the lock for command queue */ spin_lock_init(&priv->cmdq.csq.lock); - spin_lock_init(&priv->cmdq.crq.lock); /* Clear up all command register, * in case there are some residual values @@ -155,9 +154,7 @@ void hns3_roh_cmdq_exit(struct hns3_roh_device *hroh_dev) struct hns3_roh_priv *priv = (struct hns3_roh_priv *)hroh_dev->priv; spin_lock_bh(&priv->cmdq.csq.lock); - spin_lock(&priv->cmdq.crq.lock); hns3_roh_cmdq_clear_regs(hroh_dev); - spin_unlock(&priv->cmdq.crq.lock); spin_unlock_bh(&priv->cmdq.csq.lock); hns3_roh_free_cmdq_desc(hroh_dev, &priv->cmdq.csq); @@ -501,6 +498,6 @@ void hns3_roh_mbx_handler(struct hns3_roh_device *hroh_dev) hns3_roh_mbx_ring_ptr_move_crq(crq); } - /* write back CMDQ_RQ header ptr, M7 need this ptr */ + /* write back CMDQ_RQ header ptr, FW need this ptr */ hns3_roh_write(hroh_dev, HNS3_ROH_RX_CMDQ_HEAD_REG, crq->next_to_use); } diff --git a/drivers/roh/hw/hns3/hns3_cmdq.h b/drivers/roh/hw/hns3/hns3_cmdq.h index 224fe1d30ef9358cac6d825ce7c6fe593733124a..4c9f31a71cb5077c834bae306b140725e5b226b9 100644 --- a/drivers/roh/hw/hns3/hns3_cmdq.h +++ b/drivers/roh/hw/hns3/hns3_cmdq.h @@ -53,7 +53,7 @@ enum hns3_roh_cmd_return_status { }; enum hns3_roh_mbx_opcode { - HNS3_ROH_MBX_PUSH_LINK_STATUS = 201 /* (M7 -> PF) get port link status */ + HNS3_ROH_MBX_PUSH_LINK_STATUS = 201 /* (FW -> PF) get port link status */ }; struct hns3_roh_get_intr_info { diff --git a/drivers/roh/hw/hns3/hns3_common.h b/drivers/roh/hw/hns3/hns3_common.h index 40ec8b4299757b4cd8d689afe9909311f96dea1a..0b463cee07506033b7ffe81e77a8d5c64d282a3e 100644 --- a/drivers/roh/hw/hns3/hns3_common.h +++ b/drivers/roh/hw/hns3/hns3_common.h @@ -75,7 +75,6 @@ struct hns3_roh_device { struct roh_device roh_dev; struct pci_dev *pdev; struct device *dev; - bool active; struct net_device *netdev; u8 __iomem *reg_base; diff --git a/drivers/roh/hw/hns3/hns3_main.c b/drivers/roh/hw/hns3/hns3_main.c index 7a71cd15f69d2c43e5c67a33aa419b33fb4ac726..14357a0915af41bf882920f1287030909f6d99af 100644 --- a/drivers/roh/hw/hns3/hns3_main.c +++ b/drivers/roh/hw/hns3/hns3_main.c @@ -28,7 +28,6 @@ MODULE_DEVICE_TABLE(pci, hns3_roh_pci_tbl); static void hns3_roh_unregister_device(struct hns3_roh_device *hroh_dev) { - hroh_dev->active = false; roh_unregister_device(&hroh_dev->roh_dev); } @@ -61,8 +60,6 @@ static int hns3_roh_register_device(struct hns3_roh_device *hroh_dev) return ret; } - hroh_dev->active = true; - return 0; } @@ -220,7 +217,7 @@ static int hns3_roh_get_cfg_from_frame(struct hns3_roh_device *hroh_dev, hroh_dev->intr_info.vector_num = handle->rohinfo.num_vectors; if (hroh_dev->intr_info.vector_num < HNS3_ROH_MIN_VECTOR_NUM) { dev_err(hroh_dev->dev, - "just %d intr resources, not enough(min: %d).\n", + "just %u intr resources, not enough(min: %d).\n", hroh_dev->intr_info.vector_num, HNS3_ROH_MIN_VECTOR_NUM); return -EINVAL; } @@ -340,6 +337,7 @@ static int hns3_roh_reset_notify_init(struct hnae3_handle *handle) dev_err(dev, "failed to reinit in roh reset process, ret = %d\n", ret); handle->priv = NULL; clear_bit(HNS3_ROH_STATE_INITED, &handle->rohinfo.reset_state); + return ret; } return 0; @@ -428,14 +426,12 @@ static void hns3_roh_dfx_dump_dev_info(struct hns3_roh_device *hroh_dev) dev_info(dev, "PCIe device id: 0x%x\n", hroh_dev->pdev->device); dev_info(dev, "PCIe device name: %s\n", pci_name(hroh_dev->pdev)); dev_info(dev, "Network device name: %s\n", netdev_name(hroh_dev->netdev)); - dev_info(dev, "BAR2~3 base addr: 0x%llx\n", (u64)hroh_dev->reg_base); dev_info(dev, "Base vector: %d\n", hroh_dev->intr_info.base_vector); dev_info(dev, "ROH vector offset: %d\n", hroh_dev->intr_info.vector_offset); dev_info(dev, "ROH vector num: %d\n", hroh_dev->intr_info.vector_num); dev_info(dev, "ABN vector0 irq: %d\n", hroh_dev->abn_vector.vector_irq); - dev_info(dev, "ABN vector0 addr: 0x%llx\n", (u64)hroh_dev->abn_vector.addr); dev_info(dev, "ABN vector0 name: %s\n", hroh_dev->abn_vector.name); }