@@ -517,21 +517,38 @@ pd692x0_pse_ext_state_map[] = {
517517 { /* sentinel */ }
518518};
519519
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 )
523523{
524+ struct ethtool_c33_pse_ext_state_info * c33_ext_state_info ;
524525 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 ;
525533
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 ;
526541 ext_state_map = pd692x0_pse_ext_state_map ;
527542 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 ] ) {
529544 c33_ext_state_info -> c33_pse_ext_state = ext_state_map -> pse_ext_state ;
530545 c33_ext_state_info -> __c33_pse_ext_substate = ext_state_map -> pse_ext_substate ;
531- return ;
546+ return 0 ;
532547 }
533548 ext_state_map ++ ;
534549 }
550+
551+ return 0 ;
535552}
536553
537554struct pd692x0_class_pw {
@@ -613,35 +630,36 @@ static int pd692x0_pi_set_pw_from_table(struct device *dev,
613630}
614631
615632static 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 )
617635{
636+ struct ethtool_c33_pse_pw_limit_range * c33_pw_limit_ranges ;
618637 const struct pd692x0_class_pw * pw_table ;
619638 int i ;
620639
621640 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 )
626645 return - ENOMEM ;
627646
628647 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 ;
631651 }
632652
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 ;
635655}
636656
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 )
641660{
642661 struct pd692x0_priv * priv = to_pd692x0_priv (pcdev );
643662 struct pd692x0_msg msg , buf = {0 };
644- u32 class ;
645663 int ret ;
646664
647665 ret = pd692x0_fw_unavailable (priv );
@@ -654,39 +672,65 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
654672 if (ret < 0 )
655673 return ret ;
656674
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-
667675 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 ;
669678 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 ;
671681
672- priv -> admin_state [id ] = status -> c33_admin_state ;
682+ priv -> admin_state [id ] = admin_state -> c33_admin_state ;
673683
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+ }
676686
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 ];
678700 msg .sub [2 ] = id ;
679- memset (& buf , 0 , sizeof (buf ));
680701 ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
681702 if (ret < 0 )
682703 return ret ;
683704
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 )
686732 return ret ;
687- status -> c33_avail_pw_limit = ret ;
688733
689- memset (& buf , 0 , sizeof (buf ));
690734 msg = pd692x0_msg_template_list [PD692X0_MSG_GET_PORT_CLASS ];
691735 msg .sub [2 ] = id ;
692736 ret = pd692x0_sendrecv_msg (priv , & msg , & buf );
@@ -695,13 +739,29 @@ static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
695739
696740 class = buf .data [3 ] >> 4 ;
697741 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 ;
699757
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 );
701761 if (ret < 0 )
702762 return ret ;
703763
704- return 0 ;
764+ return ( buf . data [ 0 ] << 4 | buf . data [ 1 ]) * 100 ;
705765}
706766
707767static 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,
10381098
10391099static const struct pse_controller_ops pd692x0_ops = {
10401100 .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 ,
10421106 .pi_enable = pd692x0_pi_enable ,
10431107 .pi_disable = pd692x0_pi_disable ,
10441108 .pi_is_enabled = pd692x0_pi_is_enabled ,
10451109 .pi_get_voltage = pd692x0_pi_get_voltage ,
10461110 .pi_get_pw_limit = pd692x0_pi_get_pw_limit ,
10471111 .pi_set_pw_limit = pd692x0_pi_set_pw_limit ,
1112+ .pi_get_pw_limit_ranges = pd692x0_pi_get_pw_limit_ranges ,
10481113};
10491114
10501115#define PD692X0_FW_LINE_MAX_SZ 0xff
0 commit comments