be_main.c 112.7 KB
Newer Older
S
Sathya Perla 已提交
1
/*
V
Vasundhara Volam 已提交
2
 * Copyright (C) 2005 - 2013 Emulex
S
Sathya Perla 已提交
3 4 5 6 7 8 9 10
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.  The full GNU General
 * Public License is included in this distribution in the file called COPYING.
 *
 * Contact Information:
11
 * linux-drivers@emulex.com
S
Sathya Perla 已提交
12
 *
13 14 15
 * Emulex
 * 3333 Susan Street
 * Costa Mesa, CA 92626
S
Sathya Perla 已提交
16 17
 */

18
#include <linux/prefetch.h>
19
#include <linux/module.h>
S
Sathya Perla 已提交
20
#include "be.h"
21
#include "be_cmds.h"
22
#include <asm/div64.h>
S
Sathya Perla 已提交
23
#include <linux/aer.h>
S
Sathya Perla 已提交
24 25 26 27

MODULE_VERSION(DRV_VER);
MODULE_DEVICE_TABLE(pci, be_dev_ids);
MODULE_DESCRIPTION(DRV_DESC " " DRV_VER);
28
MODULE_AUTHOR("Emulex Corporation");
S
Sathya Perla 已提交
29 30
MODULE_LICENSE("GPL");

31 32 33
static unsigned int num_vfs;
module_param(num_vfs, uint, S_IRUGO);
MODULE_PARM_DESC(num_vfs, "Number of PCI VFs to initialize");
S
Sathya Perla 已提交
34

35 36 37 38
static ushort rx_frag_size = 2048;
module_param(rx_frag_size, ushort, S_IRUGO);
MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");

S
Sathya Perla 已提交
39
static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = {
40
	{ PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) },
41
	{ PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID2) },
42 43
	{ PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) },
	{ PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) },
44
	{ PCI_DEVICE(EMULEX_VENDOR_ID, OC_DEVICE_ID3)},
45
	{ PCI_DEVICE(EMULEX_VENDOR_ID, OC_DEVICE_ID4)},
46
	{ PCI_DEVICE(EMULEX_VENDOR_ID, OC_DEVICE_ID5)},
47
	{ PCI_DEVICE(EMULEX_VENDOR_ID, OC_DEVICE_ID6)},
S
Sathya Perla 已提交
48 49 50
	{ 0 }
};
MODULE_DEVICE_TABLE(pci, be_dev_ids);
51
/* UE Status Low CSR */
52
static const char * const ue_status_low_desc[] = {
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
	"CEV",
	"CTX",
	"DBUF",
	"ERX",
	"Host",
	"MPU",
	"NDMA",
	"PTC ",
	"RDMA ",
	"RXF ",
	"RXIPS ",
	"RXULP0 ",
	"RXULP1 ",
	"RXULP2 ",
	"TIM ",
	"TPOST ",
	"TPRE ",
	"TXIPS ",
	"TXULP0 ",
	"TXULP1 ",
	"UC ",
	"WDMA ",
	"TXULP2 ",
	"HOST1 ",
	"P0_OB_LINK ",
	"P1_OB_LINK ",
	"HOST_GPIO ",
	"MBOX ",
	"AXGMAC0",
	"AXGMAC1",
	"JTAG",
	"MPU_INTPEND"
};
/* UE Status High CSR */
87
static const char * const ue_status_hi_desc[] = {
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
	"LPCMEMHOST",
	"MGMT_MAC",
	"PCS0ONLINE",
	"MPU_IRAM",
	"PCS1ONLINE",
	"PCTL0",
	"PCTL1",
	"PMEM",
	"RR",
	"TXPB",
	"RXPP",
	"XAUI",
	"TXP",
	"ARM",
	"IPC",
	"HOST2",
	"HOST3",
	"HOST4",
	"HOST5",
	"HOST6",
	"HOST7",
	"HOST8",
	"HOST9",
111
	"NETC",
112 113 114 115 116 117 118 119 120
	"Unknown",
	"Unknown",
	"Unknown",
	"Unknown",
	"Unknown",
	"Unknown",
	"Unknown",
	"Unknown"
};
S
Sathya Perla 已提交
121

122 123 124 125 126 127 128
/* Is BE in a multi-channel mode */
static inline bool be_is_mc(struct be_adapter *adapter) {
	return (adapter->function_mode & FLEX10_MODE ||
		adapter->function_mode & VNIC_MODE ||
		adapter->function_mode & UMC_ENABLED);
}

S
Sathya Perla 已提交
129 130 131
static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q)
{
	struct be_dma_mem *mem = &q->dma_mem;
132
	if (mem->va) {
I
Ivan Vecera 已提交
133 134
		dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
				  mem->dma);
135 136
		mem->va = NULL;
	}
S
Sathya Perla 已提交
137 138 139 140 141 142 143 144 145 146 147
}

static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q,
		u16 len, u16 entry_size)
{
	struct be_dma_mem *mem = &q->dma_mem;

	memset(q, 0, sizeof(*q));
	q->len = len;
	q->entry_size = entry_size;
	mem->size = len * entry_size;
I
Ivan Vecera 已提交
148
	mem->va = dma_alloc_coherent(&adapter->pdev->dev, mem->size, &mem->dma,
149
				     GFP_KERNEL | __GFP_ZERO);
S
Sathya Perla 已提交
150
	if (!mem->va)
S
Sathya Perla 已提交
151
		return -ENOMEM;
S
Sathya Perla 已提交
152 153 154
	return 0;
}

155
static void be_reg_intr_set(struct be_adapter *adapter, bool enable)
S
Sathya Perla 已提交
156
{
157
	u32 reg, enabled;
158

159 160 161 162
	pci_read_config_dword(adapter->pdev, PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET,
				&reg);
	enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;

163
	if (!enabled && enable)
S
Sathya Perla 已提交
164
		reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
165
	else if (enabled && !enable)
S
Sathya Perla 已提交
166
		reg &= ~MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
167
	else
S
Sathya Perla 已提交
168
		return;
169

170 171
	pci_write_config_dword(adapter->pdev,
			PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET, reg);
S
Sathya Perla 已提交
172 173
}

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
static void be_intr_set(struct be_adapter *adapter, bool enable)
{
	int status = 0;

	/* On lancer interrupts can't be controlled via this register */
	if (lancer_chip(adapter))
		return;

	if (adapter->eeh_error)
		return;

	status = be_cmd_intr_set(adapter, enable);
	if (status)
		be_reg_intr_set(adapter, enable);
}

190
static void be_rxq_notify(struct be_adapter *adapter, u16 qid, u16 posted)
S
Sathya Perla 已提交
191 192 193 194
{
	u32 val = 0;
	val |= qid & DB_RQ_RING_ID_MASK;
	val |= posted << DB_RQ_NUM_POSTED_SHIFT;
195 196

	wmb();
197
	iowrite32(val, adapter->db + DB_RQ_OFFSET);
S
Sathya Perla 已提交
198 199
}

V
Vasundhara Volam 已提交
200 201
static void be_txq_notify(struct be_adapter *adapter, struct be_tx_obj *txo,
			  u16 posted)
S
Sathya Perla 已提交
202 203
{
	u32 val = 0;
V
Vasundhara Volam 已提交
204
	val |= txo->q.id & DB_TXULP_RING_ID_MASK;
S
Sathya Perla 已提交
205
	val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;
206 207

	wmb();
V
Vasundhara Volam 已提交
208
	iowrite32(val, adapter->db + txo->db_offset);
S
Sathya Perla 已提交
209 210
}

211
static void be_eq_notify(struct be_adapter *adapter, u16 qid,
S
Sathya Perla 已提交
212 213 214 215
		bool arm, bool clear_int, u16 num_popped)
{
	u32 val = 0;
	val |= qid & DB_EQ_RING_ID_MASK;
216 217
	val |= ((qid & DB_EQ_RING_ID_EXT_MASK) <<
			DB_EQ_RING_ID_EXT_MASK_SHIFT);
218

219
	if (adapter->eeh_error)
220 221
		return;

S
Sathya Perla 已提交
222 223 224 225 226 227
	if (arm)
		val |= 1 << DB_EQ_REARM_SHIFT;
	if (clear_int)
		val |= 1 << DB_EQ_CLR_SHIFT;
	val |= 1 << DB_EQ_EVNT_SHIFT;
	val |= num_popped << DB_EQ_NUM_POPPED_SHIFT;
228
	iowrite32(val, adapter->db + DB_EQ_OFFSET);
S
Sathya Perla 已提交
229 230
}

231
void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, u16 num_popped)
S
Sathya Perla 已提交
232 233 234
{
	u32 val = 0;
	val |= qid & DB_CQ_RING_ID_MASK;
235 236
	val |= ((qid & DB_CQ_RING_ID_EXT_MASK) <<
			DB_CQ_RING_ID_EXT_MASK_SHIFT);
237

238
	if (adapter->eeh_error)
239 240
		return;

S
Sathya Perla 已提交
241 242 243
	if (arm)
		val |= 1 << DB_CQ_REARM_SHIFT;
	val |= num_popped << DB_CQ_NUM_POPPED_SHIFT;
244
	iowrite32(val, adapter->db + DB_CQ_OFFSET);
S
Sathya Perla 已提交
245 246 247 248 249 250 251
}

static int be_mac_addr_set(struct net_device *netdev, void *p)
{
	struct be_adapter *adapter = netdev_priv(netdev);
	struct sockaddr *addr = p;
	int status = 0;
252
	u8 current_mac[ETH_ALEN];
253
	u32 pmac_id = adapter->pmac_id[0];
254
	bool active_mac = true;
S
Sathya Perla 已提交
255

256 257 258
	if (!is_valid_ether_addr(addr->sa_data))
		return -EADDRNOTAVAIL;

259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
	/* For BE VF, MAC address is already activated by PF.
	 * Hence only operation left is updating netdev->devaddr.
	 * Update it if user is passing the same MAC which was used
	 * during configuring VF MAC from PF(Hypervisor).
	 */
	if (!lancer_chip(adapter) && !be_physfn(adapter)) {
		status = be_cmd_mac_addr_query(adapter, current_mac,
					       false, adapter->if_handle, 0);
		if (!status && !memcmp(current_mac, addr->sa_data, ETH_ALEN))
			goto done;
		else
			goto err;
	}

	if (!memcmp(addr->sa_data, netdev->dev_addr, ETH_ALEN))
		goto done;

	/* For Lancer check if any MAC is active.
	 * If active, get its mac id.
	 */
	if (lancer_chip(adapter) && !be_physfn(adapter))
		be_cmd_get_mac_from_list(adapter, current_mac, &active_mac,
					 &pmac_id, 0);

	status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data,
				 adapter->if_handle,
				 &adapter->pmac_id[0], 0);

287
	if (status)
288
		goto err;
S
Sathya Perla 已提交
289

290 291 292 293
	if (active_mac)
		be_cmd_pmac_del(adapter, adapter->if_handle,
				pmac_id, 0);
done:
294 295 296 297
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
	return 0;
err:
	dev_err(&adapter->pdev->dev, "MAC %pM set Failed\n", addr->sa_data);
S
Sathya Perla 已提交
298 299 300
	return status;
}

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
/* BE2 supports only v0 cmd */
static void *hw_stats_from_cmd(struct be_adapter *adapter)
{
	if (BE2_chip(adapter)) {
		struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	} else  {
		struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	}
}

/* BE2 supports only v0 cmd */
static void *be_erx_stats_from_cmd(struct be_adapter *adapter)
{
	if (BE2_chip(adapter)) {
		struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	} else {
		struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	}
}

static void populate_be_v0_stats(struct be_adapter *adapter)
330
{
331 332 333
	struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
	struct be_rxf_stats_v0 *rxf_stats = &hw_stats->rxf;
334
	struct be_port_rxf_stats_v0 *port_stats =
335 336
					&rxf_stats->port[adapter->port_num];
	struct be_drv_stats *drvs = &adapter->drv_stats;
337

338
	be_dws_le_to_cpu(hw_stats, sizeof(*hw_stats));
339 340 341 342 343 344 345 346 347 348 349 350 351 352
	drvs->rx_pause_frames = port_stats->rx_pause_frames;
	drvs->rx_crc_errors = port_stats->rx_crc_errors;
	drvs->rx_control_frames = port_stats->rx_control_frames;
	drvs->rx_in_range_errors = port_stats->rx_in_range_errors;
	drvs->rx_frame_too_long = port_stats->rx_frame_too_long;
	drvs->rx_dropped_runt = port_stats->rx_dropped_runt;
	drvs->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
	drvs->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
	drvs->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
	drvs->rxpp_fifo_overflow_drop = port_stats->rx_fifo_overflow;
	drvs->rx_dropped_tcp_length = port_stats->rx_dropped_tcp_length;
	drvs->rx_dropped_too_small = port_stats->rx_dropped_too_small;
	drvs->rx_dropped_too_short = port_stats->rx_dropped_too_short;
	drvs->rx_out_range_errors = port_stats->rx_out_range_errors;
353
	drvs->rx_input_fifo_overflow_drop = port_stats->rx_input_fifo_overflow;
354 355
	drvs->rx_dropped_header_too_small =
		port_stats->rx_dropped_header_too_small;
356 357 358
	drvs->rx_address_mismatch_drops =
					port_stats->rx_address_mismatch_drops +
					port_stats->rx_vlan_mismatch_drops;
359 360 361 362 363 364 365
	drvs->rx_alignment_symbol_errors =
		port_stats->rx_alignment_symbol_errors;

	drvs->tx_pauseframes = port_stats->tx_pauseframes;
	drvs->tx_controlframes = port_stats->tx_controlframes;

	if (adapter->port_num)
366
		drvs->jabber_events = rxf_stats->port1_jabber_events;
367
	else
368
		drvs->jabber_events = rxf_stats->port0_jabber_events;
369 370 371 372
	drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
	drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
	drvs->forwarded_packets = rxf_stats->forwarded_packets;
	drvs->rx_drops_mtu = rxf_stats->rx_drops_mtu;
373 374
	drvs->rx_drops_no_tpre_descr = rxf_stats->rx_drops_no_tpre_descr;
	drvs->rx_drops_too_many_frags = rxf_stats->rx_drops_too_many_frags;
375 376 377
	adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops;
}

378
static void populate_be_v1_stats(struct be_adapter *adapter)
379
{
380 381 382
	struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
	struct be_rxf_stats_v1 *rxf_stats = &hw_stats->rxf;
383
	struct be_port_rxf_stats_v1 *port_stats =
384 385
					&rxf_stats->port[adapter->port_num];
	struct be_drv_stats *drvs = &adapter->drv_stats;
386

387
	be_dws_le_to_cpu(hw_stats, sizeof(*hw_stats));
388 389
	drvs->pmem_fifo_overflow_drop = port_stats->pmem_fifo_overflow_drop;
	drvs->rx_priority_pause_frames = port_stats->rx_priority_pause_frames;
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
	drvs->rx_pause_frames = port_stats->rx_pause_frames;
	drvs->rx_crc_errors = port_stats->rx_crc_errors;
	drvs->rx_control_frames = port_stats->rx_control_frames;
	drvs->rx_in_range_errors = port_stats->rx_in_range_errors;
	drvs->rx_frame_too_long = port_stats->rx_frame_too_long;
	drvs->rx_dropped_runt = port_stats->rx_dropped_runt;
	drvs->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
	drvs->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
	drvs->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
	drvs->rx_dropped_tcp_length = port_stats->rx_dropped_tcp_length;
	drvs->rx_dropped_too_small = port_stats->rx_dropped_too_small;
	drvs->rx_dropped_too_short = port_stats->rx_dropped_too_short;
	drvs->rx_out_range_errors = port_stats->rx_out_range_errors;
	drvs->rx_dropped_header_too_small =
		port_stats->rx_dropped_header_too_small;
	drvs->rx_input_fifo_overflow_drop =
		port_stats->rx_input_fifo_overflow_drop;
407
	drvs->rx_address_mismatch_drops = port_stats->rx_address_mismatch_drops;
408 409
	drvs->rx_alignment_symbol_errors =
		port_stats->rx_alignment_symbol_errors;
410
	drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop;
411 412 413 414 415 416 417
	drvs->tx_pauseframes = port_stats->tx_pauseframes;
	drvs->tx_controlframes = port_stats->tx_controlframes;
	drvs->jabber_events = port_stats->jabber_events;
	drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
	drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
	drvs->forwarded_packets = rxf_stats->forwarded_packets;
	drvs->rx_drops_mtu = rxf_stats->rx_drops_mtu;
418 419
	drvs->rx_drops_no_tpre_descr = rxf_stats->rx_drops_no_tpre_descr;
	drvs->rx_drops_too_many_frags = rxf_stats->rx_drops_too_many_frags;
420 421 422
	adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops;
}

S
Selvin Xavier 已提交
423 424
static void populate_lancer_stats(struct be_adapter *adapter)
{
425

S
Selvin Xavier 已提交
426
	struct be_drv_stats *drvs = &adapter->drv_stats;
427 428 429 430 431 432 433
	struct lancer_pport_stats *pport_stats =
					pport_stats_from_cmd(adapter);

	be_dws_le_to_cpu(pport_stats, sizeof(*pport_stats));
	drvs->rx_pause_frames = pport_stats->rx_pause_frames_lo;
	drvs->rx_crc_errors = pport_stats->rx_crc_errors_lo;
	drvs->rx_control_frames = pport_stats->rx_control_frames_lo;
S
Selvin Xavier 已提交
434
	drvs->rx_in_range_errors = pport_stats->rx_in_range_errors;
435
	drvs->rx_frame_too_long = pport_stats->rx_frames_too_long_lo;
S
Selvin Xavier 已提交
436 437 438 439 440 441 442 443 444 445 446 447
	drvs->rx_dropped_runt = pport_stats->rx_dropped_runt;
	drvs->rx_ip_checksum_errs = pport_stats->rx_ip_checksum_errors;
	drvs->rx_tcp_checksum_errs = pport_stats->rx_tcp_checksum_errors;
	drvs->rx_udp_checksum_errs = pport_stats->rx_udp_checksum_errors;
	drvs->rx_dropped_tcp_length =
				pport_stats->rx_dropped_invalid_tcp_length;
	drvs->rx_dropped_too_small = pport_stats->rx_dropped_too_small;
	drvs->rx_dropped_too_short = pport_stats->rx_dropped_too_short;
	drvs->rx_out_range_errors = pport_stats->rx_out_of_range_errors;
	drvs->rx_dropped_header_too_small =
				pport_stats->rx_dropped_header_too_small;
	drvs->rx_input_fifo_overflow_drop = pport_stats->rx_fifo_overflow;
448 449 450
	drvs->rx_address_mismatch_drops =
					pport_stats->rx_address_mismatch_drops +
					pport_stats->rx_vlan_mismatch_drops;
451
	drvs->rx_alignment_symbol_errors = pport_stats->rx_symbol_errors_lo;
S
Selvin Xavier 已提交
452
	drvs->rxpp_fifo_overflow_drop = pport_stats->rx_fifo_overflow;
453 454
	drvs->tx_pauseframes = pport_stats->tx_pause_frames_lo;
	drvs->tx_controlframes = pport_stats->tx_control_frames_lo;
S
Selvin Xavier 已提交
455
	drvs->jabber_events = pport_stats->rx_jabbers;
456 457
	drvs->forwarded_packets = pport_stats->num_forwards_lo;
	drvs->rx_drops_mtu = pport_stats->rx_drops_mtu_lo;
S
Selvin Xavier 已提交
458
	drvs->rx_drops_too_many_frags =
459
				pport_stats->rx_drops_too_many_frags_lo;
S
Selvin Xavier 已提交
460
}
461

462 463 464 465 466 467 468 469 470 471 472 473
static void accumulate_16bit_val(u32 *acc, u16 val)
{
#define lo(x)			(x & 0xFFFF)
#define hi(x)			(x & 0xFFFF0000)
	bool wrapped = val < lo(*acc);
	u32 newacc = hi(*acc) + val;

	if (wrapped)
		newacc += 65536;
	ACCESS_ONCE(*acc) = newacc;
}

474 475
void be_parse_stats(struct be_adapter *adapter)
{
476 477 478 479
	struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter);
	struct be_rx_obj *rxo;
	int i;

480 481
	if (lancer_chip(adapter)) {
		populate_lancer_stats(adapter);
S
Selvin Xavier 已提交
482
	} else {
483 484 485 486 487
		if (BE2_chip(adapter))
			populate_be_v0_stats(adapter);
		else
			/* for BE3 and Skyhawk */
			populate_be_v1_stats(adapter);
488

489 490 491 492 493 494 495 496 497
		/* as erx_v1 is longer than v0, ok to use v1 for v0 access */
		for_all_rx_queues(adapter, rxo, i) {
			/* below erx HW counter can actually wrap around after
			 * 65535. Driver accumulates a 32-bit value
			 */
			accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
					     (u16)erx->rx_drops_no_fragments \
					     [rxo->q.id]);
		}
498
	}
499 500
}

501 502
static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev,
					struct rtnl_link_stats64 *stats)
S
Sathya Perla 已提交
503
{
504
	struct be_adapter *adapter = netdev_priv(netdev);
505
	struct be_drv_stats *drvs = &adapter->drv_stats;
506
	struct be_rx_obj *rxo;
507
	struct be_tx_obj *txo;
508 509
	u64 pkts, bytes;
	unsigned int start;
510
	int i;
S
Sathya Perla 已提交
511

512
	for_all_rx_queues(adapter, rxo, i) {
513 514 515 516 517 518 519 520 521 522 523
		const struct be_rx_stats *rx_stats = rx_stats(rxo);
		do {
			start = u64_stats_fetch_begin_bh(&rx_stats->sync);
			pkts = rx_stats(rxo)->rx_pkts;
			bytes = rx_stats(rxo)->rx_bytes;
		} while (u64_stats_fetch_retry_bh(&rx_stats->sync, start));
		stats->rx_packets += pkts;
		stats->rx_bytes += bytes;
		stats->multicast += rx_stats(rxo)->rx_mcast_pkts;
		stats->rx_dropped += rx_stats(rxo)->rx_drops_no_skbs +
					rx_stats(rxo)->rx_drops_no_frags;
524 525
	}

526
	for_all_tx_queues(adapter, txo, i) {
527 528 529 530 531 532 533 534
		const struct be_tx_stats *tx_stats = tx_stats(txo);
		do {
			start = u64_stats_fetch_begin_bh(&tx_stats->sync);
			pkts = tx_stats(txo)->tx_pkts;
			bytes = tx_stats(txo)->tx_bytes;
		} while (u64_stats_fetch_retry_bh(&tx_stats->sync, start));
		stats->tx_packets += pkts;
		stats->tx_bytes += bytes;
535
	}
S
Sathya Perla 已提交
536 537

	/* bad pkts received */
538
	stats->rx_errors = drvs->rx_crc_errors +
539 540 541 542 543 544 545 546
		drvs->rx_alignment_symbol_errors +
		drvs->rx_in_range_errors +
		drvs->rx_out_range_errors +
		drvs->rx_frame_too_long +
		drvs->rx_dropped_too_small +
		drvs->rx_dropped_too_short +
		drvs->rx_dropped_header_too_small +
		drvs->rx_dropped_tcp_length +
547
		drvs->rx_dropped_runt;
548

S
Sathya Perla 已提交
549
	/* detailed rx errors */
550
	stats->rx_length_errors = drvs->rx_in_range_errors +
551 552
		drvs->rx_out_range_errors +
		drvs->rx_frame_too_long;
553

554
	stats->rx_crc_errors = drvs->rx_crc_errors;
S
Sathya Perla 已提交
555 556

	/* frame alignment errors */
557
	stats->rx_frame_errors = drvs->rx_alignment_symbol_errors;
558

S
Sathya Perla 已提交
559 560
	/* receiver fifo overrun */
	/* drops_no_pbuf is no per i/f, it's per BE card */
561
	stats->rx_fifo_errors = drvs->rxpp_fifo_overflow_drop +
562 563
				drvs->rx_input_fifo_overflow_drop +
				drvs->rx_drops_no_pbuf;
564
	return stats;
S
Sathya Perla 已提交
565 566
}

