Refreshed all patches. Remove upstreamed: - 600-ipv6-addrconf-call-ipv6_mc_up-for-non-Ethernet-inter.patch - 184-USB-serial-option-add-Wistron-Neweb-D19Q1.patch Fixes: - CVE-2020-8647 - CVE-2020-8648 (potentially) - CVE-2020-8649 Compile-tested on: cns3xxx Runtime-tested on: cns3xxx Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 1be8018db381200c24854e0c299206c557f76fe0 Mon Sep 17 00:00:00 2001
 | 
						|
From: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
Date: Mon, 11 Nov 2019 11:58:09 +0000
 | 
						|
Subject: [PATCH 638/660] net: phy: avoid matching all-ones clause 45 PHY IDs
 | 
						|
 | 
						|
We currently match clause 45 PHYs using any ID read from a MMD marked
 | 
						|
as present in the "Devices in package" registers 5 and 6.  However,
 | 
						|
this is incorrect.  45.2 says:
 | 
						|
 | 
						|
  "The definition of the term package is vendor specific and could be
 | 
						|
   a chip, module, or other similar entity."
 | 
						|
 | 
						|
so a package could be more or less than the whole PHY - a PHY could be
 | 
						|
made up of several modules instantiated onto a single chip such as the
 | 
						|
Marvell 88x3310, or some of the MMDs could be disabled according to
 | 
						|
chip configuration, such as the Broadcom 84881.
 | 
						|
 | 
						|
In the case of Broadcom 84881, the "Devices in package" registers
 | 
						|
contain 0xc000009b, meaning that there is a PHYXS present in the
 | 
						|
package, but all registers in MMD 4 return 0xffff.  This leads to our
 | 
						|
matching code incorrectly binding this PHY to one of our generic PHY
 | 
						|
drivers.
 | 
						|
 | 
						|
This patch changes the way we determine whether to attempt to match a
 | 
						|
MMD identifier, or use it to request a module - if the identifier is
 | 
						|
all-ones, then we skip over it. When reading the identifiers, we
 | 
						|
initialise phydev->c45_ids.device_ids to all-ones, only reading the
 | 
						|
device ID if the "Devices in package" registers indicates we should.
 | 
						|
 | 
						|
This avoids the generic drivers incorrectly matching on a PHY ID of
 | 
						|
0xffffffff.
 | 
						|
 | 
						|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
---
 | 
						|
 drivers/net/phy/phy_device.c | 7 +++++--
 | 
						|
 1 file changed, 5 insertions(+), 2 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/net/phy/phy_device.c
 | 
						|
+++ b/drivers/net/phy/phy_device.c
 | 
						|
@@ -339,7 +339,7 @@ static int phy_bus_match(struct device *
 | 
						|
 
 | 
						|
 	if (phydev->is_c45) {
 | 
						|
 		for (i = 1; i < num_ids; i++) {
 | 
						|
-			if (!(phydev->c45_ids.devices_in_package & (1 << i)))
 | 
						|
+			if (phydev->c45_ids.device_ids[i] == 0xffffffff)
 | 
						|
 				continue;
 | 
						|
 
 | 
						|
 			if ((phydrv->phy_id & phydrv->phy_id_mask) ==
 | 
						|
@@ -627,10 +627,13 @@ static int get_phy_id(struct mii_bus *bu
 | 
						|
  */
 | 
						|
 struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
 | 
						|
 {
 | 
						|
-	struct phy_c45_device_ids c45_ids = {0};
 | 
						|
+	struct phy_c45_device_ids c45_ids;
 | 
						|
 	u32 phy_id = 0;
 | 
						|
 	int r;
 | 
						|
 
 | 
						|
+	c45_ids.devices_in_package = 0;
 | 
						|
+	memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));
 | 
						|
+
 | 
						|
 	r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
 | 
						|
 	if (r)
 | 
						|
 		return ERR_PTR(r);
 |