en_netdev.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  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/etherdevice.h>
  34. #include <linux/tcp.h>
  35. #include <linux/if_vlan.h>
  36. #include <linux/delay.h>
  37. #include <linux/mlx4/driver.h>
  38. #include <linux/mlx4/device.h>
  39. #include <linux/mlx4/cmd.h>
  40. #include <linux/mlx4/cq.h>
  41. #include "mlx4_en.h"
  42. #include "en_port.h"
  43. static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
  44. {
  45. struct mlx4_en_priv *priv = netdev_priv(dev);
  46. struct mlx4_en_dev *mdev = priv->mdev;
  47. int err;
  48. en_dbg(HW, priv, "Registering VLAN group:%p\n", grp);
  49. priv->vlgrp = grp;
  50. mutex_lock(&mdev->state_lock);
  51. if (mdev->device_up && priv->port_up) {
  52. err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, grp);
  53. if (err)
  54. en_err(priv, "Failed configuring VLAN filter\n");
  55. }
  56. mutex_unlock(&mdev->state_lock);
  57. }
  58. static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
  59. {
  60. struct mlx4_en_priv *priv = netdev_priv(dev);
  61. struct mlx4_en_dev *mdev = priv->mdev;
  62. int err;
  63. if (!priv->vlgrp)
  64. return;
  65. en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n",
  66. vid, vlan_group_get_device(priv->vlgrp, vid));
  67. /* Add VID to port VLAN filter */
  68. mutex_lock(&mdev->state_lock);
  69. if (mdev->device_up && priv->port_up) {
  70. err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
  71. if (err)
  72. en_err(priv, "Failed configuring VLAN filter\n");
  73. }
  74. mutex_unlock(&mdev->state_lock);
  75. }
  76. static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
  77. {
  78. struct mlx4_en_priv *priv = netdev_priv(dev);
  79. struct mlx4_en_dev *mdev = priv->mdev;
  80. int err;
  81. if (!priv->vlgrp)
  82. return;
  83. en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n",
  84. vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid));
  85. vlan_group_set_device(priv->vlgrp, vid, NULL);
  86. /* Remove VID from port VLAN filter */
  87. mutex_lock(&mdev->state_lock);
  88. if (mdev->device_up && priv->port_up) {
  89. err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
  90. if (err)
  91. en_err(priv, "Failed configuring VLAN filter\n");
  92. }
  93. mutex_unlock(&mdev->state_lock);
  94. }
  95. static u64 mlx4_en_mac_to_u64(u8 *addr)
  96. {
  97. u64 mac = 0;
  98. int i;
  99. for (i = 0; i < ETH_ALEN; i++) {
  100. mac <<= 8;
  101. mac |= addr[i];
  102. }
  103. return mac;
  104. }
  105. static int mlx4_en_set_mac(struct net_device *dev, void *addr)
  106. {
  107. struct mlx4_en_priv *priv = netdev_priv(dev);
  108. struct mlx4_en_dev *mdev = priv->mdev;
  109. struct sockaddr *saddr = addr;
  110. if (!is_valid_ether_addr(saddr->sa_data))
  111. return -EADDRNOTAVAIL;
  112. memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
  113. priv->mac = mlx4_en_mac_to_u64(dev->dev_addr);
  114. queue_work(mdev->workqueue, &priv->mac_task);
  115. return 0;
  116. }
  117. static void mlx4_en_do_set_mac(struct work_struct *work)
  118. {
  119. struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
  120. mac_task);
  121. struct mlx4_en_dev *mdev = priv->mdev;
  122. int err = 0;
  123. mutex_lock(&mdev->state_lock);
  124. if (priv->port_up) {
  125. /* Remove old MAC and insert the new one */
  126. mlx4_unregister_mac(mdev->dev, priv->port, priv->mac_index);
  127. err = mlx4_register_mac(mdev->dev, priv->port,
  128. priv->mac, &priv->mac_index);
  129. if (err)
  130. en_err(priv, "Failed changing HW MAC address\n");
  131. } else
  132. en_dbg(HW, priv, "Port is down while "
  133. "registering mac, exiting...\n");
  134. mutex_unlock(&mdev->state_lock);
  135. }
  136. static void mlx4_en_clear_list(struct net_device *dev)
  137. {
  138. struct mlx4_en_priv *priv = netdev_priv(dev);
  139. struct dev_mc_list *plist = priv->mc_list;
  140. struct dev_mc_list *next;
  141. while (plist) {
  142. next = plist->next;
  143. kfree(plist);
  144. plist = next;
  145. }
  146. priv->mc_list = NULL;
  147. }
  148. static void mlx4_en_cache_mclist(struct net_device *dev)
  149. {
  150. struct mlx4_en_priv *priv = netdev_priv(dev);
  151. struct dev_mc_list *mclist;
  152. struct dev_mc_list *tmp;
  153. struct dev_mc_list *plist = NULL;
  154. for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
  155. tmp = kmalloc(sizeof(struct dev_mc_list), GFP_ATOMIC);
  156. if (!tmp) {
  157. en_err(priv, "failed to allocate multicast list\n");
  158. mlx4_en_clear_list(dev);
  159. return;
  160. }
  161. memcpy(tmp, mclist, sizeof(struct dev_mc_list));
  162. tmp->next = NULL;
  163. if (plist)
  164. plist->next = tmp;
  165. else
  166. priv->mc_list = tmp;
  167. plist = tmp;
  168. }
  169. }
  170. static void mlx4_en_set_multicast(struct net_device *dev)
  171. {
  172. struct mlx4_en_priv *priv = netdev_priv(dev);
  173. if (!priv->port_up)
  174. return;
  175. queue_work(priv->mdev->workqueue, &priv->mcast_task);
  176. }
  177. static void mlx4_en_do_set_multicast(struct work_struct *work)
  178. {
  179. struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
  180. mcast_task);
  181. struct mlx4_en_dev *mdev = priv->mdev;
  182. struct net_device *dev = priv->dev;
  183. struct dev_mc_list *mclist;
  184. u64 mcast_addr = 0;
  185. int err;
  186. mutex_lock(&mdev->state_lock);
  187. if (!mdev->device_up) {
  188. en_dbg(HW, priv, "Card is not up, "
  189. "ignoring multicast change.\n");
  190. goto out;
  191. }
  192. if (!priv->port_up) {
  193. en_dbg(HW, priv, "Port is down, "
  194. "ignoring multicast change.\n");
  195. goto out;
  196. }
  197. /*
  198. * Promsicuous mode: disable all filters
  199. */
  200. if (dev->flags & IFF_PROMISC) {
  201. if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) {
  202. if (netif_msg_rx_status(priv))
  203. en_warn(priv, "Entering promiscuous mode\n");
  204. priv->flags |= MLX4_EN_FLAG_PROMISC;
  205. /* Enable promiscouos mode */
  206. err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
  207. priv->base_qpn, 1);
  208. if (err)
  209. en_err(priv, "Failed enabling "
  210. "promiscous mode\n");
  211. /* Disable port multicast filter (unconditionally) */
  212. err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
  213. 0, MLX4_MCAST_DISABLE);
  214. if (err)
  215. en_err(priv, "Failed disabling "
  216. "multicast filter\n");
  217. /* Disable port VLAN filter */
  218. err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL);
  219. if (err)
  220. en_err(priv, "Failed disabling VLAN filter\n");
  221. }
  222. goto out;
  223. }
  224. /*
  225. * Not in promiscous mode
  226. */
  227. if (priv->flags & MLX4_EN_FLAG_PROMISC) {
  228. if (netif_msg_rx_status(priv))
  229. en_warn(priv, "Leaving promiscuous mode\n");
  230. priv->flags &= ~MLX4_EN_FLAG_PROMISC;
  231. /* Disable promiscouos mode */
  232. err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
  233. priv->base_qpn, 0);
  234. if (err)
  235. en_err(priv, "Failed disabling promiscous mode\n");
  236. /* Enable port VLAN filter */
  237. err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
  238. if (err)
  239. en_err(priv, "Failed enabling VLAN filter\n");
  240. }
  241. /* Enable/disable the multicast filter according to IFF_ALLMULTI */
  242. if (dev->flags & IFF_ALLMULTI) {
  243. err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
  244. 0, MLX4_MCAST_DISABLE);
  245. if (err)
  246. en_err(priv, "Failed disabling multicast filter\n");
  247. } else {
  248. err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
  249. 0, MLX4_MCAST_DISABLE);
  250. if (err)
  251. en_err(priv, "Failed disabling multicast filter\n");
  252. /* Flush mcast filter and init it with broadcast address */
  253. mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, ETH_BCAST,
  254. 1, MLX4_MCAST_CONFIG);
  255. /* Update multicast list - we cache all addresses so they won't
  256. * change while HW is updated holding the command semaphor */
  257. netif_tx_lock_bh(dev);
  258. mlx4_en_cache_mclist(dev);
  259. netif_tx_unlock_bh(dev);
  260. for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
  261. mcast_addr = mlx4_en_mac_to_u64(mclist->dmi_addr);
  262. mlx4_SET_MCAST_FLTR(mdev->dev, priv->port,
  263. mcast_addr, 0, MLX4_MCAST_CONFIG);
  264. }
  265. err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
  266. 0, MLX4_MCAST_ENABLE);
  267. if (err)
  268. en_err(priv, "Failed enabling multicast filter\n");
  269. mlx4_en_clear_list(dev);
  270. }
  271. out:
  272. mutex_unlock(&mdev->state_lock);
  273. }
  274. #ifdef CONFIG_NET_POLL_CONTROLLER
  275. static void mlx4_en_netpoll(struct net_device *dev)
  276. {
  277. struct mlx4_en_priv *priv = netdev_priv(dev);
  278. struct mlx4_en_cq *cq;
  279. unsigned long flags;
  280. int i;
  281. for (i = 0; i < priv->rx_ring_num; i++) {
  282. cq = &priv->rx_cq[i];
  283. spin_lock_irqsave(&cq->lock, flags);
  284. napi_synchronize(&cq->napi);
  285. mlx4_en_process_rx_cq(dev, cq, 0);
  286. spin_unlock_irqrestore(&cq->lock, flags);
  287. }
  288. }
  289. #endif
  290. static void mlx4_en_tx_timeout(struct net_device *dev)
  291. {
  292. struct mlx4_en_priv *priv = netdev_priv(dev);
  293. struct mlx4_en_dev *mdev = priv->mdev;
  294. if (netif_msg_timer(priv))
  295. en_warn(priv, "Tx timeout called on port:%d\n", priv->port);
  296. priv->port_stats.tx_timeout++;
  297. en_dbg(DRV, priv, "Scheduling watchdog\n");
  298. queue_work(mdev->workqueue, &priv->watchdog_task);
  299. }
  300. static struct net_device_stats *mlx4_en_get_stats(struct net_device *dev)
  301. {
  302. struct mlx4_en_priv *priv = netdev_priv(dev);
  303. spin_lock_bh(&priv->stats_lock);
  304. memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats));
  305. spin_unlock_bh(&priv->stats_lock);
  306. return &priv->ret_stats;
  307. }
  308. static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv)
  309. {
  310. struct mlx4_en_cq *cq;
  311. int i;
  312. /* If we haven't received a specific coalescing setting
  313. * (module param), we set the moderation parameters as follows:
  314. * - moder_cnt is set to the number of mtu sized packets to
  315. * satisfy our coelsing target.
  316. * - moder_time is set to a fixed value.
  317. */
  318. priv->rx_frames = MLX4_EN_RX_COAL_TARGET;
  319. priv->rx_usecs = MLX4_EN_RX_COAL_TIME;
  320. en_dbg(INTR, priv, "Default coalesing params for mtu:%d - "
  321. "rx_frames:%d rx_usecs:%d\n",
  322. priv->dev->mtu, priv->rx_frames, priv->rx_usecs);
  323. /* Setup cq moderation params */
  324. for (i = 0; i < priv->rx_ring_num; i++) {
  325. cq = &priv->rx_cq[i];
  326. cq->moder_cnt = priv->rx_frames;
  327. cq->moder_time = priv->rx_usecs;
  328. }
  329. for (i = 0; i < priv->tx_ring_num; i++) {
  330. cq = &priv->tx_cq[i];
  331. cq->moder_cnt = MLX4_EN_TX_COAL_PKTS;
  332. cq->moder_time = MLX4_EN_TX_COAL_TIME;
  333. }
  334. /* Reset auto-moderation params */
  335. priv->pkt_rate_low = MLX4_EN_RX_RATE_LOW;
  336. priv->rx_usecs_low = MLX4_EN_RX_COAL_TIME_LOW;
  337. priv->pkt_rate_high = MLX4_EN_RX_RATE_HIGH;
  338. priv->rx_usecs_high = MLX4_EN_RX_COAL_TIME_HIGH;
  339. priv->sample_interval = MLX4_EN_SAMPLE_INTERVAL;
  340. priv->adaptive_rx_coal = 1;
  341. priv->last_moder_time = MLX4_EN_AUTO_CONF;
  342. priv->last_moder_jiffies = 0;
  343. priv->last_moder_packets = 0;
  344. priv->last_moder_tx_packets = 0;
  345. priv->last_moder_bytes = 0;
  346. }
  347. static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
  348. {
  349. unsigned long period = (unsigned long) (jiffies - priv->last_moder_jiffies);
  350. struct mlx4_en_cq *cq;
  351. unsigned long packets;
  352. unsigned long rate;
  353. unsigned long avg_pkt_size;
  354. unsigned long rx_packets;
  355. unsigned long rx_bytes;
  356. unsigned long rx_byte_diff;
  357. unsigned long tx_packets;
  358. unsigned long tx_pkt_diff;
  359. unsigned long rx_pkt_diff;
  360. int moder_time;
  361. int i, err;
  362. if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ)
  363. return;
  364. spin_lock_bh(&priv->stats_lock);
  365. rx_packets = priv->stats.rx_packets;
  366. rx_bytes = priv->stats.rx_bytes;
  367. tx_packets = priv->stats.tx_packets;
  368. spin_unlock_bh(&priv->stats_lock);
  369. if (!priv->last_moder_jiffies || !period)
  370. goto out;
  371. tx_pkt_diff = ((unsigned long) (tx_packets -
  372. priv->last_moder_tx_packets));
  373. rx_pkt_diff = ((unsigned long) (rx_packets -
  374. priv->last_moder_packets));
  375. packets = max(tx_pkt_diff, rx_pkt_diff);
  376. rx_byte_diff = rx_bytes - priv->last_moder_bytes;
  377. rx_byte_diff = rx_byte_diff ? rx_byte_diff : 1;
  378. rate = packets * HZ / period;
  379. avg_pkt_size = packets ? ((unsigned long) (rx_bytes -
  380. priv->last_moder_bytes)) / packets : 0;
  381. /* Apply auto-moderation only when packet rate exceeds a rate that
  382. * it matters */
  383. if (rate > MLX4_EN_RX_RATE_THRESH) {
  384. /* If tx and rx packet rates are not balanced, assume that
  385. * traffic is mainly BW bound and apply maximum moderation.
  386. * Otherwise, moderate according to packet rate */
  387. if (2 * tx_pkt_diff > 3 * rx_pkt_diff &&
  388. rx_pkt_diff / rx_byte_diff <
  389. MLX4_EN_SMALL_PKT_SIZE)
  390. moder_time = priv->rx_usecs_low;
  391. else if (2 * rx_pkt_diff > 3 * tx_pkt_diff)
  392. moder_time = priv->rx_usecs_high;
  393. else {
  394. if (rate < priv->pkt_rate_low)
  395. moder_time = priv->rx_usecs_low;
  396. else if (rate > priv->pkt_rate_high)
  397. moder_time = priv->rx_usecs_high;
  398. else
  399. moder_time = (rate - priv->pkt_rate_low) *
  400. (priv->rx_usecs_high - priv->rx_usecs_low) /
  401. (priv->pkt_rate_high - priv->pkt_rate_low) +
  402. priv->rx_usecs_low;
  403. }
  404. } else {
  405. /* When packet rate is low, use default moderation rather than
  406. * 0 to prevent interrupt storms if traffic suddenly increases */
  407. moder_time = priv->rx_usecs;
  408. }
  409. en_dbg(INTR, priv, "tx rate:%lu rx_rate:%lu\n",
  410. tx_pkt_diff * HZ / period, rx_pkt_diff * HZ / period);
  411. en_dbg(INTR, priv, "Rx moder_time changed from:%d to %d period:%lu "
  412. "[jiff] packets:%lu avg_pkt_size:%lu rate:%lu [p/s])\n",
  413. priv->last_moder_time, moder_time, period, packets,
  414. avg_pkt_size, rate);
  415. if (moder_time != priv->last_moder_time) {
  416. priv->last_moder_time = moder_time;
  417. for (i = 0; i < priv->rx_ring_num; i++) {
  418. cq = &priv->rx_cq[i];
  419. cq->moder_time = moder_time;
  420. err = mlx4_en_set_cq_moder(priv, cq);
  421. if (err) {
  422. en_err(priv, "Failed modifying moderation for cq:%d\n", i);
  423. break;
  424. }
  425. }
  426. }
  427. out:
  428. priv->last_moder_packets = rx_packets;
  429. priv->last_moder_tx_packets = tx_packets;
  430. priv->last_moder_bytes = rx_bytes;
  431. priv->last_moder_jiffies = jiffies;
  432. }
  433. static void mlx4_en_do_get_stats(struct work_struct *work)
  434. {
  435. struct delayed_work *delay = to_delayed_work(work);
  436. struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv,
  437. stats_task);
  438. struct mlx4_en_dev *mdev = priv->mdev;
  439. int err;
  440. err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0);
  441. if (err)
  442. en_dbg(HW, priv, "Could not update stats \n");
  443. mutex_lock(&mdev->state_lock);
  444. if (mdev->device_up) {
  445. if (priv->port_up)
  446. mlx4_en_auto_moderation(priv);
  447. queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
  448. }
  449. mutex_unlock(&mdev->state_lock);
  450. }
  451. static void mlx4_en_linkstate(struct work_struct *work)
  452. {
  453. struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
  454. linkstate_task);
  455. struct mlx4_en_dev *mdev = priv->mdev;
  456. int linkstate = priv->link_state;
  457. mutex_lock(&mdev->state_lock);
  458. /* If observable port state changed set carrier state and
  459. * report to system log */
  460. if (priv->last_link_state != linkstate) {
  461. if (linkstate == MLX4_DEV_EVENT_PORT_DOWN) {
  462. en_dbg(LINK, priv, "Link Down\n");
  463. netif_carrier_off(priv->dev);
  464. } else {
  465. en_dbg(LINK, priv, "Link Up\n");
  466. netif_carrier_on(priv->dev);
  467. }
  468. }
  469. priv->last_link_state = linkstate;
  470. mutex_unlock(&mdev->state_lock);
  471. }
  472. int mlx4_en_start_port(struct net_device *dev)
  473. {
  474. struct mlx4_en_priv *priv = netdev_priv(dev);
  475. struct mlx4_en_dev *mdev = priv->mdev;
  476. struct mlx4_en_cq *cq;
  477. struct mlx4_en_tx_ring *tx_ring;
  478. int rx_index = 0;
  479. int tx_index = 0;
  480. int err = 0;
  481. int i;
  482. int j;
  483. if (priv->port_up) {
  484. en_dbg(DRV, priv, "start port called while port already up\n");
  485. return 0;
  486. }
  487. /* Calculate Rx buf size */
  488. dev->mtu = min(dev->mtu, priv->max_mtu);
  489. mlx4_en_calc_rx_buf(dev);
  490. en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_skb_size);
  491. /* Configure rx cq's and rings */
  492. err = mlx4_en_activate_rx_rings(priv);
  493. if (err) {
  494. en_err(priv, "Failed to activate RX rings\n");
  495. return err;
  496. }
  497. for (i = 0; i < priv->rx_ring_num; i++) {
  498. cq = &priv->rx_cq[i];
  499. err = mlx4_en_activate_cq(priv, cq);
  500. if (err) {
  501. en_err(priv, "Failed activating Rx CQ\n");
  502. goto cq_err;
  503. }
  504. for (j = 0; j < cq->size; j++)
  505. cq->buf[j].owner_sr_opcode = MLX4_CQE_OWNER_MASK;
  506. err = mlx4_en_set_cq_moder(priv, cq);
  507. if (err) {
  508. en_err(priv, "Failed setting cq moderation parameters");
  509. mlx4_en_deactivate_cq(priv, cq);
  510. goto cq_err;
  511. }
  512. mlx4_en_arm_cq(priv, cq);
  513. priv->rx_ring[i].cqn = cq->mcq.cqn;
  514. ++rx_index;
  515. }
  516. err = mlx4_en_config_rss_steer(priv);
  517. if (err) {
  518. en_err(priv, "Failed configuring rss steering\n");
  519. goto cq_err;
  520. }
  521. /* Configure tx cq's and rings */
  522. for (i = 0; i < priv->tx_ring_num; i++) {
  523. /* Configure cq */
  524. cq = &priv->tx_cq[i];
  525. err = mlx4_en_activate_cq(priv, cq);
  526. if (err) {
  527. en_err(priv, "Failed allocating Tx CQ\n");
  528. goto tx_err;
  529. }
  530. err = mlx4_en_set_cq_moder(priv, cq);
  531. if (err) {
  532. en_err(priv, "Failed setting cq moderation parameters");
  533. mlx4_en_deactivate_cq(priv, cq);
  534. goto tx_err;
  535. }
  536. en_dbg(DRV, priv, "Resetting index of collapsed CQ:%d to -1\n", i);
  537. cq->buf->wqe_index = cpu_to_be16(0xffff);
  538. /* Configure ring */
  539. tx_ring = &priv->tx_ring[i];
  540. err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn);
  541. if (err) {
  542. en_err(priv, "Failed allocating Tx ring\n");
  543. mlx4_en_deactivate_cq(priv, cq);
  544. goto tx_err;
  545. }
  546. /* Set initial ownership of all Tx TXBBs to SW (1) */
  547. for (j = 0; j < tx_ring->buf_size; j += STAMP_STRIDE)
  548. *((u32 *) (tx_ring->buf + j)) = 0xffffffff;
  549. ++tx_index;
  550. }
  551. /* Configure port */
  552. err = mlx4_SET_PORT_general(mdev->dev, priv->port,
  553. priv->rx_skb_size + ETH_FCS_LEN,
  554. priv->prof->tx_pause,
  555. priv->prof->tx_ppp,
  556. priv->prof->rx_pause,
  557. priv->prof->rx_ppp);
  558. if (err) {
  559. en_err(priv, "Failed setting port general configurations "
  560. "for port %d, with error %d\n", priv->port, err);
  561. goto tx_err;
  562. }
  563. /* Set default qp number */
  564. err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, priv->base_qpn, 0);
  565. if (err) {
  566. en_err(priv, "Failed setting default qp numbers\n");
  567. goto tx_err;
  568. }
  569. /* Set port mac number */
  570. en_dbg(DRV, priv, "Setting mac for port %d\n", priv->port);
  571. err = mlx4_register_mac(mdev->dev, priv->port,
  572. priv->mac, &priv->mac_index);
  573. if (err) {
  574. en_err(priv, "Failed setting port mac\n");
  575. goto tx_err;
  576. }
  577. /* Init port */
  578. en_dbg(HW, priv, "Initializing port\n");
  579. err = mlx4_INIT_PORT(mdev->dev, priv->port);
  580. if (err) {
  581. en_err(priv, "Failed Initializing port\n");
  582. goto mac_err;
  583. }
  584. /* Schedule multicast task to populate multicast list */
  585. queue_work(mdev->workqueue, &priv->mcast_task);
  586. priv->port_up = true;
  587. netif_tx_start_all_queues(dev);
  588. return 0;
  589. mac_err:
  590. mlx4_unregister_mac(mdev->dev, priv->port, priv->mac_index);
  591. tx_err:
  592. while (tx_index--) {
  593. mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[tx_index]);
  594. mlx4_en_deactivate_cq(priv, &priv->tx_cq[tx_index]);
  595. }
  596. mlx4_en_release_rss_steer(priv);
  597. cq_err:
  598. while (rx_index--)
  599. mlx4_en_deactivate_cq(priv, &priv->rx_cq[rx_index]);
  600. for (i = 0; i < priv->rx_ring_num; i++)
  601. mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
  602. return err; /* need to close devices */
  603. }
  604. void mlx4_en_stop_port(struct net_device *dev)
  605. {
  606. struct mlx4_en_priv *priv = netdev_priv(dev);
  607. struct mlx4_en_dev *mdev = priv->mdev;
  608. int i;
  609. if (!priv->port_up) {
  610. en_dbg(DRV, priv, "stop port called while port already down\n");
  611. return;
  612. }
  613. /* Synchronize with tx routine */
  614. netif_tx_lock_bh(dev);
  615. netif_tx_stop_all_queues(dev);
  616. netif_tx_unlock_bh(dev);
  617. /* close port*/
  618. priv->port_up = false;
  619. mlx4_CLOSE_PORT(mdev->dev, priv->port);
  620. /* Unregister Mac address for the port */
  621. mlx4_unregister_mac(mdev->dev, priv->port, priv->mac_index);
  622. /* Free TX Rings */
  623. for (i = 0; i < priv->tx_ring_num; i++) {
  624. mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[i]);
  625. mlx4_en_deactivate_cq(priv, &priv->tx_cq[i]);
  626. }
  627. msleep(10);
  628. for (i = 0; i < priv->tx_ring_num; i++)
  629. mlx4_en_free_tx_buf(dev, &priv->tx_ring[i]);
  630. /* Free RSS qps */
  631. mlx4_en_release_rss_steer(priv);
  632. /* Free RX Rings */
  633. for (i = 0; i < priv->rx_ring_num; i++) {
  634. mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
  635. while (test_bit(NAPI_STATE_SCHED, &priv->rx_cq[i].napi.state))
  636. msleep(1);
  637. mlx4_en_deactivate_cq(priv, &priv->rx_cq[i]);
  638. }
  639. }
  640. static void mlx4_en_restart(struct work_struct *work)
  641. {
  642. struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
  643. watchdog_task);
  644. struct mlx4_en_dev *mdev = priv->mdev;
  645. struct net_device *dev = priv->dev;
  646. en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port);
  647. mutex_lock(&mdev->state_lock);
  648. if (priv->port_up) {
  649. mlx4_en_stop_port(dev);
  650. if (mlx4_en_start_port(dev))
  651. en_err(priv, "Failed restarting port %d\n", priv->port);
  652. }
  653. mutex_unlock(&mdev->state_lock);
  654. }
  655. static int mlx4_en_open(struct net_device *dev)
  656. {
  657. struct mlx4_en_priv *priv = netdev_priv(dev);
  658. struct mlx4_en_dev *mdev = priv->mdev;
  659. int i;
  660. int err = 0;
  661. mutex_lock(&mdev->state_lock);
  662. if (!mdev->device_up) {
  663. en_err(priv, "Cannot open - device down/disabled\n");
  664. err = -EBUSY;
  665. goto out;
  666. }
  667. /* Reset HW statistics and performance counters */
  668. if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1))
  669. en_dbg(HW, priv, "Failed dumping statistics\n");
  670. memset(&priv->stats, 0, sizeof(priv->stats));
  671. memset(&priv->pstats, 0, sizeof(priv->pstats));
  672. for (i = 0; i < priv->tx_ring_num; i++) {
  673. priv->tx_ring[i].bytes = 0;
  674. priv->tx_ring[i].packets = 0;
  675. }
  676. for (i = 0; i < priv->rx_ring_num; i++) {
  677. priv->rx_ring[i].bytes = 0;
  678. priv->rx_ring[i].packets = 0;
  679. }
  680. mlx4_en_set_default_moderation(priv);
  681. err = mlx4_en_start_port(dev);
  682. if (err)
  683. en_err(priv, "Failed starting port:%d\n", priv->port);
  684. out:
  685. mutex_unlock(&mdev->state_lock);
  686. return err;
  687. }
  688. static int mlx4_en_close(struct net_device *dev)
  689. {
  690. struct mlx4_en_priv *priv = netdev_priv(dev);
  691. struct mlx4_en_dev *mdev = priv->mdev;
  692. en_dbg(IFDOWN, priv, "Close port called\n");
  693. mutex_lock(&mdev->state_lock);
  694. mlx4_en_stop_port(dev);
  695. netif_carrier_off(dev);
  696. mutex_unlock(&mdev->state_lock);
  697. return 0;
  698. }
  699. void mlx4_en_free_resources(struct mlx4_en_priv *priv)
  700. {
  701. int i;
  702. for (i = 0; i < priv->tx_ring_num; i++) {
  703. if (priv->tx_ring[i].tx_info)
  704. mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]);
  705. if (priv->tx_cq[i].buf)
  706. mlx4_en_destroy_cq(priv, &priv->tx_cq[i]);
  707. }
  708. for (i = 0; i < priv->rx_ring_num; i++) {
  709. if (priv->rx_ring[i].rx_info)
  710. mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i]);
  711. if (priv->rx_cq[i].buf)
  712. mlx4_en_destroy_cq(priv, &priv->rx_cq[i]);
  713. }
  714. }
  715. int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
  716. {
  717. struct mlx4_en_port_profile *prof = priv->prof;
  718. int i;
  719. /* Create tx Rings */
  720. for (i = 0; i < priv->tx_ring_num; i++) {
  721. if (mlx4_en_create_cq(priv, &priv->tx_cq[i],
  722. prof->tx_ring_size, i, TX))
  723. goto err;
  724. if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i],
  725. prof->tx_ring_size, TXBB_SIZE))
  726. goto err;
  727. }
  728. /* Create rx Rings */
  729. for (i = 0; i < priv->rx_ring_num; i++) {
  730. if (mlx4_en_create_cq(priv, &priv->rx_cq[i],
  731. prof->rx_ring_size, i, RX))
  732. goto err;
  733. if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i],
  734. prof->rx_ring_size, priv->stride))
  735. goto err;
  736. }
  737. return 0;
  738. err:
  739. en_err(priv, "Failed to allocate NIC resources\n");
  740. return -ENOMEM;
  741. }
  742. void mlx4_en_destroy_netdev(struct net_device *dev)
  743. {
  744. struct mlx4_en_priv *priv = netdev_priv(dev);
  745. struct mlx4_en_dev *mdev = priv->mdev;
  746. en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
  747. /* Unregister device - this will close the port if it was up */
  748. if (priv->registered)
  749. unregister_netdev(dev);
  750. if (priv->allocated)
  751. mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE);
  752. cancel_delayed_work(&priv->stats_task);
  753. /* flush any pending task for this netdev */
  754. flush_workqueue(mdev->workqueue);
  755. /* Detach the netdev so tasks would not attempt to access it */
  756. mutex_lock(&mdev->state_lock);
  757. mdev->pndev[priv->port] = NULL;
  758. mutex_unlock(&mdev->state_lock);
  759. mlx4_en_free_resources(priv);
  760. free_netdev(dev);
  761. }
  762. static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
  763. {
  764. struct mlx4_en_priv *priv = netdev_priv(dev);
  765. struct mlx4_en_dev *mdev = priv->mdev;
  766. int err = 0;
  767. en_dbg(DRV, priv, "Change MTU called - current:%d new:%d\n",
  768. dev->mtu, new_mtu);
  769. if ((new_mtu < MLX4_EN_MIN_MTU) || (new_mtu > priv->max_mtu)) {
  770. en_err(priv, "Bad MTU size:%d.\n", new_mtu);
  771. return -EPERM;
  772. }
  773. dev->mtu = new_mtu;
  774. if (netif_running(dev)) {
  775. mutex_lock(&mdev->state_lock);
  776. if (!mdev->device_up) {
  777. /* NIC is probably restarting - let watchdog task reset
  778. * the port */
  779. en_dbg(DRV, priv, "Change MTU called with card down!?\n");
  780. } else {
  781. mlx4_en_stop_port(dev);
  782. mlx4_en_set_default_moderation(priv);
  783. err = mlx4_en_start_port(dev);
  784. if (err) {
  785. en_err(priv, "Failed restarting port:%d\n",
  786. priv->port);
  787. queue_work(mdev->workqueue, &priv->watchdog_task);
  788. }
  789. }
  790. mutex_unlock(&mdev->state_lock);
  791. }
  792. return 0;
  793. }
  794. static const struct net_device_ops mlx4_netdev_ops = {
  795. .ndo_open = mlx4_en_open,
  796. .ndo_stop = mlx4_en_close,
  797. .ndo_start_xmit = mlx4_en_xmit,
  798. .ndo_select_queue = mlx4_en_select_queue,
  799. .ndo_get_stats = mlx4_en_get_stats,
  800. .ndo_set_multicast_list = mlx4_en_set_multicast,
  801. .ndo_set_mac_address = mlx4_en_set_mac,
  802. .ndo_validate_addr = eth_validate_addr,
  803. .ndo_change_mtu = mlx4_en_change_mtu,
  804. .ndo_tx_timeout = mlx4_en_tx_timeout,
  805. .ndo_vlan_rx_register = mlx4_en_vlan_rx_register,
  806. .ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid,
  807. .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
  808. #ifdef CONFIG_NET_POLL_CONTROLLER
  809. .ndo_poll_controller = mlx4_en_netpoll,
  810. #endif
  811. };
  812. int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
  813. struct mlx4_en_port_profile *prof)
  814. {
  815. struct net_device *dev;
  816. struct mlx4_en_priv *priv;
  817. int i;
  818. int err;
  819. dev = alloc_etherdev_mq(sizeof(struct mlx4_en_priv), prof->tx_ring_num);
  820. if (dev == NULL) {
  821. mlx4_err(mdev, "Net device allocation failed\n");
  822. return -ENOMEM;
  823. }
  824. SET_NETDEV_DEV(dev, &mdev->dev->pdev->dev);
  825. /*
  826. * Initialize driver private data
  827. */
  828. priv = netdev_priv(dev);
  829. memset(priv, 0, sizeof(struct mlx4_en_priv));
  830. priv->dev = dev;
  831. priv->mdev = mdev;
  832. priv->prof = prof;
  833. priv->port = port;
  834. priv->port_up = false;
  835. priv->rx_csum = 1;
  836. priv->flags = prof->flags;
  837. priv->tx_ring_num = prof->tx_ring_num;
  838. priv->rx_ring_num = prof->rx_ring_num;
  839. priv->mc_list = NULL;
  840. priv->mac_index = -1;
  841. priv->msg_enable = MLX4_EN_MSG_LEVEL;
  842. spin_lock_init(&priv->stats_lock);
  843. INIT_WORK(&priv->mcast_task, mlx4_en_do_set_multicast);
  844. INIT_WORK(&priv->mac_task, mlx4_en_do_set_mac);
  845. INIT_WORK(&priv->watchdog_task, mlx4_en_restart);
  846. INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
  847. INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);
  848. /* Query for default mac and max mtu */
  849. priv->max_mtu = mdev->dev->caps.eth_mtu_cap[priv->port];
  850. priv->mac = mdev->dev->caps.def_mac[priv->port];
  851. if (ILLEGAL_MAC(priv->mac)) {
  852. en_err(priv, "Port: %d, invalid mac burned: 0x%llx, quiting\n",
  853. priv->port, priv->mac);
  854. err = -EINVAL;
  855. goto out;
  856. }
  857. priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) +
  858. DS_SIZE * MLX4_EN_MAX_RX_FRAGS);
  859. err = mlx4_en_alloc_resources(priv);
  860. if (err)
  861. goto out;
  862. /* Allocate page for receive rings */
  863. err = mlx4_alloc_hwq_res(mdev->dev, &priv->res,
  864. MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE);
  865. if (err) {
  866. en_err(priv, "Failed to allocate page for rx qps\n");
  867. goto out;
  868. }
  869. priv->allocated = 1;
  870. /*
  871. * Initialize netdev entry points
  872. */
  873. dev->netdev_ops = &mlx4_netdev_ops;
  874. dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT;
  875. dev->real_num_tx_queues = MLX4_EN_NUM_TX_RINGS;
  876. SET_ETHTOOL_OPS(dev, &mlx4_en_ethtool_ops);
  877. /* Set defualt MAC */
  878. dev->addr_len = ETH_ALEN;
  879. for (i = 0; i < ETH_ALEN; i++)
  880. dev->dev_addr[ETH_ALEN - 1 - i] =
  881. (u8) (priv->mac >> (8 * i));
  882. /*
  883. * Set driver features
  884. */
  885. dev->features |= NETIF_F_SG;
  886. dev->vlan_features |= NETIF_F_SG;
  887. dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
  888. dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
  889. dev->features |= NETIF_F_HIGHDMA;
  890. dev->features |= NETIF_F_HW_VLAN_TX |
  891. NETIF_F_HW_VLAN_RX |
  892. NETIF_F_HW_VLAN_FILTER;
  893. if (mdev->profile.num_lro)
  894. dev->features |= NETIF_F_LRO;
  895. if (mdev->LSO_support) {
  896. dev->features |= NETIF_F_TSO;
  897. dev->features |= NETIF_F_TSO6;
  898. dev->vlan_features |= NETIF_F_TSO;
  899. dev->vlan_features |= NETIF_F_TSO6;
  900. }
  901. mdev->pndev[port] = dev;
  902. netif_carrier_off(dev);
  903. err = register_netdev(dev);
  904. if (err) {
  905. en_err(priv, "Netdev registration failed for port %d\n", port);
  906. goto out;
  907. }
  908. en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num);
  909. en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
  910. priv->registered = 1;
  911. queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
  912. return 0;
  913. out:
  914. mlx4_en_destroy_netdev(dev);
  915. return err;
  916. }