diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 9d5e7cf288be..f3315bc874ad 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
| @@ -96,6 +96,7 @@ struct mlxsw_core { | |||
| 96 | const struct mlxsw_bus *bus; | 96 | const struct mlxsw_bus *bus; |
| 97 | void *bus_priv; | 97 | void *bus_priv; |
| 98 | const struct mlxsw_bus_info *bus_info; | 98 | const struct mlxsw_bus_info *bus_info; |
| 99 | struct workqueue_struct *emad_wq; | ||
| 99 | struct list_head rx_listener_list; | 100 | struct list_head rx_listener_list; |
| 100 | struct list_head event_listener_list; | 101 | struct list_head event_listener_list; |
| 101 | struct { | 102 | struct { |
| @@ -465,7 +466,7 @@ static void mlxsw_emad_trans_timeout_schedule(struct mlxsw_reg_trans *trans) | |||
| 465 | { | 466 | { |
| 466 | unsigned long timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS); | 467 | unsigned long timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS); |
| 467 | 468 | ||
| 468 | mlxsw_core_schedule_dw(&trans->timeout_dw, timeout); | 469 | queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw, timeout); |
| 469 | } | 470 | } |
| 470 | 471 | ||
| 471 | static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core, | 472 | static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core, |
| @@ -587,12 +588,18 @@ static const struct mlxsw_listener mlxsw_emad_rx_listener = | |||
| 587 | 588 | ||
| 588 | static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core) | 589 | static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core) |
| 589 | { | 590 | { |
| 591 | struct workqueue_struct *emad_wq; | ||
| 590 | u64 tid; | 592 | u64 tid; |
| 591 | int err; | 593 | int err; |
| 592 | 594 | ||
| 593 | if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX)) | 595 | if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX)) |
| 594 | return 0; | 596 | return 0; |
| 595 | 597 | ||
| 598 | emad_wq = alloc_workqueue("mlxsw_core_emad", WQ_MEM_RECLAIM, 0); | ||
| 599 | if (!emad_wq) | ||
| 600 | return -ENOMEM; | ||
| 601 | mlxsw_core->emad_wq = emad_wq; | ||
| 602 | |||
| 596 | /* Set the upper 32 bits of the transaction ID field to a random | 603 | /* Set the upper 32 bits of the transaction ID field to a random |
| 597 | * number. This allows us to discard EMADs addressed to other | 604 | * number. This allows us to discard EMADs addressed to other |
| 598 | * devices. | 605 | * devices. |
| @@ -619,6 +626,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core) | |||
| 619 | err_emad_trap_set: | 626 | err_emad_trap_set: |
| 620 | mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener, | 627 | mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener, |
| 621 | mlxsw_core); | 628 | mlxsw_core); |
| 629 | destroy_workqueue(mlxsw_core->emad_wq); | ||
| 622 | return err; | 630 | return err; |
| 623 | } | 631 | } |
| 624 | 632 | ||
| @@ -631,6 +639,7 @@ static void mlxsw_emad_fini(struct mlxsw_core *mlxsw_core) | |||
| 631 | mlxsw_core->emad.use_emad = false; | 639 | mlxsw_core->emad.use_emad = false; |
| 632 | mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener, | 640 | mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener, |
| 633 | mlxsw_core); | 641 | mlxsw_core); |
| 642 | destroy_workqueue(mlxsw_core->emad_wq); | ||
| 634 | } | 643 | } |
| 635 | 644 | ||
| 636 | static struct sk_buff *mlxsw_emad_alloc(const struct mlxsw_core *mlxsw_core, | 645 | static struct sk_buff *mlxsw_emad_alloc(const struct mlxsw_core *mlxsw_core, |
