[PATCH net-next 16/23] {topost} net: hns3: fix for coalesce configuration lost during reset

2018-03-07 Thread Peng Li
From: Yunsheng Lin 

Coalesce configuration will be set to default value by
hns3_nic_init_vector_data during reset, which causes the
coalesce configuration loss problem.

This patch fixes it by setting the default value in
hns3_nic_alloc_vector_data, which will not be called in the
reset process.

Signed-off-by: Yunsheng Lin 
Signed-off-by: Peng Li 
---
 drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 156 +---
 1 file changed, 114 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index fef65b9..453f509 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -211,19 +211,25 @@ static void hns3_vector_gl_rl_init(struct 
hns3_enet_tqp_vector *tqp_vector,
tqp_vector->tx_group.int_gl = HNS3_INT_GL_50K;
tqp_vector->rx_group.int_gl = HNS3_INT_GL_50K;
 
-   hns3_set_vector_coalesce_tx_gl(tqp_vector,
-  tqp_vector->tx_group.int_gl);
-   hns3_set_vector_coalesce_rx_gl(tqp_vector,
-  tqp_vector->rx_group.int_gl);
-
/* Default: disable RL */
h->kinfo.int_rl_setting = 0;
-   hns3_set_vector_coalesce_rl(tqp_vector, h->kinfo.int_rl_setting);
 
tqp_vector->rx_group.flow_level = HNS3_FLOW_LOW;
tqp_vector->tx_group.flow_level = HNS3_FLOW_LOW;
 }
 
