@@ -431,31 +431,6 @@ static int pd692x0_pi_disable(struct pse_controller_dev *pcdev, int id)
431
431
return 0 ;
432
432
}
433
433
434
- static int pd692x0_pi_is_enabled (struct pse_controller_dev * pcdev , int id )
435
- {
436
- struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
437
- struct pd692x0_msg msg , buf = {0 };
438
- int ret ;
439
-
440
- ret = pd692x0_fw_unavailable (priv );
441
- if (ret )
442
- return ret ;
443
-
444
- msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
445
- msg .sub [2 ] = id ;
446
- ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
447
- if (ret < 0 )
448
- return ret ;
449
-
450
- if (buf .sub [1 ]) {
451
- priv -> admin_state [id ] = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED ;
452
- return 1 ;
453
- } else {
454
- priv -> admin_state [id ] = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED ;
455
- return 0 ;
456
- }
457
- }
458
-
459
434
struct pd692x0_pse_ext_state_mapping {
460
435
u32 status_code ;
461
436
enum ethtool_c33_pse_ext_state pse_ext_state ;
@@ -517,21 +492,38 @@ pd692x0_pse_ext_state_map[] = {
517
492
{ /* sentinel */ }
518
493
};
519
494
520
- static void
521
- pd692x0_get_ext_state (struct ethtool_c33_pse_ext_state_info * c33_ext_state_info ,
522
- u32 status_code )
495
+ static int
496
+ pd692x0_pi_get_ext_state (struct pse_controller_dev * pcdev , int id ,
497
+ struct pse_ext_state_info * ext_state_info )
523
498
{
499
+ struct ethtool_c33_pse_ext_state_info * c33_ext_state_info ;
524
500
const struct pd692x0_pse_ext_state_mapping * ext_state_map ;
501
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
502
+ struct pd692x0_msg msg , buf = {0 };
503
+ int ret ;
525
504
505
+ ret = pd692x0_fw_unavailable (priv );
506
+ if (ret )
507
+ return ret ;
508
+
509
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
510
+ msg .sub [2 ] = id ;
511
+ ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
512
+ if (ret < 0 )
513
+ return ret ;
514
+
515
+ c33_ext_state_info = & ext_state_info -> c33_ext_state_info ;
526
516
ext_state_map = pd692x0_pse_ext_state_map ;
527
517
while (ext_state_map -> status_code ) {
528
- if (ext_state_map -> status_code == status_code ) {
518
+ if (ext_state_map -> status_code == buf . sub [ 0 ] ) {
529
519
c33_ext_state_info -> c33_pse_ext_state = ext_state_map -> pse_ext_state ;
530
520
c33_ext_state_info -> __c33_pse_ext_substate = ext_state_map -> pse_ext_substate ;
531
- return ;
521
+ return 0 ;
532
522
}
533
523
ext_state_map ++ ;
534
524
}
525
+
526
+ return 0 ;
535
527
}
536
528
537
529
struct pd692x0_class_pw {
@@ -613,35 +605,36 @@ static int pd692x0_pi_set_pw_from_table(struct device *dev,
613
605
}
614
606
615
607
static int
616
- pd692x0_pi_get_pw_ranges (struct pse_control_status * st )
608
+ pd692x0_pi_get_pw_limit_ranges (struct pse_controller_dev * pcdev , int id ,
609
+ struct pse_pw_limit_ranges * pw_limit_ranges )
617
610
{
611
+ struct ethtool_c33_pse_pw_limit_range * c33_pw_limit_ranges ;
618
612
const struct pd692x0_class_pw * pw_table ;
619
613
int i ;
620
614
621
615
pw_table = pd692x0_class_pw_table ;
622
- st -> c33_pw_limit_ranges = kcalloc (PD692X0_CLASS_PW_TABLE_SIZE ,
623
- sizeof (struct ethtool_c33_pse_pw_limit_range ),
624
- GFP_KERNEL );
625
- if (!st -> c33_pw_limit_ranges )
616
+ c33_pw_limit_ranges = kcalloc (PD692X0_CLASS_PW_TABLE_SIZE ,
617
+ sizeof (* c33_pw_limit_ranges ),
618
+ GFP_KERNEL );
619
+ if (!c33_pw_limit_ranges )
626
620
return - ENOMEM ;
627
621
628
622
for (i = 0 ; i < PD692X0_CLASS_PW_TABLE_SIZE ; i ++ , pw_table ++ ) {
629
- st -> c33_pw_limit_ranges [i ].min = pw_table -> class_pw ;
630
- st -> c33_pw_limit_ranges [i ].max = pw_table -> class_pw + pw_table -> max_added_class_pw ;
623
+ c33_pw_limit_ranges [i ].min = pw_table -> class_pw ;
624
+ c33_pw_limit_ranges [i ].max = pw_table -> class_pw +
625
+ pw_table -> max_added_class_pw ;
631
626
}
632
627
633
- st -> c33_pw_limit_nb_ranges = i ;
634
- return 0 ;
628
+ pw_limit_ranges -> c33_pw_limit_ranges = c33_pw_limit_ranges ;
629
+ return i ;
635
630
}
636
631
637
- static int pd692x0_ethtool_get_status (struct pse_controller_dev * pcdev ,
638
- unsigned long id ,
639
- struct netlink_ext_ack * extack ,
640
- struct pse_control_status * status )
632
+ static int
633
+ pd692x0_pi_get_admin_state (struct pse_controller_dev * pcdev , int id ,
634
+ struct pse_admin_state * admin_state )
641
635
{
642
636
struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
643
637
struct pd692x0_msg msg , buf = {0 };
644
- u32 class ;
645
638
int ret ;
646
639
647
640
ret = pd692x0_fw_unavailable (priv );
@@ -654,39 +647,65 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
654
647
if (ret < 0 )
655
648
return ret ;
656
649
657
- /* Compare Port Status (Communication Protocol Document par. 7.1) */
658
- if ((buf .sub [0 ] & 0xf0 ) == 0x80 || (buf .sub [0 ] & 0xf0 ) == 0x90 )
659
- status -> c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING ;
660
- else if (buf .sub [0 ] == 0x1b || buf .sub [0 ] == 0x22 )
661
- status -> c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING ;
662
- else if (buf .sub [0 ] == 0x12 )
663
- status -> c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_FAULT ;
664
- else
665
- status -> c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED ;
666
-
667
650
if (buf .sub [1 ])
668
- status -> c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED ;
651
+ admin_state -> c33_admin_state =
652
+ ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED ;
669
653
else
670
- status -> c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED ;
654
+ admin_state -> c33_admin_state =
655
+ ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED ;
671
656
672
- priv -> admin_state [id ] = status -> c33_admin_state ;
657
+ priv -> admin_state [id ] = admin_state -> c33_admin_state ;
673
658
674
- pd692x0_get_ext_state ( & status -> c33_ext_state_info , buf . sub [ 0 ]) ;
675
- status -> c33_actual_pw = ( buf . data [ 0 ] << 4 | buf . data [ 1 ]) * 100 ;
659
+ return 0 ;
660
+ }
676
661
677
- msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_PARAM ];
662
+ static int
663
+ pd692x0_pi_get_pw_status (struct pse_controller_dev * pcdev , int id ,
664
+ struct pse_pw_status * pw_status )
665
+ {
666
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
667
+ struct pd692x0_msg msg , buf = {0 };
668
+ int ret ;
669
+
670
+ ret = pd692x0_fw_unavailable (priv );
671
+ if (ret )
672
+ return ret ;
673
+
674
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
678
675
msg .sub [2 ] = id ;
679
- memset (& buf , 0 , sizeof (buf ));
680
676
ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
681
677
if (ret < 0 )
682
678
return ret ;
683
679
684
- ret = pd692x0_pi_get_pw_from_table (buf .data [0 ], buf .data [1 ]);
685
- if (ret < 0 )
680
+ /* Compare Port Status (Communication Protocol Document par. 7.1) */
681
+ if ((buf .sub [0 ] & 0xf0 ) == 0x80 || (buf .sub [0 ] & 0xf0 ) == 0x90 )
682
+ pw_status -> c33_pw_status =
683
+ ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING ;
684
+ else if (buf .sub [0 ] == 0x1b || buf .sub [0 ] == 0x22 )
685
+ pw_status -> c33_pw_status =
686
+ ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING ;
687
+ else if (buf .sub [0 ] == 0x12 )
688
+ pw_status -> c33_pw_status =
689
+ ETHTOOL_C33_PSE_PW_D_STATUS_FAULT ;
690
+ else
691
+ pw_status -> c33_pw_status =
692
+ ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED ;
693
+
694
+ return 0 ;
695
+ }
696
+
697
+ static int
698
+ pd692x0_pi_get_pw_class (struct pse_controller_dev * pcdev , int id )
699
+ {
700
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
701
+ struct pd692x0_msg msg , buf = {0 };
702
+ u32 class ;
703
+ int ret ;
704
+
705
+ ret = pd692x0_fw_unavailable (priv );
706
+ if (ret )
686
707
return ret ;
687
- status -> c33_avail_pw_limit = ret ;
688
708
689
- memset (& buf , 0 , sizeof (buf ));
690
709
msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_CLASS ];
691
710
msg .sub [2 ] = id ;
692
711
ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
@@ -695,13 +714,29 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
695
714
696
715
class = buf .data [3 ] >> 4 ;
697
716
if (class <= 8 )
698
- status -> c33_pw_class = class ;
717
+ return class ;
699
718
700
- ret = pd692x0_pi_get_pw_ranges (status );
719
+ return 0 ;
720
+ }
721
+
722
+ static int
723
+ pd692x0_pi_get_actual_pw (struct pse_controller_dev * pcdev , int id )
724
+ {
725
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
726
+ struct pd692x0_msg msg , buf = {0 };
727
+ int ret ;
728
+
729
+ ret = pd692x0_fw_unavailable (priv );
730
+ if (ret )
731
+ return ret ;
732
+
733
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
734
+ msg .sub [2 ] = id ;
735
+ ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
701
736
if (ret < 0 )
702
737
return ret ;
703
738
704
- return 0 ;
739
+ return ( buf . data [ 0 ] << 4 | buf . data [ 1 ]) * 100 ;
705
740
}
706
741
707
742
static struct pd692x0_msg_ver pd692x0_get_sw_version (struct pd692x0_priv * priv )
@@ -999,62 +1034,37 @@ static int pd692x0_pi_get_voltage(struct pse_controller_dev *pcdev, int id)
999
1034
return (buf .sub [0 ] << 8 | buf .sub [1 ]) * 100000 ;
1000
1035
}
1001
1036
1002
- static int pd692x0_pi_get_current_limit (struct pse_controller_dev * pcdev ,
1003
- int id )
1037
+ static int pd692x0_pi_get_pw_limit (struct pse_controller_dev * pcdev ,
1038
+ int id )
1004
1039
{
1005
1040
struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
1006
1041
struct pd692x0_msg msg , buf = {0 };
1007
- int mW , uV , uA , ret ;
1008
- s64 tmp_64 ;
1042
+ int ret ;
1009
1043
1010
1044
msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_PARAM ];
1011
1045
msg .sub [2 ] = id ;
1012
1046
ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
1013
1047
if (ret < 0 )
1014
1048
return ret ;
1015
1049
1016
- ret = pd692x0_pi_get_pw_from_table (buf .data [2 ], buf .data [3 ]);
1017
- if (ret < 0 )
1018
- return ret ;
1019
- mW = ret ;
1020
-
1021
- ret = pd692x0_pi_get_voltage (pcdev , id );
1022
- if (ret < 0 )
1023
- return ret ;
1024
- uV = ret ;
1025
-
1026
- tmp_64 = mW ;
1027
- tmp_64 *= 1000000000ull ;
1028
- /* uA = mW * 1000000000 / uV */
1029
- uA = DIV_ROUND_CLOSEST_ULL (tmp_64 , uV );
1030
- return uA ;
1050
+ return pd692x0_pi_get_pw_from_table (buf .data [2 ], buf .data [3 ]);
1031
1051
}
1032
1052
1033
- static int pd692x0_pi_set_current_limit (struct pse_controller_dev * pcdev ,
1034
- int id , int max_uA )
1053
+ static int pd692x0_pi_set_pw_limit (struct pse_controller_dev * pcdev ,
1054
+ int id , int max_mW )
1035
1055
{
1036
1056
struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
1037
1057
struct device * dev = & priv -> client -> dev ;
1038
1058
struct pd692x0_msg msg , buf = {0 };
1039
- int uV , ret , mW ;
1040
- s64 tmp_64 ;
1059
+ int ret ;
1041
1060
1042
1061
ret = pd692x0_fw_unavailable (priv );
1043
1062
if (ret )
1044
1063
return ret ;
1045
1064
1046
- ret = pd692x0_pi_get_voltage (pcdev , id );
1047
- if (ret < 0 )
1048
- return ret ;
1049
- uV = ret ;
1050
-
1051
1065
msg = pd692x0_msg_template_list [PD692X0_MSG_SET_PORT_PARAM ];
1052
1066
msg .sub [2 ] = id ;
1053
- tmp_64 = uV ;
1054
- tmp_64 *= max_uA ;
1055
- /* mW = uV * uA / 1000000000 */
1056
- mW = DIV_ROUND_CLOSEST_ULL (tmp_64 , 1000000000 );
1057
- ret = pd692x0_pi_set_pw_from_table (dev , & msg , mW );
1067
+ ret = pd692x0_pi_set_pw_from_table (dev , & msg , max_mW );
1058
1068
if (ret )
1059
1069
return ret ;
1060
1070
@@ -1063,13 +1073,17 @@ static int pd692x0_pi_set_current_limit(struct pse_controller_dev *pcdev,
1063
1073
1064
1074
static const struct pse_controller_ops pd692x0_ops = {
1065
1075
.setup_pi_matrix = pd692x0_setup_pi_matrix ,
1066
- .ethtool_get_status = pd692x0_ethtool_get_status ,
1076
+ .pi_get_admin_state = pd692x0_pi_get_admin_state ,
1077
+ .pi_get_pw_status = pd692x0_pi_get_pw_status ,
1078
+ .pi_get_ext_state = pd692x0_pi_get_ext_state ,
1079
+ .pi_get_pw_class = pd692x0_pi_get_pw_class ,
1080
+ .pi_get_actual_pw = pd692x0_pi_get_actual_pw ,
1067
1081
.pi_enable = pd692x0_pi_enable ,
1068
1082
.pi_disable = pd692x0_pi_disable ,
1069
- .pi_is_enabled = pd692x0_pi_is_enabled ,
1070
1083
.pi_get_voltage = pd692x0_pi_get_voltage ,
1071
- .pi_get_current_limit = pd692x0_pi_get_current_limit ,
1072
- .pi_set_current_limit = pd692x0_pi_set_current_limit ,
1084
+ .pi_get_pw_limit = pd692x0_pi_get_pw_limit ,
1085
+ .pi_set_pw_limit = pd692x0_pi_set_pw_limit ,
1086
+ .pi_get_pw_limit_ranges = pd692x0_pi_get_pw_limit_ranges ,
1073
1087
};
1074
1088
1075
1089
#define PD692X0_FW_LINE_MAX_SZ 0xff
0 commit comments