Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'stmmac-fixes'

Ong Boon Leong says:

====================
net: stmmac: general fixes for Ethernet functionality

1/5: It ensures that the previous value of GMAC_VLAN_TAG register is
read first before for updating the register.

2/5: Similar to 2/6 patch but it is a fix for XGMAC_VLAN_TAG register
as requested by Jose Abreu.

3/5: It ensures the GMAC IP v4.xx and above behaves correctly to:-
ip link set <devname> multicast off|on

4/5: Added similar IFF_MULTICAST flag for xgmac2, similar to 4/6.

5/5: It ensures PCI platform data is using plat->phy_interface.

Changes from v4:-
patch 1/6 - this patch is dropped now and will take the input on
handling return value from netif_set_real_num_rx|
tx_queues() in future patch series.

v3:-
patch 1/6 - add rtnl_lock() and rtnl_unlock() for stmmac_hw_setup()
called inside stmmac_resume()
patch 3/6 - Added new patch to fix XGMAC_VLAN_TAG register writting

v2:-
patch 1/5 - added control for rtnl_lock() & rtnl_unlock() to ensure
they are used forstmmac_resume()
patch 4/5 - added IFF_MULTICAST flag check for xgmac to ensure
multicast works correctly.

v1:-
- Drop v1 patches (1/7, 3/7 & 4/7) that are not valid.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+20 -13
+5 -4
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
··· 420 420 value |= GMAC_PACKET_FILTER_PM; 421 421 /* Set all the bits of the HASH tab */ 422 422 memset(mc_filter, 0xff, sizeof(mc_filter)); 423 - } else if (!netdev_mc_empty(dev)) { 423 + } else if (!netdev_mc_empty(dev) && (dev->flags & IFF_MULTICAST)) { 424 424 struct netdev_hw_addr *ha; 425 425 426 426 /* Hash filter for multicast */ ··· 736 736 __le16 perfect_match, bool is_double) 737 737 { 738 738 void __iomem *ioaddr = hw->pcsr; 739 + u32 value; 739 740 740 741 writel(hash, ioaddr + GMAC_VLAN_HASH_TABLE); 741 742 743 + value = readl(ioaddr + GMAC_VLAN_TAG); 744 + 742 745 if (hash) { 743 - u32 value = GMAC_VLAN_VTHM | GMAC_VLAN_ETV; 746 + value |= GMAC_VLAN_VTHM | GMAC_VLAN_ETV; 744 747 if (is_double) { 745 748 value |= GMAC_VLAN_EDVLP; 746 749 value |= GMAC_VLAN_ESVL; ··· 762 759 763 760 writel(value | perfect_match, ioaddr + GMAC_VLAN_TAG); 764 761 } else { 765 - u32 value = readl(ioaddr + GMAC_VLAN_TAG); 766 - 767 762 value &= ~(GMAC_VLAN_VTHM | GMAC_VLAN_ETV); 768 763 value &= ~(GMAC_VLAN_EDVLP | GMAC_VLAN_ESVL); 769 764 value &= ~GMAC_VLAN_DOVLTC;
+7 -3
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c
··· 458 458 459 459 for (i = 0; i < XGMAC_MAX_HASH_TABLE; i++) 460 460 writel(~0x0, ioaddr + XGMAC_HASH_TABLE(i)); 461 - } else if (!netdev_mc_empty(dev)) { 461 + } else if (!netdev_mc_empty(dev) && (dev->flags & IFF_MULTICAST)) { 462 462 struct netdev_hw_addr *ha; 463 463 464 464 value |= XGMAC_FILTER_HMC; ··· 569 569 570 570 writel(value, ioaddr + XGMAC_PACKET_FILTER); 571 571 572 - value = XGMAC_VLAN_VTHM | XGMAC_VLAN_ETV; 572 + value = readl(ioaddr + XGMAC_VLAN_TAG); 573 + 574 + value |= XGMAC_VLAN_VTHM | XGMAC_VLAN_ETV; 573 575 if (is_double) { 574 576 value |= XGMAC_VLAN_EDVLP; 575 577 value |= XGMAC_VLAN_ESVL; ··· 586 584 587 585 writel(value, ioaddr + XGMAC_PACKET_FILTER); 588 586 589 - value = XGMAC_VLAN_ETV; 587 + value = readl(ioaddr + XGMAC_VLAN_TAG); 588 + 589 + value |= XGMAC_VLAN_ETV; 590 590 if (is_double) { 591 591 value |= XGMAC_VLAN_EDVLP; 592 592 value |= XGMAC_VLAN_ESVL;
+8 -6
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
··· 95 95 96 96 plat->bus_id = 1; 97 97 plat->phy_addr = 0; 98 - plat->interface = PHY_INTERFACE_MODE_GMII; 98 + plat->phy_interface = PHY_INTERFACE_MODE_GMII; 99 99 100 100 plat->dma_cfg->pbl = 32; 101 101 plat->dma_cfg->pblx8 = true; ··· 217 217 { 218 218 plat->bus_id = 1; 219 219 plat->phy_addr = 0; 220 - plat->interface = PHY_INTERFACE_MODE_SGMII; 220 + plat->phy_interface = PHY_INTERFACE_MODE_SGMII; 221 + 221 222 return ehl_common_data(pdev, plat); 222 223 } 223 224 ··· 231 230 { 232 231 plat->bus_id = 1; 233 232 plat->phy_addr = 0; 234 - plat->interface = PHY_INTERFACE_MODE_RGMII; 233 + plat->phy_interface = PHY_INTERFACE_MODE_RGMII; 234 + 235 235 return ehl_common_data(pdev, plat); 236 236 } 237 237 ··· 260 258 { 261 259 plat->bus_id = 1; 262 260 plat->phy_addr = 0; 263 - plat->interface = PHY_INTERFACE_MODE_SGMII; 261 + plat->phy_interface = PHY_INTERFACE_MODE_SGMII; 264 262 return tgl_common_data(pdev, plat); 265 263 } 266 264 ··· 360 358 361 359 plat->bus_id = pci_dev_id(pdev); 362 360 plat->phy_addr = ret; 363 - plat->interface = PHY_INTERFACE_MODE_RMII; 361 + plat->phy_interface = PHY_INTERFACE_MODE_RMII; 364 362 365 363 plat->dma_cfg->pbl = 16; 366 364 plat->dma_cfg->pblx8 = true; ··· 417 415 418 416 plat->bus_id = 1; 419 417 plat->phy_addr = -1; 420 - plat->interface = PHY_INTERFACE_MODE_GMII; 418 + plat->phy_interface = PHY_INTERFACE_MODE_GMII; 421 419 422 420 plat->dma_cfg->pbl = 32; 423 421 plat->dma_cfg->pblx8 = true;