567
void be_link_status_update(struct be_adapter *adapter, u8 link_status)
S
Sathya Perla 已提交
568 569 570
{
	struct net_device *netdev = adapter->netdev;

571
	if (!(adapter->flags & BE_FLAGS_LINK_STATUS_INIT)) {
572
		netif_carrier_off(netdev);
573
		adapter->flags |= BE_FLAGS_LINK_STATUS_INIT;
S
Sathya Perla 已提交
574
	}
575 576 577 578 579

	if ((link_status & LINK_STATUS_MASK) == LINK_UP)
		netif_carrier_on(netdev);
	else
		netif_carrier_off(netdev);
S
Sathya Perla 已提交
580 581
}

582
static void be_tx_stats_update(struct be_tx_obj *txo,
583
			u32 wrb_cnt, u32 copied, u32 gso_segs, bool stopped)
S
Sathya Perla 已提交
584
{
585 586
	struct be_tx_stats *stats = tx_stats(txo);

587
	u64_stats_update_begin(&stats->sync);
588 589 590 591
	stats->tx_reqs++;
	stats->tx_wrbs += wrb_cnt;
	stats->tx_bytes += copied;
	stats->tx_pkts += (gso_segs ? gso_segs : 1);
S
Sathya Perla 已提交
592
	if (stopped)
593
		stats->tx_stops++;
594
	u64_stats_update_end(&stats->sync);
S
Sathya Perla 已提交
595 596 597
}

/* Determine number of WRB entries needed to xmit data in an skb */
598 599
static u32 wrb_cnt_for_skb(struct be_adapter *adapter, struct sk_buff *skb,
								bool *dummy)
S
Sathya Perla 已提交
600
{
601 602 603 604
	int cnt = (skb->len > skb->data_len);

	cnt += skb_shinfo(skb)->nr_frags;

S
Sathya Perla 已提交
605 606
	/* to account for hdr wrb */
	cnt++;
607 608 609
	if (lancer_chip(adapter) || !(cnt & 1)) {
		*dummy = false;
	} else {
S
Sathya Perla 已提交
610 611 612
		/* add a dummy to make it an even num */
		cnt++;
		*dummy = true;
613
	}
S
Sathya Perla 已提交
614 615 616 617 618 619 620 621 622
	BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT);
	return cnt;
}

static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len)
{
	wrb->frag_pa_hi = upper_32_bits(addr);
	wrb->frag_pa_lo = addr & 0xFFFFFFFF;
	wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK;
623
	wrb->rsvd0 = 0;
S
Sathya Perla 已提交
624 625
}

626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter,
					struct sk_buff *skb)
{
	u8 vlan_prio;
	u16 vlan_tag;

	vlan_tag = vlan_tx_tag_get(skb);
	vlan_prio = (vlan_tag & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
	/* If vlan priority provided by OS is NOT in available bmap */
	if (!(adapter->vlan_prio_bmap & (1 << vlan_prio)))
		vlan_tag = (vlan_tag & ~VLAN_PRIO_MASK) |
				adapter->recommended_prio;

	return vlan_tag;
}

642 643 644 645 646
static int be_vlan_tag_chk(struct be_adapter *adapter, struct sk_buff *skb)
{
	return vlan_tx_tag_present(skb) || adapter->pvid;
}

647 648
static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr,
		struct sk_buff *skb, u32 wrb_cnt, u32 len)
S
Sathya Perla 已提交
649
{
650
	u16 vlan_tag;
651

S
Sathya Perla 已提交
652 653 654 655
	memset(hdr, 0, sizeof(*hdr));

	AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1);

A
Ajit Khaparde 已提交
656
	if (skb_is_gso(skb)) {
S
Sathya Perla 已提交
657 658 659
		AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso, hdr, 1);
		AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso_mss,
			hdr, skb_shinfo(skb)->gso_size);
660
		if (skb_is_gso_v6(skb) && !lancer_chip(adapter))
A
Ajit Khaparde 已提交
661
			AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso6, hdr, 1);
S
Sathya Perla 已提交
662 663 664 665 666 667 668
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
		if (is_tcp_pkt(skb))
			AMAP_SET_BITS(struct amap_eth_hdr_wrb, tcpcs, hdr, 1);
		else if (is_udp_pkt(skb))
			AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1);
	}

A
Ajit Khaparde 已提交
669
	if (vlan_tx_tag_present(skb)) {
S
Sathya Perla 已提交
670
		AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1);
671
		vlan_tag = be_get_tx_vlan_tag(adapter, skb);
672
		AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, hdr, vlan_tag);
S
Sathya Perla 已提交
673 674 675 676 677 678 679 680
	}

	AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1);
	AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, 1);
	AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt);
	AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len);
}

I
Ivan Vecera 已提交
681
static void unmap_tx_frag(struct device *dev, struct be_eth_wrb *wrb,
682 683 684 685 686 687 688
		bool unmap_single)
{
	dma_addr_t dma;

	be_dws_le_to_cpu(wrb, sizeof(*wrb));

	dma = (u64)wrb->frag_pa_hi << 32 | (u64)wrb->frag_pa_lo;
689
	if (wrb->frag_len) {
690
		if (unmap_single)
I
Ivan Vecera 已提交
691 692
			dma_unmap_single(dev, dma, wrb->frag_len,
					 DMA_TO_DEVICE);
693
		else
I
Ivan Vecera 已提交
694
			dma_unmap_page(dev, dma, wrb->frag_len, DMA_TO_DEVICE);
695 696
	}
}
S
Sathya Perla 已提交
697

698
static int make_tx_wrbs(struct be_adapter *adapter, struct be_queue_info *txq,
S
Sathya Perla 已提交
699 700
		struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb)
{
701 702
	dma_addr_t busaddr;
	int i, copied = 0;
I
Ivan Vecera 已提交
703
	struct device *dev = &adapter->pdev->dev;
S
Sathya Perla 已提交
704 705 706
	struct sk_buff *first_skb = skb;
	struct be_eth_wrb *wrb;
	struct be_eth_hdr_wrb *hdr;
707 708
	bool map_single = false;
	u16 map_head;
S
Sathya Perla 已提交
709 710 711

	hdr = queue_head_node(txq);
	queue_head_inc(txq);
712
	map_head = txq->head;
S
Sathya Perla 已提交
713

714
	if (skb->len > skb->data_len) {
E
Eric Dumazet 已提交
715
		int len = skb_headlen(skb);
I
Ivan Vecera 已提交
716 717
		busaddr = dma_map_single(dev, skb->data, len, DMA_TO_DEVICE);
		if (dma_mapping_error(dev, busaddr))
718 719
			goto dma_err;
		map_single = true;
720 721 722 723 724 725
		wrb = queue_head_node(txq);
		wrb_fill(wrb, busaddr, len);
		be_dws_cpu_to_le(wrb, sizeof(*wrb));
		queue_head_inc(txq);
		copied += len;
	}
S
Sathya Perla 已提交
726

727
	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
E
Eric Dumazet 已提交
728
		const struct skb_frag_struct *frag =
729
			&skb_shinfo(skb)->frags[i];
730
		busaddr = skb_frag_dma_map(dev, frag, 0,
E
Eric Dumazet 已提交
731
					   skb_frag_size(frag), DMA_TO_DEVICE);
I
Ivan Vecera 已提交
732
		if (dma_mapping_error(dev, busaddr))
733
			goto dma_err;
734
		wrb = queue_head_node(txq);
E
Eric Dumazet 已提交
735
		wrb_fill(wrb, busaddr, skb_frag_size(frag));
736 737
		be_dws_cpu_to_le(wrb, sizeof(*wrb));
		queue_head_inc(txq);
E
Eric Dumazet 已提交
738
		copied += skb_frag_size(frag);
S
Sathya Perla 已提交
739 740 741 742 743 744 745 746 747
	}

	if (dummy_wrb) {
		wrb = queue_head_node(txq);
		wrb_fill(wrb, 0, 0);
		be_dws_cpu_to_le(wrb, sizeof(*wrb));
		queue_head_inc(txq);
	}

748
	wrb_fill_hdr(adapter, hdr, first_skb, wrb_cnt, copied);
S
Sathya Perla 已提交
749 750 751
	be_dws_cpu_to_le(hdr, sizeof(*hdr));

	return copied;
752 753 754 755
dma_err:
	txq->head = map_head;
	while (copied) {
		wrb = queue_head_node(txq);
I
Ivan Vecera 已提交
756
		unmap_tx_frag(dev, wrb, map_single);
757 758 759 760 761
		map_single = false;
		copied -= wrb->frag_len;
		queue_head_inc(txq);
	}
	return 0;
S
Sathya Perla 已提交
762 763
}

764 765 766 767 768 769 770 771 772 773 774
static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter,
					     struct sk_buff *skb)
{
	u16 vlan_tag = 0;

	skb = skb_share_check(skb, GFP_ATOMIC);
	if (unlikely(!skb))
		return skb;

	if (vlan_tx_tag_present(skb)) {
		vlan_tag = be_get_tx_vlan_tag(adapter, skb);
775
		skb = __vlan_put_tag(skb, htons(ETH_P_8021Q), vlan_tag);
776 777
		if (skb)
			skb->vlan_tci = 0;
778 779 780 781 782
	}

	return skb;
}

783
static netdev_tx_t be_xmit(struct sk_buff *skb,
784
			struct net_device *netdev)
S
Sathya Perla 已提交
785 786
{
	struct be_adapter *adapter = netdev_priv(netdev);
787 788
	struct be_tx_obj *txo = &adapter->tx_obj[skb_get_queue_mapping(skb)];
	struct be_queue_info *txq = &txo->q;
789
	struct iphdr *ip = NULL;
S
Sathya Perla 已提交
790
	u32 wrb_cnt = 0, copied = 0;
791
	u32 start = txq->head, eth_hdr_len;
S
Sathya Perla 已提交
792 793
	bool dummy_wrb, stopped = false;

794 795 796 797 798
	eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ?
		VLAN_ETH_HLEN : ETH_HLEN;

	/* HW has a bug which considers padding bytes as legal
	 * and modifies the IPv4 hdr's 'tot_len' field
799
	 */
800 801 802 803 804
	if (skb->len <= 60 && be_vlan_tag_chk(adapter, skb) &&
			is_ipv4_pkt(skb)) {
		ip = (struct iphdr *)ip_hdr(skb);
		pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len));
	}
805

806 807 808 809 810 811 812
	/* HW has a bug wherein it will calculate CSUM for VLAN
	 * pkts even though it is disabled.
	 * Manually insert VLAN in pkt.
	 */
	if (skb->ip_summed != CHECKSUM_PARTIAL &&
			be_vlan_tag_chk(adapter, skb)) {
		skb = be_insert_vlan_in_pkt(adapter, skb);
813 814 815 816
		if (unlikely(!skb))
			goto tx_drop;
	}

817
	wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb);
S
Sathya Perla 已提交
818

819
	copied = make_tx_wrbs(adapter, txq, skb, wrb_cnt, dummy_wrb);
820
	if (copied) {
E
Eric Dumazet 已提交
821 822
		int gso_segs = skb_shinfo(skb)->gso_segs;

823
		/* record the sent skb in the sent_skb table */
824 825
		BUG_ON(txo->sent_skb_list[start]);
		txo->sent_skb_list[start] = skb;
826 827 828 829 830

		/* Ensure txq has space for the next skb; Else stop the queue
		 * *BEFORE* ringing the tx doorbell, so that we serialze the
		 * tx compls of the current transmit which'll wake up the queue
		 */
831
		atomic_add(wrb_cnt, &txq->used);
832 833
		if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >=
								txq->len) {
834
			netif_stop_subqueue(netdev, skb_get_queue_mapping(skb));
835 836
			stopped = true;
		}
S
Sathya Perla 已提交
837

V
Vasundhara Volam 已提交
838
		be_txq_notify(adapter, txo, wrb_cnt);
S
Sathya Perla 已提交
839

E
Eric Dumazet 已提交
840
		be_tx_stats_update(txo, wrb_cnt, copied, gso_segs, stopped);
841 842 843
	} else {
		txq->head = start;
		dev_kfree_skb_any(skb);
S
Sathya Perla 已提交
844
	}
845
tx_drop:
S
Sathya Perla 已提交
846 847 848 849 850 851 852
	return NETDEV_TX_OK;
}

static int be_change_mtu(struct net_device *netdev, int new_mtu)
{
	struct be_adapter *adapter = netdev_priv(netdev);
	if (new_mtu < BE_MIN_MTU ||
A
Ajit Khaparde 已提交
853 854
			new_mtu > (BE_MAX_JUMBO_FRAME_SIZE -
					(ETH_HLEN + ETH_FCS_LEN))) {
S
Sathya Perla 已提交
855 856
		dev_info(&adapter->pdev->dev,
			"MTU must be between %d and %d bytes\n",
A
Ajit Khaparde 已提交
857 858
			BE_MIN_MTU,
			(BE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN)));
S
Sathya Perla 已提交
859 860 861 862 863 864 865 866 867
		return -EINVAL;
	}
	dev_info(&adapter->pdev->dev, "MTU changed from %d to %d bytes\n",
			netdev->mtu, new_mtu);
	netdev->mtu = new_mtu;
	return 0;
}

/*
868 869
 * A max of 64 (BE_NUM_VLANS_SUPPORTED) vlans can be configured in BE.
 * If the user configures more, place BE in vlan promiscuous mode.
S
Sathya Perla 已提交
870
 */
S
Sathya Perla 已提交
871
static int be_vid_config(struct be_adapter *adapter)
S
Sathya Perla 已提交
872
{
S
Sathya Perla 已提交
873 874
	u16 vids[BE_NUM_VLANS_SUPPORTED];
	u16 num = 0, i;
875
	int status = 0;
876

877 878 879 880
	/* No need to further configure vids if in promiscuous mode */
	if (adapter->promiscuous)
		return 0;

881 882 883 884 885 886
	if (adapter->vlans_added > adapter->max_vlans)
		goto set_vlan_promisc;

	/* Construct VLAN Table to give to HW */
	for (i = 0; i < VLAN_N_VID; i++)
		if (adapter->vlan_tag[i])
S
Sathya Perla 已提交
887
			vids[num++] = cpu_to_le16(i);
888 889

	status = be_cmd_vlan_config(adapter, adapter->if_handle,
S
Sathya Perla 已提交
890
				    vids, num, 1, 0);
891 892 893 894 895 896

	/* Set to VLAN promisc mode as setting VLAN filter failed */
	if (status) {
		dev_info(&adapter->pdev->dev, "Exhausted VLAN HW filters.\n");
		dev_info(&adapter->pdev->dev, "Disabling HW VLAN filtering.\n");
		goto set_vlan_promisc;
S
Sathya Perla 已提交
897
	}
898

899
	return status;
900 901 902 903 904

set_vlan_promisc:
	status = be_cmd_vlan_config(adapter, adapter->if_handle,
				    NULL, 0, 1, 1);
	return status;
S
Sathya Perla 已提交
905 906
}

907
static int be_vlan_add_vid(struct net_device *netdev, __be16 proto, u16 vid)
S
Sathya Perla 已提交
908 909
{
	struct be_adapter *adapter = netdev_priv(netdev);
A
Ajit Khaparde 已提交
910
	int status = 0;
S
Sathya Perla 已提交
911

912
	if (!lancer_chip(adapter) && !be_physfn(adapter)) {
A
Ajit Khaparde 已提交
913 914 915
		status = -EINVAL;
		goto ret;
	}
916

917 918 919 920
	/* Packets with VID 0 are always received by Lancer by default */
	if (lancer_chip(adapter) && vid == 0)
		goto ret;

S
Sathya Perla 已提交
921
	adapter->vlan_tag[vid] = 1;
922
	if (adapter->vlans_added <= (adapter->max_vlans + 1))
S
Sathya Perla 已提交
923
		status = be_vid_config(adapter);
924

A
Ajit Khaparde 已提交
925 926 927 928 929 930
	if (!status)
		adapter->vlans_added++;
	else
		adapter->vlan_tag[vid] = 0;
ret:
	return status;
S
Sathya Perla 已提交
931 932
}

933
static int be_vlan_rem_vid(struct net_device *netdev, __be16 proto, u16 vid)
S
Sathya Perla 已提交
934 935
{
	struct be_adapter *adapter = netdev_priv(netdev);
A
Ajit Khaparde 已提交
936
	int status = 0;
S
Sathya Perla 已提交
937

938
	if (!lancer_chip(adapter) && !be_physfn(adapter)) {
A
Ajit Khaparde 已提交
939 940 941
		status = -EINVAL;
		goto ret;
	}
942

943 944 945 946
	/* Packets with VID 0 are always received by Lancer by default */
	if (lancer_chip(adapter) && vid == 0)
		goto ret;

S
Sathya Perla 已提交
947
	adapter->vlan_tag[vid] = 0;
948
	if (adapter->vlans_added <= adapter->max_vlans)
S
Sathya Perla 已提交
949
		status = be_vid_config(adapter);
950

A
Ajit Khaparde 已提交
951 952 953 954 955 956
	if (!status)
		adapter->vlans_added--;
	else
		adapter->vlan_tag[vid] = 1;
ret:
	return status;
S
Sathya Perla 已提交
957 958
}

959
static void be_set_rx_mode(struct net_device *netdev)
S
Sathya Perla 已提交
960 961
{
	struct be_adapter *adapter = netdev_priv(netdev);
962
	int status;
S
Sathya Perla 已提交
963

964
	if (netdev->flags & IFF_PROMISC) {
965
		be_cmd_rx_filter(adapter, IFF_PROMISC, ON);
966 967
		adapter->promiscuous = true;
		goto done;
S
Sathya Perla 已提交
968 969
	}

L
Lucas De Marchi 已提交
970
	/* BE was previously in promiscuous mode; disable it */
971 972
	if (adapter->promiscuous) {
		adapter->promiscuous = false;
973
		be_cmd_rx_filter(adapter, IFF_PROMISC, OFF);
974 975

		if (adapter->vlans_added)
S
Sathya Perla 已提交
976
			be_vid_config(adapter);
S
Sathya Perla 已提交
977 978
	}

979
	/* Enable multicast promisc if num configured exceeds what we support */
980
	if (netdev->flags & IFF_ALLMULTI ||
981
	    netdev_mc_count(netdev) > adapter->max_mcast_mac) {
982
		be_cmd_rx_filter(adapter, IFF_ALLMULTI, ON);
983
		goto done;
S
Sathya Perla 已提交
984 985
	}

986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
	if (netdev_uc_count(netdev) != adapter->uc_macs) {
		struct netdev_hw_addr *ha;
		int i = 1; /* First slot is claimed by the Primary MAC */

		for (; adapter->uc_macs > 0; adapter->uc_macs--, i++) {
			be_cmd_pmac_del(adapter, adapter->if_handle,
					adapter->pmac_id[i], 0);
		}

		if (netdev_uc_count(netdev) > adapter->max_pmac_cnt) {
			be_cmd_rx_filter(adapter, IFF_PROMISC, ON);
			adapter->promiscuous = true;
			goto done;
		}

		netdev_for_each_uc_addr(ha, adapter->netdev) {
			adapter->uc_macs++; /* First slot is for Primary MAC */
			be_cmd_pmac_add(adapter, (u8 *)ha->addr,
					adapter->if_handle,
					&adapter->pmac_id[adapter->uc_macs], 0);
		}
	}

1009 1010 1011 1012 1013 1014 1015 1016
	status = be_cmd_rx_filter(adapter, IFF_MULTICAST, ON);

	/* Set to MCAST promisc mode if setting MULTICAST address fails */
	if (status) {
		dev_info(&adapter->pdev->dev, "Exhausted multicast HW filters.\n");
		dev_info(&adapter->pdev->dev, "Disabling HW multicast filtering.\n");
		be_cmd_rx_filter(adapter, IFF_ALLMULTI, ON);
	}
1017 1018
done:
	return;
S
Sathya Perla 已提交
1019 1020
}

1021 1022 1023
static int be_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
{
	struct be_adapter *adapter = netdev_priv(netdev);
1024
	struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf];
1025
	int status;
1026 1027 1028
	bool active_mac = false;
	u32 pmac_id;
	u8 old_mac[ETH_ALEN];
1029

1030
	if (!sriov_enabled(adapter))
1031 1032
		return -EPERM;

1033
	if (!is_valid_ether_addr(mac) || vf >= adapter->num_vfs)
1034 1035
		return -EINVAL;

1036
	if (lancer_chip(adapter)) {
1037 1038 1039 1040 1041 1042
		status = be_cmd_get_mac_from_list(adapter, old_mac, &active_mac,
						  &pmac_id, vf + 1);
		if (!status && active_mac)
			be_cmd_pmac_del(adapter, vf_cfg->if_handle,
					pmac_id, vf + 1);

1043 1044
		status = be_cmd_set_mac_list(adapter,  mac, 1, vf + 1);
	} else {
1045 1046
		status = be_cmd_pmac_del(adapter, vf_cfg->if_handle,
					 vf_cfg->pmac_id, vf + 1);
1047

1048 1049
		status = be_cmd_pmac_add(adapter, mac, vf_cfg->if_handle,
					 &vf_cfg->pmac_id, vf + 1);
1050 1051
	}

1052
	if (status)
1053 1054
		dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n",
				mac, vf);
1055
	else
1056
		memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
1057

1058 1059 1060
	return status;
}

1061 1062 1063 1064
static int be_get_vf_config(struct net_device *netdev, int vf,
			struct ifla_vf_info *vi)
{
	struct be_adapter *adapter = netdev_priv(netdev);
1065
	struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf];
1066

1067
	if (!sriov_enabled(adapter))
1068 1069
		return -EPERM;

1070
	if (vf >= adapter->num_vfs)
1071 1072 1073
		return -EINVAL;

	vi->vf = vf;
1074 1075
	vi->tx_rate = vf_cfg->tx_rate;
	vi->vlan = vf_cfg->vlan_tag;
1076
	vi->qos = 0;
1077
	memcpy(&vi->mac, vf_cfg->mac_addr, ETH_ALEN);
1078 1079 1080 1081

	return 0;
}

1082 1083 1084 1085 1086 1087
static int be_set_vf_vlan(struct net_device *netdev,
			int vf, u16 vlan, u8 qos)
{
	struct be_adapter *adapter = netdev_priv(netdev);
	int status = 0;

1088
	if (!sriov_enabled(adapter))
1089 1090
		return -EPERM;

1091
	if (vf >= adapter->num_vfs || vlan > 4095)
1092 1093 1094
		return -EINVAL;

	if (vlan) {
1095 1096 1097 1098 1099 1100 1101
		if (adapter->vf_cfg[vf].vlan_tag != vlan) {
			/* If this is new value, program it. Else skip. */
			adapter->vf_cfg[vf].vlan_tag = vlan;

			status = be_cmd_set_hsw_config(adapter, vlan,
				vf + 1, adapter->vf_cfg[vf].if_handle);
		}
1102
	} else {
1103
		/* Reset Transparent Vlan Tagging. */
1104
		adapter->vf_cfg[vf].vlan_tag = 0;
1105 1106 1107
		vlan = adapter->vf_cfg[vf].def_vid;
		status = be_cmd_set_hsw_config(adapter, vlan, vf + 1,
			adapter->vf_cfg[vf].if_handle);
1108 1109 1110 1111 1112 1113 1114 1115 1116
	}


	if (status)
		dev_info(&adapter->pdev->dev,
				"VLAN %d config on VF %d failed\n", vlan, vf);
	return status;
}

1117 1118 1119 1120 1121 1122
static int be_set_vf_tx_rate(struct net_device *netdev,
			int vf, int rate)
{
	struct be_adapter *adapter = netdev_priv(netdev);
	int status = 0;

1123
	if (!sriov_enabled(adapter))
1124 1125
		return -EPERM;

1126
	if (vf >= adapter->num_vfs)
1127 1128
		return -EINVAL;

1129 1130 1131 1132 1133
	if (rate < 100 || rate > 10000) {
		dev_err(&adapter->pdev->dev,
			"tx rate must be between 100 and 10000 Mbps\n");
		return -EINVAL;
	}
1134

1135 1136 1137 1138
	if (lancer_chip(adapter))
		status = be_cmd_set_profile_config(adapter, rate / 10, vf + 1);
	else
		status = be_cmd_set_qos(adapter, rate / 10, vf + 1);
1139 1140

	if (status)
1141
		dev_err(&adapter->pdev->dev,
1142
				"tx rate %d on VF %d failed\n", rate, vf);
1143 1144
	else
		adapter->vf_cfg[vf].tx_rate = rate;
1145 1146 1147
	return status;
}

1148 1149 1150
static int be_find_vfs(struct be_adapter *adapter, int vf_state)
{
	struct pci_dev *dev, *pdev = adapter->pdev;
I
Ivan Vecera 已提交
1151
	int vfs = 0, assigned_vfs = 0, pos;
1152 1153 1154
	u16 offset, stride;

	pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
1155 1156
	if (!pos)
		return 0;
1157 1158 1159 1160 1161
	pci_read_config_word(pdev, pos + PCI_SRIOV_VF_OFFSET, &offset);
	pci_read_config_word(pdev, pos + PCI_SRIOV_VF_STRIDE, &stride);

	dev = pci_get_device(pdev->vendor, PCI_ANY_ID, NULL);
	while (dev) {
I
Ivan Vecera 已提交
1162
		if (dev->is_virtfn && pci_physfn(dev) == pdev) {
1163 1164 1165 1166 1167 1168 1169 1170 1171
			vfs++;
			if (dev->dev_flags & PCI_DEV_FLAGS_ASSIGNED)
				assigned_vfs++;
		}
		dev = pci_get_device(pdev->vendor, PCI_ANY_ID, dev);
	}
	return (vf_state == ASSIGNED) ? assigned_vfs : vfs;
}

S
Sathya Perla 已提交
1172
static void be_eqd_update(struct be_adapter *adapter, struct be_eq_obj *eqo)
S
Sathya Perla 已提交
1173
{
S
Sathya Perla 已提交
1174
	struct be_rx_stats *stats = rx_stats(&adapter->rx_obj[eqo->idx]);
1175
	ulong now = jiffies;
1176
	ulong delta = now - stats->rx_jiffies;
1177 1178
	u64 pkts;
	unsigned int start, eqd;
1179

S
Sathya Perla 已提交
1180 1181 1182 1183 1184 1185
	if (!eqo->enable_aic) {
		eqd = eqo->eqd;
		goto modify_eqd;
	}

	if (eqo->idx >= adapter->num_rx_qs)
1186
		return;
S
Sathya Perla 已提交
1187

S
Sathya Perla 已提交
1188 1189
	stats = rx_stats(&adapter->rx_obj[eqo->idx]);

1190
	/* Wrapped around */
1191 1192
	if (time_before(now, stats->rx_jiffies)) {
		stats->rx_jiffies = now;
1193 1194
		return;
	}
S
Sathya Perla 已提交
1195

1196 1197
	/* Update once a second */
	if (delta < HZ)
S
Sathya Perla 已提交
1198 1199
		return;

1200 1201 1202 1203 1204
	do {
		start = u64_stats_fetch_begin_bh(&stats->sync);
		pkts = stats->rx_pkts;
	} while (u64_stats_fetch_retry_bh(&stats->sync, start));

1205
	stats->rx_pps = (unsigned long)(pkts - stats->rx_pkts_prev) / (delta / HZ);
1206
	stats->rx_pkts_prev = pkts;
1207
	stats->rx_jiffies = now;
S
Sathya Perla 已提交
1208 1209 1210
	eqd = (stats->rx_pps / 110000) << 3;
	eqd = min(eqd, eqo->max_eqd);
	eqd = max(eqd, eqo->min_eqd);
1211 1212
	if (eqd < 10)
		eqd = 0;
S
Sathya Perla 已提交
1213 1214 1215 1216 1217

modify_eqd:
	if (eqd != eqo->cur_eqd) {
		be_cmd_modify_eqd(adapter, eqo->q.id, eqd);
		eqo->cur_eqd = eqd;
1218
	}
S
Sathya Perla 已提交
1219 1220
}

1221
static void be_rx_stats_update(struct be_rx_obj *rxo,
1222
		struct be_rx_compl_info *rxcp)
1223
{
1224
	struct be_rx_stats *stats = rx_stats(rxo);
1225

1226
	u64_stats_update_begin(&stats->sync);
1227
	stats->rx_compl++;
1228
	stats->rx_bytes += rxcp->pkt_size;
1229
	stats->rx_pkts++;
1230
	if (rxcp->pkt_type == BE_MULTICAST_PACKET)
1231
		stats->rx_mcast_pkts++;
1232
	if (rxcp->err)
1233
		stats->rx_compl_err++;
1234
	u64_stats_update_end(&stats->sync);
1235 1236
}

1237
static inline bool csum_passed(struct be_rx_compl_info *rxcp)
1238
{
1239 1240
	/* L4 checksum is not reliable for non TCP/UDP packets.
	 * Also ignore ipcksm for ipv6 pkts */
1241 1242
	return (rxcp->tcpf || rxcp->udpf) && rxcp->l4_csum &&
				(rxcp->ip_csum || rxcp->ipv6);
1243 1244
}

S
Sathya Perla 已提交
1245 1246
static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo,
						u16 frag_idx)
S
Sathya Perla 已提交
1247
{
S
Sathya Perla 已提交
1248
	struct be_adapter *adapter = rxo->adapter;
S
Sathya Perla 已提交
1249
	struct be_rx_page_info *rx_page_info;
1250
	struct be_queue_info *rxq = &rxo->q;
S
Sathya Perla 已提交
1251

1252
	rx_page_info = &rxo->page_info_tbl[frag_idx];
S
Sathya Perla 已提交
1253 1254
	BUG_ON(!rx_page_info->page);

A
Ajit Khaparde 已提交
1255
	if (rx_page_info->last_page_user) {
I
Ivan Vecera 已提交
1256 1257 1258
		dma_unmap_page(&adapter->pdev->dev,
			       dma_unmap_addr(rx_page_info, bus),
			       adapter->big_page_size, DMA_FROM_DEVICE);
A
Ajit Khaparde 已提交
1259 1260
		rx_page_info->last_page_user = false;
	}
S
Sathya Perla 已提交
1261 1262 1263 1264 1265 1266

	atomic_dec(&rxq->used);
	return rx_page_info;
}

/* Throwaway the data in the Rx completion */
S
Sathya Perla 已提交
1267 1268
static void be_rx_compl_discard(struct be_rx_obj *rxo,
				struct be_rx_compl_info *rxcp)
S
Sathya Perla 已提交
1269
{
1270
	struct be_queue_info *rxq = &rxo->q;
S
Sathya Perla 已提交
1271
	struct be_rx_page_info *page_info;
1272
	u16 i, num_rcvd = rxcp->num_rcvd;
S
Sathya Perla 已提交
1273

1274
	for (i = 0; i < num_rcvd; i++) {
S
Sathya Perla 已提交
1275
		page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
1276 1277
		put_page(page_info->page);
		memset(page_info, 0, sizeof(*page_info));
1278
		index_inc(&rxcp->rxq_idx, rxq->len);
S
Sathya Perla 已提交
1279 1280 1281 1282 1283 1284 1285
	}
}

/*
 * skb_fill_rx_data forms a complete skb for an ether frame
 * indicated by rxcp.
 */
S
Sathya Perla 已提交
1286 1287
static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
			     struct be_rx_compl_info *rxcp)
S
Sathya Perla 已提交
1288
{
1289
	struct be_queue_info *rxq = &rxo->q;
S
Sathya Perla 已提交
1290
	struct be_rx_page_info *page_info;
1291 1292
	u16 i, j;
	u16 hdr_len, curr_frag_len, remaining;
S
Sathya Perla 已提交
1293 1294
	u8 *start;

S
Sathya Perla 已提交
1295
	page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
S
Sathya Perla 已提交
1296 1297 1298 1299
	start = page_address(page_info->page) + page_info->page_offset;
	prefetch(start);

	/* Copy data in the first descriptor of this completion */
1300
	curr_frag_len = min(rxcp->pkt_size, rx_frag_size);
S
Sathya Perla 已提交
1301 1302 1303

	skb->len = curr_frag_len;
	if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */
1304
		memcpy(skb->data, start, curr_frag_len);
S
Sathya Perla 已提交
1305 1306 1307 1308 1309
		/* Complete packet has now been moved to data */
		put_page(page_info->page);
		skb->data_len = 0;
		skb->tail += curr_frag_len;
	} else {
1310 1311
		hdr_len = ETH_HLEN;
		memcpy(skb->data, start, hdr_len);
S
Sathya Perla 已提交
1312
		skb_shinfo(skb)->nr_frags = 1;
1313
		skb_frag_set_page(skb, 0, page_info->page);
S
Sathya Perla 已提交
1314 1315
		skb_shinfo(skb)->frags[0].page_offset =
					page_info->page_offset + hdr_len;
E
Eric Dumazet 已提交
1316
		skb_frag_size_set(&skb_shinfo(skb)->frags[0], curr_frag_len - hdr_len);
S
Sathya Perla 已提交
1317
		skb->data_len = curr_frag_len - hdr_len;
E
Eric Dumazet 已提交
1318
		skb->truesize += rx_frag_size;
S
Sathya Perla 已提交
1319 1320
		skb->tail += hdr_len;
	}
A
Ajit Khaparde 已提交
1321
	page_info->page = NULL;
S
Sathya Perla 已提交
1322

1323 1324 1325
	if (rxcp->pkt_size <= rx_frag_size) {
		BUG_ON(rxcp->num_rcvd != 1);
		return;
S
Sathya Perla 已提交
1326 1327 1328
	}

	/* More frags present for this completion */
1329 1330 1331
	index_inc(&rxcp->rxq_idx, rxq->len);
	remaining = rxcp->pkt_size - curr_frag_len;
	for (i = 1, j = 0; i < rxcp->num_rcvd; i++) {
S
Sathya Perla 已提交
1332
		page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
1333
		curr_frag_len = min(remaining, rx_frag_size);
S
Sathya Perla 已提交
1334

1335 1336 1337 1338
		/* Coalesce all frags from the same physical page in one slot */
		if (page_info->page_offset == 0) {
			/* Fresh page */
			j++;
1339
			skb_frag_set_page(skb, j, page_info->page);
1340 1341
			skb_shinfo(skb)->frags[j].page_offset =
							page_info->page_offset;
E
Eric Dumazet 已提交
1342
			skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0);
1343 1344 1345 1346 1347
			skb_shinfo(skb)->nr_frags++;
		} else {
			put_page(page_info->page);
		}

E
Eric Dumazet 已提交
1348
		skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len);
S
Sathya Perla 已提交
1349 1350
		skb->len += curr_frag_len;
		skb->data_len += curr_frag_len;
E
Eric Dumazet 已提交
1351
		skb->truesize += rx_frag_size;
1352 1353
		remaining -= curr_frag_len;
		index_inc(&rxcp->rxq_idx, rxq->len);
A
Ajit Khaparde 已提交
1354
		page_info->page = NULL;
S
Sathya Perla 已提交
1355
	}
1356
	BUG_ON(j > MAX_SKB_FRAGS);
S
Sathya Perla 已提交
1357 1358
}

1359
/* Process the RX completion indicated by rxcp when GRO is disabled */
S
Sathya Perla 已提交
1360 1361
static void be_rx_compl_process(struct be_rx_obj *rxo,
				struct be_rx_compl_info *rxcp)
S
Sathya Perla 已提交
1362
{
S
Sathya Perla 已提交
1363
	struct be_adapter *adapter = rxo->adapter;
1364
	struct net_device *netdev = adapter->netdev;
S
Sathya Perla 已提交
1365
	struct sk_buff *skb;
1366

1367
	skb = netdev_alloc_skb_ip_align(netdev, BE_RX_SKB_ALLOC_SIZE);
1368
	if (unlikely(!skb)) {
1369
		rx_stats(rxo)->rx_drops_no_skbs++;
S
Sathya Perla 已提交
1370
		be_rx_compl_discard(rxo, rxcp);
S
Sathya Perla 已提交
1371 1372 1373
		return;
	}

S
Sathya Perla 已提交
1374
	skb_fill_rx_data(rxo, skb, rxcp);
S
Sathya Perla 已提交
1375

1376
	if (likely((netdev->features & NETIF_F_RXCSUM) && csum_passed(rxcp)))
1377
		skb->ip_summed = CHECKSUM_UNNECESSARY;
S
Somnath Kotur 已提交
1378 1379
	else
		skb_checksum_none_assert(skb);
S
Sathya Perla 已提交
1380

1381
	skb->protocol = eth_type_trans(skb, netdev);
1382
	skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]);
S
Sathya Perla 已提交
1383
	if (netdev->features & NETIF_F_RXHASH)
A
Ajit Khaparde 已提交
1384 1385
		skb->rxhash = rxcp->rss_hash;

S
Sathya Perla 已提交
1386

1387
	if (rxcp->vlanf)
1388
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rxcp->vlan_tag);
A
Ajit Khaparde 已提交
1389 1390

	netif_receive_skb(skb);
S
Sathya Perla 已提交
1391 1392
}

1393
/* Process the RX completion indicated by rxcp when GRO is enabled */
S
Sathya Perla 已提交
1394 1395
void be_rx_compl_process_gro(struct be_rx_obj *rxo, struct napi_struct *napi,
			     struct be_rx_compl_info *rxcp)
S
Sathya Perla 已提交
1396
{
S
Sathya Perla 已提交
1397
	struct be_adapter *adapter = rxo->adapter;
S
Sathya Perla 已提交
1398
	struct be_rx_page_info *page_info;
1399
	struct sk_buff *skb = NULL;
1400
	struct be_queue_info *rxq = &rxo->q;
1401 1402
	u16 remaining, curr_frag_len;
	u16 i, j;
1403

S
Sathya Perla 已提交
1404
	skb = napi_get_frags(napi);
1405
	if (!skb) {
S
Sathya Perla 已提交
1406
		be_rx_compl_discard(rxo, rxcp);
1407 1408 1409
		return;
	}

1410 1411
	remaining = rxcp->pkt_size;
	for (i = 0, j = -1; i < rxcp->num_rcvd; i++) {
S
Sathya Perla 已提交
1412
		page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
S
Sathya Perla 已提交
1413 1414 1415

		curr_frag_len = min(remaining, rx_frag_size);

1416 1417 1418 1419
		/* Coalesce all frags from the same physical page in one slot */
		if (i == 0 || page_info->page_offset == 0) {
			/* First frag or Fresh page */
			j++;
1420
			skb_frag_set_page(skb, j, page_info->page);
1421 1422
			skb_shinfo(skb)->frags[j].page_offset =
							page_info->page_offset;
E
Eric Dumazet 已提交
1423
			skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0);
1424 1425 1426
		} else {
			put_page(page_info->page);
		}
E
Eric Dumazet 已提交
1427
		skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len);
E
Eric Dumazet 已提交
1428
		skb->truesize += rx_frag_size;
1429
		remaining -= curr_frag_len;
1430
		index_inc(&rxcp->rxq_idx, rxq->len);
S
Sathya Perla 已提交
1431 1432
		memset(page_info, 0, sizeof(*page_info));
	}
1433
	BUG_ON(j > MAX_SKB_FRAGS);
S
Sathya Perla 已提交
1434

1435
	skb_shinfo(skb)->nr_frags = j + 1;
1436 1437
	skb->len = rxcp->pkt_size;
	skb->data_len = rxcp->pkt_size;
1438
	skb->ip_summed = CHECKSUM_UNNECESSARY;
1439
	skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]);
A
Ajit Khaparde 已提交
1440 1441
	if (adapter->netdev->features & NETIF_F_RXHASH)
		skb->rxhash = rxcp->rss_hash;
1442

1443
	if (rxcp->vlanf)
1444
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rxcp->vlan_tag);
A
Ajit Khaparde 已提交
1445

S
Sathya Perla 已提交
1446
	napi_gro_frags(napi);
1447 1448
}

S
Sathya Perla 已提交
1449 1450
static void be_parse_rx_compl_v1(struct be_eth_rx_compl *compl,
				 struct be_rx_compl_info *rxcp)
1451 1452 1453 1454 1455 1456
{
	rxcp->pkt_size =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, pktsize, compl);
	rxcp->vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtp, compl);
	rxcp->err = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, err, compl);
	rxcp->tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, tcpf, compl);
1457
	rxcp->udpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, udpf, compl);
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
	rxcp->ip_csum =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ipcksm, compl);
	rxcp->l4_csum =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, l4_cksm, compl);
	rxcp->ipv6 =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ip_version, compl);
	rxcp->rxq_idx =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, fragndx, compl);
	rxcp->num_rcvd =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl);
	rxcp->pkt_type =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
A
Ajit Khaparde 已提交
1470
	rxcp->rss_hash =
1471
		AMAP_GET_BITS(struct amap_eth_rx_compl_v1, rsshash, compl);
1472 1473
	if (rxcp->vlanf) {
		rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm,
1474 1475 1476
					  compl);
		rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
					       compl);
1477
	}
1478
	rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, port, compl);
1479 1480
}

S
Sathya Perla 已提交
1481 1482
static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl,
				 struct be_rx_compl_info *rxcp)
1483 1484 1485 1486 1487 1488
{
	rxcp->pkt_size =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, pktsize, compl);
	rxcp->vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtp, compl);
	rxcp->err = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, err, compl);
	rxcp->tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, tcpf, compl);
1489
	rxcp->udpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, udpf, compl);
1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501
	rxcp->ip_csum =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ipcksm, compl);
	rxcp->l4_csum =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, l4_cksm, compl);
	rxcp->ipv6 =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ip_version, compl);
	rxcp->rxq_idx =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, fragndx, compl);
	rxcp->num_rcvd =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl);
	rxcp->pkt_type =
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
A
Ajit Khaparde 已提交
1502
	rxcp->rss_hash =
1503
		AMAP_GET_BITS(struct amap_eth_rx_compl_v0, rsshash, compl);
1504 1505
	if (rxcp->vlanf) {
		rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm,
1506 1507 1508
					  compl);
		rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
					       compl);
1509
	}
1510
	rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, port, compl);
1511 1512 1513 1514 1515 1516 1517
}

static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
{
	struct be_eth_rx_compl *compl = queue_tail_node(&rxo->cq);
	struct be_rx_compl_info *rxcp = &rxo->rxcp;
	struct be_adapter *adapter = rxo->adapter;
S
Sathya Perla 已提交
1518

1519 1520 1521 1522
	/* For checking the valid bit it is Ok to use either definition as the
	 * valid bit is at the same position in both v0 and v1 Rx compl */
	if (compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] == 0)
		return NULL;
S
Sathya Perla 已提交
1523

1524 1525
	rmb();
	be_dws_le_to_cpu(compl, sizeof(*compl));
S
Sathya Perla 已提交
1526

1527
	if (adapter->be3_native)
S
Sathya Perla 已提交
1528
		be_parse_rx_compl_v1(compl, rxcp);
1529
	else
S
Sathya Perla 已提交
1530
		be_parse_rx_compl_v0(compl, rxcp);
S
Sathya Perla 已提交
1531

1532 1533 1534
	if (rxcp->vlanf) {
		/* vlanf could be wrongly set in some cards.
		 * ignore if vtm is not set */
1535
		if ((adapter->function_mode & FLEX10_MODE) && !rxcp->vtm)
1536
			rxcp->vlanf = 0;
S
Sathya Perla 已提交
1537

1538
		if (!lancer_chip(adapter))
1539
			rxcp->vlan_tag = swab16(rxcp->vlan_tag);
S
Sathya Perla 已提交
1540

1541
		if (adapter->pvid == (rxcp->vlan_tag & VLAN_VID_MASK) &&
1542
		    !adapter->vlan_tag[rxcp->vlan_tag])
1543 1544
			rxcp->vlanf = 0;
	}
1545 1546 1547

	/* As the compl has been parsed, reset it; we wont touch it again */
	compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] = 0;
S
Sathya Perla 已提交
1548

1549
	queue_tail_inc(&rxo->cq);
S
Sathya Perla 已提交
1550 1551 1552
	return rxcp;
}

1553
static inline struct page *be_alloc_pages(u32 size, gfp_t gfp)
S
Sathya Perla 已提交
1554 1555
{
	u32 order = get_order(size);
1556

S
Sathya Perla 已提交
1557
	if (order > 0)
1558 1559
		gfp |= __GFP_COMP;
	return  alloc_pages(gfp, order);
S
Sathya Perla 已提交
1560 1561 1562 1563 1564 1565
}

/*
 * Allocate a page, split it to fragments of size rx_frag_size and post as
 * receive buffers to BE
 */
