phy.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. /*
  2. * drivers/net/ibm_newemac/phy.c
  3. *
  4. * Driver for PowerPC 4xx on-chip ethernet controller, PHY support.
  5. * Borrowed from sungem_phy.c, though I only kept the generic MII
  6. * driver for now.
  7. *
  8. * This file should be shared with other drivers or eventually
  9. * merged as the "low level" part of miilib
  10. *
  11. * Copyright 2007 Benjamin Herrenschmidt, IBM Corp.
  12. * <benh@kernel.crashing.org>
  13. *
  14. * Based on the arch/ppc version of the driver:
  15. *
  16. * (c) 2003, Benjamin Herrenscmidt (benh@kernel.crashing.org)
  17. * (c) 2004-2005, Eugene Surovegin <ebs@ebshome.net>
  18. *
  19. */
  20. #include <linux/module.h>
  21. #include <linux/kernel.h>
  22. #include <linux/types.h>
  23. #include <linux/netdevice.h>
  24. #include <linux/mii.h>
  25. #include <linux/ethtool.h>
  26. #include <linux/delay.h>
  27. #include "emac.h"
  28. #include "phy.h"
  29. static inline int phy_read(struct mii_phy *phy, int reg)
  30. {
  31. return phy->mdio_read(phy->dev, phy->address, reg);
  32. }
  33. static inline void phy_write(struct mii_phy *phy, int reg, int val)
  34. {
  35. phy->mdio_write(phy->dev, phy->address, reg, val);
  36. }
  37. int emac_mii_reset_phy(struct mii_phy *phy)
  38. {
  39. int val;
  40. int limit = 10000;
  41. val = phy_read(phy, MII_BMCR);
  42. val &= ~(BMCR_ISOLATE | BMCR_ANENABLE);
  43. val |= BMCR_RESET;
  44. phy_write(phy, MII_BMCR, val);
  45. udelay(300);
  46. while (limit--) {
  47. val = phy_read(phy, MII_BMCR);
  48. if (val >= 0 && (val & BMCR_RESET) == 0)
  49. break;
  50. udelay(10);
  51. }
  52. if ((val & BMCR_ISOLATE) && limit > 0)
  53. phy_write(phy, MII_BMCR, val & ~BMCR_ISOLATE);
  54. return limit <= 0;
  55. }
  56. static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise)
  57. {
  58. int ctl, adv;
  59. phy->autoneg = AUTONEG_ENABLE;
  60. phy->speed = SPEED_10;
  61. phy->duplex = DUPLEX_HALF;
  62. phy->pause = phy->asym_pause = 0;
  63. phy->advertising = advertise;
  64. ctl = phy_read(phy, MII_BMCR);
  65. if (ctl < 0)
  66. return ctl;
  67. ctl &= ~(BMCR_FULLDPLX | BMCR_SPEED100 | BMCR_SPEED1000 | BMCR_ANENABLE);
  68. /* First clear the PHY */
  69. phy_write(phy, MII_BMCR, ctl);
  70. /* Setup standard advertise */
  71. adv = phy_read(phy, MII_ADVERTISE);
  72. if (adv < 0)
  73. return adv;
  74. adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
  75. ADVERTISE_PAUSE_ASYM);
  76. if (advertise & ADVERTISED_10baseT_Half)
  77. adv |= ADVERTISE_10HALF;
  78. if (advertise & ADVERTISED_10baseT_Full)
  79. adv |= ADVERTISE_10FULL;
  80. if (advertise & ADVERTISED_100baseT_Half)
  81. adv |= ADVERTISE_100HALF;
  82. if (advertise & ADVERTISED_100baseT_Full)
  83. adv |= ADVERTISE_100FULL;
  84. if (advertise & ADVERTISED_Pause)
  85. adv |= ADVERTISE_PAUSE_CAP;
  86. if (advertise & ADVERTISED_Asym_Pause)
  87. adv |= ADVERTISE_PAUSE_ASYM;
  88. phy_write(phy, MII_ADVERTISE, adv);
  89. if (phy->features &
  90. (SUPPORTED_1000baseT_Full | SUPPORTED_1000baseT_Half)) {
  91. adv = phy_read(phy, MII_CTRL1000);
  92. if (adv < 0)
  93. return adv;
  94. adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
  95. if (advertise & ADVERTISED_1000baseT_Full)
  96. adv |= ADVERTISE_1000FULL;
  97. if (advertise & ADVERTISED_1000baseT_Half)
  98. adv |= ADVERTISE_1000HALF;
  99. phy_write(phy, MII_CTRL1000, adv);
  100. }
  101. /* Start/Restart aneg */
  102. ctl = phy_read(phy, MII_BMCR);
  103. ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
  104. phy_write(phy, MII_BMCR, ctl);
  105. return 0;
  106. }
  107. static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd)
  108. {
  109. int ctl;
  110. phy->autoneg = AUTONEG_DISABLE;
  111. phy->speed = speed;
  112. phy->duplex = fd;
  113. phy->pause = phy->asym_pause = 0;
  114. ctl = phy_read(phy, MII_BMCR);
  115. if (ctl < 0)
  116. return ctl;
  117. ctl &= ~(BMCR_FULLDPLX | BMCR_SPEED100 | BMCR_SPEED1000 | BMCR_ANENABLE);
  118. /* First clear the PHY */
  119. phy_write(phy, MII_BMCR, ctl | BMCR_RESET);
  120. /* Select speed & duplex */
  121. switch (speed) {
  122. case SPEED_10:
  123. break;
  124. case SPEED_100:
  125. ctl |= BMCR_SPEED100;
  126. break;
  127. case SPEED_1000:
  128. ctl |= BMCR_SPEED1000;
  129. break;
  130. default:
  131. return -EINVAL;
  132. }
  133. if (fd == DUPLEX_FULL)
  134. ctl |= BMCR_FULLDPLX;
  135. phy_write(phy, MII_BMCR, ctl);
  136. return 0;
  137. }
  138. static int genmii_poll_link(struct mii_phy *phy)
  139. {
  140. int status;
  141. /* Clear latched value with dummy read */
  142. phy_read(phy, MII_BMSR);
  143. status = phy_read(phy, MII_BMSR);
  144. if (status < 0 || (status & BMSR_LSTATUS) == 0)
  145. return 0;
  146. if (phy->autoneg == AUTONEG_ENABLE && !(status & BMSR_ANEGCOMPLETE))
  147. return 0;
  148. return 1;
  149. }
  150. static int genmii_read_link(struct mii_phy *phy)
  151. {
  152. if (phy->autoneg == AUTONEG_ENABLE) {
  153. int glpa = 0;
  154. int lpa = phy_read(phy, MII_LPA) & phy_read(phy, MII_ADVERTISE);
  155. if (lpa < 0)
  156. return lpa;
  157. if (phy->features &
  158. (SUPPORTED_1000baseT_Full | SUPPORTED_1000baseT_Half)) {
  159. int adv = phy_read(phy, MII_CTRL1000);
  160. glpa = phy_read(phy, MII_STAT1000);
  161. if (glpa < 0 || adv < 0)
  162. return adv;
  163. glpa &= adv << 2;
  164. }
  165. phy->speed = SPEED_10;
  166. phy->duplex = DUPLEX_HALF;
  167. phy->pause = phy->asym_pause = 0;
  168. if (glpa & (LPA_1000FULL | LPA_1000HALF)) {
  169. phy->speed = SPEED_1000;
  170. if (glpa & LPA_1000FULL)
  171. phy->duplex = DUPLEX_FULL;
  172. } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
  173. phy->speed = SPEED_100;
  174. if (lpa & LPA_100FULL)
  175. phy->duplex = DUPLEX_FULL;
  176. } else if (lpa & LPA_10FULL)
  177. phy->duplex = DUPLEX_FULL;
  178. if (phy->duplex == DUPLEX_FULL) {
  179. phy->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
  180. phy->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
  181. }
  182. } else {
  183. int bmcr = phy_read(phy, MII_BMCR);
  184. if (bmcr < 0)
  185. return bmcr;
  186. if (bmcr & BMCR_FULLDPLX)
  187. phy->duplex = DUPLEX_FULL;
  188. else
  189. phy->duplex = DUPLEX_HALF;
  190. if (bmcr & BMCR_SPEED1000)
  191. phy->speed = SPEED_1000;
  192. else if (bmcr & BMCR_SPEED100)
  193. phy->speed = SPEED_100;
  194. else
  195. phy->speed = SPEED_10;
  196. phy->pause = phy->asym_pause = 0;
  197. }
  198. return 0;
  199. }
  200. /* Generic implementation for most 10/100/1000 PHYs */
  201. static struct mii_phy_ops generic_phy_ops = {
  202. .setup_aneg = genmii_setup_aneg,
  203. .setup_forced = genmii_setup_forced,
  204. .poll_link = genmii_poll_link,
  205. .read_link = genmii_read_link
  206. };
  207. static struct mii_phy_def genmii_phy_def = {
  208. .phy_id = 0x00000000,
  209. .phy_id_mask = 0x00000000,
  210. .name = "Generic MII",
  211. .ops = &generic_phy_ops
  212. };
  213. /* CIS8201 */
  214. #define MII_CIS8201_10BTCSR 0x16
  215. #define TENBTCSR_ECHO_DISABLE 0x2000
  216. #define MII_CIS8201_EPCR 0x17
  217. #define EPCR_MODE_MASK 0x3000
  218. #define EPCR_GMII_MODE 0x0000
  219. #define EPCR_RGMII_MODE 0x1000
  220. #define EPCR_TBI_MODE 0x2000
  221. #define EPCR_RTBI_MODE 0x3000
  222. #define MII_CIS8201_ACSR 0x1c
  223. #define ACSR_PIN_PRIO_SELECT 0x0004
  224. static int cis8201_init(struct mii_phy *phy)
  225. {
  226. int epcr;
  227. epcr = phy_read(phy, MII_CIS8201_EPCR);
  228. if (epcr < 0)
  229. return epcr;
  230. epcr &= ~EPCR_MODE_MASK;
  231. switch (phy->mode) {
  232. case PHY_MODE_TBI:
  233. epcr |= EPCR_TBI_MODE;
  234. break;
  235. case PHY_MODE_RTBI:
  236. epcr |= EPCR_RTBI_MODE;
  237. break;
  238. case PHY_MODE_GMII:
  239. epcr |= EPCR_GMII_MODE;
  240. break;
  241. case PHY_MODE_RGMII:
  242. default:
  243. epcr |= EPCR_RGMII_MODE;
  244. }
  245. phy_write(phy, MII_CIS8201_EPCR, epcr);
  246. /* MII regs override strap pins */
  247. phy_write(phy, MII_CIS8201_ACSR,
  248. phy_read(phy, MII_CIS8201_ACSR) | ACSR_PIN_PRIO_SELECT);
  249. /* Disable TX_EN -> CRS echo mode, otherwise 10/HDX doesn't work */
  250. phy_write(phy, MII_CIS8201_10BTCSR,
  251. phy_read(phy, MII_CIS8201_10BTCSR) | TENBTCSR_ECHO_DISABLE);
  252. return 0;
  253. }
  254. static struct mii_phy_ops cis8201_phy_ops = {
  255. .init = cis8201_init,
  256. .setup_aneg = genmii_setup_aneg,
  257. .setup_forced = genmii_setup_forced,
  258. .poll_link = genmii_poll_link,
  259. .read_link = genmii_read_link
  260. };
  261. static struct mii_phy_def cis8201_phy_def = {
  262. .phy_id = 0x000fc410,
  263. .phy_id_mask = 0x000ffff0,
  264. .name = "CIS8201 Gigabit Ethernet",
  265. .ops = &cis8201_phy_ops
  266. };
  267. static struct mii_phy_def bcm5248_phy_def = {
  268. .phy_id = 0x0143bc00,
  269. .phy_id_mask = 0x0ffffff0,
  270. .name = "BCM5248 10/100 SMII Ethernet",
  271. .ops = &generic_phy_ops
  272. };
  273. static int m88e1111_init(struct mii_phy *phy)
  274. {
  275. pr_debug("%s: Marvell 88E1111 Ethernet\n", __FUNCTION__);
  276. phy_write(phy, 0x14, 0x0ce3);
  277. phy_write(phy, 0x18, 0x4101);
  278. phy_write(phy, 0x09, 0x0e00);
  279. phy_write(phy, 0x04, 0x01e1);
  280. phy_write(phy, 0x00, 0x9140);
  281. phy_write(phy, 0x00, 0x1140);
  282. return 0;
  283. }
  284. static int et1011c_init(struct mii_phy *phy)
  285. {
  286. u16 reg_short;
  287. reg_short = (u16)(phy_read(phy, 0x16));
  288. reg_short &= ~(0x7);
  289. reg_short |= 0x6; /* RGMII Trace Delay*/
  290. phy_write(phy, 0x16, reg_short);
  291. reg_short = (u16)(phy_read(phy, 0x17));
  292. reg_short &= ~(0x40);
  293. phy_write(phy, 0x17, reg_short);
  294. phy_write(phy, 0x1c, 0x74f0);
  295. return 0;
  296. }
  297. static struct mii_phy_ops et1011c_phy_ops = {
  298. .init = et1011c_init,
  299. .setup_aneg = genmii_setup_aneg,
  300. .setup_forced = genmii_setup_forced,
  301. .poll_link = genmii_poll_link,
  302. .read_link = genmii_read_link
  303. };
  304. static struct mii_phy_def et1011c_phy_def = {
  305. .phy_id = 0x0282f000,
  306. .phy_id_mask = 0x0fffff00,
  307. .name = "ET1011C Gigabit Ethernet",
  308. .ops = &et1011c_phy_ops
  309. };
  310. static struct mii_phy_ops m88e1111_phy_ops = {
  311. .init = m88e1111_init,
  312. .setup_aneg = genmii_setup_aneg,
  313. .setup_forced = genmii_setup_forced,
  314. .poll_link = genmii_poll_link,
  315. .read_link = genmii_read_link
  316. };
  317. static struct mii_phy_def m88e1111_phy_def = {
  318. .phy_id = 0x01410CC0,
  319. .phy_id_mask = 0x0ffffff0,
  320. .name = "Marvell 88E1111 Ethernet",
  321. .ops = &m88e1111_phy_ops,
  322. };
  323. static struct mii_phy_def *mii_phy_table[] = {
  324. &et1011c_phy_def,
  325. &cis8201_phy_def,
  326. &bcm5248_phy_def,
  327. &m88e1111_phy_def,
  328. &genmii_phy_def,
  329. NULL
  330. };
  331. int emac_mii_phy_probe(struct mii_phy *phy, int address)
  332. {
  333. struct mii_phy_def *def;
  334. int i;
  335. u32 id;
  336. phy->autoneg = AUTONEG_DISABLE;
  337. phy->advertising = 0;
  338. phy->address = address;
  339. phy->speed = SPEED_10;
  340. phy->duplex = DUPLEX_HALF;
  341. phy->pause = phy->asym_pause = 0;
  342. /* Take PHY out of isolate mode and reset it. */
  343. if (emac_mii_reset_phy(phy))
  344. return -ENODEV;
  345. /* Read ID and find matching entry */
  346. id = (phy_read(phy, MII_PHYSID1) << 16) | phy_read(phy, MII_PHYSID2);
  347. for (i = 0; (def = mii_phy_table[i]) != NULL; i++)
  348. if ((id & def->phy_id_mask) == def->phy_id)
  349. break;
  350. /* Should never be NULL (we have a generic entry), but... */
  351. if (!def)
  352. return -ENODEV;
  353. phy->def = def;
  354. /* Determine PHY features if needed */
  355. phy->features = def->features;
  356. if (!phy->features) {
  357. u16 bmsr = phy_read(phy, MII_BMSR);
  358. if (bmsr & BMSR_ANEGCAPABLE)
  359. phy->features |= SUPPORTED_Autoneg;
  360. if (bmsr & BMSR_10HALF)
  361. phy->features |= SUPPORTED_10baseT_Half;
  362. if (bmsr & BMSR_10FULL)
  363. phy->features |= SUPPORTED_10baseT_Full;
  364. if (bmsr & BMSR_100HALF)
  365. phy->features |= SUPPORTED_100baseT_Half;
  366. if (bmsr & BMSR_100FULL)
  367. phy->features |= SUPPORTED_100baseT_Full;
  368. if (bmsr & BMSR_ESTATEN) {
  369. u16 esr = phy_read(phy, MII_ESTATUS);
  370. if (esr & ESTATUS_1000_TFULL)
  371. phy->features |= SUPPORTED_1000baseT_Full;
  372. if (esr & ESTATUS_1000_THALF)
  373. phy->features |= SUPPORTED_1000baseT_Half;
  374. }
  375. phy->features |= SUPPORTED_MII;
  376. }
  377. /* Setup default advertising */
  378. phy->advertising = phy->features;
  379. return 0;
  380. }
  381. MODULE_LICENSE("GPL");