@@ -154,6 +154,7 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
154154 [26 ] = "Port ETS Scheduler support" ,
155155 [27 ] = "Port beacon support" ,
156156 [28 ] = "RX-ALL support" ,
157+ [29 ] = "802.1ad offload support" ,
157158 };
158159 int i ;
159160
@@ -307,6 +308,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
307308
308309#define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80
309310#define QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS (1 << 31)
311+ #define QUERY_FUNC_CAP_PHV_BIT 0x40
310312
311313 if (vhcr -> op_modifier == 1 ) {
312314 struct mlx4_active_ports actv_ports =
@@ -351,6 +353,12 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
351353 MLX4_PUT (outbox -> buf , dev -> caps .phys_port_id [vhcr -> in_modifier ],
352354 QUERY_FUNC_CAP_PHYS_PORT_ID );
353355
356+ if (dev -> caps .phv_bit [port ]) {
357+ field = QUERY_FUNC_CAP_PHV_BIT ;
358+ MLX4_PUT (outbox -> buf , field ,
359+ QUERY_FUNC_CAP_FLAGS0_OFFSET );
360+ }
361+
354362 } else if (vhcr -> op_modifier == 0 ) {
355363 struct mlx4_active_ports actv_ports =
356364 mlx4_get_active_ports (dev , slave );
@@ -600,6 +608,9 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u8 gen_or_port,
600608 MLX4_GET (func_cap -> phys_port_id , outbox ,
601609 QUERY_FUNC_CAP_PHYS_PORT_ID );
602610
611+ MLX4_GET (field , outbox , QUERY_FUNC_CAP_FLAGS0_OFFSET );
612+ func_cap -> flags |= (field & QUERY_FUNC_CAP_PHV_BIT );
613+
603614 /* All other resources are allocated by the master, but we still report
604615 * 'num' and 'reserved' capabilities as follows:
605616 * - num remains the maximum resource index
@@ -700,6 +711,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
700711#define QUERY_DEV_CAP_D_MPT_ENTRY_SZ_OFFSET 0x92
701712#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94
702713#define QUERY_DEV_CAP_CONFIG_DEV_OFFSET 0x94
714+ #define QUERY_DEV_CAP_PHV_EN_OFFSET 0x96
703715#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
704716#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
705717#define QUERY_DEV_CAP_ETH_BACKPL_OFFSET 0x9c
@@ -898,6 +910,12 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
898910 dev_cap -> flags2 |= MLX4_DEV_CAP_FLAG2_CONFIG_DEV ;
899911 if (field & (1 << 2 ))
900912 dev_cap -> flags2 |= MLX4_DEV_CAP_FLAG2_IGNORE_FCS ;
913+ MLX4_GET (field , outbox , QUERY_DEV_CAP_PHV_EN_OFFSET );
914+ if (field & 0x80 )
915+ dev_cap -> flags2 |= MLX4_DEV_CAP_FLAG2_PHV_EN ;
916+ if (field & 0x40 )
917+ dev_cap -> flags2 |= MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN ;
918+
901919 MLX4_GET (dev_cap -> reserved_lkey , outbox ,
902920 QUERY_DEV_CAP_RSVD_LKEY_OFFSET );
903921 MLX4_GET (field32 , outbox , QUERY_DEV_CAP_ETH_BACKPL_OFFSET );
@@ -1992,6 +2010,10 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
19922010 MLX4_GET (param -> uar_page_sz , outbox , INIT_HCA_UAR_PAGE_SZ_OFFSET );
19932011 MLX4_GET (param -> log_uar_sz , outbox , INIT_HCA_LOG_UAR_SZ_OFFSET );
19942012
2013+ /* phv_check enable */
2014+ MLX4_GET (byte_field , outbox , INIT_HCA_CACHELINE_SZ_OFFSET );
2015+ if (byte_field & 0x2 )
2016+ param -> phv_check_en = 1 ;
19952017out :
19962018 mlx4_free_cmd_mailbox (dev , mailbox );
19972019
@@ -2758,3 +2780,63 @@ int mlx4_ACCESS_REG_wrapper(struct mlx4_dev *dev, int slave,
27582780 0 , MLX4_CMD_ACCESS_REG , MLX4_CMD_TIME_CLASS_C ,
27592781 MLX4_CMD_NATIVE );
27602782}
2783+
2784+ static int mlx4_SET_PORT_phv_bit (struct mlx4_dev * dev , u8 port , u8 phv_bit )
2785+ {
2786+ #define SET_PORT_GEN_PHV_VALID 0x10
2787+ #define SET_PORT_GEN_PHV_EN 0x80
2788+
2789+ struct mlx4_cmd_mailbox * mailbox ;
2790+ struct mlx4_set_port_general_context * context ;
2791+ u32 in_mod ;
2792+ int err ;
2793+
2794+ mailbox = mlx4_alloc_cmd_mailbox (dev );
2795+ if (IS_ERR (mailbox ))
2796+ return PTR_ERR (mailbox );
2797+ context = mailbox -> buf ;
2798+
2799+ context -> v_ignore_fcs |= SET_PORT_GEN_PHV_VALID ;
2800+ if (phv_bit )
2801+ context -> phv_en |= SET_PORT_GEN_PHV_EN ;
2802+
2803+ in_mod = MLX4_SET_PORT_GENERAL << 8 | port ;
2804+ err = mlx4_cmd (dev , mailbox -> dma , in_mod , MLX4_SET_PORT_ETH_OPCODE ,
2805+ MLX4_CMD_SET_PORT , MLX4_CMD_TIME_CLASS_B ,
2806+ MLX4_CMD_NATIVE );
2807+
2808+ mlx4_free_cmd_mailbox (dev , mailbox );
2809+ return err ;
2810+ }
2811+
2812+ int get_phv_bit (struct mlx4_dev * dev , u8 port , int * phv )
2813+ {
2814+ int err ;
2815+ struct mlx4_func_cap func_cap ;
2816+
2817+ memset (& func_cap , 0 , sizeof (func_cap ));
2818+ err = mlx4_QUERY_FUNC_CAP (dev , 1 , & func_cap );
2819+ if (!err )
2820+ * phv = func_cap .flags & QUERY_FUNC_CAP_PHV_BIT ;
2821+ return err ;
2822+ }
2823+ EXPORT_SYMBOL (get_phv_bit );
2824+
2825+ int set_phv_bit (struct mlx4_dev * dev , u8 port , int new_val )
2826+ {
2827+ int ret ;
2828+
2829+ if (mlx4_is_slave (dev ))
2830+ return - EPERM ;
2831+
2832+ if (dev -> caps .flags2 & MLX4_DEV_CAP_FLAG2_PHV_EN &&
2833+ !(dev -> caps .flags2 & MLX4_DEV_CAP_FLAG2_SKIP_OUTER_VLAN )) {
2834+ ret = mlx4_SET_PORT_phv_bit (dev , port , new_val );
2835+ if (!ret )
2836+ dev -> caps .phv_bit [port ] = new_val ;
2837+ return ret ;
2838+ }
2839+
2840+ return - EOPNOTSUPP ;
2841+ }
2842+ EXPORT_SYMBOL (set_phv_bit );
0 commit comments