Commit 8c9d956a authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

ionic: allow adminq requests to override default error message

The AdminQ handler has an error handler that automatically prints
an error message when the request has failed.  However, there are
situations where the caller can expect that it might fail and has
an alternative strategy, thus may not want the error message sent
to the log, such as hitting -ENOSPC when adding a new vlan id.

We add a new interface to the AdminQ API to allow for override of
the default behavior, and an interface to the use standard error
message formatting.
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9b0b6ba6
...@@ -70,8 +70,13 @@ struct ionic_admin_ctx { ...@@ -70,8 +70,13 @@ struct ionic_admin_ctx {
}; };
int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx); int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx);
int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int err); int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx,
const int err, const bool do_msg);
int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx); int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx);
int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx);
void ionic_adminq_netdev_err_print(struct ionic_lif *lif, u8 opcode,
u8 status, int err);
int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_wait); int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_wait);
int ionic_set_dma_mask(struct ionic *ionic); int ionic_set_dma_mask(struct ionic *ionic);
int ionic_setup(struct ionic *ionic); int ionic_setup(struct ionic *ionic);
......
...@@ -212,24 +212,28 @@ static void ionic_adminq_flush(struct ionic_lif *lif) ...@@ -212,24 +212,28 @@ static void ionic_adminq_flush(struct ionic_lif *lif)
spin_unlock_irqrestore(&lif->adminq_lock, irqflags); spin_unlock_irqrestore(&lif->adminq_lock, irqflags);
} }
void ionic_adminq_netdev_err_print(struct ionic_lif *lif, u8 opcode,
u8 status, int err)
{
netdev_err(lif->netdev, "%s (%d) failed: %s (%d)\n",
ionic_opcode_to_str(opcode), opcode,
ionic_error_to_str(status), err);
}
static int ionic_adminq_check_err(struct ionic_lif *lif, static int ionic_adminq_check_err(struct ionic_lif *lif,
struct ionic_admin_ctx *ctx, struct ionic_admin_ctx *ctx,
bool timeout) const bool timeout,
const bool do_msg)
{ {
struct net_device *netdev = lif->netdev;
const char *opcode_str;
const char *status_str;
int err = 0; int err = 0;
if (ctx->comp.comp.status || timeout) { if (ctx->comp.comp.status || timeout) {
opcode_str = ionic_opcode_to_str(ctx->cmd.cmd.opcode);
status_str = ionic_error_to_str(ctx->comp.comp.status);
err = timeout ? -ETIMEDOUT : err = timeout ? -ETIMEDOUT :
ionic_error_to_errno(ctx->comp.comp.status); ionic_error_to_errno(ctx->comp.comp.status);
netdev_err(netdev, "%s (%d) failed: %s (%d)\n", if (do_msg)
opcode_str, ctx->cmd.cmd.opcode, ionic_adminq_netdev_err_print(lif, ctx->cmd.cmd.opcode,
timeout ? "TIMEOUT" : status_str, err); ctx->comp.comp.status, err);
if (timeout) if (timeout)
ionic_adminq_flush(lif); ionic_adminq_flush(lif);
...@@ -298,7 +302,8 @@ int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) ...@@ -298,7 +302,8 @@ int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
return err; return err;
} }
int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int err) int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx,
const int err, const bool do_msg)
{ {
struct net_device *netdev = lif->netdev; struct net_device *netdev = lif->netdev;
unsigned long time_limit; unsigned long time_limit;
...@@ -310,7 +315,7 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er ...@@ -310,7 +315,7 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er
name = ionic_opcode_to_str(ctx->cmd.cmd.opcode); name = ionic_opcode_to_str(ctx->cmd.cmd.opcode);
if (err) { if (err) {
if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) if (do_msg && !test_bit(IONIC_LIF_F_FW_RESET, lif->state))
netdev_err(netdev, "Posting of %s (%d) failed: %d\n", netdev_err(netdev, "Posting of %s (%d) failed: %d\n",
name, ctx->cmd.cmd.opcode, err); name, ctx->cmd.cmd.opcode, err);
return err; return err;
...@@ -328,8 +333,9 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er ...@@ -328,8 +333,9 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er
/* interrupt the wait if FW stopped */ /* interrupt the wait if FW stopped */
if (test_bit(IONIC_LIF_F_FW_RESET, lif->state)) { if (test_bit(IONIC_LIF_F_FW_RESET, lif->state)) {
netdev_err(netdev, "%s (%d) interrupted, FW in reset\n", if (do_msg)
name, ctx->cmd.cmd.opcode); netdev_err(netdev, "%s (%d) interrupted, FW in reset\n",
name, ctx->cmd.cmd.opcode);
return -ENXIO; return -ENXIO;
} }
...@@ -339,7 +345,9 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er ...@@ -339,7 +345,9 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int er
dev_dbg(lif->ionic->dev, "%s: elapsed %d msecs\n", dev_dbg(lif->ionic->dev, "%s: elapsed %d msecs\n",
__func__, jiffies_to_msecs(time_done - time_start)); __func__, jiffies_to_msecs(time_done - time_start));
return ionic_adminq_check_err(lif, ctx, time_after_eq(time_done, time_limit)); return ionic_adminq_check_err(lif, ctx,
time_after_eq(time_done, time_limit),
do_msg);
} }
int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
...@@ -348,7 +356,16 @@ int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) ...@@ -348,7 +356,16 @@ int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
err = ionic_adminq_post(lif, ctx); err = ionic_adminq_post(lif, ctx);
return ionic_adminq_wait(lif, ctx, err); return ionic_adminq_wait(lif, ctx, err, true);
}
int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
{
int err;
err = ionic_adminq_post(lif, ctx);
return ionic_adminq_wait(lif, ctx, err, false);
} }
static void ionic_dev_cmd_clean(struct ionic *ionic) static void ionic_dev_cmd_clean(struct ionic *ionic)
......
...@@ -348,7 +348,7 @@ static int ionic_phc_adjfine(struct ptp_clock_info *info, long scaled_ppm) ...@@ -348,7 +348,7 @@ static int ionic_phc_adjfine(struct ptp_clock_info *info, long scaled_ppm)
spin_unlock_irqrestore(&phc->lock, irqflags); spin_unlock_irqrestore(&phc->lock, irqflags);
return ionic_adminq_wait(phc->lif, &ctx, err); return ionic_adminq_wait(phc->lif, &ctx, err, true);
} }
static int ionic_phc_adjtime(struct ptp_clock_info *info, s64 delta) static int ionic_phc_adjtime(struct ptp_clock_info *info, s64 delta)
...@@ -373,7 +373,7 @@ static int ionic_phc_adjtime(struct ptp_clock_info *info, s64 delta) ...@@ -373,7 +373,7 @@ static int ionic_phc_adjtime(struct ptp_clock_info *info, s64 delta)
spin_unlock_irqrestore(&phc->lock, irqflags); spin_unlock_irqrestore(&phc->lock, irqflags);
return ionic_adminq_wait(phc->lif, &ctx, err); return ionic_adminq_wait(phc->lif, &ctx, err, true);
} }
static int ionic_phc_settime64(struct ptp_clock_info *info, static int ionic_phc_settime64(struct ptp_clock_info *info,
...@@ -402,7 +402,7 @@ static int ionic_phc_settime64(struct ptp_clock_info *info, ...@@ -402,7 +402,7 @@ static int ionic_phc_settime64(struct ptp_clock_info *info,
spin_unlock_irqrestore(&phc->lock, irqflags); spin_unlock_irqrestore(&phc->lock, irqflags);
return ionic_adminq_wait(phc->lif, &ctx, err); return ionic_adminq_wait(phc->lif, &ctx, err, true);
} }
static int ionic_phc_gettimex64(struct ptp_clock_info *info, static int ionic_phc_gettimex64(struct ptp_clock_info *info,
...@@ -459,7 +459,7 @@ static long ionic_phc_aux_work(struct ptp_clock_info *info) ...@@ -459,7 +459,7 @@ static long ionic_phc_aux_work(struct ptp_clock_info *info)
spin_unlock_irqrestore(&phc->lock, irqflags); spin_unlock_irqrestore(&phc->lock, irqflags);
ionic_adminq_wait(phc->lif, &ctx, err); ionic_adminq_wait(phc->lif, &ctx, err, true);
return phc->aux_work_delay; return phc->aux_work_delay;
} }
......
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