FILE
channels.c
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/en/channels.c
1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2/* Copyright (c) 2021, Mellanox Technologies inc. All rights reserved. */ 3 4#include "channels.h" 5#include "en.h" 6#include "en/dim.h" 7#include "en/ptp.h" 8 9unsigned int mlx5e_channels_get_num(struct mlx5e_channels *chs) 10{ 11 return chs->num; 12} 13 14static struct mlx5e_channel *mlx5e_channels_get(struct mlx5e_channels *chs, unsigned int ix) 15{ 16 WARN_ON_ONCE(ix >= mlx5e_channels_get_num(chs)); 17 return chs->c[ix]; 18} 19 20bool mlx5e_channels_is_xsk(struct mlx5e_channels *chs, unsigned int ix) 21{ 22 struct mlx5e_channel *c = mlx5e_channels_get(chs, ix); 23 24 return test_bit(MLX5E_CHANNEL_STATE_XSK, c->state); 25} 26 27void mlx5e_channels_get_regular_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn, 28 u32 *vhca_id) 29{ 30 struct mlx5e_channel *c = mlx5e_channels_get(chs, ix); 31 32 *rqn = c->rq.rqn; 33 if (vhca_id) 34 *vhca_id = MLX5_CAP_GEN(c->mdev, vhca_id); 35} 36 37void mlx5e_channels_get_xsk_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn, 38 u32 *vhca_id) 39{ 40 struct mlx5e_channel *c = mlx5e_channels_get(chs, ix); 41 42 WARN_ON_ONCE(!test_bit(MLX5E_CHANNEL_STATE_XSK, c->state)); 43 44 *rqn = c->xskrq.rqn; 45 if (vhca_id) 46 *vhca_id = MLX5_CAP_GEN(c->mdev, vhca_id); 47} 48 49bool mlx5e_channels_get_ptp_rqn(struct mlx5e_channels *chs, u32 *rqn) 50{ 51 struct mlx5e_ptp *c = chs->ptp; 52 53 if (!c || !test_bit(MLX5E_PTP_STATE_RX, c->state)) 54 return false; 55 56 *rqn = c->rq.rqn; 57 return true; 58} 59 60int mlx5e_channels_rx_change_dim(struct mlx5e_channels *chs, bool enable) 61{ 62 int i; 63 64 for (i = 0; i < chs->num; i++) { 65 int err = mlx5e_dim_rx_change(&chs->c[i]->rq, enable); 66 67 if (err) 68 return err; 69 } 70 71 return 0; 72} 73 74int mlx5e_channels_tx_change_dim(struct mlx5e_channels *chs, bool enable) 75{ 76 int i, tc; 77 78 for (i = 0; i < chs->num; i++) { 79 for (tc = 0; tc < mlx5e_get_dcb_num_tc(&chs->params); tc++) { 80 int err = mlx5e_dim_tx_change(&chs->c[i]->sq[tc], enable); 81 82 if (err) 83 return err; 84 } 85 } 86 87 return 0; 88} 89 90int mlx5e_channels_rx_toggle_dim(struct mlx5e_channels *chs) 91{ 92 int i; 93 94 for (i = 0; i < chs->num; i++) { 95 /* If dim is enabled for the channel, reset the dim state so the 96 * collected statistics will be reset. This is useful for 97 * supporting legacy interfaces that allow things like changing 98 * the CQ period mode for all channels without disturbing 99 * individual channel configurations. 100 */ 101 if (chs->c[i]->rq.dim) { 102 int err; 103 104 mlx5e_dim_rx_change(&chs->c[i]->rq, false); 105 err = mlx5e_dim_rx_change(&chs->c[i]->rq, true); 106 if (err) 107 return err; 108 } 109 } 110 111 return 0; 112} 113 114int mlx5e_channels_tx_toggle_dim(struct mlx5e_channels *chs) 115{ 116 int i, tc; 117 118 for (i = 0; i < chs->num; i++) { 119 for (tc = 0; tc < mlx5e_get_dcb_num_tc(&chs->params); tc++) { 120 int err; 121 122 /* If dim is enabled for the channel, reset the dim 123 * state so the collected statistics will be reset. This 124 * is useful for supporting legacy interfaces that allow 125 * things like changing the CQ period mode for all 126 * channels without disturbing individual channel 127 * configurations. 128 */ 129 if (!chs->c[i]->sq[tc].dim) 130 continue; 131 132 mlx5e_dim_tx_change(&chs->c[i]->sq[tc], false); 133 err = mlx5e_dim_tx_change(&chs->c[i]->sq[tc], true); 134 if (err) 135 return err; 136 } 137 } 138 139 return 0; 140}
~/
Read-only file preview.