Commit 1e513b6b authored by David S. Miller's avatar David S. Miller

Merge branch 'hns3-bug-fixes'

Salil Mehta says:

====================
Bug fixes for the HNS3 Ethernet Driver for Hip08 SoC

This patch set presents some bug fixes for the HNS3 Ethernet driver identified
during internal testing & stabilization efforts.

Change Log:
Patch V2: Resolved comments from Leon Romanovsky
Patch V1: Initial Submit
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 930651a7 90f7b11a
...@@ -37,20 +37,15 @@ static bool hnae3_client_match(enum hnae3_client_type client_type, ...@@ -37,20 +37,15 @@ static bool hnae3_client_match(enum hnae3_client_type client_type,
} }
static int hnae3_match_n_instantiate(struct hnae3_client *client, static int hnae3_match_n_instantiate(struct hnae3_client *client,
struct hnae3_ae_dev *ae_dev, struct hnae3_ae_dev *ae_dev, bool is_reg)
bool is_reg, bool *matched)
{ {
int ret; int ret;
*matched = false;
/* check if this client matches the type of ae_dev */ /* check if this client matches the type of ae_dev */
if (!(hnae3_client_match(client->type, ae_dev->dev_type) && if (!(hnae3_client_match(client->type, ae_dev->dev_type) &&
hnae_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))) { hnae_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))) {
return 0; return 0;
} }
/* there is a match of client and dev */
*matched = true;
/* now, (un-)instantiate client by calling lower layer */ /* now, (un-)instantiate client by calling lower layer */
if (is_reg) { if (is_reg) {
...@@ -69,7 +64,6 @@ int hnae3_register_client(struct hnae3_client *client) ...@@ -69,7 +64,6 @@ int hnae3_register_client(struct hnae3_client *client)
{ {
struct hnae3_client *client_tmp; struct hnae3_client *client_tmp;
struct hnae3_ae_dev *ae_dev; struct hnae3_ae_dev *ae_dev;
bool matched;
int ret = 0; int ret = 0;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
...@@ -86,7 +80,7 @@ int hnae3_register_client(struct hnae3_client *client) ...@@ -86,7 +80,7 @@ int hnae3_register_client(struct hnae3_client *client)
/* if the client could not be initialized on current port, for /* if the client could not be initialized on current port, for
* any error reasons, move on to next available port * any error reasons, move on to next available port
*/ */
ret = hnae3_match_n_instantiate(client, ae_dev, true, &matched); ret = hnae3_match_n_instantiate(client, ae_dev, true);
if (ret) if (ret)
dev_err(&ae_dev->pdev->dev, dev_err(&ae_dev->pdev->dev,
"match and instantiation failed for port\n"); "match and instantiation failed for port\n");
...@@ -102,12 +96,11 @@ EXPORT_SYMBOL(hnae3_register_client); ...@@ -102,12 +96,11 @@ EXPORT_SYMBOL(hnae3_register_client);
void hnae3_unregister_client(struct hnae3_client *client) void hnae3_unregister_client(struct hnae3_client *client)
{ {
struct hnae3_ae_dev *ae_dev; struct hnae3_ae_dev *ae_dev;
bool matched;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
/* un-initialize the client on every matched port */ /* un-initialize the client on every matched port */
list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) { list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
hnae3_match_n_instantiate(client, ae_dev, false, &matched); hnae3_match_n_instantiate(client, ae_dev, false);
} }
list_del(&client->node); list_del(&client->node);
...@@ -124,7 +117,6 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo) ...@@ -124,7 +117,6 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)
const struct pci_device_id *id; const struct pci_device_id *id;
struct hnae3_ae_dev *ae_dev; struct hnae3_ae_dev *ae_dev;
struct hnae3_client *client; struct hnae3_client *client;
bool matched;
int ret = 0; int ret = 0;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
...@@ -151,13 +143,10 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo) ...@@ -151,13 +143,10 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)
* initialize the figure out client instance * initialize the figure out client instance
*/ */
list_for_each_entry(client, &hnae3_client_list, node) { list_for_each_entry(client, &hnae3_client_list, node) {
ret = hnae3_match_n_instantiate(client, ae_dev, true, ret = hnae3_match_n_instantiate(client, ae_dev, true);
&matched);
if (ret) if (ret)
dev_err(&ae_dev->pdev->dev, dev_err(&ae_dev->pdev->dev,
"match and instantiation failed\n"); "match and instantiation failed\n");
if (matched)
break;
} }
} }
...@@ -175,7 +164,6 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo) ...@@ -175,7 +164,6 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)
const struct pci_device_id *id; const struct pci_device_id *id;
struct hnae3_ae_dev *ae_dev; struct hnae3_ae_dev *ae_dev;
struct hnae3_client *client; struct hnae3_client *client;
bool matched;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
/* Check if there are matched ae_dev */ /* Check if there are matched ae_dev */
...@@ -187,12 +175,8 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo) ...@@ -187,12 +175,8 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)
/* check the client list for the match with this ae_dev type and /* check the client list for the match with this ae_dev type and
* un-initialize the figure out client instance * un-initialize the figure out client instance
*/ */
list_for_each_entry(client, &hnae3_client_list, node) { list_for_each_entry(client, &hnae3_client_list, node)
hnae3_match_n_instantiate(client, ae_dev, false, hnae3_match_n_instantiate(client, ae_dev, false);
&matched);
if (matched)
break;
}
ae_algo->ops->uninit_ae_dev(ae_dev); ae_algo->ops->uninit_ae_dev(ae_dev);
hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0);
...@@ -212,7 +196,6 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -212,7 +196,6 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)
const struct pci_device_id *id; const struct pci_device_id *id;
struct hnae3_ae_algo *ae_algo; struct hnae3_ae_algo *ae_algo;
struct hnae3_client *client; struct hnae3_client *client;
bool matched;
int ret = 0; int ret = 0;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
...@@ -246,13 +229,10 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -246,13 +229,10 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)
* initialize the figure out client instance * initialize the figure out client instance
*/ */
list_for_each_entry(client, &hnae3_client_list, node) { list_for_each_entry(client, &hnae3_client_list, node) {
ret = hnae3_match_n_instantiate(client, ae_dev, true, ret = hnae3_match_n_instantiate(client, ae_dev, true);
&matched);
if (ret) if (ret)
dev_err(&ae_dev->pdev->dev, dev_err(&ae_dev->pdev->dev,
"match and instantiation failed\n"); "match and instantiation failed\n");
if (matched)
break;
} }
out_err: out_err:
...@@ -270,7 +250,6 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -270,7 +250,6 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)
const struct pci_device_id *id; const struct pci_device_id *id;
struct hnae3_ae_algo *ae_algo; struct hnae3_ae_algo *ae_algo;
struct hnae3_client *client; struct hnae3_client *client;
bool matched;
mutex_lock(&hnae3_common_lock); mutex_lock(&hnae3_common_lock);
/* Check if there are matched ae_algo */ /* Check if there are matched ae_algo */
...@@ -279,12 +258,8 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -279,12 +258,8 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)
if (!id) if (!id)
continue; continue;
list_for_each_entry(client, &hnae3_client_list, node) { list_for_each_entry(client, &hnae3_client_list, node)
hnae3_match_n_instantiate(client, ae_dev, false, hnae3_match_n_instantiate(client, ae_dev, false);
&matched);
if (matched)
break;
}
ae_algo->ops->uninit_ae_dev(ae_dev); ae_algo->ops->uninit_ae_dev(ae_dev);
hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0);
......
...@@ -238,7 +238,7 @@ struct hclge_tqp_map { ...@@ -238,7 +238,7 @@ struct hclge_tqp_map {
u8 rsv[18]; u8 rsv[18];
}; };
#define HCLGE_VECTOR_ELEMENTS_PER_CMD 11 #define HCLGE_VECTOR_ELEMENTS_PER_CMD 10
enum hclge_int_type { enum hclge_int_type {
HCLGE_INT_TX, HCLGE_INT_TX,
...@@ -252,8 +252,12 @@ struct hclge_ctrl_vector_chain { ...@@ -252,8 +252,12 @@ struct hclge_ctrl_vector_chain {
#define HCLGE_INT_TYPE_S 0 #define HCLGE_INT_TYPE_S 0
#define HCLGE_INT_TYPE_M 0x3 #define HCLGE_INT_TYPE_M 0x3
#define HCLGE_TQP_ID_S 2 #define HCLGE_TQP_ID_S 2
#define HCLGE_TQP_ID_M (0x3fff << HCLGE_TQP_ID_S) #define HCLGE_TQP_ID_M (0x7ff << HCLGE_TQP_ID_S)
#define HCLGE_INT_GL_IDX_S 13
#define HCLGE_INT_GL_IDX_M (0x3 << HCLGE_INT_GL_IDX_S)
__le16 tqp_type_and_id[HCLGE_VECTOR_ELEMENTS_PER_CMD]; __le16 tqp_type_and_id[HCLGE_VECTOR_ELEMENTS_PER_CMD];
u8 vfid;
u8 rsv;
}; };
#define HCLGE_TC_NUM 8 #define HCLGE_TC_NUM 8
......
...@@ -1063,9 +1063,9 @@ static int hclge_configure(struct hclge_dev *hdev) ...@@ -1063,9 +1063,9 @@ static int hclge_configure(struct hclge_dev *hdev)
hdev->base_tqp_pid = 0; hdev->base_tqp_pid = 0;
hdev->rss_size_max = 1; hdev->rss_size_max = 1;
hdev->rx_buf_len = cfg.rx_buf_len; hdev->rx_buf_len = cfg.rx_buf_len;
for (i = 0; i < ETH_ALEN; i++) ether_addr_copy(hdev->hw.mac.mac_addr, cfg.mac_addr);
hdev->hw.mac.mac_addr[i] = cfg.mac_addr[i];
hdev->hw.mac.media_type = cfg.media_type; hdev->hw.mac.media_type = cfg.media_type;
hdev->hw.mac.phy_addr = cfg.phy_addr;
hdev->num_desc = cfg.tqp_desc_num; hdev->num_desc = cfg.tqp_desc_num;
hdev->tm_info.num_pg = 1; hdev->tm_info.num_pg = 1;
hdev->tm_info.num_tc = cfg.tc_num; hdev->tm_info.num_tc = cfg.tc_num;
...@@ -2679,7 +2679,11 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id, ...@@ -2679,7 +2679,11 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B)); hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M, hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
HCLGE_TQP_ID_S, node->tqp_index); HCLGE_TQP_ID_S, node->tqp_index);
hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
HCLGE_INT_GL_IDX_S,
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]); req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
req->vfid = vport->vport_id;
if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) { if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD; req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD;
...@@ -2763,8 +2767,12 @@ static int hclge_unmap_ring_from_vector( ...@@ -2763,8 +2767,12 @@ static int hclge_unmap_ring_from_vector(
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B)); hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M, hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
HCLGE_TQP_ID_S, node->tqp_index); HCLGE_TQP_ID_S, node->tqp_index);
hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
HCLGE_INT_GL_IDX_S,
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]); req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
req->vfid = vport->vport_id;
if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) { if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD; req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD;
...@@ -2778,7 +2786,7 @@ static int hclge_unmap_ring_from_vector( ...@@ -2778,7 +2786,7 @@ static int hclge_unmap_ring_from_vector(
} }
i = 0; i = 0;
hclge_cmd_setup_basic_desc(&desc, hclge_cmd_setup_basic_desc(&desc,
HCLGE_OPC_ADD_RING_TO_VECTOR, HCLGE_OPC_DEL_RING_TO_VECTOR,
false); false);
req->int_vector_id = vector_id; req->int_vector_id = vector_id;
} }
...@@ -3665,6 +3673,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev) ...@@ -3665,6 +3673,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
{ {
#define HCLGE_VLAN_TYPE_VF_TABLE 0 #define HCLGE_VLAN_TYPE_VF_TABLE 0
#define HCLGE_VLAN_TYPE_PORT_TABLE 1 #define HCLGE_VLAN_TYPE_PORT_TABLE 1
struct hnae3_handle *handle;
int ret; int ret;
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_VF_TABLE, ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_VF_TABLE,
...@@ -3674,8 +3683,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev) ...@@ -3674,8 +3683,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_PORT_TABLE, ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_PORT_TABLE,
true); true);
if (ret)
return ret;
return ret; handle = &hdev->vport[0].nic;
return hclge_set_port_vlan_filter(handle, htons(ETH_P_8021Q), 0, false);
} }
static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu) static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)
......
...@@ -2705,10 +2705,11 @@ static void hns3_init_mac_addr(struct net_device *netdev) ...@@ -2705,10 +2705,11 @@ static void hns3_init_mac_addr(struct net_device *netdev)
eth_hw_addr_random(netdev); eth_hw_addr_random(netdev);
dev_warn(priv->dev, "using random MAC address %pM\n", dev_warn(priv->dev, "using random MAC address %pM\n",
netdev->dev_addr); netdev->dev_addr);
/* Also copy this new MAC address into hdev */
if (h->ae_algo->ops->set_mac_addr)
h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr);
} }
if (h->ae_algo->ops->set_mac_addr)
h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr);
} }
static void hns3_nic_set_priv_ops(struct net_device *netdev) static void hns3_nic_set_priv_ops(struct net_device *netdev)
......
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