1566
static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp)
S
Sathya Perla 已提交
1567
{
1568
	struct be_adapter *adapter = rxo->adapter;
1569
	struct be_rx_page_info *page_info = NULL, *prev_page_info = NULL;
1570
	struct be_queue_info *rxq = &rxo->q;
S
Sathya Perla 已提交
1571 1572 1573 1574 1575
	struct page *pagep = NULL;
	struct be_eth_rx_d *rxd;
	u64 page_dmaaddr = 0, frag_dmaaddr;
	u32 posted, page_offset = 0;

1576
	page_info = &rxo->page_info_tbl[rxq->head];
S
Sathya Perla 已提交
1577 1578
	for (posted = 0; posted < MAX_RX_POST && !page_info->page; posted++) {
		if (!pagep) {
1579
			pagep = be_alloc_pages(adapter->big_page_size, gfp);
S
Sathya Perla 已提交
1580
			if (unlikely(!pagep)) {
1581
				rx_stats(rxo)->rx_post_fail++;
S
Sathya Perla 已提交
1582 1583
				break;
			}
I
Ivan Vecera 已提交
1584 1585 1586
			page_dmaaddr = dma_map_page(&adapter->pdev->dev, pagep,
						    0, adapter->big_page_size,
						    DMA_FROM_DEVICE);
S
Sathya Perla 已提交
1587 1588 1589 1590 1591 1592 1593
			page_info->page_offset = 0;
		} else {
			get_page(pagep);
			page_info->page_offset = page_offset + rx_frag_size;
		}
		page_offset = page_info->page_offset;
		page_info->page = pagep;
1594
		dma_unmap_addr_set(page_info, bus, page_dmaaddr);
S
Sathya Perla 已提交
1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
		frag_dmaaddr = page_dmaaddr + page_info->page_offset;

		rxd = queue_head_node(rxq);
		rxd->fragpa_lo = cpu_to_le32(frag_dmaaddr & 0xFFFFFFFF);
		rxd->fragpa_hi = cpu_to_le32(upper_32_bits(frag_dmaaddr));

		/* Any space left in the current big page for another frag? */
		if ((page_offset + rx_frag_size + rx_frag_size) >
					adapter->big_page_size) {
			pagep = NULL;
			page_info->last_page_user = true;
		}
1607 1608 1609

		prev_page_info = page_info;
		queue_head_inc(rxq);
S
Sathya Perla 已提交
1610
		page_info = &rxo->page_info_tbl[rxq->head];
S
Sathya Perla 已提交
1611 1612
	}
	if (pagep)
1613
		prev_page_info->last_page_user = true;
S
Sathya Perla 已提交
1614 1615 1616

	if (posted) {
		atomic_add(posted, &rxq->used);
1617
		be_rxq_notify(adapter, rxq->id, posted);
1618 1619
	} else if (atomic_read(&rxq->used) == 0) {
		/* Let be_worker replenish when memory is available */
1620
		rxo->rx_post_starved = true;
S
Sathya Perla 已提交
1621 1622 1623
	}
}

1624
static struct be_eth_tx_compl *be_tx_compl_get(struct be_queue_info *tx_cq)
S
Sathya Perla 已提交
1625 1626 1627 1628 1629 1630
{
	struct be_eth_tx_compl *txcp = queue_tail_node(tx_cq);

	if (txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] == 0)
		return NULL;

1631
	rmb();
S
Sathya Perla 已提交
1632 1633 1634 1635 1636 1637 1638 1639
	be_dws_le_to_cpu(txcp, sizeof(*txcp));

	txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0;

	queue_tail_inc(tx_cq);
	return txcp;
}

1640 1641
static u16 be_tx_compl_process(struct be_adapter *adapter,
		struct be_tx_obj *txo, u16 last_index)
S
Sathya Perla 已提交
1642
{
1643
	struct be_queue_info *txq = &txo->q;
1644
	struct be_eth_wrb *wrb;
1645
	struct sk_buff **sent_skbs = txo->sent_skb_list;
S
Sathya Perla 已提交
1646
	struct sk_buff *sent_skb;
1647 1648
	u16 cur_index, num_wrbs = 1; /* account for hdr wrb */
	bool unmap_skb_hdr = true;
S
Sathya Perla 已提交
1649

1650
	sent_skb = sent_skbs[txq->tail];
S
Sathya Perla 已提交
1651
	BUG_ON(!sent_skb);
1652 1653 1654
	sent_skbs[txq->tail] = NULL;

	/* skip header wrb */
1655
	queue_tail_inc(txq);
S
Sathya Perla 已提交
1656

1657
	do {
S
Sathya Perla 已提交
1658
		cur_index = txq->tail;
1659
		wrb = queue_tail_node(txq);
I
Ivan Vecera 已提交
1660 1661
		unmap_tx_frag(&adapter->pdev->dev, wrb,
			      (unmap_skb_hdr && skb_headlen(sent_skb)));
1662 1663
		unmap_skb_hdr = false;

S
Sathya Perla 已提交
1664 1665
		num_wrbs++;
		queue_tail_inc(txq);
1666
	} while (cur_index != last_index);
S
Sathya Perla 已提交
1667 1668

	kfree_skb(sent_skb);
1669
	return num_wrbs;
S
Sathya Perla 已提交
1670 1671
}

S
Sathya Perla 已提交
1672 1673
/* Return the number of events in the event queue */
static inline int events_get(struct be_eq_obj *eqo)
1674
{
S
Sathya Perla 已提交
1675 1676
	struct be_eq_entry *eqe;
	int num = 0;
1677

S
Sathya Perla 已提交
1678 1679 1680 1681
	do {
		eqe = queue_tail_node(&eqo->q);
		if (eqe->evt == 0)
			break;
1682

S
Sathya Perla 已提交
1683 1684 1685 1686 1687 1688 1689
		rmb();
		eqe->evt = 0;
		num++;
		queue_tail_inc(&eqo->q);
	} while (true);

	return num;
1690 1691
}

S
Sathya Perla 已提交
1692 1693
/* Leaves the EQ is disarmed state */
static void be_eq_clean(struct be_eq_obj *eqo)
1694
{
S
Sathya Perla 已提交
1695
	int num = events_get(eqo);
1696

S
Sathya Perla 已提交
1697
	be_eq_notify(eqo->adapter, eqo->q.id, false, true, num);
1698 1699
}

S
Sathya Perla 已提交
1700
static void be_rx_cq_clean(struct be_rx_obj *rxo)
S
Sathya Perla 已提交
1701 1702
{
	struct be_rx_page_info *page_info;
1703 1704
	struct be_queue_info *rxq = &rxo->q;
	struct be_queue_info *rx_cq = &rxo->cq;
1705
	struct be_rx_compl_info *rxcp;
1706 1707
	struct be_adapter *adapter = rxo->adapter;
	int flush_wait = 0;
S
Sathya Perla 已提交
1708 1709
	u16 tail;

1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
	/* Consume pending rx completions.
	 * Wait for the flush completion (identified by zero num_rcvd)
	 * to arrive. Notify CQ even when there are no more CQ entries
	 * for HW to flush partially coalesced CQ entries.
	 * In Lancer, there is no need to wait for flush compl.
	 */
	for (;;) {
		rxcp = be_rx_compl_get(rxo);
		if (rxcp == NULL) {
			if (lancer_chip(adapter))
				break;

			if (flush_wait++ > 10 || be_hw_error(adapter)) {
				dev_warn(&adapter->pdev->dev,
					 "did not receive flush compl\n");
				break;
			}
			be_cq_notify(adapter, rx_cq->id, true, 0);
			mdelay(1);
		} else {
			be_rx_compl_discard(rxo, rxcp);
			be_cq_notify(adapter, rx_cq->id, true, 1);
			if (rxcp->num_rcvd == 0)
				break;
		}
S
Sathya Perla 已提交
1735 1736
	}

1737 1738 1739 1740
	/* After cleanup, leave the CQ in unarmed state */
	be_cq_notify(adapter, rx_cq->id, false, 0);

	/* Then free posted rx buffers that were not used */
S
Sathya Perla 已提交
1741
	tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len;
1742
	for (; atomic_read(&rxq->used) > 0; index_inc(&tail, rxq->len)) {
S
Sathya Perla 已提交
1743
		page_info = get_rx_page_info(rxo, tail);
S
Sathya Perla 已提交
1744 1745 1746 1747
		put_page(page_info->page);
		memset(page_info, 0, sizeof(*page_info));
	}
	BUG_ON(atomic_read(&rxq->used));
1748
	rxq->tail = rxq->head = 0;
S
Sathya Perla 已提交
1749 1750
}

S
Sathya Perla 已提交
1751
static void be_tx_compl_clean(struct be_adapter *adapter)
S
Sathya Perla 已提交
1752
{
S
Sathya Perla 已提交
1753 1754
	struct be_tx_obj *txo;
	struct be_queue_info *txq;
1755
	struct be_eth_tx_compl *txcp;
1756
	u16 end_idx, cmpl = 0, timeo = 0, num_wrbs = 0;
1757 1758
	struct sk_buff *sent_skb;
	bool dummy_wrb;
S
Sathya Perla 已提交
1759
	int i, pending_txqs;
1760 1761 1762

	/* Wait for a max of 200ms for all the tx-completions to arrive. */
	do {
S
Sathya Perla 已提交
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782
		pending_txqs = adapter->num_tx_qs;

		for_all_tx_queues(adapter, txo, i) {
			txq = &txo->q;
			while ((txcp = be_tx_compl_get(&txo->cq))) {
				end_idx =
					AMAP_GET_BITS(struct amap_eth_tx_compl,
						      wrb_index, txcp);
				num_wrbs += be_tx_compl_process(adapter, txo,
								end_idx);
				cmpl++;
			}
			if (cmpl) {
				be_cq_notify(adapter, txo->cq.id, false, cmpl);
				atomic_sub(num_wrbs, &txq->used);
				cmpl = 0;
				num_wrbs = 0;
			}
			if (atomic_read(&txq->used) == 0)
				pending_txqs--;
1783 1784
		}

S
Sathya Perla 已提交
1785
		if (pending_txqs == 0 || ++timeo > 200)
1786 1787 1788 1789 1790
			break;

		mdelay(1);
	} while (true);

S
Sathya Perla 已提交
1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806
	for_all_tx_queues(adapter, txo, i) {
		txq = &txo->q;
		if (atomic_read(&txq->used))
			dev_err(&adapter->pdev->dev, "%d pending tx-compls\n",
				atomic_read(&txq->used));

		/* free posted tx for which compls will never arrive */
		while (atomic_read(&txq->used)) {
			sent_skb = txo->sent_skb_list[txq->tail];
			end_idx = txq->tail;
			num_wrbs = wrb_cnt_for_skb(adapter, sent_skb,
						   &dummy_wrb);
			index_adv(&end_idx, num_wrbs - 1, txq->len);
			num_wrbs = be_tx_compl_process(adapter, txo, end_idx);
			atomic_sub(num_wrbs, &txq->used);
		}
1807
	}
S
Sathya Perla 已提交
1808 1809
}

S
Sathya Perla 已提交
1810 1811 1812 1813 1814 1815
static void be_evt_queues_destroy(struct be_adapter *adapter)
{
	struct be_eq_obj *eqo;
	int i;

	for_all_evt_queues(adapter, eqo, i) {
1816 1817
		if (eqo->q.created) {
			be_eq_clean(eqo);
S
Sathya Perla 已提交
1818
			be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ);
1819
		}
S
Sathya Perla 已提交
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848
		be_queue_free(adapter, &eqo->q);
	}
}

static int be_evt_queues_create(struct be_adapter *adapter)
{
	struct be_queue_info *eq;
	struct be_eq_obj *eqo;
	int i, rc;

	adapter->num_evt_qs = num_irqs(adapter);

	for_all_evt_queues(adapter, eqo, i) {
		eqo->adapter = adapter;
		eqo->tx_budget = BE_TX_BUDGET;
		eqo->idx = i;
		eqo->max_eqd = BE_MAX_EQD;
		eqo->enable_aic = true;

		eq = &eqo->q;
		rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN,
					sizeof(struct be_eq_entry));
		if (rc)
			return rc;

		rc = be_cmd_eq_create(adapter, eq, eqo->cur_eqd);
		if (rc)
			return rc;
	}
1849
	return 0;
S
Sathya Perla 已提交
1850 1851
}

1852 1853 1854 1855
static void be_mcc_queues_destroy(struct be_adapter *adapter)
{
	struct be_queue_info *q;

1856
	q = &adapter->mcc_obj.q;
1857
	if (q->created)
1858
		be_cmd_q_destroy(adapter, q, QTYPE_MCCQ);
1859 1860
	be_queue_free(adapter, q);

1861
	q = &adapter->mcc_obj.cq;
1862
	if (q->created)
1863
		be_cmd_q_destroy(adapter, q, QTYPE_CQ);
1864 1865 1866 1867 1868 1869 1870 1871
	be_queue_free(adapter, q);
}

/* Must be called only after TX qs are created as MCC shares TX EQ */
static int be_mcc_queues_create(struct be_adapter *adapter)
{
	struct be_queue_info *q, *cq;

1872
	cq = &adapter->mcc_obj.cq;
1873
	if (be_queue_alloc(adapter, cq, MCC_CQ_LEN,
1874
			sizeof(struct be_mcc_compl)))
1875 1876
		goto err;

S
Sathya Perla 已提交
1877 1878
	/* Use the default EQ for MCC completions */
	if (be_cmd_cq_create(adapter, cq, &mcc_eqo(adapter)->q, true, 0))
1879 1880
		goto mcc_cq_free;

1881
	q = &adapter->mcc_obj.q;
1882 1883 1884
	if (be_queue_alloc(adapter, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb)))
		goto mcc_cq_destroy;

1885
	if (be_cmd_mccq_create(adapter, q, cq))
1886 1887 1888 1889 1890 1891 1892
		goto mcc_q_free;

	return 0;

mcc_q_free:
	be_queue_free(adapter, q);
mcc_cq_destroy:
1893
	be_cmd_q_destroy(adapter, cq, QTYPE_CQ);
1894 1895 1896 1897 1898 1899
mcc_cq_free:
	be_queue_free(adapter, cq);
err:
	return -1;
}

S
Sathya Perla 已提交
1900 1901 1902
static void be_tx_queues_destroy(struct be_adapter *adapter)
{
	struct be_queue_info *q;
1903 1904
	struct be_tx_obj *txo;
	u8 i;
S
Sathya Perla 已提交
1905

1906 1907 1908 1909 1910
	for_all_tx_queues(adapter, txo, i) {
		q = &txo->q;
		if (q->created)
			be_cmd_q_destroy(adapter, q, QTYPE_TXQ);
		be_queue_free(adapter, q);
S
Sathya Perla 已提交
1911

1912 1913 1914 1915 1916
		q = &txo->cq;
		if (q->created)
			be_cmd_q_destroy(adapter, q, QTYPE_CQ);
		be_queue_free(adapter, q);
	}
S
Sathya Perla 已提交
1917 1918
}

1919 1920
static int be_num_txqs_want(struct be_adapter *adapter)
{
1921 1922 1923
	if ((!lancer_chip(adapter) && sriov_want(adapter)) ||
	    be_is_mc(adapter) ||
	    (!lancer_chip(adapter) && !be_physfn(adapter)) ||
1924
	    BE2_chip(adapter))
1925 1926
		return 1;
	else
1927
		return adapter->max_tx_queues;
1928 1929
}

S
Sathya Perla 已提交
1930
static int be_tx_cqs_create(struct be_adapter *adapter)
S
Sathya Perla 已提交
1931
{
S
Sathya Perla 已提交
1932 1933
	struct be_queue_info *cq, *eq;
	int status;
1934 1935
	struct be_tx_obj *txo;
	u8 i;
S
Sathya Perla 已提交
1936

1937
	adapter->num_tx_qs = be_num_txqs_want(adapter);
1938 1939
	if (adapter->num_tx_qs != MAX_TX_QS) {
		rtnl_lock();
1940 1941
		netif_set_real_num_tx_queues(adapter->netdev,
			adapter->num_tx_qs);
1942 1943
		rtnl_unlock();
	}
1944

S
Sathya Perla 已提交
1945 1946 1947 1948 1949 1950
	for_all_tx_queues(adapter, txo, i) {
		cq = &txo->cq;
		status = be_queue_alloc(adapter, cq, TX_CQ_LEN,
					sizeof(struct be_eth_tx_compl));
		if (status)
			return status;
1951

S
Sathya Perla 已提交
1952 1953 1954 1955 1956 1957 1958 1959 1960 1961
		/* If num_evt_qs is less than num_tx_qs, then more than
		 * one txq share an eq
		 */
		eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
		status = be_cmd_cq_create(adapter, cq, eq, false, 3);
		if (status)
			return status;
	}
	return 0;
}
S
Sathya Perla 已提交
1962

S
Sathya Perla 已提交
1963 1964 1965 1966
static int be_tx_qs_create(struct be_adapter *adapter)
{
	struct be_tx_obj *txo;
	int i, status;
1967

1968
	for_all_tx_queues(adapter, txo, i) {
S
Sathya Perla 已提交
1969 1970 1971 1972
		status = be_queue_alloc(adapter, &txo->q, TX_Q_LEN,
					sizeof(struct be_eth_wrb));
		if (status)
			return status;
S
Sathya Perla 已提交
1973

V
Vasundhara Volam 已提交
1974
		status = be_cmd_txq_create(adapter, txo);
S
Sathya Perla 已提交
1975 1976
		if (status)
			return status;
1977
	}
S
Sathya Perla 已提交
1978

S
Sathya Perla 已提交
1979 1980
	dev_info(&adapter->pdev->dev, "created %d TX queue(s)\n",
		 adapter->num_tx_qs);
S
Sathya Perla 已提交
1981
	return 0;
S
Sathya Perla 已提交
1982 1983
}

S
Sathya Perla 已提交
1984
static void be_rx_cqs_destroy(struct be_adapter *adapter)
S
Sathya Perla 已提交
1985 1986
{
	struct be_queue_info *q;
1987 1988 1989 1990 1991 1992 1993 1994
	struct be_rx_obj *rxo;
	int i;

	for_all_rx_queues(adapter, rxo, i) {
		q = &rxo->cq;
		if (q->created)
			be_cmd_q_destroy(adapter, q, QTYPE_CQ);
		be_queue_free(adapter, q);
1995 1996 1997
	}
}

S
Sathya Perla 已提交
1998
static int be_rx_cqs_create(struct be_adapter *adapter)
S
Sathya Perla 已提交
1999
{
S
Sathya Perla 已提交
2000
	struct be_queue_info *eq, *cq;
2001 2002
	struct be_rx_obj *rxo;
	int rc, i;
S
Sathya Perla 已提交
2003

S
Sathya Perla 已提交
2004 2005 2006 2007 2008
	/* We'll create as many RSS rings as there are irqs.
	 * But when there's only one irq there's no use creating RSS rings
	 */
	adapter->num_rx_qs = (num_irqs(adapter) > 1) ?
				num_irqs(adapter) + 1 : 1;
2009 2010 2011 2012 2013 2014
	if (adapter->num_rx_qs != MAX_RX_QS) {
		rtnl_lock();
		netif_set_real_num_rx_queues(adapter->netdev,
					     adapter->num_rx_qs);
		rtnl_unlock();
	}
2015

S
Sathya Perla 已提交
2016
	adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
2017 2018 2019 2020 2021 2022
	for_all_rx_queues(adapter, rxo, i) {
		rxo->adapter = adapter;
		cq = &rxo->cq;
		rc = be_queue_alloc(adapter, cq, RX_CQ_LEN,
				sizeof(struct be_eth_rx_compl));
		if (rc)
S
Sathya Perla 已提交
2023
			return rc;
2024

S
Sathya Perla 已提交
2025 2026
		eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
		rc = be_cmd_cq_create(adapter, cq, eq, false, 3);
2027
		if (rc)
S
Sathya Perla 已提交
2028
			return rc;
2029
	}
S
Sathya Perla 已提交
2030

S
Sathya Perla 已提交
2031 2032 2033
	dev_info(&adapter->pdev->dev,
		 "created %d RSS queue(s) and 1 default RX queue\n",
		 adapter->num_rx_qs - 1);
S
Sathya Perla 已提交
2034
	return 0;
2035 2036
}

S
Sathya Perla 已提交
2037 2038
static irqreturn_t be_intx(int irq, void *dev)
{
2039 2040 2041
	struct be_eq_obj *eqo = dev;
	struct be_adapter *adapter = eqo->adapter;
	int num_evts = 0;
S
Sathya Perla 已提交
2042

2043 2044 2045 2046 2047 2048 2049
	/* IRQ is not expected when NAPI is scheduled as the EQ
	 * will not be armed.
	 * But, this can happen on Lancer INTx where it takes
	 * a while to de-assert INTx or in BE2 where occasionaly
	 * an interrupt may be raised even when EQ is unarmed.
	 * If NAPI is already scheduled, then counting & notifying
	 * events will orphan them.
2050
	 */
2051
	if (napi_schedule_prep(&eqo->napi)) {
2052
		num_evts = events_get(eqo);
2053 2054 2055 2056 2057
		__napi_schedule(&eqo->napi);
		if (num_evts)
			eqo->spurious_intr = 0;
	}
	be_eq_notify(adapter, eqo->q.id, false, true, num_evts);
2058

2059 2060 2061
	/* Return IRQ_HANDLED only for the the first spurious intr
	 * after a valid intr to stop the kernel from branding
	 * this irq as a bad one!
2062
	 */
2063 2064 2065 2066
	if (num_evts || eqo->spurious_intr++ == 0)
		return IRQ_HANDLED;
	else
		return IRQ_NONE;
S
Sathya Perla 已提交
2067 2068
}

S
Sathya Perla 已提交
2069
static irqreturn_t be_msix(int irq, void *dev)
S
Sathya Perla 已提交
2070
{
S
Sathya Perla 已提交
2071
	struct be_eq_obj *eqo = dev;
S
Sathya Perla 已提交
2072

2073 2074
	be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0);
	napi_schedule(&eqo->napi);
S
Sathya Perla 已提交
2075 2076 2077
	return IRQ_HANDLED;
}

2078
static inline bool do_gro(struct be_rx_compl_info *rxcp)
S
Sathya Perla 已提交
2079
{
2080
	return (rxcp->tcpf && !rxcp->err) ? true : false;
S
Sathya Perla 已提交
2081 2082
}

S
Sathya Perla 已提交
2083 2084
static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi,
			int budget)
