spl2sw_driver.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright Sunplus Technology Co., Ltd.
  3. * All rights reserved.
  4. */
  5. #include <linux/platform_device.h>
  6. #include <linux/nvmem-consumer.h>
  7. #include <linux/etherdevice.h>
  8. #include <linux/netdevice.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/of_net.h>
  11. #include <linux/reset.h>
  12. #include <linux/clk.h>
  13. #include <linux/of.h>
  14. #include "spl2sw_register.h"
  15. #include "spl2sw_define.h"
  16. #include "spl2sw_desc.h"
  17. #include "spl2sw_mdio.h"
  18. #include "spl2sw_phy.h"
  19. #include "spl2sw_int.h"
  20. #include "spl2sw_mac.h"
  21. /* net device operations */
  22. static int spl2sw_ethernet_open(struct net_device *ndev)
  23. {
  24. struct spl2sw_mac *mac = netdev_priv(ndev);
  25. struct spl2sw_common *comm = mac->comm;
  26. u32 mask;
  27. netdev_dbg(ndev, "Open port = %x\n", mac->lan_port);
  28. comm->enable |= mac->lan_port;
  29. spl2sw_mac_hw_start(comm);
  30. /* Enable TX and RX interrupts */
  31. mask = readl(comm->l2sw_reg_base + L2SW_SW_INT_MASK_0);
  32. mask &= ~(MAC_INT_TX | MAC_INT_RX);
  33. writel(mask, comm->l2sw_reg_base + L2SW_SW_INT_MASK_0);
  34. phy_start(ndev->phydev);
  35. netif_start_queue(ndev);
  36. return 0;
  37. }
  38. static int spl2sw_ethernet_stop(struct net_device *ndev)
  39. {
  40. struct spl2sw_mac *mac = netdev_priv(ndev);
  41. struct spl2sw_common *comm = mac->comm;
  42. netif_stop_queue(ndev);
  43. comm->enable &= ~mac->lan_port;
  44. phy_stop(ndev->phydev);
  45. spl2sw_mac_hw_stop(comm);
  46. return 0;
  47. }
  48. static netdev_tx_t spl2sw_ethernet_start_xmit(struct sk_buff *skb,
  49. struct net_device *ndev)
  50. {
  51. struct spl2sw_mac *mac = netdev_priv(ndev);
  52. struct spl2sw_common *comm = mac->comm;
  53. struct spl2sw_skb_info *skbinfo;
  54. struct spl2sw_mac_desc *txdesc;
  55. unsigned long flags;
  56. u32 mapping;
  57. u32 tx_pos;
  58. u32 cmd1;
  59. u32 cmd2;
  60. if (unlikely(comm->tx_desc_full == 1)) {
  61. /* No TX descriptors left. Wait for tx interrupt. */
  62. netdev_dbg(ndev, "TX descriptor queue full when xmit!\n");
  63. return NETDEV_TX_BUSY;
  64. }
  65. /* If skb size is shorter than ETH_ZLEN (60), pad it with 0. */
  66. if (unlikely(skb->len < ETH_ZLEN)) {
  67. if (skb_padto(skb, ETH_ZLEN))
  68. return NETDEV_TX_OK;
  69. skb_put(skb, ETH_ZLEN - skb->len);
  70. }
  71. mapping = dma_map_single(&comm->pdev->dev, skb->data,
  72. skb->len, DMA_TO_DEVICE);
  73. if (dma_mapping_error(&comm->pdev->dev, mapping)) {
  74. ndev->stats.tx_errors++;
  75. dev_kfree_skb(skb);
  76. return NETDEV_TX_OK;
  77. }
  78. spin_lock_irqsave(&comm->tx_lock, flags);
  79. tx_pos = comm->tx_pos;
  80. txdesc = &comm->tx_desc[tx_pos];
  81. skbinfo = &comm->tx_temp_skb_info[tx_pos];
  82. skbinfo->mapping = mapping;
  83. skbinfo->len = skb->len;
  84. skbinfo->skb = skb;
  85. /* Set up a TX descriptor */
  86. cmd1 = TXD_OWN | TXD_SOP | TXD_EOP | (mac->to_vlan << 12) |
  87. (skb->len & TXD_PKT_LEN);
  88. cmd2 = skb->len & TXD_BUF_LEN1;
  89. if (tx_pos == (TX_DESC_NUM - 1))
  90. cmd2 |= TXD_EOR;
  91. txdesc->addr1 = skbinfo->mapping;
  92. txdesc->cmd2 = cmd2;
  93. wmb(); /* Set TXD_OWN after other fields are effective. */
  94. txdesc->cmd1 = cmd1;
  95. /* Move tx_pos to next position */
  96. tx_pos = ((tx_pos + 1) == TX_DESC_NUM) ? 0 : tx_pos + 1;
  97. if (unlikely(tx_pos == comm->tx_done_pos)) {
  98. netif_stop_queue(ndev);
  99. comm->tx_desc_full = 1;
  100. }
  101. comm->tx_pos = tx_pos;
  102. wmb(); /* make sure settings are effective. */
  103. /* Trigger mac to transmit */
  104. writel(MAC_TRIG_L_SOC0, comm->l2sw_reg_base + L2SW_CPU_TX_TRIG);
  105. spin_unlock_irqrestore(&comm->tx_lock, flags);
  106. return NETDEV_TX_OK;
  107. }
  108. static void spl2sw_ethernet_set_rx_mode(struct net_device *ndev)
  109. {
  110. struct spl2sw_mac *mac = netdev_priv(ndev);
  111. spl2sw_mac_rx_mode_set(mac);
  112. }
  113. static int spl2sw_ethernet_set_mac_address(struct net_device *ndev, void *addr)
  114. {
  115. struct spl2sw_mac *mac = netdev_priv(ndev);
  116. int err;
  117. err = eth_mac_addr(ndev, addr);
  118. if (err)
  119. return err;
  120. /* Delete the old MAC address */
  121. netdev_dbg(ndev, "Old Ethernet (MAC) address = %pM\n", mac->mac_addr);
  122. if (is_valid_ether_addr(mac->mac_addr)) {
  123. err = spl2sw_mac_addr_del(mac);
  124. if (err)
  125. return err;
  126. }
  127. /* Set the MAC address */
  128. ether_addr_copy(mac->mac_addr, ndev->dev_addr);
  129. return spl2sw_mac_addr_add(mac);
  130. }
  131. static void spl2sw_ethernet_tx_timeout(struct net_device *ndev, unsigned int txqueue)
  132. {
  133. struct spl2sw_mac *mac = netdev_priv(ndev);
  134. struct spl2sw_common *comm = mac->comm;
  135. unsigned long flags;
  136. int i;
  137. netdev_err(ndev, "TX timed out!\n");
  138. ndev->stats.tx_errors++;
  139. spin_lock_irqsave(&comm->tx_lock, flags);
  140. for (i = 0; i < MAX_NETDEV_NUM; i++)
  141. if (comm->ndev[i])
  142. netif_stop_queue(comm->ndev[i]);
  143. spl2sw_mac_soft_reset(comm);
  144. /* Accept TX packets again. */
  145. for (i = 0; i < MAX_NETDEV_NUM; i++)
  146. if (comm->ndev[i]) {
  147. netif_trans_update(comm->ndev[i]);
  148. netif_wake_queue(comm->ndev[i]);
  149. }
  150. spin_unlock_irqrestore(&comm->tx_lock, flags);
  151. }
  152. static const struct net_device_ops netdev_ops = {
  153. .ndo_open = spl2sw_ethernet_open,
  154. .ndo_stop = spl2sw_ethernet_stop,
  155. .ndo_start_xmit = spl2sw_ethernet_start_xmit,
  156. .ndo_set_rx_mode = spl2sw_ethernet_set_rx_mode,
  157. .ndo_set_mac_address = spl2sw_ethernet_set_mac_address,
  158. .ndo_eth_ioctl = phy_do_ioctl,
  159. .ndo_tx_timeout = spl2sw_ethernet_tx_timeout,
  160. };
  161. static void spl2sw_check_mac_vendor_id_and_convert(u8 *mac_addr)
  162. {
  163. /* Byte order of MAC address of some samples are reversed.
  164. * Check vendor id and convert byte order if it is wrong.
  165. * OUI of Sunplus: fc:4b:bc
  166. */
  167. if (mac_addr[5] == 0xfc && mac_addr[4] == 0x4b && mac_addr[3] == 0xbc &&
  168. (mac_addr[0] != 0xfc || mac_addr[1] != 0x4b || mac_addr[2] != 0xbc)) {
  169. swap(mac_addr[0], mac_addr[5]);
  170. swap(mac_addr[1], mac_addr[4]);
  171. swap(mac_addr[2], mac_addr[3]);
  172. }
  173. }
  174. static int spl2sw_nvmem_get_mac_address(struct device *dev, struct device_node *np,
  175. void *addrbuf)
  176. {
  177. struct nvmem_cell *cell;
  178. ssize_t len;
  179. u8 *mac;
  180. /* Get nvmem cell of mac-address from dts. */
  181. cell = of_nvmem_cell_get(np, "mac-address");
  182. if (IS_ERR(cell))
  183. return PTR_ERR(cell);
  184. /* Read mac address from nvmem cell. */
  185. mac = nvmem_cell_read(cell, &len);
  186. nvmem_cell_put(cell);
  187. if (IS_ERR(mac))
  188. return PTR_ERR(mac);
  189. if (len != ETH_ALEN) {
  190. kfree(mac);
  191. dev_info(dev, "Invalid length of mac address in nvmem!\n");
  192. return -EINVAL;
  193. }
  194. /* Byte order of some samples are reversed.
  195. * Convert byte order here.
  196. */
  197. spl2sw_check_mac_vendor_id_and_convert(mac);
  198. /* Check if mac address is valid */
  199. if (!is_valid_ether_addr(mac)) {
  200. dev_info(dev, "Invalid mac address in nvmem (%pM)!\n", mac);
  201. kfree(mac);
  202. return -EINVAL;
  203. }
  204. ether_addr_copy(addrbuf, mac);
  205. kfree(mac);
  206. return 0;
  207. }
  208. static u32 spl2sw_init_netdev(struct platform_device *pdev, u8 *mac_addr,
  209. struct net_device **r_ndev)
  210. {
  211. struct net_device *ndev;
  212. struct spl2sw_mac *mac;
  213. int ret;
  214. /* Allocate the devices, and also allocate spl2sw_mac,
  215. * we can get it by netdev_priv().
  216. */
  217. ndev = devm_alloc_etherdev(&pdev->dev, sizeof(*mac));
  218. if (!ndev) {
  219. *r_ndev = NULL;
  220. return -ENOMEM;
  221. }
  222. SET_NETDEV_DEV(ndev, &pdev->dev);
  223. ndev->netdev_ops = &netdev_ops;
  224. mac = netdev_priv(ndev);
  225. mac->ndev = ndev;
  226. ether_addr_copy(mac->mac_addr, mac_addr);
  227. eth_hw_addr_set(ndev, mac_addr);
  228. dev_info(&pdev->dev, "Ethernet (MAC) address = %pM\n", mac_addr);
  229. ret = register_netdev(ndev);
  230. if (ret) {
  231. dev_err(&pdev->dev, "Failed to register net device \"%s\"!\n",
  232. ndev->name);
  233. *r_ndev = NULL;
  234. return ret;
  235. }
  236. netdev_dbg(ndev, "Registered net device \"%s\" successfully.\n", ndev->name);
  237. *r_ndev = ndev;
  238. return 0;
  239. }
  240. static struct device_node *spl2sw_get_eth_child_node(struct device_node *ether_np, int id)
  241. {
  242. struct device_node *port_np;
  243. int port_id;
  244. for_each_child_of_node(ether_np, port_np) {
  245. /* It is not a 'port' node, continue. */
  246. if (strcmp(port_np->name, "port"))
  247. continue;
  248. if (of_property_read_u32(port_np, "reg", &port_id) < 0)
  249. continue;
  250. if (port_id == id)
  251. return port_np;
  252. }
  253. /* Not found! */
  254. return NULL;
  255. }
  256. static int spl2sw_probe(struct platform_device *pdev)
  257. {
  258. struct device_node *eth_ports_np;
  259. struct device_node *port_np;
  260. struct spl2sw_common *comm;
  261. struct device_node *phy_np;
  262. phy_interface_t phy_mode;
  263. struct net_device *ndev;
  264. struct spl2sw_mac *mac;
  265. u8 mac_addr[ETH_ALEN];
  266. int irq, i, ret;
  267. if (platform_get_drvdata(pdev))
  268. return -ENODEV;
  269. /* Allocate memory for 'spl2sw_common' area. */
  270. comm = devm_kzalloc(&pdev->dev, sizeof(*comm), GFP_KERNEL);
  271. if (!comm)
  272. return -ENOMEM;
  273. comm->pdev = pdev;
  274. platform_set_drvdata(pdev, comm);
  275. spin_lock_init(&comm->tx_lock);
  276. spin_lock_init(&comm->mdio_lock);
  277. spin_lock_init(&comm->int_mask_lock);
  278. /* Get memory resource 0 from dts. */
  279. comm->l2sw_reg_base = devm_platform_ioremap_resource(pdev, 0);
  280. if (IS_ERR(comm->l2sw_reg_base))
  281. return PTR_ERR(comm->l2sw_reg_base);
  282. /* Get irq resource from dts. */
  283. ret = platform_get_irq(pdev, 0);
  284. if (ret < 0)
  285. return ret;
  286. irq = ret;
  287. /* Get clock controller. */
  288. comm->clk = devm_clk_get(&pdev->dev, NULL);
  289. if (IS_ERR(comm->clk)) {
  290. dev_err_probe(&pdev->dev, PTR_ERR(comm->clk),
  291. "Failed to retrieve clock controller!\n");
  292. return PTR_ERR(comm->clk);
  293. }
  294. /* Get reset controller. */
  295. comm->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
  296. if (IS_ERR(comm->rstc)) {
  297. dev_err_probe(&pdev->dev, PTR_ERR(comm->rstc),
  298. "Failed to retrieve reset controller!\n");
  299. return PTR_ERR(comm->rstc);
  300. }
  301. /* Enable clock. */
  302. ret = clk_prepare_enable(comm->clk);
  303. if (ret)
  304. return ret;
  305. udelay(1);
  306. /* Reset MAC */
  307. reset_control_assert(comm->rstc);
  308. udelay(1);
  309. reset_control_deassert(comm->rstc);
  310. usleep_range(1000, 2000);
  311. /* Request irq. */
  312. ret = devm_request_irq(&pdev->dev, irq, spl2sw_ethernet_interrupt, 0,
  313. dev_name(&pdev->dev), comm);
  314. if (ret) {
  315. dev_err(&pdev->dev, "Failed to request irq #%d!\n", irq);
  316. goto out_clk_disable;
  317. }
  318. /* Initialize TX and RX descriptors. */
  319. ret = spl2sw_descs_init(comm);
  320. if (ret) {
  321. dev_err(&pdev->dev, "Fail to initialize mac descriptors!\n");
  322. spl2sw_descs_free(comm);
  323. goto out_clk_disable;
  324. }
  325. /* Initialize MAC. */
  326. spl2sw_mac_init(comm);
  327. /* Initialize mdio bus */
  328. ret = spl2sw_mdio_init(comm);
  329. if (ret) {
  330. dev_err(&pdev->dev, "Failed to initialize mdio bus!\n");
  331. goto out_clk_disable;
  332. }
  333. /* Get child node ethernet-ports. */
  334. eth_ports_np = of_get_child_by_name(pdev->dev.of_node, "ethernet-ports");
  335. if (!eth_ports_np) {
  336. dev_err(&pdev->dev, "No ethernet-ports child node found!\n");
  337. ret = -ENODEV;
  338. goto out_free_mdio;
  339. }
  340. for (i = 0; i < MAX_NETDEV_NUM; i++) {
  341. /* Get port@i of node ethernet-ports. */
  342. port_np = spl2sw_get_eth_child_node(eth_ports_np, i);
  343. if (!port_np)
  344. continue;
  345. /* Get phy-mode. */
  346. if (of_get_phy_mode(port_np, &phy_mode)) {
  347. dev_err(&pdev->dev, "Failed to get phy-mode property of port@%d!\n",
  348. i);
  349. continue;
  350. }
  351. /* Get phy-handle. */
  352. phy_np = of_parse_phandle(port_np, "phy-handle", 0);
  353. if (!phy_np) {
  354. dev_err(&pdev->dev, "Failed to get phy-handle property of port@%d!\n",
  355. i);
  356. continue;
  357. }
  358. /* Get mac-address from nvmem. */
  359. ret = spl2sw_nvmem_get_mac_address(&pdev->dev, port_np, mac_addr);
  360. if (ret == -EPROBE_DEFER) {
  361. goto out_unregister_dev;
  362. } else if (ret) {
  363. dev_info(&pdev->dev, "Generate a random mac address!\n");
  364. eth_random_addr(mac_addr);
  365. }
  366. /* Initialize the net device. */
  367. ret = spl2sw_init_netdev(pdev, mac_addr, &ndev);
  368. if (ret)
  369. goto out_unregister_dev;
  370. ndev->irq = irq;
  371. comm->ndev[i] = ndev;
  372. mac = netdev_priv(ndev);
  373. mac->phy_node = phy_np;
  374. mac->phy_mode = phy_mode;
  375. mac->comm = comm;
  376. mac->lan_port = 0x1 << i; /* forward to port i */
  377. mac->to_vlan = 0x1 << i; /* vlan group: i */
  378. mac->vlan_id = i; /* vlan group: i */
  379. /* Set MAC address */
  380. ret = spl2sw_mac_addr_add(mac);
  381. if (ret)
  382. goto out_unregister_dev;
  383. spl2sw_mac_rx_mode_set(mac);
  384. }
  385. /* Find first valid net device. */
  386. for (i = 0; i < MAX_NETDEV_NUM; i++) {
  387. if (comm->ndev[i])
  388. break;
  389. }
  390. if (i >= MAX_NETDEV_NUM) {
  391. dev_err(&pdev->dev, "No valid ethernet port!\n");
  392. ret = -ENODEV;
  393. goto out_free_mdio;
  394. }
  395. /* Save first valid net device */
  396. ndev = comm->ndev[i];
  397. ret = spl2sw_phy_connect(comm);
  398. if (ret) {
  399. netdev_err(ndev, "Failed to connect phy!\n");
  400. goto out_unregister_dev;
  401. }
  402. /* Add and enable napi. */
  403. netif_napi_add(ndev, &comm->rx_napi, spl2sw_rx_poll);
  404. napi_enable(&comm->rx_napi);
  405. netif_napi_add_tx(ndev, &comm->tx_napi, spl2sw_tx_poll);
  406. napi_enable(&comm->tx_napi);
  407. return 0;
  408. out_unregister_dev:
  409. for (i = 0; i < MAX_NETDEV_NUM; i++)
  410. if (comm->ndev[i])
  411. unregister_netdev(comm->ndev[i]);
  412. out_free_mdio:
  413. spl2sw_mdio_remove(comm);
  414. out_clk_disable:
  415. clk_disable_unprepare(comm->clk);
  416. return ret;
  417. }
  418. static void spl2sw_remove(struct platform_device *pdev)
  419. {
  420. struct spl2sw_common *comm;
  421. int i;
  422. comm = platform_get_drvdata(pdev);
  423. spl2sw_phy_remove(comm);
  424. /* Unregister and free net device. */
  425. for (i = 0; i < MAX_NETDEV_NUM; i++)
  426. if (comm->ndev[i])
  427. unregister_netdev(comm->ndev[i]);
  428. comm->enable = 0;
  429. spl2sw_mac_hw_stop(comm);
  430. spl2sw_descs_free(comm);
  431. /* Disable and delete napi. */
  432. napi_disable(&comm->rx_napi);
  433. netif_napi_del(&comm->rx_napi);
  434. napi_disable(&comm->tx_napi);
  435. netif_napi_del(&comm->tx_napi);
  436. spl2sw_mdio_remove(comm);
  437. clk_disable_unprepare(comm->clk);
  438. }
  439. static const struct of_device_id spl2sw_of_match[] = {
  440. {.compatible = "sunplus,sp7021-emac"},
  441. { /* sentinel */ }
  442. };
  443. MODULE_DEVICE_TABLE(of, spl2sw_of_match);
  444. static struct platform_driver spl2sw_driver = {
  445. .probe = spl2sw_probe,
  446. .remove = spl2sw_remove,
  447. .driver = {
  448. .name = "sp7021_emac",
  449. .of_match_table = spl2sw_of_match,
  450. },
  451. };
  452. module_platform_driver(spl2sw_driver);
  453. MODULE_AUTHOR("Wells Lu <wellslutw@gmail.com>");
  454. MODULE_DESCRIPTION("Sunplus Dual 10M/100M Ethernet driver");
  455. MODULE_LICENSE("GPL");