layerscape: add 64b/32b target for ls1043ardb device
[openwrt/staging/wigyori.git] / target / linux / layerscape / patches-4.4 / 7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch
1 From afcfdda960da9d9ad4c4d21c7dd0cc7791cf36c7 Mon Sep 17 00:00:00 2001
2 From: Madalin Bucur <madalin.bucur@freescale.com>
3 Date: Wed, 4 May 2016 19:24:53 +0300
4 Subject: [PATCH 29/70] fmd: SGMII PCS needs to be reprogrammed after sleep
5
6 Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
7 ---
8 drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 6 ++
9 .../freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c | 1 +
10 .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c | 12 ++++
11 .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h | 1 +
12 .../freescale/sdk_fman/Peripherals/FM/MAC/memac.c | 58 +++++++++++---------
13 .../freescale/sdk_fman/Peripherals/FM/MAC/tgec.c | 1 +
14 .../sdk_fman/inc/Peripherals/fm_mac_ext.h | 13 +++++
15 .../sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h | 2 +
16 .../freescale/sdk_fman/src/wrapper/lnxwrp_fm.c | 14 +++++
17 9 files changed, 83 insertions(+), 25 deletions(-)
18
19 --- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
20 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
21 @@ -175,6 +175,12 @@ static int dpaa_resume(struct device *de
22 priv = netdev_priv(net_dev);
23 mac_dev = priv->mac_dev;
24
25 + err = fm_mac_resume(mac_dev->get_mac_handle(mac_dev));
26 + if (err) {
27 + netdev_err(net_dev, "fm_mac_resume = %d\n", err);
28 + goto resume_failed;
29 + }
30 +
31 err = fm_port_resume(mac_dev->port_dev[TX]);
32 if (err) {
33 netdev_err(net_dev, "fm_port_resume(TX) = %d\n", err);
34 --- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c
35 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c
36 @@ -1371,6 +1371,7 @@ static void InitFmMacControllerDriver(t_
37
38 p_FmMacControllerDriver->f_FM_MAC_Enable = DtsecEnable;
39 p_FmMacControllerDriver->f_FM_MAC_Disable = DtsecDisable;
40 + p_FmMacControllerDriver->f_FM_MAC_Resume = NULL;
41
42 p_FmMacControllerDriver->f_FM_MAC_SetException = DtsecSetException;
43
44 --- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c
45 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c
46 @@ -299,6 +299,18 @@ t_Error FM_MAC_Disable (t_Handle h_FmMac
47 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
48 }
49
50 +t_Error FM_MAC_Resume (t_Handle h_FmMac)
51 +{
52 + t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
53 +
54 + SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
55 +
56 + if (p_FmMacControllerDriver->f_FM_MAC_Resume)
57 + return p_FmMacControllerDriver->f_FM_MAC_Resume(h_FmMac);
58 +
59 + return E_OK;
60 +}
61 +
62 /* ......................................................................... */
63
64 t_Error FM_MAC_Enable1588TimeStamp (t_Handle h_FmMac)
65 --- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h
66 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h
67 @@ -91,6 +91,7 @@ typedef struct {
68
69 t_Error (*f_FM_MAC_Enable) (t_Handle h_FmMac, e_CommMode mode);
70 t_Error (*f_FM_MAC_Disable) (t_Handle h_FmMac, e_CommMode mode);
71 + t_Error (*f_FM_MAC_Resume) (t_Handle h_FmMac);
72 t_Error (*f_FM_MAC_Enable1588TimeStamp) (t_Handle h_FmMac);
73 t_Error (*f_FM_MAC_Disable1588TimeStamp) (t_Handle h_FmMac);
74 t_Error (*f_FM_MAC_Reset) (t_Handle h_FmMac, bool wait);
75 --- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c
76 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c
77 @@ -812,6 +812,37 @@ static uint16_t MemacGetMaxFrameLength(t
78 return fman_memac_get_max_frame_len(p_Memac->p_MemMap);
79 }
80
81 +static t_Error MemacInitInternalPhy(t_Handle h_Memac)
82 +{
83 + t_Memac *p_Memac = (t_Memac *)h_Memac;
84 + uint8_t i, phyAddr;
85 +
86 + if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII)
87 + {
88 + /* Configure internal SGMII PHY */
89 + if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
90 + SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR);
91 + else
92 + SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR);
93 + }
94 + else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII)
95 + {
96 + /* Configure 4 internal SGMII PHYs */
97 + for (i = 0; i < 4; i++)
98 + {
99 + /* QSGMII PHY address occupies 3 upper bits of 5-bit
100 + phyAddress; the lower 2 bits are used to extend
101 + register address space and access each one of 4
102 + ports inside QSGMII. */
103 + phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i);
104 + if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
105 + SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr);
106 + else
107 + SetupSgmiiInternalPhy(p_Memac, phyAddr);
108 + }
109 + }
110 + return E_OK;
111 +}
112
113 /*****************************************************************************/
114 /* mEMAC Init & Free API */
115 @@ -825,7 +856,6 @@ static t_Error MemacInit(t_Handle h_Mema
116 struct memac_cfg *p_MemacDriverParam;
117 enum enet_interface enet_interface;
118 enum enet_speed enet_speed;
119 - uint8_t i, phyAddr;
120 t_EnetAddr ethAddr;
121 e_FmMacType portType;
122 t_Error err;
123 @@ -887,30 +917,7 @@ static t_Error MemacInit(t_Handle h_Mema
124 }
125 #endif /* FM_RX_FIFO_CORRUPT_ERRATA_10GMAC_A006320 */
126
127 - if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII)
128 - {
129 - /* Configure internal SGMII PHY */
130 - if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
131 - SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR);
132 - else
133 - SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR);
134 - }
135 - else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII)
136 - {
137 - /* Configure 4 internal SGMII PHYs */
138 - for (i = 0; i < 4; i++)
139 - {
140 - /* QSGMII PHY address occupies 3 upper bits of 5-bit
141 - phyAddress; the lower 2 bits are used to extend
142 - register address space and access each one of 4
143 - ports inside QSGMII. */
144 - phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i);
145 - if (p_Memac->enetMode & ENET_IF_SGMII_BASEX)
146 - SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr);
147 - else
148 - SetupSgmiiInternalPhy(p_Memac, phyAddr);
149 - }
150 - }
151 + MemacInitInternalPhy(h_Memac);
152
153 /* Max Frame Length */
154 err = FmSetMacMaxFrame(p_Memac->fmMacControllerDriver.h_Fm,
155 @@ -1008,6 +1015,7 @@ static void InitFmMacControllerDriver(t_
156
157 p_FmMacControllerDriver->f_FM_MAC_Enable = MemacEnable;
158 p_FmMacControllerDriver->f_FM_MAC_Disable = MemacDisable;
159 + p_FmMacControllerDriver->f_FM_MAC_Resume = MemacInitInternalPhy;
160
161 p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = MemacSetTxAutoPauseFrames;
162 p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = MemacSetTxPauseFrames;
163 --- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c
164 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c
165 @@ -897,6 +897,7 @@ static void InitFmMacControllerDriver(t_
166
167 p_FmMacControllerDriver->f_FM_MAC_Enable = TgecEnable;
168 p_FmMacControllerDriver->f_FM_MAC_Disable = TgecDisable;
169 + p_FmMacControllerDriver->f_FM_MAC_Resume = NULL;
170
171 p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = TgecTxMacPause;
172 p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = TgecSetTxPauseFrames;
173 --- a/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h
174 +++ b/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h
175 @@ -467,6 +467,19 @@ t_Error FM_MAC_Enable(t_Handle h_FmMac,
176 t_Error FM_MAC_Disable(t_Handle h_FmMac, e_CommMode mode);
177
178 /**************************************************************************//**
179 + @Function FM_MAC_Resume
180 +
181 + @Description Re-init the MAC after suspend
182 +
183 + @Param[in] h_FmMac A handle to a FM MAC Module.
184 +
185 + @Return E_OK on success; Error code otherwise.
186 +
187 + @Cautions Allowed only following FM_MAC_Init().
188 +*//***************************************************************************/
189 +t_Error FM_MAC_Resume(t_Handle h_FmMac);
190 +
191 +/**************************************************************************//**
192 @Function FM_MAC_Enable1588TimeStamp
193
194 @Description Enables the TSU operation.
195 --- a/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
196 +++ b/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
197 @@ -765,6 +765,8 @@ int fm_mac_enable(struct fm_mac_dev *fm_
198
199 int fm_mac_disable(struct fm_mac_dev *fm_mac_dev);
200
201 +int fm_mac_resume(struct fm_mac_dev *fm_mac_dev);
202 +
203 int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev,
204 bool enable);
205
206 --- a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
207 +++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
208 @@ -1733,6 +1733,20 @@ int fm_mac_disable(struct fm_mac_dev *fm
209 }
210 EXPORT_SYMBOL(fm_mac_disable);
211
212 +int fm_mac_resume(struct fm_mac_dev *fm_mac_dev)
213 +{
214 + int _errno;
215 + t_Error err;
216 +
217 + err = FM_MAC_Resume(fm_mac_dev);
218 + _errno = -GET_ERROR_TYPE(err);
219 + if (unlikely(_errno < 0))
220 + pr_err("FM_MAC_Resume() = 0x%08x\n", err);
221 +
222 + return _errno;
223 +}
224 +EXPORT_SYMBOL(fm_mac_resume);
225 +
226 int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev,
227 bool enable)
228 {