Skip to content

Commit abc3349

Browse files
Greg Ungererkuba-moo
authored andcommitted
net: fec: make use of MDIO C45 quirk
Not all fec MDIO bus drivers support C45 mode transactions. The older fec hardware block in many ColdFire SoCs does not appear to support them, at least according to most of the different ColdFire SoC reference manuals. The bits used to generate C45 access on the iMX parts, in the OP field of the MMFR register, are documented as generating non-compliant MII frames (it is not documented as to exactly how they are non-compliant). Commit 8d03ad1 ("net: fec: Separate C22 and C45 transactions") means the fec driver will always register c45 MDIO read and write methods. During probe these will always be accessed now generating non-compliant MII accesses on ColdFire based devices. Add a quirk define, FEC_QUIRK_HAS_MDIO_C45, that can be used to distinguish silicon that supports MDIO C45 framing or not. Add this to all the existing iMX quirks, so they will be behave as they do now (*). (*) it seems that some iMX parts may not support C45 transactions either. The iMX25 and iMX50 Reference Manuals contain similar wording to the ColdFire Reference Manuals on this. Fixes: 8d03ad1 ("net: fec: Separate C22 and C45 transactions") Signed-off-by: Greg Ungerer <[email protected]> Reviewed-by: Wei Fang <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent cbeb1c1 commit abc3349

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

drivers/net/ethernet/freescale/fec.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,11 @@ struct bufdesc_ex {
507507
/* i.MX6Q adds pm_qos support */
508508
#define FEC_QUIRK_HAS_PMQOS BIT(23)
509509

510+
/* Not all FEC hardware block MDIOs support accesses in C45 mode.
511+
* Older blocks in the ColdFire parts do not support it.
512+
*/
513+
#define FEC_QUIRK_HAS_MDIO_C45 BIT(24)
514+
510515
struct bufdesc_prop {
511516
int qid;
512517
/* Address of Rx and Tx buffers */

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,30 +100,32 @@ struct fec_devinfo {
100100

101101
static const struct fec_devinfo fec_imx25_info = {
102102
.quirks = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR |
103-
FEC_QUIRK_HAS_FRREG,
103+
FEC_QUIRK_HAS_FRREG | FEC_QUIRK_HAS_MDIO_C45,
104104
};
105105

106106
static const struct fec_devinfo fec_imx27_info = {
107-
.quirks = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG,
107+
.quirks = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG |
108+
FEC_QUIRK_HAS_MDIO_C45,
108109
};
109110

110111
static const struct fec_devinfo fec_imx28_info = {
111112
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME |
112113
FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC |
113114
FEC_QUIRK_HAS_FRREG | FEC_QUIRK_CLEAR_SETUP_MII |
114-
FEC_QUIRK_NO_HARD_RESET,
115+
FEC_QUIRK_NO_HARD_RESET | FEC_QUIRK_HAS_MDIO_C45,
115116
};
116117

117118
static const struct fec_devinfo fec_imx6q_info = {
118119
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
119120
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
120121
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358 |
121122
FEC_QUIRK_HAS_RACC | FEC_QUIRK_CLEAR_SETUP_MII |
122-
FEC_QUIRK_HAS_PMQOS,
123+
FEC_QUIRK_HAS_PMQOS | FEC_QUIRK_HAS_MDIO_C45,
123124
};
124125

125126
static const struct fec_devinfo fec_mvf600_info = {
126-
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_RACC,
127+
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_RACC |
128+
FEC_QUIRK_HAS_MDIO_C45,
127129
};
128130

129131
static const struct fec_devinfo fec_imx6x_info = {
@@ -132,15 +134,17 @@ static const struct fec_devinfo fec_imx6x_info = {
132134
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
133135
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
134136
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
135-
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES,
137+
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
138+
FEC_QUIRK_HAS_MDIO_C45,
136139
};
137140

138141
static const struct fec_devinfo fec_imx6ul_info = {
139142
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
140143
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
141144
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR007885 |
142145
FEC_QUIRK_BUG_CAPTURE | FEC_QUIRK_HAS_RACC |
143-
FEC_QUIRK_HAS_COALESCE | FEC_QUIRK_CLEAR_SETUP_MII,
146+
FEC_QUIRK_HAS_COALESCE | FEC_QUIRK_CLEAR_SETUP_MII |
147+
FEC_QUIRK_HAS_MDIO_C45,
144148
};
145149

146150
static const struct fec_devinfo fec_imx8mq_info = {
@@ -150,7 +154,8 @@ static const struct fec_devinfo fec_imx8mq_info = {
150154
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
151155
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
152156
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
153-
FEC_QUIRK_HAS_EEE | FEC_QUIRK_WAKEUP_FROM_INT2,
157+
FEC_QUIRK_HAS_EEE | FEC_QUIRK_WAKEUP_FROM_INT2 |
158+
FEC_QUIRK_HAS_MDIO_C45,
154159
};
155160

156161
static const struct fec_devinfo fec_imx8qm_info = {
@@ -160,14 +165,15 @@ static const struct fec_devinfo fec_imx8qm_info = {
160165
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
161166
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
162167
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
163-
FEC_QUIRK_DELAYED_CLKS_SUPPORT,
168+
FEC_QUIRK_DELAYED_CLKS_SUPPORT | FEC_QUIRK_HAS_MDIO_C45,
164169
};
165170

166171
static const struct fec_devinfo fec_s32v234_info = {
167172
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
168173
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
169174
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
170-
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE,
175+
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
176+
FEC_QUIRK_HAS_MDIO_C45,
171177
};
172178

173179
static struct platform_device_id fec_devtype[] = {
@@ -2434,8 +2440,10 @@ static int fec_enet_mii_init(struct platform_device *pdev)
24342440
fep->mii_bus->name = "fec_enet_mii_bus";
24352441
fep->mii_bus->read = fec_enet_mdio_read_c22;
24362442
fep->mii_bus->write = fec_enet_mdio_write_c22;
2437-
fep->mii_bus->read_c45 = fec_enet_mdio_read_c45;
2438-
fep->mii_bus->write_c45 = fec_enet_mdio_write_c45;
2443+
if (fep->quirks & FEC_QUIRK_HAS_MDIO_C45) {
2444+
fep->mii_bus->read_c45 = fec_enet_mdio_read_c45;
2445+
fep->mii_bus->write_c45 = fec_enet_mdio_write_c45;
2446+
}
24392447
snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
24402448
pdev->name, fep->dev_id + 1);
24412449
fep->mii_bus->priv = fep;

0 commit comments

Comments
 (0)