(
&mut self,
reg_idx: usize,
offset: u64,
data: &[u8],
)
| 905 | } |
| 906 | |
| 907 | pub fn write_config_register( |
| 908 | &mut self, |
| 909 | reg_idx: usize, |
| 910 | offset: u64, |
| 911 | data: &[u8], |
| 912 | ) -> Vec<BarReprogrammingParams> { |
| 913 | if offset as usize + data.len() > 4 { |
| 914 | return Vec::new(); |
| 915 | } |
| 916 | |
| 917 | // Handle potential write to MSI-X message control register |
| 918 | if let Some(msix_cap_reg_idx) = self.msix_cap_reg_idx |
| 919 | && let Some(msix_config) = &self.msix_config |
| 920 | { |
| 921 | if msix_cap_reg_idx == reg_idx && offset == 2 && data.len() == 2 { |
| 922 | msix_config |
| 923 | .lock() |
| 924 | .unwrap() |
| 925 | .set_msg_ctl(LittleEndian::read_u16(data)); |
| 926 | } else if msix_cap_reg_idx == reg_idx && offset == 0 && data.len() == 4 { |
| 927 | msix_config |
| 928 | .lock() |
| 929 | .unwrap() |
| 930 | .set_msg_ctl((LittleEndian::read_u32(data) >> 16) as u16); |
| 931 | } |
| 932 | } |
| 933 | |
| 934 | match data.len() { |
| 935 | 1 => self.write_byte(reg_idx * 4 + offset as usize, data[0]), |
| 936 | 2 => self.write_word( |
| 937 | reg_idx * 4 + offset as usize, |
| 938 | u16::from(data[0]) | (u16::from(data[1]) << 8), |
| 939 | ), |
| 940 | 4 => self.write_reg(reg_idx, LittleEndian::read_u32(data)), |
| 941 | _ => (), |
| 942 | } |
| 943 | |
| 944 | if let Some(param) = self.detect_bar_reprogramming(reg_idx, data) { |
| 945 | self.pending_bar_reprogram.push(param); |
| 946 | } |
| 947 | |
| 948 | if !self.pending_bar_reprogram.is_empty() { |
| 949 | // Return bar reprogramming only if the MSE bit is enabled; |
| 950 | if self.read_config_register(COMMAND_REG) & COMMAND_REG_MEMORY_SPACE_MASK |
| 951 | == COMMAND_REG_MEMORY_SPACE_MASK |
| 952 | { |
| 953 | info!( |
| 954 | "BAR reprogramming parameter is returned: {:x?}", |
| 955 | self.pending_bar_reprogram |
| 956 | ); |
| 957 | return self.pending_bar_reprogram.drain(..).collect(); |
| 958 | } |
| 959 | info!( |
| 960 | "MSE bit is disabled. No BAR reprogramming parameter is returned: {:x?}", |
| 961 | self.pending_bar_reprogram |
| 962 | ); |
| 963 | } |
| 964 |
nothing calls this directly
no test coverage detected