diff --git a/drivers/net/ub/unic/unic_ethtool.c b/drivers/net/ub/unic/unic_ethtool.c index 337d77b16ff42d534d5ed8427292e06808844ed3..c027989ac8e8be04361c65347f42b8dae4dc7b93 100644 --- a/drivers/net/ub/unic/unic_ethtool.c +++ b/drivers/net/ub/unic/unic_ethtool.c @@ -430,28 +430,32 @@ static int unic_backup_stats(struct unic_dev *unic_dev, struct unic_sq_stats **sq_stats, struct unic_rq_stats **rq_stats) { + struct unic_sq_stats *tx_stats; + struct unic_rq_stats *rx_stats; u32 i; - *sq_stats = kcalloc(unic_dev->channels.num, sizeof(**sq_stats), - GFP_KERNEL); - if (ZERO_OR_NULL_PTR(*sq_stats)) + tx_stats = kcalloc(unic_dev->channels.num, sizeof(*tx_stats), + GFP_KERNEL); + if (!tx_stats) return -ENOMEM; - *rq_stats = kcalloc(unic_dev->channels.num, sizeof(**rq_stats), - GFP_KERNEL); - if (ZERO_OR_NULL_PTR(*rq_stats)) { - if (unic_tx_changed(unic_dev)) - kfree(*sq_stats); + rx_stats = kcalloc(unic_dev->channels.num, sizeof(*rx_stats), + GFP_KERNEL); + if (!rx_stats) { + kfree(tx_stats); return -ENOMEM; } for (i = 0; i < unic_dev->channels.num; i++) { - memcpy(sq_stats[i], &unic_dev->channels.c[i].sq->stats, + memcpy(&tx_stats[i], &unic_dev->channels.c[i].sq->stats, sizeof(struct unic_sq_stats)); - memcpy(rq_stats[i], &unic_dev->channels.c[i].rq->stats, + memcpy(&rx_stats[i], &unic_dev->channels.c[i].rq->stats, sizeof(struct unic_rq_stats)); } + *sq_stats = tx_stats; + *rq_stats = rx_stats; + return 0; } diff --git a/drivers/ub/ubase/ubase_cmd.c b/drivers/ub/ubase/ubase_cmd.c index ab554343136f84b47e9c53ec23261425b3d7018e..47695e5c7ef7157a09f874d94723c2a0b77d12f3 100644 --- a/drivers/ub/ubase/ubase_cmd.c +++ b/drivers/ub/ubase/ubase_cmd.c @@ -666,31 +666,6 @@ static bool ubase_cmd_is_mbx_avail(struct ubase_dev *udev) return true; } -int ubase_cmd_mbx_event_cb(struct notifier_block *nb, - unsigned long action, void *data) -{ - struct ubase_event_nb *ev_nb = container_of(nb, struct ubase_event_nb, nb); - struct ubase_aeq_notify_info *info = data; - struct ubase_aeqe *aeqe = info->aeqe; - struct ubase_dev *udev = ev_nb->back; - struct ubase_mbx_event_context *ctx; - - ctx = &udev->mb_cmd.ctx; - if (aeqe->event.cmd.seq_num != ctx->seq_num) { - ubase_err(udev, - "mbx seq num is different, cmd seq_num = %u, ctx seq_num = %u.\n", - aeqe->event.cmd.seq_num, ctx->seq_num); - return NOTIFY_DONE; - } - - ctx->result = aeqe->event.cmd.status == 0 ? 0 : -EIO; - ctx->out_param = aeqe->event.cmd.out_param; - - complete(&ctx->done); - - return NOTIFY_OK; -} - static int ubase_cmd_wait_mbx_completed(struct ubase_dev *udev, union ubase_mbox *mbx) { diff --git a/drivers/ub/ubase/ubase_cmd.h b/drivers/ub/ubase/ubase_cmd.h index d6f2def22117340c57ea84811b049647abf1e8b0..c31c334d0a3f483e4378fe512618cefe267e6adf 100644 --- a/drivers/ub/ubase/ubase_cmd.h +++ b/drivers/ub/ubase/ubase_cmd.h @@ -14,7 +14,7 @@ #define UBASE_CMDQ_DESC_NUM_S 3 #define UBASE_CMDQ_DESC_NUM 1024 #define UBASE_CMDQ_TX_TIMEOUT 300000 -#define UBASE_CMDQ_MBX_TX_TIMEOUT 500 +#define UBASE_CMDQ_MBX_TX_TIMEOUT 50 #define UBASE_CMDQ_CLEAR_WAIT_TIME 200 #define UBASE_CMDQ_WAIT_TIME 10 @@ -311,9 +311,6 @@ int __ubase_cmd_send_in(struct ubase_dev *udev, struct ubase_cmd_buf *in); int __ubase_cmd_send_inout(struct ubase_dev *udev, struct ubase_cmd_buf *in, struct ubase_cmd_buf *out); -int ubase_cmd_mbx_event_cb(struct notifier_block *nb, unsigned long action, - void *data); - int __ubase_register_crq_event(struct ubase_dev *udev, struct ubase_crq_event_nb *nb); void __ubase_unregister_crq_event(struct ubase_dev *udev, u16 opcode); diff --git a/drivers/ub/ubase/ubase_eq.c b/drivers/ub/ubase/ubase_eq.c index 2afe9c3bf7fc3c8b7915c9f29bfbd6ab3ca3dc73..ff2a2e3ea72155c3facb04a5b59f8102ad06a29c 100644 --- a/drivers/ub/ubase/ubase_eq.c +++ b/drivers/ub/ubase/ubase_eq.c @@ -402,6 +402,19 @@ static void ubase_init_aeq_work(struct ubase_dev *udev, struct ubase_aeqe *aeqe) queue_work(udev->ubase_async_wq, &aeq_work->work); } +static void ubase_mbx_complete(struct ubase_dev *udev, struct ubase_aeqe *aeqe) +{ + struct ubase_mbx_event_context *ctx = &udev->mb_cmd.ctx; + + if (aeqe->event.cmd.seq_num != ctx->seq_num) + return; + + ctx->result = aeqe->event.cmd.status == 0 ? 0 : -EIO; + ctx->out_param = aeqe->event.cmd.out_param; + + complete(&ctx->done); +} + static int ubase_async_event_handler(struct ubase_dev *udev) { struct ubase_aeq *aeq = &udev->irq_table.aeq; @@ -415,14 +428,12 @@ static int ubase_async_event_handler(struct ubase_dev *udev) trace_ubase_aeqe(udev->dev, aeqe, eq); - ubase_dbg(udev, - "event_type = 0x%x, sub_type = 0x%x, owner = %u, seq_num = %u, cons_index = %u.\n", - aeqe->event_type, aeqe->sub_type, aeqe->owner, - aeqe->event.cmd.seq_num, eq->cons_index); - ret = IRQ_HANDLED; - ubase_init_aeq_work(udev, aeqe); + if (aeqe->event_type == UBASE_EVENT_TYPE_MB) + ubase_mbx_complete(udev, aeqe); + else + ubase_init_aeq_work(udev, aeqe); ++aeq->eq.cons_index; aeqe = ubase_next_aeqe(udev, aeq); @@ -1170,11 +1181,6 @@ int ubase_register_ae_event(struct ubase_dev *udev) { struct ubase_event_nb ubase_ae_nbs[UBASE_AE_LEVEL_NUM] = { { - UBASE_DRV_UNIC, - UBASE_EVENT_TYPE_MB, - { ubase_cmd_mbx_event_cb }, - udev - }, { UBASE_DRV_UNIC, UBASE_EVENT_TYPE_TP_FLUSH_DONE, { ubase_ae_tp_flush_done }, diff --git a/drivers/ub/ubase/ubase_eq.h b/drivers/ub/ubase/ubase_eq.h index 59fa2c620720ea97e97ff9fa0ba58eb0572b249c..18d18f026f0c60df97fa75a6ed60f2968908367a 100644 --- a/drivers/ub/ubase/ubase_eq.h +++ b/drivers/ub/ubase/ubase_eq.h @@ -34,7 +34,7 @@ #define UBASE_INT_NAME_LEN 32 -#define UBASE_AE_LEVEL_NUM 4 +#define UBASE_AE_LEVEL_NUM 3 /* Vector0 interrupt CMDQ event source register(RW) */ #define UBASE_VECTOR0_CMDQ_SRC_REG 0x18004