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

tg3: Add shmem options.

This patch adds some options obtained through shared memory.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Matt Carlson and committed by
David S. Miller
a9daf367 57e6983c

+123 -8
+88 -7
drivers/net/tg3.c
··· 33 33 #include <linux/ethtool.h> 34 34 #include <linux/mii.h> 35 35 #include <linux/phy.h> 36 + #include <linux/brcmphy.h> 36 37 #include <linux/if_vlan.h> 37 38 #include <linux/ip.h> 38 39 #include <linux/tcp.h> ··· 870 869 return 0; 871 870 } 872 871 872 + static void tg3_mdio_config(struct tg3 *tp) 873 + { 874 + u32 val; 875 + 876 + if (tp->mdio_bus.phy_map[PHY_ADDR]->interface != 877 + PHY_INTERFACE_MODE_RGMII) 878 + return; 879 + 880 + val = tr32(MAC_PHYCFG1) & ~(MAC_PHYCFG1_RGMII_EXT_RX_DEC | 881 + MAC_PHYCFG1_RGMII_SND_STAT_EN); 882 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) { 883 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) 884 + val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC; 885 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) 886 + val |= MAC_PHYCFG1_RGMII_SND_STAT_EN; 887 + } 888 + tw32(MAC_PHYCFG1, val | MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV); 889 + 890 + val = tr32(MAC_PHYCFG2) & ~(MAC_PHYCFG2_INBAND_ENABLE); 891 + if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE)) 892 + val |= MAC_PHYCFG2_INBAND_ENABLE; 893 + tw32(MAC_PHYCFG2, val); 894 + 895 + val = tr32(MAC_EXT_RGMII_MODE); 896 + val &= ~(MAC_RGMII_MODE_RX_INT_B | 897 + MAC_RGMII_MODE_RX_QUALITY | 898 + MAC_RGMII_MODE_RX_ACTIVITY | 899 + MAC_RGMII_MODE_RX_ENG_DET | 900 + MAC_RGMII_MODE_TX_ENABLE | 901 + MAC_RGMII_MODE_TX_LOWPWR | 902 + MAC_RGMII_MODE_TX_RESET); 903 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) { 904 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) 905 + val |= MAC_RGMII_MODE_RX_INT_B | 906 + MAC_RGMII_MODE_RX_QUALITY | 907 + MAC_RGMII_MODE_RX_ACTIVITY | 908 + MAC_RGMII_MODE_RX_ENG_DET; 909 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) 910 + val |= MAC_RGMII_MODE_TX_ENABLE | 911 + MAC_RGMII_MODE_TX_LOWPWR | 912 + MAC_RGMII_MODE_TX_RESET; 913 + } 914 + tw32(MAC_EXT_RGMII_MODE, val); 915 + } 916 + 873 917 static void tg3_mdio_start(struct tg3 *tp) 874 918 { 875 919 if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { ··· 926 880 tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; 927 881 tw32_f(MAC_MI_MODE, tp->mi_mode); 928 882 udelay(80); 883 + 884 + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) 885 + tg3_mdio_config(tp); 929 886 } 930 887 931 888 static void tg3_mdio_stop(struct tg3 *tp) ··· 944 895 { 945 896 int i; 946 897 u32 reg; 898 + struct phy_device *phydev; 947 899 struct mii_bus *mdio_bus = &tp->mdio_bus; 948 900 949 901 tg3_mdio_start(tp); ··· 978 928 tg3_bmcr_reset(tp); 979 929 980 930 i = mdiobus_register(mdio_bus); 981 - if (!i) 982 - tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED; 983 - else 931 + if (i) { 984 932 printk(KERN_WARNING "%s: mdiobus_reg failed (0x%x)\n", 985 933 tp->dev->name, i); 934 + return i; 935 + } 986 936 987 - return i; 937 + tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED; 938 + 939 + phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 940 + 941 + switch (phydev->phy_id) { 942 + case TG3_PHY_ID_BCM50610: 943 + phydev->interface = PHY_INTERFACE_MODE_RGMII; 944 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) 945 + phydev->dev_flags |= PHY_BRCM_STD_IBND_DISABLE; 946 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) 947 + phydev->dev_flags |= PHY_BRCM_EXT_IBND_RX_ENABLE; 948 + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) 949 + phydev->dev_flags |= PHY_BRCM_EXT_IBND_TX_ENABLE; 950 + break; 951 + case TG3_PHY_ID_BCMAC131: 952 + phydev->interface = PHY_INTERFACE_MODE_MII; 953 + break; 954 + } 955 + 956 + tg3_mdio_config(tp); 957 + 958 + return 0; 988 959 } 989 960 990 961 static void tg3_mdio_fini(struct tg3 *tp) ··· 1309 1238 phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 1310 1239 1311 1240 /* Attach the MAC to the PHY. */ 1312 - phydev = phy_connect(tp->dev, phydev->dev.bus_id, 1313 - tg3_adjust_link, 0, phydev->interface); 1241 + phydev = phy_connect(tp->dev, phydev->dev.bus_id, tg3_adjust_link, 1242 + phydev->dev_flags, phydev->interface); 1314 1243 if (IS_ERR(phydev)) { 1315 1244 printk(KERN_ERR "%s: Could not attach to PHY\n", tp->dev->name); 1316 1245 return PTR_ERR(phydev); ··· 11290 11219 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); 11291 11220 if (val == NIC_SRAM_DATA_SIG_MAGIC) { 11292 11221 u32 nic_cfg, led_cfg; 11293 - u32 nic_phy_id, ver, cfg2 = 0, eeprom_phy_id; 11222 + u32 nic_phy_id, ver, cfg2 = 0, cfg4 = 0, eeprom_phy_id; 11294 11223 int eeprom_phy_serdes = 0; 11295 11224 11296 11225 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); ··· 11303 11232 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5703) && 11304 11233 (ver > 0) && (ver < 0x100)) 11305 11234 tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2); 11235 + 11236 + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) 11237 + tg3_read_mem(tp, NIC_SRAM_DATA_CFG_4, &cfg4); 11306 11238 11307 11239 if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) == 11308 11240 NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER) ··· 11431 11357 if (cfg3 & NIC_SRAM_ASPM_DEBOUNCE) 11432 11358 tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; 11433 11359 } 11360 + 11361 + if (cfg4 & NIC_SRAM_RGMII_STD_IBND_DISABLE) 11362 + tp->tg3_flags3 |= TG3_FLG3_RGMII_STD_IBND_DISABLE; 11363 + if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_RX_EN) 11364 + tp->tg3_flags3 |= TG3_FLG3_RGMII_EXT_IBND_RX_EN; 11365 + if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_TX_EN) 11366 + tp->tg3_flags3 |= TG3_FLG3_RGMII_EXT_IBND_TX_EN; 11434 11367 } 11435 11368 } 11436 11369
+29 -1
drivers/net/tg3.h
··· 529 529 #define MAC_SERDES_CFG 0x00000590 530 530 #define MAC_SERDES_CFG_EDGE_SELECT 0x00001000 531 531 #define MAC_SERDES_STAT 0x00000594 532 - /* 0x598 --> 0x5b0 unused */ 532 + /* 0x598 --> 0x5a0 unused */ 533 + #define MAC_PHYCFG1 0x000005a0 534 + #define MAC_PHYCFG1_RGMII_INT 0x00000001 535 + #define MAC_PHYCFG1_RGMII_EXT_RX_DEC 0x02000000 536 + #define MAC_PHYCFG1_RGMII_SND_STAT_EN 0x04000000 537 + #define MAC_PHYCFG1_TXC_DRV 0x20000000 538 + #define MAC_PHYCFG2 0x000005a4 539 + #define MAC_PHYCFG2_INBAND_ENABLE 0x00000001 540 + #define MAC_EXT_RGMII_MODE 0x000005a8 541 + #define MAC_RGMII_MODE_TX_ENABLE 0x00000001 542 + #define MAC_RGMII_MODE_TX_LOWPWR 0x00000002 543 + #define MAC_RGMII_MODE_TX_RESET 0x00000004 544 + #define MAC_RGMII_MODE_RX_INT_B 0x00000100 545 + #define MAC_RGMII_MODE_RX_QUALITY 0x00000200 546 + #define MAC_RGMII_MODE_RX_ACTIVITY 0x00000400 547 + #define MAC_RGMII_MODE_RX_ENG_DET 0x00000800 548 + /* 0x5ac --> 0x5b0 unused */ 533 549 #define SERDES_RX_CTRL 0x000005b0 /* 5780/5714 only */ 534 550 #define SERDES_RX_SIG_DETECT 0x00000400 535 551 #define SG_DIG_CTRL 0x000005b0 ··· 1731 1715 #define NIC_SRAM_DATA_CFG_3 0x00000d3c 1732 1716 #define NIC_SRAM_ASPM_DEBOUNCE 0x00000002 1733 1717 1718 + #define NIC_SRAM_DATA_CFG_4 0x00000d60 1719 + #define NIC_SRAM_GMII_MODE 0x00000002 1720 + #define NIC_SRAM_RGMII_STD_IBND_DISABLE 0x00000004 1721 + #define NIC_SRAM_RGMII_EXT_IBND_RX_EN 0x00000008 1722 + #define NIC_SRAM_RGMII_EXT_IBND_TX_EN 0x00000010 1723 + 1734 1724 #define NIC_SRAM_RX_MINI_BUFFER_DESC 0x00001000 1735 1725 1736 1726 #define NIC_SRAM_DMA_DESC_POOL_BASE 0x00002000 ··· 2508 2486 #define TG3_FLG3_MDIOBUS_INITED 0x00000020 2509 2487 #define TG3_FLG3_MDIOBUS_PAUSED 0x00000040 2510 2488 #define TG3_FLG3_PHY_CONNECTED 0x00000080 2489 + #define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 2490 + #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 2491 + #define TG3_FLG3_RGMII_EXT_IBND_TX_EN 0x00000400 2511 2492 2512 2493 struct timer_list timer; 2513 2494 u16 timer_counter; ··· 2581 2556 #define PHY_REV_BCM5401_B2 0x3 2582 2557 #define PHY_REV_BCM5401_C0 0x6 2583 2558 #define PHY_REV_BCM5411_X0 0x1 /* Found on Netgear GA302T */ 2559 + #define TG3_PHY_ID_BCM50610 0x143bd60 2560 + #define TG3_PHY_ID_BCMAC131 0x143bc70 2561 + 2584 2562 2585 2563 u32 led_ctrl; 2586 2564 u32 phy_otp;
+6
include/linux/brcmphy.h
··· 1 + #define PHY_BRCM_WIRESPEED_ENABLE 0x00000001 2 + #define PHY_BRCM_AUTO_PWRDWN_ENABLE 0x00000002 3 + #define PHY_BRCM_APD_CLK125_ENABLE 0x00000004 4 + #define PHY_BRCM_STD_IBND_DISABLE 0x00000008 5 + #define PHY_BRCM_EXT_IBND_RX_ENABLE 0x00000010 6 + #define PHY_BRCM_EXT_IBND_TX_ENABLE 0x00000020