* [PATCH net 1/3] qlcnic: Fix update of ethtool stats.
2014-08-04 15:51 [PATCH net 0/3] qlcnic: Bug fixes Rajesh Borundia
@ 2014-08-04 15:51 ` Rajesh Borundia
2014-08-04 15:51 ` [PATCH net 2/3] qlcnic: Set driver version before registering netdev Rajesh Borundia
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Rajesh Borundia @ 2014-08-04 15:51 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept-HSGLinuxNICDev
o Aggregating tx stats in adapter variable was resulting in
an increase in stats even after no traffic was run and
user runs ifconfig/ethtool command.
o qlcnic_update_stats used to accumulate stats in adapter
struct at each function call, instead accumulate tx stats
in local variable and then assign it to adapter structure.
Reported-by: Holger Kiehl <holger.kiehl@dwd.de>
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
---
.../net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 18 +++++++++++++-----
1 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 1b7f3db..141f116 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -1290,17 +1290,25 @@ static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type)
void qlcnic_update_stats(struct qlcnic_adapter *adapter)
{
+ struct qlcnic_tx_queue_stats tx_stats;
struct qlcnic_host_tx_ring *tx_ring;
int ring;
+ memset(&tx_stats, 0, sizeof(tx_stats));
for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
tx_ring = &adapter->tx_ring[ring];
- adapter->stats.xmit_on += tx_ring->tx_stats.xmit_on;
- adapter->stats.xmit_off += tx_ring->tx_stats.xmit_off;
- adapter->stats.xmitcalled += tx_ring->tx_stats.xmit_called;
- adapter->stats.xmitfinished += tx_ring->tx_stats.xmit_finished;
- adapter->stats.txbytes += tx_ring->tx_stats.tx_bytes;
+ tx_stats.xmit_on += tx_ring->tx_stats.xmit_on;
+ tx_stats.xmit_off += tx_ring->tx_stats.xmit_off;
+ tx_stats.xmit_called += tx_ring->tx_stats.xmit_called;
+ tx_stats.xmit_finished += tx_ring->tx_stats.xmit_finished;
+ tx_stats.tx_bytes += tx_ring->tx_stats.tx_bytes;
}
+
+ adapter->stats.xmit_on = tx_stats.xmit_on;
+ adapter->stats.xmit_off = tx_stats.xmit_off;
+ adapter->stats.xmitcalled = tx_stats.xmit_called;
+ adapter->stats.xmitfinished = tx_stats.xmit_finished;
+ adapter->stats.txbytes = tx_stats.tx_bytes;
}
static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats)
--
1.6.3.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net 2/3] qlcnic: Set driver version before registering netdev
2014-08-04 15:51 [PATCH net 0/3] qlcnic: Bug fixes Rajesh Borundia
2014-08-04 15:51 ` [PATCH net 1/3] qlcnic: Fix update of ethtool stats Rajesh Borundia
@ 2014-08-04 15:51 ` Rajesh Borundia
2014-08-04 15:51 ` [PATCH net 3/3] qlcnic: Initialize dcbnl_ops before register_netdev Rajesh Borundia
2014-08-05 23:24 ` [PATCH net 0/3] qlcnic: Bug fixes David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Rajesh Borundia @ 2014-08-04 15:51 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept-HSGLinuxNICDev
o Earlier, set_drv_version was getting called after register_netdev.
This was resulting in a race between set_drv_version and FLR called
from open(). Moving set_drv_version before register_netdev avoids
the race.
o Log response code in error message on CDRP failure.
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | 2 +-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 304e247..ffbae29 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -136,7 +136,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
rsp = qlcnic_poll_rsp(adapter);
if (rsp == QLCNIC_CDRP_RSP_TIMEOUT) {
- dev_err(&pdev->dev, "card response timeout.\n");
+ dev_err(&pdev->dev, "command timeout, response = 0x%x\n", rsp);
cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 4fc1867..158e1d9 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2623,13 +2623,13 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err)
goto err_out_disable_mbx_intr;
+ if (adapter->portnum == 0)
+ qlcnic_set_drv_version(adapter);
+
err = qlcnic_setup_netdev(adapter, netdev, pci_using_dac);
if (err)
goto err_out_disable_mbx_intr;
- if (adapter->portnum == 0)
- qlcnic_set_drv_version(adapter);
-
pci_set_drvdata(pdev, adapter);
if (qlcnic_82xx_check(adapter))
--
1.6.3.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net 3/3] qlcnic: Initialize dcbnl_ops before register_netdev
2014-08-04 15:51 [PATCH net 0/3] qlcnic: Bug fixes Rajesh Borundia
2014-08-04 15:51 ` [PATCH net 1/3] qlcnic: Fix update of ethtool stats Rajesh Borundia
2014-08-04 15:51 ` [PATCH net 2/3] qlcnic: Set driver version before registering netdev Rajesh Borundia
@ 2014-08-04 15:51 ` Rajesh Borundia
2014-08-05 23:24 ` [PATCH net 0/3] qlcnic: Bug fixes David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Rajesh Borundia @ 2014-08-04 15:51 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept-HSGLinuxNICDev
o Initialization of dcbnl_ops after register netdev may result in
dcbnl_ops not getting set before it is being accessed from open.
So, moving it before register_netdev.
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 158e1d9..3187bc0 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2323,14 +2323,14 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
if (err)
return err;
+ qlcnic_dcb_init_dcbnl_ops(adapter->dcb);
+
err = register_netdev(netdev);
if (err) {
dev_err(&pdev->dev, "failed to register net device\n");
return err;
}
- qlcnic_dcb_init_dcbnl_ops(adapter->dcb);
-
return 0;
}
--
1.6.3.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net 0/3] qlcnic: Bug fixes
2014-08-04 15:51 [PATCH net 0/3] qlcnic: Bug fixes Rajesh Borundia
` (2 preceding siblings ...)
2014-08-04 15:51 ` [PATCH net 3/3] qlcnic: Initialize dcbnl_ops before register_netdev Rajesh Borundia
@ 2014-08-05 23:24 ` David Miller
3 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2014-08-05 23:24 UTC (permalink / raw)
To: rajesh.borundia; +Cc: netdev, Dept-HSGLinuxNICDev
From: Rajesh Borundia <rajesh.borundia@qlogic.com>
Date: Mon, 4 Aug 2014 11:51:15 -0400
> The patch series contains following bug fixes.
>
> * Aggregating tx stats in adapter variable was resulting
> in increase of stats when user runs ifconfig command
> and no traffic is running. Instead aggregate tx stats
> in local variable and then assign it to adapter struct
> variable.
> * Set_driver_version was called after registering netdev
> which was resulting in a race between FLR in open
> handler and set_driver_version command as open handler
> can be called simulatneously on another cpu even if probe
> is not complete. So call this command before registering
> netdev.
> * dcbnl_ops should be initialized before registering netdev
> as they are referenced in open handler.
>
> Please apply this series to net.
Series applied, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread