net: enetc: Fix use after free issue in fsl_enetc.c
If ethernet connected to SFP, like this:
&enetc_port0 {
            phy-connection-type = "sgmii";
            sfp = <&sfp0>;
            managed = "in-band-status";
            status = "okay";
};
Then enetc_config_phy returns -ENODEV and the memory containing the mdio interface is freed.
It's better to unregister and free mdio resources.
Signed-off-by: Siarhei Yasinski <siarhei.yasinski@sintecs.eu>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
			
			
This commit is contained in:
		
							parent
							
								
									6f6fbb334c
								
							
						
					
					
						commit
						5025224fad
					
				|  | @ -22,6 +22,8 @@ | ||||||
| 
 | 
 | ||||||
| #define ENETC_DRIVER_NAME	"enetc_eth" | #define ENETC_DRIVER_NAME	"enetc_eth" | ||||||
| 
 | 
 | ||||||
|  | static int enetc_remove(struct udevice *dev); | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * sets the MAC address in IERB registers, this setting is persistent and |  * sets the MAC address in IERB registers, this setting is persistent and | ||||||
|  * carried over to Linux. |  * carried over to Linux. | ||||||
|  | @ -319,6 +321,7 @@ static int enetc_config_phy(struct udevice *dev) | ||||||
| static int enetc_probe(struct udevice *dev) | static int enetc_probe(struct udevice *dev) | ||||||
| { | { | ||||||
| 	struct enetc_priv *priv = dev_get_priv(dev); | 	struct enetc_priv *priv = dev_get_priv(dev); | ||||||
|  | 	int res; | ||||||
| 
 | 
 | ||||||
| 	if (ofnode_valid(dev_ofnode(dev)) && !ofnode_is_available(dev_ofnode(dev))) { | 	if (ofnode_valid(dev_ofnode(dev)) && !ofnode_is_available(dev_ofnode(dev))) { | ||||||
| 		enetc_dbg(dev, "interface disabled\n"); | 		enetc_dbg(dev, "interface disabled\n"); | ||||||
|  | @ -350,7 +353,10 @@ static int enetc_probe(struct udevice *dev) | ||||||
| 
 | 
 | ||||||
| 	enetc_start_pcs(dev); | 	enetc_start_pcs(dev); | ||||||
| 
 | 
 | ||||||
| 	return enetc_config_phy(dev); | 	res = enetc_config_phy(dev); | ||||||
|  | 	if(res) | ||||||
|  | 		enetc_remove(dev); | ||||||
|  | 	return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue