en_netdev.c 73.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/*
 * Copyright (c) 2007 Mellanox Technologies. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 */

#include <linux/etherdevice.h>
#include <linux/tcp.h>
#include <linux/if_vlan.h>
#include <linux/delay.h>
38
#include <linux/slab.h>
39 40
#include <linux/hash.h>
#include <net/ip.h>
41
#include <net/busy_poll.h>
O
Or Gerlitz 已提交
42
#include <net/vxlan.h>
43 44 45 46 47 48 49 50 51

#include <linux/mlx4/driver.h>
#include <linux/mlx4/device.h>
#include <linux/mlx4/cmd.h>
#include <linux/mlx4/cq.h>

#include "mlx4_en.h"
#include "en_port.h"

52
int mlx4_en_setup_tc(struct net_device *dev, u8 up)
53
{
54 55
	struct mlx4_en_priv *priv = netdev_priv(dev);
	int i;
56
	unsigned int offset = 0;
57 58

	if (up && up != MLX4_EN_NUM_UP)
59 60
		return -EINVAL;

61 62 63 64
	netdev_set_num_tc(dev, up);

	/* Partition Tx queues evenly amongst UP's */
	for (i = 0; i < up; i++) {
65 66
		netdev_set_tc_queue(dev, i, priv->num_tx_rings_p_up, offset);
		offset += priv->num_tx_rings_p_up;
67 68
	}

69 70 71
	return 0;
}

72
#ifdef CONFIG_NET_RX_BUSY_POLL
73 74 75 76 77 78
/* must be called with local_bh_disable()d */
static int mlx4_en_low_latency_recv(struct napi_struct *napi)
{
	struct mlx4_en_cq *cq = container_of(napi, struct mlx4_en_cq, napi);
	struct net_device *dev = cq->dev;
	struct mlx4_en_priv *priv = netdev_priv(dev);
79
	struct mlx4_en_rx_ring *rx_ring = priv->rx_ring[cq->ring];
80 81 82 83 84 85 86 87 88
	int done;

	if (!priv->port_up)
		return LL_FLUSH_FAILED;

	if (!mlx4_en_cq_lock_poll(cq))
		return LL_FLUSH_BUSY;

	done = mlx4_en_process_rx_cq(dev, cq, 4);
89 90 91 92
	if (likely(done))
		rx_ring->cleaned += done;
	else
		rx_ring->misses++;
93 94 95 96 97

	mlx4_en_cq_unlock_poll(cq);

	return done;
}
98
#endif	/* CONFIG_NET_RX_BUSY_POLL */
99

100 101 102 103 104 105
#ifdef CONFIG_RFS_ACCEL

struct mlx4_en_filter {
	struct list_head next;
	struct work_struct work;

E
Eyal Perry 已提交
106
	u8     ip_proto;
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
	__be32 src_ip;
	__be32 dst_ip;
	__be16 src_port;
	__be16 dst_port;

	int rxq_index;
	struct mlx4_en_priv *priv;
	u32 flow_id;			/* RFS infrastructure id */
	int id;				/* mlx4_en driver id */
	u64 reg_id;			/* Flow steering API id */
	u8 activated;			/* Used to prevent expiry before filter
					 * is attached
					 */
	struct hlist_node filter_chain;
};

static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv);

E
Eyal Perry 已提交
125 126 127 128 129 130 131 132
static enum mlx4_net_trans_rule_id mlx4_ip_proto_to_trans_rule_id(u8 ip_proto)
{
	switch (ip_proto) {
	case IPPROTO_UDP:
		return MLX4_NET_TRANS_RULE_ID_UDP;
	case IPPROTO_TCP:
		return MLX4_NET_TRANS_RULE_ID_TCP;
	default:
133
		return MLX4_NET_TRANS_RULE_NUM;
E
Eyal Perry 已提交
134 135 136
	}
};

137 138 139 140 141 142
static void mlx4_en_filter_work(struct work_struct *work)
{
	struct mlx4_en_filter *filter = container_of(work,
						     struct mlx4_en_filter,
						     work);
	struct mlx4_en_priv *priv = filter->priv;
E
Eyal Perry 已提交
143 144
	struct mlx4_spec_list spec_tcp_udp = {
		.id = mlx4_ip_proto_to_trans_rule_id(filter->ip_proto),
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
		{
			.tcp_udp = {
				.dst_port = filter->dst_port,
				.dst_port_msk = (__force __be16)-1,
				.src_port = filter->src_port,
				.src_port_msk = (__force __be16)-1,
			},
		},
	};
	struct mlx4_spec_list spec_ip = {
		.id = MLX4_NET_TRANS_RULE_ID_IPV4,
		{
			.ipv4 = {
				.dst_ip = filter->dst_ip,
				.dst_ip_msk = (__force __be32)-1,
				.src_ip = filter->src_ip,
				.src_ip_msk = (__force __be32)-1,
			},
		},
	};
	struct mlx4_spec_list spec_eth = {
		.id = MLX4_NET_TRANS_RULE_ID_ETH,
	};
	struct mlx4_net_trans_rule rule = {
		.list = LIST_HEAD_INIT(rule.list),
		.queue_mode = MLX4_NET_TRANS_Q_LIFO,
		.exclusive = 1,
		.allow_loopback = 1,
173
		.promisc_mode = MLX4_FS_REGULAR,
174 175 176 177 178 179
		.port = priv->port,
		.priority = MLX4_DOMAIN_RFS,
	};
	int rc;
	__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);

180
	if (spec_tcp_udp.id >= MLX4_NET_TRANS_RULE_NUM) {
E
Eyal Perry 已提交
181 182 183 184
		en_warn(priv, "RFS: ignoring unsupported ip protocol (%d)\n",
			filter->ip_proto);
		goto ignore;
	}
185 186
	list_add_tail(&spec_eth.list, &rule.list);
	list_add_tail(&spec_ip.list, &rule.list);
E
Eyal Perry 已提交
187
	list_add_tail(&spec_tcp_udp.list, &rule.list);
188 189

	rule.qpn = priv->rss_map.qps[filter->rxq_index].qpn;
190
	memcpy(spec_eth.eth.dst_mac, priv->dev->dev_addr, ETH_ALEN);
191 192 193 194 195 196 197 198 199 200 201 202 203 204
	memcpy(spec_eth.eth.dst_mac_msk, &mac_mask, ETH_ALEN);

	filter->activated = 0;

	if (filter->reg_id) {
		rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id);
		if (rc && rc != -ENOENT)
			en_err(priv, "Error detaching flow. rc = %d\n", rc);
	}

	rc = mlx4_flow_attach(priv->mdev->dev, &rule, &filter->reg_id);
	if (rc)
		en_err(priv, "Error attaching flow. err = %d\n", rc);

E
Eyal Perry 已提交
205
ignore:
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
	mlx4_en_filter_rfs_expire(priv);

	filter->activated = 1;
}

static inline struct hlist_head *
filter_hash_bucket(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip,
		   __be16 src_port, __be16 dst_port)
{
	unsigned long l;
	int bucket_idx;

	l = (__force unsigned long)src_port |
	    ((__force unsigned long)dst_port << 2);
	l ^= (__force unsigned long)(src_ip ^ dst_ip);

	bucket_idx = hash_long(l, MLX4_EN_FILTER_HASH_SHIFT);

	return &priv->filter_hash[bucket_idx];
}

static struct mlx4_en_filter *
mlx4_en_filter_alloc(struct mlx4_en_priv *priv, int rxq_index, __be32 src_ip,
E
Eyal Perry 已提交
229 230
		     __be32 dst_ip, u8 ip_proto, __be16 src_port,
		     __be16 dst_port, u32 flow_id)
231 232 233 234 235 236 237 238 239 240 241 242 243
{
	struct mlx4_en_filter *filter = NULL;

	filter = kzalloc(sizeof(struct mlx4_en_filter), GFP_ATOMIC);
	if (!filter)
		return NULL;

	filter->priv = priv;
	filter->rxq_index = rxq_index;
	INIT_WORK(&filter->work, mlx4_en_filter_work);

	filter->src_ip = src_ip;
	filter->dst_ip = dst_ip;
E
Eyal Perry 已提交
244
	filter->ip_proto = ip_proto;
245 246 247 248 249
	filter->src_port = src_port;
	filter->dst_port = dst_port;

	filter->flow_id = flow_id;

250
	filter->id = priv->last_filter_id++ % RPS_NO_FILTER;
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275

	list_add_tail(&filter->next, &priv->filters);
	hlist_add_head(&filter->filter_chain,
		       filter_hash_bucket(priv, src_ip, dst_ip, src_port,
					  dst_port));

	return filter;
}

static void mlx4_en_filter_free(struct mlx4_en_filter *filter)
{
	struct mlx4_en_priv *priv = filter->priv;
	int rc;

	list_del(&filter->next);

	rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id);
	if (rc && rc != -ENOENT)
		en_err(priv, "Error detaching flow. rc = %d\n", rc);

	kfree(filter);
}

static inline struct mlx4_en_filter *
mlx4_en_filter_find(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip,
E
Eyal Perry 已提交
276
		    u8 ip_proto, __be16 src_port, __be16 dst_port)
277 278 279 280
{
	struct mlx4_en_filter *filter;
	struct mlx4_en_filter *ret = NULL;

281
	hlist_for_each_entry(filter,
282 283 284 285 286
			     filter_hash_bucket(priv, src_ip, dst_ip,
						src_port, dst_port),
			     filter_chain) {
		if (filter->src_ip == src_ip &&
		    filter->dst_ip == dst_ip &&
E
Eyal Perry 已提交
287
		    filter->ip_proto == ip_proto &&
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
		    filter->src_port == src_port &&
		    filter->dst_port == dst_port) {
			ret = filter;
			break;
		}
	}

	return ret;
}

static int
mlx4_en_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
		   u16 rxq_index, u32 flow_id)
{
	struct mlx4_en_priv *priv = netdev_priv(net_dev);
	struct mlx4_en_filter *filter;
	const struct iphdr *ip;
	const __be16 *ports;
E
Eyal Perry 已提交
306
	u8 ip_proto;
307 308 309 310 311 312 313 314 315 316 317 318 319 320
	__be32 src_ip;
	__be32 dst_ip;
	__be16 src_port;
	__be16 dst_port;
	int nhoff = skb_network_offset(skb);
	int ret = 0;

	if (skb->protocol != htons(ETH_P_IP))
		return -EPROTONOSUPPORT;

	ip = (const struct iphdr *)(skb->data + nhoff);
	if (ip_is_fragment(ip))
		return -EPROTONOSUPPORT;

E
Eyal Perry 已提交
321 322
	if ((ip->protocol != IPPROTO_TCP) && (ip->protocol != IPPROTO_UDP))
		return -EPROTONOSUPPORT;
323 324
	ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl);

E
Eyal Perry 已提交
325
	ip_proto = ip->protocol;
326 327 328 329 330 331
	src_ip = ip->saddr;
	dst_ip = ip->daddr;
	src_port = ports[0];
	dst_port = ports[1];

	spin_lock_bh(&priv->filters_lock);
E
Eyal Perry 已提交
332 333
	filter = mlx4_en_filter_find(priv, src_ip, dst_ip, ip_proto,
				     src_port, dst_port);
334 335 336 337 338 339 340
	if (filter) {
		if (filter->rxq_index == rxq_index)
			goto out;

		filter->rxq_index = rxq_index;
	} else {
		filter = mlx4_en_filter_alloc(priv, rxq_index,
E
Eyal Perry 已提交
341
					      src_ip, dst_ip, ip_proto,
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
					      src_port, dst_port, flow_id);
		if (!filter) {
			ret = -ENOMEM;
			goto err;
		}
	}

	queue_work(priv->mdev->workqueue, &filter->work);

out:
	ret = filter->id;
err:
	spin_unlock_bh(&priv->filters_lock);

	return ret;
}

359
void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv)
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
{
	struct mlx4_en_filter *filter, *tmp;
	LIST_HEAD(del_list);

	spin_lock_bh(&priv->filters_lock);
	list_for_each_entry_safe(filter, tmp, &priv->filters, next) {
		list_move(&filter->next, &del_list);
		hlist_del(&filter->filter_chain);
	}
	spin_unlock_bh(&priv->filters_lock);

	list_for_each_entry_safe(filter, tmp, &del_list, next) {
		cancel_work_sync(&filter->work);
		mlx4_en_filter_free(filter);
	}
}

