@@ -2882,7 +2882,9 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
2882
2882
if (devlink_nl_put_handle (msg , devlink ))
2883
2883
goto genlmsg_cancel ;
2884
2884
2885
- if (cmd == DEVLINK_CMD_PORT_PARAM_GET )
2885
+ if (cmd == DEVLINK_CMD_PORT_PARAM_GET ||
2886
+ cmd == DEVLINK_CMD_PORT_PARAM_NEW ||
2887
+ cmd == DEVLINK_CMD_PORT_PARAM_DEL )
2886
2888
if (nla_put_u32 (msg , DEVLINK_ATTR_PORT_INDEX , port_index ))
2887
2889
goto genlmsg_cancel ;
2888
2890
@@ -2928,18 +2930,22 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
2928
2930
}
2929
2931
2930
2932
static void devlink_param_notify (struct devlink * devlink ,
2933
+ unsigned int port_index ,
2931
2934
struct devlink_param_item * param_item ,
2932
2935
enum devlink_command cmd )
2933
2936
{
2934
2937
struct sk_buff * msg ;
2935
2938
int err ;
2936
2939
2937
- WARN_ON (cmd != DEVLINK_CMD_PARAM_NEW && cmd != DEVLINK_CMD_PARAM_DEL );
2940
+ WARN_ON (cmd != DEVLINK_CMD_PARAM_NEW && cmd != DEVLINK_CMD_PARAM_DEL &&
2941
+ cmd != DEVLINK_CMD_PORT_PARAM_NEW &&
2942
+ cmd != DEVLINK_CMD_PORT_PARAM_DEL );
2938
2943
2939
2944
msg = nlmsg_new (NLMSG_DEFAULT_SIZE , GFP_KERNEL );
2940
2945
if (!msg )
2941
2946
return ;
2942
- err = devlink_nl_param_fill (msg , devlink , 0 , param_item , cmd , 0 , 0 , 0 );
2947
+ err = devlink_nl_param_fill (msg , devlink , port_index , param_item , cmd ,
2948
+ 0 , 0 , 0 );
2943
2949
if (err ) {
2944
2950
nlmsg_free (msg );
2945
2951
return ;
@@ -3097,6 +3103,7 @@ static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
3097
3103
}
3098
3104
3099
3105
static int __devlink_nl_cmd_param_set_doit (struct devlink * devlink ,
3106
+ unsigned int port_index ,
3100
3107
struct list_head * param_list ,
3101
3108
struct genl_info * info ,
3102
3109
enum devlink_command cmd )
@@ -3149,7 +3156,7 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
3149
3156
return err ;
3150
3157
}
3151
3158
3152
- devlink_param_notify (devlink , param_item , cmd );
3159
+ devlink_param_notify (devlink , port_index , param_item , cmd );
3153
3160
return 0 ;
3154
3161
}
3155
3162
@@ -3158,13 +3165,15 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
3158
3165
{
3159
3166
struct devlink * devlink = info -> user_ptr [0 ];
3160
3167
3161
- return __devlink_nl_cmd_param_set_doit (devlink , & devlink -> param_list ,
3168
+ return __devlink_nl_cmd_param_set_doit (devlink , 0 , & devlink -> param_list ,
3162
3169
info , DEVLINK_CMD_PARAM_NEW );
3163
3170
}
3164
3171
3165
3172
static int devlink_param_register_one (struct devlink * devlink ,
3173
+ unsigned int port_index ,
3166
3174
struct list_head * param_list ,
3167
- const struct devlink_param * param )
3175
+ const struct devlink_param * param ,
3176
+ enum devlink_command cmd )
3168
3177
{
3169
3178
struct devlink_param_item * param_item ;
3170
3179
@@ -3182,19 +3191,21 @@ static int devlink_param_register_one(struct devlink *devlink,
3182
3191
param_item -> param = param ;
3183
3192
3184
3193
list_add_tail (& param_item -> list , param_list );
3185
- devlink_param_notify (devlink , param_item , DEVLINK_CMD_PARAM_NEW );
3194
+ devlink_param_notify (devlink , port_index , param_item , cmd );
3186
3195
return 0 ;
3187
3196
}
3188
3197
3189
3198
static void devlink_param_unregister_one (struct devlink * devlink ,
3199
+ unsigned int port_index ,
3190
3200
struct list_head * param_list ,
3191
- const struct devlink_param * param )
3201
+ const struct devlink_param * param ,
3202
+ enum devlink_command cmd )
3192
3203
{
3193
3204
struct devlink_param_item * param_item ;
3194
3205
3195
3206
param_item = devlink_param_find_by_name (param_list , param -> name );
3196
3207
WARN_ON (!param_item );
3197
- devlink_param_notify (devlink , param_item , DEVLINK_CMD_PARAM_DEL );
3208
+ devlink_param_notify (devlink , port_index , param_item , cmd );
3198
3209
list_del (& param_item -> list );
3199
3210
kfree (param_item );
3200
3211
}
@@ -3279,8 +3290,9 @@ static int devlink_nl_cmd_port_param_set_doit(struct sk_buff *skb,
3279
3290
struct devlink_port * devlink_port = info -> user_ptr [0 ];
3280
3291
3281
3292
return __devlink_nl_cmd_param_set_doit (devlink_port -> devlink ,
3282
- & devlink_port -> param_list ,
3283
- info , 0 );
3293
+ devlink_port -> index ,
3294
+ & devlink_port -> param_list , info ,
3295
+ DEVLINK_CMD_PORT_PARAM_NEW );
3284
3296
}
3285
3297
3286
3298
static int devlink_nl_region_snapshot_id_put (struct sk_buff * msg ,
@@ -4598,9 +4610,12 @@ static int devlink_param_verify(const struct devlink_param *param)
4598
4610
}
4599
4611
4600
4612
static int __devlink_params_register (struct devlink * devlink ,
4613
+ unsigned int port_index ,
4601
4614
struct list_head * param_list ,
4602
4615
const struct devlink_param * params ,
4603
- size_t params_count )
4616
+ size_t params_count ,
4617
+ enum devlink_command reg_cmd ,
4618
+ enum devlink_command unreg_cmd )
4604
4619
{
4605
4620
const struct devlink_param * param = params ;
4606
4621
int i ;
@@ -4612,7 +4627,8 @@ static int __devlink_params_register(struct devlink *devlink,
4612
4627
if (err )
4613
4628
goto rollback ;
4614
4629
4615
- err = devlink_param_register_one (devlink , param_list , param );
4630
+ err = devlink_param_register_one (devlink , port_index ,
4631
+ param_list , param , reg_cmd );
4616
4632
if (err )
4617
4633
goto rollback ;
4618
4634
}
@@ -4624,23 +4640,27 @@ static int __devlink_params_register(struct devlink *devlink,
4624
4640
if (!i )
4625
4641
goto unlock ;
4626
4642
for (param -- ; i > 0 ; i -- , param -- )
4627
- devlink_param_unregister_one (devlink , param_list , param );
4643
+ devlink_param_unregister_one (devlink , port_index , param_list ,
4644
+ param , unreg_cmd );
4628
4645
unlock :
4629
4646
mutex_unlock (& devlink -> lock );
4630
4647
return err ;
4631
4648
}
4632
4649
4633
4650
static void __devlink_params_unregister (struct devlink * devlink ,
4651
+ unsigned int port_index ,
4634
4652
struct list_head * param_list ,
4635
4653
const struct devlink_param * params ,
4636
- size_t params_count )
4654
+ size_t params_count ,
4655
+ enum devlink_command cmd )
4637
4656
{
4638
4657
const struct devlink_param * param = params ;
4639
4658
int i ;
4640
4659
4641
4660
mutex_lock (& devlink -> lock );
4642
4661
for (i = 0 ; i < params_count ; i ++ , param ++ )
4643
- devlink_param_unregister_one (devlink , param_list , param );
4662
+ devlink_param_unregister_one (devlink , 0 , param_list , param ,
4663
+ cmd );
4644
4664
mutex_unlock (& devlink -> lock );
4645
4665
}
4646
4666
@@ -4657,8 +4677,10 @@ int devlink_params_register(struct devlink *devlink,
4657
4677
const struct devlink_param * params ,
4658
4678
size_t params_count )
4659
4679
{
4660
- return __devlink_params_register (devlink , & devlink -> param_list , params ,
4661
- params_count );
4680
+ return __devlink_params_register (devlink , 0 , & devlink -> param_list ,
4681
+ params , params_count ,
4682
+ DEVLINK_CMD_PARAM_NEW ,
4683
+ DEVLINK_CMD_PARAM_DEL );
4662
4684
}
4663
4685
EXPORT_SYMBOL_GPL (devlink_params_register );
4664
4686
@@ -4672,8 +4694,9 @@ void devlink_params_unregister(struct devlink *devlink,
4672
4694
const struct devlink_param * params ,
4673
4695
size_t params_count )
4674
4696
{
4675
- return __devlink_params_unregister (devlink , & devlink -> param_list ,
4676
- params , params_count );
4697
+ return __devlink_params_unregister (devlink , 0 , & devlink -> param_list ,
4698
+ params , params_count ,
4699
+ DEVLINK_CMD_PARAM_DEL );
4677
4700
}
4678
4701
EXPORT_SYMBOL_GPL (devlink_params_unregister );
4679
4702
@@ -4691,8 +4714,11 @@ int devlink_port_params_register(struct devlink_port *devlink_port,
4691
4714
size_t params_count )
4692
4715
{
4693
4716
return __devlink_params_register (devlink_port -> devlink ,
4717
+ devlink_port -> index ,
4694
4718
& devlink_port -> param_list , params ,
4695
- params_count );
4719
+ params_count ,
4720
+ DEVLINK_CMD_PORT_PARAM_NEW ,
4721
+ DEVLINK_CMD_PORT_PARAM_DEL );
4696
4722
}
4697
4723
EXPORT_SYMBOL_GPL (devlink_port_params_register );
4698
4724
@@ -4709,8 +4735,10 @@ void devlink_port_params_unregister(struct devlink_port *devlink_port,
4709
4735
size_t params_count )
4710
4736
{
4711
4737
return __devlink_params_unregister (devlink_port -> devlink ,
4738
+ devlink_port -> index ,
4712
4739
& devlink_port -> param_list ,
4713
- params , params_count );
4740
+ params , params_count ,
4741
+ DEVLINK_CMD_PORT_PARAM_DEL );
4714
4742
}
4715
4743
EXPORT_SYMBOL_GPL (devlink_port_params_unregister );
4716
4744
@@ -4739,6 +4767,7 @@ __devlink_param_driverinit_value_get(struct list_head *param_list, u32 param_id,
4739
4767
4740
4768
static int
4741
4769
__devlink_param_driverinit_value_set (struct devlink * devlink ,
4770
+ unsigned int port_index ,
4742
4771
struct list_head * param_list , u32 param_id ,
4743
4772
union devlink_param_value init_val ,
4744
4773
enum devlink_command cmd )
@@ -4759,7 +4788,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink,
4759
4788
param_item -> driverinit_value = init_val ;
4760
4789
param_item -> driverinit_value_valid = true;
4761
4790
4762
- devlink_param_notify (devlink , param_item , DEVLINK_CMD_PARAM_NEW );
4791
+ devlink_param_notify (devlink , port_index , param_item , cmd );
4763
4792
return 0 ;
4764
4793
}
4765
4794
@@ -4800,7 +4829,7 @@ EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_get);
4800
4829
int devlink_param_driverinit_value_set (struct devlink * devlink , u32 param_id ,
4801
4830
union devlink_param_value init_val )
4802
4831
{
4803
- return __devlink_param_driverinit_value_set (devlink ,
4832
+ return __devlink_param_driverinit_value_set (devlink , 0 ,
4804
4833
& devlink -> param_list ,
4805
4834
param_id , init_val ,
4806
4835
DEVLINK_CMD_PARAM_NEW );
@@ -4849,8 +4878,10 @@ int devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
4849
4878
union devlink_param_value init_val )
4850
4879
{
4851
4880
return __devlink_param_driverinit_value_set (devlink_port -> devlink ,
4881
+ devlink_port -> index ,
4852
4882
& devlink_port -> param_list ,
4853
- param_id , init_val , 0 );
4883
+ param_id , init_val ,
4884
+ DEVLINK_CMD_PORT_PARAM_NEW );
4854
4885
}
4855
4886
EXPORT_SYMBOL_GPL (devlink_port_param_driverinit_value_set );
4856
4887
@@ -4865,7 +4896,6 @@ EXPORT_SYMBOL_GPL(devlink_port_param_driverinit_value_set);
4865
4896
* This function should be used by the driver to notify devlink on value
4866
4897
* change, excluding driverinit configuration mode.
4867
4898
* For driverinit configuration mode driver should use the function
4868
- * devlink_param_driverinit_value_set() instead.
4869
4899
*/
4870
4900
void devlink_param_value_changed (struct devlink * devlink , u32 param_id )
4871
4901
{
@@ -4874,10 +4904,37 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
4874
4904
param_item = devlink_param_find_by_id (& devlink -> param_list , param_id );
4875
4905
WARN_ON (!param_item );
4876
4906
4877
- devlink_param_notify (devlink , param_item , DEVLINK_CMD_PARAM_NEW );
4907
+ devlink_param_notify (devlink , 0 , param_item , DEVLINK_CMD_PARAM_NEW );
4878
4908
}
4879
4909
EXPORT_SYMBOL_GPL (devlink_param_value_changed );
4880
4910
4911
+ /**
4912
+ * devlink_port_param_value_changed - notify devlink on a parameter's value
4913
+ * change. Should be called by the driver
4914
+ * right after the change.
4915
+ *
4916
+ * @devlink_port: devlink_port
4917
+ * @param_id: parameter ID
4918
+ *
4919
+ * This function should be used by the driver to notify devlink on value
4920
+ * change, excluding driverinit configuration mode.
4921
+ * For driverinit configuration mode driver should use the function
4922
+ * devlink_port_param_driverinit_value_set() instead.
4923
+ */
4924
+ void devlink_port_param_value_changed (struct devlink_port * devlink_port ,
4925
+ u32 param_id )
4926
+ {
4927
+ struct devlink_param_item * param_item ;
4928
+
4929
+ param_item = devlink_param_find_by_id (& devlink_port -> param_list ,
4930
+ param_id );
4931
+ WARN_ON (!param_item );
4932
+
4933
+ devlink_param_notify (devlink_port -> devlink , devlink_port -> index ,
4934
+ param_item , DEVLINK_CMD_PORT_PARAM_NEW );
4935
+ }
4936
+ EXPORT_SYMBOL_GPL (devlink_port_param_value_changed );
4937
+
4881
4938
/**
4882
4939
* devlink_param_value_str_fill - Safely fill-up the string preventing
4883
4940
* from overflow of the preallocated buffer
0 commit comments