mei: don't use cached value for hcsr in mei_hw_reset
Open code mei_hw_reset to avoid using cached hcsr. Using cached hcsr can cause unwanted side effects. Move mei_hw_restet function to hw-me.c as it is hw dependent Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									528c8eb4e7
								
							
						
					
					
						commit
						adfba3220b
					
				| @ -132,6 +132,41 @@ void mei_disable_interrupts(struct mei_device *dev) | ||||
| 	mei_hcsr_set(dev); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_hw_reset - resets fw via mei csr register. | ||||
|  * | ||||
|  * @dev: the device structure | ||||
|  * @interrupts_enabled: if interrupt should be enabled after reset. | ||||
|  */ | ||||
| void mei_hw_reset(struct mei_device *dev, bool intr_enable) | ||||
| { | ||||
| 	u32 hcsr = mei_hcsr_read(dev); | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "before reset HCSR = 0x%08x.\n", hcsr); | ||||
| 
 | ||||
| 	hcsr |= (H_RST | H_IG); | ||||
| 
 | ||||
| 	if (intr_enable) | ||||
| 		hcsr |= H_IE; | ||||
| 	else | ||||
| 		hcsr &= ~H_IE; | ||||
| 
 | ||||
| 	hcsr &= ~H_IS; | ||||
| 
 | ||||
| 	mei_reg_write(dev, H_CSR, hcsr); | ||||
| 	hcsr = mei_hcsr_read(dev); | ||||
| 
 | ||||
| 	hcsr &= ~H_RST; | ||||
| 	hcsr |= H_IG; | ||||
| 	hcsr &= ~H_IS; | ||||
| 
 | ||||
| 	mei_reg_write(dev, H_CSR, hcsr); | ||||
| 
 | ||||
| 	hcsr = mei_hcsr_read(dev); | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", hcsr); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_interrupt_quick_handler - The ISR of the MEI device | ||||
|  | ||||
| @ -169,22 +169,6 @@ out: | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_hw_reset - resets fw via mei csr register. | ||||
|  * | ||||
|  * @dev: the device structure | ||||
|  * @interrupts_enabled: if interrupt should be enabled after reset. | ||||
|  */ | ||||
| static void mei_hw_reset(struct mei_device *dev, int interrupts_enabled) | ||||
| { | ||||
| 	dev->host_hw_state |= (H_RST | H_IG); | ||||
| 
 | ||||
| 	if (interrupts_enabled) | ||||
| 		mei_enable_interrupts(dev); | ||||
| 	else | ||||
| 		mei_disable_interrupts(dev); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_reset - resets host and fw. | ||||
|  * | ||||
| @ -207,20 +191,8 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | ||||
| 			dev->dev_state != MEI_DEV_POWER_DOWN && | ||||
| 			dev->dev_state != MEI_DEV_POWER_UP); | ||||
| 
 | ||||
| 	dev->host_hw_state = mei_hcsr_read(dev); | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "before reset host_hw_state = 0x%08x.\n", | ||||
| 	    dev->host_hw_state); | ||||
| 
 | ||||
| 	mei_hw_reset(dev, interrupts_enabled); | ||||
| 
 | ||||
| 	dev->host_hw_state &= ~H_RST; | ||||
| 	dev->host_hw_state |= H_IG; | ||||
| 
 | ||||
| 	mei_hcsr_set(dev); | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "currently saved host_hw_state = 0x%08x.\n", | ||||
| 	    dev->host_hw_state); | ||||
| 
 | ||||
| 	if (dev->dev_state != MEI_DEV_INITIALIZING) { | ||||
| 		if (dev->dev_state != MEI_DEV_DISABLED && | ||||
|  | ||||
| @ -385,6 +385,7 @@ void mei_watchdog_unregister(struct mei_device *dev); | ||||
|  * Register Access Function | ||||
|  */ | ||||
| 
 | ||||
| void mei_hw_reset(struct mei_device *dev, bool intr_enable); | ||||
| u32 mei_hcsr_read(const struct mei_device *dev); | ||||
| void mei_hcsr_set(struct mei_device *dev); | ||||
| u32 mei_mecsr_read(const struct mei_device *dev); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user