aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.12/772-bgmac-add-supprot-for-BCM4707.patch
blob: eb1708a2c4e4dd395635eeeb9ff22fccb6202ffc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
bgmac: add supprot for BCM4707

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>

--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -887,6 +887,8 @@ static void bgmac_speed(struct bgmac *bg
 		set |= BGMAC_CMDCFG_ES_100;
 	if (speed & BGMAC_SPEED_1000)
 		set |= BGMAC_CMDCFG_ES_1000;
+	if (speed & BGMAC_SPEED_2500)
+		set |= BGMAC_CMDCFG_ES_2500;
 	if (!bgmac->full_duplex)
 		set |= BGMAC_CMDCFG_HD;
 	bgmac_cmdcfg_maskset(bgmac, mask, set, true);
@@ -894,13 +896,28 @@ static void bgmac_speed(struct bgmac *bg
 
 static void bgmac_miiconfig(struct bgmac *bgmac)
 {
-	u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
-			BGMAC_DS_MM_SHIFT;
-	if (imode == 0 || imode == 1) {
-		if (bgmac->autoneg)
-			bgmac_speed(bgmac, BGMAC_SPEED_100);
-		else
+	struct bcma_device *core = bgmac->core;
+	struct bcma_chipinfo *ci = &core->bus->chipinfo;
+
+	if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+	    ci->id == BCMA_CHIP_ID_BCM53018) {
+		if (bgmac->autoneg) {
+			bcma_awrite32(core, BCMA_IOCTL,
+				      bcma_aread32(core, BCMA_IOCTL) | 0x44);
+
+			bgmac_speed(bgmac, BGMAC_SPEED_2500);
+		} else {
 			bgmac_speed(bgmac, bgmac->speed);
+		}
+	} else {
+		u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
+			    BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
+		if (imode == 0 || imode == 1) {
+			if (bgmac->autoneg)
+				bgmac_speed(bgmac, BGMAC_SPEED_100);
+			else
+				bgmac_speed(bgmac, bgmac->speed);
+		}
 	}
 }
 
@@ -946,7 +963,8 @@ static void bgmac_chip_reset(struct bgma
 
 	bcma_core_enable(core, flags);
 
-	if (core->id.rev > 2) {
+	if (core->id.rev > 2 && ci->id != BCMA_CHIP_ID_BCM4707 &&
+	    ci->id != BCMA_CHIP_ID_BCM53018) {
 		bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
 		bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
 				 1000);
@@ -967,10 +985,13 @@ static void bgmac_chip_reset(struct bgma
 			et_swtype &= 0x0f;
 			et_swtype <<= 4;
 			sw_type = et_swtype;
-		} else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
+		} else if (ci->id == BCMA_CHIP_ID_BCM5357 &&
+			   ci->pkg == BCMA_PKG_ID_BCM5358) {
 			sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
-		} else if ((ci->id != BCMA_CHIP_ID_BCM53572 && ci->pkg == 10) ||
-			   (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9)) {
+		} else if ((ci->id != BCMA_CHIP_ID_BCM53572 &&
+			    ci->pkg == BCMA_PKG_ID_BCM47186) ||
+			   (ci->id == BCMA_CHIP_ID_BCM53572 &&
+			    ci->pkg == BCMA_PKG_ID_BCM47188)) {
 			sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
 				  BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
 		}
@@ -1077,12 +1098,15 @@ static void bgmac_enable(struct bgmac *b
 		break;
 	}
 
-	rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
-	rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
-	bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
-	mdp = (bp_clk * 128 / 1000) - 3;
-	rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
-	bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
+	if (ci->id != BCMA_CHIP_ID_BCM4707 &&
+	    ci->id != BCMA_CHIP_ID_BCM53018) {
+		rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+		rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+		bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
+		mdp = (bp_clk * 128 / 1000) - 3;
+		rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
+		bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
+	}
 }
 
 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
--- a/drivers/net/ethernet/broadcom/bgmac.h
+++ b/drivers/net/ethernet/broadcom/bgmac.h
@@ -185,6 +185,7 @@
 #define   BGMAC_CMDCFG_ES_10			0x00000000
 #define   BGMAC_CMDCFG_ES_100			0x00000004
 #define   BGMAC_CMDCFG_ES_1000			0x00000008
+#define   BGMAC_CMDCFG_ES_2500			0x0000000C
 #define  BGMAC_CMDCFG_PROM			0x00000010	/* Set to activate promiscuous mode */
 #define  BGMAC_CMDCFG_PAD_EN			0x00000020
 #define  BGMAC_CMDCFG_CF			0x00000040
@@ -345,6 +346,7 @@
 #define BGMAC_SPEED_10				0x0001
 #define BGMAC_SPEED_100				0x0002
 #define BGMAC_SPEED_1000			0x0004
+#define BGMAC_SPEED_2500			0x0008
 
 #define BGMAC_WEIGHT	64