S
Sathya Perla 已提交
2085
{
2086 2087
	struct be_adapter *adapter = rxo->adapter;
	struct be_queue_info *rx_cq = &rxo->cq;
2088
	struct be_rx_compl_info *rxcp;
S
Sathya Perla 已提交
2089 2090 2091
	u32 work_done;

	for (work_done = 0; work_done < budget; work_done++) {
2092
		rxcp = be_rx_compl_get(rxo);
S
Sathya Perla 已提交
2093 2094 2095
		if (!rxcp)
			break;

2096 2097 2098 2099 2100 2101
		/* Is it a flush compl that has no data */
		if (unlikely(rxcp->num_rcvd == 0))
			goto loop_continue;

		/* Discard compl with partial DMA Lancer B0 */
		if (unlikely(!rxcp->pkt_size)) {
S
Sathya Perla 已提交
2102
			be_rx_compl_discard(rxo, rxcp);
2103 2104 2105 2106 2107 2108 2109 2110
			goto loop_continue;
		}

		/* On BE drop pkts that arrive due to imperfect filtering in
		 * promiscuous mode on some skews
		 */
		if (unlikely(rxcp->port != adapter->port_num &&
				!lancer_chip(adapter))) {
S
Sathya Perla 已提交
2111
			be_rx_compl_discard(rxo, rxcp);
2112
			goto loop_continue;
2113
		}
2114

2115
		if (do_gro(rxcp))
S
Sathya Perla 已提交
2116
			be_rx_compl_process_gro(rxo, napi, rxcp);
2117
		else
S
Sathya Perla 已提交
2118
			be_rx_compl_process(rxo, rxcp);
2119
loop_continue:
2120
		be_rx_stats_update(rxo, rxcp);
S
Sathya Perla 已提交
2121 2122
	}

S
Sathya Perla 已提交
2123 2124
	if (work_done) {
		be_cq_notify(adapter, rx_cq->id, true, work_done);
2125

S
Sathya Perla 已提交
2126 2127
		if (atomic_read(&rxo->q.used) < RX_FRAGS_REFILL_WM)
			be_post_rx_frags(rxo, GFP_ATOMIC);
S
Sathya Perla 已提交
2128
	}
S
Sathya Perla 已提交
2129

S
Sathya Perla 已提交
2130 2131 2132
	return work_done;
}

S
Sathya Perla 已提交
2133 2134
static bool be_process_tx(struct be_adapter *adapter, struct be_tx_obj *txo,
			  int budget, int idx)
S
Sathya Perla 已提交
2135 2136
{
	struct be_eth_tx_compl *txcp;
S
Sathya Perla 已提交
2137
	int num_wrbs = 0, work_done;
2138

S
Sathya Perla 已提交
2139 2140 2141 2142 2143
	for (work_done = 0; work_done < budget; work_done++) {
		txcp = be_tx_compl_get(&txo->cq);
		if (!txcp)
			break;
		num_wrbs += be_tx_compl_process(adapter, txo,
2144 2145
				AMAP_GET_BITS(struct amap_eth_tx_compl,
					wrb_index, txcp));
S
Sathya Perla 已提交
2146
	}
S
Sathya Perla 已提交
2147

S
Sathya Perla 已提交
2148 2149 2150
	if (work_done) {
		be_cq_notify(adapter, txo->cq.id, true, work_done);
		atomic_sub(num_wrbs, &txo->q.used);
2151

S
Sathya Perla 已提交
2152 2153 2154 2155 2156
		/* As Tx wrbs have been freed up, wake up netdev queue
		 * if it was stopped due to lack of tx wrbs.  */
		if (__netif_subqueue_stopped(adapter->netdev, idx) &&
			atomic_read(&txo->q.used) < txo->q.len / 2) {
			netif_wake_subqueue(adapter->netdev, idx);
2157
		}
S
Sathya Perla 已提交
2158 2159 2160 2161

		u64_stats_update_begin(&tx_stats(txo)->sync_compl);
		tx_stats(txo)->tx_compl += work_done;
		u64_stats_update_end(&tx_stats(txo)->sync_compl);
S
Sathya Perla 已提交
2162
	}
S
Sathya Perla 已提交
2163 2164
	return (work_done < budget); /* Done */
}
S
Sathya Perla 已提交
2165

S
Sathya Perla 已提交
2166 2167 2168 2169
int be_poll(struct napi_struct *napi, int budget)
{
	struct be_eq_obj *eqo = container_of(napi, struct be_eq_obj, napi);
	struct be_adapter *adapter = eqo->adapter;
2170
	int max_work = 0, work, i, num_evts;
S
Sathya Perla 已提交
2171
	bool tx_done;
S
Sathya Perla 已提交
2172

2173 2174
	num_evts = events_get(eqo);

S
Sathya Perla 已提交
2175 2176 2177 2178 2179 2180
	/* Process all TXQs serviced by this EQ */
	for (i = eqo->idx; i < adapter->num_tx_qs; i += adapter->num_evt_qs) {
		tx_done = be_process_tx(adapter, &adapter->tx_obj[i],
					eqo->tx_budget, i);
		if (!tx_done)
			max_work = budget;
S
Sathya Perla 已提交
2181 2182
	}

S
Sathya Perla 已提交
2183 2184 2185 2186 2187 2188 2189 2190
	/* This loop will iterate twice for EQ0 in which
	 * completions of the last RXQ (default one) are also processed
	 * For other EQs the loop iterates only once
	 */
	for (i = eqo->idx; i < adapter->num_rx_qs; i += adapter->num_evt_qs) {
		work = be_process_rx(&adapter->rx_obj[i], napi, budget);
		max_work = max(work, max_work);
	}
S
Sathya Perla 已提交
2191

S
Sathya Perla 已提交
2192 2193
	if (is_mcc_eqo(eqo))
		be_process_mcc(adapter);
2194

S
Sathya Perla 已提交
2195 2196
	if (max_work < budget) {
		napi_complete(napi);
2197
		be_eq_notify(adapter, eqo->q.id, true, false, num_evts);
S
Sathya Perla 已提交
2198 2199
	} else {
		/* As we'll continue in polling mode, count and clear events */
2200
		be_eq_notify(adapter, eqo->q.id, false, false, num_evts);
2201
	}
S
Sathya Perla 已提交
2202
	return max_work;
S
Sathya Perla 已提交
2203 2204
}

2205
void be_detect_error(struct be_adapter *adapter)
2206
{
2207 2208
	u32 ue_lo = 0, ue_hi = 0, ue_lo_mask = 0, ue_hi_mask = 0;
	u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
2209 2210
	u32 i;

2211
	if (be_hw_error(adapter))
2212 2213
		return;

2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
	if (lancer_chip(adapter)) {
		sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
		if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
			sliport_err1 = ioread32(adapter->db +
					SLIPORT_ERROR1_OFFSET);
			sliport_err2 = ioread32(adapter->db +
					SLIPORT_ERROR2_OFFSET);
		}
	} else {
		pci_read_config_dword(adapter->pdev,
				PCICFG_UE_STATUS_LOW, &ue_lo);
		pci_read_config_dword(adapter->pdev,
				PCICFG_UE_STATUS_HIGH, &ue_hi);
		pci_read_config_dword(adapter->pdev,
				PCICFG_UE_STATUS_LOW_MASK, &ue_lo_mask);
		pci_read_config_dword(adapter->pdev,
				PCICFG_UE_STATUS_HI_MASK, &ue_hi_mask);

2232 2233
		ue_lo = (ue_lo & ~ue_lo_mask);
		ue_hi = (ue_hi & ~ue_hi_mask);
2234
	}
2235

2236 2237 2238 2239 2240
	/* On certain platforms BE hardware can indicate spurious UEs.
	 * Allow the h/w to stop working completely in case of a real UE.
	 * Hence not setting the hw_error for UE detection.
	 */
	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
2241
		adapter->hw_error = true;
2242
		dev_err(&adapter->pdev->dev,
2243 2244 2245 2246 2247 2248 2249 2250 2251 2252
			"Error detected in the card\n");
	}

	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
		dev_err(&adapter->pdev->dev,
			"ERR: sliport status 0x%x\n", sliport_status);
		dev_err(&adapter->pdev->dev,
			"ERR: sliport error1 0x%x\n", sliport_err1);
		dev_err(&adapter->pdev->dev,
			"ERR: sliport error2 0x%x\n", sliport_err2);
2253 2254
	}

2255 2256 2257
	if (ue_lo) {
		for (i = 0; ue_lo; ue_lo >>= 1, i++) {
			if (ue_lo & 1)
2258 2259 2260 2261
				dev_err(&adapter->pdev->dev,
				"UE: %s bit set\n", ue_status_low_desc[i]);
		}
	}
2262

2263 2264 2265
	if (ue_hi) {
		for (i = 0; ue_hi; ue_hi >>= 1, i++) {
			if (ue_hi & 1)
2266 2267 2268 2269 2270 2271 2272
				dev_err(&adapter->pdev->dev,
				"UE: %s bit set\n", ue_status_hi_desc[i]);
		}
	}

}

2273 2274
static void be_msix_disable(struct be_adapter *adapter)
{
2275
	if (msix_enabled(adapter)) {
2276
		pci_disable_msix(adapter->pdev);
2277
		adapter->num_msix_vec = 0;
2278 2279 2280
	}
}

S
Sathya Perla 已提交
2281 2282
static uint be_num_rss_want(struct be_adapter *adapter)
{
2283
	u32 num = 0;
2284

S
Sathya Perla 已提交
2285
	if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
2286 2287 2288
	    (lancer_chip(adapter) ||
	     (!sriov_want(adapter) && be_physfn(adapter)))) {
		num = adapter->max_rss_queues;
2289 2290 2291
		num = min_t(u32, num, (u32)netif_get_num_default_rss_queues());
	}
	return num;
S
Sathya Perla 已提交
2292 2293
}

S
Sathya Perla 已提交
2294 2295
static void be_msix_enable(struct be_adapter *adapter)
{
S
Sathya Perla 已提交
2296
#define BE_MIN_MSIX_VECTORS		1
2297
	int i, status, num_vec, num_roce_vec = 0;
S
Sathya Perla 已提交
2298
	struct device *dev = &adapter->pdev->dev;
S
Sathya Perla 已提交
2299

S
Sathya Perla 已提交
2300 2301
	/* If RSS queues are not used, need a vec for default RX Q */
	num_vec = min(be_num_rss_want(adapter), num_online_cpus());
2302 2303 2304 2305 2306 2307 2308
	if (be_roce_supported(adapter)) {
		num_roce_vec = min_t(u32, MAX_ROCE_MSIX_VECTORS,
					(num_online_cpus() + 1));
		num_roce_vec = min(num_roce_vec, MAX_ROCE_EQS);
		num_vec += num_roce_vec;
		num_vec = min(num_vec, MAX_MSIX_VECTORS);
	}
S
Sathya Perla 已提交
2309
	num_vec = max(num_vec, BE_MIN_MSIX_VECTORS);
2310

2311
	for (i = 0; i < num_vec; i++)
S
Sathya Perla 已提交
2312 2313
		adapter->msix_entries[i].entry = i;

2314
	status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec);
2315 2316 2317
	if (status == 0) {
		goto done;
	} else if (status >= BE_MIN_MSIX_VECTORS) {
2318
		num_vec = status;
2319
		if (pci_enable_msix(adapter->pdev, adapter->msix_entries,
2320
				num_vec) == 0)
2321 2322
			goto done;
	}
S
Sathya Perla 已提交
2323 2324

	dev_warn(dev, "MSIx enable failed\n");
2325 2326
	return;
done:
2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
	if (be_roce_supported(adapter)) {
		if (num_vec > num_roce_vec) {
			adapter->num_msix_vec = num_vec - num_roce_vec;
			adapter->num_msix_roce_vec =
				num_vec - adapter->num_msix_vec;
		} else {
			adapter->num_msix_vec = num_vec;
			adapter->num_msix_roce_vec = 0;
		}
	} else
		adapter->num_msix_vec = num_vec;
S
Sathya Perla 已提交
2338
	dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec);
2339
	return;
S
Sathya Perla 已提交
2340 2341
}

2342
static inline int be_msix_vec_get(struct be_adapter *adapter,
S
Sathya Perla 已提交
2343
				struct be_eq_obj *eqo)
2344
{
S
Sathya Perla 已提交
2345
	return adapter->msix_entries[eqo->idx].vector;
2346
}
S
Sathya Perla 已提交
2347

2348 2349
static int be_msix_register(struct be_adapter *adapter)
{
S
Sathya Perla 已提交
2350 2351 2352
	struct net_device *netdev = adapter->netdev;
	struct be_eq_obj *eqo;
	int status, i, vec;
S
Sathya Perla 已提交
2353

S
Sathya Perla 已提交
2354 2355 2356 2357
	for_all_evt_queues(adapter, eqo, i) {
		sprintf(eqo->desc, "%s-q%d", netdev->name, i);
		vec = be_msix_vec_get(adapter, eqo);
		status = request_irq(vec, be_msix, 0, eqo->desc, eqo);
2358 2359 2360
		if (status)
			goto err_msix;
	}
2361

S
Sathya Perla 已提交
2362
	return 0;
2363
err_msix:
S
Sathya Perla 已提交
2364 2365 2366 2367
	for (i--, eqo = &adapter->eq_obj[i]; i >= 0; i--, eqo--)
		free_irq(be_msix_vec_get(adapter, eqo), eqo);
	dev_warn(&adapter->pdev->dev, "MSIX Request IRQ failed - err %d\n",
		status);
2368
	be_msix_disable(adapter);
S
Sathya Perla 已提交
2369 2370 2371 2372 2373 2374 2375 2376
	return status;
}

static int be_irq_register(struct be_adapter *adapter)
{
	struct net_device *netdev = adapter->netdev;
	int status;

2377
	if (msix_enabled(adapter)) {
S
Sathya Perla 已提交
2378 2379 2380
		status = be_msix_register(adapter);
		if (status == 0)
			goto done;
2381 2382 2383
		/* INTx is not supported for VF */
		if (!be_physfn(adapter))
			return status;
S
Sathya Perla 已提交
2384 2385
	}

2386
	/* INTx: only the first EQ is used */
S
Sathya Perla 已提交
2387 2388
	netdev->irq = adapter->pdev->irq;
	status = request_irq(netdev->irq, be_intx, IRQF_SHARED, netdev->name,
2389
			     &adapter->eq_obj[0]);
S
Sathya Perla 已提交
2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402
	if (status) {
		dev_err(&adapter->pdev->dev,
			"INTx request IRQ failed - err %d\n", status);
		return status;
	}
done:
	adapter->isr_registered = true;
	return 0;
}

static void be_irq_unregister(struct be_adapter *adapter)
{
	struct net_device *netdev = adapter->netdev;
S
Sathya Perla 已提交
2403
	struct be_eq_obj *eqo;
2404
	int i;
S
Sathya Perla 已提交
2405 2406 2407 2408 2409

	if (!adapter->isr_registered)
		return;

	/* INTx */
2410
	if (!msix_enabled(adapter)) {
2411
		free_irq(netdev->irq, &adapter->eq_obj[0]);
S
Sathya Perla 已提交
2412 2413 2414 2415
		goto done;
	}

	/* MSIx */
S
Sathya Perla 已提交
2416 2417
	for_all_evt_queues(adapter, eqo, i)
		free_irq(be_msix_vec_get(adapter, eqo), eqo);
2418

S
Sathya Perla 已提交
2419 2420 2421 2422
done:
	adapter->isr_registered = false;
}

S
Sathya Perla 已提交
2423
static void be_rx_qs_destroy(struct be_adapter *adapter)
2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437
{
	struct be_queue_info *q;
	struct be_rx_obj *rxo;
	int i;

	for_all_rx_queues(adapter, rxo, i) {
		q = &rxo->q;
		if (q->created) {
			be_cmd_rxq_destroy(adapter, q);
			/* After the rxq is invalidated, wait for a grace time
			 * of 1ms for all dma to end and the flush compl to
			 * arrive
			 */
			mdelay(1);
S
Sathya Perla 已提交
2438
			be_rx_cq_clean(rxo);
2439
		}
S
Sathya Perla 已提交
2440
		be_queue_free(adapter, q);
2441 2442 2443
	}
}

2444 2445 2446
static int be_close(struct net_device *netdev)
{
	struct be_adapter *adapter = netdev_priv(netdev);
S
Sathya Perla 已提交
2447 2448
	struct be_eq_obj *eqo;
	int i;
2449

2450 2451
	be_roce_dev_close(adapter);

2452
	for_all_evt_queues(adapter, eqo, i)
S
Sathya Perla 已提交
2453
		napi_disable(&eqo->napi);
2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464

	be_async_mcc_disable(adapter);

	/* Wait for all pending tx completions to arrive so that
	 * all tx skbs are freed.
	 */
	be_tx_compl_clean(adapter);

	be_rx_qs_destroy(adapter);

	for_all_evt_queues(adapter, eqo, i) {
S
Sathya Perla 已提交
2465 2466 2467 2468 2469
		if (msix_enabled(adapter))
			synchronize_irq(be_msix_vec_get(adapter, eqo));
		else
			synchronize_irq(netdev->irq);
		be_eq_clean(eqo);
2470 2471
	}

2472 2473
	be_irq_unregister(adapter);

2474 2475 2476
	return 0;
}

S
Sathya Perla 已提交
2477
static int be_rx_qs_create(struct be_adapter *adapter)
2478 2479
{
	struct be_rx_obj *rxo;
2480 2481
	int rc, i, j;
	u8 rsstable[128];
2482 2483

	for_all_rx_queues(adapter, rxo, i) {
S
Sathya Perla 已提交
2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497
		rc = be_queue_alloc(adapter, &rxo->q, RX_Q_LEN,
				    sizeof(struct be_eth_rx_d));
		if (rc)
			return rc;
	}

	/* The FW would like the default RXQ to be created first */
	rxo = default_rxo(adapter);
	rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, rx_frag_size,
			       adapter->if_handle, false, &rxo->rss_id);
	if (rc)
		return rc;

	for_all_rss_queues(adapter, rxo, i) {
2498
		rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id,
S
Sathya Perla 已提交
2499 2500
				       rx_frag_size, adapter->if_handle,
				       true, &rxo->rss_id);
2501 2502 2503 2504 2505
		if (rc)
			return rc;
	}

	if (be_multi_rxq(adapter)) {
2506 2507 2508 2509 2510 2511 2512 2513
		for (j = 0; j < 128; j += adapter->num_rx_qs - 1) {
			for_all_rss_queues(adapter, rxo, i) {
				if ((j + i) >= 128)
					break;
				rsstable[j + i] = rxo->rss_id;
			}
		}
		rc = be_cmd_rss_config(adapter, rsstable, 128);
2514 2515 2516 2517 2518
		if (rc)
			return rc;
	}

	/* First time posting */
S
Sathya Perla 已提交
2519
	for_all_rx_queues(adapter, rxo, i)
2520
		be_post_rx_frags(rxo, GFP_KERNEL);
2521 2522 2523
	return 0;
}

S
Sathya Perla 已提交
2524 2525 2526
static int be_open(struct net_device *netdev)
{
	struct be_adapter *adapter = netdev_priv(netdev);
S
Sathya Perla 已提交
2527
	struct be_eq_obj *eqo;
2528
	struct be_rx_obj *rxo;
S
Sathya Perla 已提交
2529
	struct be_tx_obj *txo;
2530
	u8 link_status;
2531
	int status, i;
2532

S
Sathya Perla 已提交
2533
	status = be_rx_qs_create(adapter);
2534 2535 2536
	if (status)
		goto err;

2537 2538
	be_irq_register(adapter);

S
Sathya Perla 已提交
2539
	for_all_rx_queues(adapter, rxo, i)
2540
		be_cq_notify(adapter, rxo->cq.id, true, 0);
2541

S
Sathya Perla 已提交
2542 2543 2544
	for_all_tx_queues(adapter, txo, i)
		be_cq_notify(adapter, txo->cq.id, true, 0);

2545 2546
	be_async_mcc_enable(adapter);

S
Sathya Perla 已提交
2547 2548 2549 2550 2551
	for_all_evt_queues(adapter, eqo, i) {
		napi_enable(&eqo->napi);
		be_eq_notify(adapter, eqo->q.id, true, false, 0);
	}

2552
	status = be_cmd_link_status_query(adapter, NULL, &link_status, 0);
2553 2554 2555
	if (!status)
		be_link_status_update(adapter, link_status);

2556
	be_roce_dev_open(adapter);
2557 2558 2559 2560
	return 0;
err:
	be_close(adapter->netdev);
	return -EIO;
2561 2562
}

2563 2564 2565 2566 2567 2568 2569 2570 2571
static int be_setup_wol(struct be_adapter *adapter, bool enable)
{
	struct be_dma_mem cmd;
	int status = 0;
	u8 mac[ETH_ALEN];

	memset(mac, 0, ETH_ALEN);

	cmd.size = sizeof(struct be_cmd_req_acpi_wol_magic_config);
I
Ivan Vecera 已提交
2572
	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
2573
				    GFP_KERNEL | __GFP_ZERO);
2574 2575 2576 2577 2578 2579 2580 2581
	if (cmd.va == NULL)
		return -1;

	if (enable) {
		status = pci_write_config_dword(adapter->pdev,
			PCICFG_PM_CONTROL_OFFSET, PCICFG_PM_CONTROL_MASK);
		if (status) {
			dev_err(&adapter->pdev->dev,
2582
				"Could not enable Wake-on-lan\n");
I
Ivan Vecera 已提交
2583 2584
			dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
					  cmd.dma);
2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596
			return status;
		}
		status = be_cmd_enable_magic_wol(adapter,
				adapter->netdev->dev_addr, &cmd);
		pci_enable_wake(adapter->pdev, PCI_D3hot, 1);
		pci_enable_wake(adapter->pdev, PCI_D3cold, 1);
	} else {
		status = be_cmd_enable_magic_wol(adapter, mac, &cmd);
		pci_enable_wake(adapter->pdev, PCI_D3hot, 0);
		pci_enable_wake(adapter->pdev, PCI_D3cold, 0);
	}

I
Ivan Vecera 已提交
2597
	dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
2598 2599 2600
	return status;
}

2601 2602 2603 2604 2605 2606
/*
 * Generate a seed MAC address from the PF MAC Address using jhash.
 * MAC Address for VFs are assigned incrementally starting from the seed.
 * These addresses are programmed in the ASIC by the PF and the VF driver
 * queries for the MAC address during its probe.
 */
2607
static int be_vf_eth_addr_config(struct be_adapter *adapter)
2608
{
2609
	u32 vf;
2610
	int status = 0;
2611
	u8 mac[ETH_ALEN];
2612
	struct be_vf_cfg *vf_cfg;
2613 2614 2615

	be_vf_eth_addr_generate(adapter, mac);

2616
	for_all_vfs(adapter, vf_cfg, vf) {
2617 2618 2619 2620
		if (lancer_chip(adapter)) {
			status = be_cmd_set_mac_list(adapter,  mac, 1, vf + 1);
		} else {
			status = be_cmd_pmac_add(adapter, mac,
2621 2622
						 vf_cfg->if_handle,
						 &vf_cfg->pmac_id, vf + 1);
2623 2624
		}

2625 2626
		if (status)
			dev_err(&adapter->pdev->dev,
2627
			"Mac address assignment failed for VF %d\n", vf);
2628
		else
2629
			memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
2630 2631 2632 2633 2634 2635

		mac[5] += 1;
	}
	return status;
}

2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655
static int be_vfs_mac_query(struct be_adapter *adapter)
{
	int status, vf;
	u8 mac[ETH_ALEN];
	struct be_vf_cfg *vf_cfg;
	bool active;

	for_all_vfs(adapter, vf_cfg, vf) {
		be_cmd_get_mac_from_list(adapter, mac, &active,
					 &vf_cfg->pmac_id, 0);

		status = be_cmd_mac_addr_query(adapter, mac, false,
					       vf_cfg->if_handle, 0);
		if (status)
			return status;
		memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
	}
	return 0;
}