static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv)
{
	struct mlx4_en_filter *filter = NULL, *tmp, *last_filter = NULL;
	LIST_HEAD(del_list);
	int i = 0;

	spin_lock_bh(&priv->filters_lock);
	list_for_each_entry_safe(filter, tmp, &priv->filters, next) {
		if (i > MLX4_EN_FILTER_EXPIRY_QUOTA)
			break;

		if (filter->activated &&
		    !work_pending(&filter->work) &&
		    rps_may_expire_flow(priv->dev,
					filter->rxq_index, filter->flow_id,
					filter->id)) {
			list_move(&filter->next, &del_list);
			hlist_del(&filter->filter_chain);
		} else
			last_filter = filter;

		i++;
	}

	if (last_filter && (&last_filter->next != priv->filters.next))
		list_move(&priv->filters, &last_filter->next);

	spin_unlock_bh(&priv->filters_lock);

	list_for_each_entry_safe(filter, tmp, &del_list, next)
		mlx4_en_filter_free(filter);
}
#endif

411 412
static int mlx4_en_vlan_rx_add_vid(struct net_device *dev,
				   __be16 proto, u16 vid)
413 414 415 416
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int err;
E
Eli Cohen 已提交
417
	int idx;
418

J
Jiri Pirko 已提交
419
	en_dbg(HW, priv, "adding VLAN:%d\n", vid);
420

J
Jiri Pirko 已提交
421
	set_bit(vid, priv->active_vlans);
422 423 424 425

	/* Add VID to port VLAN filter */
	mutex_lock(&mdev->state_lock);
	if (mdev->device_up && priv->port_up) {
J
Jiri Pirko 已提交
426
		err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
427
		if (err)
428
			en_err(priv, "Failed configuring VLAN filter\n");
429
	}
E
Eli Cohen 已提交
430
	if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx))
431
		en_dbg(HW, priv, "failed adding vlan %d\n", vid);
432
	mutex_unlock(&mdev->state_lock);
E
Eli Cohen 已提交
433

434
	return 0;
435 436
}

437 438
static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
				    __be16 proto, u16 vid)
439 440 441 442 443
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int err;

J
Jiri Pirko 已提交
444
	en_dbg(HW, priv, "Killing VID:%d\n", vid);
445

J
Jiri Pirko 已提交
446
	clear_bit(vid, priv->active_vlans);
447 448 449

	/* Remove VID from port VLAN filter */
	mutex_lock(&mdev->state_lock);
450
	mlx4_unregister_vlan(mdev->dev, priv->port, vid);
E
Eli Cohen 已提交
451

452
	if (mdev->device_up && priv->port_up) {
J
Jiri Pirko 已提交
453
		err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
454
		if (err)
455
			en_err(priv, "Failed configuring VLAN filter\n");
456 457
	}
	mutex_unlock(&mdev->state_lock);
458 459

	return 0;
460 461
}

462 463
static void mlx4_en_u64_to_mac(unsigned char dst_mac[ETH_ALEN + 2], u64 src_mac)
{
464 465
	int i;
	for (i = ETH_ALEN - 1; i >= 0; --i) {
466 467 468 469 470 471
		dst_mac[i] = src_mac & 0xff;
		src_mac >>= 8;
	}
	memset(&dst_mac[ETH_ALEN], 0, 2);
}

472 473 474 475 476 477 478 479 480

static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *addr,
				    int qpn, u64 *reg_id)
{
	int err;

	if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
		return 0; /* do nothing */

481 482
	err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn,
				    MLX4_DOMAIN_NIC, reg_id);
483 484 485 486 487 488 489 490 491
	if (err) {
		en_err(priv, "failed to add vxlan steering rule, err %d\n", err);
		return err;
	}
	en_dbg(DRV, priv, "added vxlan steering rule, mac %pM reg_id %llx\n", addr, *reg_id);
	return 0;
}


492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
static int mlx4_en_uc_steer_add(struct mlx4_en_priv *priv,
				unsigned char *mac, int *qpn, u64 *reg_id)
{
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_dev *dev = mdev->dev;
	int err;

	switch (dev->caps.steering_mode) {
	case MLX4_STEERING_MODE_B0: {
		struct mlx4_qp qp;
		u8 gid[16] = {0};

		qp.qpn = *qpn;
		memcpy(&gid[10], mac, ETH_ALEN);
		gid[5] = priv->port;

		err = mlx4_unicast_attach(dev, &qp, gid, 0, MLX4_PROT_ETH);
		break;
	}
	case MLX4_STEERING_MODE_DEVICE_MANAGED: {
		struct mlx4_spec_list spec_eth = { {NULL} };
		__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);

		struct mlx4_net_trans_rule rule = {
			.queue_mode = MLX4_NET_TRANS_Q_FIFO,
			.exclusive = 0,
			.allow_loopback = 1,
519
			.promisc_mode = MLX4_FS_REGULAR,
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
			.priority = MLX4_DOMAIN_NIC,
		};

		rule.port = priv->port;
		rule.qpn = *qpn;
		INIT_LIST_HEAD(&rule.list);

		spec_eth.id = MLX4_NET_TRANS_RULE_ID_ETH;
		memcpy(spec_eth.eth.dst_mac, mac, ETH_ALEN);
		memcpy(spec_eth.eth.dst_mac_msk, &mac_mask, ETH_ALEN);
		list_add_tail(&spec_eth.list, &rule.list);

		err = mlx4_flow_attach(dev, &rule, reg_id);
		break;
	}
	default:
		return -EINVAL;
	}
	if (err)
		en_warn(priv, "Failed Attaching Unicast\n");

	return err;
}

static void mlx4_en_uc_steer_release(struct mlx4_en_priv *priv,
				     unsigned char *mac, int qpn, u64 reg_id)
{
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_dev *dev = mdev->dev;

	switch (dev->caps.steering_mode) {
	case MLX4_STEERING_MODE_B0: {
		struct mlx4_qp qp;
		u8 gid[16] = {0};

		qp.qpn = qpn;
		memcpy(&gid[10], mac, ETH_ALEN);
		gid[5] = priv->port;

		mlx4_unicast_detach(dev, &qp, gid, MLX4_PROT_ETH);
		break;
	}
	case MLX4_STEERING_MODE_DEVICE_MANAGED: {
		mlx4_flow_detach(dev, reg_id);
		break;
	}
	default:
		en_err(priv, "Invalid steering mode.\n");
	}
}

static int mlx4_en_get_qp(struct mlx4_en_priv *priv)
{
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_dev *dev = mdev->dev;
	struct mlx4_mac_entry *entry;
	int index = 0;
	int err = 0;
578
	u64 reg_id = 0;
579
	int *qpn = &priv->base_qpn;
580
	u64 mac = mlx4_mac_to_u64(priv->dev->dev_addr);
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

	en_dbg(DRV, priv, "Registering MAC: %pM for adding\n",
	       priv->dev->dev_addr);
	index = mlx4_register_mac(dev, priv->port, mac);
	if (index < 0) {
		err = index;
		en_err(priv, "Failed adding MAC: %pM\n",
		       priv->dev->dev_addr);
		return err;
	}

	if (dev->caps.steering_mode == MLX4_STEERING_MODE_A0) {
		int base_qpn = mlx4_get_base_qpn(dev, priv->port);
		*qpn = base_qpn + index;
		return 0;
	}

	err = mlx4_qp_reserve_range(dev, 1, 1, qpn);
	en_dbg(DRV, priv, "Reserved qp %d\n", *qpn);
	if (err) {
		en_err(priv, "Failed to reserve qp for mac registration\n");
		goto qp_err;
	}

	err = mlx4_en_uc_steer_add(priv, priv->dev->dev_addr, qpn, &reg_id);
	if (err)
		goto steer_err;

609 610 611
	err = mlx4_en_tunnel_steer_add(priv, priv->dev->dev_addr, *qpn,
				       &priv->tunnel_reg_id);
	if (err)
612 613
		goto tunnel_err;

614 615 616 617 618 619
	entry = kmalloc(sizeof(*entry), GFP_KERNEL);
	if (!entry) {
		err = -ENOMEM;
		goto alloc_err;
	}
	memcpy(entry->mac, priv->dev->dev_addr, sizeof(entry->mac));
620
	memcpy(priv->current_mac, entry->mac, sizeof(priv->current_mac));
621 622
	entry->reg_id = reg_id;

623 624
	hlist_add_head_rcu(&entry->hlist,
			   &priv->mac_hash[entry->mac[MLX4_EN_MAC_HASH_IDX]]);
625

626
	return 0;
627 628

alloc_err:
629 630 631
	if (priv->tunnel_reg_id)
		mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id);
tunnel_err:
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
	mlx4_en_uc_steer_release(priv, priv->dev->dev_addr, *qpn, reg_id);

steer_err:
	mlx4_qp_release_range(dev, *qpn, 1);

qp_err:
	mlx4_unregister_mac(dev, priv->port, mac);
	return err;
}

static void mlx4_en_put_qp(struct mlx4_en_priv *priv)
{
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_dev *dev = mdev->dev;
	int qpn = priv->base_qpn;
647
	u64 mac;
648

649
	if (dev->caps.steering_mode == MLX4_STEERING_MODE_A0) {
650
		mac = mlx4_mac_to_u64(priv->dev->dev_addr);
651 652 653 654
		en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
		       priv->dev->dev_addr);
		mlx4_unregister_mac(dev, priv->port, mac);
	} else {
655
		struct mlx4_mac_entry *entry;
656
		struct hlist_node *tmp;
657
		struct hlist_head *bucket;
658
		unsigned int i;
659

660 661 662
		for (i = 0; i < MLX4_EN_MAC_HASH_SIZE; ++i) {
			bucket = &priv->mac_hash[i];
			hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
663
				mac = mlx4_mac_to_u64(entry->mac);
664 665
				en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
				       entry->mac);
666 667 668
				mlx4_en_uc_steer_release(priv, entry->mac,
							 qpn, entry->reg_id);

669
				mlx4_unregister_mac(dev, priv->port, mac);
670 671 672
				hlist_del_rcu(&entry->hlist);
				kfree_rcu(entry, rcu);
			}
673
		}
674

675 676 677 678 679
		if (priv->tunnel_reg_id) {
			mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id);
			priv->tunnel_reg_id = 0;
		}

680 681 682 683
		en_dbg(DRV, priv, "Releasing qp: port %d, qpn %d\n",
		       priv->port, qpn);
		mlx4_qp_release_range(dev, qpn, 1);
		priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC;
684 685 686 687
	}
}

static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn,
688
			       unsigned char *new_mac, unsigned char *prev_mac)
689 690 691 692
{
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_dev *dev = mdev->dev;
	int err = 0;
693
	u64 new_mac_u64 = mlx4_mac_to_u64(new_mac);
694 695

	if (dev->caps.steering_mode != MLX4_STEERING_MODE_A0) {
696 697 698
		struct hlist_head *bucket;
		unsigned int mac_hash;
		struct mlx4_mac_entry *entry;
699
		struct hlist_node *tmp;
700
		u64 prev_mac_u64 = mlx4_mac_to_u64(prev_mac);
701 702

		bucket = &priv->mac_hash[prev_mac[MLX4_EN_MAC_HASH_IDX]];
703
		hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
			if (ether_addr_equal_64bits(entry->mac, prev_mac)) {
				mlx4_en_uc_steer_release(priv, entry->mac,
							 qpn, entry->reg_id);
				mlx4_unregister_mac(dev, priv->port,
						    prev_mac_u64);
				hlist_del_rcu(&entry->hlist);
				synchronize_rcu();
				memcpy(entry->mac, new_mac, ETH_ALEN);
				entry->reg_id = 0;
				mac_hash = new_mac[MLX4_EN_MAC_HASH_IDX];
				hlist_add_head_rcu(&entry->hlist,
						   &priv->mac_hash[mac_hash]);
				mlx4_register_mac(dev, priv->port, new_mac_u64);
				err = mlx4_en_uc_steer_add(priv, new_mac,
							   &qpn,
							   &entry->reg_id);
720 721 722 723 724 725 726 727
				if (err)
					return err;
				if (priv->tunnel_reg_id) {
					mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id);
					priv->tunnel_reg_id = 0;
				}
				err = mlx4_en_tunnel_steer_add(priv, new_mac, qpn,
							       &priv->tunnel_reg_id);
728 729 730 731
				return err;
			}
		}
		return -EINVAL;
732 733 734 735 736
	}

	return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64);
}

737 738
static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv,
			      unsigned char new_mac[ETH_ALEN + 2])
739 740 741 742 743
{
	int err = 0;

	if (priv->port_up) {
		/* Remove old MAC and insert the new one */
744
		err = mlx4_en_replace_mac(priv, priv->base_qpn,
745
					  new_mac, priv->current_mac);
746
		if (err)
747
			en_err(priv, "Failed changing HW MAC address\n");
748
	} else
749
		en_dbg(HW, priv, "Port is down while registering mac, exiting...\n");
750

751 752
	if (!err)
		memcpy(priv->current_mac, new_mac, sizeof(priv->current_mac));
753

754 755 756 757 758 759 760 761
	return err;
}

