@@ -517,21 +517,38 @@ pd692x0_pse_ext_state_map[] = {
517
517
{ /* sentinel */ }
518
518
};
519
519
520
- static void
521
- pd692x0_get_ext_state (struct ethtool_c33_pse_ext_state_info * c33_ext_state_info ,
522
- u32 status_code )
520
+ static int
521
+ pd692x0_pi_get_ext_state (struct pse_controller_dev * pcdev , int id ,
522
+ struct pse_ext_state_info * ext_state_info )
523
523
{
524
+ struct ethtool_c33_pse_ext_state_info * c33_ext_state_info ;
524
525
const struct pd692x0_pse_ext_state_mapping * ext_state_map ;
526
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
527
+ struct pd692x0_msg msg , buf = {0 };
528
+ int ret ;
529
+
530
+ ret = pd692x0_fw_unavailable (priv );
531
+ if (ret )
532
+ return ret ;
525
533
534
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
535
+ msg .sub [2 ] = id ;
536
+ ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
537
+ if (ret < 0 )
538
+ return ret ;
539
+
540
+ c33_ext_state_info = & ext_state_info -> c33_ext_state_info ;
526
541
ext_state_map = pd692x0_pse_ext_state_map ;
527
542
while (ext_state_map -> status_code ) {
528
- if (ext_state_map -> status_code == status_code ) {
543
+ if (ext_state_map -> status_code == buf . sub [ 0 ] ) {
529
544
c33_ext_state_info -> c33_pse_ext_state = ext_state_map -> pse_ext_state ;
530
545
c33_ext_state_info -> __c33_pse_ext_substate = ext_state_map -> pse_ext_substate ;
531
- return ;
546
+ return 0 ;
532
547
}
533
548
ext_state_map ++ ;
534
549
}
550
+
551
+ return 0 ;
535
552
}
536
553
537
554
struct pd692x0_class_pw {
@@ -613,35 +630,36 @@ static int pd692x0_pi_set_pw_from_table(struct device *dev,
613
630
}
614
631
615
632
static int
616
- pd692x0_pi_get_pw_ranges (struct pse_control_status * st )
633
+ pd692x0_pi_get_pw_limit_ranges (struct pse_controller_dev * pcdev , int id ,
634
+ struct pse_pw_limit_ranges * pw_limit_ranges )
617
635
{
636
+ struct ethtool_c33_pse_pw_limit_range * c33_pw_limit_ranges ;
618
637
const struct pd692x0_class_pw * pw_table ;
619
638
int i ;
620
639
621
640
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 )
641
+ c33_pw_limit_ranges = kcalloc (PD692X0_CLASS_PW_TABLE_SIZE ,
642
+ sizeof (* c33_pw_limit_ranges ),
643
+ GFP_KERNEL );
644
+ if (!c33_pw_limit_ranges )
626
645
return - ENOMEM ;
627
646
628
647
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 ;
648
+ c33_pw_limit_ranges [i ].min = pw_table -> class_pw ;
649
+ c33_pw_limit_ranges [i ].max = pw_table -> class_pw +
650
+ pw_table -> max_added_class_pw ;
631
651
}
632
652
633
- st -> c33_pw_limit_nb_ranges = i ;
634
- return 0 ;
653
+ pw_limit_ranges -> c33_pw_limit_ranges = c33_pw_limit_ranges ;
654
+ return i ;
635
655
}
636
656
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 )
657
+ static int
658
+ pd692x0_pi_get_admin_state (struct pse_controller_dev * pcdev , int id ,
659
+ struct pse_admin_state * admin_state )
641
660
{
642
661
struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
643
662
struct pd692x0_msg msg , buf = {0 };
644
- u32 class ;
645
663
int ret ;
646
664
647
665
ret = pd692x0_fw_unavailable (priv );
@@ -654,39 +672,65 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
654
672
if (ret < 0 )
655
673
return ret ;
656
674
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
675
if (buf .sub [1 ])
668
- status -> c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED ;
676
+ admin_state -> c33_admin_state =
677
+ ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED ;
669
678
else
670
- status -> c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED ;
679
+ admin_state -> c33_admin_state =
680
+ ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED ;
671
681
672
- priv -> admin_state [id ] = status -> c33_admin_state ;
682
+ priv -> admin_state [id ] = admin_state -> c33_admin_state ;
673
683
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 ;
684
+ return 0 ;
685
+ }
676
686
677
- msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_PARAM ];
687
+ static int
688
+ pd692x0_pi_get_pw_status (struct pse_controller_dev * pcdev , int id ,
689
+ struct pse_pw_status * pw_status )
690
+ {
691
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
692
+ struct pd692x0_msg msg , buf = {0 };
693
+ int ret ;
694
+
695
+ ret = pd692x0_fw_unavailable (priv );
696
+ if (ret )
697
+ return ret ;
698
+
699
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
678
700
msg .sub [2 ] = id ;
679
- memset (& buf , 0 , sizeof (buf ));
680
701
ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
681
702
if (ret < 0 )
682
703
return ret ;
683
704
684
- ret = pd692x0_pi_get_pw_from_table (buf .data [0 ], buf .data [1 ]);
685
- if (ret < 0 )
705
+ /* Compare Port Status (Communication Protocol Document par. 7.1) */
706
+ if ((buf .sub [0 ] & 0xf0 ) == 0x80 || (buf .sub [0 ] & 0xf0 ) == 0x90 )
707
+ pw_status -> c33_pw_status =
708
+ ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING ;
709
+ else if (buf .sub [0 ] == 0x1b || buf .sub [0 ] == 0x22 )
710
+ pw_status -> c33_pw_status =
711
+ ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING ;
712
+ else if (buf .sub [0 ] == 0x12 )
713
+ pw_status -> c33_pw_status =
714
+ ETHTOOL_C33_PSE_PW_D_STATUS_FAULT ;
715
+ else
716
+ pw_status -> c33_pw_status =
717
+ ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED ;
718
+
719
+ return 0 ;
720
+ }
721
+
722
+ static int
723
+ pd692x0_pi_get_pw_class (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
+ u32 class ;
728
+ int ret ;
729
+
730
+ ret = pd692x0_fw_unavailable (priv );
731
+ if (ret )
686
732
return ret ;
687
- status -> c33_avail_pw_limit = ret ;
688
733
689
- memset (& buf , 0 , sizeof (buf ));
690
734
msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_CLASS ];
691
735
msg .sub [2 ] = id ;
692
736
ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
@@ -695,13 +739,29 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
695
739
696
740
class = buf .data [3 ] >> 4 ;
697
741
if (class <= 8 )
698
- status -> c33_pw_class = class ;
742
+ return class ;
743
+
744
+ return 0 ;
745
+ }
746
+
747
+ static int
748
+ pd692x0_pi_get_actual_pw (struct pse_controller_dev * pcdev , int id )
749
+ {
750
+ struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
751
+ struct pd692x0_msg msg , buf = {0 };
752
+ int ret ;
753
+
754
+ ret = pd692x0_fw_unavailable (priv );
755
+ if (ret )
756
+ return ret ;
699
757
700
- ret = pd692x0_pi_get_pw_ranges (status );
758
+ msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_STATUS ];
759
+ msg .sub [2 ] = id ;
760
+ ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
701
761
if (ret < 0 )
702
762
return ret ;
703
763
704
- return 0 ;
764
+ return ( buf . data [ 0 ] << 4 | buf . data [ 1 ]) * 100 ;
705
765
}
706
766
707
767
static struct pd692x0_msg_ver pd692x0_get_sw_version (struct pd692x0_priv * priv )
@@ -1038,13 +1098,18 @@ static int pd692x0_pi_set_pw_limit(struct pse_controller_dev *pcdev,
1038
1098
1039
1099
static const struct pse_controller_ops pd692x0_ops = {
1040
1100
.setup_pi_matrix = pd692x0_setup_pi_matrix ,
1041
- .ethtool_get_status = pd692x0_ethtool_get_status ,
1101
+ .pi_get_admin_state = pd692x0_pi_get_admin_state ,
1102
+ .pi_get_pw_status = pd692x0_pi_get_pw_status ,
1103
+ .pi_get_ext_state = pd692x0_pi_get_ext_state ,
1104
+ .pi_get_pw_class = pd692x0_pi_get_pw_class ,
1105
+ .pi_get_actual_pw = pd692x0_pi_get_actual_pw ,
1042
1106
.pi_enable = pd692x0_pi_enable ,
1043
1107
.pi_disable = pd692x0_pi_disable ,
1044
1108
.pi_is_enabled = pd692x0_pi_is_enabled ,
1045
1109
.pi_get_voltage = pd692x0_pi_get_voltage ,
1046
1110
.pi_get_pw_limit = pd692x0_pi_get_pw_limit ,
1047
1111
.pi_set_pw_limit = pd692x0_pi_set_pw_limit ,
1112
+ .pi_get_pw_limit_ranges = pd692x0_pi_get_pw_limit_ranges ,
1048
1113
};
1049
1114
1050
1115
#define PD692X0_FW_LINE_MAX_SZ 0xff
0 commit comments