2656
static void be_vf_clear(struct be_adapter *adapter)
2657
{
2658
	struct be_vf_cfg *vf_cfg;
2659 2660
	u32 vf;

2661
	if (be_find_vfs(adapter, ASSIGNED)) {
2662 2663
		dev_warn(&adapter->pdev->dev,
			 "VFs are assigned to VMs: not disabling VFs\n");
2664 2665 2666
		goto done;
	}

2667
	for_all_vfs(adapter, vf_cfg, vf) {
2668 2669 2670
		if (lancer_chip(adapter))
			be_cmd_set_mac_list(adapter, NULL, 0, vf + 1);
		else
2671 2672
			be_cmd_pmac_del(adapter, vf_cfg->if_handle,
					vf_cfg->pmac_id, vf + 1);
2673

2674 2675
		be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1);
	}
2676 2677 2678 2679
	pci_disable_sriov(adapter->pdev);
done:
	kfree(adapter->vf_cfg);
	adapter->num_vfs = 0;
2680 2681
}

2682 2683
static int be_clear(struct be_adapter *adapter)
{
2684 2685
	int i = 1;

2686 2687 2688 2689 2690
	if (adapter->flags & BE_FLAGS_WORKER_SCHEDULED) {
		cancel_delayed_work_sync(&adapter->work);
		adapter->flags &= ~BE_FLAGS_WORKER_SCHEDULED;
	}

2691
	if (sriov_enabled(adapter))
2692 2693
		be_vf_clear(adapter);

2694 2695 2696 2697
	for (; adapter->uc_macs > 0; adapter->uc_macs--, i++)
		be_cmd_pmac_del(adapter, adapter->if_handle,
			adapter->pmac_id[i], 0);

2698
	be_cmd_if_destroy(adapter, adapter->if_handle,  0);
2699 2700

	be_mcc_queues_destroy(adapter);
S
Sathya Perla 已提交
2701
	be_rx_cqs_destroy(adapter);
2702
	be_tx_queues_destroy(adapter);
S
Sathya Perla 已提交
2703
	be_evt_queues_destroy(adapter);
2704

2705 2706 2707
	kfree(adapter->pmac_id);
	adapter->pmac_id = NULL;

S
Sathya Perla 已提交
2708
	be_msix_disable(adapter);
2709 2710 2711
	return 0;
}

2712
static int be_vfs_if_create(struct be_adapter *adapter)
2713
{
2714 2715
	struct be_vf_cfg *vf_cfg;
	u32 cap_flags, en_flags, vf;
2716 2717
	int status;

2718 2719
	cap_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST |
		    BE_IF_FLAGS_MULTICAST;
2720

2721 2722
	for_all_vfs(adapter, vf_cfg, vf) {
		if (!BE3_chip(adapter))
2723 2724
			be_cmd_get_profile_config(adapter, &cap_flags,
						  NULL, vf + 1);
2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735

		/* If a FW profile exists, then cap_flags are updated */
		en_flags = cap_flags & (BE_IF_FLAGS_UNTAGGED |
			   BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_MULTICAST);
		status = be_cmd_if_create(adapter, cap_flags, en_flags,
					  &vf_cfg->if_handle, vf + 1);
		if (status)
			goto err;
	}
err:
	return status;
2736 2737
}

2738
static int be_vf_setup_init(struct be_adapter *adapter)
2739
{
2740
	struct be_vf_cfg *vf_cfg;
2741 2742
	int vf;

2743 2744 2745 2746 2747
	adapter->vf_cfg = kcalloc(adapter->num_vfs, sizeof(*vf_cfg),
				  GFP_KERNEL);
	if (!adapter->vf_cfg)
		return -ENOMEM;

2748 2749 2750
	for_all_vfs(adapter, vf_cfg, vf) {
		vf_cfg->if_handle = -1;
		vf_cfg->pmac_id = -1;
2751
	}
2752
	return 0;
2753 2754
}

2755 2756
static int be_vf_setup(struct be_adapter *adapter)
{
2757
	struct be_vf_cfg *vf_cfg;
2758
	u16 def_vlan, lnk_speed;
2759 2760
	int status, old_vfs, vf;
	struct device *dev = &adapter->pdev->dev;
2761

2762 2763 2764 2765 2766 2767
	old_vfs = be_find_vfs(adapter, ENABLED);
	if (old_vfs) {
		dev_info(dev, "%d VFs are already enabled\n", old_vfs);
		if (old_vfs != num_vfs)
			dev_warn(dev, "Ignoring num_vfs=%d setting\n", num_vfs);
		adapter->num_vfs = old_vfs;
2768
	} else {
2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779
		if (num_vfs > adapter->dev_num_vfs)
			dev_info(dev, "Device supports %d VFs and not %d\n",
				 adapter->dev_num_vfs, num_vfs);
		adapter->num_vfs = min_t(u16, num_vfs, adapter->dev_num_vfs);

		status = pci_enable_sriov(adapter->pdev, num_vfs);
		if (status) {
			dev_err(dev, "SRIOV enable failed\n");
			adapter->num_vfs = 0;
			return 0;
		}
2780 2781 2782 2783 2784
	}

	status = be_vf_setup_init(adapter);
	if (status)
		goto err;
2785

2786 2787 2788 2789 2790 2791 2792 2793
	if (old_vfs) {
		for_all_vfs(adapter, vf_cfg, vf) {
			status = be_cmd_get_if_id(adapter, vf_cfg, vf);
			if (status)
				goto err;
		}
	} else {
		status = be_vfs_if_create(adapter);
2794 2795 2796 2797
		if (status)
			goto err;
	}

2798 2799 2800 2801 2802
	if (old_vfs) {
		status = be_vfs_mac_query(adapter);
		if (status)
			goto err;
	} else {
2803 2804 2805 2806
		status = be_vf_eth_addr_config(adapter);
		if (status)
			goto err;
	}
2807

2808
	for_all_vfs(adapter, vf_cfg, vf) {
2809 2810 2811 2812 2813 2814 2815 2816 2817 2818
		/* BE3 FW, by default, caps VF TX-rate to 100mbps.
		 * Allow full available bandwidth
		 */
		if (BE3_chip(adapter) && !old_vfs)
			be_cmd_set_qos(adapter, 1000, vf+1);

		status = be_cmd_link_status_query(adapter, &lnk_speed,
						  NULL, vf + 1);
		if (!status)
			vf_cfg->tx_rate = lnk_speed;
2819 2820

		status = be_cmd_get_hsw_config(adapter, &def_vlan,
2821
					       vf + 1, vf_cfg->if_handle);
2822 2823 2824
		if (status)
			goto err;
		vf_cfg->def_vid = def_vlan;
2825 2826

		be_cmd_enable_vf(adapter, vf + 1);
2827 2828 2829
	}
	return 0;
err:
2830 2831
	dev_err(dev, "VF setup failed\n");
	be_vf_clear(adapter);
2832 2833 2834
	return status;
}

2835 2836 2837
static void be_setup_init(struct be_adapter *adapter)
{
	adapter->vlan_prio_bmap = 0xff;
A
Ajit Khaparde 已提交
2838
	adapter->phy.link_speed = -1;
2839 2840 2841
	adapter->if_handle = -1;
	adapter->be3_native = false;
	adapter->promiscuous = false;
2842 2843 2844 2845
	if (be_physfn(adapter))
		adapter->cmd_privileges = MAX_PRIVILEGES;
	else
		adapter->cmd_privileges = MIN_PRIVILEGES;
2846 2847
}

2848 2849
static int be_get_mac_addr(struct be_adapter *adapter, u8 *mac, u32 if_handle,
			   bool *active_mac, u32 *pmac_id)
2850
{
2851
	int status = 0;
2852

2853 2854 2855 2856 2857 2858
	if (!is_zero_ether_addr(adapter->netdev->perm_addr)) {
		memcpy(mac, adapter->netdev->dev_addr, ETH_ALEN);
		if (!lancer_chip(adapter) && !be_physfn(adapter))
			*active_mac = true;
		else
			*active_mac = false;
2859

2860 2861
		return status;
	}
2862

2863 2864 2865 2866
	if (lancer_chip(adapter)) {
		status = be_cmd_get_mac_from_list(adapter, mac,
						  active_mac, pmac_id, 0);
		if (*active_mac) {
2867 2868
			status = be_cmd_mac_addr_query(adapter, mac, false,
						       if_handle, *pmac_id);
2869 2870 2871
		}
	} else if (be_physfn(adapter)) {
		/* For BE3, for PF get permanent MAC */
2872
		status = be_cmd_mac_addr_query(adapter, mac, true, 0, 0);
2873
		*active_mac = false;
2874
	} else {
2875
		/* For BE3, for VF get soft MAC assigned by PF*/
2876
		status = be_cmd_mac_addr_query(adapter, mac, false,
2877 2878
					       if_handle, 0);
		*active_mac = true;
2879
	}
2880 2881 2882
	return status;
}

2883 2884
static void be_get_resources(struct be_adapter *adapter)
{
2885 2886
	u16 dev_num_vfs;
	int pos, status;
2887
	bool profile_present = false;
2888
	u16 txq_count = 0;
2889

2890
	if (!BEx_chip(adapter)) {
2891 2892 2893
		status = be_cmd_get_func_config(adapter);
		if (!status)
			profile_present = true;
2894 2895
	} else if (BE3_chip(adapter) && be_physfn(adapter)) {
		be_cmd_get_profile_config(adapter, NULL, &txq_count, 0);
2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932
	}

	if (profile_present) {
		/* Sanity fixes for Lancer */
		adapter->max_pmac_cnt = min_t(u16, adapter->max_pmac_cnt,
					      BE_UC_PMAC_COUNT);
		adapter->max_vlans = min_t(u16, adapter->max_vlans,
					   BE_NUM_VLANS_SUPPORTED);
		adapter->max_mcast_mac = min_t(u16, adapter->max_mcast_mac,
					       BE_MAX_MC);
		adapter->max_tx_queues = min_t(u16, adapter->max_tx_queues,
					       MAX_TX_QS);
		adapter->max_rss_queues = min_t(u16, adapter->max_rss_queues,
						BE3_MAX_RSS_QS);
		adapter->max_event_queues = min_t(u16,
						  adapter->max_event_queues,
						  BE3_MAX_RSS_QS);

		if (adapter->max_rss_queues &&
		    adapter->max_rss_queues == adapter->max_rx_queues)
			adapter->max_rss_queues -= 1;

		if (adapter->max_event_queues < adapter->max_rss_queues)
			adapter->max_rss_queues = adapter->max_event_queues;

	} else {
		if (be_physfn(adapter))
			adapter->max_pmac_cnt = BE_UC_PMAC_COUNT;
		else
			adapter->max_pmac_cnt = BE_VF_UC_PMAC_COUNT;

		if (adapter->function_mode & FLEX10_MODE)
			adapter->max_vlans = BE_NUM_VLANS_SUPPORTED/8;
		else
			adapter->max_vlans = BE_NUM_VLANS_SUPPORTED;

		adapter->max_mcast_mac = BE_MAX_MC;
2933 2934 2935
		adapter->max_tx_queues = txq_count ? txq_count : MAX_TX_QS;
		adapter->max_tx_queues = min_t(u16, adapter->max_tx_queues,
					       MAX_TX_QS);
2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950
		adapter->max_rss_queues = (adapter->be3_native) ?
					   BE3_MAX_RSS_QS : BE2_MAX_RSS_QS;
		adapter->max_event_queues = BE3_MAX_RSS_QS;

		adapter->if_cap_flags = BE_IF_FLAGS_UNTAGGED |
					BE_IF_FLAGS_BROADCAST |
					BE_IF_FLAGS_MULTICAST |
					BE_IF_FLAGS_PASS_L3L4_ERRORS |
					BE_IF_FLAGS_MCAST_PROMISCUOUS |
					BE_IF_FLAGS_VLAN_PROMISCUOUS |
					BE_IF_FLAGS_PROMISCUOUS;

		if (adapter->function_caps & BE_FUNCTION_CAPS_RSS)
			adapter->if_cap_flags |= BE_IF_FLAGS_RSS;
	}
2951 2952 2953 2954 2955 2956 2957 2958 2959

	pos = pci_find_ext_capability(adapter->pdev, PCI_EXT_CAP_ID_SRIOV);
	if (pos) {
		pci_read_config_word(adapter->pdev, pos + PCI_SRIOV_TOTAL_VF,
				     &dev_num_vfs);
		if (BE3_chip(adapter))
			dev_num_vfs = min_t(u16, dev_num_vfs, MAX_VFS);
		adapter->dev_num_vfs = dev_num_vfs;
	}
2960 2961
}

2962 2963 2964
/* Routine to query per function resource limits */
static int be_get_config(struct be_adapter *adapter)
{
2965
	int status;
2966

2967 2968
	status = be_cmd_query_fw_cfg(adapter, &adapter->port_num,
				     &adapter->function_mode,
2969 2970
				     &adapter->function_caps,
				     &adapter->asic_rev);
2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985
	if (status)
		goto err;

	be_get_resources(adapter);

	/* primary mac needs 1 pmac entry */
	adapter->pmac_id = kcalloc(adapter->max_pmac_cnt + 1,
				   sizeof(u32), GFP_KERNEL);
	if (!adapter->pmac_id) {
		status = -ENOMEM;
		goto err;
	}

err:
	return status;
2986 2987
}

2988 2989
static int be_setup(struct be_adapter *adapter)
{
2990
	struct device *dev = &adapter->pdev->dev;
2991
	u32 en_flags;
2992
	u32 tx_fc, rx_fc;
S
Sathya Perla 已提交
2993
	int status;
2994
	u8 mac[ETH_ALEN];
2995
	bool active_mac;
2996

2997
	be_setup_init(adapter);
S
Sathya Perla 已提交
2998

2999 3000
	if (!lancer_chip(adapter))
		be_cmd_req_native_mode(adapter);
3001

3002 3003 3004
	status = be_get_config(adapter);
	if (status)
		goto err;
3005

S
Sathya Perla 已提交
3006 3007 3008 3009
	be_msix_enable(adapter);

	status = be_evt_queues_create(adapter);
	if (status)
3010
		goto err;
S
Sathya Perla 已提交
3011

S
Sathya Perla 已提交
3012 3013 3014 3015 3016 3017
	status = be_tx_cqs_create(adapter);
	if (status)
		goto err;

	status = be_rx_cqs_create(adapter);
	if (status)
3018
		goto err;
S
Sathya Perla 已提交
3019

3020
	status = be_mcc_queues_create(adapter);
S
Sathya Perla 已提交
3021
	if (status)
3022
		goto err;
S
Sathya Perla 已提交
3023

3024 3025 3026 3027 3028 3029 3030
	be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0);
	/* In UMC mode FW does not return right privileges.
	 * Override with correct privilege equivalent to PF.
	 */
	if (be_is_mc(adapter))
		adapter->cmd_privileges = MAX_PRIVILEGES;

3031 3032
	en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST |
			BE_IF_FLAGS_MULTICAST | BE_IF_FLAGS_PASS_L3L4_ERRORS;
3033

3034
	if (adapter->function_caps & BE_FUNCTION_CAPS_RSS)
3035
		en_flags |= BE_IF_FLAGS_RSS;
3036

3037
	en_flags = en_flags & adapter->if_cap_flags;
3038

3039
	status = be_cmd_if_create(adapter, adapter->if_cap_flags, en_flags,
3040
				  &adapter->if_handle, 0);
3041
	if (status != 0)
3042
		goto err;
S
Sathya Perla 已提交
3043

3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060
	memset(mac, 0, ETH_ALEN);
	active_mac = false;
	status = be_get_mac_addr(adapter, mac, adapter->if_handle,
				 &active_mac, &adapter->pmac_id[0]);
	if (status != 0)
		goto err;

	if (!active_mac) {
		status = be_cmd_pmac_add(adapter, mac, adapter->if_handle,
					 &adapter->pmac_id[0], 0);
		if (status != 0)
			goto err;
	}

	if (is_zero_ether_addr(adapter->netdev->dev_addr)) {
		memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN);
		memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN);
3061
	}
3062

S
Sathya Perla 已提交
3063 3064 3065 3066
	status = be_tx_qs_create(adapter);
	if (status)
		goto err;

3067
	be_cmd_get_fw_ver(adapter, adapter->fw_ver, NULL);
3068

3069
	if (adapter->vlans_added)
S
Sathya Perla 已提交
3070
		be_vid_config(adapter);
3071

3072
	be_set_rx_mode(adapter->netdev);
3073

3074
	be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc);
3075

3076 3077
	if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc)
		be_cmd_set_flow_control(adapter, adapter->tx_fc,
3078
					adapter->rx_fc);
3079

3080 3081 3082 3083 3084
	if (be_physfn(adapter) && num_vfs) {
		if (adapter->dev_num_vfs)
			be_vf_setup(adapter);
		else
			dev_warn(dev, "device doesn't support SRIOV\n");
3085 3086
	}

3087 3088
	status = be_cmd_get_phy_info(adapter);
	if (!status && be_pause_supported(adapter))
A
Ajit Khaparde 已提交
3089 3090
		adapter->phy.fc_autoneg = 1;

3091 3092
	schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
	adapter->flags |= BE_FLAGS_WORKER_SCHEDULED;
3093
	return 0;
3094 3095 3096 3097
err:
	be_clear(adapter);
	return status;
}
S
Sathya Perla 已提交
3098

I
Ivan Vecera 已提交
3099 3100 3101 3102
#ifdef CONFIG_NET_POLL_CONTROLLER
static void be_netpoll(struct net_device *netdev)
{
	struct be_adapter *adapter = netdev_priv(netdev);
S
Sathya Perla 已提交
3103
	struct be_eq_obj *eqo;
I
Ivan Vecera 已提交
3104 3105
	int i;

3106 3107 3108 3109
	for_all_evt_queues(adapter, eqo, i) {
		be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0);
		napi_schedule(&eqo->napi);
	}
S
Sathya Perla 已提交
3110 3111

	return;
I
Ivan Vecera 已提交
3112 3113 3114
}
#endif

3115
#define FW_FILE_HDR_SIGN 	"ServerEngines Corp. "
3116 3117
char flash_cookie[2][16] =      {"*** SE FLAS", "H DIRECTORY *** "};

3118
static bool be_flash_redboot(struct be_adapter *adapter,
3119 3120
			const u8 *p, u32 img_start, int image_size,
			int hdr_size)
3121 3122 3123 3124
{
	u32 crc_offset;
	u8 flashed_crc[4];
	int status;
3125 3126 3127

	crc_offset = hdr_size + img_start + image_size - 4;

3128
	p += crc_offset;
3129 3130

	status = be_cmd_get_flash_crc(adapter, flashed_crc,
3131
			(image_size - 4));
3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144
	if (status) {
		dev_err(&adapter->pdev->dev,
		"could not get crc from flash, not flashing redboot\n");
		return false;
	}

	/*update redboot only if crc does not match*/
	if (!memcmp(flashed_crc, p, 4))
		return false;
	else
		return true;
}

3145 3146
static bool phy_flashing_required(struct be_adapter *adapter)
{
A
Ajit Khaparde 已提交
3147 3148
	return (adapter->phy.phy_type == TN_8022 &&
		adapter->phy.interface_type == PHY_TYPE_BASET_10GB);
3149 3150
}

3151 3152 3153 3154 3155 3156
static bool is_comp_in_ufi(struct be_adapter *adapter,
			   struct flash_section_info *fsec, int type)
{
	int i = 0, img_type = 0;
	struct flash_section_info_g2 *fsec_g2 = NULL;

3157
	if (BE2_chip(adapter))
3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189
		fsec_g2 = (struct flash_section_info_g2 *)fsec;

	for (i = 0; i < MAX_FLASH_COMP; i++) {
		if (fsec_g2)
			img_type = le32_to_cpu(fsec_g2->fsec_entry[i].type);
		else
			img_type = le32_to_cpu(fsec->fsec_entry[i].type);

		if (img_type == type)
			return true;
	}
	return false;

}

struct flash_section_info *get_fsec_info(struct be_adapter *adapter,
					 int header_size,
					 const struct firmware *fw)
{
	struct flash_section_info *fsec = NULL;
	const u8 *p = fw->data;

	p += header_size;
	while (p < (fw->data + fw->size)) {
		fsec = (struct flash_section_info *)p;
		if (!memcmp(flash_cookie, fsec->cookie, sizeof(flash_cookie)))
			return fsec;
		p += 32;
	}
	return NULL;
}

3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214
static int be_flash(struct be_adapter *adapter, const u8 *img,
		struct be_dma_mem *flash_cmd, int optype, int img_size)
{
	u32 total_bytes = 0, flash_op, num_bytes = 0;
	int status = 0;
	struct be_cmd_write_flashrom *req = flash_cmd->va;

	total_bytes = img_size;
	while (total_bytes) {
		num_bytes = min_t(u32, 32*1024, total_bytes);

		total_bytes -= num_bytes;

		if (!total_bytes) {
			if (optype == OPTYPE_PHY_FW)
				flash_op = FLASHROM_OPER_PHY_FLASH;
			else
				flash_op = FLASHROM_OPER_FLASH;
		} else {
			if (optype == OPTYPE_PHY_FW)
				flash_op = FLASHROM_OPER_PHY_SAVE;
			else
				flash_op = FLASHROM_OPER_SAVE;
		}

3215
		memcpy(req->data_buf, img, num_bytes);
3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230
		img += num_bytes;
		status = be_cmd_write_flashrom(adapter, flash_cmd, optype,
						flash_op, num_bytes);
		if (status) {
			if (status == ILLEGAL_IOCTL_REQ &&
			    optype == OPTYPE_PHY_FW)
				break;
			dev_err(&adapter->pdev->dev,
				"cmd to write to flash rom failed.\n");
			return status;
		}
	}
	return 0;
}

3231
/* For BE2, BE3 and BE3-R */
3232
static int be_flash_BEx(struct be_adapter *adapter,
3233 3234 3235
			 const struct firmware *fw,
			 struct be_dma_mem *flash_cmd,
			 int num_of_images)
3236