static int mlx4_en_set_mac(struct net_device *dev, void *addr)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	struct sockaddr *saddr = addr;
762
	unsigned char new_mac[ETH_ALEN + 2];
763 764 765 766 767 768
	int err;

	if (!is_valid_ether_addr(saddr->sa_data))
		return -EADDRNOTAVAIL;

	mutex_lock(&mdev->state_lock);
769 770 771 772
	memcpy(new_mac, saddr->sa_data, ETH_ALEN);
	err = mlx4_en_do_set_mac(priv, new_mac);
	if (!err)
		memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
773
	mutex_unlock(&mdev->state_lock);
774 775

	return err;
776 777 778 779 780
}

static void mlx4_en_clear_list(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
781
	struct mlx4_en_mc_list *tmp, *mc_to_del;
782

783 784 785 786
	list_for_each_entry_safe(mc_to_del, tmp, &priv->mc_list, list) {
		list_del(&mc_to_del->list);
		kfree(mc_to_del);
	}
787 788 789 790 791
}

static void mlx4_en_cache_mclist(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
792
	struct netdev_hw_addr *ha;
793
	struct mlx4_en_mc_list *tmp;
794

795
	mlx4_en_clear_list(dev);
796 797 798 799 800 801 802 803 804
	netdev_for_each_mc_addr(ha, dev) {
		tmp = kzalloc(sizeof(struct mlx4_en_mc_list), GFP_ATOMIC);
		if (!tmp) {
			mlx4_en_clear_list(dev);
			return;
		}
		memcpy(tmp->addr, ha->addr, ETH_ALEN);
		list_add_tail(&tmp->list, &priv->mc_list);
	}
805 806
}

807 808 809 810 811 812 813 814 815 816 817 818 819
static void update_mclist_flags(struct mlx4_en_priv *priv,
				struct list_head *dst,
				struct list_head *src)
{
	struct mlx4_en_mc_list *dst_tmp, *src_tmp, *new_mc;
	bool found;

	/* Find all the entries that should be removed from dst,
	 * These are the entries that are not found in src
	 */
	list_for_each_entry(dst_tmp, dst, list) {
		found = false;
		list_for_each_entry(src_tmp, src, list) {
820
			if (ether_addr_equal(dst_tmp->addr, src_tmp->addr)) {
821 822 823 824 825 826 827 828 829 830 831 832 833 834
				found = true;
				break;
			}
		}
		if (!found)
			dst_tmp->action = MCLIST_REM;
	}

	/* Add entries that exist in src but not in dst
	 * mark them as need to add
	 */
	list_for_each_entry(src_tmp, src, list) {
		found = false;
		list_for_each_entry(dst_tmp, dst, list) {
835
			if (ether_addr_equal(dst_tmp->addr, src_tmp->addr)) {
836 837 838 839 840 841
				dst_tmp->action = MCLIST_NONE;
				found = true;
				break;
			}
		}
		if (!found) {
842 843
			new_mc = kmemdup(src_tmp,
					 sizeof(struct mlx4_en_mc_list),
844
					 GFP_KERNEL);
845
			if (!new_mc)
846
				return;
847

848 849 850 851 852
			new_mc->action = MCLIST_ADD;
			list_add_tail(&new_mc->list, dst);
		}
	}
}
853

854
static void mlx4_en_set_rx_mode(struct net_device *dev)
855 856 857 858 859 860
{
	struct mlx4_en_priv *priv = netdev_priv(dev);

	if (!priv->port_up)
		return;

861
	queue_work(priv->mdev->workqueue, &priv->rx_mode_task);
862 863
}

864 865
static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv,
				     struct mlx4_en_dev *mdev)
866
{
867
	int err = 0;
868

869
	if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) {
870
		if (netif_msg_rx_status(priv))
871 872
			en_warn(priv, "Entering promiscuous mode\n");
		priv->flags |= MLX4_EN_FLAG_PROMISC;
873

874
		/* Enable promiscouos mode */
875
		switch (mdev->dev->caps.steering_mode) {
876
		case MLX4_STEERING_MODE_DEVICE_MANAGED:
877 878 879
			err = mlx4_flow_steer_promisc_add(mdev->dev,
							  priv->port,
							  priv->base_qpn,
880
							  MLX4_FS_ALL_DEFAULT);
881
			if (err)
882 883
				en_err(priv, "Failed enabling promiscuous mode\n");
			priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
884 885
			break;

886
		case MLX4_STEERING_MODE_B0:
887 888 889
			err = mlx4_unicast_promisc_add(mdev->dev,
						       priv->base_qpn,
						       priv->port);
890
			if (err)
891 892 893 894 895 896 897 898 899
				en_err(priv, "Failed enabling unicast promiscuous mode\n");

			/* Add the default qp number as multicast
			 * promisc
			 */
			if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) {
				err = mlx4_multicast_promisc_add(mdev->dev,
								 priv->base_qpn,
								 priv->port);
900
				if (err)
901 902
					en_err(priv, "Failed enabling multicast promiscuous mode\n");
				priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
903 904
			}
			break;
905

906 907 908
		case MLX4_STEERING_MODE_A0:
			err = mlx4_SET_PORT_qpn_calc(mdev->dev,
						     priv->port,
909 910
						     priv->base_qpn,
						     1);
911
			if (err)
912
				en_err(priv, "Failed enabling promiscuous mode\n");
913
			break;
914 915
		}

916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
		/* Disable port multicast filter (unconditionally) */
		err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
					  0, MLX4_MCAST_DISABLE);
		if (err)
			en_err(priv, "Failed disabling multicast filter\n");
	}
}

static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv,
				       struct mlx4_en_dev *mdev)
{
	int err = 0;

	if (netif_msg_rx_status(priv))
		en_warn(priv, "Leaving promiscuous mode\n");
	priv->flags &= ~MLX4_EN_FLAG_PROMISC;

	/* Disable promiscouos mode */
	switch (mdev->dev->caps.steering_mode) {
	case MLX4_STEERING_MODE_DEVICE_MANAGED:
		err = mlx4_flow_steer_promisc_remove(mdev->dev,
						     priv->port,
938
						     MLX4_FS_ALL_DEFAULT);
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967
		if (err)
			en_err(priv, "Failed disabling promiscuous mode\n");
		priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
		break;

	case MLX4_STEERING_MODE_B0:
		err = mlx4_unicast_promisc_remove(mdev->dev,
						  priv->base_qpn,
						  priv->port);
		if (err)
			en_err(priv, "Failed disabling unicast promiscuous mode\n");
		/* Disable Multicast promisc */
		if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
			err = mlx4_multicast_promisc_remove(mdev->dev,
							    priv->base_qpn,
							    priv->port);
			if (err)
				en_err(priv, "Failed disabling multicast promiscuous mode\n");
			priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
		}
		break;

	case MLX4_STEERING_MODE_A0:
		err = mlx4_SET_PORT_qpn_calc(mdev->dev,
					     priv->port,
					     priv->base_qpn, 0);
		if (err)
			en_err(priv, "Failed disabling promiscuous mode\n");
		break;
968
	}
969 970 971 972 973 974 975 976 977 978 979
}

static void mlx4_en_do_multicast(struct mlx4_en_priv *priv,
				 struct net_device *dev,
				 struct mlx4_en_dev *mdev)
{
	struct mlx4_en_mc_list *mclist, *tmp;
	u64 mcast_addr = 0;
	u8 mc_list[16] = {0};
	int err = 0;

980 981 982 983 984
	/* Enable/disable the multicast filter according to IFF_ALLMULTI */
	if (dev->flags & IFF_ALLMULTI) {
		err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
					  0, MLX4_MCAST_DISABLE);
		if (err)
985
			en_err(priv, "Failed disabling multicast filter\n");
986 987 988

		/* Add the default qp number as multicast promisc */
		if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) {
989
			switch (mdev->dev->caps.steering_mode) {
990 991 992 993
			case MLX4_STEERING_MODE_DEVICE_MANAGED:
				err = mlx4_flow_steer_promisc_add(mdev->dev,
								  priv->port,
								  priv->base_qpn,
994
								  MLX4_FS_MC_DEFAULT);
995 996
				break;

997 998 999 1000 1001 1002 1003 1004 1005
			case MLX4_STEERING_MODE_B0:
				err = mlx4_multicast_promisc_add(mdev->dev,
								 priv->base_qpn,
								 priv->port);
				break;

			case MLX4_STEERING_MODE_A0:
				break;
			}
1006 1007 1008 1009
			if (err)
				en_err(priv, "Failed entering multicast promisc mode\n");
			priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
		}
1010
	} else {
1011 1012
		/* Disable Multicast promisc */
		if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
1013
			switch (mdev->dev->caps.steering_mode) {
1014 1015 1016
			case MLX4_STEERING_MODE_DEVICE_MANAGED:
				err = mlx4_flow_steer_promisc_remove(mdev->dev,
								     priv->port,
1017
								     MLX4_FS_MC_DEFAULT);
1018 1019
				break;

1020 1021 1022 1023 1024 1025 1026 1027 1028
			case MLX4_STEERING_MODE_B0:
				err = mlx4_multicast_promisc_remove(mdev->dev,
								    priv->base_qpn,
								    priv->port);
				break;

			case MLX4_STEERING_MODE_A0:
				break;
			}
1029
			if (err)
L
Lucas De Marchi 已提交
1030
				en_err(priv, "Failed disabling multicast promiscuous mode\n");
1031 1032
			priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
		}
1033

1034 1035 1036
		err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
					  0, MLX4_MCAST_DISABLE);
		if (err)
1037
			en_err(priv, "Failed disabling multicast filter\n");
1038 1039 1040 1041 1042 1043 1044

		/* Flush mcast filter and init it with broadcast address */
		mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, ETH_BCAST,
				    1, MLX4_MCAST_CONFIG);

		/* Update multicast list - we cache all addresses so they won't
		 * change while HW is updated holding the command semaphor */
1045
		netif_addr_lock_bh(dev);
1046
		mlx4_en_cache_mclist(dev);
1047
		netif_addr_unlock_bh(dev);
1048
		list_for_each_entry(mclist, &priv->mc_list, list) {
1049
			mcast_addr = mlx4_mac_to_u64(mclist->addr);
1050 1051 1052 1053 1054 1055
			mlx4_SET_MCAST_FLTR(mdev->dev, priv->port,
					    mcast_addr, 0, MLX4_MCAST_CONFIG);
		}
		err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0,
					  0, MLX4_MCAST_ENABLE);
		if (err)
1056
			en_err(priv, "Failed enabling multicast filter\n");
1057 1058 1059 1060 1061 1062 1063 1064 1065 1066

		update_mclist_flags(priv, &priv->curr_list, &priv->mc_list);
		list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) {
			if (mclist->action == MCLIST_REM) {
				/* detach this address and delete from list */
				memcpy(&mc_list[10], mclist->addr, ETH_ALEN);
				mc_list[5] = priv->port;
				err = mlx4_multicast_detach(mdev->dev,
							    &priv->rss_map.indir_qp,
							    mc_list,
1067 1068
							    MLX4_PROT_ETH,
							    mclist->reg_id);
1069 1070 1071
				if (err)
					en_err(priv, "Fail to detach multicast address\n");

1072 1073 1074 1075 1076 1077
				if (mclist->tunnel_reg_id) {
					err = mlx4_flow_detach(priv->mdev->dev, mclist->tunnel_reg_id);
					if (err)
						en_err(priv, "Failed to detach multicast address\n");
				}

1078 1079 1080
				/* remove from list */
				list_del(&mclist->list);
				kfree(mclist);
1081
			} else if (mclist->action == MCLIST_ADD) {
1082 1083
				/* attach the address */
				memcpy(&mc_list[10], mclist->addr, ETH_ALEN);
1084
				/* needed for B0 steering support */
1085 1086 1087
				mc_list[5] = priv->port;
				err = mlx4_multicast_attach(mdev->dev,
							    &priv->rss_map.indir_qp,
1088 1089 1090 1091
							    mc_list,
							    priv->port, 0,
							    MLX4_PROT_ETH,
							    &mclist->reg_id);
1092 1093 1094
				if (err)
					en_err(priv, "Fail to attach multicast address\n");

1095 1096 1097 1098
				err = mlx4_en_tunnel_steer_add(priv, &mc_list[10], priv->base_qpn,
							       &mclist->tunnel_reg_id);
				if (err)
					en_err(priv, "Failed to attach multicast address\n");
1099 1100
			}
		}
1101
	}
1102 1103
}

1104 1105 1106 1107 1108 1109
static void mlx4_en_do_uc_filter(struct mlx4_en_priv *priv,
				 struct net_device *dev,
				 struct mlx4_en_dev *mdev)
{
	struct netdev_hw_addr *ha;
	struct mlx4_mac_entry *entry;
1110
	struct hlist_node *tmp;
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125
	bool found;
	u64 mac;
	int err = 0;
	struct hlist_head *bucket;
	unsigned int i;
	int removed = 0;
	u32 prev_flags;

	/* Note that we do not need to protect our mac_hash traversal with rcu,
	 * since all modification code is protected by mdev->state_lock
	 */

	/* find what to remove */
	for (i = 0; i < MLX4_EN_MAC_HASH_SIZE; ++i) {
		bucket = &priv->mac_hash[i];
1126
		hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
			found = false;
			netdev_for_each_uc_addr(ha, dev) {
				if (ether_addr_equal_64bits(entry->mac,
							    ha->addr)) {
					found = true;
					break;
				}
			}

			/* MAC address of the port is not in uc list */
1137 1138
			if (ether_addr_equal_64bits(entry->mac,
						    priv->current_mac))
1139 1140 1141
				found = true;

			if (!found) {
1142
				mac = mlx4_mac_to_u64(entry->mac);
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
				mlx4_en_uc_steer_release(priv, entry->mac,
							 priv->base_qpn,
							 entry->reg_id);
				mlx4_unregister_mac(mdev->dev, priv->port, mac);

				hlist_del_rcu(&entry->hlist);
				kfree_rcu(entry, rcu);
				en_dbg(DRV, priv, "Removed MAC %pM on port:%d\n",
				       entry->mac, priv->port);
				++removed;
			}
		}
	}

	/* if we didn't remove anything, there is no use in trying to add
	 * again once we are in a forced promisc mode state
	 */
	if ((priv->flags & MLX4_EN_FLAG_FORCE_PROMISC) && 0 == removed)
		return;

	prev_flags = priv->flags;
	priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC;

	/* find what to add */
	netdev_for_each_uc_addr(ha, dev) {
		found = false;
		bucket = &priv->mac_hash[ha->addr[MLX4_EN_MAC_HASH_IDX]];
1170
		hlist_for_each_entry(entry, bucket, hlist) {
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
			if (ether_addr_equal_64bits(entry->mac, ha->addr)) {
				found = true;
				break;
			}
		}

		if (!found) {
			entry = kmalloc(sizeof(*entry), GFP_KERNEL);
			if (!entry) {
				en_err(priv, "Failed adding MAC %pM on port:%d (out of memory)\n",
				       ha->addr, priv->port);
				priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC;
				break;
			}
1185
			mac = mlx4_mac_to_u64(ha->addr);
1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224
			memcpy(entry->mac, ha->addr, ETH_ALEN);
			err = mlx4_register_mac(mdev->dev, priv->port, mac);
			if (err < 0) {
				en_err(priv, "Failed registering MAC %pM on port %d: %d\n",
				       ha->addr, priv->port, err);
				kfree(entry);
				priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC;
				break;
			}
			err = mlx4_en_uc_steer_add(priv, ha->addr,
						   &priv->base_qpn,
						   &entry->reg_id);
			if (err) {
				en_err(priv, "Failed adding MAC %pM on port %d: %d\n",
				       ha->addr, priv->port, err);
				mlx4_unregister_mac(mdev->dev, priv->port, mac);
				kfree(entry);
				priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC;
				break;
			} else {
				unsigned int mac_hash;
				en_dbg(DRV, priv, "Added MAC %pM on port:%d\n",
				       ha->addr, priv->port);
				mac_hash = ha->addr[MLX4_EN_MAC_HASH_IDX];
				bucket = &priv->mac_hash[mac_hash];
				hlist_add_head_rcu(&entry->hlist, bucket);
			}
		}
	}

	if (priv->flags & MLX4_EN_FLAG_FORCE_PROMISC) {
		en_warn(priv, "Forcing promiscuous mode on port:%d\n",
			priv->port);
	} else if (prev_flags & MLX4_EN_FLAG_FORCE_PROMISC) {
		en_warn(priv, "Stop forcing promiscuous mode on port:%d\n",
			priv->port);
	}
}

1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
static void mlx4_en_do_set_rx_mode(struct work_struct *work)
{
	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
						 rx_mode_task);
	struct mlx4_en_dev *mdev = priv->mdev;
	struct net_device *dev = priv->dev;

	mutex_lock(&mdev->state_lock);
	if (!mdev->device_up) {
		en_dbg(HW, priv, "Card is not up, ignoring rx mode change.\n");
		goto out;
	}
	if (!priv->port_up) {
		en_dbg(HW, priv, "Port is down, ignoring rx mode change.\n");
		goto out;
	}

	if (!netif_carrier_ok(dev)) {
		if (!mlx4_en_QUERY_PORT(mdev, priv->port)) {
			if (priv->port_state.link_state) {
				priv->last_link_state = MLX4_DEV_EVENT_PORT_UP;
				netif_carrier_on(dev);
				en_dbg(LINK, priv, "Link Up\n");
			}
		}
	}

1252 1253 1254
	if (dev->priv_flags & IFF_UNICAST_FLT)
		mlx4_en_do_uc_filter(priv, dev, mdev);

1255
	/* Promsicuous mode: disable all filters */
1256 1257
	if ((dev->flags & IFF_PROMISC) ||
	    (priv->flags & MLX4_EN_FLAG_FORCE_PROMISC)) {
1258 1259 1260 1261 1262 1263 1264 1265 1266
		mlx4_en_set_promisc_mode(priv, mdev);
		goto out;
	}

	/* Not in promiscuous mode */
	if (priv->flags & MLX4_EN_FLAG_PROMISC)
		mlx4_en_clear_promisc_mode(priv, mdev);

	mlx4_en_do_multicast(priv, dev, mdev);
1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278
out:
	mutex_unlock(&mdev->state_lock);
}

#ifdef CONFIG_NET_POLL_CONTROLLER
static void mlx4_en_netpoll(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_cq *cq;
	int i;

	for (i = 0; i < priv->rx_ring_num; i++) {
1279
		cq = priv->rx_cq[i];
1280
		napi_schedule(&cq->napi);
1281 1282 1283 1284 1285 1286 1287 1288
	}
}
#endif

static void mlx4_en_tx_timeout(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
1289
	int i;
1290 1291

	if (netif_msg_timer(priv))
1292
		en_warn(priv, "Tx timeout called on port:%d\n", priv->port);
1293

1294 1295 1296 1297
	for (i = 0; i < priv->tx_ring_num; i++) {
		if (!netif_tx_queue_stopped(netdev_get_tx_queue(dev, i)))
			continue;
		en_warn(priv, "TX timeout on queue: %d, QP: 0x%x, CQ: 0x%x, Cons: 0x%x, Prod: 0x%x\n",
1298 1299
			i, priv->tx_ring[i]->qpn, priv->tx_ring[i]->cqn,
			priv->tx_ring[i]->cons, priv->tx_ring[i]->prod);
1300 1301
	}

1302
	priv->port_stats.tx_timeout++;
1303
	en_dbg(DRV, priv, "Scheduling watchdog\n");
1304
	queue_work(mdev->workqueue, &priv->watchdog_task);
1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324
}


static struct net_device_stats *mlx4_en_get_stats(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);

	spin_lock_bh(&priv->stats_lock);
	memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats));
	spin_unlock_bh(&priv->stats_lock);

	return &priv->ret_stats;
}

static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv)
{
	struct mlx4_en_cq *cq;
	int i;

	/* If we haven't received a specific coalescing setting
1325
	 * (module param), we set the moderation parameters as follows:
1326
	 * - moder_cnt is set to the number of mtu sized packets to
E
Eric Dumazet 已提交
1327
	 *   satisfy our coalescing target.
1328 1329
	 * - moder_time is set to a fixed value.
	 */
1330
	priv->rx_frames = MLX4_EN_RX_COAL_TARGET;
1331
	priv->rx_usecs = MLX4_EN_RX_COAL_TIME;
1332 1333
	priv->tx_frames = MLX4_EN_TX_COAL_PKTS;
	priv->tx_usecs = MLX4_EN_TX_COAL_TIME;
1334 1335
	en_dbg(INTR, priv, "Default coalesing params for mtu:%d - rx_frames:%d rx_usecs:%d\n",
	       priv->dev->mtu, priv->rx_frames, priv->rx_usecs);
1336 1337 1338

	/* Setup cq moderation params */
	for (i = 0; i < priv->rx_ring_num; i++) {
1339
		cq = priv->rx_cq[i];
1340 1341
		cq->moder_cnt = priv->rx_frames;
		cq->moder_time = priv->rx_usecs;
1342 1343 1344
		priv->last_moder_time[i] = MLX4_EN_AUTO_CONF;
		priv->last_moder_packets[i] = 0;
		priv->last_moder_bytes[i] = 0;
1345 1346 1347
	}

	for (i = 0; i < priv->tx_ring_num; i++) {
1348
		cq = priv->tx_cq[i];
1349 1350
		cq->moder_cnt = priv->tx_frames;
		cq->moder_time = priv->tx_usecs;
1351 1352 1353 1354 1355 1356 1357 1358
	}

	/* Reset auto-moderation params */
	priv->pkt_rate_low = MLX4_EN_RX_RATE_LOW;
	priv->rx_usecs_low = MLX4_EN_RX_COAL_TIME_LOW;
	priv->pkt_rate_high = MLX4_EN_RX_RATE_HIGH;
	priv->rx_usecs_high = MLX4_EN_RX_COAL_TIME_HIGH;
	priv->sample_interval = MLX4_EN_SAMPLE_INTERVAL;
1359
	priv->adaptive_rx_coal = 1;
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374
	priv->last_moder_jiffies = 0;
	priv->last_moder_tx_packets = 0;
}

static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
{
	unsigned long period = (unsigned long) (jiffies - priv->last_moder_jiffies);
	struct mlx4_en_cq *cq;
	unsigned long packets;
	unsigned long rate;
	unsigned long avg_pkt_size;
	unsigned long rx_packets;
	unsigned long rx_bytes;
	unsigned long rx_pkt_diff;
	int moder_time;
1375
	int ring, err;
1376 1377 1378 1379

	if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ)
		return;

1380 1381
	for (ring = 0; ring < priv->rx_ring_num; ring++) {
		spin_lock_bh(&priv->stats_lock);
1382 1383
		rx_packets = priv->rx_ring[ring]->packets;
		rx_bytes = priv->rx_ring[ring]->bytes;
1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396
		spin_unlock_bh(&priv->stats_lock);

		rx_pkt_diff = ((unsigned long) (rx_packets -
				priv->last_moder_packets[ring]));
		packets = rx_pkt_diff;
		rate = packets * HZ / period;
		avg_pkt_size = packets ? ((unsigned long) (rx_bytes -
				priv->last_moder_bytes[ring])) / packets : 0;

		/* Apply auto-moderation only when packet rate
		 * exceeds a rate that it matters */
		if (rate > (MLX4_EN_RX_RATE_THRESH / priv->rx_ring_num) &&
		    avg_pkt_size > MLX4_EN_AVG_PKT_SMALL) {
1397 1398 1399 1400 1401 1402 1403 1404 1405
			if (rate < priv->pkt_rate_low)
				moder_time = priv->rx_usecs_low;
			else if (rate > priv->pkt_rate_high)
				moder_time = priv->rx_usecs_high;
			else
				moder_time = (rate - priv->pkt_rate_low) *
					(priv->rx_usecs_high - priv->rx_usecs_low) /
					(priv->pkt_rate_high - priv->pkt_rate_low) +
					priv->rx_usecs_low;
1406 1407
		} else {
			moder_time = priv->rx_usecs_low;
1408 1409
		}

1410 1411
		if (moder_time != priv->last_moder_time[ring]) {
			priv->last_moder_time[ring] = moder_time;
1412
			cq = priv->rx_cq[ring];
1413
			cq->moder_time = moder_time;
1414
			cq->moder_cnt = priv->rx_frames;
1415
			err = mlx4_en_set_cq_moder(priv, cq);
1416
			if (err)
1417 1418
				en_err(priv, "Failed modifying moderation for cq:%d\n",
				       ring);
1419
		}
1420 1421
		priv->last_moder_packets[ring] = rx_packets;
		priv->last_moder_bytes[ring] = rx_bytes;
1422 1423 1424 1425 1426 1427 1428
	}

	priv->last_moder_jiffies = jiffies;
}

static void mlx4_en_do_get_stats(struct work_struct *work)
{
1429
	struct delayed_work *delay = to_delayed_work(work);
1430 1431 1432 1433 1434 1435 1436
	struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv,
						 stats_task);
	struct mlx4_en_dev *mdev = priv->mdev;
	int err;

	mutex_lock(&mdev->state_lock);
	if (mdev->device_up) {
1437 1438 1439 1440
		if (priv->port_up) {
			err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0);
			if (err)
				en_dbg(HW, priv, "Could not update stats\n");
1441

1442
			mlx4_en_auto_moderation(priv);
1443
		}
