Skip to content

Commit 3a3e627

Browse files
jpirkodavem330
authored andcommitted
spectrum: Add a delayed work to update SPAN buffsize according to speed
When PUDE event is handled and the link is up, update the port SPAN buffer size according to the current speed. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ff9fdfe commit 3a3e627

File tree

4 files changed

+24
-0
lines changed

4 files changed

+24
-0
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3908,6 +3908,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
39083908

39093909
INIT_DELAYED_WORK(&mlxsw_sp_port->ptp.shaper_dw,
39103910
mlxsw_sp->ptp_ops->shaper_work);
3911+
INIT_DELAYED_WORK(&mlxsw_sp_port->span.speed_update_dw,
3912+
mlxsw_sp_span_speed_update_work);
39113913

39123914
mlxsw_sp->ports[local_port] = mlxsw_sp_port;
39133915
err = register_netdev(dev);
@@ -3964,6 +3966,7 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
39643966
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp->ports[local_port];
39653967

39663968
cancel_delayed_work_sync(&mlxsw_sp_port->periodic_hw_stats.update_dw);
3969+
cancel_delayed_work_sync(&mlxsw_sp_port->span.speed_update_dw);
39673970
cancel_delayed_work_sync(&mlxsw_sp_port->ptp.shaper_dw);
39683971
mlxsw_sp_port_ptp_clear(mlxsw_sp_port);
39693972
mlxsw_core_port_clear(mlxsw_sp->core, local_port, mlxsw_sp);
@@ -4371,6 +4374,7 @@ static void mlxsw_sp_pude_event_func(const struct mlxsw_reg_info *reg,
43714374
netdev_info(mlxsw_sp_port->dev, "link up\n");
43724375
netif_carrier_on(mlxsw_sp_port->dev);
43734376
mlxsw_core_schedule_dw(&mlxsw_sp_port->ptp.shaper_dw, 0);
4377+
mlxsw_core_schedule_dw(&mlxsw_sp_port->span.speed_update_dw, 0);
43744378
} else {
43754379
netdev_info(mlxsw_sp_port->dev, "link down\n");
43764380
netif_carrier_off(mlxsw_sp_port->dev);

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@ struct mlxsw_sp_port {
294294
struct mlxsw_sp_ptp_port_stats stats;
295295
} ptp;
296296
u8 split_base_local_port;
297+
struct {
298+
struct delayed_work speed_update_dw;
299+
} span;
297300
};
298301

299302
struct mlxsw_sp_port_type_speed_ops {

drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,22 @@ int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu)
778778
return 0;
779779
}
780780

781+
void mlxsw_sp_span_speed_update_work(struct work_struct *work)
782+
{
783+
struct delayed_work *dwork = to_delayed_work(work);
784+
struct mlxsw_sp_port *mlxsw_sp_port;
785+
786+
mlxsw_sp_port = container_of(dwork, struct mlxsw_sp_port,
787+
span.speed_update_dw);
788+
789+
/* If port is egress mirrored, the shared buffer size should be
790+
* updated according to the speed value.
791+
*/
792+
if (mlxsw_sp_span_is_egress_mirror(mlxsw_sp_port))
793+
mlxsw_sp_span_port_buffsize_update(mlxsw_sp_port,
794+
mlxsw_sp_port->dev->mtu);
795+
}
796+
781797
static struct mlxsw_sp_span_inspected_port *
782798
mlxsw_sp_span_entry_bound_port_find(struct mlxsw_sp_span_entry *span_entry,
783799
enum mlxsw_sp_span_type type,

drivers/net/ethernet/mellanox/mlxsw/spectrum_span.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
7474
struct mlxsw_sp_span_entry *span_entry);
7575

7676
int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu);
77+
void mlxsw_sp_span_speed_update_work(struct work_struct *work);
7778

7879
#endif

0 commit comments

Comments
 (0)