3237
{
3238
	int status = 0, i, filehdr_size = 0;
3239
	int img_hdrs_size = (num_of_images * sizeof(struct image_hdr));
3240
	const u8 *p = fw->data;
J
Joe Perches 已提交
3241
	const struct flash_comp *pflashcomp;
3242
	int num_comp, redboot;
3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265
	struct flash_section_info *fsec = NULL;

	struct flash_comp gen3_flash_types[] = {
		{ FLASH_iSCSI_PRIMARY_IMAGE_START_g3, OPTYPE_ISCSI_ACTIVE,
			FLASH_IMAGE_MAX_SIZE_g3, IMAGE_FIRMWARE_iSCSI},
		{ FLASH_REDBOOT_START_g3, OPTYPE_REDBOOT,
			FLASH_REDBOOT_IMAGE_MAX_SIZE_g3, IMAGE_BOOT_CODE},
		{ FLASH_iSCSI_BIOS_START_g3, OPTYPE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g3, IMAGE_OPTION_ROM_ISCSI},
		{ FLASH_PXE_BIOS_START_g3, OPTYPE_PXE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g3, IMAGE_OPTION_ROM_PXE},
		{ FLASH_FCoE_BIOS_START_g3, OPTYPE_FCOE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g3, IMAGE_OPTION_ROM_FCoE},
		{ FLASH_iSCSI_BACKUP_IMAGE_START_g3, OPTYPE_ISCSI_BACKUP,
			FLASH_IMAGE_MAX_SIZE_g3, IMAGE_FIRMWARE_BACKUP_iSCSI},
		{ FLASH_FCoE_PRIMARY_IMAGE_START_g3, OPTYPE_FCOE_FW_ACTIVE,
			FLASH_IMAGE_MAX_SIZE_g3, IMAGE_FIRMWARE_FCoE},
		{ FLASH_FCoE_BACKUP_IMAGE_START_g3, OPTYPE_FCOE_FW_BACKUP,
			FLASH_IMAGE_MAX_SIZE_g3, IMAGE_FIRMWARE_BACKUP_FCoE},
		{ FLASH_NCSI_START_g3, OPTYPE_NCSI_FW,
			FLASH_NCSI_IMAGE_MAX_SIZE_g3, IMAGE_NCSI},
		{ FLASH_PHY_FW_START_g3, OPTYPE_PHY_FW,
			FLASH_PHY_FW_IMAGE_MAX_SIZE_g3, IMAGE_FIRMWARE_PHY}
3266
	};
3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284

	struct flash_comp gen2_flash_types[] = {
		{ FLASH_iSCSI_PRIMARY_IMAGE_START_g2, OPTYPE_ISCSI_ACTIVE,
			FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_iSCSI},
		{ FLASH_REDBOOT_START_g2, OPTYPE_REDBOOT,
			FLASH_REDBOOT_IMAGE_MAX_SIZE_g2, IMAGE_BOOT_CODE},
		{ FLASH_iSCSI_BIOS_START_g2, OPTYPE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g2, IMAGE_OPTION_ROM_ISCSI},
		{ FLASH_PXE_BIOS_START_g2, OPTYPE_PXE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g2, IMAGE_OPTION_ROM_PXE},
		{ FLASH_FCoE_BIOS_START_g2, OPTYPE_FCOE_BIOS,
			FLASH_BIOS_IMAGE_MAX_SIZE_g2, IMAGE_OPTION_ROM_FCoE},
		{ FLASH_iSCSI_BACKUP_IMAGE_START_g2, OPTYPE_ISCSI_BACKUP,
			FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_iSCSI},
		{ FLASH_FCoE_PRIMARY_IMAGE_START_g2, OPTYPE_FCOE_FW_ACTIVE,
			FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_FCoE},
		{ FLASH_FCoE_BACKUP_IMAGE_START_g2, OPTYPE_FCOE_FW_BACKUP,
			 FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE}
3285 3286
	};

3287
	if (BE3_chip(adapter)) {
3288 3289
		pflashcomp = gen3_flash_types;
		filehdr_size = sizeof(struct flash_file_hdr_g3);
J
Joe Perches 已提交
3290
		num_comp = ARRAY_SIZE(gen3_flash_types);
3291 3292 3293
	} else {
		pflashcomp = gen2_flash_types;
		filehdr_size = sizeof(struct flash_file_hdr_g2);
J
Joe Perches 已提交
3294
		num_comp = ARRAY_SIZE(gen2_flash_types);
3295
	}
3296

3297 3298 3299 3300 3301 3302 3303
	/* Get flash section info*/
	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
	if (!fsec) {
		dev_err(&adapter->pdev->dev,
			"Invalid Cookie. UFI corrupted ?\n");
		return -1;
	}
3304
	for (i = 0; i < num_comp; i++) {
3305
		if (!is_comp_in_ufi(adapter, fsec, pflashcomp[i].img_type))
3306
			continue;
3307 3308 3309 3310 3311

		if ((pflashcomp[i].optype == OPTYPE_NCSI_FW) &&
		    memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0)
			continue;

3312 3313
		if (pflashcomp[i].optype == OPTYPE_PHY_FW  &&
		    !phy_flashing_required(adapter))
3314
				continue;
3315

3316 3317 3318 3319 3320 3321 3322
		if (pflashcomp[i].optype == OPTYPE_REDBOOT) {
			redboot = be_flash_redboot(adapter, fw->data,
				pflashcomp[i].offset, pflashcomp[i].size,
				filehdr_size + img_hdrs_size);
			if (!redboot)
				continue;
		}
3323

3324
		p = fw->data;
3325
		p += filehdr_size + pflashcomp[i].offset + img_hdrs_size;
3326 3327
		if (p + pflashcomp[i].size > fw->data + fw->size)
			return -1;
3328 3329 3330 3331 3332 3333 3334 3335

		status = be_flash(adapter, p, flash_cmd, pflashcomp[i].optype,
					pflashcomp[i].size);
		if (status) {
			dev_err(&adapter->pdev->dev,
				"Flashing section type %d failed.\n",
				pflashcomp[i].img_type);
			return status;
3336 3337 3338 3339 3340
		}
	}
	return 0;
}

3341 3342 3343
static int be_flash_skyhawk(struct be_adapter *adapter,
		const struct firmware *fw,
		struct be_dma_mem *flash_cmd, int num_of_images)
3344
{
3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410
	int status = 0, i, filehdr_size = 0;
	int img_offset, img_size, img_optype, redboot;
	int img_hdrs_size = num_of_images * sizeof(struct image_hdr);
	const u8 *p = fw->data;
	struct flash_section_info *fsec = NULL;

	filehdr_size = sizeof(struct flash_file_hdr_g3);
	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
	if (!fsec) {
		dev_err(&adapter->pdev->dev,
			"Invalid Cookie. UFI corrupted ?\n");
		return -1;
	}

	for (i = 0; i < le32_to_cpu(fsec->fsec_hdr.num_images); i++) {
		img_offset = le32_to_cpu(fsec->fsec_entry[i].offset);
		img_size   = le32_to_cpu(fsec->fsec_entry[i].pad_size);

		switch (le32_to_cpu(fsec->fsec_entry[i].type)) {
		case IMAGE_FIRMWARE_iSCSI:
			img_optype = OPTYPE_ISCSI_ACTIVE;
			break;
		case IMAGE_BOOT_CODE:
			img_optype = OPTYPE_REDBOOT;
			break;
		case IMAGE_OPTION_ROM_ISCSI:
			img_optype = OPTYPE_BIOS;
			break;
		case IMAGE_OPTION_ROM_PXE:
			img_optype = OPTYPE_PXE_BIOS;
			break;
		case IMAGE_OPTION_ROM_FCoE:
			img_optype = OPTYPE_FCOE_BIOS;
			break;
		case IMAGE_FIRMWARE_BACKUP_iSCSI:
			img_optype = OPTYPE_ISCSI_BACKUP;
			break;
		case IMAGE_NCSI:
			img_optype = OPTYPE_NCSI_FW;
			break;
		default:
			continue;
		}

		if (img_optype == OPTYPE_REDBOOT) {
			redboot = be_flash_redboot(adapter, fw->data,
					img_offset, img_size,
					filehdr_size + img_hdrs_size);
			if (!redboot)
				continue;
		}

		p = fw->data;
		p += filehdr_size + img_offset + img_hdrs_size;
		if (p + img_size > fw->data + fw->size)
			return -1;

		status = be_flash(adapter, p, flash_cmd, img_optype, img_size);
		if (status) {
			dev_err(&adapter->pdev->dev,
				"Flashing section type %d failed.\n",
				fsec->fsec_entry[i].type);
			return status;
		}
	}
	return 0;
3411 3412
}

3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446
static int lancer_wait_idle(struct be_adapter *adapter)
{
#define SLIPORT_IDLE_TIMEOUT 30
	u32 reg_val;
	int status = 0, i;

	for (i = 0; i < SLIPORT_IDLE_TIMEOUT; i++) {
		reg_val = ioread32(adapter->db + PHYSDEV_CONTROL_OFFSET);
		if ((reg_val & PHYSDEV_CONTROL_INP_MASK) == 0)
			break;

		ssleep(1);
	}

	if (i == SLIPORT_IDLE_TIMEOUT)
		status = -1;

	return status;
}

static int lancer_fw_reset(struct be_adapter *adapter)
{
	int status = 0;

	status = lancer_wait_idle(adapter);
	if (status)
		return status;

	iowrite32(PHYSDEV_CONTROL_FW_RESET_MASK, adapter->db +
		  PHYSDEV_CONTROL_OFFSET);

	return status;
}

3447 3448
static int lancer_fw_download(struct be_adapter *adapter,
				const struct firmware *fw)
3449
{
3450 3451
#define LANCER_FW_DOWNLOAD_CHUNK      (32 * 1024)
#define LANCER_FW_DOWNLOAD_LOCATION   "/prg"
3452
	struct be_dma_mem flash_cmd;
3453 3454 3455 3456 3457 3458 3459 3460
	const u8 *data_ptr = NULL;
	u8 *dest_image_ptr = NULL;
	size_t image_size = 0;
	u32 chunk_size = 0;
	u32 data_written = 0;
	u32 offset = 0;
	int status = 0;
	u8 add_status = 0;
3461
	u8 change_status;
3462

3463
	if (!IS_ALIGNED(fw->size, sizeof(u32))) {
3464
		dev_err(&adapter->pdev->dev,
3465 3466 3467 3468
			"FW Image not properly aligned. "
			"Length must be 4 byte aligned.\n");
		status = -EINVAL;
		goto lancer_fw_exit;
3469 3470
	}

3471 3472 3473
	flash_cmd.size = sizeof(struct lancer_cmd_req_write_object)
				+ LANCER_FW_DOWNLOAD_CHUNK;
	flash_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, flash_cmd.size,
3474
					  &flash_cmd.dma, GFP_KERNEL);
3475 3476 3477 3478
	if (!flash_cmd.va) {
		status = -ENOMEM;
		goto lancer_fw_exit;
	}
3479

3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491
	dest_image_ptr = flash_cmd.va +
				sizeof(struct lancer_cmd_req_write_object);
	image_size = fw->size;
	data_ptr = fw->data;

	while (image_size) {
		chunk_size = min_t(u32, image_size, LANCER_FW_DOWNLOAD_CHUNK);

		/* Copy the image chunk content. */
		memcpy(dest_image_ptr, data_ptr, chunk_size);

		status = lancer_cmd_write_object(adapter, &flash_cmd,
3492 3493 3494 3495
						 chunk_size, offset,
						 LANCER_FW_DOWNLOAD_LOCATION,
						 &data_written, &change_status,
						 &add_status);
3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506
		if (status)
			break;

		offset += data_written;
		data_ptr += data_written;
		image_size -= data_written;
	}

	if (!status) {
		/* Commit the FW written */
		status = lancer_cmd_write_object(adapter, &flash_cmd,
3507 3508 3509 3510
						 0, offset,
						 LANCER_FW_DOWNLOAD_LOCATION,
						 &data_written, &change_status,
						 &add_status);
3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522
	}

	dma_free_coherent(&adapter->pdev->dev, flash_cmd.size, flash_cmd.va,
				flash_cmd.dma);
	if (status) {
		dev_err(&adapter->pdev->dev,
			"Firmware load error. "
			"Status code: 0x%x Additional Status: 0x%x\n",
			status, add_status);
		goto lancer_fw_exit;
	}

3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536
	if (change_status == LANCER_FW_RESET_NEEDED) {
		status = lancer_fw_reset(adapter);
		if (status) {
			dev_err(&adapter->pdev->dev,
				"Adapter busy for FW reset.\n"
				"New FW will not be active.\n");
			goto lancer_fw_exit;
		}
	} else if (change_status != LANCER_NO_RESET_NEEDED) {
			dev_err(&adapter->pdev->dev,
				"System reboot required for new FW"
				" to be active\n");
	}

3537 3538 3539 3540 3541
	dev_info(&adapter->pdev->dev, "Firmware flashed successfully\n");
lancer_fw_exit:
	return status;
}

3542 3543
#define UFI_TYPE2		2
#define UFI_TYPE3		3
3544
#define UFI_TYPE3R		10
3545 3546
#define UFI_TYPE4		4
static int be_get_ufi_type(struct be_adapter *adapter,
3547
			   struct flash_file_hdr_g3 *fhdr)
3548 3549 3550 3551
{
	if (fhdr == NULL)
		goto be_get_ufi_exit;

3552 3553
	if (skyhawk_chip(adapter) && fhdr->build[0] == '4')
		return UFI_TYPE4;
3554 3555 3556 3557 3558 3559
	else if (BE3_chip(adapter) && fhdr->build[0] == '3') {
		if (fhdr->asic_type_rev == 0x10)
			return UFI_TYPE3R;
		else
			return UFI_TYPE3;
	} else if (BE2_chip(adapter) && fhdr->build[0] == '2')
3560
		return UFI_TYPE2;
3561 3562 3563 3564 3565 3566 3567

be_get_ufi_exit:
	dev_err(&adapter->pdev->dev,
		"UFI and Interface are not compatible for flashing\n");
	return -1;
}

3568 3569 3570 3571 3572 3573
static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw)
{
	struct flash_file_hdr_g3 *fhdr3;
	struct image_hdr *img_hdr_ptr = NULL;
	struct be_dma_mem flash_cmd;
	const u8 *p;
3574
	int status = 0, i = 0, num_imgs = 0, ufi_type = 0;
3575

3576
	flash_cmd.size = sizeof(struct be_cmd_write_flashrom);
I
Ivan Vecera 已提交
3577 3578
	flash_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, flash_cmd.size,
					  &flash_cmd.dma, GFP_KERNEL);
3579 3580
	if (!flash_cmd.va) {
		status = -ENOMEM;
3581
		goto be_fw_exit;
3582 3583
	}

3584
	p = fw->data;
3585
	fhdr3 = (struct flash_file_hdr_g3 *)p;
3586

3587
	ufi_type = be_get_ufi_type(adapter, fhdr3);
3588 3589 3590 3591 3592 3593 3594

	num_imgs = le32_to_cpu(fhdr3->num_imgs);
	for (i = 0; i < num_imgs; i++) {
		img_hdr_ptr = (struct image_hdr *)(fw->data +
				(sizeof(struct flash_file_hdr_g3) +
				 i * sizeof(struct image_hdr)));
		if (le32_to_cpu(img_hdr_ptr->imageid) == 1) {
3595 3596
			switch (ufi_type) {
			case UFI_TYPE4:
3597 3598
				status = be_flash_skyhawk(adapter, fw,
							&flash_cmd, num_imgs);
3599 3600
				break;
			case UFI_TYPE3R:
3601 3602
				status = be_flash_BEx(adapter, fw, &flash_cmd,
						      num_imgs);
3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615
				break;
			case UFI_TYPE3:
				/* Do not flash this ufi on BE3-R cards */
				if (adapter->asic_rev < 0x10)
					status = be_flash_BEx(adapter, fw,
							      &flash_cmd,
							      num_imgs);
				else {
					status = -1;
					dev_err(&adapter->pdev->dev,
						"Can't load BE3 UFI on BE3R\n");
				}
			}
3616
		}
3617 3618
	}

3619 3620
	if (ufi_type == UFI_TYPE2)
		status = be_flash_BEx(adapter, fw, &flash_cmd, 0);
3621
	else if (ufi_type == -1)
3622
		status = -1;
3623

I
Ivan Vecera 已提交
3624 3625
	dma_free_coherent(&adapter->pdev->dev, flash_cmd.size, flash_cmd.va,
			  flash_cmd.dma);
3626 3627
	if (status) {
		dev_err(&adapter->pdev->dev, "Firmware load error\n");
3628
		goto be_fw_exit;
3629 3630
	}

3631
	dev_info(&adapter->pdev->dev, "Firmware flashed successfully\n");
3632

3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658
be_fw_exit:
	return status;
}

int be_load_fw(struct be_adapter *adapter, u8 *fw_file)
{
	const struct firmware *fw;
	int status;

	if (!netif_running(adapter->netdev)) {
		dev_err(&adapter->pdev->dev,
			"Firmware load not allowed (interface is down)\n");
		return -1;
	}

	status = request_firmware(&fw, fw_file, &adapter->pdev->dev);
	if (status)
		goto fw_exit;

	dev_info(&adapter->pdev->dev, "Flashing firmware file %s\n", fw_file);

	if (lancer_chip(adapter))
		status = lancer_fw_download(adapter, fw);
	else
		status = be_fw_download(adapter, fw);

3659 3660 3661 3662 3663
fw_exit:
	release_firmware(fw);
	return status;
}

3664
static const struct net_device_ops be_netdev_ops = {
S
Sathya Perla 已提交
3665 3666 3667
	.ndo_open		= be_open,
	.ndo_stop		= be_close,
	.ndo_start_xmit		= be_xmit,
3668
	.ndo_set_rx_mode	= be_set_rx_mode,
S
Sathya Perla 已提交
3669 3670
	.ndo_set_mac_address	= be_mac_addr_set,
	.ndo_change_mtu		= be_change_mtu,
3671
	.ndo_get_stats64	= be_get_stats64,
S
Sathya Perla 已提交
3672 3673 3674
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_vlan_rx_add_vid	= be_vlan_add_vid,
	.ndo_vlan_rx_kill_vid	= be_vlan_rem_vid,
3675
	.ndo_set_vf_mac		= be_set_vf_mac,
3676
	.ndo_set_vf_vlan	= be_set_vf_vlan,
3677
	.ndo_set_vf_tx_rate	= be_set_vf_tx_rate,
I
Ivan Vecera 已提交
3678 3679 3680 3681
	.ndo_get_vf_config	= be_get_vf_config,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= be_netpoll,
#endif
S
Sathya Perla 已提交
3682 3683 3684 3685 3686
};

static void be_netdev_init(struct net_device *netdev)
{
	struct be_adapter *adapter = netdev_priv(netdev);
S
Sathya Perla 已提交
3687
	struct be_eq_obj *eqo;
3688
	int i;
S
Sathya Perla 已提交
3689

3690
	netdev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
3691
		NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
3692
		NETIF_F_HW_VLAN_CTAG_TX;
3693 3694
	if (be_multi_rxq(adapter))
		netdev->hw_features |= NETIF_F_RXHASH;
3695 3696

	netdev->features |= netdev->hw_features |
3697
		NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_FILTER;
A
Ajit Khaparde 已提交
3698

3699
	netdev->vlan_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
3700
		NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
3701

3702 3703
	netdev->priv_flags |= IFF_UNICAST_FLT;

S
Sathya Perla 已提交
3704 3705
	netdev->flags |= IFF_MULTICAST;

3706
	netif_set_gso_max_size(netdev, 65535 - ETH_HLEN);
3707

S
Sathya Perla 已提交
3708
	netdev->netdev_ops = &be_netdev_ops;
S
Sathya Perla 已提交
3709 3710 3711

	SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);

S
Sathya Perla 已提交
3712 3713
	for_all_evt_queues(adapter, eqo, i)
		netif_napi_add(netdev, &eqo->napi, be_poll, BE_NAPI_WEIGHT);
S
Sathya Perla 已提交
3714 3715 3716 3717
}

static void be_unmap_pci_bars(struct be_adapter *adapter)
{
3718 3719
	if (adapter->csr)
		pci_iounmap(adapter->pdev, adapter->csr);
3720
	if (adapter->db)
S
Sathya Perla 已提交
3721
		pci_iounmap(adapter->pdev, adapter->db);
3722 3723
}

S
Sathya Perla 已提交
3724 3725 3726 3727 3728 3729 3730 3731 3732
static int db_bar(struct be_adapter *adapter)
{
	if (lancer_chip(adapter) || !be_physfn(adapter))
		return 0;
	else
		return 4;
}

static int be_roce_map_pci_bars(struct be_adapter *adapter)
3733
{
S
Sathya Perla 已提交
3734
	if (skyhawk_chip(adapter)) {
S
Sathya Perla 已提交
3735 3736 3737 3738 3739 3740
		adapter->roce_db.size = 4096;
		adapter->roce_db.io_addr = pci_resource_start(adapter->pdev,
							      db_bar(adapter));
		adapter->roce_db.total_size = pci_resource_len(adapter->pdev,
							       db_bar(adapter));
	}
3741
	return 0;
S
Sathya Perla 已提交
3742 3743 3744 3745 3746
}

static int be_map_pci_bars(struct be_adapter *adapter)
{
	u8 __iomem *addr;
S
Sathya Perla 已提交
3747
	u32 sli_intf;
S
Sathya Perla 已提交
3748

S
Sathya Perla 已提交
3749 3750 3751
	pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);
	adapter->if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >>
				SLI_INTF_IF_TYPE_SHIFT;
3752

3753 3754 3755 3756 3757 3758
	if (BEx_chip(adapter) && be_physfn(adapter)) {
		adapter->csr = pci_iomap(adapter->pdev, 2, 0);
		if (adapter->csr == NULL)
			return -ENOMEM;
	}

S
Sathya Perla 已提交
3759
	addr = pci_iomap(adapter->pdev, db_bar(adapter), 0);
S
Sathya Perla 已提交
3760 3761
	if (addr == NULL)
		goto pci_map_err;
3762
	adapter->db = addr;
S
Sathya Perla 已提交
3763 3764

	be_roce_map_pci_bars(adapter);
S
Sathya Perla 已提交
3765
	return 0;
S
Sathya Perla 已提交
3766

S
Sathya Perla 已提交
3767 3768 3769 3770 3771 3772 3773
pci_map_err:
	be_unmap_pci_bars(adapter);
	return -ENOMEM;
}

static void be_ctrl_cleanup(struct be_adapter *adapter)
{
3774
	struct be_dma_mem *mem = &adapter->mbox_mem_alloced;
S
Sathya Perla 已提交
3775 3776 3777 3778

	be_unmap_pci_bars(adapter);

	if (mem->va)
I
Ivan Vecera 已提交
3779 3780
		dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
				  mem->dma);
3781

3782
	mem = &adapter->rx_filter;
3783
	if (mem->va)
I
Ivan Vecera 已提交
3784 3785
		dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
				  mem->dma);
S
Sathya Perla 已提交
3786 3787 3788 3789
}

static int be_ctrl_init(struct be_adapter *adapter)
{
3790 3791
	struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced;
	struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem;
3792
	struct be_dma_mem *rx_filter = &adapter->rx_filter;
S
Sathya Perla 已提交
3793
	u32 sli_intf;
S
Sathya Perla 已提交
3794 3795
	int status;

S
Sathya Perla 已提交
3796 3797 3798 3799 3800
	pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);
	adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >>
				 SLI_INTF_FAMILY_SHIFT;
	adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0;

S
Sathya Perla 已提交
3801 3802
	status = be_map_pci_bars(adapter);
	if (status)
3803
		goto done;
S
Sathya Perla 已提交
3804 3805

	mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16;
I
Ivan Vecera 已提交
3806 3807 3808 3809
	mbox_mem_alloc->va = dma_alloc_coherent(&adapter->pdev->dev,
						mbox_mem_alloc->size,
						&mbox_mem_alloc->dma,
						GFP_KERNEL);