1444 1445 1446

		queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
	}
1447
	if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) {
1448
		mlx4_en_do_set_mac(priv, priv->current_mac);
1449 1450
		mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0;
	}
1451 1452 1453
	mutex_unlock(&mdev->state_lock);
}

A
Amir Vadai 已提交
1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
/* mlx4_en_service_task - Run service task for tasks that needed to be done
 * periodically
 */
static void mlx4_en_service_task(struct work_struct *work)
{
	struct delayed_work *delay = to_delayed_work(work);
	struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv,
						 service_task);
	struct mlx4_en_dev *mdev = priv->mdev;

	mutex_lock(&mdev->state_lock);
	if (mdev->device_up) {
1466 1467
		if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
			mlx4_en_ptp_overflow_check(mdev);
A
Amir Vadai 已提交
1468 1469 1470 1471 1472 1473 1474

		queue_delayed_work(mdev->workqueue, &priv->service_task,
				   SERVICE_TASK_DELAY);
	}
	mutex_unlock(&mdev->state_lock);
}

1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
static void mlx4_en_linkstate(struct work_struct *work)
{
	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
						 linkstate_task);
	struct mlx4_en_dev *mdev = priv->mdev;
	int linkstate = priv->link_state;

	mutex_lock(&mdev->state_lock);
	/* If observable port state changed set carrier state and
	 * report to system log */
	if (priv->last_link_state != linkstate) {
		if (linkstate == MLX4_DEV_EVENT_PORT_DOWN) {
1487
			en_info(priv, "Link Down\n");
1488 1489
			netif_carrier_off(priv->dev);
		} else {
1490
			en_info(priv, "Link Up\n");
1491 1492 1493 1494 1495 1496 1497
			netif_carrier_on(priv->dev);
		}
	}
	priv->last_link_state = linkstate;
	mutex_unlock(&mdev->state_lock);
}

Y
Yuval Atias 已提交
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
static int mlx4_en_init_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
{
	struct mlx4_en_rx_ring *ring = priv->rx_ring[ring_idx];
	int numa_node = priv->mdev->dev->numa_node;
	int ret = 0;

	if (!zalloc_cpumask_var(&ring->affinity_mask, GFP_KERNEL))
		return -ENOMEM;

	ret = cpumask_set_cpu_local_first(ring_idx, numa_node,
					  ring->affinity_mask);
	if (ret)
		free_cpumask_var(ring->affinity_mask);

	return ret;
}

static void mlx4_en_free_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
{
	free_cpumask_var(priv->rx_ring[ring_idx]->affinity_mask);
}
1519

1520
int mlx4_en_start_port(struct net_device *dev)
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	struct mlx4_en_cq *cq;
	struct mlx4_en_tx_ring *tx_ring;
	int rx_index = 0;
	int tx_index = 0;
	int err = 0;
	int i;
	int j;
1531
	u8 mc_list[16] = {0};
1532 1533

	if (priv->port_up) {
1534
		en_dbg(DRV, priv, "start port called while port already up\n");
1535 1536 1537
		return 0;
	}

1538 1539
	INIT_LIST_HEAD(&priv->mc_list);
	INIT_LIST_HEAD(&priv->curr_list);
1540 1541 1542
	INIT_LIST_HEAD(&priv->ethtool_list);
	memset(&priv->ethtool_rules[0], 0,
	       sizeof(struct ethtool_flow_id) * MAX_NUM_OF_FS_RULES);
1543

1544 1545 1546
	/* Calculate Rx buf size */
	dev->mtu = min(dev->mtu, priv->max_mtu);
	mlx4_en_calc_rx_buf(dev);
1547
	en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_skb_size);
1548

1549
	/* Configure rx cq's and rings */
1550 1551
	err = mlx4_en_activate_rx_rings(priv);
	if (err) {
1552
		en_err(priv, "Failed to activate RX rings\n");
1553 1554
		return err;
	}
1555
	for (i = 0; i < priv->rx_ring_num; i++) {
1556
		cq = priv->rx_cq[i];
1557

1558 1559
		mlx4_en_cq_init_lock(cq);

Y
Yuval Atias 已提交
1560 1561 1562 1563 1564 1565
		err = mlx4_en_init_affinity_hint(priv, i);
		if (err) {
			en_err(priv, "Failed preparing IRQ affinity hint\n");
			goto cq_err;
		}

1566
		err = mlx4_en_activate_cq(priv, cq, i);
1567
		if (err) {
1568
			en_err(priv, "Failed activating Rx CQ\n");
Y
Yuval Atias 已提交
1569
			mlx4_en_free_affinity_hint(priv, i);
1570
			goto cq_err;
1571 1572 1573 1574 1575
		}
		for (j = 0; j < cq->size; j++)
			cq->buf[j].owner_sr_opcode = MLX4_CQE_OWNER_MASK;
		err = mlx4_en_set_cq_moder(priv, cq);
		if (err) {
J
Joe Perches 已提交
1576
			en_err(priv, "Failed setting cq moderation parameters\n");
1577
			mlx4_en_deactivate_cq(priv, cq);
Y
Yuval Atias 已提交
1578
			mlx4_en_free_affinity_hint(priv, i);
1579 1580 1581
			goto cq_err;
		}
		mlx4_en_arm_cq(priv, cq);
1582
		priv->rx_ring[i]->cqn = cq->mcq.cqn;
1583 1584 1585
		++rx_index;
	}

1586 1587
	/* Set qp number */
	en_dbg(DRV, priv, "Getting qp number for port %d\n", priv->port);
1588
	err = mlx4_en_get_qp(priv);
1589
	if (err) {
1590
		en_err(priv, "Failed getting eth qp\n");
1591 1592 1593 1594
		goto cq_err;
	}
	mdev->mac_removed[priv->port] = 0;

1595 1596
	err = mlx4_en_config_rss_steer(priv);
	if (err) {
1597
		en_err(priv, "Failed configuring rss steering\n");
1598
		goto mac_err;
1599 1600
	}

1601 1602 1603 1604
	err = mlx4_en_create_drop_qp(priv);
	if (err)
		goto rss_err;

1605 1606 1607
	/* Configure tx cq's and rings */
	for (i = 0; i < priv->tx_ring_num; i++) {
		/* Configure cq */
1608
		cq = priv->tx_cq[i];
1609
		err = mlx4_en_activate_cq(priv, cq, i);
1610
		if (err) {
1611
			en_err(priv, "Failed allocating Tx CQ\n");
1612 1613 1614 1615
			goto tx_err;
		}
		err = mlx4_en_set_cq_moder(priv, cq);
		if (err) {
J
Joe Perches 已提交
1616
			en_err(priv, "Failed setting cq moderation parameters\n");
1617 1618 1619
			mlx4_en_deactivate_cq(priv, cq);
			goto tx_err;
		}
1620
		en_dbg(DRV, priv, "Resetting index of collapsed CQ:%d to -1\n", i);
1621 1622 1623
		cq->buf->wqe_index = cpu_to_be16(0xffff);

		/* Configure ring */
1624
		tx_ring = priv->tx_ring[i];
1625
		err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn,
1626
			i / priv->num_tx_rings_p_up);
1627
		if (err) {
1628
			en_err(priv, "Failed allocating Tx ring\n");
1629 1630 1631
			mlx4_en_deactivate_cq(priv, cq);
			goto tx_err;
		}
1632
		tx_ring->tx_queue = netdev_get_tx_queue(dev, i);
1633 1634 1635 1636

		/* Arm CQ for TX completions */
		mlx4_en_arm_cq(priv, cq);

1637 1638 1639 1640 1641 1642 1643 1644 1645
		/* Set initial ownership of all Tx TXBBs to SW (1) */
		for (j = 0; j < tx_ring->buf_size; j += STAMP_STRIDE)
			*((u32 *) (tx_ring->buf + j)) = 0xffffffff;
		++tx_index;
	}

	/* Configure port */
	err = mlx4_SET_PORT_general(mdev->dev, priv->port,
				    priv->rx_skb_size + ETH_FCS_LEN,
1646 1647 1648 1649
				    priv->prof->tx_pause,
				    priv->prof->tx_ppp,
				    priv->prof->rx_pause,
				    priv->prof->rx_ppp);
1650
	if (err) {
1651 1652
		en_err(priv, "Failed setting port general configurations for port %d, with error %d\n",
		       priv->port, err);
1653 1654 1655 1656 1657
		goto tx_err;
	}
	/* Set default qp number */
	err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, priv->base_qpn, 0);
	if (err) {
1658
		en_err(priv, "Failed setting default qp numbers\n");
1659 1660 1661
		goto tx_err;
	}

1662
	if (mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
O
Or Gerlitz 已提交
1663
		err = mlx4_SET_PORT_VXLAN(mdev->dev, priv->port, VXLAN_STEER_BY_OUTER_MAC, 1);
1664 1665 1666 1667 1668 1669 1670
		if (err) {
			en_err(priv, "Failed setting port L2 tunnel configuration, err %d\n",
			       err);
			goto tx_err;
		}
	}

1671
	/* Init port */
1672
	en_dbg(HW, priv, "Initializing port\n");
1673 1674
	err = mlx4_INIT_PORT(mdev->dev, priv->port);
	if (err) {
1675
		en_err(priv, "Failed Initializing port\n");
1676
		goto tx_err;
1677 1678
	}

1679 1680
	/* Attach rx QP to bradcast address */
	memset(&mc_list[10], 0xff, ETH_ALEN);
1681
	mc_list[5] = priv->port; /* needed for B0 steering support */
1682
	if (mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp, mc_list,
1683 1684
				  priv->port, 0, MLX4_PROT_ETH,
				  &priv->broadcast_id))
1685 1686
		mlx4_warn(mdev, "Failed Attaching Broadcast\n");

H
Herbert Xu 已提交
1687 1688 1689
	/* Must redo promiscuous mode setup. */
	priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC);

1690
	/* Schedule multicast task to populate multicast list */
1691
	queue_work(mdev->workqueue, &priv->rx_mode_task);
1692

1693 1694
	mlx4_set_stats_bitmap(mdev->dev, &priv->stats_bitmap);

1695
#ifdef CONFIG_MLX4_EN_VXLAN
1696
	if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
O
Or Gerlitz 已提交
1697
		vxlan_get_rx_port(dev);
1698
#endif
1699
	priv->port_up = true;
1700
	netif_tx_start_all_queues(dev);
1701 1702
	netif_device_attach(dev);

1703 1704 1705 1706
	return 0;

tx_err:
	while (tx_index--) {
1707 1708
		mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[tx_index]);
		mlx4_en_deactivate_cq(priv, priv->tx_cq[tx_index]);
1709
	}
1710 1711
	mlx4_en_destroy_drop_qp(priv);
rss_err:
1712
	mlx4_en_release_rss_steer(priv);
1713
mac_err:
1714
	mlx4_en_put_qp(priv);
1715
cq_err:
Y
Yuval Atias 已提交
1716
	while (rx_index--) {
1717
		mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]);
Y
Yuval Atias 已提交
1718 1719
		mlx4_en_free_affinity_hint(priv, i);
	}
1720
	for (i = 0; i < priv->rx_ring_num; i++)
1721
		mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
1722 1723 1724 1725 1726

	return err; /* need to close devices */
}


1727
void mlx4_en_stop_port(struct net_device *dev, int detach)
1728 1729 1730
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
1731
	struct mlx4_en_mc_list *mclist, *tmp;
1732
	struct ethtool_flow_id *flow, *tmp_flow;
1733
	int i;
1734
	u8 mc_list[16] = {0};
1735 1736

	if (!priv->port_up) {
1737
		en_dbg(DRV, priv, "stop port called while port already down\n");
1738 1739 1740
		return;
	}

1741 1742 1743
	/* close port*/
	mlx4_CLOSE_PORT(mdev->dev, priv->port);

1744 1745
	/* Synchronize with tx routine */
	netif_tx_lock_bh(dev);
1746 1747
	if (detach)
		netif_device_detach(dev);
1748
	netif_tx_stop_all_queues(dev);
1749 1750
	netif_tx_unlock_bh(dev);

1751 1752
	netif_tx_disable(dev);

1753
	/* Set port as not active */
1754
	priv->port_up = false;
1755

