@@ -955,23 +955,27 @@ struct pci_acs {
955955};
956956
957957static void __pci_config_acs (struct pci_dev * dev , struct pci_acs * caps ,
958- const char * p , u16 mask , u16 flags )
958+ const char * p , const u16 acs_mask , const u16 acs_flags )
959959{
960+ u16 flags = acs_flags ;
961+ u16 mask = acs_mask ;
960962 char * delimit ;
961963 int ret = 0 ;
962964
963965 if (!p )
964966 return ;
965967
966968 while (* p ) {
967- if (!mask ) {
969+ if (!acs_mask ) {
968970 /* Check for ACS flags */
969971 delimit = strstr (p , "@" );
970972 if (delimit ) {
971973 int end ;
972974 u32 shift = 0 ;
973975
974976 end = delimit - p - 1 ;
977+ mask = 0 ;
978+ flags = 0 ;
975979
976980 while (end > -1 ) {
977981 if (* (p + end ) == '0' ) {
@@ -1028,10 +1032,14 @@ static void __pci_config_acs(struct pci_dev *dev, struct pci_acs *caps,
10281032
10291033 pci_dbg (dev , "ACS mask = %#06x\n" , mask );
10301034 pci_dbg (dev , "ACS flags = %#06x\n" , flags );
1035+ pci_dbg (dev , "ACS control = %#06x\n" , caps -> ctrl );
1036+ pci_dbg (dev , "ACS fw_ctrl = %#06x\n" , caps -> fw_ctrl );
10311037
1032- /* If mask is 0 then we copy the bit from the firmware setting. */
1033- caps -> ctrl = (caps -> ctrl & ~mask ) | (caps -> fw_ctrl & mask );
1034- caps -> ctrl |= flags ;
1038+ /*
1039+ * For mask bits that are 0, copy them from the firmware setting
1040+ * and apply flags for all the mask bits that are 1.
1041+ */
1042+ caps -> ctrl = (caps -> fw_ctrl & ~mask ) | (flags & mask );
10351043
10361044 pci_info (dev , "Configured ACS to %#06x\n" , caps -> ctrl );
10371045}
0 commit comments