diff options
Diffstat (limited to 'drivers/net/ethernet/pensando/ionic/ionic_main.c')
| -rw-r--r-- | drivers/net/ethernet/pensando/ionic/ionic_main.c | 43 | 
1 files changed, 30 insertions, 13 deletions
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c index fbc57de6683e..61cfe2120817 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_main.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c @@ -148,6 +148,8 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)  		return "IONIC_CMD_LIF_SETATTR";  	case IONIC_CMD_LIF_GETATTR:  		return "IONIC_CMD_LIF_GETATTR"; +	case IONIC_CMD_LIF_SETPHC: +		return "IONIC_CMD_LIF_SETPHC";  	case IONIC_CMD_RX_MODE_SET:  		return "IONIC_CMD_RX_MODE_SET";  	case IONIC_CMD_RX_FILTER_ADD: @@ -187,10 +189,17 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)  static void ionic_adminq_flush(struct ionic_lif *lif)  { -	struct ionic_queue *q = &lif->adminqcq->q;  	struct ionic_desc_info *desc_info; +	unsigned long irqflags; +	struct ionic_queue *q; -	spin_lock(&lif->adminq_lock); +	spin_lock_irqsave(&lif->adminq_lock, irqflags); +	if (!lif->adminqcq) { +		spin_unlock_irqrestore(&lif->adminq_lock, irqflags); +		return; +	} + +	q = &lif->adminqcq->q;  	while (q->tail_idx != q->head_idx) {  		desc_info = &q->info[q->tail_idx]; @@ -199,7 +208,7 @@ static void ionic_adminq_flush(struct ionic_lif *lif)  		desc_info->cb_arg = NULL;  		q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);  	} -	spin_unlock(&lif->adminq_lock); +	spin_unlock_irqrestore(&lif->adminq_lock, irqflags);  }  static int ionic_adminq_check_err(struct ionic_lif *lif, @@ -234,35 +243,36 @@ static void ionic_adminq_cb(struct ionic_queue *q,  {  	struct ionic_admin_ctx *ctx = cb_arg;  	struct ionic_admin_comp *comp; -	struct device *dev;  	if (!ctx)  		return;  	comp = cq_info->cq_desc; -	dev = &q->lif->netdev->dev;  	memcpy(&ctx->comp, comp, sizeof(*comp)); -	dev_dbg(dev, "comp admin queue command:\n"); +	dev_dbg(q->dev, "comp admin queue command:\n");  	dynamic_hex_dump("comp ", DUMP_PREFIX_OFFSET, 16, 1,  			 &ctx->comp, sizeof(ctx->comp), true);  	complete_all(&ctx->work);  } -static 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)  {  	struct ionic_desc_info *desc_info; +	unsigned long irqflags;  	struct ionic_queue *q;  	int err = 0; -	if (!lif->adminqcq) +	spin_lock_irqsave(&lif->adminq_lock, irqflags); +	if (!lif->adminqcq) { +		spin_unlock_irqrestore(&lif->adminq_lock, irqflags);  		return -EIO; +	}  	q = &lif->adminqcq->q; -	spin_lock(&lif->adminq_lock);  	if (!ionic_q_has_space(q, 1)) {  		err = -ENOSPC;  		goto err_out; @@ -282,19 +292,17 @@ static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)  	ionic_q_post(q, true, ionic_adminq_cb, ctx);  err_out: -	spin_unlock(&lif->adminq_lock); +	spin_unlock_irqrestore(&lif->adminq_lock, irqflags);  	return err;  } -int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) +int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx, int err)  {  	struct net_device *netdev = lif->netdev;  	unsigned long remaining;  	const char *name; -	int err; -	err = ionic_adminq_post(lif, ctx);  	if (err) {  		if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) {  			name = ionic_opcode_to_str(ctx->cmd.cmd.opcode); @@ -309,6 +317,15 @@ int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)  	return ionic_adminq_check_err(lif, ctx, (remaining == 0));  } +int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) +{ +	int err; + +	err = ionic_adminq_post(lif, ctx); + +	return ionic_adminq_wait(lif, ctx, err); +} +  static void ionic_dev_cmd_clean(struct ionic *ionic)  {  	union __iomem ionic_dev_cmd_regs *regs = ionic->idev.dev_cmd_regs; | 