1756 1757 1758 1759 1760 1761 1762
	/* Promsicuous mode */
	if (mdev->dev->caps.steering_mode ==
	    MLX4_STEERING_MODE_DEVICE_MANAGED) {
		priv->flags &= ~(MLX4_EN_FLAG_PROMISC |
				 MLX4_EN_FLAG_MC_PROMISC);
		mlx4_flow_steer_promisc_remove(mdev->dev,
					       priv->port,
1763
					       MLX4_FS_ALL_DEFAULT);
1764 1765
		mlx4_flow_steer_promisc_remove(mdev->dev,
					       priv->port,
1766
					       MLX4_FS_MC_DEFAULT);
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
	} else if (priv->flags & MLX4_EN_FLAG_PROMISC) {
		priv->flags &= ~MLX4_EN_FLAG_PROMISC;

		/* Disable promiscouos mode */
		mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn,
					    priv->port);

		/* Disable Multicast promisc */
		if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
			mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn,
						      priv->port);
			priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
		}
	}

1782 1783
	/* Detach All multicasts */
	memset(&mc_list[10], 0xff, ETH_ALEN);
1784
	mc_list[5] = priv->port; /* needed for B0 steering support */
1785
	mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list,
1786
			      MLX4_PROT_ETH, priv->broadcast_id);
1787 1788
	list_for_each_entry(mclist, &priv->curr_list, list) {
		memcpy(&mc_list[10], mclist->addr, ETH_ALEN);
1789 1790
		mc_list[5] = priv->port;
		mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp,
1791
				      mc_list, MLX4_PROT_ETH, mclist->reg_id);
1792 1793
		if (mclist->tunnel_reg_id)
			mlx4_flow_detach(mdev->dev, mclist->tunnel_reg_id);
1794 1795
	}
	mlx4_en_clear_list(dev);
1796 1797 1798 1799 1800
	list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) {
		list_del(&mclist->list);
		kfree(mclist);
	}

1801 1802 1803
	/* Flush multicast filter */
	mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG);

1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
	/* Remove flow steering rules for the port*/
	if (mdev->dev->caps.steering_mode ==
	    MLX4_STEERING_MODE_DEVICE_MANAGED) {
		ASSERT_RTNL();
		list_for_each_entry_safe(flow, tmp_flow,
					 &priv->ethtool_list, list) {
			mlx4_flow_detach(mdev->dev, flow->id);
			list_del(&flow->list);
		}
	}

1815 1816
	mlx4_en_destroy_drop_qp(priv);

1817 1818
	/* Free TX Rings */
	for (i = 0; i < priv->tx_ring_num; i++) {
1819 1820
		mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[i]);
		mlx4_en_deactivate_cq(priv, priv->tx_cq[i]);
1821 1822 1823 1824
	}
	msleep(10);

	for (i = 0; i < priv->tx_ring_num; i++)
1825
		mlx4_en_free_tx_buf(dev, priv->tx_ring[i]);
1826 1827 1828 1829

	/* Free RSS qps */
	mlx4_en_release_rss_steer(priv);

1830
	/* Unregister Mac address for the port */
1831
	mlx4_en_put_qp(priv);
1832
	if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_REASSIGN_MAC_EN))
1833
		mdev->mac_removed[priv->port] = 1;
1834

1835 1836
	/* Free RX Rings */
	for (i = 0; i < priv->rx_ring_num; i++) {
1837
		struct mlx4_en_cq *cq = priv->rx_cq[i];
1838 1839 1840 1841 1842 1843 1844 1845

		local_bh_disable();
		while (!mlx4_en_cq_lock_napi(cq)) {
			pr_info("CQ %d locked\n", i);
			mdelay(1);
		}
		local_bh_enable();

1846
		napi_synchronize(&cq->napi);
1847
		mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
1848
		mlx4_en_deactivate_cq(priv, cq);
Y
Yuval Atias 已提交
1849 1850

		mlx4_en_free_affinity_hint(priv, i);
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
	}
}

static void mlx4_en_restart(struct work_struct *work)
{
	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
						 watchdog_task);
	struct mlx4_en_dev *mdev = priv->mdev;
	struct net_device *dev = priv->dev;

1861
	en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port);
1862 1863 1864

	mutex_lock(&mdev->state_lock);
	if (priv->port_up) {
1865
		mlx4_en_stop_port(dev, 1);
1866
		if (mlx4_en_start_port(dev))
1867
			en_err(priv, "Failed restarting port %d\n", priv->port);
1868 1869
	}
	mutex_unlock(&mdev->state_lock);
1870 1871
}

1872
static void mlx4_en_clear_stats(struct net_device *dev)
1873 1874 1875 1876 1877 1878
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int i;

	if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1))
1879
		en_dbg(HW, priv, "Failed dumping statistics\n");
1880 1881 1882

	memset(&priv->stats, 0, sizeof(priv->stats));
	memset(&priv->pstats, 0, sizeof(priv->pstats));
1883 1884
	memset(&priv->pkstats, 0, sizeof(priv->pkstats));
	memset(&priv->port_stats, 0, sizeof(priv->port_stats));
1885 1886

	for (i = 0; i < priv->tx_ring_num; i++) {
1887 1888 1889
		priv->tx_ring[i]->bytes = 0;
		priv->tx_ring[i]->packets = 0;
		priv->tx_ring[i]->tx_csum = 0;
1890 1891
	}
	for (i = 0; i < priv->rx_ring_num; i++) {
1892 1893 1894 1895
		priv->rx_ring[i]->bytes = 0;
		priv->rx_ring[i]->packets = 0;
		priv->rx_ring[i]->csum_ok = 0;
		priv->rx_ring[i]->csum_none = 0;
1896
		priv->rx_ring[i]->csum_complete = 0;
1897
	}
1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915
}

static int mlx4_en_open(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int err = 0;

	mutex_lock(&mdev->state_lock);

	if (!mdev->device_up) {
		en_err(priv, "Cannot open - device down/disabled\n");
		err = -EBUSY;
		goto out;
	}

	/* Reset HW statistics and SW counters */
	mlx4_en_clear_stats(dev);
1916 1917 1918

	err = mlx4_en_start_port(dev);
	if (err)
1919
		en_err(priv, "Failed starting port:%d\n", priv->port);
1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931

out:
	mutex_unlock(&mdev->state_lock);
	return err;
}


static int mlx4_en_close(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;

1932
	en_dbg(IFDOWN, priv, "Close port called\n");
1933 1934 1935

	mutex_lock(&mdev->state_lock);

1936
	mlx4_en_stop_port(dev, 0);
1937 1938 1939 1940 1941 1942
	netif_carrier_off(dev);

	mutex_unlock(&mdev->state_lock);
	return 0;
}

1943
void mlx4_en_free_resources(struct mlx4_en_priv *priv)
1944 1945 1946
{
	int i;

1947 1948 1949 1950 1951
#ifdef CONFIG_RFS_ACCEL
	free_irq_cpu_rmap(priv->dev->rx_cpu_rmap);
	priv->dev->rx_cpu_rmap = NULL;
#endif

1952
	for (i = 0; i < priv->tx_ring_num; i++) {
1953
		if (priv->tx_ring && priv->tx_ring[i])
1954
			mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]);
1955
		if (priv->tx_cq && priv->tx_cq[i])
1956
			mlx4_en_destroy_cq(priv, &priv->tx_cq[i]);
1957 1958 1959
	}

	for (i = 0; i < priv->rx_ring_num; i++) {
1960
		if (priv->rx_ring[i])
1961 1962
			mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i],
				priv->prof->rx_ring_size, priv->stride);
1963
		if (priv->rx_cq[i])
1964
			mlx4_en_destroy_cq(priv, &priv->rx_cq[i]);
1965
	}
1966 1967 1968 1969 1970

	if (priv->base_tx_qpn) {
		mlx4_qp_release_range(priv->mdev->dev, priv->base_tx_qpn, priv->tx_ring_num);
		priv->base_tx_qpn = 0;
	}
1971 1972
}

1973
int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
1974 1975 1976
{
	struct mlx4_en_port_profile *prof = priv->prof;
	int i;
1977
	int err;
1978
	int node;
1979

1980
	err = mlx4_qp_reserve_range(priv->mdev->dev, priv->tx_ring_num, 256, &priv->base_tx_qpn);
1981 1982 1983 1984
	if (err) {
		en_err(priv, "failed reserving range for TX rings\n");
		return err;
	}
1985 1986 1987

	/* Create tx Rings */
	for (i = 0; i < priv->tx_ring_num; i++) {
1988
		node = cpu_to_node(i % num_online_cpus());
1989
		if (mlx4_en_create_cq(priv, &priv->tx_cq[i],
1990
				      prof->tx_ring_size, i, TX, node))
1991 1992
			goto err;

1993 1994 1995 1996
		if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i],
					   priv->base_tx_qpn + i,
					   prof->tx_ring_size, TXBB_SIZE,
					   node, i))
1997 1998 1999 2000 2001
			goto err;
	}

	/* Create rx Rings */
	for (i = 0; i < priv->rx_ring_num; i++) {
2002
		node = cpu_to_node(i % num_online_cpus());
2003
		if (mlx4_en_create_cq(priv, &priv->rx_cq[i],
2004
				      prof->rx_ring_size, i, RX, node))
2005 2006 2007
			goto err;

		if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i],
2008 2009
					   prof->rx_ring_size, priv->stride,
					   node))
2010 2011 2012
			goto err;
	}

2013
#ifdef CONFIG_RFS_ACCEL
2014 2015 2016 2017 2018
	if (priv->mdev->dev->caps.comp_pool) {
		priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->mdev->dev->caps.comp_pool);
		if (!priv->dev->rx_cpu_rmap)
			goto err;
	}
2019 2020
#endif

2021 2022 2023
	return 0;

err:
2024
	en_err(priv, "Failed to allocate NIC resources\n");
2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038
	for (i = 0; i < priv->rx_ring_num; i++) {
		if (priv->rx_ring[i])
			mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i],
						prof->rx_ring_size,
						priv->stride);
		if (priv->rx_cq[i])
			mlx4_en_destroy_cq(priv, &priv->rx_cq[i]);
	}
	for (i = 0; i < priv->tx_ring_num; i++) {
		if (priv->tx_ring[i])
			mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]);
		if (priv->tx_cq[i])
			mlx4_en_destroy_cq(priv, &priv->tx_cq[i]);
	}
2039 2040 2041 2042 2043 2044 2045 2046 2047
	return -ENOMEM;
}


void mlx4_en_destroy_netdev(struct net_device *dev)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;

2048
	en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
2049 2050 2051 2052 2053 2054 2055 2056 2057

	/* Unregister device - this will close the port if it was up */
	if (priv->registered)
		unregister_netdev(dev);

	if (priv->allocated)
		mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE);

	cancel_delayed_work(&priv->stats_task);
A
Amir Vadai 已提交
2058
	cancel_delayed_work(&priv->service_task);
2059 2060 2061 2062 2063 2064 2065 2066
	/* flush any pending task for this netdev */
	flush_workqueue(mdev->workqueue);

	/* Detach the netdev so tasks would not attempt to access it */
	mutex_lock(&mdev->state_lock);
	mdev->pndev[priv->port] = NULL;
	mutex_unlock(&mdev->state_lock);

2067
	mlx4_en_free_resources(priv);
A
Amir Vadai 已提交
2068

2069 2070 2071
	kfree(priv->tx_ring);
	kfree(priv->tx_cq);

2072 2073 2074 2075 2076 2077 2078 2079 2080
	free_netdev(dev);
}

static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int err = 0;

2081
	en_dbg(DRV, priv, "Change MTU called - current:%d new:%d\n",
2082 2083 2084
		 dev->mtu, new_mtu);

	if ((new_mtu < MLX4_EN_MIN_MTU) || (new_mtu > priv->max_mtu)) {
2085
		en_err(priv, "Bad MTU size:%d.\n", new_mtu);
2086 2087 2088 2089 2090 2091 2092 2093 2094
		return -EPERM;
	}
	dev->mtu = new_mtu;

	if (netif_running(dev)) {
		mutex_lock(&mdev->state_lock);
		if (!mdev->device_up) {
			/* NIC is probably restarting - let watchdog task reset
			 * the port */
2095
			en_dbg(DRV, priv, "Change MTU called with card down!?\n");
2096
		} else {
2097
			mlx4_en_stop_port(dev, 1);
2098 2099
			err = mlx4_en_start_port(dev);
			if (err) {
2100
				en_err(priv, "Failed restarting port:%d\n",
2101 2102 2103 2104 2105 2106 2107 2108 2109
					 priv->port);
				queue_work(mdev->workqueue, &priv->watchdog_task);
			}
		}
		mutex_unlock(&mdev->state_lock);
	}
	return 0;
}

