fs_enet-mii.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. /*
  2. * Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
  3. *
  4. * Copyright (c) 2003 Intracom S.A.
  5. * by Pantelis Antoniou <panto@intracom.gr>
  6. *
  7. * 2005 (c) MontaVista Software, Inc.
  8. * Vitaly Bordug <vbordug@ru.mvista.com>
  9. *
  10. * Heavily based on original FEC driver by Dan Malek <dan@embeddededge.com>
  11. * and modifications by Joakim Tjernlund <joakim.tjernlund@lumentis.se>
  12. *
  13. * This file is licensed under the terms of the GNU General Public License
  14. * version 2. This program is licensed "as is" without any warranty of any
  15. * kind, whether express or implied.
  16. */
  17. #include <linux/config.h>
  18. #include <linux/module.h>
  19. #include <linux/types.h>
  20. #include <linux/kernel.h>
  21. #include <linux/sched.h>
  22. #include <linux/string.h>
  23. #include <linux/ptrace.h>
  24. #include <linux/errno.h>
  25. #include <linux/ioport.h>
  26. #include <linux/slab.h>
  27. #include <linux/interrupt.h>
  28. #include <linux/pci.h>
  29. #include <linux/init.h>
  30. #include <linux/delay.h>
  31. #include <linux/netdevice.h>
  32. #include <linux/etherdevice.h>
  33. #include <linux/skbuff.h>
  34. #include <linux/spinlock.h>
  35. #include <linux/mii.h>
  36. #include <linux/ethtool.h>
  37. #include <linux/bitops.h>
  38. #include <asm/pgtable.h>
  39. #include <asm/irq.h>
  40. #include <asm/uaccess.h>
  41. #include "fs_enet.h"
  42. /*************************************************/
  43. /*
  44. * Generic PHY support.
  45. * Should work for all PHYs, but link change is detected by polling
  46. */
  47. static void generic_timer_callback(unsigned long data)
  48. {
  49. struct net_device *dev = (struct net_device *)data;
  50. struct fs_enet_private *fep = netdev_priv(dev);
  51. fep->phy_timer_list.expires = jiffies + HZ / 2;
  52. add_timer(&fep->phy_timer_list);
  53. fs_mii_link_status_change_check(dev, 0);
  54. }
  55. static void generic_startup(struct net_device *dev)
  56. {
  57. struct fs_enet_private *fep = netdev_priv(dev);
  58. fep->phy_timer_list.expires = jiffies + HZ / 2; /* every 500ms */
  59. fep->phy_timer_list.data = (unsigned long)dev;
  60. fep->phy_timer_list.function = generic_timer_callback;
  61. add_timer(&fep->phy_timer_list);
  62. }
  63. static void generic_shutdown(struct net_device *dev)
  64. {
  65. struct fs_enet_private *fep = netdev_priv(dev);
  66. del_timer_sync(&fep->phy_timer_list);
  67. }
  68. /* ------------------------------------------------------------------------- */
  69. /* The Davicom DM9161 is used on the NETTA board */
  70. /* register definitions */
  71. #define MII_DM9161_ANAR 4 /* Aux. Config Register */
  72. #define MII_DM9161_ACR 16 /* Aux. Config Register */
  73. #define MII_DM9161_ACSR 17 /* Aux. Config/Status Register */
  74. #define MII_DM9161_10TCSR 18 /* 10BaseT Config/Status Reg. */
  75. #define MII_DM9161_INTR 21 /* Interrupt Register */
  76. #define MII_DM9161_RECR 22 /* Receive Error Counter Reg. */
  77. #define MII_DM9161_DISCR 23 /* Disconnect Counter Register */
  78. static void dm9161_startup(struct net_device *dev)
  79. {
  80. struct fs_enet_private *fep = netdev_priv(dev);
  81. fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0000);
  82. /* Start autonegotiation */
  83. fs_mii_write(dev, fep->mii_if.phy_id, MII_BMCR, 0x1200);
  84. set_current_state(TASK_UNINTERRUPTIBLE);
  85. schedule_timeout(HZ*8);
  86. }
  87. static void dm9161_ack_int(struct net_device *dev)
  88. {
  89. struct fs_enet_private *fep = netdev_priv(dev);
  90. fs_mii_read(dev, fep->mii_if.phy_id, MII_DM9161_INTR);
  91. }
  92. static void dm9161_shutdown(struct net_device *dev)
  93. {
  94. struct fs_enet_private *fep = netdev_priv(dev);
  95. fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0f00);
  96. }
  97. /**********************************************************************************/
  98. static const struct phy_info phy_info[] = {
  99. {
  100. .id = 0x00181b88,
  101. .name = "DM9161",
  102. .startup = dm9161_startup,
  103. .ack_int = dm9161_ack_int,
  104. .shutdown = dm9161_shutdown,
  105. }, {
  106. .id = 0,
  107. .name = "GENERIC",
  108. .startup = generic_startup,
  109. .shutdown = generic_shutdown,
  110. },
  111. };
  112. /**********************************************************************************/
  113. static int phy_id_detect(struct net_device *dev)
  114. {
  115. struct fs_enet_private *fep = netdev_priv(dev);
  116. const struct fs_platform_info *fpi = fep->fpi;
  117. struct fs_enet_mii_bus *bus = fep->mii_bus;
  118. int i, r, start, end, phytype, physubtype;
  119. const struct phy_info *phy;
  120. int phy_hwid, phy_id;
  121. phy_hwid = -1;
  122. fep->phy = NULL;
  123. /* auto-detect? */
  124. if (fpi->phy_addr == -1) {
  125. start = 1;
  126. end = 32;
  127. } else { /* direct */
  128. start = fpi->phy_addr;
  129. end = start + 1;
  130. }
  131. for (phy_id = start; phy_id < end; phy_id++) {
  132. /* skip already used phy addresses on this bus */
  133. if (bus->usage_map & (1 << phy_id))
  134. continue;
  135. r = fs_mii_read(dev, phy_id, MII_PHYSID1);
  136. if (r == -1 || (phytype = (r & 0xffff)) == 0xffff)
  137. continue;
  138. r = fs_mii_read(dev, phy_id, MII_PHYSID2);
  139. if (r == -1 || (physubtype = (r & 0xffff)) == 0xffff)
  140. continue;
  141. phy_hwid = (phytype << 16) | physubtype;
  142. if (phy_hwid != -1)
  143. break;
  144. }
  145. if (phy_hwid == -1) {
  146. printk(KERN_ERR DRV_MODULE_NAME
  147. ": %s No PHY detected! range=0x%02x-0x%02x\n",
  148. dev->name, start, end);
  149. return -1;
  150. }
  151. for (i = 0, phy = phy_info; i < ARRAY_SIZE(phy_info); i++, phy++)
  152. if (phy->id == (phy_hwid >> 4) || phy->id == 0)
  153. break;
  154. if (i >= ARRAY_SIZE(phy_info)) {
  155. printk(KERN_ERR DRV_MODULE_NAME
  156. ": %s PHY id 0x%08x is not supported!\n",
  157. dev->name, phy_hwid);
  158. return -1;
  159. }
  160. fep->phy = phy;
  161. /* mark this address as used */
  162. bus->usage_map |= (1 << phy_id);
  163. printk(KERN_INFO DRV_MODULE_NAME
  164. ": %s Phy @ 0x%x, type %s (0x%08x)%s\n",
  165. dev->name, phy_id, fep->phy->name, phy_hwid,
  166. fpi->phy_addr == -1 ? " (auto-detected)" : "");
  167. return phy_id;
  168. }
  169. void fs_mii_startup(struct net_device *dev)
  170. {
  171. struct fs_enet_private *fep = netdev_priv(dev);
  172. if (fep->phy->startup)
  173. (*fep->phy->startup) (dev);
  174. }
  175. void fs_mii_shutdown(struct net_device *dev)
  176. {
  177. struct fs_enet_private *fep = netdev_priv(dev);
  178. if (fep->phy->shutdown)
  179. (*fep->phy->shutdown) (dev);
  180. }
  181. void fs_mii_ack_int(struct net_device *dev)
  182. {
  183. struct fs_enet_private *fep = netdev_priv(dev);
  184. if (fep->phy->ack_int)
  185. (*fep->phy->ack_int) (dev);
  186. }
  187. #define MII_LINK 0x0001
  188. #define MII_HALF 0x0002
  189. #define MII_FULL 0x0004
  190. #define MII_BASE4 0x0008
  191. #define MII_10M 0x0010
  192. #define MII_100M 0x0020
  193. #define MII_1G 0x0040
  194. #define MII_10G 0x0080
  195. /* return full mii info at one gulp, with a usable form */
  196. static unsigned int mii_full_status(struct mii_if_info *mii)
  197. {
  198. unsigned int status;
  199. int bmsr, adv, lpa, neg;
  200. struct fs_enet_private* fep = netdev_priv(mii->dev);
  201. /* first, a dummy read, needed to latch some MII phys */
  202. (void)mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
  203. bmsr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
  204. /* no link */
  205. if ((bmsr & BMSR_LSTATUS) == 0)
  206. return 0;
  207. status = MII_LINK;
  208. /* Lets look what ANEG says if it's supported - otherwize we shall
  209. take the right values from the platform info*/
  210. if(!mii->force_media) {
  211. /* autoneg not completed; don't bother */
  212. if ((bmsr & BMSR_ANEGCOMPLETE) == 0)
  213. return 0;
  214. adv = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_ADVERTISE);
  215. lpa = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_LPA);
  216. neg = lpa & adv;
  217. } else {
  218. neg = fep->fpi->bus_info->lpa;
  219. }
  220. if (neg & LPA_100FULL)
  221. status |= MII_FULL | MII_100M;
  222. else if (neg & LPA_100BASE4)
  223. status |= MII_FULL | MII_BASE4 | MII_100M;
  224. else if (neg & LPA_100HALF)
  225. status |= MII_HALF | MII_100M;
  226. else if (neg & LPA_10FULL)
  227. status |= MII_FULL | MII_10M;
  228. else
  229. status |= MII_HALF | MII_10M;
  230. return status;
  231. }
  232. void fs_mii_link_status_change_check(struct net_device *dev, int init_media)
  233. {
  234. struct fs_enet_private *fep = netdev_priv(dev);
  235. struct mii_if_info *mii = &fep->mii_if;
  236. unsigned int mii_status;
  237. int ok_to_print, link, duplex, speed;
  238. unsigned long flags;
  239. ok_to_print = netif_msg_link(fep);
  240. mii_status = mii_full_status(mii);
  241. if (!init_media && mii_status == fep->last_mii_status)
  242. return;
  243. fep->last_mii_status = mii_status;
  244. link = !!(mii_status & MII_LINK);
  245. duplex = !!(mii_status & MII_FULL);
  246. speed = (mii_status & MII_100M) ? 100 : 10;
  247. if (link == 0) {
  248. netif_carrier_off(mii->dev);
  249. netif_stop_queue(dev);
  250. if (!init_media) {
  251. spin_lock_irqsave(&fep->lock, flags);
  252. (*fep->ops->stop)(dev);
  253. spin_unlock_irqrestore(&fep->lock, flags);
  254. }
  255. if (ok_to_print)
  256. printk(KERN_INFO "%s: link down\n", mii->dev->name);
  257. } else {
  258. mii->full_duplex = duplex;
  259. netif_carrier_on(mii->dev);
  260. spin_lock_irqsave(&fep->lock, flags);
  261. fep->duplex = duplex;
  262. fep->speed = speed;
  263. (*fep->ops->restart)(dev);
  264. spin_unlock_irqrestore(&fep->lock, flags);
  265. netif_start_queue(dev);
  266. if (ok_to_print)
  267. printk(KERN_INFO "%s: link up, %dMbps, %s-duplex\n",
  268. dev->name, speed, duplex ? "full" : "half");
  269. }
  270. }
  271. /**********************************************************************************/
  272. int fs_mii_read(struct net_device *dev, int phy_id, int location)
  273. {
  274. struct fs_enet_private *fep = netdev_priv(dev);
  275. struct fs_enet_mii_bus *bus = fep->mii_bus;
  276. unsigned long flags;
  277. int ret;
  278. spin_lock_irqsave(&bus->mii_lock, flags);
  279. ret = (*bus->mii_read)(bus, phy_id, location);
  280. spin_unlock_irqrestore(&bus->mii_lock, flags);
  281. return ret;
  282. }
  283. void fs_mii_write(struct net_device *dev, int phy_id, int location, int value)
  284. {
  285. struct fs_enet_private *fep = netdev_priv(dev);
  286. struct fs_enet_mii_bus *bus = fep->mii_bus;
  287. unsigned long flags;
  288. spin_lock_irqsave(&bus->mii_lock, flags);
  289. (*bus->mii_write)(bus, phy_id, location, value);
  290. spin_unlock_irqrestore(&bus->mii_lock, flags);
  291. }
  292. /*****************************************************************************/
  293. /* list of all registered mii buses */
  294. static LIST_HEAD(fs_mii_bus_list);
  295. static struct fs_enet_mii_bus *lookup_bus(int method, int id)
  296. {
  297. struct list_head *ptr;
  298. struct fs_enet_mii_bus *bus;
  299. list_for_each(ptr, &fs_mii_bus_list) {
  300. bus = list_entry(ptr, struct fs_enet_mii_bus, list);
  301. if (bus->bus_info->method == method &&
  302. bus->bus_info->id == id)
  303. return bus;
  304. }
  305. return NULL;
  306. }
  307. static struct fs_enet_mii_bus *create_bus(const struct fs_mii_bus_info *bi)
  308. {
  309. struct fs_enet_mii_bus *bus;
  310. int ret = 0;
  311. bus = kmalloc(sizeof(*bus), GFP_KERNEL);
  312. if (bus == NULL) {
  313. ret = -ENOMEM;
  314. goto err;
  315. }
  316. memset(bus, 0, sizeof(*bus));
  317. spin_lock_init(&bus->mii_lock);
  318. bus->bus_info = bi;
  319. bus->refs = 0;
  320. bus->usage_map = 0;
  321. /* perform initialization */
  322. switch (bi->method) {
  323. case fsmii_fixed:
  324. ret = fs_mii_fixed_init(bus);
  325. if (ret != 0)
  326. goto err;
  327. break;
  328. case fsmii_bitbang:
  329. ret = fs_mii_bitbang_init(bus);
  330. if (ret != 0)
  331. goto err;
  332. break;
  333. #ifdef CONFIG_FS_ENET_HAS_FEC
  334. case fsmii_fec:
  335. ret = fs_mii_fec_init(bus);
  336. if (ret != 0)
  337. goto err;
  338. break;
  339. #endif
  340. default:
  341. ret = -EINVAL;
  342. goto err;
  343. }
  344. list_add(&bus->list, &fs_mii_bus_list);
  345. return bus;
  346. err:
  347. if (bus)
  348. kfree(bus);
  349. return ERR_PTR(ret);
  350. }
  351. static void destroy_bus(struct fs_enet_mii_bus *bus)
  352. {
  353. /* remove from bus list */
  354. list_del(&bus->list);
  355. /* nothing more needed */
  356. kfree(bus);
  357. }
  358. int fs_mii_connect(struct net_device *dev)
  359. {
  360. struct fs_enet_private *fep = netdev_priv(dev);
  361. const struct fs_platform_info *fpi = fep->fpi;
  362. struct fs_enet_mii_bus *bus = NULL;
  363. /* check method validity */
  364. switch (fpi->bus_info->method) {
  365. case fsmii_fixed:
  366. case fsmii_bitbang:
  367. break;
  368. #ifdef CONFIG_FS_ENET_HAS_FEC
  369. case fsmii_fec:
  370. break;
  371. #endif
  372. default:
  373. printk(KERN_ERR DRV_MODULE_NAME
  374. ": %s Unknown MII bus method (%d)!\n",
  375. dev->name, fpi->bus_info->method);
  376. return -EINVAL;
  377. }
  378. bus = lookup_bus(fpi->bus_info->method, fpi->bus_info->id);
  379. /* if not found create new bus */
  380. if (bus == NULL) {
  381. bus = create_bus(fpi->bus_info);
  382. if (IS_ERR(bus)) {
  383. printk(KERN_ERR DRV_MODULE_NAME
  384. ": %s MII bus creation failure!\n", dev->name);
  385. return PTR_ERR(bus);
  386. }
  387. }
  388. bus->refs++;
  389. fep->mii_bus = bus;
  390. fep->mii_if.dev = dev;
  391. fep->mii_if.phy_id_mask = 0x1f;
  392. fep->mii_if.reg_num_mask = 0x1f;
  393. fep->mii_if.mdio_read = fs_mii_read;
  394. fep->mii_if.mdio_write = fs_mii_write;
  395. fep->mii_if.force_media = fpi->bus_info->disable_aneg;
  396. fep->mii_if.phy_id = phy_id_detect(dev);
  397. return 0;
  398. }
  399. void fs_mii_disconnect(struct net_device *dev)
  400. {
  401. struct fs_enet_private *fep = netdev_priv(dev);
  402. struct fs_enet_mii_bus *bus = NULL;
  403. bus = fep->mii_bus;
  404. fep->mii_bus = NULL;
  405. if (--bus->refs <= 0)
  406. destroy_bus(bus);
  407. }