en_main.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*
  2. * Copyright (c) 2007 Mellanox Technologies. All rights reserved.
  3. *
  4. * This software is available to you under a choice of one of two
  5. * licenses. You may choose to be licensed under the terms of the GNU
  6. * General Public License (GPL) Version 2, available from the file
  7. * COPYING in the main directory of this source tree, or the
  8. * OpenIB.org BSD license below:
  9. *
  10. * Redistribution and use in source and binary forms, with or
  11. * without modification, are permitted provided that the following
  12. * conditions are met:
  13. *
  14. * - Redistributions of source code must retain the above
  15. * copyright notice, this list of conditions and the following
  16. * disclaimer.
  17. *
  18. * - Redistributions in binary form must reproduce the above
  19. * copyright notice, this list of conditions and the following
  20. * disclaimer in the documentation and/or other materials
  21. * provided with the distribution.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30. * SOFTWARE.
  31. *
  32. */
  33. #include <linux/cpumask.h>
  34. #include <linux/module.h>
  35. #include <linux/delay.h>
  36. #include <linux/netdevice.h>
  37. #include <linux/mlx4/driver.h>
  38. #include <linux/mlx4/device.h>
  39. #include <linux/mlx4/cmd.h>
  40. #include "mlx4_en.h"
  41. MODULE_AUTHOR("Liran Liss, Yevgeny Petrilin");
  42. MODULE_DESCRIPTION("Mellanox ConnectX HCA Ethernet driver");
  43. MODULE_LICENSE("Dual BSD/GPL");
  44. MODULE_VERSION(DRV_VERSION " ("DRV_RELDATE")");
  45. static const char mlx4_en_version[] =
  46. DRV_NAME ": Mellanox ConnectX HCA Ethernet driver v"
  47. DRV_VERSION " (" DRV_RELDATE ")\n";
  48. static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
  49. enum mlx4_dev_event event, int port)
  50. {
  51. struct mlx4_en_dev *mdev = (struct mlx4_en_dev *) endev_ptr;
  52. struct mlx4_en_priv *priv;
  53. if (!mdev->pndev[port])
  54. return;
  55. priv = netdev_priv(mdev->pndev[port]);
  56. switch (event) {
  57. case MLX4_DEV_EVENT_PORT_UP:
  58. case MLX4_DEV_EVENT_PORT_DOWN:
  59. /* To prevent races, we poll the link state in a separate
  60. task rather than changing it here */
  61. priv->link_state = event;
  62. queue_work(mdev->workqueue, &priv->linkstate_task);
  63. break;
  64. case MLX4_DEV_EVENT_CATASTROPHIC_ERROR:
  65. mlx4_err(mdev, "Internal error detected, restarting device\n");
  66. break;
  67. default:
  68. mlx4_warn(mdev, "Unhandled event: %d\n", event);
  69. }
  70. }
  71. static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr)
  72. {
  73. struct mlx4_en_dev *mdev = endev_ptr;
  74. int i;
  75. mutex_lock(&mdev->state_lock);
  76. mdev->device_up = false;
  77. mutex_unlock(&mdev->state_lock);
  78. mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
  79. if (mdev->pndev[i])
  80. mlx4_en_destroy_netdev(mdev->pndev[i]);
  81. flush_workqueue(mdev->workqueue);
  82. destroy_workqueue(mdev->workqueue);
  83. mlx4_mr_free(dev, &mdev->mr);
  84. mlx4_uar_free(dev, &mdev->priv_uar);
  85. mlx4_pd_free(dev, mdev->priv_pdn);
  86. kfree(mdev);
  87. }
  88. static void *mlx4_en_add(struct mlx4_dev *dev)
  89. {
  90. static int mlx4_en_version_printed;
  91. struct mlx4_en_dev *mdev;
  92. int i;
  93. int err;
  94. if (!mlx4_en_version_printed) {
  95. printk(KERN_INFO "%s", mlx4_en_version);
  96. mlx4_en_version_printed++;
  97. }
  98. mdev = kzalloc(sizeof *mdev, GFP_KERNEL);
  99. if (!mdev) {
  100. dev_err(&dev->pdev->dev, "Device struct alloc failed, "
  101. "aborting.\n");
  102. err = -ENOMEM;
  103. goto err_free_res;
  104. }
  105. if (mlx4_pd_alloc(dev, &mdev->priv_pdn))
  106. goto err_free_dev;
  107. if (mlx4_uar_alloc(dev, &mdev->priv_uar))
  108. goto err_pd;
  109. mdev->uar_map = ioremap(mdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
  110. if (!mdev->uar_map)
  111. goto err_uar;
  112. spin_lock_init(&mdev->uar_lock);
  113. mdev->dev = dev;
  114. mdev->dma_device = &(dev->pdev->dev);
  115. mdev->pdev = dev->pdev;
  116. mdev->device_up = false;
  117. mdev->LSO_support = !!(dev->caps.flags & (1 << 15));
  118. if (!mdev->LSO_support)
  119. mlx4_warn(mdev, "LSO not supported, please upgrade to later "
  120. "FW version to enable LSO\n");
  121. if (mlx4_mr_alloc(mdev->dev, mdev->priv_pdn, 0, ~0ull,
  122. MLX4_PERM_LOCAL_WRITE | MLX4_PERM_LOCAL_READ,
  123. 0, 0, &mdev->mr)) {
  124. mlx4_err(mdev, "Failed allocating memory region\n");
  125. goto err_uar;
  126. }
  127. if (mlx4_mr_enable(mdev->dev, &mdev->mr)) {
  128. mlx4_err(mdev, "Failed enabling memory region\n");
  129. goto err_mr;
  130. }
  131. /* Build device profile according to supplied module parameters */
  132. err = mlx4_en_get_profile(mdev);
  133. if (err) {
  134. mlx4_err(mdev, "Bad module parameters, aborting.\n");
  135. goto err_mr;
  136. }
  137. /* Configure wich ports to start according to module parameters */
  138. mdev->port_cnt = 0;
  139. mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
  140. mdev->port_cnt++;
  141. /* If we did not receive an explicit number of Rx rings, default to
  142. * the number of completion vectors populated by the mlx4_core */
  143. mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
  144. mlx4_info(mdev, "Using %d tx rings for port:%d\n",
  145. mdev->profile.prof[i].tx_ring_num, i);
  146. mdev->profile.prof[i].rx_ring_num =
  147. min_t(int, dev->caps.num_comp_vectors, MAX_RX_RINGS);
  148. mlx4_info(mdev, "Defaulting to %d rx rings for port:%d\n",
  149. mdev->profile.prof[i].rx_ring_num, i);
  150. }
  151. /* Create our own workqueue for reset/multicast tasks
  152. * Note: we cannot use the shared workqueue because of deadlocks caused
  153. * by the rtnl lock */
  154. mdev->workqueue = create_singlethread_workqueue("mlx4_en");
  155. if (!mdev->workqueue) {
  156. err = -ENOMEM;
  157. goto err_close_nic;
  158. }
  159. /* At this stage all non-port specific tasks are complete:
  160. * mark the card state as up */
  161. mutex_init(&mdev->state_lock);
  162. mdev->device_up = true;
  163. /* Setup ports */
  164. /* Create a netdev for each port */
  165. mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
  166. mlx4_info(mdev, "Activating port:%d\n", i);
  167. if (mlx4_en_init_netdev(mdev, i, &mdev->profile.prof[i])) {
  168. mdev->pndev[i] = NULL;
  169. goto err_free_netdev;
  170. }
  171. }
  172. return mdev;
  173. err_free_netdev:
  174. mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
  175. if (mdev->pndev[i])
  176. mlx4_en_destroy_netdev(mdev->pndev[i]);
  177. }
  178. mutex_lock(&mdev->state_lock);
  179. mdev->device_up = false;
  180. mutex_unlock(&mdev->state_lock);
  181. flush_workqueue(mdev->workqueue);
  182. /* Stop event queue before we drop down to release shared SW state */
  183. err_close_nic:
  184. destroy_workqueue(mdev->workqueue);
  185. err_mr:
  186. mlx4_mr_free(dev, &mdev->mr);
  187. err_uar:
  188. mlx4_uar_free(dev, &mdev->priv_uar);
  189. err_pd:
  190. mlx4_pd_free(dev, mdev->priv_pdn);
  191. err_free_dev:
  192. kfree(mdev);
  193. err_free_res:
  194. return NULL;
  195. }
  196. static struct mlx4_interface mlx4_en_interface = {
  197. .add = mlx4_en_add,
  198. .remove = mlx4_en_remove,
  199. .event = mlx4_en_event,
  200. };
  201. static int __init mlx4_en_init(void)
  202. {
  203. return mlx4_register_interface(&mlx4_en_interface);
  204. }
  205. static void __exit mlx4_en_cleanup(void)
  206. {
  207. mlx4_unregister_interface(&mlx4_en_interface);
  208. }
  209. module_init(mlx4_en_init);
  210. module_exit(mlx4_en_cleanup);