2110
static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	struct hwtstamp_config config;

	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
		return -EFAULT;

	/* reserved for future extensions */
	if (config.flags)
		return -EINVAL;

	/* device doesn't support time stamping */
	if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS))
		return -EINVAL;

	/* TX HW timestamp */
	switch (config.tx_type) {
	case HWTSTAMP_TX_OFF:
	case HWTSTAMP_TX_ON:
		break;
	default:
		return -ERANGE;
	}

	/* RX HW timestamp */
	switch (config.rx_filter) {
	case HWTSTAMP_FILTER_NONE:
		break;
	case HWTSTAMP_FILTER_ALL:
	case HWTSTAMP_FILTER_SOME:
	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
	case HWTSTAMP_FILTER_PTP_V2_EVENT:
	case HWTSTAMP_FILTER_PTP_V2_SYNC:
	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
		config.rx_filter = HWTSTAMP_FILTER_ALL;
		break;
	default:
		return -ERANGE;
	}

2160
	if (mlx4_en_reset_config(dev, config, dev->features)) {
2161 2162 2163 2164 2165 2166 2167 2168
		config.tx_type = HWTSTAMP_TX_OFF;
		config.rx_filter = HWTSTAMP_FILTER_NONE;
	}

	return copy_to_user(ifr->ifr_data, &config,
			    sizeof(config)) ? -EFAULT : 0;
}

2169 2170 2171 2172 2173 2174 2175 2176
static int mlx4_en_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);

	return copy_to_user(ifr->ifr_data, &priv->hwtstamp_config,
			    sizeof(priv->hwtstamp_config)) ? -EFAULT : 0;
}

2177 2178 2179 2180
static int mlx4_en_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	switch (cmd) {
	case SIOCSHWTSTAMP:
2181 2182 2183
		return mlx4_en_hwtstamp_set(dev, ifr);
	case SIOCGHWTSTAMP:
		return mlx4_en_hwtstamp_get(dev, ifr);
2184 2185 2186 2187 2188
	default:
		return -EOPNOTSUPP;
	}
}

A
Amir Vadai 已提交
2189 2190 2191 2192
static int mlx4_en_set_features(struct net_device *netdev,
		netdev_features_t features)
{
	struct mlx4_en_priv *priv = netdev_priv(netdev);
2193 2194 2195 2196 2197 2198 2199 2200 2201 2202
	int ret = 0;

	if (DEV_FEATURE_CHANGED(netdev, features, NETIF_F_HW_VLAN_CTAG_RX)) {
		en_info(priv, "Turn %s RX vlan strip offload\n",
			(features & NETIF_F_HW_VLAN_CTAG_RX) ? "ON" : "OFF");
		ret = mlx4_en_reset_config(netdev, priv->hwtstamp_config,
					   features);
		if (ret)
			return ret;
	}
A
Amir Vadai 已提交
2203 2204 2205 2206 2207 2208 2209

	if (features & NETIF_F_LOOPBACK)
		priv->ctrl_flags |= cpu_to_be32(MLX4_WQE_CTRL_FORCE_LOOPBACK);
	else
		priv->ctrl_flags &=
			cpu_to_be32(~MLX4_WQE_CTRL_FORCE_LOOPBACK);

2210 2211
	mlx4_en_update_loopback_state(netdev, features);

A
Amir Vadai 已提交
2212 2213 2214 2215
	return 0;

}

2216 2217 2218 2219
static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac)
{
	struct mlx4_en_priv *en_priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = en_priv->mdev;
2220
	u64 mac_u64 = mlx4_mac_to_u64(mac);
2221 2222 2223 2224 2225 2226 2227

	if (!is_valid_ether_addr(mac))
		return -EINVAL;

	return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64);
}

2228 2229 2230 2231 2232 2233 2234 2235
static int mlx4_en_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos)
{
	struct mlx4_en_priv *en_priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = en_priv->mdev;

	return mlx4_set_vf_vlan(mdev->dev, en_priv->port, vf, vlan, qos);
}

2236 2237 2238 2239 2240 2241 2242 2243
static int mlx4_en_set_vf_spoofchk(struct net_device *dev, int vf, bool setting)
{
	struct mlx4_en_priv *en_priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = en_priv->mdev;

	return mlx4_set_vf_spoofchk(mdev->dev, en_priv->port, vf, setting);
}

2244 2245 2246 2247 2248 2249 2250
static int mlx4_en_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivf)
{
	struct mlx4_en_priv *en_priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = en_priv->mdev;

	return mlx4_get_vf_config(mdev->dev, en_priv->port, vf, ivf);
}
2251

2252 2253 2254 2255 2256 2257 2258
static int mlx4_en_set_vf_link_state(struct net_device *dev, int vf, int link_state)
{
	struct mlx4_en_priv *en_priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = en_priv->mdev;

	return mlx4_set_vf_link_state(mdev->dev, en_priv->port, vf, link_state);
}
2259 2260 2261

#define PORT_ID_BYTE_LEN 8
static int mlx4_en_get_phys_port_id(struct net_device *dev,
2262
				    struct netdev_phys_item_id *ppid)
2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_dev *mdev = priv->mdev->dev;
	int i;
	u64 phys_port_id = mdev->caps.phys_port_id[priv->port];

	if (!phys_port_id)
		return -EOPNOTSUPP;

	ppid->id_len = sizeof(phys_port_id);
	for (i = PORT_ID_BYTE_LEN - 1; i >= 0; --i) {
		ppid->id[i] =  phys_port_id & 0xff;
		phys_port_id >>= 8;
	}
	return 0;
}

2280
#ifdef CONFIG_MLX4_EN_VXLAN
O
Or Gerlitz 已提交
2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293
static void mlx4_en_add_vxlan_offloads(struct work_struct *work)
{
	int ret;
	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
						 vxlan_add_task);

	ret = mlx4_config_vxlan_port(priv->mdev->dev, priv->vxlan_port);
	if (ret)
		goto out;

	ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port,
				  VXLAN_STEER_BY_OUTER_MAC, 1);
out:
2294
	if (ret) {
O
Or Gerlitz 已提交
2295
		en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret);
2296 2297 2298 2299 2300 2301 2302 2303
		return;
	}

	/* set offloads */
	priv->dev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
				      NETIF_F_TSO | NETIF_F_GSO_UDP_TUNNEL;
	priv->dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
	priv->dev->features    |= NETIF_F_GSO_UDP_TUNNEL;
O
Or Gerlitz 已提交
2304 2305 2306 2307 2308 2309 2310
}

static void mlx4_en_del_vxlan_offloads(struct work_struct *work)
{
	int ret;
	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
						 vxlan_del_task);
2311 2312 2313 2314 2315
	/* unset offloads */
	priv->dev->hw_enc_features &= ~(NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
				      NETIF_F_TSO | NETIF_F_GSO_UDP_TUNNEL);
	priv->dev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;
	priv->dev->features    &= ~NETIF_F_GSO_UDP_TUNNEL;
O
Or Gerlitz 已提交
2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330

	ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port,
				  VXLAN_STEER_BY_OUTER_MAC, 0);
	if (ret)
		en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret);

	priv->vxlan_port = 0;
}

static void mlx4_en_add_vxlan_port(struct  net_device *dev,
				   sa_family_t sa_family, __be16 port)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	__be16 current_port;

2331
	if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
O
Or Gerlitz 已提交
2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367
		return;

	if (sa_family == AF_INET6)
		return;

	current_port = priv->vxlan_port;
	if (current_port && current_port != port) {
		en_warn(priv, "vxlan port %d configured, can't add port %d\n",
			ntohs(current_port), ntohs(port));
		return;
	}

	priv->vxlan_port = port;
	queue_work(priv->mdev->workqueue, &priv->vxlan_add_task);
}

static void mlx4_en_del_vxlan_port(struct  net_device *dev,
				   sa_family_t sa_family, __be16 port)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	__be16 current_port;

	if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
		return;

	if (sa_family == AF_INET6)
		return;

	current_port = priv->vxlan_port;
	if (current_port != port) {
		en_dbg(DRV, priv, "vxlan port %d isn't configured, ignoring\n", ntohs(port));
		return;
	}

	queue_work(priv->mdev->workqueue, &priv->vxlan_del_task);
}
2368 2369 2370 2371 2372

static bool mlx4_en_gso_check(struct sk_buff *skb, struct net_device *dev)
{
	return vxlan_gso_check(skb);
}
2373
#endif
O
Or Gerlitz 已提交
2374

2375 2376 2377 2378
static const struct net_device_ops mlx4_netdev_ops = {
	.ndo_open		= mlx4_en_open,
	.ndo_stop		= mlx4_en_close,
	.ndo_start_xmit		= mlx4_en_xmit,
Y
Yevgeny Petrilin 已提交
2379
	.ndo_select_queue	= mlx4_en_select_queue,
2380
	.ndo_get_stats		= mlx4_en_get_stats,
2381
	.ndo_set_rx_mode	= mlx4_en_set_rx_mode,
2382
	.ndo_set_mac_address	= mlx4_en_set_mac,
2383
	.ndo_validate_addr	= eth_validate_addr,
2384
	.ndo_change_mtu		= mlx4_en_change_mtu,
2385
	.ndo_do_ioctl		= mlx4_en_ioctl,
2386 2387 2388 2389 2390 2391
	.ndo_tx_timeout		= mlx4_en_tx_timeout,
	.ndo_vlan_rx_add_vid	= mlx4_en_vlan_rx_add_vid,
	.ndo_vlan_rx_kill_vid	= mlx4_en_vlan_rx_kill_vid,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= mlx4_en_netpoll,
#endif
A
Amir Vadai 已提交
2392
	.ndo_set_features	= mlx4_en_set_features,
2393
	.ndo_setup_tc		= mlx4_en_setup_tc,
2394 2395 2396
#ifdef CONFIG_RFS_ACCEL
	.ndo_rx_flow_steer	= mlx4_en_filter_rfs,
#endif
2397
#ifdef CONFIG_NET_RX_BUSY_POLL
2398
	.ndo_busy_poll		= mlx4_en_low_latency_recv,
2399
#endif
2400
	.ndo_get_phys_port_id	= mlx4_en_get_phys_port_id,
2401
#ifdef CONFIG_MLX4_EN_VXLAN
O
Or Gerlitz 已提交
2402 2403
	.ndo_add_vxlan_port	= mlx4_en_add_vxlan_port,
	.ndo_del_vxlan_port	= mlx4_en_del_vxlan_port,
2404
	.ndo_gso_check		= mlx4_en_gso_check,
2405
#endif
2406 2407
};

2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421
static const struct net_device_ops mlx4_netdev_ops_master = {
	.ndo_open		= mlx4_en_open,
	.ndo_stop		= mlx4_en_close,
	.ndo_start_xmit		= mlx4_en_xmit,
	.ndo_select_queue	= mlx4_en_select_queue,
	.ndo_get_stats		= mlx4_en_get_stats,
	.ndo_set_rx_mode	= mlx4_en_set_rx_mode,
	.ndo_set_mac_address	= mlx4_en_set_mac,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_change_mtu		= mlx4_en_change_mtu,
	.ndo_tx_timeout		= mlx4_en_tx_timeout,
	.ndo_vlan_rx_add_vid	= mlx4_en_vlan_rx_add_vid,
	.ndo_vlan_rx_kill_vid	= mlx4_en_vlan_rx_kill_vid,
	.ndo_set_vf_mac		= mlx4_en_set_vf_mac,
2422
	.ndo_set_vf_vlan	= mlx4_en_set_vf_vlan,
2423
	.ndo_set_vf_spoofchk	= mlx4_en_set_vf_spoofchk,
2424
	.ndo_set_vf_link_state	= mlx4_en_set_vf_link_state,
2425
	.ndo_get_vf_config	= mlx4_en_get_vf_config,
2426 2427 2428 2429 2430 2431 2432 2433
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= mlx4_en_netpoll,
#endif
	.ndo_set_features	= mlx4_en_set_features,
	.ndo_setup_tc		= mlx4_en_setup_tc,
#ifdef CONFIG_RFS_ACCEL
	.ndo_rx_flow_steer	= mlx4_en_filter_rfs,
#endif
2434
	.ndo_get_phys_port_id	= mlx4_en_get_phys_port_id,
2435 2436 2437 2438 2439
#ifdef CONFIG_MLX4_EN_VXLAN
	.ndo_add_vxlan_port	= mlx4_en_add_vxlan_port,
	.ndo_del_vxlan_port	= mlx4_en_del_vxlan_port,
	.ndo_gso_check		= mlx4_en_gso_check,
#endif
2440 2441
};

2442 2443 2444 2445 2446
int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
			struct mlx4_en_port_profile *prof)
{
	struct net_device *dev;
	struct mlx4_en_priv *priv;
2447
	int i;
2448
	int err;
2449
	u64 mac_u64;
2450

2451
	dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),
2452
				 MAX_TX_RINGS, MAX_RX_RINGS);
2453
	if (dev == NULL)
