aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bgmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom/bgmac.c')
-rw-r--r--drivers/net/ethernet/broadcom/bgmac.c115
1 files changed, 93 insertions, 22 deletions
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index 39efb864267e..5d41f414e11a 100644
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -96,6 +96,19 @@ static void bgmac_dma_tx_enable(struct bgmac *bgmac,
96 u32 ctl; 96 u32 ctl;
97 97
98 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL); 98 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
99 if (bgmac->core->id.rev >= 4) {
100 ctl &= ~BGMAC_DMA_TX_BL_MASK;
101 ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
102
103 ctl &= ~BGMAC_DMA_TX_MR_MASK;
104 ctl |= BGMAC_DMA_TX_MR_2 << BGMAC_DMA_TX_MR_SHIFT;
105
106 ctl &= ~BGMAC_DMA_TX_PC_MASK;
107 ctl |= BGMAC_DMA_TX_PC_16 << BGMAC_DMA_TX_PC_SHIFT;
108
109 ctl &= ~BGMAC_DMA_TX_PT_MASK;
110 ctl |= BGMAC_DMA_TX_PT_8 << BGMAC_DMA_TX_PT_SHIFT;
111 }
99 ctl |= BGMAC_DMA_TX_ENABLE; 112 ctl |= BGMAC_DMA_TX_ENABLE;
100 ctl |= BGMAC_DMA_TX_PARITY_DISABLE; 113 ctl |= BGMAC_DMA_TX_PARITY_DISABLE;
101 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl); 114 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl);
@@ -240,6 +253,16 @@ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
240 u32 ctl; 253 u32 ctl;
241 254
242 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL); 255 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
256 if (bgmac->core->id.rev >= 4) {
257 ctl &= ~BGMAC_DMA_RX_BL_MASK;
258 ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
259
260 ctl &= ~BGMAC_DMA_RX_PC_MASK;
261 ctl |= BGMAC_DMA_RX_PC_8 << BGMAC_DMA_RX_PC_SHIFT;
262
263 ctl &= ~BGMAC_DMA_RX_PT_MASK;
264 ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT;
265 }
243 ctl &= BGMAC_DMA_RX_ADDREXT_MASK; 266 ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
244 ctl |= BGMAC_DMA_RX_ENABLE; 267 ctl |= BGMAC_DMA_RX_ENABLE;
245 ctl |= BGMAC_DMA_RX_PARITY_DISABLE; 268 ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
@@ -745,13 +768,13 @@ static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set,
745 u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); 768 u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
746 u32 new_val = (cmdcfg & mask) | set; 769 u32 new_val = (cmdcfg & mask) | set;
747 770
748 bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR); 771 bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
749 udelay(2); 772 udelay(2);
750 773
751 if (new_val != cmdcfg || force) 774 if (new_val != cmdcfg || force)
752 bgmac_write(bgmac, BGMAC_CMDCFG, new_val); 775 bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
753 776
754 bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR); 777 bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
755 udelay(2); 778 udelay(2);
756} 779}
757 780
@@ -825,6 +848,9 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
825 case SPEED_1000: 848 case SPEED_1000:
826 set |= BGMAC_CMDCFG_ES_1000; 849 set |= BGMAC_CMDCFG_ES_1000;
827 break; 850 break;
851 case SPEED_2500:
852 set |= BGMAC_CMDCFG_ES_2500;
853 break;
828 default: 854 default:
829 bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed); 855 bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
830 } 856 }
@@ -837,12 +863,26 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
837 863
838static void bgmac_miiconfig(struct bgmac *bgmac) 864static void bgmac_miiconfig(struct bgmac *bgmac)
839{ 865{
840 u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >> 866 struct bcma_device *core = bgmac->core;
841 BGMAC_DS_MM_SHIFT; 867 struct bcma_chipinfo *ci = &core->bus->chipinfo;
842 if (imode == 0 || imode == 1) { 868 u8 imode;
843 bgmac->mac_speed = SPEED_100; 869
870 if (ci->id == BCMA_CHIP_ID_BCM4707 ||
871 ci->id == BCMA_CHIP_ID_BCM53018) {
872 bcma_awrite32(core, BCMA_IOCTL,
873 bcma_aread32(core, BCMA_IOCTL) | 0x40 |
874 BGMAC_BCMA_IOCTL_SW_CLKEN);
875 bgmac->mac_speed = SPEED_2500;
844 bgmac->mac_duplex = DUPLEX_FULL; 876 bgmac->mac_duplex = DUPLEX_FULL;
845 bgmac_mac_speed(bgmac); 877 bgmac_mac_speed(bgmac);
878 } else {
879 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
880 BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
881 if (imode == 0 || imode == 1) {
882 bgmac->mac_speed = SPEED_100;
883 bgmac->mac_duplex = DUPLEX_FULL;
884 bgmac_mac_speed(bgmac);
885 }
846 } 886 }
847} 887}
848 888
@@ -852,7 +892,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
852 struct bcma_device *core = bgmac->core; 892 struct bcma_device *core = bgmac->core;
853 struct bcma_bus *bus = core->bus; 893 struct bcma_bus *bus = core->bus;
854 struct bcma_chipinfo *ci = &bus->chipinfo; 894 struct bcma_chipinfo *ci = &bus->chipinfo;
855 u32 flags = 0; 895 u32 flags;
856 u32 iost; 896 u32 iost;
857 int i; 897 int i;
858 898
@@ -880,15 +920,21 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
880 (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) 920 (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
881 iost &= ~BGMAC_BCMA_IOST_ATTACHED; 921 iost &= ~BGMAC_BCMA_IOST_ATTACHED;
882 922
883 if (iost & BGMAC_BCMA_IOST_ATTACHED) { 923 /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
884 flags = BGMAC_BCMA_IOCTL_SW_CLKEN; 924 if (ci->id != BCMA_CHIP_ID_BCM4707) {
885 if (!bgmac->has_robosw) 925 flags = 0;
886 flags |= BGMAC_BCMA_IOCTL_SW_RESET; 926 if (iost & BGMAC_BCMA_IOST_ATTACHED) {
927 flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
928 if (!bgmac->has_robosw)
929 flags |= BGMAC_BCMA_IOCTL_SW_RESET;
930 }
931 bcma_core_enable(core, flags);
887 } 932 }
888 933
889 bcma_core_enable(core, flags); 934 /* Request Misc PLL for corerev > 2 */
890 935 if (core->id.rev > 2 &&
891 if (core->id.rev > 2) { 936 ci->id != BCMA_CHIP_ID_BCM4707 &&
937 ci->id != BCMA_CHIP_ID_BCM53018) {
892 bgmac_set(bgmac, BCMA_CLKCTLST, 938 bgmac_set(bgmac, BCMA_CLKCTLST,
893 BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ); 939 BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
894 bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 940 bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
@@ -954,7 +1000,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
954 BGMAC_CMDCFG_PROM | 1000 BGMAC_CMDCFG_PROM |
955 BGMAC_CMDCFG_NLC | 1001 BGMAC_CMDCFG_NLC |
956 BGMAC_CMDCFG_CFE | 1002 BGMAC_CMDCFG_CFE |
957 BGMAC_CMDCFG_SR, 1003 BGMAC_CMDCFG_SR(core->id.rev),
958 false); 1004 false);
959 bgmac->mac_speed = SPEED_UNKNOWN; 1005 bgmac->mac_speed = SPEED_UNKNOWN;
960 bgmac->mac_duplex = DUPLEX_UNKNOWN; 1006 bgmac->mac_duplex = DUPLEX_UNKNOWN;
@@ -997,7 +1043,7 @@ static void bgmac_enable(struct bgmac *bgmac)
997 1043
998 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); 1044 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
999 bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE), 1045 bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
1000 BGMAC_CMDCFG_SR, true); 1046 BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
1001 udelay(2); 1047 udelay(2);
1002 cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE; 1048 cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
1003 bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg); 1049 bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
@@ -1026,12 +1072,16 @@ static void bgmac_enable(struct bgmac *bgmac)
1026 break; 1072 break;
1027 } 1073 }
1028 1074
1029 rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL); 1075 if (ci->id != BCMA_CHIP_ID_BCM4707 &&
1030 rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK; 1076 ci->id != BCMA_CHIP_ID_BCM53018) {
1031 bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000; 1077 rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
1032 mdp = (bp_clk * 128 / 1000) - 3; 1078 rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
1033 rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT); 1079 bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
1034 bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl); 1080 1000000;
1081 mdp = (bp_clk * 128 / 1000) - 3;
1082 rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
1083 bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
1084 }
1035} 1085}
1036 1086
1037/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */ 1087/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
@@ -1423,6 +1473,27 @@ static int bgmac_probe(struct bcma_device *core)
1423 1473
1424 bgmac_chip_reset(bgmac); 1474 bgmac_chip_reset(bgmac);
1425 1475
1476 /* For Northstar, we have to take all GMAC core out of reset */
1477 if (core->id.id == BCMA_CHIP_ID_BCM4707 ||
1478 core->id.id == BCMA_CHIP_ID_BCM53018) {
1479 struct bcma_device *ns_core;
1480 int ns_gmac;
1481
1482 /* Northstar has 4 GMAC cores */
1483 for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
1484 /* As northstar requirement, we have to reset all GAMCs
1485 * before accessing one. bgmac_chip_reset() call
1486 * bcma_core_enable() for this core. Then the other
1487 * three GAMCs didn't reset. We do it here.
1488 */
1489 ns_core = bcma_find_core_unit(core->bus,
1490 BCMA_CORE_MAC_GBIT,
1491 ns_gmac);
1492 if (ns_core && !bcma_core_is_enabled(ns_core))
1493 bcma_core_enable(ns_core, 0);
1494 }
1495 }
1496
1426 err = bgmac_dma_alloc(bgmac); 1497 err = bgmac_dma_alloc(bgmac);
1427 if (err) { 1498 if (err) {
1428 bgmac_err(bgmac, "Unable to alloc memory for DMA\n"); 1499 bgmac_err(bgmac, "Unable to alloc memory for DMA\n");