@@ -1035,7 +1035,9 @@ pci_xhci_apl_drdregs_write(struct pci_xhci_vdev *xdev, uint64_t offset,
1035
1035
uint64_t value )
1036
1036
{
1037
1037
int rc = 0 , fd ;
1038
- uint32_t drdcfg0 = 0 , drdcfg1 = 0 ;
1038
+ char * mstr ;
1039
+ int msz = 0 ;
1040
+ uint32_t drdcfg1 = 0 ;
1039
1041
struct pci_xhci_excap * excap ;
1040
1042
struct pci_xhci_excap_drd_apl * excap_drd ;
1041
1043
@@ -1054,45 +1056,51 @@ pci_xhci_apl_drdregs_write(struct pci_xhci_vdev *xdev, uint64_t offset,
1054
1056
excap_drd = excap -> data ;
1055
1057
1056
1058
offset -= XHCI_APL_DRDREGS_BASE ;
1057
- if (offset == XHCI_DRD_MUX_CFG0 ) {
1058
- fd = open (XHCI_NATIVE_DRD_SWITCH_PATH , O_WRONLY );
1059
- if (fd == -1 ) {
1060
- UPRINTF (LWRN , "drd native interface open failed\r\n" );
1061
- return -1 ;
1062
- }
1059
+ if (offset != XHCI_DRD_MUX_CFG0 ) {
1060
+ UPRINTF (LWRN , "drd configuration register access failed.\r\n" );
1061
+ return -1 ;
1062
+ }
1063
1063
1064
- if (value & XHCI_DRD_CFG0_HOST_MODE )
1065
- rc = write (fd , XHCI_NATIVE_DRD_HOST_MODE ,
1066
- XHCI_NATIVE_DRD_WRITE_SZ );
1067
- else if (value & XHCI_DRD_CFG0_DEV_MODE )
1068
- rc = write (fd , XHCI_NATIVE_DRD_DEV_MODE ,
1069
- XHCI_NATIVE_DRD_WRITE_SZ );
1070
-
1071
- if (rc == XHCI_NATIVE_DRD_WRITE_SZ ) {
1072
- if (value & XHCI_DRD_CFG0_HOST_MODE ) {
1073
- drdcfg1 |= XHCI_DRD_CFG1_HOST_MODE ;
1074
- drdcfg0 &= ~XHCI_DRD_CFG0_IDPIN ;
1075
- drdcfg0 &= ~XHCI_DRD_CFG0_VBUS_VALID ;
1076
- } else if (value & XHCI_DRD_CFG0_DEV_MODE ) {
1077
- drdcfg1 &= ~XHCI_DRD_CFG1_HOST_MODE ;
1078
- drdcfg0 |= XHCI_DRD_CFG0_IDPIN ;
1079
- drdcfg0 |= XHCI_DRD_CFG0_VBUS_VALID ;
1080
- }
1081
- drdcfg0 |= XHCI_DRD_CFG0_IDPIN_EN ;
1082
- excap_drd -> drdcfg0 = drdcfg0 ;
1083
- excap_drd -> drdcfg1 = drdcfg1 ;
1064
+ if (excap_drd -> drdcfg0 == value ) {
1065
+ UPRINTF (LDBG , "No mode switch action. Current drd: %s mode\r\n" ,
1066
+ excap_drd -> drdcfg1 & XHCI_DRD_CFG1_HOST_MODE ?
1067
+ "host" : "device" );
1068
+ return 0 ;
1069
+ }
1070
+
1071
+ excap_drd -> drdcfg0 = value ;
1072
+
1073
+ if (value & XHCI_DRD_CFG0_IDPIN_EN ) {
1074
+ if ((value & XHCI_DRD_CFG0_IDPIN ) == 0 ) {
1075
+ mstr = XHCI_NATIVE_DRD_HOST_MODE ;
1076
+ msz = strlen (XHCI_NATIVE_DRD_HOST_MODE );
1077
+ drdcfg1 |= XHCI_DRD_CFG1_HOST_MODE ;
1084
1078
} else {
1085
- UPRINTF (LWRN , "drd native inferface write failed, "
1086
- "returned %d.\r\n" , rc );
1087
- close (fd );
1088
- return -1 ;
1079
+ mstr = XHCI_NATIVE_DRD_DEV_MODE ;
1080
+ msz = strlen (XHCI_NATIVE_DRD_DEV_MODE );
1081
+ drdcfg1 &= ~XHCI_DRD_CFG1_HOST_MODE ;
1089
1082
}
1090
- } else if (offset == XHCI_DRD_MUX_CFG1 ) {
1091
- UPRINTF (LWRN , "write to RO register, offset 0x%lx\r\n" , offset );
1092
- return -1 ;
1093
1083
} else
1084
+ return 0 ;
1085
+
1086
+ fd = open (XHCI_NATIVE_DRD_SWITCH_PATH , O_WRONLY );
1087
+ if (fd < 0 ) {
1088
+ UPRINTF (LWRN , "drd native interface open failed\r\n" );
1094
1089
return -1 ;
1090
+ }
1095
1091
1092
+ rc = write (fd , mstr , msz );
1093
+ close (fd );
1094
+ if (rc == msz )
1095
+ excap_drd -> drdcfg1 = drdcfg1 ;
1096
+ else {
1097
+ UPRINTF (LWRN , "drd native interface write "
1098
+ "%s mode failed, drdcfg0: 0x%x, "
1099
+ "drdcfg1: 0x%x.\r\n" ,
1100
+ value & XHCI_DRD_CFG0_IDPIN ? "device" : "host" ,
1101
+ excap_drd -> drdcfg0 , excap_drd -> drdcfg1 );
1102
+ return -1 ;
1103
+ }
1096
1104
return 0 ;
1097
1105
}
1098
1106
@@ -1107,11 +1115,11 @@ pci_xhci_excap_write(struct pci_xhci_vdev *xdev, uint64_t offset,
1107
1115
if (xdev -> excap_ptr && xdev -> excap_write )
1108
1116
rc = xdev -> excap_write (xdev , offset , value );
1109
1117
else
1110
- rc = -1 ;
1111
-
1112
- if (rc )
1113
1118
UPRINTF (LWRN , "write invalid offset 0x%lx\r\n" , offset );
1114
1119
1120
+ if (rc )
1121
+ UPRINTF (LWRN , "something wrong for xhci excap offset "
1122
+ "0x%lx write \r\n" , offset );
1115
1123
}
1116
1124
1117
1125
struct xhci_dev_ctx *
0 commit comments