S
Sathya Perla 已提交
3810
	if (!mbox_mem_alloc->va) {
3811 3812
		status = -ENOMEM;
		goto unmap_pci_bars;
S
Sathya Perla 已提交
3813 3814 3815 3816 3817
	}
	mbox_mem_align->size = sizeof(struct be_mcc_mailbox);
	mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
	mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
	memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
3818

3819 3820
	rx_filter->size = sizeof(struct be_cmd_req_rx_filter);
	rx_filter->va = dma_alloc_coherent(&adapter->pdev->dev, rx_filter->size,
3821 3822
					   &rx_filter->dma,
					   GFP_KERNEL | __GFP_ZERO);
3823
	if (rx_filter->va == NULL) {
3824 3825 3826
		status = -ENOMEM;
		goto free_mbox;
	}
3827

3828
	mutex_init(&adapter->mbox_lock);
3829 3830
	spin_lock_init(&adapter->mcc_lock);
	spin_lock_init(&adapter->mcc_cq_lock);
3831

3832
	init_completion(&adapter->flash_compl);
3833
	pci_save_state(adapter->pdev);
S
Sathya Perla 已提交
3834
	return 0;
3835 3836

free_mbox:
I
Ivan Vecera 已提交
3837 3838
	dma_free_coherent(&adapter->pdev->dev, mbox_mem_alloc->size,
			  mbox_mem_alloc->va, mbox_mem_alloc->dma);
3839 3840 3841 3842 3843 3844

unmap_pci_bars:
	be_unmap_pci_bars(adapter);

done:
	return status;
S
Sathya Perla 已提交
3845 3846 3847 3848
}

static void be_stats_cleanup(struct be_adapter *adapter)
{
3849
	struct be_dma_mem *cmd = &adapter->stats_cmd;
S
Sathya Perla 已提交
3850 3851

	if (cmd->va)
I
Ivan Vecera 已提交
3852 3853
		dma_free_coherent(&adapter->pdev->dev, cmd->size,
				  cmd->va, cmd->dma);
S
Sathya Perla 已提交
3854 3855 3856 3857
}

static int be_stats_init(struct be_adapter *adapter)
{
3858
	struct be_dma_mem *cmd = &adapter->stats_cmd;
S
Sathya Perla 已提交
3859

3860 3861 3862
	if (lancer_chip(adapter))
		cmd->size = sizeof(struct lancer_cmd_req_pport_stats);
	else if (BE2_chip(adapter))
3863
		cmd->size = sizeof(struct be_cmd_req_get_stats_v0);
3864 3865 3866 3867
	else
		/* BE3 and Skyhawk */
		cmd->size = sizeof(struct be_cmd_req_get_stats_v1);

I
Ivan Vecera 已提交
3868
	cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma,
3869
				     GFP_KERNEL | __GFP_ZERO);
S
Sathya Perla 已提交
3870 3871 3872 3873 3874
	if (cmd->va == NULL)
		return -1;
	return 0;
}

B
Bill Pemberton 已提交
3875
static void be_remove(struct pci_dev *pdev)
S
Sathya Perla 已提交
3876 3877
{
	struct be_adapter *adapter = pci_get_drvdata(pdev);
3878

S
Sathya Perla 已提交
3879 3880 3881
	if (!adapter)
		return;

3882
	be_roce_dev_remove(adapter);
3883
	be_intr_set(adapter, false);
3884

3885 3886
	cancel_delayed_work_sync(&adapter->func_recovery_work);

S
Sathya Perla 已提交
3887 3888
	unregister_netdev(adapter->netdev);

3889 3890
	be_clear(adapter);

3891 3892 3893
	/* tell fw we're done with firing cmds */
	be_cmd_fw_clean(adapter);

S
Sathya Perla 已提交
3894 3895 3896 3897
	be_stats_cleanup(adapter);

	be_ctrl_cleanup(adapter);

S
Sathya Perla 已提交
3898 3899
	pci_disable_pcie_error_reporting(pdev);

S
Sathya Perla 已提交
3900 3901 3902 3903 3904 3905 3906
	pci_set_drvdata(pdev, NULL);
	pci_release_regions(pdev);
	pci_disable_device(pdev);

	free_netdev(adapter->netdev);
}

3907 3908 3909 3910 3911 3912
bool be_is_wol_supported(struct be_adapter *adapter)
{
	return ((adapter->wol_cap & BE_WOL_CAP) &&
		!be_is_wol_excluded(adapter)) ? true : false;
}

3913 3914 3915 3916 3917 3918 3919 3920
u32 be_get_fw_log_level(struct be_adapter *adapter)
{
	struct be_dma_mem extfat_cmd;
	struct be_fat_conf_params *cfgs;
	int status;
	u32 level = 0;
	int j;

3921 3922 3923
	if (lancer_chip(adapter))
		return 0;

3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938
	memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
	extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
	extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,
					     &extfat_cmd.dma);

	if (!extfat_cmd.va) {
		dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
			__func__);
		goto err;
	}

	status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
	if (!status) {
		cfgs = (struct be_fat_conf_params *)(extfat_cmd.va +
						sizeof(struct be_cmd_resp_hdr));
3939
		for (j = 0; j < le32_to_cpu(cfgs->module[0].num_modes); j++) {
3940 3941 3942 3943 3944 3945 3946 3947 3948
			if (cfgs->module[0].trace_lvl[j].mode == MODE_UART)
				level = cfgs->module[0].trace_lvl[j].dbg_lvl;
		}
	}
	pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va,
			    extfat_cmd.dma);
err:
	return level;
}
3949

3950
static int be_get_initial_config(struct be_adapter *adapter)
S
Sathya Perla 已提交
3951 3952
{
	int status;
3953
	u32 level;
S
Sathya Perla 已提交
3954

3955 3956 3957 3958
	status = be_cmd_get_cntl_attributes(adapter);
	if (status)
		return status;

3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969
	status = be_cmd_get_acpi_wol_cap(adapter);
	if (status) {
		/* in case of a failure to get wol capabillities
		 * check the exclusion list to determine WOL capability */
		if (!be_is_wol_excluded(adapter))
			adapter->wol_cap |= BE_WOL_CAP;
	}

	if (be_is_wol_supported(adapter))
		adapter->wol = true;

3970 3971 3972
	/* Must be a power of 2 or else MODULO will BUG_ON */
	adapter->be_get_temp_freq = 64;

3973 3974 3975
	level = be_get_fw_log_level(adapter);
	adapter->msg_enable = level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0;

3976
	return 0;
S
Sathya Perla 已提交
3977 3978
}

3979
static int lancer_recover_func(struct be_adapter *adapter)
3980 3981 3982
{
	int status;

3983 3984 3985
	status = lancer_test_and_set_rdy_state(adapter);
	if (status)
		goto err;
3986

3987 3988
	if (netif_running(adapter->netdev))
		be_close(adapter->netdev);
3989

3990 3991 3992 3993 3994 3995 3996 3997
	be_clear(adapter);

	adapter->hw_error = false;
	adapter->fw_timeout = false;

	status = be_setup(adapter);
	if (status)
		goto err;
3998

3999 4000
	if (netif_running(adapter->netdev)) {
		status = be_open(adapter->netdev);
4001 4002
		if (status)
			goto err;
4003
	}
4004

4005 4006 4007 4008
	dev_err(&adapter->pdev->dev,
		"Adapter SLIPORT recovery succeeded\n");
	return 0;
err:
4009 4010 4011
	if (adapter->eeh_error)
		dev_err(&adapter->pdev->dev,
			"Adapter SLIPORT recovery failed\n");
4012

4013 4014 4015 4016 4017 4018 4019 4020
	return status;
}

static void be_func_recovery_task(struct work_struct *work)
{
	struct be_adapter *adapter =
		container_of(work, struct be_adapter,  func_recovery_work.work);
	int status;
4021

4022
	be_detect_error(adapter);
4023

4024
	if (adapter->hw_error && lancer_chip(adapter)) {
4025

4026 4027
		if (adapter->eeh_error)
			goto out;
4028

4029 4030 4031
		rtnl_lock();
		netif_device_detach(adapter->netdev);
		rtnl_unlock();
4032

4033
		status = lancer_recover_func(adapter);
4034

4035 4036
		if (!status)
			netif_device_attach(adapter->netdev);
4037
	}
4038 4039 4040 4041

out:
	schedule_delayed_work(&adapter->func_recovery_work,
			      msecs_to_jiffies(1000));
4042 4043 4044 4045 4046 4047 4048
}

static void be_worker(struct work_struct *work)
{
	struct be_adapter *adapter =
		container_of(work, struct be_adapter, work.work);
	struct be_rx_obj *rxo;
S
Sathya Perla 已提交
4049
	struct be_eq_obj *eqo;
4050 4051 4052 4053 4054
	int i;

	/* when interrupts are not yet enabled, just reap any pending
	* mcc completions */
	if (!netif_running(adapter->netdev)) {
4055
		local_bh_disable();
S
Sathya Perla 已提交
4056
		be_process_mcc(adapter);
4057
		local_bh_enable();
4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068
		goto reschedule;
	}

	if (!adapter->stats_cmd_sent) {
		if (lancer_chip(adapter))
			lancer_cmd_get_pport_stats(adapter,
						&adapter->stats_cmd);
		else
			be_cmd_get_stats(adapter, &adapter->stats_cmd);
	}

4069 4070 4071
	if (MODULO(adapter->work_counter, adapter->be_get_temp_freq) == 0)
		be_cmd_get_die_temperature(adapter);

4072 4073 4074 4075 4076 4077 4078
	for_all_rx_queues(adapter, rxo, i) {
		if (rxo->rx_post_starved) {
			rxo->rx_post_starved = false;
			be_post_rx_frags(rxo, GFP_KERNEL);
		}
	}

S
Sathya Perla 已提交
4079 4080 4081
	for_all_evt_queues(adapter, eqo, i)
		be_eqd_update(adapter, eqo);

4082 4083 4084 4085 4086
reschedule:
	adapter->work_counter++;
	schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
}

4087 4088
static bool be_reset_required(struct be_adapter *adapter)
{
4089
	return be_find_vfs(adapter, ENABLED) > 0 ? false : true;
4090 4091
}

S
Sathya Perla 已提交
4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108
static char *mc_name(struct be_adapter *adapter)
{
	if (adapter->function_mode & FLEX10_MODE)
		return "FLEX10";
	else if (adapter->function_mode & VNIC_MODE)
		return "vNIC";
	else if (adapter->function_mode & UMC_ENABLED)
		return "UMC";
	else
		return "";
}

static inline char *func_name(struct be_adapter *adapter)
{
	return be_physfn(adapter) ? "PF" : "VF";
}

4109
static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
S
Sathya Perla 已提交
4110 4111 4112 4113
{
	int status = 0;
	struct be_adapter *adapter;
	struct net_device *netdev;
4114
	char port_name;
S
Sathya Perla 已提交
4115 4116 4117 4118 4119 4120 4121 4122 4123 4124

	status = pci_enable_device(pdev);
	if (status)
		goto do_none;

	status = pci_request_regions(pdev, DRV_NAME);
	if (status)
		goto disable_dev;
	pci_set_master(pdev);

4125
	netdev = alloc_etherdev_mqs(sizeof(*adapter), MAX_TX_QS, MAX_RX_QS);
S
Sathya Perla 已提交
4126 4127 4128 4129 4130 4131 4132 4133
	if (netdev == NULL) {
		status = -ENOMEM;
		goto rel_reg;
	}
	adapter = netdev_priv(netdev);
	adapter->pdev = pdev;
	pci_set_drvdata(pdev, adapter);
	adapter->netdev = netdev;
4134
	SET_NETDEV_DEV(netdev, &pdev->dev);
S
Sathya Perla 已提交
4135

I
Ivan Vecera 已提交
4136
	status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
S
Sathya Perla 已提交
4137
	if (!status) {
4138 4139 4140 4141 4142
		status = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
		if (status < 0) {
			dev_err(&pdev->dev, "dma_set_coherent_mask failed\n");
			goto free_netdev;
		}
S
Sathya Perla 已提交
4143 4144
		netdev->features |= NETIF_F_HIGHDMA;
	} else {
I
Ivan Vecera 已提交
4145
		status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
S
Sathya Perla 已提交
4146 4147 4148 4149 4150 4151
		if (status) {
			dev_err(&pdev->dev, "Could not set PCI DMA Mask\n");
			goto free_netdev;
		}
	}

S
Sathya Perla 已提交
4152 4153 4154 4155
	status = pci_enable_pcie_error_reporting(pdev);
	if (status)
		dev_err(&pdev->dev, "Could not use PCIe error reporting\n");

S
Sathya Perla 已提交
4156 4157
	status = be_ctrl_init(adapter);
	if (status)
4158
		goto free_netdev;
S
Sathya Perla 已提交
4159

4160
	/* sync up with fw's ready state */
4161
	if (be_physfn(adapter)) {
4162
		status = be_fw_wait_ready(adapter);
4163 4164 4165
		if (status)
			goto ctrl_clean;
	}
S
Sathya Perla 已提交
4166

4167 4168
	/* tell fw we're ready to fire cmds */
	status = be_cmd_fw_init(adapter);
S
Sathya Perla 已提交
4169
	if (status)
4170 4171
		goto ctrl_clean;

4172 4173 4174 4175 4176
	if (be_reset_required(adapter)) {
		status = be_cmd_reset_function(adapter);
		if (status)
			goto ctrl_clean;
	}
4177

4178 4179 4180 4181 4182
	/* Wait for interrupts to quiesce after an FLR */
	msleep(100);

	/* Allow interrupts for other ULPs running on NIC function */
	be_intr_set(adapter, true);
S
Sathya Perla 已提交
4183

4184 4185 4186 4187
	status = be_stats_init(adapter);
	if (status)
		goto ctrl_clean;

4188
	status = be_get_initial_config(adapter);
S
Sathya Perla 已提交
4189 4190 4191 4192
	if (status)
		goto stats_clean;

	INIT_DELAYED_WORK(&adapter->work, be_worker);
4193
	INIT_DELAYED_WORK(&adapter->func_recovery_work, be_func_recovery_task);
4194
	adapter->rx_fc = adapter->tx_fc = true;
S
Sathya Perla 已提交
4195

4196 4197
	status = be_setup(adapter);
	if (status)
4198
		goto stats_clean;
4199

4200
	be_netdev_init(netdev);
S
Sathya Perla 已提交
4201 4202
	status = register_netdev(netdev);
	if (status != 0)
4203
		goto unsetup;
S
Sathya Perla 已提交
4204

4205 4206
	be_roce_dev_add(adapter);

4207 4208
	schedule_delayed_work(&adapter->func_recovery_work,
			      msecs_to_jiffies(1000));
4209 4210 4211

	be_cmd_query_port_name(adapter, &port_name);

S
Sathya Perla 已提交
4212 4213
	dev_info(&pdev->dev, "%s: %s %s port %c\n", nic_name(pdev),
		 func_name(adapter), mc_name(adapter), port_name);
4214

S
Sathya Perla 已提交
4215 4216
	return 0;

4217 4218
unsetup:
	be_clear(adapter);
S
Sathya Perla 已提交
4219 4220 4221 4222
stats_clean:
	be_stats_cleanup(adapter);
ctrl_clean:
	be_ctrl_cleanup(adapter);
4223
free_netdev:
4224
	free_netdev(netdev);
4225
	pci_set_drvdata(pdev, NULL);
S
Sathya Perla 已提交
4226 4227 4228 4229 4230
rel_reg:
	pci_release_regions(pdev);
disable_dev:
	pci_disable_device(pdev);
do_none:
4231
	dev_err(&pdev->dev, "%s initialization failed\n", nic_name(pdev));
S
Sathya Perla 已提交
4232 4233 4234 4235 4236 4237 4238 4239
	return status;
}

static int be_suspend(struct pci_dev *pdev, pm_message_t state)
{
	struct be_adapter *adapter = pci_get_drvdata(pdev);
	struct net_device *netdev =  adapter->netdev;

4240 4241 4242
	if (adapter->wol)
		be_setup_wol(adapter, true);

4243 4244
	cancel_delayed_work_sync(&adapter->func_recovery_work);

S
Sathya Perla 已提交
4245 4246 4247 4248 4249 4250
	netif_device_detach(netdev);
	if (netif_running(netdev)) {
		rtnl_lock();
		be_close(netdev);
		rtnl_unlock();
	}
4251
	be_clear(adapter);
S
Sathya Perla 已提交
4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273

	pci_save_state(pdev);
	pci_disable_device(pdev);
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
	return 0;
}

static int be_resume(struct pci_dev *pdev)
{
	int status = 0;
	struct be_adapter *adapter = pci_get_drvdata(pdev);
	struct net_device *netdev =  adapter->netdev;

	netif_device_detach(netdev);

	status = pci_enable_device(pdev);
	if (status)
		return status;

	pci_set_power_state(pdev, 0);
	pci_restore_state(pdev);

4274 4275 4276 4277 4278
	/* tell fw we're ready to fire cmds */
	status = be_cmd_fw_init(adapter);
	if (status)
		return status;

4279
	be_setup(adapter);
S
Sathya Perla 已提交
4280 4281 4282 4283 4284
	if (netif_running(netdev)) {
		rtnl_lock();
		be_open(netdev);
		rtnl_unlock();
	}
4285 4286 4287

	schedule_delayed_work(&adapter->func_recovery_work,
			      msecs_to_jiffies(1000));
S
Sathya Perla 已提交
4288
	netif_device_attach(netdev);
4289 4290 4291

	if (adapter->wol)
		be_setup_wol(adapter, false);
4292

S
Sathya Perla 已提交
4293 4294 4295
	return 0;
}

4296 4297 4298 4299 4300 4301 4302
/*
 * An FLR will stop BE from DMAing any data.
 */
static void be_shutdown(struct pci_dev *pdev)
{
	struct be_adapter *adapter = pci_get_drvdata(pdev);

4303 4304
	if (!adapter)
		return;
4305

4306
	cancel_delayed_work_sync(&adapter->work);
4307
	cancel_delayed_work_sync(&adapter->func_recovery_work);
4308

4309
	netif_device_detach(adapter->netdev);
4310

4311 4312
	be_cmd_reset_function(adapter);

4313 4314 4315
	pci_disable_device(pdev);
}

4316 4317 4318 4319 4320 4321 4322 4323
static pci_ers_result_t be_eeh_err_detected(struct pci_dev *pdev,
				pci_channel_state_t state)
{
	struct be_adapter *adapter = pci_get_drvdata(pdev);
	struct net_device *netdev =  adapter->netdev;

	dev_err(&adapter->pdev->dev, "EEH error detected\n");

4324 4325 4326
	adapter->eeh_error = true;

	cancel_delayed_work_sync(&adapter->func_recovery_work);
4327

4328
	rtnl_lock();
4329
	netif_device_detach(netdev);
4330
	rtnl_unlock();
4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343

	if (netif_running(netdev)) {
		rtnl_lock();
		be_close(netdev);
		rtnl_unlock();
	}
	be_clear(adapter);

	if (state == pci_channel_io_perm_failure)
		return PCI_ERS_RESULT_DISCONNECT;

	pci_disable_device(pdev);

4344 4345
	/* The error could cause the FW to trigger a flash debug dump.
	 * Resetting the card while flash dump is in progress
4346 4347 4348
	 * can cause it not to recover; wait for it to finish.
	 * Wait only for first function as it is needed only once per
	 * adapter.
4349
	 */
4350 4351 4352
	if (pdev->devfn == 0)
		ssleep(30);

4353 4354 4355 4356 4357 4358 4359 4360 4361
	return PCI_ERS_RESULT_NEED_RESET;
}

static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev)
{
	struct be_adapter *adapter = pci_get_drvdata(pdev);
	int status;

	dev_info(&adapter->pdev->dev, "EEH reset\n");
4362
	be_clear_all_error(adapter);
4363 4364 4365 4366 4367 4368 4369 4370 4371 4372

	status = pci_enable_device(pdev);
	if (status)
		return PCI_ERS_RESULT_DISCONNECT;

	pci_set_master(pdev);
	pci_set_power_state(pdev, 0);
	pci_restore_state(pdev);

	/* Check if card is ok and fw is ready */
4373 4374
	dev_info(&adapter->pdev->dev,
		 "Waiting for FW to be ready after EEH reset\n");
4375
	status = be_fw_wait_ready(adapter);
4376 4377 4378
	if (status)
		return PCI_ERS_RESULT_DISCONNECT;

S
Sathya Perla 已提交
4379
	pci_cleanup_aer_uncorrect_error_status(pdev);
4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397
	return PCI_ERS_RESULT_RECOVERED;
}

static void be_eeh_resume(struct pci_dev *pdev)
{
	int status = 0;
	struct be_adapter *adapter = pci_get_drvdata(pdev);
	struct net_device *netdev =  adapter->netdev;

	dev_info(&adapter->pdev->dev, "EEH resume\n");

	pci_save_state(pdev);

	/* tell fw we're ready to fire cmds */
	status = be_cmd_fw_init(adapter);
	if (status)
		goto err;

4398 4399 4400 4401
	status = be_cmd_reset_function(adapter);
	if (status)
		goto err;

4402 4403 4404 4405 4406 4407 4408 4409 4410
	status = be_setup(adapter);
	if (status)
		goto err;

	if (netif_running(netdev)) {
		status = be_open(netdev);
		if (status)
			goto err;
	}
4411 4412 4413

	schedule_delayed_work(&adapter->func_recovery_work,
			      msecs_to_jiffies(1000));
4414 4415 4416 4417 4418 4419
	netif_device_attach(netdev);
	return;
err:
	dev_err(&adapter->pdev->dev, "EEH resume failed\n");
}

4420
static const struct pci_error_handlers be_eeh_handlers = {
4421 4422 4423 4424 4425
	.error_detected = be_eeh_err_detected,
	.slot_reset = be_eeh_reset,
	.resume = be_eeh_resume,
};

S
Sathya Perla 已提交
4426 4427 4428 4429 4430 4431
static struct pci_driver be_driver = {
	.name = DRV_NAME,
	.id_table = be_dev_ids,
	.probe = be_probe,
	.remove = be_remove,
	.suspend = be_suspend,
4432
	.resume = be_resume,
4433
	.shutdown = be_shutdown,
4434
	.err_handler = &be_eeh_handlers
S
Sathya Perla 已提交
4435 4436 4437 4438
};

static int __init be_init_module(void)
{
4439 4440
	if (rx_frag_size != 8192 && rx_frag_size != 4096 &&
	    rx_frag_size != 2048) {
S
Sathya Perla 已提交
4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455
		printk(KERN_WARNING DRV_NAME
			" : Module param rx_frag_size must be 2048/4096/8192."
			" Using 2048\n");
		rx_frag_size = 2048;
	}

	return pci_register_driver(&be_driver);
}
module_init(be_init_module);

static void __exit be_exit_module(void)
{
	pci_unregister_driver(&be_driver);
}
module_exit(be_exit_module);