* [PATCH v2 net-next 0/5] ionic: driver updates
@ 2019-09-30 21:49 Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info Shannon Nelson
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
These patches are a few updates to clean up some code
issues and add an ethtool feature.
v2: add cover letter
edit a couple of patch descriptions for clarity and add Fixes tags
Shannon Nelson (5):
ionic: simplify returns in devlink info
ionic: use wait_on_bit_lock() rather than open code
ionic: report users coalesce request
ionic: implement ethtool set-fec
ionic: add lif_quiesce to wait for queue activity to stop
.../ethernet/pensando/ionic/ionic_devlink.c | 9 +-
.../ethernet/pensando/ionic/ionic_ethtool.c | 128 ++++++++++++------
.../net/ethernet/pensando/ionic/ionic_lif.c | 40 ++++--
.../net/ethernet/pensando/ionic/ionic_lif.h | 13 +-
4 files changed, 127 insertions(+), 63 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
@ 2019-09-30 21:49 ` Shannon Nelson
2019-09-30 23:26 ` Jakub Kicinski
2019-09-30 21:49 ` [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code Shannon Nelson
` (4 subsequent siblings)
5 siblings, 1 reply; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
There is no need for a goto in this bit of code.
Fixes: fbfb8031533c9 ("ionic: Add hardware init and device commands")
Signed-off-by: Shannon Nelson <snelson@pensando.io>
---
drivers/net/ethernet/pensando/ionic/ionic_devlink.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
index af1647afa4e8..6fb27dcc5787 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
@@ -19,31 +19,30 @@ static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
err = devlink_info_driver_name_put(req, IONIC_DRV_NAME);
if (err)
- goto info_out;
+ return err;
err = devlink_info_version_running_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW,
idev->dev_info.fw_version);
if (err)
- goto info_out;
+ return err;
snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_type);
err = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
buf);
if (err)
- goto info_out;
+ return err;
snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_rev);
err = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_ASIC_REV,
buf);
if (err)
- goto info_out;
+ return err;
err = devlink_info_serial_number_put(req, idev->dev_info.serial_num);
-info_out:
return err;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info Shannon Nelson
@ 2019-09-30 21:49 ` Shannon Nelson
2019-09-30 23:27 ` Jakub Kicinski
2019-09-30 21:49 ` [PATCH v2 net-next 3/5] ionic: report users coalesce request Shannon Nelson
` (3 subsequent siblings)
5 siblings, 1 reply; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
Replace the open-coded ionic_wait_for_bit() with the
kernel's wait_on_bit_lock().
Fixes: beead698b1736 ("ionic: Add the basic NDO callbacks for netdev support")
Signed-off-by: Shannon Nelson <snelson@pensando.io>
---
drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 12 ++++++++----
drivers/net/ethernet/pensando/ionic/ionic_lif.c | 5 +++--
drivers/net/ethernet/pensando/ionic/ionic_lif.h | 9 ++-------
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index 7d10265f782a..7760fcd709b4 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -453,6 +453,7 @@ static int ionic_set_ringparam(struct net_device *netdev,
{
struct ionic_lif *lif = netdev_priv(netdev);
bool running;
+ int err;
if (ring->rx_mini_pending || ring->rx_jumbo_pending) {
netdev_info(netdev, "Changing jumbo or mini descriptors not supported\n");
@@ -470,8 +471,9 @@ static int ionic_set_ringparam(struct net_device *netdev,
ring->rx_pending == lif->nrxq_descs)
return 0;
- if (!ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET))
- return -EBUSY;
+ err = ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET);
+ if (err)
+ return err;
running = test_bit(IONIC_LIF_UP, lif->state);
if (running)
@@ -504,6 +506,7 @@ static int ionic_set_channels(struct net_device *netdev,
{
struct ionic_lif *lif = netdev_priv(netdev);
bool running;
+ int err;
if (!ch->combined_count || ch->other_count ||
ch->rx_count || ch->tx_count)
@@ -512,8 +515,9 @@ static int ionic_set_channels(struct net_device *netdev,
if (ch->combined_count == lif->nxqs)
return 0;
- if (!ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET))
- return -EBUSY;
+ err = ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET);
+ if (err)
+ return err;
running = test_bit(IONIC_LIF_UP, lif->state);
if (running)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index 72107a0627a9..4d5883a7e586 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -1619,8 +1619,9 @@ int ionic_reset_queues(struct ionic_lif *lif)
/* Put off the next watchdog timeout */
netif_trans_update(lif->netdev);
- if (!ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET))
- return -EBUSY;
+ err = ionic_wait_for_bit(lif, IONIC_LIF_QUEUE_RESET);
+ if (err)
+ return err;
running = netif_running(lif->netdev);
if (running)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
index 812190e729c2..b74f7e9ee82d 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
@@ -185,15 +185,10 @@ struct ionic_lif {
#define lif_to_txq(lif, i) (&lif_to_txqcq((lif), i)->q)
#define lif_to_rxq(lif, i) (&lif_to_txqcq((lif), i)->q)
+/* return 0 if successfully set the bit, else non-zero */
static inline int ionic_wait_for_bit(struct ionic_lif *lif, int bitname)
{
- unsigned long tlimit = jiffies + HZ;
-
- while (test_and_set_bit(bitname, lif->state) &&
- time_before(jiffies, tlimit))
- usleep_range(100, 200);
-
- return test_bit(bitname, lif->state);
+ return wait_on_bit_lock(lif->state, bitname, TASK_INTERRUPTIBLE);
}
static inline u32 ionic_coal_usec_to_hw(struct ionic *ionic, u32 usecs)
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 net-next 3/5] ionic: report users coalesce request
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code Shannon Nelson
@ 2019-09-30 21:49 ` Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 4/5] ionic: implement ethtool set-fec Shannon Nelson
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
The user's request for an interrupt coalescing value gets
translated into a hardware value to be used with the NIC,
and was getting reported back based on the hw value, which,
due to hw tic resolution, could be reported as a different
number than what the user originally asked for. This code
now tracks both the user request and what was put into the
hardware so we can report back to the user what they
requested.
Fixes: 8c15440bce31 ("ionic: Add coalesce and other features")
Signed-off-by: Shannon Nelson <snelson@pensando.io>
---
.../ethernet/pensando/ionic/ionic_ethtool.c | 22 +++++++++----------
.../net/ethernet/pensando/ionic/ionic_lif.c | 11 +++++-----
.../net/ethernet/pensando/ionic/ionic_lif.h | 4 +++-
3 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index 7760fcd709b4..63cc14c060d6 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -372,7 +372,6 @@ static int ionic_set_coalesce(struct net_device *netdev,
struct ionic_identity *ident;
struct ionic_qcq *qcq;
unsigned int i;
- u32 usecs;
u32 coal;
if (coalesce->rx_max_coalesced_frames ||
@@ -410,26 +409,27 @@ static int ionic_set_coalesce(struct net_device *netdev,
return -EINVAL;
}
+ /* Convert the usec request to a HW useable value. If they asked
+ * for non-zero and it resolved to zero, bump it up
+ */
coal = ionic_coal_usec_to_hw(lif->ionic, coalesce->rx_coalesce_usecs);
-
- if (coal > IONIC_INTR_CTRL_COAL_MAX)
- return -ERANGE;
-
- /* If they asked for non-zero and it resolved to zero, bump it up */
if (!coal && coalesce->rx_coalesce_usecs)
coal = 1;
- /* Convert it back to get device resolution */
- usecs = ionic_coal_hw_to_usec(lif->ionic, coal);
+ if (coal > IONIC_INTR_CTRL_COAL_MAX)
+ return -ERANGE;
- if (usecs != lif->rx_coalesce_usecs) {
- lif->rx_coalesce_usecs = usecs;
+ /* Save the new value */
+ lif->rx_coalesce_usecs = coalesce->rx_coalesce_usecs;
+ if (coal != lif->rx_coalesce_hw) {
+ lif->rx_coalesce_hw = coal;
if (test_bit(IONIC_LIF_UP, lif->state)) {
for (i = 0; i < lif->nxqs; i++) {
qcq = lif->rxqcqs[i].qcq;
ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
- qcq->intr.index, coal);
+ qcq->intr.index,
+ lif->rx_coalesce_hw);
}
}
}
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index 4d5883a7e586..372329389c84 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -1430,7 +1430,6 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
unsigned int flags;
unsigned int i;
int err = 0;
- u32 coal;
flags = IONIC_QCQ_F_TX_STATS | IONIC_QCQ_F_SG;
for (i = 0; i < lif->nxqs; i++) {
@@ -1447,7 +1446,6 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
}
flags = IONIC_QCQ_F_RX_STATS | IONIC_QCQ_F_INTR;
- coal = ionic_coal_usec_to_hw(lif->ionic, lif->rx_coalesce_usecs);
for (i = 0; i < lif->nxqs; i++) {
err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, i, "rx", flags,
lif->nrxq_descs,
@@ -1460,7 +1458,8 @@ static int ionic_txrx_alloc(struct ionic_lif *lif)
lif->rxqcqs[i].qcq->stats = lif->rxqcqs[i].stats;
ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
- lif->rxqcqs[i].qcq->intr.index, coal);
+ lif->rxqcqs[i].qcq->intr.index,
+ lif->rx_coalesce_hw);
ionic_link_qcq_interrupts(lif->rxqcqs[i].qcq,
lif->txqcqs[i].qcq);
}
@@ -1640,7 +1639,6 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic *ionic, unsigned int index
struct net_device *netdev;
struct ionic_lif *lif;
int tbl_sz;
- u32 coal;
int err;
netdev = alloc_etherdev_mqs(sizeof(*lif),
@@ -1671,8 +1669,9 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic *ionic, unsigned int index
lif->nrxq_descs = IONIC_DEF_TXRX_DESC;
/* Convert the default coalesce value to actual hw resolution */
- coal = ionic_coal_usec_to_hw(lif->ionic, IONIC_ITR_COAL_USEC_DEFAULT);
- lif->rx_coalesce_usecs = ionic_coal_hw_to_usec(lif->ionic, coal);
+ lif->rx_coalesce_usecs = IONIC_ITR_COAL_USEC_DEFAULT;
+ lif->rx_coalesce_hw = ionic_coal_hw_to_usec(lif->ionic,
+ lif->rx_coalesce_usecs);
snprintf(lif->name, sizeof(lif->name), "lif%u", index);
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
index b74f7e9ee82d..cf243a9d0168 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
@@ -175,7 +175,9 @@ struct ionic_lif {
unsigned long *dbid_inuse;
unsigned int dbid_count;
struct dentry *dentry;
- u32 rx_coalesce_usecs;
+ u32 rx_coalesce_usecs; /* what the user asked for */
+ u32 rx_coalesce_hw; /* what the hw is using */
+
u32 flags;
struct work_struct tx_timeout_work;
};
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 net-next 4/5] ionic: implement ethtool set-fec
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
` (2 preceding siblings ...)
2019-09-30 21:49 ` [PATCH v2 net-next 3/5] ionic: report users coalesce request Shannon Nelson
@ 2019-09-30 21:49 ` Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop Shannon Nelson
2019-09-30 23:48 ` [PATCH v2 net-next 0/5] ionic: driver updates David Miller
5 siblings, 0 replies; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
Wire up the --set-fec and --show-fec features in the ethtool
callbacks and pull the related code out of set_link_ksettings.
Signed-off-by: Shannon Nelson <snelson@pensando.io>
---
.../ethernet/pensando/ionic/ionic_ethtool.c | 94 +++++++++++++------
1 file changed, 67 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index 63cc14c060d6..f778fff034f5 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -254,12 +254,9 @@ static int ionic_set_link_ksettings(struct net_device *netdev,
struct ionic_lif *lif = netdev_priv(netdev);
struct ionic *ionic = lif->ionic;
struct ionic_dev *idev;
- u32 req_rs, req_fc;
- u8 fec_type;
int err = 0;
idev = &lif->ionic->idev;
- fec_type = IONIC_PORT_FEC_TYPE_NONE;
/* set autoneg */
if (ks->base.autoneg != idev->port_info->config.an_enable) {
@@ -281,29 +278,6 @@ static int ionic_set_link_ksettings(struct net_device *netdev,
return err;
}
- /* set FEC */
- req_rs = ethtool_link_ksettings_test_link_mode(ks, advertising, FEC_RS);
- req_fc = ethtool_link_ksettings_test_link_mode(ks, advertising, FEC_BASER);
- if (req_rs && req_fc) {
- netdev_info(netdev, "Only select one FEC mode at a time\n");
- return -EINVAL;
- } else if (req_fc) {
- fec_type = IONIC_PORT_FEC_TYPE_FC;
- } else if (req_rs) {
- fec_type = IONIC_PORT_FEC_TYPE_RS;
- } else if (!(req_rs | req_fc)) {
- fec_type = IONIC_PORT_FEC_TYPE_NONE;
- }
-
- if (fec_type != idev->port_info->config.fec_type) {
- mutex_lock(&ionic->dev_cmd_lock);
- ionic_dev_cmd_port_fec(idev, fec_type);
- err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
- mutex_unlock(&ionic->dev_cmd_lock);
- if (err)
- return err;
- }
-
return 0;
}
@@ -353,6 +327,70 @@ static int ionic_set_pauseparam(struct net_device *netdev,
return 0;
}
+static int ionic_get_fecparam(struct net_device *netdev,
+ struct ethtool_fecparam *fec)
+{
+ struct ionic_lif *lif = netdev_priv(netdev);
+
+ switch (lif->ionic->idev.port_info->config.fec_type) {
+ case IONIC_PORT_FEC_TYPE_NONE:
+ fec->active_fec = ETHTOOL_FEC_OFF;
+ break;
+ case IONIC_PORT_FEC_TYPE_RS:
+ fec->active_fec = ETHTOOL_FEC_RS;
+ break;
+ case IONIC_PORT_FEC_TYPE_FC:
+ fec->active_fec = ETHTOOL_FEC_BASER;
+ break;
+ }
+
+ fec->fec = ETHTOOL_FEC_OFF | ETHTOOL_FEC_RS | ETHTOOL_FEC_BASER;
+
+ return 0;
+}
+
+static int ionic_set_fecparam(struct net_device *netdev,
+ struct ethtool_fecparam *fec)
+{
+ struct ionic_lif *lif = netdev_priv(netdev);
+ u8 fec_type;
+ int ret = 0;
+
+ if (lif->ionic->idev.port_info->config.an_enable) {
+ netdev_err(netdev, "FEC request not allowed while autoneg is enabled\n");
+ return -EINVAL;
+ }
+
+ switch (fec->fec) {
+ case ETHTOOL_FEC_NONE:
+ fec_type = IONIC_PORT_FEC_TYPE_NONE;
+ break;
+ case ETHTOOL_FEC_OFF:
+ fec_type = IONIC_PORT_FEC_TYPE_NONE;
+ break;
+ case ETHTOOL_FEC_RS:
+ fec_type = IONIC_PORT_FEC_TYPE_RS;
+ break;
+ case ETHTOOL_FEC_BASER:
+ fec_type = IONIC_PORT_FEC_TYPE_FC;
+ break;
+ case ETHTOOL_FEC_AUTO:
+ default:
+ netdev_err(netdev, "FEC request 0x%04x not supported\n",
+ fec->fec);
+ return -EINVAL;
+ }
+
+ if (fec_type != lif->ionic->idev.port_info->config.fec_type) {
+ mutex_lock(&lif->ionic->dev_cmd_lock);
+ ionic_dev_cmd_port_fec(&lif->ionic->idev, fec_type);
+ ret = ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT);
+ mutex_unlock(&lif->ionic->dev_cmd_lock);
+ }
+
+ return ret;
+}
+
static int ionic_get_coalesce(struct net_device *netdev,
struct ethtool_coalesce *coalesce)
{
@@ -751,6 +789,7 @@ static const struct ethtool_ops ionic_ethtool_ops = {
.get_regs = ionic_get_regs,
.get_link = ethtool_op_get_link,
.get_link_ksettings = ionic_get_link_ksettings,
+ .set_link_ksettings = ionic_set_link_ksettings,
.get_coalesce = ionic_get_coalesce,
.set_coalesce = ionic_set_coalesce,
.get_ringparam = ionic_get_ringparam,
@@ -773,7 +812,8 @@ static const struct ethtool_ops ionic_ethtool_ops = {
.get_module_eeprom = ionic_get_module_eeprom,
.get_pauseparam = ionic_get_pauseparam,
.set_pauseparam = ionic_set_pauseparam,
- .set_link_ksettings = ionic_set_link_ksettings,
+ .get_fecparam = ionic_get_fecparam,
+ .set_fecparam = ionic_set_fecparam,
.nway_reset = ionic_nway_reset,
};
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
` (3 preceding siblings ...)
2019-09-30 21:49 ` [PATCH v2 net-next 4/5] ionic: implement ethtool set-fec Shannon Nelson
@ 2019-09-30 21:49 ` Shannon Nelson
2019-09-30 23:32 ` Jakub Kicinski
2019-09-30 23:48 ` [PATCH v2 net-next 0/5] ionic: driver updates David Miller
5 siblings, 1 reply; 11+ messages in thread
From: Shannon Nelson @ 2019-09-30 21:49 UTC (permalink / raw)
To: netdev, davem; +Cc: Shannon Nelson
Even though we've already turned off the queue activity with
the ionic_qcq_disable(), we need to wait for any device queues
that are processing packets to drain down before we try to
flush our packets and tear down the queues.
Signed-off-by: Shannon Nelson <snelson@pensando.io>
---
.../net/ethernet/pensando/ionic/ionic_lif.c | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index 372329389c84..fc4ab73bd608 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -242,6 +242,29 @@ static int ionic_qcq_disable(struct ionic_qcq *qcq)
return ionic_adminq_post_wait(lif, &ctx);
}
+static int ionic_lif_quiesce(struct ionic_lif *lif)
+{
+ int err;
+ struct device *dev = lif->ionic->dev;
+ struct ionic_admin_ctx ctx = {
+ .work = COMPLETION_INITIALIZER_ONSTACK(ctx.work),
+ .cmd.lif_setattr = {
+ .opcode = IONIC_CMD_LIF_SETATTR,
+ .attr = IONIC_LIF_ATTR_STATE,
+ .index = lif->index,
+ .state = IONIC_LIF_DISABLE
+ },
+ };
+
+ err = ionic_adminq_post_wait(lif, &ctx);
+ if (err) {
+ dev_err(dev, "failed to quiesce lif, error = %d\n", err);
+ return err;
+ }
+
+ return (0);
+}
+
static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq)
{
struct ionic_dev *idev = &lif->ionic->idev;
@@ -1589,6 +1612,7 @@ int ionic_stop(struct net_device *netdev)
netif_tx_disable(netdev);
ionic_txrx_disable(lif);
+ ionic_lif_quiesce(lif);
ionic_txrx_deinit(lif);
ionic_txrx_free(lif);
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info
2019-09-30 21:49 ` [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info Shannon Nelson
@ 2019-09-30 23:26 ` Jakub Kicinski
0 siblings, 0 replies; 11+ messages in thread
From: Jakub Kicinski @ 2019-09-30 23:26 UTC (permalink / raw)
To: Shannon Nelson; +Cc: netdev, davem
On Mon, 30 Sep 2019 14:49:16 -0700, Shannon Nelson wrote:
> There is no need for a goto in this bit of code.
>
> Fixes: fbfb8031533c9 ("ionic: Add hardware init and device commands")
IMHO the fixes tag is disputable here, since this doesn't even generate
a warning.
> Signed-off-by: Shannon Nelson <snelson@pensando.io>
> ---
> drivers/net/ethernet/pensando/ionic/ionic_devlink.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> index af1647afa4e8..6fb27dcc5787 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
> @@ -19,31 +19,30 @@ static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
>
> err = devlink_info_driver_name_put(req, IONIC_DRV_NAME);
> if (err)
> - goto info_out;
> + return err;
>
> err = devlink_info_version_running_put(req,
> DEVLINK_INFO_VERSION_GENERIC_FW,
> idev->dev_info.fw_version);
> if (err)
> - goto info_out;
> + return err;
>
> snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_type);
> err = devlink_info_version_fixed_put(req,
> DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
> buf);
> if (err)
> - goto info_out;
> + return err;
>
> snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_rev);
> err = devlink_info_version_fixed_put(req,
> DEVLINK_INFO_VERSION_GENERIC_ASIC_REV,
> buf);
> if (err)
> - goto info_out;
> + return err;
>
> err = devlink_info_serial_number_put(req, idev->dev_info.serial_num);
>
> -info_out:
> return err;
Perhaps return the result directly while at it? I'm pretty sure you'll
get a half-automated patch from someone soon if you don't do it ;)
> }
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code
2019-09-30 21:49 ` [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code Shannon Nelson
@ 2019-09-30 23:27 ` Jakub Kicinski
0 siblings, 0 replies; 11+ messages in thread
From: Jakub Kicinski @ 2019-09-30 23:27 UTC (permalink / raw)
To: Shannon Nelson; +Cc: netdev, davem
On Mon, 30 Sep 2019 14:49:17 -0700, Shannon Nelson wrote:
> Replace the open-coded ionic_wait_for_bit() with the
> kernel's wait_on_bit_lock().
>
> Fixes: beead698b1736 ("ionic: Add the basic NDO callbacks for netdev support")
Again, slightly strange to see the Fixes tag for code clean up
targeted at net-next, but perhaps my views on Fixes tag differs
from the general consensus 🤔
> Signed-off-by: Shannon Nelson <snelson@pensando.io>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop
2019-09-30 21:49 ` [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop Shannon Nelson
@ 2019-09-30 23:32 ` Jakub Kicinski
0 siblings, 0 replies; 11+ messages in thread
From: Jakub Kicinski @ 2019-09-30 23:32 UTC (permalink / raw)
To: Shannon Nelson; +Cc: netdev, davem
On Mon, 30 Sep 2019 14:49:20 -0700, Shannon Nelson wrote:
> Even though we've already turned off the queue activity with
> the ionic_qcq_disable(), we need to wait for any device queues
> that are processing packets to drain down before we try to
> flush our packets and tear down the queues.
>
> Signed-off-by: Shannon Nelson <snelson@pensando.io>
This one, in turn, seems like something that could cause
unpleasantness, and therefore Fixes: could be specified :)
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> index 372329389c84..fc4ab73bd608 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
> @@ -242,6 +242,29 @@ static int ionic_qcq_disable(struct ionic_qcq *qcq)
> return ionic_adminq_post_wait(lif, &ctx);
> }
>
> +static int ionic_lif_quiesce(struct ionic_lif *lif)
Possibly static void? As with most cleanup functions there isn't much
caller can do with the error..
> +{
> + int err;
reverse xmas tree
> + struct device *dev = lif->ionic->dev;
> + struct ionic_admin_ctx ctx = {
> + .work = COMPLETION_INITIALIZER_ONSTACK(ctx.work),
> + .cmd.lif_setattr = {
> + .opcode = IONIC_CMD_LIF_SETATTR,
> + .attr = IONIC_LIF_ATTR_STATE,
> + .index = lif->index,
> + .state = IONIC_LIF_DISABLE
> + },
> + };
> +
> + err = ionic_adminq_post_wait(lif, &ctx);
> + if (err) {
> + dev_err(dev, "failed to quiesce lif, error = %d\n", err);
> + return err;
> + }
> +
> + return (0);
no parens needed here
> +}
> +
> static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq)
> {
> struct ionic_dev *idev = &lif->ionic->idev;
> @@ -1589,6 +1612,7 @@ int ionic_stop(struct net_device *netdev)
> netif_tx_disable(netdev);
>
> ionic_txrx_disable(lif);
> + ionic_lif_quiesce(lif);
> ionic_txrx_deinit(lif);
> ionic_txrx_free(lif);
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 net-next 0/5] ionic: driver updates
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
` (4 preceding siblings ...)
2019-09-30 21:49 ` [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop Shannon Nelson
@ 2019-09-30 23:48 ` David Miller
2019-10-01 1:54 ` Shannon Nelson
5 siblings, 1 reply; 11+ messages in thread
From: David Miller @ 2019-09-30 23:48 UTC (permalink / raw)
To: snelson; +Cc: netdev
From: Shannon Nelson <snelson@pensando.io>
Date: Mon, 30 Sep 2019 14:49:15 -0700
> These patches are a few updates to clean up some code
> issues and add an ethtool feature.
>
> v2: add cover letter
> edit a couple of patch descriptions for clarity and add Fixes tags
I agree with Jakub that Fixes: tags for cleanups really doesn't fit the
character and usage of Fixes:.
Please address this and the rest of his feedback, thank you.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 net-next 0/5] ionic: driver updates
2019-09-30 23:48 ` [PATCH v2 net-next 0/5] ionic: driver updates David Miller
@ 2019-10-01 1:54 ` Shannon Nelson
0 siblings, 0 replies; 11+ messages in thread
From: Shannon Nelson @ 2019-10-01 1:54 UTC (permalink / raw)
To: David Miller; +Cc: netdev
On 9/30/19 4:48 PM, David Miller wrote:
> From: Shannon Nelson <snelson@pensando.io>
> Date: Mon, 30 Sep 2019 14:49:15 -0700
>
>> These patches are a few updates to clean up some code
>> issues and add an ethtool feature.
>>
>> v2: add cover letter
>> edit a couple of patch descriptions for clarity and add Fixes tags
> I agree with Jakub that Fixes: tags for cleanups really doesn't fit the
> character and usage of Fixes:.
>
> Please address this and the rest of his feedback, thank you.
Sure. I was on the edge on those Fixes tags as well, and only added
them in as a last minute thought, even tho' I was only aiming these at
net-next. I'll clean those up.
sln
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2019-10-01 1:54 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-09-30 21:49 [PATCH v2 net-next 0/5] ionic: driver updates Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 1/5] ionic: simplify returns in devlink info Shannon Nelson
2019-09-30 23:26 ` Jakub Kicinski
2019-09-30 21:49 ` [PATCH v2 net-next 2/5] ionic: use wait_on_bit_lock() rather than open code Shannon Nelson
2019-09-30 23:27 ` Jakub Kicinski
2019-09-30 21:49 ` [PATCH v2 net-next 3/5] ionic: report users coalesce request Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 4/5] ionic: implement ethtool set-fec Shannon Nelson
2019-09-30 21:49 ` [PATCH v2 net-next 5/5] ionic: add lif_quiesce to wait for queue activity to stop Shannon Nelson
2019-09-30 23:32 ` Jakub Kicinski
2019-09-30 23:48 ` [PATCH v2 net-next 0/5] ionic: driver updates David Miller
2019-10-01 1:54 ` Shannon Nelson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).