2454 2455
		return -ENOMEM;

2456 2457 2458
	netif_set_real_num_tx_queues(dev, prof->tx_ring_num);
	netif_set_real_num_rx_queues(dev, prof->rx_ring_num);

2459
	SET_NETDEV_DEV(dev, &mdev->dev->pdev->dev);
2460
	dev->dev_port = port - 1;
2461 2462 2463 2464 2465 2466 2467

	/*
	 * Initialize driver private data
	 */

	priv = netdev_priv(dev);
	memset(priv, 0, sizeof(struct mlx4_en_priv));
2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482
	spin_lock_init(&priv->stats_lock);
	INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode);
	INIT_WORK(&priv->watchdog_task, mlx4_en_restart);
	INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
	INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);
	INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task);
#ifdef CONFIG_MLX4_EN_VXLAN
	INIT_WORK(&priv->vxlan_add_task, mlx4_en_add_vxlan_offloads);
	INIT_WORK(&priv->vxlan_del_task, mlx4_en_del_vxlan_offloads);
#endif
#ifdef CONFIG_RFS_ACCEL
	INIT_LIST_HEAD(&priv->filters);
	spin_lock_init(&priv->filters_lock);
#endif

2483 2484
	priv->dev = dev;
	priv->mdev = mdev;
2485
	priv->ddev = &mdev->pdev->dev;
2486 2487 2488 2489
	priv->prof = prof;
	priv->port = port;
	priv->port_up = false;
	priv->flags = prof->flags;
2490
	priv->pflags = MLX4_EN_PRIV_FLAGS_BLUEFLAME;
A
Amir Vadai 已提交
2491 2492
	priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE |
			MLX4_WQE_CTRL_SOLICITED);
2493
	priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up;
2494
	priv->tx_ring_num = prof->tx_ring_num;
2495
	priv->tx_work_limit = MLX4_EN_DEFAULT_TX_WORK;
E
Eric Dumazet 已提交
2496
	netdev_rss_key_fill(priv->rss_key, sizeof(priv->rss_key));
2497

2498
	priv->tx_ring = kzalloc(sizeof(struct mlx4_en_tx_ring *) * MAX_TX_RINGS,
2499
				GFP_KERNEL);
2500 2501 2502 2503
	if (!priv->tx_ring) {
		err = -ENOMEM;
		goto out;
	}
2504
	priv->tx_cq = kzalloc(sizeof(struct mlx4_en_cq *) * MAX_TX_RINGS,
2505
			      GFP_KERNEL);
2506 2507 2508 2509
	if (!priv->tx_cq) {
		err = -ENOMEM;
		goto out;
	}
2510
	priv->rx_ring_num = prof->rx_ring_num;
O
Or Gerlitz 已提交
2511
	priv->cqe_factor = (mdev->dev->caps.cqe_size == 64) ? 1 : 0;
2512
	priv->cqe_size = mdev->dev->caps.cqe_size;
2513 2514
	priv->mac_index = -1;
	priv->msg_enable = MLX4_EN_MSG_LEVEL;
A
Amir Vadai 已提交
2515
#ifdef CONFIG_MLX4_EN_DCB
2516 2517 2518 2519 2520 2521 2522 2523
	if (!mlx4_is_slave(priv->mdev->dev)) {
		if (mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_SET_ETH_SCHED) {
			dev->dcbnl_ops = &mlx4_en_dcbnl_ops;
		} else {
			en_info(priv, "enabling only PFC DCB ops\n");
			dev->dcbnl_ops = &mlx4_en_dcbnl_pfc_ops;
		}
	}
A
Amir Vadai 已提交
2524
#endif
2525

2526 2527
	for (i = 0; i < MLX4_EN_MAC_HASH_SIZE; ++i)
		INIT_HLIST_HEAD(&priv->mac_hash[i]);
2528

2529 2530
	/* Query for default mac and max mtu */
	priv->max_mtu = mdev->dev->caps.eth_mtu_cap[priv->port];
2531

2532 2533 2534 2535
	if (mdev->dev->caps.rx_checksum_flags_port[priv->port] &
	    MLX4_RX_CSUM_MODE_VAL_NON_TCP_UDP)
		priv->flags |= MLX4_EN_FLAG_RX_CSUM_NON_TCP_UDP;

2536 2537 2538 2539
	/* Set default MAC */
	dev->addr_len = ETH_ALEN;
	mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]);
	if (!is_valid_ether_addr(dev->dev_addr)) {
2540 2541 2542
		if (mlx4_is_slave(priv->mdev->dev)) {
			eth_hw_addr_random(dev);
			en_warn(priv, "Assigned random MAC address %pM\n", dev->dev_addr);
2543
			mac_u64 = mlx4_mac_to_u64(dev->dev_addr);
2544 2545 2546 2547 2548 2549 2550
			mdev->dev->caps.def_mac[priv->port] = mac_u64;
		} else {
			en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n",
			       priv->port, dev->dev_addr);
			err = -EINVAL;
			goto out;
		}
2551 2552
	}

2553
	memcpy(priv->current_mac, dev->dev_addr, sizeof(priv->current_mac));
2554

2555 2556 2557 2558 2559 2560
	priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) +
					  DS_SIZE * MLX4_EN_MAX_RX_FRAGS);
	err = mlx4_en_alloc_resources(priv);
	if (err)
		goto out;

2561 2562 2563 2564 2565
	/* Initialize time stamping config */
	priv->hwtstamp_config.flags = 0;
	priv->hwtstamp_config.tx_type = HWTSTAMP_TX_OFF;
	priv->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_NONE;

2566 2567 2568 2569
	/* Allocate page for receive rings */
	err = mlx4_alloc_hwq_res(mdev->dev, &priv->res,
				MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE);
	if (err) {
2570
		en_err(priv, "Failed to allocate page for rx qps\n");
2571 2572 2573 2574 2575 2576 2577
		goto out;
	}
	priv->allocated = 1;

	/*
	 * Initialize netdev entry points
	 */
2578 2579 2580 2581
	if (mlx4_is_master(priv->mdev->dev))
		dev->netdev_ops = &mlx4_netdev_ops_master;
	else
		dev->netdev_ops = &mlx4_netdev_ops;
2582
	dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT;
2583 2584
	netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
	netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
2585

2586
	dev->ethtool_ops = &mlx4_en_ethtool_ops;
2587 2588 2589 2590

	/*
	 * Set driver features
	 */
2591 2592 2593 2594 2595 2596
	dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
	if (mdev->LSO_support)
		dev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;

	dev->vlan_features = dev->hw_features;

Y
Yevgeny Petrilin 已提交
2597
	dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_RXHASH;
2598
	dev->features = dev->hw_features | NETIF_F_HIGHDMA |
2599 2600
			NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
			NETIF_F_HW_VLAN_CTAG_FILTER;
2601 2602
	dev->hw_features |= NETIF_F_LOOPBACK |
			NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
2603

2604 2605 2606 2607
	if (mdev->dev->caps.steering_mode ==
	    MLX4_STEERING_MODE_DEVICE_MANAGED)
		dev->hw_features |= NETIF_F_NTUPLE;

2608 2609 2610
	if (mdev->dev->caps.steering_mode != MLX4_STEERING_MODE_A0)
		dev->priv_flags |= IFF_UNICAST_FLT;

2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621
	/* Setting a default hash function value */
	if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP) {
		priv->rss_hash_fn = ETH_RSS_HASH_TOP;
	} else if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_XOR) {
		priv->rss_hash_fn = ETH_RSS_HASH_XOR;
	} else {
		en_warn(priv,
			"No RSS hash capabilities exposed, using Toeplitz\n");
		priv->rss_hash_fn = ETH_RSS_HASH_TOP;
	}

2622 2623 2624
	mdev->pndev[port] = dev;

	netif_carrier_off(dev);
2625 2626
	mlx4_en_set_default_moderation(priv);

2627 2628
	err = register_netdev(dev);
	if (err) {
2629
		en_err(priv, "Netdev registration failed for port %d\n", port);
2630 2631
		goto out;
	}
2632
	priv->registered = 1;
2633 2634 2635 2636

	en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num);
	en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);

2637 2638
	mlx4_en_update_loopback_state(priv->dev, priv->dev->features);

2639
	/* Configure port */
2640
	mlx4_en_calc_rx_buf(dev);
2641
	err = mlx4_SET_PORT_general(mdev->dev, priv->port,
2642 2643 2644
				    priv->rx_skb_size + ETH_FCS_LEN,
				    prof->tx_pause, prof->tx_ppp,
				    prof->rx_pause, prof->rx_ppp);
2645
	if (err) {
J
Joe Perches 已提交
2646 2647
		en_err(priv, "Failed setting port general configurations for port %d, with error %d\n",
		       priv->port, err);
2648 2649 2650
		goto out;
	}

2651
	if (mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
O
Or Gerlitz 已提交
2652
		err = mlx4_SET_PORT_VXLAN(mdev->dev, priv->port, VXLAN_STEER_BY_OUTER_MAC, 1);
2653 2654 2655 2656 2657 2658 2659
		if (err) {
			en_err(priv, "Failed setting port L2 tunnel configuration, err %d\n",
			       err);
			goto out;
		}
	}

2660 2661 2662 2663 2664 2665 2666
	/* Init port */
	en_warn(priv, "Initializing port\n");
	err = mlx4_INIT_PORT(mdev->dev, priv->port);
	if (err) {
		en_err(priv, "Failed Initializing port\n");
		goto out;
	}
2667
	queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
2668 2669 2670 2671 2672

	if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
		queue_delayed_work(mdev->workqueue, &priv->service_task,
				   SERVICE_TASK_DELAY);

2673 2674 2675 2676 2677 2678 2679
	return 0;

out:
	mlx4_en_destroy_netdev(dev);
	return err;
}

2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755
int mlx4_en_reset_config(struct net_device *dev,
			 struct hwtstamp_config ts_config,
			 netdev_features_t features)
{
	struct mlx4_en_priv *priv = netdev_priv(dev);
	struct mlx4_en_dev *mdev = priv->mdev;
	int port_up = 0;
	int err = 0;

	if (priv->hwtstamp_config.tx_type == ts_config.tx_type &&
	    priv->hwtstamp_config.rx_filter == ts_config.rx_filter &&
	    !DEV_FEATURE_CHANGED(dev, features, NETIF_F_HW_VLAN_CTAG_RX))
		return 0; /* Nothing to change */

	if (DEV_FEATURE_CHANGED(dev, features, NETIF_F_HW_VLAN_CTAG_RX) &&
	    (features & NETIF_F_HW_VLAN_CTAG_RX) &&
	    (priv->hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE)) {
		en_warn(priv, "Can't turn ON rx vlan offload while time-stamping rx filter is ON\n");
		return -EINVAL;
	}

	mutex_lock(&mdev->state_lock);
	if (priv->port_up) {
		port_up = 1;
		mlx4_en_stop_port(dev, 1);
	}

	mlx4_en_free_resources(priv);

	en_warn(priv, "Changing device configuration rx filter(%x) rx vlan(%x)\n",
		ts_config.rx_filter, !!(features & NETIF_F_HW_VLAN_CTAG_RX));

	priv->hwtstamp_config.tx_type = ts_config.tx_type;
	priv->hwtstamp_config.rx_filter = ts_config.rx_filter;

	if (DEV_FEATURE_CHANGED(dev, features, NETIF_F_HW_VLAN_CTAG_RX)) {
		if (features & NETIF_F_HW_VLAN_CTAG_RX)
			dev->features |= NETIF_F_HW_VLAN_CTAG_RX;
		else
			dev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
	} else if (ts_config.rx_filter == HWTSTAMP_FILTER_NONE) {
		/* RX time-stamping is OFF, update the RX vlan offload
		 * to the latest wanted state
		 */
		if (dev->wanted_features & NETIF_F_HW_VLAN_CTAG_RX)
			dev->features |= NETIF_F_HW_VLAN_CTAG_RX;
		else
			dev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
	}

	/* RX vlan offload and RX time-stamping can't co-exist !
	 * Regardless of the caller's choice,
	 * Turn Off RX vlan offload in case of time-stamping is ON
	 */
	if (ts_config.rx_filter != HWTSTAMP_FILTER_NONE) {
		if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
			en_warn(priv, "Turning off RX vlan offload since RX time-stamping is ON\n");
		dev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
	}

	err = mlx4_en_alloc_resources(priv);
	if (err) {
		en_err(priv, "Failed reallocating port resources\n");
		goto out;
	}
	if (port_up) {
		err = mlx4_en_start_port(dev);
		if (err)
			en_err(priv, "Failed starting port\n");
	}

out:
	mutex_unlock(&mdev->state_lock);
	netdev_features_change(dev);
	return err;
}