+static void hns3_vector_gl_rl_init_hw(struct hns3_enet_tqp_vector *tqp_vector,
+ struct hns3_nic_priv *priv)
+{
+   struct hnae3_handle *h = priv->ae_handle;
+
+   hns3_set_vector_coalesce_tx_gl(tqp_vector,
+  tqp_vector->tx_group.int_gl);
+   hns3_set_vector_coalesce_rx_gl(tqp_vector,
+  tqp_vector->rx_group.int_gl);
+   hns3_set_vector_coalesce_rl(tqp_vector, h->kinfo.int_rl_setting);
+}
+
 static int hns3_nic_set_real_num_queue(struct net_device *netdev)
 {
struct hnae3_handle *h = hns3_get_handle(netdev);
@@ -2613,32 +2619,18 @@ static int hns3_nic_init_vector_data(struct 
hns3_nic_priv *priv)
struct hnae3_ring_chain_node vector_ring_chain;
struct hnae3_handle *h = priv->ae_handle;
struct hns3_enet_tqp_vector *tqp_vector;
-   struct hnae3_vector_info *vector;
-   struct pci_dev *pdev = h->pdev;
-   u16 tqp_num = h->kinfo.num_tqps;
-   u16 vector_num;
int ret = 0;
u16 i;
 
-   /* RSS size, cpu online and vector_num should be the same */
-   /* Should consider 2p/4p later */
-   vector_num = min_t(u16, num_online_cpus(), tqp_num);
-   vector = devm_kcalloc(>dev, vector_num, sizeof(*vector),
- GFP_KERNEL);
-   if (!vector)
-   return -ENOMEM;
-
-   vector_num = h->ae_algo->ops->get_vector(h, vector_num, vector);
-
-   priv->vector_num = vector_num;
-   priv->tqp_vector = (struct hns3_enet_tqp_vector *)
-   devm_kcalloc(>dev, vector_num, sizeof(*priv->tqp_vector),
-GFP_KERNEL);
-   if (!priv->tqp_vector)
-   return -ENOMEM;
+   for (i = 0; i < priv->vector_num; i++) {
+   tqp_vector = >tqp_vector[i];
+   hns3_vector_gl_rl_init_hw(tqp_vector, priv);
+   tqp_vector->num_tqps = 0;
+   }
 
-   for (i = 0; i < tqp_num; i++) {
-   u16 vector_i = i % vector_num;
+   for (i = 0; i < h->kinfo.num_tqps; i++) {
+   u16 vector_i = i % priv->vector_num;
+   u16 tqp_num = h->kinfo.num_tqps;
 
tqp_vector = >tqp_vector[vector_i];
 
@@ -2648,52 +2640,94 @@ static int hns3_nic_init_vector_data(struct 
hns3_nic_priv *priv)
hns3_add_ring_to_group(_vector->rx_group,
   priv->ring_data[i + tqp_num].ring);
 
-   tqp_vector->idx = vector_i;
-   tqp_vector->mask_addr = vector[vector_i].io_addr;
-   tqp_vector->vector_irq = vector[vector_i].vector;
-   tqp_vector->num_tqps++;
-
priv->ring_data[i].ring->tqp_vector = tqp_vector;
priv->ring_data[i + tqp_num].ring->tqp_vector = tqp_vector;
+   tqp_vector->num_tqps++;
}
 
-   for (i = 0; i < vector_num; i++) {
+   for (i = 0; i < priv->vector_num; i++) {
tqp_vector = >tqp_vector[i];
 
tqp_vector->rx_group.total_bytes = 0;
tqp_vector->rx_group.total_packets = 0;
tqp_vector->tx_group.total_bytes = 0;
tqp_vector->tx_group.total_packets = 0;
-   hns3_vector_gl_rl_init(tqp_vector, priv);
tqp_vector->handle = h;
 
ret = hns3_get_vector_ring_chain(tqp_vector,
 

[PATCH net-next 16/23] {topost} net: hns3: fix for coalesce configuration lost during reset

2018-03-07 Thread Peng Li
From: Yunsheng Lin 

Coalesce configuration will be set to default value by
hns3_nic_init_vector_data during reset, which causes the
coalesce configuration loss problem.

This patch fixes it by setting the default value in
hns3_nic_alloc_vector_data, which will not be called in the
reset process.

Signed-off-by: Yunsheng Lin 
Signed-off-by: Peng Li 
---
 drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 156 +---
 1 file changed, 114 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index fef65b9..453f509 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -211,19 +211,25 @@ static void hns3_vector_gl_rl_init(struct 
hns3_enet_tqp_vector *tqp_vector,
tqp_vector->tx_group.int_gl = HNS3_INT_GL_50K;
tqp_vector->rx_group.int_gl = HNS3_INT_GL_50K;
 
-   hns3_set_vector_coalesce_tx_gl(tqp_vector,
-  tqp_vector->tx_group.int_gl);
-   hns3_set_vector_coalesce_rx_gl(tqp_vector,
-  tqp_vector->rx_group.int_gl);
-
/* Default: disable RL */
h->kinfo.int_rl_setting = 0;
-   hns3_set_vector_coalesce_rl(tqp_vector, h->kinfo.int_rl_setting);
 
tqp_vector->rx_group.flow_level = HNS3_FLOW_LOW;
tqp_vector->tx_group.flow_level = HNS3_FLOW_LOW;
 }
 
+static void hns3_vector_gl_rl_init_hw(struct hns3_enet_tqp_vector *tqp_vector,
+ struct hns3_nic_priv *priv)
+{
+   struct hnae3_handle *h = priv->ae_handle;
+
+   hns3_set_vector_coalesce_tx_gl(tqp_vector,
+  tqp_vector->tx_group.int_gl);
+   hns3_set_vector_coalesce_rx_gl(tqp_vector,
+  tqp_vector->rx_group.int_gl);
+   hns3_set_vector_coalesce_rl(tqp_vector, h->kinfo.int_rl_setting);
+}
+
 static int hns3_nic_set_real_num_queue(struct net_device *netdev)
 {
struct hnae3_handle *h = hns3_get_handle(netdev);
@@ -2613,32 +2619,18 @@ static int hns3_nic_init_vector_data(struct 
hns3_nic_priv *priv)
struct hnae3_ring_chain_node vector_ring_chain;
struct hnae3_handle *h = priv->ae_handle;
struct hns3_enet_tqp_vector *tqp_vector;
-   struct hnae3_vector_info *vector;
-   struct pci_dev *pdev = h->pdev;
-   u16 tqp_num = h->kinfo.num_tqps;
-   u16 vector_num;
int ret = 0;
u16 i;
 
-   /* RSS size, cpu online and vector_num should be the same */
-   /* Should consider 2p/4p later */
-   vector_num = min_t(u16, num_online_cpus(), tqp_num);
-   vector = devm_kcalloc(>dev, vector_num, sizeof(*vector),
- GFP_KERNEL);
-   if (!vector)
-   return -ENOMEM;
-
-   vector_num = h->ae_algo->ops->get_vector(h, vector_num, vector);
-
-   priv->vector_num = vector_num;
-   priv->tqp_vector = (struct hns3_enet_tqp_vector *)
-   devm_kcalloc(>dev, vector_num, sizeof(*priv->tqp_vector),
-GFP_KERNEL);
-   if (!priv->tqp_vector)
-   return -ENOMEM;
+   for (i = 0; i < priv->vector_num; i++) {
+   tqp_vector = >tqp_vector[i];
+   hns3_vector_gl_rl_init_hw(tqp_vector, priv);
+   tqp_vector->num_tqps = 0;
+   }
 
-   for (i = 0; i < tqp_num; i++) {
-   u16 vector_i = i % vector_num;
+   for (i = 0; i < h->kinfo.num_tqps; i++) {
+   u16 vector_i = i % priv->vector_num;
+   u16 tqp_num = h->kinfo.num_tqps;
 
tqp_vector = >tqp_vector[vector_i];
 
@@ -2648,52 +2640,94 @@ static int hns3_nic_init_vector_data(struct 
hns3_nic_priv *priv)
hns3_add_ring_to_group(_vector->rx_group,
   priv->ring_data[i + tqp_num].ring);
 
-   tqp_vector->idx = vector_i;
-   tqp_vector->mask_addr = vector[vector_i].io_addr;
-   tqp_vector->vector_irq = vector[vector_i].vector;
-   tqp_vector->num_tqps++;
-
priv->ring_data[i].ring->tqp_vector = tqp_vector;
priv->ring_data[i + tqp_num].ring->tqp_vector = tqp_vector;
+   tqp_vector->num_tqps++;
}
 
-   for (i = 0; i < vector_num; i++) {
+   for (i = 0; i < priv->vector_num; i++) {
tqp_vector = >tqp_vector[i];
 
tqp_vector->rx_group.total_bytes = 0;
tqp_vector->rx_group.total_packets = 0;
tqp_vector->tx_group.total_bytes = 0;
tqp_vector->tx_group.total_packets = 0;
-   hns3_vector_gl_rl_init(tqp_vector, priv);
tqp_vector->handle = h;
 
ret = hns3_get_vector_ring_chain(tqp_vector,
 _ring_chain);
if (ret)
-