ftgmac100.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453
  1. /*
  2. * Faraday FTGMAC100 Gigabit Ethernet
  3. *
  4. * (C) Copyright 2009-2011 Faraday Technology
  5. * Po-Yu Chuang <ratbert@faraday-tech.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22. #include <linux/dma-mapping.h>
  23. #include <linux/etherdevice.h>
  24. #include <linux/ethtool.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/io.h>
  27. #include <linux/module.h>
  28. #include <linux/netdevice.h>
  29. #include <linux/phy.h>
  30. #include <linux/platform_device.h>
  31. #include <net/ip.h>
  32. #include <net/ncsi.h>
  33. #include "ftgmac100.h"
  34. #define DRV_NAME "ftgmac100"
  35. #define DRV_VERSION "0.7"
  36. #define RX_QUEUE_ENTRIES 256 /* must be power of 2 */
  37. #define TX_QUEUE_ENTRIES 512 /* must be power of 2 */
  38. #define MAX_PKT_SIZE 1518
  39. #define RX_BUF_SIZE PAGE_SIZE /* must be smaller than 0x3fff */
  40. /******************************************************************************
  41. * private data
  42. *****************************************************************************/
  43. struct ftgmac100_descs {
  44. struct ftgmac100_rxdes rxdes[RX_QUEUE_ENTRIES];
  45. struct ftgmac100_txdes txdes[TX_QUEUE_ENTRIES];
  46. };
  47. struct ftgmac100 {
  48. struct resource *res;
  49. void __iomem *base;
  50. int irq;
  51. struct ftgmac100_descs *descs;
  52. dma_addr_t descs_dma_addr;
  53. unsigned int rx_pointer;
  54. unsigned int tx_clean_pointer;
  55. unsigned int tx_pointer;
  56. unsigned int tx_pending;
  57. spinlock_t tx_lock;
  58. struct net_device *netdev;
  59. struct device *dev;
  60. struct ncsi_dev *ndev;
  61. struct napi_struct napi;
  62. struct mii_bus *mii_bus;
  63. int old_speed;
  64. int int_mask_all;
  65. bool use_ncsi;
  66. bool enabled;
  67. };
  68. static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
  69. struct ftgmac100_rxdes *rxdes, gfp_t gfp);
  70. /******************************************************************************
  71. * internal functions (hardware register access)
  72. *****************************************************************************/
  73. static void ftgmac100_set_rx_ring_base(struct ftgmac100 *priv, dma_addr_t addr)
  74. {
  75. iowrite32(addr, priv->base + FTGMAC100_OFFSET_RXR_BADR);
  76. }
  77. static void ftgmac100_set_rx_buffer_size(struct ftgmac100 *priv,
  78. unsigned int size)
  79. {
  80. size = FTGMAC100_RBSR_SIZE(size);
  81. iowrite32(size, priv->base + FTGMAC100_OFFSET_RBSR);
  82. }
  83. static void ftgmac100_set_normal_prio_tx_ring_base(struct ftgmac100 *priv,
  84. dma_addr_t addr)
  85. {
  86. iowrite32(addr, priv->base + FTGMAC100_OFFSET_NPTXR_BADR);
  87. }
  88. static void ftgmac100_txdma_normal_prio_start_polling(struct ftgmac100 *priv)
  89. {
  90. iowrite32(1, priv->base + FTGMAC100_OFFSET_NPTXPD);
  91. }
  92. static int ftgmac100_reset_hw(struct ftgmac100 *priv)
  93. {
  94. struct net_device *netdev = priv->netdev;
  95. int i;
  96. /* NOTE: reset clears all registers */
  97. iowrite32(FTGMAC100_MACCR_SW_RST, priv->base + FTGMAC100_OFFSET_MACCR);
  98. for (i = 0; i < 5; i++) {
  99. unsigned int maccr;
  100. maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR);
  101. if (!(maccr & FTGMAC100_MACCR_SW_RST))
  102. return 0;
  103. udelay(1000);
  104. }
  105. netdev_err(netdev, "software reset failed\n");
  106. return -EIO;
  107. }
  108. static void ftgmac100_set_mac(struct ftgmac100 *priv, const unsigned char *mac)
  109. {
  110. unsigned int maddr = mac[0] << 8 | mac[1];
  111. unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
  112. iowrite32(maddr, priv->base + FTGMAC100_OFFSET_MAC_MADR);
  113. iowrite32(laddr, priv->base + FTGMAC100_OFFSET_MAC_LADR);
  114. }
  115. static void ftgmac100_setup_mac(struct ftgmac100 *priv)
  116. {
  117. u8 mac[ETH_ALEN];
  118. unsigned int m;
  119. unsigned int l;
  120. void *addr;
  121. addr = device_get_mac_address(priv->dev, mac, ETH_ALEN);
  122. if (addr) {
  123. ether_addr_copy(priv->netdev->dev_addr, mac);
  124. dev_info(priv->dev, "Read MAC address %pM from device tree\n",
  125. mac);
  126. return;
  127. }
  128. m = ioread32(priv->base + FTGMAC100_OFFSET_MAC_MADR);
  129. l = ioread32(priv->base + FTGMAC100_OFFSET_MAC_LADR);
  130. mac[0] = (m >> 8) & 0xff;
  131. mac[1] = m & 0xff;
  132. mac[2] = (l >> 24) & 0xff;
  133. mac[3] = (l >> 16) & 0xff;
  134. mac[4] = (l >> 8) & 0xff;
  135. mac[5] = l & 0xff;
  136. if (is_valid_ether_addr(mac)) {
  137. ether_addr_copy(priv->netdev->dev_addr, mac);
  138. dev_info(priv->dev, "Read MAC address %pM from chip\n", mac);
  139. } else {
  140. eth_hw_addr_random(priv->netdev);
  141. dev_info(priv->dev, "Generated random MAC address %pM\n",
  142. priv->netdev->dev_addr);
  143. }
  144. }
  145. static int ftgmac100_set_mac_addr(struct net_device *dev, void *p)
  146. {
  147. int ret;
  148. ret = eth_prepare_mac_addr_change(dev, p);
  149. if (ret < 0)
  150. return ret;
  151. eth_commit_mac_addr_change(dev, p);
  152. ftgmac100_set_mac(netdev_priv(dev), dev->dev_addr);
  153. return 0;
  154. }
  155. static void ftgmac100_init_hw(struct ftgmac100 *priv)
  156. {
  157. /* setup ring buffer base registers */
  158. ftgmac100_set_rx_ring_base(priv,
  159. priv->descs_dma_addr +
  160. offsetof(struct ftgmac100_descs, rxdes));
  161. ftgmac100_set_normal_prio_tx_ring_base(priv,
  162. priv->descs_dma_addr +
  163. offsetof(struct ftgmac100_descs, txdes));
  164. ftgmac100_set_rx_buffer_size(priv, RX_BUF_SIZE);
  165. iowrite32(FTGMAC100_APTC_RXPOLL_CNT(1), priv->base + FTGMAC100_OFFSET_APTC);
  166. ftgmac100_set_mac(priv, priv->netdev->dev_addr);
  167. }
  168. #define MACCR_ENABLE_ALL (FTGMAC100_MACCR_TXDMA_EN | \
  169. FTGMAC100_MACCR_RXDMA_EN | \
  170. FTGMAC100_MACCR_TXMAC_EN | \
  171. FTGMAC100_MACCR_RXMAC_EN | \
  172. FTGMAC100_MACCR_FULLDUP | \
  173. FTGMAC100_MACCR_CRC_APD | \
  174. FTGMAC100_MACCR_RX_RUNT | \
  175. FTGMAC100_MACCR_RX_BROADPKT)
  176. static void ftgmac100_start_hw(struct ftgmac100 *priv, int speed)
  177. {
  178. int maccr = MACCR_ENABLE_ALL;
  179. switch (speed) {
  180. default:
  181. case 10:
  182. break;
  183. case 100:
  184. maccr |= FTGMAC100_MACCR_FAST_MODE;
  185. break;
  186. case 1000:
  187. maccr |= FTGMAC100_MACCR_GIGA_MODE;
  188. break;
  189. }
  190. iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR);
  191. }
  192. static void ftgmac100_stop_hw(struct ftgmac100 *priv)
  193. {
  194. iowrite32(0, priv->base + FTGMAC100_OFFSET_MACCR);
  195. }
  196. /******************************************************************************
  197. * internal functions (receive descriptor)
  198. *****************************************************************************/
  199. static bool ftgmac100_rxdes_first_segment(struct ftgmac100_rxdes *rxdes)
  200. {
  201. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_FRS);
  202. }
  203. static bool ftgmac100_rxdes_last_segment(struct ftgmac100_rxdes *rxdes)
  204. {
  205. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_LRS);
  206. }
  207. static bool ftgmac100_rxdes_packet_ready(struct ftgmac100_rxdes *rxdes)
  208. {
  209. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RXPKT_RDY);
  210. }
  211. static void ftgmac100_rxdes_set_dma_own(struct ftgmac100_rxdes *rxdes)
  212. {
  213. /* clear status bits */
  214. rxdes->rxdes0 &= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
  215. }
  216. static bool ftgmac100_rxdes_rx_error(struct ftgmac100_rxdes *rxdes)
  217. {
  218. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RX_ERR);
  219. }
  220. static bool ftgmac100_rxdes_crc_error(struct ftgmac100_rxdes *rxdes)
  221. {
  222. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_CRC_ERR);
  223. }
  224. static bool ftgmac100_rxdes_frame_too_long(struct ftgmac100_rxdes *rxdes)
  225. {
  226. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_FTL);
  227. }
  228. static bool ftgmac100_rxdes_runt(struct ftgmac100_rxdes *rxdes)
  229. {
  230. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RUNT);
  231. }
  232. static bool ftgmac100_rxdes_odd_nibble(struct ftgmac100_rxdes *rxdes)
  233. {
  234. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RX_ODD_NB);
  235. }
  236. static unsigned int ftgmac100_rxdes_data_length(struct ftgmac100_rxdes *rxdes)
  237. {
  238. return le32_to_cpu(rxdes->rxdes0) & FTGMAC100_RXDES0_VDBC;
  239. }
  240. static bool ftgmac100_rxdes_multicast(struct ftgmac100_rxdes *rxdes)
  241. {
  242. return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_MULTICAST);
  243. }
  244. static void ftgmac100_rxdes_set_end_of_ring(struct ftgmac100_rxdes *rxdes)
  245. {
  246. rxdes->rxdes0 |= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
  247. }
  248. static void ftgmac100_rxdes_set_dma_addr(struct ftgmac100_rxdes *rxdes,
  249. dma_addr_t addr)
  250. {
  251. rxdes->rxdes3 = cpu_to_le32(addr);
  252. }
  253. static dma_addr_t ftgmac100_rxdes_get_dma_addr(struct ftgmac100_rxdes *rxdes)
  254. {
  255. return le32_to_cpu(rxdes->rxdes3);
  256. }
  257. static bool ftgmac100_rxdes_is_tcp(struct ftgmac100_rxdes *rxdes)
  258. {
  259. return (rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_PROT_MASK)) ==
  260. cpu_to_le32(FTGMAC100_RXDES1_PROT_TCPIP);
  261. }
  262. static bool ftgmac100_rxdes_is_udp(struct ftgmac100_rxdes *rxdes)
  263. {
  264. return (rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_PROT_MASK)) ==
  265. cpu_to_le32(FTGMAC100_RXDES1_PROT_UDPIP);
  266. }
  267. static bool ftgmac100_rxdes_tcpcs_err(struct ftgmac100_rxdes *rxdes)
  268. {
  269. return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_TCP_CHKSUM_ERR);
  270. }
  271. static bool ftgmac100_rxdes_udpcs_err(struct ftgmac100_rxdes *rxdes)
  272. {
  273. return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_UDP_CHKSUM_ERR);
  274. }
  275. static bool ftgmac100_rxdes_ipcs_err(struct ftgmac100_rxdes *rxdes)
  276. {
  277. return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_IP_CHKSUM_ERR);
  278. }
  279. /*
  280. * rxdes2 is not used by hardware. We use it to keep track of page.
  281. * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
  282. */
  283. static void ftgmac100_rxdes_set_page(struct ftgmac100_rxdes *rxdes, struct page *page)
  284. {
  285. rxdes->rxdes2 = (unsigned int)page;
  286. }
  287. static struct page *ftgmac100_rxdes_get_page(struct ftgmac100_rxdes *rxdes)
  288. {
  289. return (struct page *)rxdes->rxdes2;
  290. }
  291. /******************************************************************************
  292. * internal functions (receive)
  293. *****************************************************************************/
  294. static int ftgmac100_next_rx_pointer(int pointer)
  295. {
  296. return (pointer + 1) & (RX_QUEUE_ENTRIES - 1);
  297. }
  298. static void ftgmac100_rx_pointer_advance(struct ftgmac100 *priv)
  299. {
  300. priv->rx_pointer = ftgmac100_next_rx_pointer(priv->rx_pointer);
  301. }
  302. static struct ftgmac100_rxdes *ftgmac100_current_rxdes(struct ftgmac100 *priv)
  303. {
  304. return &priv->descs->rxdes[priv->rx_pointer];
  305. }
  306. static struct ftgmac100_rxdes *
  307. ftgmac100_rx_locate_first_segment(struct ftgmac100 *priv)
  308. {
  309. struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv);
  310. while (ftgmac100_rxdes_packet_ready(rxdes)) {
  311. if (ftgmac100_rxdes_first_segment(rxdes))
  312. return rxdes;
  313. ftgmac100_rxdes_set_dma_own(rxdes);
  314. ftgmac100_rx_pointer_advance(priv);
  315. rxdes = ftgmac100_current_rxdes(priv);
  316. }
  317. return NULL;
  318. }
  319. static bool ftgmac100_rx_packet_error(struct ftgmac100 *priv,
  320. struct ftgmac100_rxdes *rxdes)
  321. {
  322. struct net_device *netdev = priv->netdev;
  323. bool error = false;
  324. if (unlikely(ftgmac100_rxdes_rx_error(rxdes))) {
  325. if (net_ratelimit())
  326. netdev_info(netdev, "rx err\n");
  327. netdev->stats.rx_errors++;
  328. error = true;
  329. }
  330. if (unlikely(ftgmac100_rxdes_crc_error(rxdes))) {
  331. if (net_ratelimit())
  332. netdev_info(netdev, "rx crc err\n");
  333. netdev->stats.rx_crc_errors++;
  334. error = true;
  335. } else if (unlikely(ftgmac100_rxdes_ipcs_err(rxdes))) {
  336. if (net_ratelimit())
  337. netdev_info(netdev, "rx IP checksum err\n");
  338. error = true;
  339. }
  340. if (unlikely(ftgmac100_rxdes_frame_too_long(rxdes))) {
  341. if (net_ratelimit())
  342. netdev_info(netdev, "rx frame too long\n");
  343. netdev->stats.rx_length_errors++;
  344. error = true;
  345. } else if (unlikely(ftgmac100_rxdes_runt(rxdes))) {
  346. if (net_ratelimit())
  347. netdev_info(netdev, "rx runt\n");
  348. netdev->stats.rx_length_errors++;
  349. error = true;
  350. } else if (unlikely(ftgmac100_rxdes_odd_nibble(rxdes))) {
  351. if (net_ratelimit())
  352. netdev_info(netdev, "rx odd nibble\n");
  353. netdev->stats.rx_length_errors++;
  354. error = true;
  355. }
  356. return error;
  357. }
  358. static void ftgmac100_rx_drop_packet(struct ftgmac100 *priv)
  359. {
  360. struct net_device *netdev = priv->netdev;
  361. struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv);
  362. bool done = false;
  363. if (net_ratelimit())
  364. netdev_dbg(netdev, "drop packet %p\n", rxdes);
  365. do {
  366. if (ftgmac100_rxdes_last_segment(rxdes))
  367. done = true;
  368. ftgmac100_rxdes_set_dma_own(rxdes);
  369. ftgmac100_rx_pointer_advance(priv);
  370. rxdes = ftgmac100_current_rxdes(priv);
  371. } while (!done && ftgmac100_rxdes_packet_ready(rxdes));
  372. netdev->stats.rx_dropped++;
  373. }
  374. static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed)
  375. {
  376. struct net_device *netdev = priv->netdev;
  377. struct ftgmac100_rxdes *rxdes;
  378. struct sk_buff *skb;
  379. bool done = false;
  380. rxdes = ftgmac100_rx_locate_first_segment(priv);
  381. if (!rxdes)
  382. return false;
  383. if (unlikely(ftgmac100_rx_packet_error(priv, rxdes))) {
  384. ftgmac100_rx_drop_packet(priv);
  385. return true;
  386. }
  387. /* start processing */
  388. skb = netdev_alloc_skb_ip_align(netdev, 128);
  389. if (unlikely(!skb)) {
  390. if (net_ratelimit())
  391. netdev_err(netdev, "rx skb alloc failed\n");
  392. ftgmac100_rx_drop_packet(priv);
  393. return true;
  394. }
  395. if (unlikely(ftgmac100_rxdes_multicast(rxdes)))
  396. netdev->stats.multicast++;
  397. /*
  398. * It seems that HW does checksum incorrectly with fragmented packets,
  399. * so we are conservative here - if HW checksum error, let software do
  400. * the checksum again.
  401. */
  402. if ((ftgmac100_rxdes_is_tcp(rxdes) && !ftgmac100_rxdes_tcpcs_err(rxdes)) ||
  403. (ftgmac100_rxdes_is_udp(rxdes) && !ftgmac100_rxdes_udpcs_err(rxdes)))
  404. skb->ip_summed = CHECKSUM_UNNECESSARY;
  405. do {
  406. dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
  407. struct page *page = ftgmac100_rxdes_get_page(rxdes);
  408. unsigned int size;
  409. dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
  410. size = ftgmac100_rxdes_data_length(rxdes);
  411. skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, 0, size);
  412. skb->len += size;
  413. skb->data_len += size;
  414. skb->truesize += PAGE_SIZE;
  415. if (ftgmac100_rxdes_last_segment(rxdes))
  416. done = true;
  417. ftgmac100_alloc_rx_page(priv, rxdes, GFP_ATOMIC);
  418. ftgmac100_rx_pointer_advance(priv);
  419. rxdes = ftgmac100_current_rxdes(priv);
  420. } while (!done);
  421. /* Small frames are copied into linear part of skb to free one page */
  422. if (skb->len <= 128) {
  423. skb->truesize -= PAGE_SIZE;
  424. __pskb_pull_tail(skb, skb->len);
  425. } else {
  426. /* We pull the minimum amount into linear part */
  427. __pskb_pull_tail(skb, ETH_HLEN);
  428. }
  429. skb->protocol = eth_type_trans(skb, netdev);
  430. netdev->stats.rx_packets++;
  431. netdev->stats.rx_bytes += skb->len;
  432. /* push packet to protocol stack */
  433. napi_gro_receive(&priv->napi, skb);
  434. (*processed)++;
  435. return true;
  436. }
  437. /******************************************************************************
  438. * internal functions (transmit descriptor)
  439. *****************************************************************************/
  440. static void ftgmac100_txdes_reset(struct ftgmac100_txdes *txdes)
  441. {
  442. /* clear all except end of ring bit */
  443. txdes->txdes0 &= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
  444. txdes->txdes1 = 0;
  445. txdes->txdes2 = 0;
  446. txdes->txdes3 = 0;
  447. }
  448. static bool ftgmac100_txdes_owned_by_dma(struct ftgmac100_txdes *txdes)
  449. {
  450. return txdes->txdes0 & cpu_to_le32(FTGMAC100_TXDES0_TXDMA_OWN);
  451. }
  452. static void ftgmac100_txdes_set_dma_own(struct ftgmac100_txdes *txdes)
  453. {
  454. /*
  455. * Make sure dma own bit will not be set before any other
  456. * descriptor fields.
  457. */
  458. wmb();
  459. txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_TXDMA_OWN);
  460. }
  461. static void ftgmac100_txdes_set_end_of_ring(struct ftgmac100_txdes *txdes)
  462. {
  463. txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
  464. }
  465. static void ftgmac100_txdes_set_first_segment(struct ftgmac100_txdes *txdes)
  466. {
  467. txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_FTS);
  468. }
  469. static void ftgmac100_txdes_set_last_segment(struct ftgmac100_txdes *txdes)
  470. {
  471. txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_LTS);
  472. }
  473. static void ftgmac100_txdes_set_buffer_size(struct ftgmac100_txdes *txdes,
  474. unsigned int len)
  475. {
  476. txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_TXBUF_SIZE(len));
  477. }
  478. static void ftgmac100_txdes_set_txint(struct ftgmac100_txdes *txdes)
  479. {
  480. txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_TXIC);
  481. }
  482. static void ftgmac100_txdes_set_tcpcs(struct ftgmac100_txdes *txdes)
  483. {
  484. txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_TCP_CHKSUM);
  485. }
  486. static void ftgmac100_txdes_set_udpcs(struct ftgmac100_txdes *txdes)
  487. {
  488. txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_UDP_CHKSUM);
  489. }
  490. static void ftgmac100_txdes_set_ipcs(struct ftgmac100_txdes *txdes)
  491. {
  492. txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_IP_CHKSUM);
  493. }
  494. static void ftgmac100_txdes_set_dma_addr(struct ftgmac100_txdes *txdes,
  495. dma_addr_t addr)
  496. {
  497. txdes->txdes3 = cpu_to_le32(addr);
  498. }
  499. static dma_addr_t ftgmac100_txdes_get_dma_addr(struct ftgmac100_txdes *txdes)
  500. {
  501. return le32_to_cpu(txdes->txdes3);
  502. }
  503. /*
  504. * txdes2 is not used by hardware. We use it to keep track of socket buffer.
  505. * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
  506. */
  507. static void ftgmac100_txdes_set_skb(struct ftgmac100_txdes *txdes,
  508. struct sk_buff *skb)
  509. {
  510. txdes->txdes2 = (unsigned int)skb;
  511. }
  512. static struct sk_buff *ftgmac100_txdes_get_skb(struct ftgmac100_txdes *txdes)
  513. {
  514. return (struct sk_buff *)txdes->txdes2;
  515. }
  516. /******************************************************************************
  517. * internal functions (transmit)
  518. *****************************************************************************/
  519. static int ftgmac100_next_tx_pointer(int pointer)
  520. {
  521. return (pointer + 1) & (TX_QUEUE_ENTRIES - 1);
  522. }
  523. static void ftgmac100_tx_pointer_advance(struct ftgmac100 *priv)
  524. {
  525. priv->tx_pointer = ftgmac100_next_tx_pointer(priv->tx_pointer);
  526. }
  527. static void ftgmac100_tx_clean_pointer_advance(struct ftgmac100 *priv)
  528. {
  529. priv->tx_clean_pointer = ftgmac100_next_tx_pointer(priv->tx_clean_pointer);
  530. }
  531. static struct ftgmac100_txdes *ftgmac100_current_txdes(struct ftgmac100 *priv)
  532. {
  533. return &priv->descs->txdes[priv->tx_pointer];
  534. }
  535. static struct ftgmac100_txdes *
  536. ftgmac100_current_clean_txdes(struct ftgmac100 *priv)
  537. {
  538. return &priv->descs->txdes[priv->tx_clean_pointer];
  539. }
  540. static bool ftgmac100_tx_complete_packet(struct ftgmac100 *priv)
  541. {
  542. struct net_device *netdev = priv->netdev;
  543. struct ftgmac100_txdes *txdes;
  544. struct sk_buff *skb;
  545. dma_addr_t map;
  546. if (priv->tx_pending == 0)
  547. return false;
  548. txdes = ftgmac100_current_clean_txdes(priv);
  549. if (ftgmac100_txdes_owned_by_dma(txdes))
  550. return false;
  551. skb = ftgmac100_txdes_get_skb(txdes);
  552. map = ftgmac100_txdes_get_dma_addr(txdes);
  553. netdev->stats.tx_packets++;
  554. netdev->stats.tx_bytes += skb->len;
  555. dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
  556. dev_kfree_skb(skb);
  557. ftgmac100_txdes_reset(txdes);
  558. ftgmac100_tx_clean_pointer_advance(priv);
  559. spin_lock(&priv->tx_lock);
  560. priv->tx_pending--;
  561. spin_unlock(&priv->tx_lock);
  562. netif_wake_queue(netdev);
  563. return true;
  564. }
  565. static void ftgmac100_tx_complete(struct ftgmac100 *priv)
  566. {
  567. while (ftgmac100_tx_complete_packet(priv))
  568. ;
  569. }
  570. static int ftgmac100_xmit(struct ftgmac100 *priv, struct sk_buff *skb,
  571. dma_addr_t map)
  572. {
  573. struct net_device *netdev = priv->netdev;
  574. struct ftgmac100_txdes *txdes;
  575. unsigned int len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
  576. txdes = ftgmac100_current_txdes(priv);
  577. ftgmac100_tx_pointer_advance(priv);
  578. /* setup TX descriptor */
  579. ftgmac100_txdes_set_skb(txdes, skb);
  580. ftgmac100_txdes_set_dma_addr(txdes, map);
  581. ftgmac100_txdes_set_buffer_size(txdes, len);
  582. ftgmac100_txdes_set_first_segment(txdes);
  583. ftgmac100_txdes_set_last_segment(txdes);
  584. ftgmac100_txdes_set_txint(txdes);
  585. if (skb->ip_summed == CHECKSUM_PARTIAL) {
  586. __be16 protocol = skb->protocol;
  587. if (protocol == cpu_to_be16(ETH_P_IP)) {
  588. u8 ip_proto = ip_hdr(skb)->protocol;
  589. ftgmac100_txdes_set_ipcs(txdes);
  590. if (ip_proto == IPPROTO_TCP)
  591. ftgmac100_txdes_set_tcpcs(txdes);
  592. else if (ip_proto == IPPROTO_UDP)
  593. ftgmac100_txdes_set_udpcs(txdes);
  594. }
  595. }
  596. spin_lock(&priv->tx_lock);
  597. priv->tx_pending++;
  598. if (priv->tx_pending == TX_QUEUE_ENTRIES)
  599. netif_stop_queue(netdev);
  600. /* start transmit */
  601. ftgmac100_txdes_set_dma_own(txdes);
  602. spin_unlock(&priv->tx_lock);
  603. ftgmac100_txdma_normal_prio_start_polling(priv);
  604. return NETDEV_TX_OK;
  605. }
  606. /******************************************************************************
  607. * internal functions (buffer)
  608. *****************************************************************************/
  609. static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
  610. struct ftgmac100_rxdes *rxdes, gfp_t gfp)
  611. {
  612. struct net_device *netdev = priv->netdev;
  613. struct page *page;
  614. dma_addr_t map;
  615. page = alloc_page(gfp);
  616. if (!page) {
  617. if (net_ratelimit())
  618. netdev_err(netdev, "failed to allocate rx page\n");
  619. return -ENOMEM;
  620. }
  621. map = dma_map_page(priv->dev, page, 0, RX_BUF_SIZE, DMA_FROM_DEVICE);
  622. if (unlikely(dma_mapping_error(priv->dev, map))) {
  623. if (net_ratelimit())
  624. netdev_err(netdev, "failed to map rx page\n");
  625. __free_page(page);
  626. return -ENOMEM;
  627. }
  628. ftgmac100_rxdes_set_page(rxdes, page);
  629. ftgmac100_rxdes_set_dma_addr(rxdes, map);
  630. ftgmac100_rxdes_set_dma_own(rxdes);
  631. return 0;
  632. }
  633. static void ftgmac100_free_buffers(struct ftgmac100 *priv)
  634. {
  635. int i;
  636. for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
  637. struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
  638. struct page *page = ftgmac100_rxdes_get_page(rxdes);
  639. dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
  640. if (!page)
  641. continue;
  642. dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
  643. __free_page(page);
  644. }
  645. for (i = 0; i < TX_QUEUE_ENTRIES; i++) {
  646. struct ftgmac100_txdes *txdes = &priv->descs->txdes[i];
  647. struct sk_buff *skb = ftgmac100_txdes_get_skb(txdes);
  648. dma_addr_t map = ftgmac100_txdes_get_dma_addr(txdes);
  649. if (!skb)
  650. continue;
  651. dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
  652. kfree_skb(skb);
  653. }
  654. dma_free_coherent(priv->dev, sizeof(struct ftgmac100_descs),
  655. priv->descs, priv->descs_dma_addr);
  656. }
  657. static int ftgmac100_alloc_buffers(struct ftgmac100 *priv)
  658. {
  659. int i;
  660. priv->descs = dma_zalloc_coherent(priv->dev,
  661. sizeof(struct ftgmac100_descs),
  662. &priv->descs_dma_addr, GFP_KERNEL);
  663. if (!priv->descs)
  664. return -ENOMEM;
  665. /* initialize RX ring */
  666. ftgmac100_rxdes_set_end_of_ring(&priv->descs->rxdes[RX_QUEUE_ENTRIES - 1]);
  667. for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
  668. struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
  669. if (ftgmac100_alloc_rx_page(priv, rxdes, GFP_KERNEL))
  670. goto err;
  671. }
  672. /* initialize TX ring */
  673. ftgmac100_txdes_set_end_of_ring(&priv->descs->txdes[TX_QUEUE_ENTRIES - 1]);
  674. return 0;
  675. err:
  676. ftgmac100_free_buffers(priv);
  677. return -ENOMEM;
  678. }
  679. /******************************************************************************
  680. * internal functions (mdio)
  681. *****************************************************************************/
  682. static void ftgmac100_adjust_link(struct net_device *netdev)
  683. {
  684. struct ftgmac100 *priv = netdev_priv(netdev);
  685. struct phy_device *phydev = netdev->phydev;
  686. int ier;
  687. if (phydev->speed == priv->old_speed)
  688. return;
  689. priv->old_speed = phydev->speed;
  690. ier = ioread32(priv->base + FTGMAC100_OFFSET_IER);
  691. /* disable all interrupts */
  692. iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
  693. netif_stop_queue(netdev);
  694. ftgmac100_stop_hw(priv);
  695. netif_start_queue(netdev);
  696. ftgmac100_init_hw(priv);
  697. ftgmac100_start_hw(priv, phydev->speed);
  698. /* re-enable interrupts */
  699. iowrite32(ier, priv->base + FTGMAC100_OFFSET_IER);
  700. }
  701. static int ftgmac100_mii_probe(struct ftgmac100 *priv)
  702. {
  703. struct net_device *netdev = priv->netdev;
  704. struct phy_device *phydev;
  705. phydev = phy_find_first(priv->mii_bus);
  706. if (!phydev) {
  707. netdev_info(netdev, "%s: no PHY found\n", netdev->name);
  708. return -ENODEV;
  709. }
  710. phydev = phy_connect(netdev, phydev_name(phydev),
  711. &ftgmac100_adjust_link, PHY_INTERFACE_MODE_GMII);
  712. if (IS_ERR(phydev)) {
  713. netdev_err(netdev, "%s: Could not attach to PHY\n", netdev->name);
  714. return PTR_ERR(phydev);
  715. }
  716. return 0;
  717. }
  718. /******************************************************************************
  719. * struct mii_bus functions
  720. *****************************************************************************/
  721. static int ftgmac100_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
  722. {
  723. struct net_device *netdev = bus->priv;
  724. struct ftgmac100 *priv = netdev_priv(netdev);
  725. unsigned int phycr;
  726. int i;
  727. phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
  728. /* preserve MDC cycle threshold */
  729. phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
  730. phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
  731. FTGMAC100_PHYCR_REGAD(regnum) |
  732. FTGMAC100_PHYCR_MIIRD;
  733. iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
  734. for (i = 0; i < 10; i++) {
  735. phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
  736. if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
  737. int data;
  738. data = ioread32(priv->base + FTGMAC100_OFFSET_PHYDATA);
  739. return FTGMAC100_PHYDATA_MIIRDATA(data);
  740. }
  741. udelay(100);
  742. }
  743. netdev_err(netdev, "mdio read timed out\n");
  744. return -EIO;
  745. }
  746. static int ftgmac100_mdiobus_write(struct mii_bus *bus, int phy_addr,
  747. int regnum, u16 value)
  748. {
  749. struct net_device *netdev = bus->priv;
  750. struct ftgmac100 *priv = netdev_priv(netdev);
  751. unsigned int phycr;
  752. int data;
  753. int i;
  754. phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
  755. /* preserve MDC cycle threshold */
  756. phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
  757. phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
  758. FTGMAC100_PHYCR_REGAD(regnum) |
  759. FTGMAC100_PHYCR_MIIWR;
  760. data = FTGMAC100_PHYDATA_MIIWDATA(value);
  761. iowrite32(data, priv->base + FTGMAC100_OFFSET_PHYDATA);
  762. iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
  763. for (i = 0; i < 10; i++) {
  764. phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
  765. if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0)
  766. return 0;
  767. udelay(100);
  768. }
  769. netdev_err(netdev, "mdio write timed out\n");
  770. return -EIO;
  771. }
  772. /******************************************************************************
  773. * struct ethtool_ops functions
  774. *****************************************************************************/
  775. static void ftgmac100_get_drvinfo(struct net_device *netdev,
  776. struct ethtool_drvinfo *info)
  777. {
  778. strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
  779. strlcpy(info->version, DRV_VERSION, sizeof(info->version));
  780. strlcpy(info->bus_info, dev_name(&netdev->dev), sizeof(info->bus_info));
  781. }
  782. static const struct ethtool_ops ftgmac100_ethtool_ops = {
  783. .get_drvinfo = ftgmac100_get_drvinfo,
  784. .get_link = ethtool_op_get_link,
  785. .get_link_ksettings = phy_ethtool_get_link_ksettings,
  786. .set_link_ksettings = phy_ethtool_set_link_ksettings,
  787. };
  788. /******************************************************************************
  789. * interrupt handler
  790. *****************************************************************************/
  791. static irqreturn_t ftgmac100_interrupt(int irq, void *dev_id)
  792. {
  793. struct net_device *netdev = dev_id;
  794. struct ftgmac100 *priv = netdev_priv(netdev);
  795. /* When running in NCSI mode, the interface should be ready for
  796. * receiving or transmitting NCSI packets before it's opened.
  797. */
  798. if (likely(priv->use_ncsi || netif_running(netdev))) {
  799. /* Disable interrupts for polling */
  800. iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
  801. napi_schedule(&priv->napi);
  802. }
  803. return IRQ_HANDLED;
  804. }
  805. /******************************************************************************
  806. * struct napi_struct functions
  807. *****************************************************************************/
  808. static int ftgmac100_poll(struct napi_struct *napi, int budget)
  809. {
  810. struct ftgmac100 *priv = container_of(napi, struct ftgmac100, napi);
  811. struct net_device *netdev = priv->netdev;
  812. unsigned int status;
  813. bool completed = true;
  814. int rx = 0;
  815. status = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
  816. iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR);
  817. if (status & (FTGMAC100_INT_RPKT_BUF | FTGMAC100_INT_NO_RXBUF)) {
  818. /*
  819. * FTGMAC100_INT_RPKT_BUF:
  820. * RX DMA has received packets into RX buffer successfully
  821. *
  822. * FTGMAC100_INT_NO_RXBUF:
  823. * RX buffer unavailable
  824. */
  825. bool retry;
  826. do {
  827. retry = ftgmac100_rx_packet(priv, &rx);
  828. } while (retry && rx < budget);
  829. if (retry && rx == budget)
  830. completed = false;
  831. }
  832. if (status & (FTGMAC100_INT_XPKT_ETH | FTGMAC100_INT_XPKT_LOST)) {
  833. /*
  834. * FTGMAC100_INT_XPKT_ETH:
  835. * packet transmitted to ethernet successfully
  836. *
  837. * FTGMAC100_INT_XPKT_LOST:
  838. * packet transmitted to ethernet lost due to late
  839. * collision or excessive collision
  840. */
  841. ftgmac100_tx_complete(priv);
  842. }
  843. if (status & priv->int_mask_all & (FTGMAC100_INT_NO_RXBUF |
  844. FTGMAC100_INT_RPKT_LOST | FTGMAC100_INT_AHB_ERR |
  845. FTGMAC100_INT_PHYSTS_CHG)) {
  846. if (net_ratelimit())
  847. netdev_info(netdev, "[ISR] = 0x%x: %s%s%s%s\n", status,
  848. status & FTGMAC100_INT_NO_RXBUF ? "NO_RXBUF " : "",
  849. status & FTGMAC100_INT_RPKT_LOST ? "RPKT_LOST " : "",
  850. status & FTGMAC100_INT_AHB_ERR ? "AHB_ERR " : "",
  851. status & FTGMAC100_INT_PHYSTS_CHG ? "PHYSTS_CHG" : "");
  852. if (status & FTGMAC100_INT_NO_RXBUF) {
  853. /* RX buffer unavailable */
  854. netdev->stats.rx_over_errors++;
  855. }
  856. if (status & FTGMAC100_INT_RPKT_LOST) {
  857. /* received packet lost due to RX FIFO full */
  858. netdev->stats.rx_fifo_errors++;
  859. }
  860. }
  861. if (completed) {
  862. napi_complete(napi);
  863. /* enable all interrupts */
  864. iowrite32(priv->int_mask_all,
  865. priv->base + FTGMAC100_OFFSET_IER);
  866. }
  867. return rx;
  868. }
  869. /******************************************************************************
  870. * struct net_device_ops functions
  871. *****************************************************************************/
  872. static int ftgmac100_open(struct net_device *netdev)
  873. {
  874. struct ftgmac100 *priv = netdev_priv(netdev);
  875. int err;
  876. err = ftgmac100_alloc_buffers(priv);
  877. if (err) {
  878. netdev_err(netdev, "failed to allocate buffers\n");
  879. goto err_alloc;
  880. }
  881. err = request_irq(priv->irq, ftgmac100_interrupt, 0, netdev->name, netdev);
  882. if (err) {
  883. netdev_err(netdev, "failed to request irq %d\n", priv->irq);
  884. goto err_irq;
  885. }
  886. priv->rx_pointer = 0;
  887. priv->tx_clean_pointer = 0;
  888. priv->tx_pointer = 0;
  889. priv->tx_pending = 0;
  890. err = ftgmac100_reset_hw(priv);
  891. if (err)
  892. goto err_hw;
  893. ftgmac100_init_hw(priv);
  894. ftgmac100_start_hw(priv, priv->use_ncsi ? 100 : 10);
  895. if (netdev->phydev)
  896. phy_start(netdev->phydev);
  897. else if (priv->use_ncsi)
  898. netif_carrier_on(netdev);
  899. napi_enable(&priv->napi);
  900. netif_start_queue(netdev);
  901. /* enable all interrupts */
  902. iowrite32(priv->int_mask_all, priv->base + FTGMAC100_OFFSET_IER);
  903. /* Start the NCSI device */
  904. if (priv->use_ncsi) {
  905. err = ncsi_start_dev(priv->ndev);
  906. if (err)
  907. goto err_ncsi;
  908. }
  909. priv->enabled = true;
  910. return 0;
  911. err_ncsi:
  912. napi_disable(&priv->napi);
  913. netif_stop_queue(netdev);
  914. iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
  915. err_hw:
  916. free_irq(priv->irq, netdev);
  917. err_irq:
  918. ftgmac100_free_buffers(priv);
  919. err_alloc:
  920. return err;
  921. }
  922. static int ftgmac100_stop(struct net_device *netdev)
  923. {
  924. struct ftgmac100 *priv = netdev_priv(netdev);
  925. if (!priv->enabled)
  926. return 0;
  927. /* disable all interrupts */
  928. priv->enabled = false;
  929. iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
  930. netif_stop_queue(netdev);
  931. napi_disable(&priv->napi);
  932. if (netdev->phydev)
  933. phy_stop(netdev->phydev);
  934. ftgmac100_stop_hw(priv);
  935. free_irq(priv->irq, netdev);
  936. ftgmac100_free_buffers(priv);
  937. return 0;
  938. }
  939. static int ftgmac100_hard_start_xmit(struct sk_buff *skb,
  940. struct net_device *netdev)
  941. {
  942. struct ftgmac100 *priv = netdev_priv(netdev);
  943. dma_addr_t map;
  944. if (unlikely(skb->len > MAX_PKT_SIZE)) {
  945. if (net_ratelimit())
  946. netdev_dbg(netdev, "tx packet too big\n");
  947. netdev->stats.tx_dropped++;
  948. kfree_skb(skb);
  949. return NETDEV_TX_OK;
  950. }
  951. map = dma_map_single(priv->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
  952. if (unlikely(dma_mapping_error(priv->dev, map))) {
  953. /* drop packet */
  954. if (net_ratelimit())
  955. netdev_err(netdev, "map socket buffer failed\n");
  956. netdev->stats.tx_dropped++;
  957. kfree_skb(skb);
  958. return NETDEV_TX_OK;
  959. }
  960. return ftgmac100_xmit(priv, skb, map);
  961. }
  962. /* optional */
  963. static int ftgmac100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
  964. {
  965. if (!netdev->phydev)
  966. return -ENXIO;
  967. return phy_mii_ioctl(netdev->phydev, ifr, cmd);
  968. }
  969. static const struct net_device_ops ftgmac100_netdev_ops = {
  970. .ndo_open = ftgmac100_open,
  971. .ndo_stop = ftgmac100_stop,
  972. .ndo_start_xmit = ftgmac100_hard_start_xmit,
  973. .ndo_set_mac_address = ftgmac100_set_mac_addr,
  974. .ndo_validate_addr = eth_validate_addr,
  975. .ndo_do_ioctl = ftgmac100_do_ioctl,
  976. };
  977. static int ftgmac100_setup_mdio(struct net_device *netdev)
  978. {
  979. struct ftgmac100 *priv = netdev_priv(netdev);
  980. struct platform_device *pdev = to_platform_device(priv->dev);
  981. int i, err = 0;
  982. /* initialize mdio bus */
  983. priv->mii_bus = mdiobus_alloc();
  984. if (!priv->mii_bus)
  985. return -EIO;
  986. priv->mii_bus->name = "ftgmac100_mdio";
  987. snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%d",
  988. pdev->name, pdev->id);
  989. priv->mii_bus->priv = priv->netdev;
  990. priv->mii_bus->read = ftgmac100_mdiobus_read;
  991. priv->mii_bus->write = ftgmac100_mdiobus_write;
  992. for (i = 0; i < PHY_MAX_ADDR; i++)
  993. priv->mii_bus->irq[i] = PHY_POLL;
  994. err = mdiobus_register(priv->mii_bus);
  995. if (err) {
  996. dev_err(priv->dev, "Cannot register MDIO bus!\n");
  997. goto err_register_mdiobus;
  998. }
  999. err = ftgmac100_mii_probe(priv);
  1000. if (err) {
  1001. dev_err(priv->dev, "MII Probe failed!\n");
  1002. goto err_mii_probe;
  1003. }
  1004. return 0;
  1005. err_mii_probe:
  1006. mdiobus_unregister(priv->mii_bus);
  1007. err_register_mdiobus:
  1008. mdiobus_free(priv->mii_bus);
  1009. return err;
  1010. }
  1011. static void ftgmac100_destroy_mdio(struct net_device *netdev)
  1012. {
  1013. struct ftgmac100 *priv = netdev_priv(netdev);
  1014. if (!netdev->phydev)
  1015. return;
  1016. phy_disconnect(netdev->phydev);
  1017. mdiobus_unregister(priv->mii_bus);
  1018. mdiobus_free(priv->mii_bus);
  1019. }
  1020. static void ftgmac100_ncsi_handler(struct ncsi_dev *nd)
  1021. {
  1022. if (unlikely(nd->state != ncsi_dev_state_functional))
  1023. return;
  1024. netdev_info(nd->dev, "NCSI interface %s\n",
  1025. nd->link_up ? "up" : "down");
  1026. }
  1027. /******************************************************************************
  1028. * struct platform_driver functions
  1029. *****************************************************************************/
  1030. static int ftgmac100_probe(struct platform_device *pdev)
  1031. {
  1032. struct resource *res;
  1033. int irq;
  1034. struct net_device *netdev;
  1035. struct ftgmac100 *priv;
  1036. int err = 0;
  1037. if (!pdev)
  1038. return -ENODEV;
  1039. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1040. if (!res)
  1041. return -ENXIO;
  1042. irq = platform_get_irq(pdev, 0);
  1043. if (irq < 0)
  1044. return irq;
  1045. /* setup net_device */
  1046. netdev = alloc_etherdev(sizeof(*priv));
  1047. if (!netdev) {
  1048. err = -ENOMEM;
  1049. goto err_alloc_etherdev;
  1050. }
  1051. SET_NETDEV_DEV(netdev, &pdev->dev);
  1052. netdev->ethtool_ops = &ftgmac100_ethtool_ops;
  1053. netdev->netdev_ops = &ftgmac100_netdev_ops;
  1054. platform_set_drvdata(pdev, netdev);
  1055. /* setup private data */
  1056. priv = netdev_priv(netdev);
  1057. priv->netdev = netdev;
  1058. priv->dev = &pdev->dev;
  1059. spin_lock_init(&priv->tx_lock);
  1060. /* initialize NAPI */
  1061. netif_napi_add(netdev, &priv->napi, ftgmac100_poll, 64);
  1062. /* map io memory */
  1063. priv->res = request_mem_region(res->start, resource_size(res),
  1064. dev_name(&pdev->dev));
  1065. if (!priv->res) {
  1066. dev_err(&pdev->dev, "Could not reserve memory region\n");
  1067. err = -ENOMEM;
  1068. goto err_req_mem;
  1069. }
  1070. priv->base = ioremap(res->start, resource_size(res));
  1071. if (!priv->base) {
  1072. dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
  1073. err = -EIO;
  1074. goto err_ioremap;
  1075. }
  1076. priv->irq = irq;
  1077. /* MAC address from chip or random one */
  1078. ftgmac100_setup_mac(priv);
  1079. priv->int_mask_all = (FTGMAC100_INT_RPKT_LOST |
  1080. FTGMAC100_INT_XPKT_ETH |
  1081. FTGMAC100_INT_XPKT_LOST |
  1082. FTGMAC100_INT_AHB_ERR |
  1083. FTGMAC100_INT_PHYSTS_CHG |
  1084. FTGMAC100_INT_RPKT_BUF |
  1085. FTGMAC100_INT_NO_RXBUF);
  1086. if (pdev->dev.of_node &&
  1087. of_get_property(pdev->dev.of_node, "use-ncsi", NULL)) {
  1088. if (!IS_ENABLED(CONFIG_NET_NCSI)) {
  1089. dev_err(&pdev->dev, "NCSI stack not enabled\n");
  1090. goto err_ncsi_dev;
  1091. }
  1092. dev_info(&pdev->dev, "Using NCSI interface\n");
  1093. priv->use_ncsi = true;
  1094. priv->int_mask_all &= ~FTGMAC100_INT_PHYSTS_CHG;
  1095. priv->ndev = ncsi_register_dev(netdev, ftgmac100_ncsi_handler);
  1096. if (!priv->ndev)
  1097. goto err_ncsi_dev;
  1098. } else {
  1099. priv->use_ncsi = false;
  1100. err = ftgmac100_setup_mdio(netdev);
  1101. if (err)
  1102. goto err_setup_mdio;
  1103. }
  1104. /* We have to disable on-chip IP checksum functionality
  1105. * when NCSI is enabled on the interface. It doesn't work
  1106. * in that case.
  1107. */
  1108. netdev->features = NETIF_F_IP_CSUM | NETIF_F_GRO;
  1109. if (priv->use_ncsi &&
  1110. of_get_property(pdev->dev.of_node, "no-hw-checksum", NULL))
  1111. netdev->features &= ~NETIF_F_IP_CSUM;
  1112. /* register network device */
  1113. err = register_netdev(netdev);
  1114. if (err) {
  1115. dev_err(&pdev->dev, "Failed to register netdev\n");
  1116. goto err_register_netdev;
  1117. }
  1118. netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
  1119. return 0;
  1120. err_ncsi_dev:
  1121. err_register_netdev:
  1122. ftgmac100_destroy_mdio(netdev);
  1123. err_setup_mdio:
  1124. iounmap(priv->base);
  1125. err_ioremap:
  1126. release_resource(priv->res);
  1127. err_req_mem:
  1128. netif_napi_del(&priv->napi);
  1129. free_netdev(netdev);
  1130. err_alloc_etherdev:
  1131. return err;
  1132. }
  1133. static int __exit ftgmac100_remove(struct platform_device *pdev)
  1134. {
  1135. struct net_device *netdev;
  1136. struct ftgmac100 *priv;
  1137. netdev = platform_get_drvdata(pdev);
  1138. priv = netdev_priv(netdev);
  1139. unregister_netdev(netdev);
  1140. ftgmac100_destroy_mdio(netdev);
  1141. iounmap(priv->base);
  1142. release_resource(priv->res);
  1143. netif_napi_del(&priv->napi);
  1144. free_netdev(netdev);
  1145. return 0;
  1146. }
  1147. static const struct of_device_id ftgmac100_of_match[] = {
  1148. { .compatible = "faraday,ftgmac100" },
  1149. { }
  1150. };
  1151. MODULE_DEVICE_TABLE(of, ftgmac100_of_match);
  1152. static struct platform_driver ftgmac100_driver = {
  1153. .probe = ftgmac100_probe,
  1154. .remove = __exit_p(ftgmac100_remove),
  1155. .driver = {
  1156. .name = DRV_NAME,
  1157. .of_match_table = ftgmac100_of_match,
  1158. },
  1159. };
  1160. module_platform_driver(ftgmac100_driver);
  1161. MODULE_AUTHOR("Po-Yu Chuang <ratbert@faraday-tech.com>");
  1162. MODULE_DESCRIPTION("FTGMAC100 driver");
  1163. MODULE_LICENSE("GPL");