Commit 93272e07d8539cddce9a2a17b7b0de1326957599

Authored by Jean-Christophe PLAGNIOL-VILLARD
Committed by David S. Miller
1 parent 0b545a6291

net: add micrel KSZ8873MLL switch support

this will allow to detect the link between the switch and the soc

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: netdev@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 2 changed files with 45 additions and 0 deletions Side-by-side Diff

drivers/net/phy/micrel.c
... ... @@ -127,6 +127,39 @@
127 127 return 0;
128 128 }
129 129  
  130 +#define KSZ8873MLL_GLOBAL_CONTROL_4 0x06
  131 +#define KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX (1 << 6)
  132 +#define KSZ8873MLL_GLOBAL_CONTROL_4_SPEED (1 << 4)
  133 +int ksz8873mll_read_status(struct phy_device *phydev)
  134 +{
  135 + int regval;
  136 +
  137 + /* dummy read */
  138 + regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
  139 +
  140 + regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4);
  141 +
  142 + if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX)
  143 + phydev->duplex = DUPLEX_HALF;
  144 + else
  145 + phydev->duplex = DUPLEX_FULL;
  146 +
  147 + if (regval & KSZ8873MLL_GLOBAL_CONTROL_4_SPEED)
  148 + phydev->speed = SPEED_10;
  149 + else
  150 + phydev->speed = SPEED_100;
  151 +
  152 + phydev->link = 1;
  153 + phydev->pause = phydev->asym_pause = 0;
  154 +
  155 + return 0;
  156 +}
  157 +
  158 +static int ksz8873mll_config_aneg(struct phy_device *phydev)
  159 +{
  160 + return 0;
  161 +}
  162 +
130 163 static struct phy_driver ksphy_driver[] = {
131 164 {
132 165 .phy_id = PHY_ID_KS8737,
... ... @@ -204,6 +237,16 @@
204 237 .ack_interrupt = kszphy_ack_interrupt,
205 238 .config_intr = ksz9021_config_intr,
206 239 .driver = { .owner = THIS_MODULE, },
  240 +}, {
  241 + .phy_id = PHY_ID_KSZ8873MLL,
  242 + .phy_id_mask = 0x00fffff0,
  243 + .name = "Micrel KSZ8873MLL Switch",
  244 + .features = (SUPPORTED_Pause | SUPPORTED_Asym_Pause),
  245 + .flags = PHY_HAS_MAGICANEG,
  246 + .config_init = kszphy_config_init,
  247 + .config_aneg = ksz8873mll_config_aneg,
  248 + .read_status = ksz8873mll_read_status,
  249 + .driver = { .owner = THIS_MODULE, },
207 250 } };
208 251  
209 252 static int __init ksphy_init(void)
... ... @@ -232,6 +275,7 @@
232 275 { PHY_ID_KSZ8021, 0x00ffffff },
233 276 { PHY_ID_KSZ8041, 0x00fffff0 },
234 277 { PHY_ID_KSZ8051, 0x00fffff0 },
  278 + { PHY_ID_KSZ8873MLL, 0x00fffff0 },
235 279 { }
236 280 };
237 281  
include/linux/micrel_phy.h
... ... @@ -15,6 +15,7 @@
15 15  
16 16 #define MICREL_PHY_ID_MASK 0x00fffff0
17 17  
  18 +#define PHY_ID_KSZ8873MLL 0x000e7237
18 19 #define PHY_ID_KSZ9021 0x00221610
19 20 #define PHY_ID_KS8737 0x00221720
20 21 #define PHY_ID_KSZ8021 0x00221555