1 /*
2  * This file is part of the Chelsio T4 Ethernet driver for Linux.
3  *
4  * Copyright (c) 2003-2016 Chelsio Communications, Inc. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  */
34 
35 #include <linux/delay.h>
36 #include "cxgb4.h"
37 #include "t4_regs.h"
38 #include "t4_values.h"
39 #include "t4fw_api.h"
40 #include "t4fw_version.h"
41 
42 /**
43  *	t4_wait_op_done_val - wait until an operation is completed
44  *	@adapter: the adapter performing the operation
45  *	@reg: the register to check for completion
46  *	@mask: a single-bit field within @reg that indicates completion
47  *	@polarity: the value of the field when the operation is completed
48  *	@attempts: number of check iterations
49  *	@delay: delay in usecs between iterations
50  *	@valp: where to store the value of the register at completion time
51  *
52  *	Wait until an operation is completed by checking a bit in a register
53  *	up to @attempts times.  If @valp is not NULL the value of the register
54  *	at the time it indicated completion is stored there.  Returns 0 if the
55  *	operation completes and	-EAGAIN	otherwise.
56  */
57 static int t4_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
58 			       int polarity, int attempts, int delay, u32 *valp)
59 {
60 	while (1) {
61 		u32 val = t4_read_reg(adapter, reg);
62 
63 		if (!!(val & mask) == polarity) {
64 			if (valp)
65 				*valp = val;
66 			return 0;
67 		}
68 		if (--attempts == 0)
69 			return -EAGAIN;
70 		if (delay)
71 			udelay(delay);
72 	}
73 }
74 
75 static inline int t4_wait_op_done(struct adapter *adapter, int reg, u32 mask,
76 				  int polarity, int attempts, int delay)
77 {
78 	return t4_wait_op_done_val(adapter, reg, mask, polarity, attempts,
79 				   delay, NULL);
80 }
81 
82 /**
83  *	t4_set_reg_field - set a register field to a value
84  *	@adapter: the adapter to program
85  *	@addr: the register address
86  *	@mask: specifies the portion of the register to modify
87  *	@val: the new value for the register field
88  *
89  *	Sets a register field specified by the supplied mask to the
90  *	given value.
91  */
92 void t4_set_reg_field(struct adapter *adapter, unsigned int addr, u32 mask,
93 		      u32 val)
94 {
95 	u32 v = t4_read_reg(adapter, addr) & ~mask;
96 
97 	t4_write_reg(adapter, addr, v | val);
98 	(void) t4_read_reg(adapter, addr);      /* flush */
99 }
100 
101 /**
102  *	t4_read_indirect - read indirectly addressed registers
103  *	@adap: the adapter
104  *	@addr_reg: register holding the indirect address
105  *	@data_reg: register holding the value of the indirect register
106  *	@vals: where the read register values are stored
107  *	@nregs: how many indirect registers to read
108  *	@start_idx: index of first indirect register to read
109  *
110  *	Reads registers that are accessed indirectly through an address/data
111  *	register pair.
112  */
113 void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
114 			     unsigned int data_reg, u32 *vals,
115 			     unsigned int nregs, unsigned int start_idx)
116 {
117 	while (nregs--) {
118 		t4_write_reg(adap, addr_reg, start_idx);
119 		*vals++ = t4_read_reg(adap, data_reg);
120 		start_idx++;
121 	}
122 }
123 
124 /**
125  *	t4_write_indirect - write indirectly addressed registers
126  *	@adap: the adapter
127  *	@addr_reg: register holding the indirect addresses
128  *	@data_reg: register holding the value for the indirect registers
129  *	@vals: values to write
130  *	@nregs: how many indirect registers to write
131  *	@start_idx: address of first indirect register to write
132  *
133  *	Writes a sequential block of registers that are accessed indirectly
134  *	through an address/data register pair.
135  */
136 void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
137 		       unsigned int data_reg, const u32 *vals,
138 		       unsigned int nregs, unsigned int start_idx)
139 {
140 	while (nregs--) {
141 		t4_write_reg(adap, addr_reg, start_idx++);
142 		t4_write_reg(adap, data_reg, *vals++);
143 	}
144 }
145 
146 /*
147  * Read a 32-bit PCI Configuration Space register via the PCI-E backdoor
148  * mechanism.  This guarantees that we get the real value even if we're
149  * operating within a Virtual Machine and the Hypervisor is trapping our
150  * Configuration Space accesses.
151  */
152 void t4_hw_pci_read_cfg4(struct adapter *adap, int reg, u32 *val)
153 {
154 	u32 req = FUNCTION_V(adap->pf) | REGISTER_V(reg);
155 
156 	if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
157 		req |= ENABLE_F;
158 	else
159 		req |= T6_ENABLE_F;
160 
161 	if (is_t4(adap->params.chip))
162 		req |= LOCALCFG_F;
163 
164 	t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, req);
165 	*val = t4_read_reg(adap, PCIE_CFG_SPACE_DATA_A);
166 
167 	/* Reset ENABLE to 0 so reads of PCIE_CFG_SPACE_DATA won't cause a
168 	 * Configuration Space read.  (None of the other fields matter when
169 	 * ENABLE is 0 so a simple register write is easier than a
170 	 * read-modify-write via t4_set_reg_field().)
171 	 */
172 	t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, 0);
173 }
174 
175 /*
176  * t4_report_fw_error - report firmware error
177  * @adap: the adapter
178  *
179  * The adapter firmware can indicate error conditions to the host.
180  * If the firmware has indicated an error, print out the reason for
181  * the firmware error.
182  */
183 static void t4_report_fw_error(struct adapter *adap)
184 {
185 	static const char *const reason[] = {
186 		"Crash",                        /* PCIE_FW_EVAL_CRASH */
187 		"During Device Preparation",    /* PCIE_FW_EVAL_PREP */
188 		"During Device Configuration",  /* PCIE_FW_EVAL_CONF */
189 		"During Device Initialization", /* PCIE_FW_EVAL_INIT */
190 		"Unexpected Event",             /* PCIE_FW_EVAL_UNEXPECTEDEVENT */
191 		"Insufficient Airflow",         /* PCIE_FW_EVAL_OVERHEAT */
192 		"Device Shutdown",              /* PCIE_FW_EVAL_DEVICESHUTDOWN */
193 		"Reserved",                     /* reserved */
194 	};
195 	u32 pcie_fw;
196 
197 	pcie_fw = t4_read_reg(adap, PCIE_FW_A);
198 	if (pcie_fw & PCIE_FW_ERR_F) {
199 		dev_err(adap->pdev_dev, "Firmware reports adapter error: %s\n",
200 			reason[PCIE_FW_EVAL_G(pcie_fw)]);
201 		adap->flags &= ~FW_OK;
202 	}
203 }
204 
205 /*
206  * Get the reply to a mailbox command and store it in @rpl in big-endian order.
207  */
208 static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit,
209 			 u32 mbox_addr)
210 {
211 	for ( ; nflit; nflit--, mbox_addr += 8)
212 		*rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr));
213 }
214 
215 /*
216  * Handle a FW assertion reported in a mailbox.
217  */
218 static void fw_asrt(struct adapter *adap, u32 mbox_addr)
219 {
220 	struct fw_debug_cmd asrt;
221 
222 	get_mbox_rpl(adap, (__be64 *)&asrt, sizeof(asrt) / 8, mbox_addr);
223 	dev_alert(adap->pdev_dev,
224 		  "FW assertion at %.16s:%u, val0 %#x, val1 %#x\n",
225 		  asrt.u.assert.filename_0_7, be32_to_cpu(asrt.u.assert.line),
226 		  be32_to_cpu(asrt.u.assert.x), be32_to_cpu(asrt.u.assert.y));
227 }
228 
229 /**
230  *	t4_record_mbox - record a Firmware Mailbox Command/Reply in the log
231  *	@adapter: the adapter
232  *	@cmd: the Firmware Mailbox Command or Reply
233  *	@size: command length in bytes
234  *	@access: the time (ms) needed to access the Firmware Mailbox
235  *	@execute: the time (ms) the command spent being executed
236  */
237 static void t4_record_mbox(struct adapter *adapter,
238 			   const __be64 *cmd, unsigned int size,
239 			   int access, int execute)
240 {
241 	struct mbox_cmd_log *log = adapter->mbox_log;
242 	struct mbox_cmd *entry;
243 	int i;
244 
245 	entry = mbox_cmd_log_entry(log, log->cursor++);
246 	if (log->cursor == log->size)
247 		log->cursor = 0;
248 
249 	for (i = 0; i < size / 8; i++)
250 		entry->cmd[i] = be64_to_cpu(cmd[i]);
251 	while (i < MBOX_LEN / 8)
252 		entry->cmd[i++] = 0;
253 	entry->timestamp = jiffies;
254 	entry->seqno = log->seqno++;
255 	entry->access = access;
256 	entry->execute = execute;
257 }
258 
259 /**
260  *	t4_wr_mbox_meat_timeout - send a command to FW through the given mailbox
261  *	@adap: the adapter
262  *	@mbox: index of the mailbox to use
263  *	@cmd: the command to write
264  *	@size: command length in bytes
265  *	@rpl: where to optionally store the reply
266  *	@sleep_ok: if true we may sleep while awaiting command completion
267  *	@timeout: time to wait for command to finish before timing out
268  *
269  *	Sends the given command to FW through the selected mailbox and waits
270  *	for the FW to execute the command.  If @rpl is not %NULL it is used to
271  *	store the FW's reply to the command.  The command and its optional
272  *	reply are of the same length.  FW can take up to %FW_CMD_MAX_TIMEOUT ms
273  *	to respond.  @sleep_ok determines whether we may sleep while awaiting
274  *	the response.  If sleeping is allowed we use progressive backoff
275  *	otherwise we spin.
276  *
277  *	The return value is 0 on success or a negative errno on failure.  A
278  *	failure can happen either because we are not able to execute the
279  *	command or FW executes it but signals an error.  In the latter case
280  *	the return value is the error code indicated by FW (negated).
281  */
282 int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
283 			    int size, void *rpl, bool sleep_ok, int timeout)
284 {
285 	static const int delay[] = {
286 		1, 1, 3, 5, 10, 10, 20, 50, 100, 200
287 	};
288 
289 	struct mbox_list entry;
290 	u16 access = 0;
291 	u16 execute = 0;
292 	u32 v;
293 	u64 res;
294 	int i, ms, delay_idx, ret;
295 	const __be64 *p = cmd;
296 	u32 data_reg = PF_REG(mbox, CIM_PF_MAILBOX_DATA_A);
297 	u32 ctl_reg = PF_REG(mbox, CIM_PF_MAILBOX_CTRL_A);
298 	__be64 cmd_rpl[MBOX_LEN / 8];
299 	u32 pcie_fw;
300 
301 	if ((size & 15) || size > MBOX_LEN)
302 		return -EINVAL;
303 
304 	/*
305 	 * If the device is off-line, as in EEH, commands will time out.
306 	 * Fail them early so we don't waste time waiting.
307 	 */
308 	if (adap->pdev->error_state != pci_channel_io_normal)
309 		return -EIO;
310 
311 	/* If we have a negative timeout, that implies that we can't sleep. */
312 	if (timeout < 0) {
313 		sleep_ok = false;
314 		timeout = -timeout;
315 	}
316 
317 	/* Queue ourselves onto the mailbox access list.  When our entry is at
318 	 * the front of the list, we have rights to access the mailbox.  So we
319 	 * wait [for a while] till we're at the front [or bail out with an
320 	 * EBUSY] ...
321 	 */
322 	spin_lock_bh(&adap->mbox_lock);
323 	list_add_tail(&entry.list, &adap->mlist.list);
324 	spin_unlock_bh(&adap->mbox_lock);
325 
326 	delay_idx = 0;
327 	ms = delay[0];
328 
329 	for (i = 0; ; i += ms) {
330 		/* If we've waited too long, return a busy indication.  This
331 		 * really ought to be based on our initial position in the
332 		 * mailbox access list but this is a start.  We very rearely
333 		 * contend on access to the mailbox ...
334 		 */
335 		pcie_fw = t4_read_reg(adap, PCIE_FW_A);
336 		if (i > FW_CMD_MAX_TIMEOUT || (pcie_fw & PCIE_FW_ERR_F)) {
337 			spin_lock_bh(&adap->mbox_lock);
338 			list_del(&entry.list);
339 			spin_unlock_bh(&adap->mbox_lock);
340 			ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -EBUSY;
341 			t4_record_mbox(adap, cmd, size, access, ret);
342 			return ret;
343 		}
344 
345 		/* If we're at the head, break out and start the mailbox
346 		 * protocol.
347 		 */
348 		if (list_first_entry(&adap->mlist.list, struct mbox_list,
349 				     list) == &entry)
350 			break;
351 
352 		/* Delay for a bit before checking again ... */
353 		if (sleep_ok) {
354 			ms = delay[delay_idx];  /* last element may repeat */
355 			if (delay_idx < ARRAY_SIZE(delay) - 1)
356 				delay_idx++;
357 			msleep(ms);
358 		} else {
359 			mdelay(ms);
360 		}
361 	}
362 
363 	/* Loop trying to get ownership of the mailbox.  Return an error
364 	 * if we can't gain ownership.
365 	 */
366 	v = MBOWNER_G(t4_read_reg(adap, ctl_reg));
367 	for (i = 0; v == MBOX_OWNER_NONE && i < 3; i++)
368 		v = MBOWNER_G(t4_read_reg(adap, ctl_reg));
369 	if (v != MBOX_OWNER_DRV) {
370 		spin_lock_bh(&adap->mbox_lock);
371 		list_del(&entry.list);
372 		spin_unlock_bh(&adap->mbox_lock);
373 		ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT;
374 		t4_record_mbox(adap, cmd, size, access, ret);
375 		return ret;
376 	}
377 
378 	/* Copy in the new mailbox command and send it on its way ... */
379 	t4_record_mbox(adap, cmd, size, access, 0);
380 	for (i = 0; i < size; i += 8)
381 		t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++));
382 
383 	t4_write_reg(adap, ctl_reg, MBMSGVALID_F | MBOWNER_V(MBOX_OWNER_FW));
384 	t4_read_reg(adap, ctl_reg);          /* flush write */
385 
386 	delay_idx = 0;
387 	ms = delay[0];
388 
389 	for (i = 0;
390 	     !((pcie_fw = t4_read_reg(adap, PCIE_FW_A)) & PCIE_FW_ERR_F) &&
391 	     i < timeout;
392 	     i += ms) {
393 		if (sleep_ok) {
394 			ms = delay[delay_idx];  /* last element may repeat */
395 			if (delay_idx < ARRAY_SIZE(delay) - 1)
396 				delay_idx++;
397 			msleep(ms);
398 		} else
399 			mdelay(ms);
400 
401 		v = t4_read_reg(adap, ctl_reg);
402 		if (MBOWNER_G(v) == MBOX_OWNER_DRV) {
403 			if (!(v & MBMSGVALID_F)) {
404 				t4_write_reg(adap, ctl_reg, 0);
405 				continue;
406 			}
407 
408 			get_mbox_rpl(adap, cmd_rpl, MBOX_LEN / 8, data_reg);
409 			res = be64_to_cpu(cmd_rpl[0]);
410 
411 			if (FW_CMD_OP_G(res >> 32) == FW_DEBUG_CMD) {
412 				fw_asrt(adap, data_reg);
413 				res = FW_CMD_RETVAL_V(EIO);
414 			} else if (rpl) {
415 				memcpy(rpl, cmd_rpl, size);
416 			}
417 
418 			t4_write_reg(adap, ctl_reg, 0);
419 
420 			execute = i + ms;
421 			t4_record_mbox(adap, cmd_rpl,
422 				       MBOX_LEN, access, execute);
423 			spin_lock_bh(&adap->mbox_lock);
424 			list_del(&entry.list);
425 			spin_unlock_bh(&adap->mbox_lock);
426 			return -FW_CMD_RETVAL_G((int)res);
427 		}
428 	}
429 
430 	ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -ETIMEDOUT;
431 	t4_record_mbox(adap, cmd, size, access, ret);
432 	dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n",
433 		*(const u8 *)cmd, mbox);
434 	t4_report_fw_error(adap);
435 	spin_lock_bh(&adap->mbox_lock);
436 	list_del(&entry.list);
437 	spin_unlock_bh(&adap->mbox_lock);
438 	t4_fatal_err(adap);
439 	return ret;
440 }
441 
442 int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size,
443 		    void *rpl, bool sleep_ok)
444 {
445 	return t4_wr_mbox_meat_timeout(adap, mbox, cmd, size, rpl, sleep_ok,
446 				       FW_CMD_MAX_TIMEOUT);
447 }
448 
449 static int t4_edc_err_read(struct adapter *adap, int idx)
450 {
451 	u32 edc_ecc_err_addr_reg;
452 	u32 rdata_reg;
453 
454 	if (is_t4(adap->params.chip)) {
455 		CH_WARN(adap, "%s: T4 NOT supported.\n", __func__);
456 		return 0;
457 	}
458 	if (idx != 0 && idx != 1) {
459 		CH_WARN(adap, "%s: idx %d NOT supported.\n", __func__, idx);
460 		return 0;
461 	}
462 
463 	edc_ecc_err_addr_reg = EDC_T5_REG(EDC_H_ECC_ERR_ADDR_A, idx);
464 	rdata_reg = EDC_T5_REG(EDC_H_BIST_STATUS_RDATA_A, idx);
465 
466 	CH_WARN(adap,
467 		"edc%d err addr 0x%x: 0x%x.\n",
468 		idx, edc_ecc_err_addr_reg,
469 		t4_read_reg(adap, edc_ecc_err_addr_reg));
470 	CH_WARN(adap,
471 		"bist: 0x%x, status %llx %llx %llx %llx %llx %llx %llx %llx %llx.\n",
472 		rdata_reg,
473 		(unsigned long long)t4_read_reg64(adap, rdata_reg),
474 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 8),
475 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 16),
476 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 24),
477 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 32),
478 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 40),
479 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 48),
480 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 56),
481 		(unsigned long long)t4_read_reg64(adap, rdata_reg + 64));
482 
483 	return 0;
484 }
485 
486 /**
487  *	t4_memory_rw - read/write EDC 0, EDC 1 or MC via PCIE memory window
488  *	@adap: the adapter
489  *	@win: PCI-E Memory Window to use
490  *	@mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC
491  *	@addr: address within indicated memory type
492  *	@len: amount of memory to transfer
493  *	@hbuf: host memory buffer
494  *	@dir: direction of transfer T4_MEMORY_READ (1) or T4_MEMORY_WRITE (0)
495  *
496  *	Reads/writes an [almost] arbitrary memory region in the firmware: the
497  *	firmware memory address and host buffer must be aligned on 32-bit
498  *	boudaries; the length may be arbitrary.  The memory is transferred as
499  *	a raw byte sequence from/to the firmware's memory.  If this memory
500  *	contains data structures which contain multi-byte integers, it's the
501  *	caller's responsibility to perform appropriate byte order conversions.
502  */
503 int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr,
504 		 u32 len, void *hbuf, int dir)
505 {
506 	u32 pos, offset, resid, memoffset;
507 	u32 edc_size, mc_size, win_pf, mem_reg, mem_aperture, mem_base;
508 	u32 *buf;
509 
510 	/* Argument sanity checks ...
511 	 */
512 	if (addr & 0x3 || (uintptr_t)hbuf & 0x3)
513 		return -EINVAL;
514 	buf = (u32 *)hbuf;
515 
516 	/* It's convenient to be able to handle lengths which aren't a
517 	 * multiple of 32-bits because we often end up transferring files to
518 	 * the firmware.  So we'll handle that by normalizing the length here
519 	 * and then handling any residual transfer at the end.
520 	 */
521 	resid = len & 0x3;
522 	len -= resid;
523 
524 	/* Offset into the region of memory which is being accessed
525 	 * MEM_EDC0 = 0
526 	 * MEM_EDC1 = 1
527 	 * MEM_MC   = 2 -- MEM_MC for chips with only 1 memory controller
528 	 * MEM_MC1  = 3 -- for chips with 2 memory controllers (e.g. T5)
529 	 * MEM_HMA  = 4
530 	 */
531 	edc_size  = EDRAM0_SIZE_G(t4_read_reg(adap, MA_EDRAM0_BAR_A));
532 	if (mtype == MEM_HMA) {
533 		memoffset = 2 * (edc_size * 1024 * 1024);
534 	} else if (mtype != MEM_MC1) {
535 		memoffset = (mtype * (edc_size * 1024 * 1024));
536 	} else {
537 		mc_size = EXT_MEM0_SIZE_G(t4_read_reg(adap,
538 						      MA_EXT_MEMORY0_BAR_A));
539 		memoffset = (MEM_MC0 * edc_size + mc_size) * 1024 * 1024;
540 	}
541 
542 	/* Determine the PCIE_MEM_ACCESS_OFFSET */
543 	addr = addr + memoffset;
544 
545 	/* Each PCI-E Memory Window is programmed with a window size -- or
546 	 * "aperture" -- which controls the granularity of its mapping onto
547 	 * adapter memory.  We need to grab that aperture in order to know
548 	 * how to use the specified window.  The window is also programmed
549 	 * with the base address of the Memory Window in BAR0's address
550 	 * space.  For T4 this is an absolute PCI-E Bus Address.  For T5
551 	 * the address is relative to BAR0.
552 	 */
553 	mem_reg = t4_read_reg(adap,
554 			      PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A,
555 						  win));
556 	mem_aperture = 1 << (WINDOW_G(mem_reg) + WINDOW_SHIFT_X);
557 	mem_base = PCIEOFST_G(mem_reg) << PCIEOFST_SHIFT_X;
558 	if (is_t4(adap->params.chip))
559 		mem_base -= adap->t4_bar0;
560 	win_pf = is_t4(adap->params.chip) ? 0 : PFNUM_V(adap->pf);
561 
562 	/* Calculate our initial PCI-E Memory Window Position and Offset into
563 	 * that Window.
564 	 */
565 	pos = addr & ~(mem_aperture-1);
566 	offset = addr - pos;
567 
568 	/* Set up initial PCI-E Memory Window to cover the start of our
569 	 * transfer.  (Read it back to ensure that changes propagate before we
570 	 * attempt to use the new value.)
571 	 */
572 	t4_write_reg(adap,
573 		     PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win),
574 		     pos | win_pf);
575 	t4_read_reg(adap,
576 		    PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win));
577 
578 	/* Transfer data to/from the adapter as long as there's an integral
579 	 * number of 32-bit transfers to complete.
580 	 *
581 	 * A note on Endianness issues:
582 	 *
583 	 * The "register" reads and writes below from/to the PCI-E Memory
584 	 * Window invoke the standard adapter Big-Endian to PCI-E Link
585 	 * Little-Endian "swizzel."  As a result, if we have the following
586 	 * data in adapter memory:
587 	 *
588 	 *     Memory:  ... | b0 | b1 | b2 | b3 | ...
589 	 *     Address:      i+0  i+1  i+2  i+3
590 	 *
591 	 * Then a read of the adapter memory via the PCI-E Memory Window
592 	 * will yield:
593 	 *
594 	 *     x = readl(i)
595 	 *         31                  0
596 	 *         [ b3 | b2 | b1 | b0 ]
597 	 *
598 	 * If this value is stored into local memory on a Little-Endian system
599 	 * it will show up correctly in local memory as:
600 	 *
601 	 *     ( ..., b0, b1, b2, b3, ... )
602 	 *
603 	 * But on a Big-Endian system, the store will show up in memory
604 	 * incorrectly swizzled as:
605 	 *
606 	 *     ( ..., b3, b2, b1, b0, ... )
607 	 *
608 	 * So we need to account for this in the reads and writes to the
609 	 * PCI-E Memory Window below by undoing the register read/write
610 	 * swizzels.
611 	 */
612 	while (len > 0) {
613 		if (dir == T4_MEMORY_READ)
614 			*buf++ = le32_to_cpu((__force __le32)t4_read_reg(adap,
615 						mem_base + offset));
616 		else
617 			t4_write_reg(adap, mem_base + offset,
618 				     (__force u32)cpu_to_le32(*buf++));
619 		offset += sizeof(__be32);
620 		len -= sizeof(__be32);
621 
622 		/* If we've reached the end of our current window aperture,
623 		 * move the PCI-E Memory Window on to the next.  Note that
624 		 * doing this here after "len" may be 0 allows us to set up
625 		 * the PCI-E Memory Window for a possible final residual
626 		 * transfer below ...
627 		 */
628 		if (offset == mem_aperture) {
629 			pos += mem_aperture;
630 			offset = 0;
631 			t4_write_reg(adap,
632 				PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A,
633 						    win), pos | win_pf);
634 			t4_read_reg(adap,
635 				PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A,
636 						    win));
637 		}
638 	}
639 
640 	/* If the original transfer had a length which wasn't a multiple of
641 	 * 32-bits, now's where we need to finish off the transfer of the
642 	 * residual amount.  The PCI-E Memory Window has already been moved
643 	 * above (if necessary) to cover this final transfer.
644 	 */
645 	if (resid) {
646 		union {
647 			u32 word;
648 			char byte[4];
649 		} last;
650 		unsigned char *bp;
651 		int i;
652 
653 		if (dir == T4_MEMORY_READ) {
654 			last.word = le32_to_cpu(
655 					(__force __le32)t4_read_reg(adap,
656 						mem_base + offset));
657 			for (bp = (unsigned char *)buf, i = resid; i < 4; i++)
658 				bp[i] = last.byte[i];
659 		} else {
660 			last.word = *buf;
661 			for (i = resid; i < 4; i++)
662 				last.byte[i] = 0;
663 			t4_write_reg(adap, mem_base + offset,
664 				     (__force u32)cpu_to_le32(last.word));
665 		}
666 	}
667 
668 	return 0;
669 }
670 
671 /* Return the specified PCI-E Configuration Space register from our Physical
672  * Function.  We try first via a Firmware LDST Command since we prefer to let
673  * the firmware own all of these registers, but if that fails we go for it
674  * directly ourselves.
675  */
676 u32 t4_read_pcie_cfg4(struct adapter *adap, int reg)
677 {
678 	u32 val, ldst_addrspace;
679 
680 	/* If fw_attach != 0, construct and send the Firmware LDST Command to
681 	 * retrieve the specified PCI-E Configuration Space register.
682 	 */
683 	struct fw_ldst_cmd ldst_cmd;
684 	int ret;
685 
686 	memset(&ldst_cmd, 0, sizeof(ldst_cmd));
687 	ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FUNC_PCIE);
688 	ldst_cmd.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
689 					       FW_CMD_REQUEST_F |
690 					       FW_CMD_READ_F |
691 					       ldst_addrspace);
692 	ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd));
693 	ldst_cmd.u.pcie.select_naccess = FW_LDST_CMD_NACCESS_V(1);
694 	ldst_cmd.u.pcie.ctrl_to_fn =
695 		(FW_LDST_CMD_LC_F | FW_LDST_CMD_FN_V(adap->pf));
696 	ldst_cmd.u.pcie.r = reg;
697 
698 	/* If the LDST Command succeeds, return the result, otherwise
699 	 * fall through to reading it directly ourselves ...
700 	 */
701 	ret = t4_wr_mbox(adap, adap->mbox, &ldst_cmd, sizeof(ldst_cmd),
702 			 &ldst_cmd);
703 	if (ret == 0)
704 		val = be32_to_cpu(ldst_cmd.u.pcie.data[0]);
705 	else
706 		/* Read the desired Configuration Space register via the PCI-E
707 		 * Backdoor mechanism.
708 		 */
709 		t4_hw_pci_read_cfg4(adap, reg, &val);
710 	return val;
711 }
712 
713 /* Get the window based on base passed to it.
714  * Window aperture is currently unhandled, but there is no use case for it
715  * right now
716  */
717 static u32 t4_get_window(struct adapter *adap, u32 pci_base, u64 pci_mask,
718 			 u32 memwin_base)
719 {
720 	u32 ret;
721 
722 	if (is_t4(adap->params.chip)) {
723 		u32 bar0;
724 
725 		/* Truncation intentional: we only read the bottom 32-bits of
726 		 * the 64-bit BAR0/BAR1 ...  We use the hardware backdoor
727 		 * mechanism to read BAR0 instead of using
728 		 * pci_resource_start() because we could be operating from
729 		 * within a Virtual Machine which is trapping our accesses to
730 		 * our Configuration Space and we need to set up the PCI-E
731 		 * Memory Window decoders with the actual addresses which will
732 		 * be coming across the PCI-E link.
733 		 */
734 		bar0 = t4_read_pcie_cfg4(adap, pci_base);
735 		bar0 &= pci_mask;
736 		adap->t4_bar0 = bar0;
737 
738 		ret = bar0 + memwin_base;
739 	} else {
740 		/* For T5, only relative offset inside the PCIe BAR is passed */
741 		ret = memwin_base;
742 	}
743 	return ret;
744 }
745 
746 /* Get the default utility window (win0) used by everyone */
747 u32 t4_get_util_window(struct adapter *adap)
748 {
749 	return t4_get_window(adap, PCI_BASE_ADDRESS_0,
750 			     PCI_BASE_ADDRESS_MEM_MASK, MEMWIN0_BASE);
751 }
752 
753 /* Set up memory window for accessing adapter memory ranges.  (Read
754  * back MA register to ensure that changes propagate before we attempt
755  * to use the new values.)
756  */
757 void t4_setup_memwin(struct adapter *adap, u32 memwin_base, u32 window)
758 {
759 	t4_write_reg(adap,
760 		     PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window),
761 		     memwin_base | BIR_V(0) |
762 		     WINDOW_V(ilog2(MEMWIN0_APERTURE) - WINDOW_SHIFT_X));
763 	t4_read_reg(adap,
764 		    PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window));
765 }
766 
767 /**
768  *	t4_get_regs_len - return the size of the chips register set
769  *	@adapter: the adapter
770  *
771  *	Returns the size of the chip's BAR0 register space.
772  */
773 unsigned int t4_get_regs_len(struct adapter *adapter)
774 {
775 	unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
776 
777 	switch (chip_version) {
778 	case CHELSIO_T4:
779 		return T4_REGMAP_SIZE;
780 
781 	case CHELSIO_T5:
782 	case CHELSIO_T6:
783 		return T5_REGMAP_SIZE;
784 	}
785 
786 	dev_err(adapter->pdev_dev,
787 		"Unsupported chip version %d\n", chip_version);
788 	return 0;
789 }
790 
791 /**
792  *	t4_get_regs - read chip registers into provided buffer
793  *	@adap: the adapter
794  *	@buf: register buffer
795  *	@buf_size: size (in bytes) of register buffer
796  *
797  *	If the provided register buffer isn't large enough for the chip's
798  *	full register range, the register dump will be truncated to the
799  *	register buffer's size.
800  */
801 void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
802 {
803 	static const unsigned int t4_reg_ranges[] = {
804 		0x1008, 0x1108,
805 		0x1180, 0x1184,
806 		0x1190, 0x1194,
807 		0x11a0, 0x11a4,
808 		0x11b0, 0x11b4,
809 		0x11fc, 0x123c,
810 		0x1300, 0x173c,
811 		0x1800, 0x18fc,
812 		0x3000, 0x30d8,
813 		0x30e0, 0x30e4,
814 		0x30ec, 0x5910,
815 		0x5920, 0x5924,
816 		0x5960, 0x5960,
817 		0x5968, 0x5968,
818 		0x5970, 0x5970,
819 		0x5978, 0x5978,
820 		0x5980, 0x5980,
821 		0x5988, 0x5988,
822 		0x5990, 0x5990,
823 		0x5998, 0x5998,
824 		0x59a0, 0x59d4,
825 		0x5a00, 0x5ae0,
826 		0x5ae8, 0x5ae8,
827 		0x5af0, 0x5af0,
828 		0x5af8, 0x5af8,
829 		0x6000, 0x6098,
830 		0x6100, 0x6150,
831 		0x6200, 0x6208,
832 		0x6240, 0x6248,
833 		0x6280, 0x62b0,
834 		0x62c0, 0x6338,
835 		0x6370, 0x638c,
836 		0x6400, 0x643c,
837 		0x6500, 0x6524,
838 		0x6a00, 0x6a04,
839 		0x6a14, 0x6a38,
840 		0x6a60, 0x6a70,
841 		0x6a78, 0x6a78,
842 		0x6b00, 0x6b0c,
843 		0x6b1c, 0x6b84,
844 		0x6bf0, 0x6bf8,
845 		0x6c00, 0x6c0c,
846 		0x6c1c, 0x6c84,
847 		0x6cf0, 0x6cf8,
848 		0x6d00, 0x6d0c,
849 		0x6d1c, 0x6d84,
850 		0x6df0, 0x6df8,
851 		0x6e00, 0x6e0c,
852 		0x6e1c, 0x6e84,
853 		0x6ef0, 0x6ef8,
854 		0x6f00, 0x6f0c,
855 		0x6f1c, 0x6f84,
856 		0x6ff0, 0x6ff8,
857 		0x7000, 0x700c,
858 		0x701c, 0x7084,
859 		0x70f0, 0x70f8,
860 		0x7100, 0x710c,
861 		0x711c, 0x7184,
862 		0x71f0, 0x71f8,
863 		0x7200, 0x720c,
864 		0x721c, 0x7284,
865 		0x72f0, 0x72f8,
866 		0x7300, 0x730c,
867 		0x731c, 0x7384,
868 		0x73f0, 0x73f8,
869 		0x7400, 0x7450,
870 		0x7500, 0x7530,
871 		0x7600, 0x760c,
872 		0x7614, 0x761c,
873 		0x7680, 0x76cc,
874 		0x7700, 0x7798,
875 		0x77c0, 0x77fc,
876 		0x7900, 0x79fc,
877 		0x7b00, 0x7b58,
878 		0x7b60, 0x7b84,
879 		0x7b8c, 0x7c38,
880 		0x7d00, 0x7d38,
881 		0x7d40, 0x7d80,
882 		0x7d8c, 0x7ddc,
883 		0x7de4, 0x7e04,
884 		0x7e10, 0x7e1c,
885 		0x7e24, 0x7e38,
886 		0x7e40, 0x7e44,
887 		0x7e4c, 0x7e78,
888 		0x7e80, 0x7ea4,
889 		0x7eac, 0x7edc,
890 		0x7ee8, 0x7efc,
891 		0x8dc0, 0x8e04,
892 		0x8e10, 0x8e1c,
893 		0x8e30, 0x8e78,
894 		0x8ea0, 0x8eb8,
895 		0x8ec0, 0x8f6c,
896 		0x8fc0, 0x9008,
897 		0x9010, 0x9058,
898 		0x9060, 0x9060,
899 		0x9068, 0x9074,
900 		0x90fc, 0x90fc,
901 		0x9400, 0x9408,
902 		0x9410, 0x9458,
903 		0x9600, 0x9600,
904 		0x9608, 0x9638,
905 		0x9640, 0x96bc,
906 		0x9800, 0x9808,
907 		0x9820, 0x983c,
908 		0x9850, 0x9864,
909 		0x9c00, 0x9c6c,
910 		0x9c80, 0x9cec,
911 		0x9d00, 0x9d6c,
912 		0x9d80, 0x9dec,
913 		0x9e00, 0x9e6c,
914 		0x9e80, 0x9eec,
915 		0x9f00, 0x9f6c,
916 		0x9f80, 0x9fec,
917 		0xd004, 0xd004,
918 		0xd010, 0xd03c,
919 		0xdfc0, 0xdfe0,
920 		0xe000, 0xea7c,
921 		0xf000, 0x11110,
922 		0x11118, 0x11190,
923 		0x19040, 0x1906c,
924 		0x19078, 0x19080,
925 		0x1908c, 0x190e4,
926 		0x190f0, 0x190f8,
927 		0x19100, 0x19110,
928 		0x19120, 0x19124,
929 		0x19150, 0x19194,
930 		0x1919c, 0x191b0,
931 		0x191d0, 0x191e8,
932 		0x19238, 0x1924c,
933 		0x193f8, 0x1943c,
934 		0x1944c, 0x19474,
935 		0x19490, 0x194e0,
936 		0x194f0, 0x194f8,
937 		0x19800, 0x19c08,
938 		0x19c10, 0x19c90,
939 		0x19ca0, 0x19ce4,
940 		0x19cf0, 0x19d40,
941 		0x19d50, 0x19d94,
942 		0x19da0, 0x19de8,
943 		0x19df0, 0x19e40,
944 		0x19e50, 0x19e90,
945 		0x19ea0, 0x19f4c,
946 		0x1a000, 0x1a004,
947 		0x1a010, 0x1a06c,
948 		0x1a0b0, 0x1a0e4,
949 		0x1a0ec, 0x1a0f4,
950 		0x1a100, 0x1a108,
951 		0x1a114, 0x1a120,
952 		0x1a128, 0x1a130,
953 		0x1a138, 0x1a138,
954 		0x1a190, 0x1a1c4,
955 		0x1a1fc, 0x1a1fc,
956 		0x1e040, 0x1e04c,
957 		0x1e284, 0x1e28c,
958 		0x1e2c0, 0x1e2c0,
959 		0x1e2e0, 0x1e2e0,
960 		0x1e300, 0x1e384,
961 		0x1e3c0, 0x1e3c8,
962 		0x1e440, 0x1e44c,
963 		0x1e684, 0x1e68c,
964 		0x1e6c0, 0x1e6c0,
965 		0x1e6e0, 0x1e6e0,
966 		0x1e700, 0x1e784,
967 		0x1e7c0, 0x1e7c8,
968 		0x1e840, 0x1e84c,
969 		0x1ea84, 0x1ea8c,
970 		0x1eac0, 0x1eac0,
971 		0x1eae0, 0x1eae0,
972 		0x1eb00, 0x1eb84,
973 		0x1ebc0, 0x1ebc8,
974 		0x1ec40, 0x1ec4c,
975 		0x1ee84, 0x1ee8c,
976 		0x1eec0, 0x1eec0,
977 		0x1eee0, 0x1eee0,
978 		0x1ef00, 0x1ef84,
979 		0x1efc0, 0x1efc8,
980 		0x1f040, 0x1f04c,
981 		0x1f284, 0x1f28c,
982 		0x1f2c0, 0x1f2c0,
983 		0x1f2e0, 0x1f2e0,
984 		0x1f300, 0x1f384,
985 		0x1f3c0, 0x1f3c8,
986 		0x1f440, 0x1f44c,
987 		0x1f684, 0x1f68c,
988 		0x1f6c0, 0x1f6c0,
989 		0x1f6e0, 0x1f6e0,
990 		0x1f700, 0x1f784,
991 		0x1f7c0, 0x1f7c8,
992 		0x1f840, 0x1f84c,
993 		0x1fa84, 0x1fa8c,
994 		0x1fac0, 0x1fac0,
995 		0x1fae0, 0x1fae0,
996 		0x1fb00, 0x1fb84,
997 		0x1fbc0, 0x1fbc8,
998 		0x1fc40, 0x1fc4c,
999 		0x1fe84, 0x1fe8c,
1000 		0x1fec0, 0x1fec0,
1001 		0x1fee0, 0x1fee0,
1002 		0x1ff00, 0x1ff84,
1003 		0x1ffc0, 0x1ffc8,
1004 		0x20000, 0x2002c,
1005 		0x20100, 0x2013c,
1006 		0x20190, 0x201a0,
1007 		0x201a8, 0x201b8,
1008 		0x201c4, 0x201c8,
1009 		0x20200, 0x20318,
1010 		0x20400, 0x204b4,
1011 		0x204c0, 0x20528,
1012 		0x20540, 0x20614,
1013 		0x21000, 0x21040,
1014 		0x2104c, 0x21060,
1015 		0x210c0, 0x210ec,
1016 		0x21200, 0x21268,
1017 		0x21270, 0x21284,
1018 		0x212fc, 0x21388,
1019 		0x21400, 0x21404,
1020 		0x21500, 0x21500,
1021 		0x21510, 0x21518,
1022 		0x2152c, 0x21530,
1023 		0x2153c, 0x2153c,
1024 		0x21550, 0x21554,
1025 		0x21600, 0x21600,
1026 		0x21608, 0x2161c,
1027 		0x21624, 0x21628,
1028 		0x21630, 0x21634,
1029 		0x2163c, 0x2163c,
1030 		0x21700, 0x2171c,
1031 		0x21780, 0x2178c,
1032 		0x21800, 0x21818,
1033 		0x21820, 0x21828,
1034 		0x21830, 0x21848,
1035 		0x21850, 0x21854,
1036 		0x21860, 0x21868,
1037 		0x21870, 0x21870,
1038 		0x21878, 0x21898,
1039 		0x218a0, 0x218a8,
1040 		0x218b0, 0x218c8,
1041 		0x218d0, 0x218d4,
1042 		0x218e0, 0x218e8,
1043 		0x218f0, 0x218f0,
1044 		0x218f8, 0x21a18,
1045 		0x21a20, 0x21a28,
1046 		0x21a30, 0x21a48,
1047 		0x21a50, 0x21a54,
1048 		0x21a60, 0x21a68,
1049 		0x21a70, 0x21a70,
1050 		0x21a78, 0x21a98,
1051 		0x21aa0, 0x21aa8,
1052 		0x21ab0, 0x21ac8,
1053 		0x21ad0, 0x21ad4,
1054 		0x21ae0, 0x21ae8,
1055 		0x21af0, 0x21af0,
1056 		0x21af8, 0x21c18,
1057 		0x21c20, 0x21c20,
1058 		0x21c28, 0x21c30,
1059 		0x21c38, 0x21c38,
1060 		0x21c80, 0x21c98,
1061 		0x21ca0, 0x21ca8,
1062 		0x21cb0, 0x21cc8,
1063 		0x21cd0, 0x21cd4,
1064 		0x21ce0, 0x21ce8,
1065 		0x21cf0, 0x21cf0,
1066 		0x21cf8, 0x21d7c,
1067 		0x21e00, 0x21e04,
1068 		0x22000, 0x2202c,
1069 		0x22100, 0x2213c,
1070 		0x22190, 0x221a0,
1071 		0x221a8, 0x221b8,
1072 		0x221c4, 0x221c8,
1073 		0x22200, 0x22318,
1074 		0x22400, 0x224b4,
1075 		0x224c0, 0x22528,
1076 		0x22540, 0x22614,
1077 		0x23000, 0x23040,
1078 		0x2304c, 0x23060,
1079 		0x230c0, 0x230ec,
1080 		0x23200, 0x23268,
1081 		0x23270, 0x23284,
1082 		0x232fc, 0x23388,
1083 		0x23400, 0x23404,
1084 		0x23500, 0x23500,
1085 		0x23510, 0x23518,
1086 		0x2352c, 0x23530,
1087 		0x2353c, 0x2353c,
1088 		0x23550, 0x23554,
1089 		0x23600, 0x23600,
1090 		0x23608, 0x2361c,
1091 		0x23624, 0x23628,
1092 		0x23630, 0x23634,
1093 		0x2363c, 0x2363c,
1094 		0x23700, 0x2371c,
1095 		0x23780, 0x2378c,
1096 		0x23800, 0x23818,
1097 		0x23820, 0x23828,
1098 		0x23830, 0x23848,
1099 		0x23850, 0x23854,
1100 		0x23860, 0x23868,
1101 		0x23870, 0x23870,
1102 		0x23878, 0x23898,
1103 		0x238a0, 0x238a8,
1104 		0x238b0, 0x238c8,
1105 		0x238d0, 0x238d4,
1106 		0x238e0, 0x238e8,
1107 		0x238f0, 0x238f0,
1108 		0x238f8, 0x23a18,
1109 		0x23a20, 0x23a28,
1110 		0x23a30, 0x23a48,
1111 		0x23a50, 0x23a54,
1112 		0x23a60, 0x23a68,
1113 		0x23a70, 0x23a70,
1114 		0x23a78, 0x23a98,
1115 		0x23aa0, 0x23aa8,
1116 		0x23ab0, 0x23ac8,
1117 		0x23ad0, 0x23ad4,
1118 		0x23ae0, 0x23ae8,
1119 		0x23af0, 0x23af0,
1120 		0x23af8, 0x23c18,
1121 		0x23c20, 0x23c20,
1122 		0x23c28, 0x23c30,
1123 		0x23c38, 0x23c38,
1124 		0x23c80, 0x23c98,
1125 		0x23ca0, 0x23ca8,
1126 		0x23cb0, 0x23cc8,
1127 		0x23cd0, 0x23cd4,
1128 		0x23ce0, 0x23ce8,
1129 		0x23cf0, 0x23cf0,
1130 		0x23cf8, 0x23d7c,
1131 		0x23e00, 0x23e04,
1132 		0x24000, 0x2402c,
1133 		0x24100, 0x2413c,
1134 		0x24190, 0x241a0,
1135 		0x241a8, 0x241b8,
1136 		0x241c4, 0x241c8,
1137 		0x24200, 0x24318,
1138 		0x24400, 0x244b4,
1139 		0x244c0, 0x24528,
1140 		0x24540, 0x24614,
1141 		0x25000, 0x25040,
1142 		0x2504c, 0x25060,
1143 		0x250c0, 0x250ec,
1144 		0x25200, 0x25268,
1145 		0x25270, 0x25284,
1146 		0x252fc, 0x25388,
1147 		0x25400, 0x25404,
1148 		0x25500, 0x25500,
1149 		0x25510, 0x25518,
1150 		0x2552c, 0x25530,
1151 		0x2553c, 0x2553c,
1152 		0x25550, 0x25554,
1153 		0x25600, 0x25600,
1154 		0x25608, 0x2561c,
1155 		0x25624, 0x25628,
1156 		0x25630, 0x25634,
1157 		0x2563c, 0x2563c,
1158 		0x25700, 0x2571c,
1159 		0x25780, 0x2578c,
1160 		0x25800, 0x25818,
1161 		0x25820, 0x25828,
1162 		0x25830, 0x25848,
1163 		0x25850, 0x25854,
1164 		0x25860, 0x25868,
1165 		0x25870, 0x25870,
1166 		0x25878, 0x25898,
1167 		0x258a0, 0x258a8,
1168 		0x258b0, 0x258c8,
1169 		0x258d0, 0x258d4,
1170 		0x258e0, 0x258e8,
1171 		0x258f0, 0x258f0,
1172 		0x258f8, 0x25a18,
1173 		0x25a20, 0x25a28,
1174 		0x25a30, 0x25a48,
1175 		0x25a50, 0x25a54,
1176 		0x25a60, 0x25a68,
1177 		0x25a70, 0x25a70,
1178 		0x25a78, 0x25a98,
1179 		0x25aa0, 0x25aa8,
1180 		0x25ab0, 0x25ac8,
1181 		0x25ad0, 0x25ad4,
1182 		0x25ae0, 0x25ae8,
1183 		0x25af0, 0x25af0,
1184 		0x25af8, 0x25c18,
1185 		0x25c20, 0x25c20,
1186 		0x25c28, 0x25c30,
1187 		0x25c38, 0x25c38,
1188 		0x25c80, 0x25c98,
1189 		0x25ca0, 0x25ca8,
1190 		0x25cb0, 0x25cc8,
1191 		0x25cd0, 0x25cd4,
1192 		0x25ce0, 0x25ce8,
1193 		0x25cf0, 0x25cf0,
1194 		0x25cf8, 0x25d7c,
1195 		0x25e00, 0x25e04,
1196 		0x26000, 0x2602c,
1197 		0x26100, 0x2613c,
1198 		0x26190, 0x261a0,
1199 		0x261a8, 0x261b8,
1200 		0x261c4, 0x261c8,
1201 		0x26200, 0x26318,
1202 		0x26400, 0x264b4,
1203 		0x264c0, 0x26528,
1204 		0x26540, 0x26614,
1205 		0x27000, 0x27040,
1206 		0x2704c, 0x27060,
1207 		0x270c0, 0x270ec,
1208 		0x27200, 0x27268,
1209 		0x27270, 0x27284,
1210 		0x272fc, 0x27388,
1211 		0x27400, 0x27404,
1212 		0x27500, 0x27500,
1213 		0x27510, 0x27518,
1214 		0x2752c, 0x27530,
1215 		0x2753c, 0x2753c,
1216 		0x27550, 0x27554,
1217 		0x27600, 0x27600,
1218 		0x27608, 0x2761c,
1219 		0x27624, 0x27628,
1220 		0x27630, 0x27634,
1221 		0x2763c, 0x2763c,
1222 		0x27700, 0x2771c,
1223 		0x27780, 0x2778c,
1224 		0x27800, 0x27818,
1225 		0x27820, 0x27828,
1226 		0x27830, 0x27848,
1227 		0x27850, 0x27854,
1228 		0x27860, 0x27868,
1229 		0x27870, 0x27870,
1230 		0x27878, 0x27898,
1231 		0x278a0, 0x278a8,
1232 		0x278b0, 0x278c8,
1233 		0x278d0, 0x278d4,
1234 		0x278e0, 0x278e8,
1235 		0x278f0, 0x278f0,
1236 		0x278f8, 0x27a18,
1237 		0x27a20, 0x27a28,
1238 		0x27a30, 0x27a48,
1239 		0x27a50, 0x27a54,
1240 		0x27a60, 0x27a68,
1241 		0x27a70, 0x27a70,
1242 		0x27a78, 0x27a98,
1243 		0x27aa0, 0x27aa8,
1244 		0x27ab0, 0x27ac8,
1245 		0x27ad0, 0x27ad4,
1246 		0x27ae0, 0x27ae8,
1247 		0x27af0, 0x27af0,
1248 		0x27af8, 0x27c18,
1249 		0x27c20, 0x27c20,
1250 		0x27c28, 0x27c30,
1251 		0x27c38, 0x27c38,
1252 		0x27c80, 0x27c98,
1253 		0x27ca0, 0x27ca8,
1254 		0x27cb0, 0x27cc8,
1255 		0x27cd0, 0x27cd4,
1256 		0x27ce0, 0x27ce8,
1257 		0x27cf0, 0x27cf0,
1258 		0x27cf8, 0x27d7c,
1259 		0x27e00, 0x27e04,
1260 	};
1261 
1262 	static const unsigned int t5_reg_ranges[] = {
1263 		0x1008, 0x10c0,
1264 		0x10cc, 0x10f8,
1265 		0x1100, 0x1100,
1266 		0x110c, 0x1148,
1267 		0x1180, 0x1184,
1268 		0x1190, 0x1194,
1269 		0x11a0, 0x11a4,
1270 		0x11b0, 0x11b4,
1271 		0x11fc, 0x123c,
1272 		0x1280, 0x173c,
1273 		0x1800, 0x18fc,
1274 		0x3000, 0x3028,
1275 		0x3060, 0x30b0,
1276 		0x30b8, 0x30d8,
1277 		0x30e0, 0x30fc,
1278 		0x3140, 0x357c,
1279 		0x35a8, 0x35cc,
1280 		0x35ec, 0x35ec,
1281 		0x3600, 0x5624,
1282 		0x56cc, 0x56ec,
1283 		0x56f4, 0x5720,
1284 		0x5728, 0x575c,
1285 		0x580c, 0x5814,
1286 		0x5890, 0x589c,
1287 		0x58a4, 0x58ac,
1288 		0x58b8, 0x58bc,
1289 		0x5940, 0x59c8,
1290 		0x59d0, 0x59dc,
1291 		0x59fc, 0x5a18,
1292 		0x5a60, 0x5a70,
1293 		0x5a80, 0x5a9c,
1294 		0x5b94, 0x5bfc,
1295 		0x6000, 0x6020,
1296 		0x6028, 0x6040,
1297 		0x6058, 0x609c,
1298 		0x60a8, 0x614c,
1299 		0x7700, 0x7798,
1300 		0x77c0, 0x78fc,
1301 		0x7b00, 0x7b58,
1302 		0x7b60, 0x7b84,
1303 		0x7b8c, 0x7c54,
1304 		0x7d00, 0x7d38,
1305 		0x7d40, 0x7d80,
1306 		0x7d8c, 0x7ddc,
1307 		0x7de4, 0x7e04,
1308 		0x7e10, 0x7e1c,
1309 		0x7e24, 0x7e38,
1310 		0x7e40, 0x7e44,
1311 		0x7e4c, 0x7e78,
1312 		0x7e80, 0x7edc,
1313 		0x7ee8, 0x7efc,
1314 		0x8dc0, 0x8de0,
1315 		0x8df8, 0x8e04,
1316 		0x8e10, 0x8e84,
1317 		0x8ea0, 0x8f84,
1318 		0x8fc0, 0x9058,
1319 		0x9060, 0x9060,
1320 		0x9068, 0x90f8,
1321 		0x9400, 0x9408,
1322 		0x9410, 0x9470,
1323 		0x9600, 0x9600,
1324 		0x9608, 0x9638,
1325 		0x9640, 0x96f4,
1326 		0x9800, 0x9808,
1327 		0x9820, 0x983c,
1328 		0x9850, 0x9864,
1329 		0x9c00, 0x9c6c,
1330 		0x9c80, 0x9cec,
1331 		0x9d00, 0x9d6c,
1332 		0x9d80, 0x9dec,
1333 		0x9e00, 0x9e6c,
1334 		0x9e80, 0x9eec,
1335 		0x9f00, 0x9f6c,
1336 		0x9f80, 0xa020,
1337 		0xd004, 0xd004,
1338 		0xd010, 0xd03c,
1339 		0xdfc0, 0xdfe0,
1340 		0xe000, 0x1106c,
1341 		0x11074, 0x11088,
1342 		0x1109c, 0x1117c,
1343 		0x11190, 0x11204,
1344 		0x19040, 0x1906c,
1345 		0x19078, 0x19080,
1346 		0x1908c, 0x190e8,
1347 		0x190f0, 0x190f8,
1348 		0x19100, 0x19110,
1349 		0x19120, 0x19124,
1350 		0x19150, 0x19194,
1351 		0x1919c, 0x191b0,
1352 		0x191d0, 0x191e8,
1353 		0x19238, 0x19290,
1354 		0x193f8, 0x19428,
1355 		0x19430, 0x19444,
1356 		0x1944c, 0x1946c,
1357 		0x19474, 0x19474,
1358 		0x19490, 0x194cc,
1359 		0x194f0, 0x194f8,
1360 		0x19c00, 0x19c08,
1361 		0x19c10, 0x19c60,
1362 		0x19c94, 0x19ce4,
1363 		0x19cf0, 0x19d40,
1364 		0x19d50, 0x19d94,
1365 		0x19da0, 0x19de8,
1366 		0x19df0, 0x19e10,
1367 		0x19e50, 0x19e90,
1368 		0x19ea0, 0x19f24,
1369 		0x19f34, 0x19f34,
1370 		0x19f40, 0x19f50,
1371 		0x19f90, 0x19fb4,
1372 		0x19fc4, 0x19fe4,
1373 		0x1a000, 0x1a004,
1374 		0x1a010, 0x1a06c,
1375 		0x1a0b0, 0x1a0e4,
1376 		0x1a0ec, 0x1a0f8,
1377 		0x1a100, 0x1a108,
1378 		0x1a114, 0x1a120,
1379 		0x1a128, 0x1a130,
1380 		0x1a138, 0x1a138,
1381 		0x1a190, 0x1a1c4,
1382 		0x1a1fc, 0x1a1fc,
1383 		0x1e008, 0x1e00c,
1384 		0x1e040, 0x1e044,
1385 		0x1e04c, 0x1e04c,
1386 		0x1e284, 0x1e290,
1387 		0x1e2c0, 0x1e2c0,
1388 		0x1e2e0, 0x1e2e0,
1389 		0x1e300, 0x1e384,
1390 		0x1e3c0, 0x1e3c8,
1391 		0x1e408, 0x1e40c,
1392 		0x1e440, 0x1e444,
1393 		0x1e44c, 0x1e44c,
1394 		0x1e684, 0x1e690,
1395 		0x1e6c0, 0x1e6c0,
1396 		0x1e6e0, 0x1e6e0,
1397 		0x1e700, 0x1e784,
1398 		0x1e7c0, 0x1e7c8,
1399 		0x1e808, 0x1e80c,
1400 		0x1e840, 0x1e844,
1401 		0x1e84c, 0x1e84c,
1402 		0x1ea84, 0x1ea90,
1403 		0x1eac0, 0x1eac0,
1404 		0x1eae0, 0x1eae0,
1405 		0x1eb00, 0x1eb84,
1406 		0x1ebc0, 0x1ebc8,
1407 		0x1ec08, 0x1ec0c,
1408 		0x1ec40, 0x1ec44,
1409 		0x1ec4c, 0x1ec4c,
1410 		0x1ee84, 0x1ee90,
1411 		0x1eec0, 0x1eec0,
1412 		0x1eee0, 0x1eee0,
1413 		0x1ef00, 0x1ef84,
1414 		0x1efc0, 0x1efc8,
1415 		0x1f008, 0x1f00c,
1416 		0x1f040, 0x1f044,
1417 		0x1f04c, 0x1f04c,
1418 		0x1f284, 0x1f290,
1419 		0x1f2c0, 0x1f2c0,
1420 		0x1f2e0, 0x1f2e0,
1421 		0x1f300, 0x1f384,
1422 		0x1f3c0, 0x1f3c8,
1423 		0x1f408, 0x1f40c,
1424 		0x1f440, 0x1f444,
1425 		0x1f44c, 0x1f44c,
1426 		0x1f684, 0x1f690,
1427 		0x1f6c0, 0x1f6c0,
1428 		0x1f6e0, 0x1f6e0,
1429 		0x1f700, 0x1f784,
1430 		0x1f7c0, 0x1f7c8,
1431 		0x1f808, 0x1f80c,
1432 		0x1f840, 0x1f844,
1433 		0x1f84c, 0x1f84c,
1434 		0x1fa84, 0x1fa90,
1435 		0x1fac0, 0x1fac0,
1436 		0x1fae0, 0x1fae0,
1437 		0x1fb00, 0x1fb84,
1438 		0x1fbc0, 0x1fbc8,
1439 		0x1fc08, 0x1fc0c,
1440 		0x1fc40, 0x1fc44,
1441 		0x1fc4c, 0x1fc4c,
1442 		0x1fe84, 0x1fe90,
1443 		0x1fec0, 0x1fec0,
1444 		0x1fee0, 0x1fee0,
1445 		0x1ff00, 0x1ff84,
1446 		0x1ffc0, 0x1ffc8,
1447 		0x30000, 0x30030,
1448 		0x30100, 0x30144,
1449 		0x30190, 0x301a0,
1450 		0x301a8, 0x301b8,
1451 		0x301c4, 0x301c8,
1452 		0x301d0, 0x301d0,
1453 		0x30200, 0x30318,
1454 		0x30400, 0x304b4,
1455 		0x304c0, 0x3052c,
1456 		0x30540, 0x3061c,
1457 		0x30800, 0x30828,
1458 		0x30834, 0x30834,
1459 		0x308c0, 0x30908,
1460 		0x30910, 0x309ac,
1461 		0x30a00, 0x30a14,
1462 		0x30a1c, 0x30a2c,
1463 		0x30a44, 0x30a50,
1464 		0x30a74, 0x30a74,
1465 		0x30a7c, 0x30afc,
1466 		0x30b08, 0x30c24,
1467 		0x30d00, 0x30d00,
1468 		0x30d08, 0x30d14,
1469 		0x30d1c, 0x30d20,
1470 		0x30d3c, 0x30d3c,
1471 		0x30d48, 0x30d50,
1472 		0x31200, 0x3120c,
1473 		0x31220, 0x31220,
1474 		0x31240, 0x31240,
1475 		0x31600, 0x3160c,
1476 		0x31a00, 0x31a1c,
1477 		0x31e00, 0x31e20,
1478 		0x31e38, 0x31e3c,
1479 		0x31e80, 0x31e80,
1480 		0x31e88, 0x31ea8,
1481 		0x31eb0, 0x31eb4,
1482 		0x31ec8, 0x31ed4,
1483 		0x31fb8, 0x32004,
1484 		0x32200, 0x32200,
1485 		0x32208, 0x32240,
1486 		0x32248, 0x32280,
1487 		0x32288, 0x322c0,
1488 		0x322c8, 0x322fc,
1489 		0x32600, 0x32630,
1490 		0x32a00, 0x32abc,
1491 		0x32b00, 0x32b10,
1492 		0x32b20, 0x32b30,
1493 		0x32b40, 0x32b50,
1494 		0x32b60, 0x32b70,
1495 		0x33000, 0x33028,
1496 		0x33030, 0x33048,
1497 		0x33060, 0x33068,
1498 		0x33070, 0x3309c,
1499 		0x330f0, 0x33128,
1500 		0x33130, 0x33148,
1501 		0x33160, 0x33168,
1502 		0x33170, 0x3319c,
1503 		0x331f0, 0x33238,
1504 		0x33240, 0x33240,
1505 		0x33248, 0x33250,
1506 		0x3325c, 0x33264,
1507 		0x33270, 0x332b8,
1508 		0x332c0, 0x332e4,
1509 		0x332f8, 0x33338,
1510 		0x33340, 0x33340,
1511 		0x33348, 0x33350,
1512 		0x3335c, 0x33364,
1513 		0x33370, 0x333b8,
1514 		0x333c0, 0x333e4,
1515 		0x333f8, 0x33428,
1516 		0x33430, 0x33448,
1517 		0x33460, 0x33468,
1518 		0x33470, 0x3349c,
1519 		0x334f0, 0x33528,
1520 		0x33530, 0x33548,
1521 		0x33560, 0x33568,
1522 		0x33570, 0x3359c,
1523 		0x335f0, 0x33638,
1524 		0x33640, 0x33640,
1525 		0x33648, 0x33650,
1526 		0x3365c, 0x33664,
1527 		0x33670, 0x336b8,
1528 		0x336c0, 0x336e4,
1529 		0x336f8, 0x33738,
1530 		0x33740, 0x33740,
1531 		0x33748, 0x33750,
1532 		0x3375c, 0x33764,
1533 		0x33770, 0x337b8,
1534 		0x337c0, 0x337e4,
1535 		0x337f8, 0x337fc,
1536 		0x33814, 0x33814,
1537 		0x3382c, 0x3382c,
1538 		0x33880, 0x3388c,
1539 		0x338e8, 0x338ec,
1540 		0x33900, 0x33928,
1541 		0x33930, 0x33948,
1542 		0x33960, 0x33968,
1543 		0x33970, 0x3399c,
1544 		0x339f0, 0x33a38,
1545 		0x33a40, 0x33a40,
1546 		0x33a48, 0x33a50,
1547 		0x33a5c, 0x33a64,
1548 		0x33a70, 0x33ab8,
1549 		0x33ac0, 0x33ae4,
1550 		0x33af8, 0x33b10,
1551 		0x33b28, 0x33b28,
1552 		0x33b3c, 0x33b50,
1553 		0x33bf0, 0x33c10,
1554 		0x33c28, 0x33c28,
1555 		0x33c3c, 0x33c50,
1556 		0x33cf0, 0x33cfc,
1557 		0x34000, 0x34030,
1558 		0x34100, 0x34144,
1559 		0x34190, 0x341a0,
1560 		0x341a8, 0x341b8,
1561 		0x341c4, 0x341c8,
1562 		0x341d0, 0x341d0,
1563 		0x34200, 0x34318,
1564 		0x34400, 0x344b4,
1565 		0x344c0, 0x3452c,
1566 		0x34540, 0x3461c,
1567 		0x34800, 0x34828,
1568 		0x34834, 0x34834,
1569 		0x348c0, 0x34908,
1570 		0x34910, 0x349ac,
1571 		0x34a00, 0x34a14,
1572 		0x34a1c, 0x34a2c,
1573 		0x34a44, 0x34a50,
1574 		0x34a74, 0x34a74,
1575 		0x34a7c, 0x34afc,
1576 		0x34b08, 0x34c24,
1577 		0x34d00, 0x34d00,
1578 		0x34d08, 0x34d14,
1579 		0x34d1c, 0x34d20,
1580 		0x34d3c, 0x34d3c,
1581 		0x34d48, 0x34d50,
1582 		0x35200, 0x3520c,
1583 		0x35220, 0x35220,
1584 		0x35240, 0x35240,
1585 		0x35600, 0x3560c,
1586 		0x35a00, 0x35a1c,
1587 		0x35e00, 0x35e20,
1588 		0x35e38, 0x35e3c,
1589 		0x35e80, 0x35e80,
1590 		0x35e88, 0x35ea8,
1591 		0x35eb0, 0x35eb4,
1592 		0x35ec8, 0x35ed4,
1593 		0x35fb8, 0x36004,
1594 		0x36200, 0x36200,
1595 		0x36208, 0x36240,
1596 		0x36248, 0x36280,
1597 		0x36288, 0x362c0,
1598 		0x362c8, 0x362fc,
1599 		0x36600, 0x36630,
1600 		0x36a00, 0x36abc,
1601 		0x36b00, 0x36b10,
1602 		0x36b20, 0x36b30,
1603 		0x36b40, 0x36b50,
1604 		0x36b60, 0x36b70,
1605 		0x37000, 0x37028,
1606 		0x37030, 0x37048,
1607 		0x37060, 0x37068,
1608 		0x37070, 0x3709c,
1609 		0x370f0, 0x37128,
1610 		0x37130, 0x37148,
1611 		0x37160, 0x37168,
1612 		0x37170, 0x3719c,
1613 		0x371f0, 0x37238,
1614 		0x37240, 0x37240,
1615 		0x37248, 0x37250,
1616 		0x3725c, 0x37264,
1617 		0x37270, 0x372b8,
1618 		0x372c0, 0x372e4,
1619 		0x372f8, 0x37338,
1620 		0x37340, 0x37340,
1621 		0x37348, 0x37350,
1622 		0x3735c, 0x37364,
1623 		0x37370, 0x373b8,
1624 		0x373c0, 0x373e4,
1625 		0x373f8, 0x37428,
1626 		0x37430, 0x37448,
1627 		0x37460, 0x37468,
1628 		0x37470, 0x3749c,
1629 		0x374f0, 0x37528,
1630 		0x37530, 0x37548,
1631 		0x37560, 0x37568,
1632 		0x37570, 0x3759c,
1633 		0x375f0, 0x37638,
1634 		0x37640, 0x37640,
1635 		0x37648, 0x37650,
1636 		0x3765c, 0x37664,
1637 		0x37670, 0x376b8,
1638 		0x376c0, 0x376e4,
1639 		0x376f8, 0x37738,
1640 		0x37740, 0x37740,
1641 		0x37748, 0x37750,
1642 		0x3775c, 0x37764,
1643 		0x37770, 0x377b8,
1644 		0x377c0, 0x377e4,
1645 		0x377f8, 0x377fc,
1646 		0x37814, 0x37814,
1647 		0x3782c, 0x3782c,
1648 		0x37880, 0x3788c,
1649 		0x378e8, 0x378ec,
1650 		0x37900, 0x37928,
1651 		0x37930, 0x37948,
1652 		0x37960, 0x37968,
1653 		0x37970, 0x3799c,
1654 		0x379f0, 0x37a38,
1655 		0x37a40, 0x37a40,
1656 		0x37a48, 0x37a50,
1657 		0x37a5c, 0x37a64,
1658 		0x37a70, 0x37ab8,
1659 		0x37ac0, 0x37ae4,
1660 		0x37af8, 0x37b10,
1661 		0x37b28, 0x37b28,
1662 		0x37b3c, 0x37b50,
1663 		0x37bf0, 0x37c10,
1664 		0x37c28, 0x37c28,
1665 		0x37c3c, 0x37c50,
1666 		0x37cf0, 0x37cfc,
1667 		0x38000, 0x38030,
1668 		0x38100, 0x38144,
1669 		0x38190, 0x381a0,
1670 		0x381a8, 0x381b8,
1671 		0x381c4, 0x381c8,
1672 		0x381d0, 0x381d0,
1673 		0x38200, 0x38318,
1674 		0x38400, 0x384b4,
1675 		0x384c0, 0x3852c,
1676 		0x38540, 0x3861c,
1677 		0x38800, 0x38828,
1678 		0x38834, 0x38834,
1679 		0x388c0, 0x38908,
1680 		0x38910, 0x389ac,
1681 		0x38a00, 0x38a14,
1682 		0x38a1c, 0x38a2c,
1683 		0x38a44, 0x38a50,
1684 		0x38a74, 0x38a74,
1685 		0x38a7c, 0x38afc,
1686 		0x38b08, 0x38c24,
1687 		0x38d00, 0x38d00,
1688 		0x38d08, 0x38d14,
1689 		0x38d1c, 0x38d20,
1690 		0x38d3c, 0x38d3c,
1691 		0x38d48, 0x38d50,
1692 		0x39200, 0x3920c,
1693 		0x39220, 0x39220,
1694 		0x39240, 0x39240,
1695 		0x39600, 0x3960c,
1696 		0x39a00, 0x39a1c,
1697 		0x39e00, 0x39e20,
1698 		0x39e38, 0x39e3c,
1699 		0x39e80, 0x39e80,
1700 		0x39e88, 0x39ea8,
1701 		0x39eb0, 0x39eb4,
1702 		0x39ec8, 0x39ed4,
1703 		0x39fb8, 0x3a004,
1704 		0x3a200, 0x3a200,
1705 		0x3a208, 0x3a240,
1706 		0x3a248, 0x3a280,
1707 		0x3a288, 0x3a2c0,
1708 		0x3a2c8, 0x3a2fc,
1709 		0x3a600, 0x3a630,
1710 		0x3aa00, 0x3aabc,
1711 		0x3ab00, 0x3ab10,
1712 		0x3ab20, 0x3ab30,
1713 		0x3ab40, 0x3ab50,
1714 		0x3ab60, 0x3ab70,
1715 		0x3b000, 0x3b028,
1716 		0x3b030, 0x3b048,
1717 		0x3b060, 0x3b068,
1718 		0x3b070, 0x3b09c,
1719 		0x3b0f0, 0x3b128,
1720 		0x3b130, 0x3b148,
1721 		0x3b160, 0x3b168,
1722 		0x3b170, 0x3b19c,
1723 		0x3b1f0, 0x3b238,
1724 		0x3b240, 0x3b240,
1725 		0x3b248, 0x3b250,
1726 		0x3b25c, 0x3b264,
1727 		0x3b270, 0x3b2b8,
1728 		0x3b2c0, 0x3b2e4,
1729 		0x3b2f8, 0x3b338,
1730 		0x3b340, 0x3b340,
1731 		0x3b348, 0x3b350,
1732 		0x3b35c, 0x3b364,
1733 		0x3b370, 0x3b3b8,
1734 		0x3b3c0, 0x3b3e4,
1735 		0x3b3f8, 0x3b428,
1736 		0x3b430, 0x3b448,
1737 		0x3b460, 0x3b468,
1738 		0x3b470, 0x3b49c,
1739 		0x3b4f0, 0x3b528,
1740 		0x3b530, 0x3b548,
1741 		0x3b560, 0x3b568,
1742 		0x3b570, 0x3b59c,
1743 		0x3b5f0, 0x3b638,
1744 		0x3b640, 0x3b640,
1745 		0x3b648, 0x3b650,
1746 		0x3b65c, 0x3b664,
1747 		0x3b670, 0x3b6b8,
1748 		0x3b6c0, 0x3b6e4,
1749 		0x3b6f8, 0x3b738,
1750 		0x3b740, 0x3b740,
1751 		0x3b748, 0x3b750,
1752 		0x3b75c, 0x3b764,
1753 		0x3b770, 0x3b7b8,
1754 		0x3b7c0, 0x3b7e4,
1755 		0x3b7f8, 0x3b7fc,
1756 		0x3b814, 0x3b814,
1757 		0x3b82c, 0x3b82c,
1758 		0x3b880, 0x3b88c,
1759 		0x3b8e8, 0x3b8ec,
1760 		0x3b900, 0x3b928,
1761 		0x3b930, 0x3b948,
1762 		0x3b960, 0x3b968,
1763 		0x3b970, 0x3b99c,
1764 		0x3b9f0, 0x3ba38,
1765 		0x3ba40, 0x3ba40,
1766 		0x3ba48, 0x3ba50,
1767 		0x3ba5c, 0x3ba64,
1768 		0x3ba70, 0x3bab8,
1769 		0x3bac0, 0x3bae4,
1770 		0x3baf8, 0x3bb10,
1771 		0x3bb28, 0x3bb28,
1772 		0x3bb3c, 0x3bb50,
1773 		0x3bbf0, 0x3bc10,
1774 		0x3bc28, 0x3bc28,
1775 		0x3bc3c, 0x3bc50,
1776 		0x3bcf0, 0x3bcfc,
1777 		0x3c000, 0x3c030,
1778 		0x3c100, 0x3c144,
1779 		0x3c190, 0x3c1a0,
1780 		0x3c1a8, 0x3c1b8,
1781 		0x3c1c4, 0x3c1c8,
1782 		0x3c1d0, 0x3c1d0,
1783 		0x3c200, 0x3c318,
1784 		0x3c400, 0x3c4b4,
1785 		0x3c4c0, 0x3c52c,
1786 		0x3c540, 0x3c61c,
1787 		0x3c800, 0x3c828,
1788 		0x3c834, 0x3c834,
1789 		0x3c8c0, 0x3c908,
1790 		0x3c910, 0x3c9ac,
1791 		0x3ca00, 0x3ca14,
1792 		0x3ca1c, 0x3ca2c,
1793 		0x3ca44, 0x3ca50,
1794 		0x3ca74, 0x3ca74,
1795 		0x3ca7c, 0x3cafc,
1796 		0x3cb08, 0x3cc24,
1797 		0x3cd00, 0x3cd00,
1798 		0x3cd08, 0x3cd14,
1799 		0x3cd1c, 0x3cd20,
1800 		0x3cd3c, 0x3cd3c,
1801 		0x3cd48, 0x3cd50,
1802 		0x3d200, 0x3d20c,
1803 		0x3d220, 0x3d220,
1804 		0x3d240, 0x3d240,
1805 		0x3d600, 0x3d60c,
1806 		0x3da00, 0x3da1c,
1807 		0x3de00, 0x3de20,
1808 		0x3de38, 0x3de3c,
1809 		0x3de80, 0x3de80,
1810 		0x3de88, 0x3dea8,
1811 		0x3deb0, 0x3deb4,
1812 		0x3dec8, 0x3ded4,
1813 		0x3dfb8, 0x3e004,
1814 		0x3e200, 0x3e200,
1815 		0x3e208, 0x3e240,
1816 		0x3e248, 0x3e280,
1817 		0x3e288, 0x3e2c0,
1818 		0x3e2c8, 0x3e2fc,
1819 		0x3e600, 0x3e630,
1820 		0x3ea00, 0x3eabc,
1821 		0x3eb00, 0x3eb10,
1822 		0x3eb20, 0x3eb30,
1823 		0x3eb40, 0x3eb50,
1824 		0x3eb60, 0x3eb70,
1825 		0x3f000, 0x3f028,
1826 		0x3f030, 0x3f048,
1827 		0x3f060, 0x3f068,
1828 		0x3f070, 0x3f09c,
1829 		0x3f0f0, 0x3f128,
1830 		0x3f130, 0x3f148,
1831 		0x3f160, 0x3f168,
1832 		0x3f170, 0x3f19c,
1833 		0x3f1f0, 0x3f238,
1834 		0x3f240, 0x3f240,
1835 		0x3f248, 0x3f250,
1836 		0x3f25c, 0x3f264,
1837 		0x3f270, 0x3f2b8,
1838 		0x3f2c0, 0x3f2e4,
1839 		0x3f2f8, 0x3f338,
1840 		0x3f340, 0x3f340,
1841 		0x3f348, 0x3f350,
1842 		0x3f35c, 0x3f364,
1843 		0x3f370, 0x3f3b8,
1844 		0x3f3c0, 0x3f3e4,
1845 		0x3f3f8, 0x3f428,
1846 		0x3f430, 0x3f448,
1847 		0x3f460, 0x3f468,
1848 		0x3f470, 0x3f49c,
1849 		0x3f4f0, 0x3f528,
1850 		0x3f530, 0x3f548,
1851 		0x3f560, 0x3f568,
1852 		0x3f570, 0x3f59c,
1853 		0x3f5f0, 0x3f638,
1854 		0x3f640, 0x3f640,
1855 		0x3f648, 0x3f650,
1856 		0x3f65c, 0x3f664,
1857 		0x3f670, 0x3f6b8,
1858 		0x3f6c0, 0x3f6e4,
1859 		0x3f6f8, 0x3f738,
1860 		0x3f740, 0x3f740,
1861 		0x3f748, 0x3f750,
1862 		0x3f75c, 0x3f764,
1863 		0x3f770, 0x3f7b8,
1864 		0x3f7c0, 0x3f7e4,
1865 		0x3f7f8, 0x3f7fc,
1866 		0x3f814, 0x3f814,
1867 		0x3f82c, 0x3f82c,
1868 		0x3f880, 0x3f88c,
1869 		0x3f8e8, 0x3f8ec,
1870 		0x3f900, 0x3f928,
1871 		0x3f930, 0x3f948,
1872 		0x3f960, 0x3f968,
1873 		0x3f970, 0x3f99c,
1874 		0x3f9f0, 0x3fa38,
1875 		0x3fa40, 0x3fa40,
1876 		0x3fa48, 0x3fa50,
1877 		0x3fa5c, 0x3fa64,
1878 		0x3fa70, 0x3fab8,
1879 		0x3fac0, 0x3fae4,
1880 		0x3faf8, 0x3fb10,
1881 		0x3fb28, 0x3fb28,
1882 		0x3fb3c, 0x3fb50,
1883 		0x3fbf0, 0x3fc10,
1884 		0x3fc28, 0x3fc28,
1885 		0x3fc3c, 0x3fc50,
1886 		0x3fcf0, 0x3fcfc,
1887 		0x40000, 0x4000c,
1888 		0x40040, 0x40050,
1889 		0x40060, 0x40068,
1890 		0x4007c, 0x4008c,
1891 		0x40094, 0x400b0,
1892 		0x400c0, 0x40144,
1893 		0x40180, 0x4018c,
1894 		0x40200, 0x40254,
1895 		0x40260, 0x40264,
1896 		0x40270, 0x40288,
1897 		0x40290, 0x40298,
1898 		0x402ac, 0x402c8,
1899 		0x402d0, 0x402e0,
1900 		0x402f0, 0x402f0,
1901 		0x40300, 0x4033c,
1902 		0x403f8, 0x403fc,
1903 		0x41304, 0x413c4,
1904 		0x41400, 0x4140c,
1905 		0x41414, 0x4141c,
1906 		0x41480, 0x414d0,
1907 		0x44000, 0x44054,
1908 		0x4405c, 0x44078,
1909 		0x440c0, 0x44174,
1910 		0x44180, 0x441ac,
1911 		0x441b4, 0x441b8,
1912 		0x441c0, 0x44254,
1913 		0x4425c, 0x44278,
1914 		0x442c0, 0x44374,
1915 		0x44380, 0x443ac,
1916 		0x443b4, 0x443b8,
1917 		0x443c0, 0x44454,
1918 		0x4445c, 0x44478,
1919 		0x444c0, 0x44574,
1920 		0x44580, 0x445ac,
1921 		0x445b4, 0x445b8,
1922 		0x445c0, 0x44654,
1923 		0x4465c, 0x44678,
1924 		0x446c0, 0x44774,
1925 		0x44780, 0x447ac,
1926 		0x447b4, 0x447b8,
1927 		0x447c0, 0x44854,
1928 		0x4485c, 0x44878,
1929 		0x448c0, 0x44974,
1930 		0x44980, 0x449ac,
1931 		0x449b4, 0x449b8,
1932 		0x449c0, 0x449fc,
1933 		0x45000, 0x45004,
1934 		0x45010, 0x45030,
1935 		0x45040, 0x45060,
1936 		0x45068, 0x45068,
1937 		0x45080, 0x45084,
1938 		0x450a0, 0x450b0,
1939 		0x45200, 0x45204,
1940 		0x45210, 0x45230,
1941 		0x45240, 0x45260,
1942 		0x45268, 0x45268,
1943 		0x45280, 0x45284,
1944 		0x452a0, 0x452b0,
1945 		0x460c0, 0x460e4,
1946 		0x47000, 0x4703c,
1947 		0x47044, 0x4708c,
1948 		0x47200, 0x47250,
1949 		0x47400, 0x47408,
1950 		0x47414, 0x47420,
1951 		0x47600, 0x47618,
1952 		0x47800, 0x47814,
1953 		0x48000, 0x4800c,
1954 		0x48040, 0x48050,
1955 		0x48060, 0x48068,
1956 		0x4807c, 0x4808c,
1957 		0x48094, 0x480b0,
1958 		0x480c0, 0x48144,
1959 		0x48180, 0x4818c,
1960 		0x48200, 0x48254,
1961 		0x48260, 0x48264,
1962 		0x48270, 0x48288,
1963 		0x48290, 0x48298,
1964 		0x482ac, 0x482c8,
1965 		0x482d0, 0x482e0,
1966 		0x482f0, 0x482f0,
1967 		0x48300, 0x4833c,
1968 		0x483f8, 0x483fc,
1969 		0x49304, 0x493c4,
1970 		0x49400, 0x4940c,
1971 		0x49414, 0x4941c,
1972 		0x49480, 0x494d0,
1973 		0x4c000, 0x4c054,
1974 		0x4c05c, 0x4c078,
1975 		0x4c0c0, 0x4c174,
1976 		0x4c180, 0x4c1ac,
1977 		0x4c1b4, 0x4c1b8,
1978 		0x4c1c0, 0x4c254,
1979 		0x4c25c, 0x4c278,
1980 		0x4c2c0, 0x4c374,
1981 		0x4c380, 0x4c3ac,
1982 		0x4c3b4, 0x4c3b8,
1983 		0x4c3c0, 0x4c454,
1984 		0x4c45c, 0x4c478,
1985 		0x4c4c0, 0x4c574,
1986 		0x4c580, 0x4c5ac,
1987 		0x4c5b4, 0x4c5b8,
1988 		0x4c5c0, 0x4c654,
1989 		0x4c65c, 0x4c678,
1990 		0x4c6c0, 0x4c774,
1991 		0x4c780, 0x4c7ac,
1992 		0x4c7b4, 0x4c7b8,
1993 		0x4c7c0, 0x4c854,
1994 		0x4c85c, 0x4c878,
1995 		0x4c8c0, 0x4c974,
1996 		0x4c980, 0x4c9ac,
1997 		0x4c9b4, 0x4c9b8,
1998 		0x4c9c0, 0x4c9fc,
1999 		0x4d000, 0x4d004,
2000 		0x4d010, 0x4d030,
2001 		0x4d040, 0x4d060,
2002 		0x4d068, 0x4d068,
2003 		0x4d080, 0x4d084,
2004 		0x4d0a0, 0x4d0b0,
2005 		0x4d200, 0x4d204,
2006 		0x4d210, 0x4d230,
2007 		0x4d240, 0x4d260,
2008 		0x4d268, 0x4d268,
2009 		0x4d280, 0x4d284,
2010 		0x4d2a0, 0x4d2b0,
2011 		0x4e0c0, 0x4e0e4,
2012 		0x4f000, 0x4f03c,
2013 		0x4f044, 0x4f08c,
2014 		0x4f200, 0x4f250,
2015 		0x4f400, 0x4f408,
2016 		0x4f414, 0x4f420,
2017 		0x4f600, 0x4f618,
2018 		0x4f800, 0x4f814,
2019 		0x50000, 0x50084,
2020 		0x50090, 0x500cc,
2021 		0x50400, 0x50400,
2022 		0x50800, 0x50884,
2023 		0x50890, 0x508cc,
2024 		0x50c00, 0x50c00,
2025 		0x51000, 0x5101c,
2026 		0x51300, 0x51308,
2027 	};
2028 
2029 	static const unsigned int t6_reg_ranges[] = {
2030 		0x1008, 0x101c,
2031 		0x1024, 0x10a8,
2032 		0x10b4, 0x10f8,
2033 		0x1100, 0x1114,
2034 		0x111c, 0x112c,
2035 		0x1138, 0x113c,
2036 		0x1144, 0x114c,
2037 		0x1180, 0x1184,
2038 		0x1190, 0x1194,
2039 		0x11a0, 0x11a4,
2040 		0x11b0, 0x11b4,
2041 		0x11fc, 0x1274,
2042 		0x1280, 0x133c,
2043 		0x1800, 0x18fc,
2044 		0x3000, 0x302c,
2045 		0x3060, 0x30b0,
2046 		0x30b8, 0x30d8,
2047 		0x30e0, 0x30fc,
2048 		0x3140, 0x357c,
2049 		0x35a8, 0x35cc,
2050 		0x35ec, 0x35ec,
2051 		0x3600, 0x5624,
2052 		0x56cc, 0x56ec,
2053 		0x56f4, 0x5720,
2054 		0x5728, 0x575c,
2055 		0x580c, 0x5814,
2056 		0x5890, 0x589c,
2057 		0x58a4, 0x58ac,
2058 		0x58b8, 0x58bc,
2059 		0x5940, 0x595c,
2060 		0x5980, 0x598c,
2061 		0x59b0, 0x59c8,
2062 		0x59d0, 0x59dc,
2063 		0x59fc, 0x5a18,
2064 		0x5a60, 0x5a6c,
2065 		0x5a80, 0x5a8c,
2066 		0x5a94, 0x5a9c,
2067 		0x5b94, 0x5bfc,
2068 		0x5c10, 0x5e48,
2069 		0x5e50, 0x5e94,
2070 		0x5ea0, 0x5eb0,
2071 		0x5ec0, 0x5ec0,
2072 		0x5ec8, 0x5ed0,
2073 		0x5ee0, 0x5ee0,
2074 		0x5ef0, 0x5ef0,
2075 		0x5f00, 0x5f00,
2076 		0x6000, 0x6020,
2077 		0x6028, 0x6040,
2078 		0x6058, 0x609c,
2079 		0x60a8, 0x619c,
2080 		0x7700, 0x7798,
2081 		0x77c0, 0x7880,
2082 		0x78cc, 0x78fc,
2083 		0x7b00, 0x7b58,
2084 		0x7b60, 0x7b84,
2085 		0x7b8c, 0x7c54,
2086 		0x7d00, 0x7d38,
2087 		0x7d40, 0x7d84,
2088 		0x7d8c, 0x7ddc,
2089 		0x7de4, 0x7e04,
2090 		0x7e10, 0x7e1c,
2091 		0x7e24, 0x7e38,
2092 		0x7e40, 0x7e44,
2093 		0x7e4c, 0x7e78,
2094 		0x7e80, 0x7edc,
2095 		0x7ee8, 0x7efc,
2096 		0x8dc0, 0x8de4,
2097 		0x8df8, 0x8e04,
2098 		0x8e10, 0x8e84,
2099 		0x8ea0, 0x8f88,
2100 		0x8fb8, 0x9058,
2101 		0x9060, 0x9060,
2102 		0x9068, 0x90f8,
2103 		0x9100, 0x9124,
2104 		0x9400, 0x9470,
2105 		0x9600, 0x9600,
2106 		0x9608, 0x9638,
2107 		0x9640, 0x9704,
2108 		0x9710, 0x971c,
2109 		0x9800, 0x9808,
2110 		0x9820, 0x983c,
2111 		0x9850, 0x9864,
2112 		0x9c00, 0x9c6c,
2113 		0x9c80, 0x9cec,
2114 		0x9d00, 0x9d6c,
2115 		0x9d80, 0x9dec,
2116 		0x9e00, 0x9e6c,
2117 		0x9e80, 0x9eec,
2118 		0x9f00, 0x9f6c,
2119 		0x9f80, 0xa020,
2120 		0xd004, 0xd03c,
2121 		0xd100, 0xd118,
2122 		0xd200, 0xd214,
2123 		0xd220, 0xd234,
2124 		0xd240, 0xd254,
2125 		0xd260, 0xd274,
2126 		0xd280, 0xd294,
2127 		0xd2a0, 0xd2b4,
2128 		0xd2c0, 0xd2d4,
2129 		0xd2e0, 0xd2f4,
2130 		0xd300, 0xd31c,
2131 		0xdfc0, 0xdfe0,
2132 		0xe000, 0xf008,
2133 		0xf010, 0xf018,
2134 		0xf020, 0xf028,
2135 		0x11000, 0x11014,
2136 		0x11048, 0x1106c,
2137 		0x11074, 0x11088,
2138 		0x11098, 0x11120,
2139 		0x1112c, 0x1117c,
2140 		0x11190, 0x112e0,
2141 		0x11300, 0x1130c,
2142 		0x12000, 0x1206c,
2143 		0x19040, 0x1906c,
2144 		0x19078, 0x19080,
2145 		0x1908c, 0x190e8,
2146 		0x190f0, 0x190f8,
2147 		0x19100, 0x19110,
2148 		0x19120, 0x19124,
2149 		0x19150, 0x19194,
2150 		0x1919c, 0x191b0,
2151 		0x191d0, 0x191e8,
2152 		0x19238, 0x19290,
2153 		0x192a4, 0x192b0,
2154 		0x192bc, 0x192bc,
2155 		0x19348, 0x1934c,
2156 		0x193f8, 0x19418,
2157 		0x19420, 0x19428,
2158 		0x19430, 0x19444,
2159 		0x1944c, 0x1946c,
2160 		0x19474, 0x19474,
2161 		0x19490, 0x194cc,
2162 		0x194f0, 0x194f8,
2163 		0x19c00, 0x19c48,
2164 		0x19c50, 0x19c80,
2165 		0x19c94, 0x19c98,
2166 		0x19ca0, 0x19cbc,
2167 		0x19ce4, 0x19ce4,
2168 		0x19cf0, 0x19cf8,
2169 		0x19d00, 0x19d28,
2170 		0x19d50, 0x19d78,
2171 		0x19d94, 0x19d98,
2172 		0x19da0, 0x19dc8,
2173 		0x19df0, 0x19e10,
2174 		0x19e50, 0x19e6c,
2175 		0x19ea0, 0x19ebc,
2176 		0x19ec4, 0x19ef4,
2177 		0x19f04, 0x19f2c,
2178 		0x19f34, 0x19f34,
2179 		0x19f40, 0x19f50,
2180 		0x19f90, 0x19fac,
2181 		0x19fc4, 0x19fc8,
2182 		0x19fd0, 0x19fe4,
2183 		0x1a000, 0x1a004,
2184 		0x1a010, 0x1a06c,
2185 		0x1a0b0, 0x1a0e4,
2186 		0x1a0ec, 0x1a0f8,
2187 		0x1a100, 0x1a108,
2188 		0x1a114, 0x1a120,
2189 		0x1a128, 0x1a130,
2190 		0x1a138, 0x1a138,
2191 		0x1a190, 0x1a1c4,
2192 		0x1a1fc, 0x1a1fc,
2193 		0x1e008, 0x1e00c,
2194 		0x1e040, 0x1e044,
2195 		0x1e04c, 0x1e04c,
2196 		0x1e284, 0x1e290,
2197 		0x1e2c0, 0x1e2c0,
2198 		0x1e2e0, 0x1e2e0,
2199 		0x1e300, 0x1e384,
2200 		0x1e3c0, 0x1e3c8,
2201 		0x1e408, 0x1e40c,
2202 		0x1e440, 0x1e444,
2203 		0x1e44c, 0x1e44c,
2204 		0x1e684, 0x1e690,
2205 		0x1e6c0, 0x1e6c0,
2206 		0x1e6e0, 0x1e6e0,
2207 		0x1e700, 0x1e784,
2208 		0x1e7c0, 0x1e7c8,
2209 		0x1e808, 0x1e80c,
2210 		0x1e840, 0x1e844,
2211 		0x1e84c, 0x1e84c,
2212 		0x1ea84, 0x1ea90,
2213 		0x1eac0, 0x1eac0,
2214 		0x1eae0, 0x1eae0,
2215 		0x1eb00, 0x1eb84,
2216 		0x1ebc0, 0x1ebc8,
2217 		0x1ec08, 0x1ec0c,
2218 		0x1ec40, 0x1ec44,
2219 		0x1ec4c, 0x1ec4c,
2220 		0x1ee84, 0x1ee90,
2221 		0x1eec0, 0x1eec0,
2222 		0x1eee0, 0x1eee0,
2223 		0x1ef00, 0x1ef84,
2224 		0x1efc0, 0x1efc8,
2225 		0x1f008, 0x1f00c,
2226 		0x1f040, 0x1f044,
2227 		0x1f04c, 0x1f04c,
2228 		0x1f284, 0x1f290,
2229 		0x1f2c0, 0x1f2c0,
2230 		0x1f2e0, 0x1f2e0,
2231 		0x1f300, 0x1f384,
2232 		0x1f3c0, 0x1f3c8,
2233 		0x1f408, 0x1f40c,
2234 		0x1f440, 0x1f444,
2235 		0x1f44c, 0x1f44c,
2236 		0x1f684, 0x1f690,
2237 		0x1f6c0, 0x1f6c0,
2238 		0x1f6e0, 0x1f6e0,
2239 		0x1f700, 0x1f784,
2240 		0x1f7c0, 0x1f7c8,
2241 		0x1f808, 0x1f80c,
2242 		0x1f840, 0x1f844,
2243 		0x1f84c, 0x1f84c,
2244 		0x1fa84, 0x1fa90,
2245 		0x1fac0, 0x1fac0,
2246 		0x1fae0, 0x1fae0,
2247 		0x1fb00, 0x1fb84,
2248 		0x1fbc0, 0x1fbc8,
2249 		0x1fc08, 0x1fc0c,
2250 		0x1fc40, 0x1fc44,
2251 		0x1fc4c, 0x1fc4c,
2252 		0x1fe84, 0x1fe90,
2253 		0x1fec0, 0x1fec0,
2254 		0x1fee0, 0x1fee0,
2255 		0x1ff00, 0x1ff84,
2256 		0x1ffc0, 0x1ffc8,
2257 		0x30000, 0x30030,
2258 		0x30100, 0x30168,
2259 		0x30190, 0x301a0,
2260 		0x301a8, 0x301b8,
2261 		0x301c4, 0x301c8,
2262 		0x301d0, 0x301d0,
2263 		0x30200, 0x30320,
2264 		0x30400, 0x304b4,
2265 		0x304c0, 0x3052c,
2266 		0x30540, 0x3061c,
2267 		0x30800, 0x308a0,
2268 		0x308c0, 0x30908,
2269 		0x30910, 0x309b8,
2270 		0x30a00, 0x30a04,
2271 		0x30a0c, 0x30a14,
2272 		0x30a1c, 0x30a2c,
2273 		0x30a44, 0x30a50,
2274 		0x30a74, 0x30a74,
2275 		0x30a7c, 0x30afc,
2276 		0x30b08, 0x30c24,
2277 		0x30d00, 0x30d14,
2278 		0x30d1c, 0x30d3c,
2279 		0x30d44, 0x30d4c,
2280 		0x30d54, 0x30d74,
2281 		0x30d7c, 0x30d7c,
2282 		0x30de0, 0x30de0,
2283 		0x30e00, 0x30ed4,
2284 		0x30f00, 0x30fa4,
2285 		0x30fc0, 0x30fc4,
2286 		0x31000, 0x31004,
2287 		0x31080, 0x310fc,
2288 		0x31208, 0x31220,
2289 		0x3123c, 0x31254,
2290 		0x31300, 0x31300,
2291 		0x31308, 0x3131c,
2292 		0x31338, 0x3133c,
2293 		0x31380, 0x31380,
2294 		0x31388, 0x313a8,
2295 		0x313b4, 0x313b4,
2296 		0x31400, 0x31420,
2297 		0x31438, 0x3143c,
2298 		0x31480, 0x31480,
2299 		0x314a8, 0x314a8,
2300 		0x314b0, 0x314b4,
2301 		0x314c8, 0x314d4,
2302 		0x31a40, 0x31a4c,
2303 		0x31af0, 0x31b20,
2304 		0x31b38, 0x31b3c,
2305 		0x31b80, 0x31b80,
2306 		0x31ba8, 0x31ba8,
2307 		0x31bb0, 0x31bb4,
2308 		0x31bc8, 0x31bd4,
2309 		0x32140, 0x3218c,
2310 		0x321f0, 0x321f4,
2311 		0x32200, 0x32200,
2312 		0x32218, 0x32218,
2313 		0x32400, 0x32400,
2314 		0x32408, 0x3241c,
2315 		0x32618, 0x32620,
2316 		0x32664, 0x32664,
2317 		0x326a8, 0x326a8,
2318 		0x326ec, 0x326ec,
2319 		0x32a00, 0x32abc,
2320 		0x32b00, 0x32b18,
2321 		0x32b20, 0x32b38,
2322 		0x32b40, 0x32b58,
2323 		0x32b60, 0x32b78,
2324 		0x32c00, 0x32c00,
2325 		0x32c08, 0x32c3c,
2326 		0x33000, 0x3302c,
2327 		0x33034, 0x33050,
2328 		0x33058, 0x33058,
2329 		0x33060, 0x3308c,
2330 		0x3309c, 0x330ac,
2331 		0x330c0, 0x330c0,
2332 		0x330c8, 0x330d0,
2333 		0x330d8, 0x330e0,
2334 		0x330ec, 0x3312c,
2335 		0x33134, 0x33150,
2336 		0x33158, 0x33158,
2337 		0x33160, 0x3318c,
2338 		0x3319c, 0x331ac,
2339 		0x331c0, 0x331c0,
2340 		0x331c8, 0x331d0,
2341 		0x331d8, 0x331e0,
2342 		0x331ec, 0x33290,
2343 		0x33298, 0x332c4,
2344 		0x332e4, 0x33390,
2345 		0x33398, 0x333c4,
2346 		0x333e4, 0x3342c,
2347 		0x33434, 0x33450,
2348 		0x33458, 0x33458,
2349 		0x33460, 0x3348c,
2350 		0x3349c, 0x334ac,
2351 		0x334c0, 0x334c0,
2352 		0x334c8, 0x334d0,
2353 		0x334d8, 0x334e0,
2354 		0x334ec, 0x3352c,
2355 		0x33534, 0x33550,
2356 		0x33558, 0x33558,
2357 		0x33560, 0x3358c,
2358 		0x3359c, 0x335ac,
2359 		0x335c0, 0x335c0,
2360 		0x335c8, 0x335d0,
2361 		0x335d8, 0x335e0,
2362 		0x335ec, 0x33690,
2363 		0x33698, 0x336c4,
2364 		0x336e4, 0x33790,
2365 		0x33798, 0x337c4,
2366 		0x337e4, 0x337fc,
2367 		0x33814, 0x33814,
2368 		0x33854, 0x33868,
2369 		0x33880, 0x3388c,
2370 		0x338c0, 0x338d0,
2371 		0x338e8, 0x338ec,
2372 		0x33900, 0x3392c,
2373 		0x33934, 0x33950,
2374 		0x33958, 0x33958,
2375 		0x33960, 0x3398c,
2376 		0x3399c, 0x339ac,
2377 		0x339c0, 0x339c0,
2378 		0x339c8, 0x339d0,
2379 		0x339d8, 0x339e0,
2380 		0x339ec, 0x33a90,
2381 		0x33a98, 0x33ac4,
2382 		0x33ae4, 0x33b10,
2383 		0x33b24, 0x33b28,
2384 		0x33b38, 0x33b50,
2385 		0x33bf0, 0x33c10,
2386 		0x33c24, 0x33c28,
2387 		0x33c38, 0x33c50,
2388 		0x33cf0, 0x33cfc,
2389 		0x34000, 0x34030,
2390 		0x34100, 0x34168,
2391 		0x34190, 0x341a0,
2392 		0x341a8, 0x341b8,
2393 		0x341c4, 0x341c8,
2394 		0x341d0, 0x341d0,
2395 		0x34200, 0x34320,
2396 		0x34400, 0x344b4,
2397 		0x344c0, 0x3452c,
2398 		0x34540, 0x3461c,
2399 		0x34800, 0x348a0,
2400 		0x348c0, 0x34908,
2401 		0x34910, 0x349b8,
2402 		0x34a00, 0x34a04,
2403 		0x34a0c, 0x34a14,
2404 		0x34a1c, 0x34a2c,
2405 		0x34a44, 0x34a50,
2406 		0x34a74, 0x34a74,
2407 		0x34a7c, 0x34afc,
2408 		0x34b08, 0x34c24,
2409 		0x34d00, 0x34d14,
2410 		0x34d1c, 0x34d3c,
2411 		0x34d44, 0x34d4c,
2412 		0x34d54, 0x34d74,
2413 		0x34d7c, 0x34d7c,
2414 		0x34de0, 0x34de0,
2415 		0x34e00, 0x34ed4,
2416 		0x34f00, 0x34fa4,
2417 		0x34fc0, 0x34fc4,
2418 		0x35000, 0x35004,
2419 		0x35080, 0x350fc,
2420 		0x35208, 0x35220,
2421 		0x3523c, 0x35254,
2422 		0x35300, 0x35300,
2423 		0x35308, 0x3531c,
2424 		0x35338, 0x3533c,
2425 		0x35380, 0x35380,
2426 		0x35388, 0x353a8,
2427 		0x353b4, 0x353b4,
2428 		0x35400, 0x35420,
2429 		0x35438, 0x3543c,
2430 		0x35480, 0x35480,
2431 		0x354a8, 0x354a8,
2432 		0x354b0, 0x354b4,
2433 		0x354c8, 0x354d4,
2434 		0x35a40, 0x35a4c,
2435 		0x35af0, 0x35b20,
2436 		0x35b38, 0x35b3c,
2437 		0x35b80, 0x35b80,
2438 		0x35ba8, 0x35ba8,
2439 		0x35bb0, 0x35bb4,
2440 		0x35bc8, 0x35bd4,
2441 		0x36140, 0x3618c,
2442 		0x361f0, 0x361f4,
2443 		0x36200, 0x36200,
2444 		0x36218, 0x36218,
2445 		0x36400, 0x36400,
2446 		0x36408, 0x3641c,
2447 		0x36618, 0x36620,
2448 		0x36664, 0x36664,
2449 		0x366a8, 0x366a8,
2450 		0x366ec, 0x366ec,
2451 		0x36a00, 0x36abc,
2452 		0x36b00, 0x36b18,
2453 		0x36b20, 0x36b38,
2454 		0x36b40, 0x36b58,
2455 		0x36b60, 0x36b78,
2456 		0x36c00, 0x36c00,
2457 		0x36c08, 0x36c3c,
2458 		0x37000, 0x3702c,
2459 		0x37034, 0x37050,
2460 		0x37058, 0x37058,
2461 		0x37060, 0x3708c,
2462 		0x3709c, 0x370ac,
2463 		0x370c0, 0x370c0,
2464 		0x370c8, 0x370d0,
2465 		0x370d8, 0x370e0,
2466 		0x370ec, 0x3712c,
2467 		0x37134, 0x37150,
2468 		0x37158, 0x37158,
2469 		0x37160, 0x3718c,
2470 		0x3719c, 0x371ac,
2471 		0x371c0, 0x371c0,
2472 		0x371c8, 0x371d0,
2473 		0x371d8, 0x371e0,
2474 		0x371ec, 0x37290,
2475 		0x37298, 0x372c4,
2476 		0x372e4, 0x37390,
2477 		0x37398, 0x373c4,
2478 		0x373e4, 0x3742c,
2479 		0x37434, 0x37450,
2480 		0x37458, 0x37458,
2481 		0x37460, 0x3748c,
2482 		0x3749c, 0x374ac,
2483 		0x374c0, 0x374c0,
2484 		0x374c8, 0x374d0,
2485 		0x374d8, 0x374e0,
2486 		0x374ec, 0x3752c,
2487 		0x37534, 0x37550,
2488 		0x37558, 0x37558,
2489 		0x37560, 0x3758c,
2490 		0x3759c, 0x375ac,
2491 		0x375c0, 0x375c0,
2492 		0x375c8, 0x375d0,
2493 		0x375d8, 0x375e0,
2494 		0x375ec, 0x37690,
2495 		0x37698, 0x376c4,
2496 		0x376e4, 0x37790,
2497 		0x37798, 0x377c4,
2498 		0x377e4, 0x377fc,
2499 		0x37814, 0x37814,
2500 		0x37854, 0x37868,
2501 		0x37880, 0x3788c,
2502 		0x378c0, 0x378d0,
2503 		0x378e8, 0x378ec,
2504 		0x37900, 0x3792c,
2505 		0x37934, 0x37950,
2506 		0x37958, 0x37958,
2507 		0x37960, 0x3798c,
2508 		0x3799c, 0x379ac,
2509 		0x379c0, 0x379c0,
2510 		0x379c8, 0x379d0,
2511 		0x379d8, 0x379e0,
2512 		0x379ec, 0x37a90,
2513 		0x37a98, 0x37ac4,
2514 		0x37ae4, 0x37b10,
2515 		0x37b24, 0x37b28,
2516 		0x37b38, 0x37b50,
2517 		0x37bf0, 0x37c10,
2518 		0x37c24, 0x37c28,
2519 		0x37c38, 0x37c50,
2520 		0x37cf0, 0x37cfc,
2521 		0x40040, 0x40040,
2522 		0x40080, 0x40084,
2523 		0x40100, 0x40100,
2524 		0x40140, 0x401bc,
2525 		0x40200, 0x40214,
2526 		0x40228, 0x40228,
2527 		0x40240, 0x40258,
2528 		0x40280, 0x40280,
2529 		0x40304, 0x40304,
2530 		0x40330, 0x4033c,
2531 		0x41304, 0x413c8,
2532 		0x413d0, 0x413dc,
2533 		0x413f0, 0x413f0,
2534 		0x41400, 0x4140c,
2535 		0x41414, 0x4141c,
2536 		0x41480, 0x414d0,
2537 		0x44000, 0x4407c,
2538 		0x440c0, 0x441ac,
2539 		0x441b4, 0x4427c,
2540 		0x442c0, 0x443ac,
2541 		0x443b4, 0x4447c,
2542 		0x444c0, 0x445ac,
2543 		0x445b4, 0x4467c,
2544 		0x446c0, 0x447ac,
2545 		0x447b4, 0x4487c,
2546 		0x448c0, 0x449ac,
2547 		0x449b4, 0x44a7c,
2548 		0x44ac0, 0x44bac,
2549 		0x44bb4, 0x44c7c,
2550 		0x44cc0, 0x44dac,
2551 		0x44db4, 0x44e7c,
2552 		0x44ec0, 0x44fac,
2553 		0x44fb4, 0x4507c,
2554 		0x450c0, 0x451ac,
2555 		0x451b4, 0x451fc,
2556 		0x45800, 0x45804,
2557 		0x45810, 0x45830,
2558 		0x45840, 0x45860,
2559 		0x45868, 0x45868,
2560 		0x45880, 0x45884,
2561 		0x458a0, 0x458b0,
2562 		0x45a00, 0x45a04,
2563 		0x45a10, 0x45a30,
2564 		0x45a40, 0x45a60,
2565 		0x45a68, 0x45a68,
2566 		0x45a80, 0x45a84,
2567 		0x45aa0, 0x45ab0,
2568 		0x460c0, 0x460e4,
2569 		0x47000, 0x4703c,
2570 		0x47044, 0x4708c,
2571 		0x47200, 0x47250,
2572 		0x47400, 0x47408,
2573 		0x47414, 0x47420,
2574 		0x47600, 0x47618,
2575 		0x47800, 0x47814,
2576 		0x47820, 0x4782c,
2577 		0x50000, 0x50084,
2578 		0x50090, 0x500cc,
2579 		0x50300, 0x50384,
2580 		0x50400, 0x50400,
2581 		0x50800, 0x50884,
2582 		0x50890, 0x508cc,
2583 		0x50b00, 0x50b84,
2584 		0x50c00, 0x50c00,
2585 		0x51000, 0x51020,
2586 		0x51028, 0x510b0,
2587 		0x51300, 0x51324,
2588 	};
2589 
2590 	u32 *buf_end = (u32 *)((char *)buf + buf_size);
2591 	const unsigned int *reg_ranges;
2592 	int reg_ranges_size, range;
2593 	unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
2594 
2595 	/* Select the right set of register ranges to dump depending on the
2596 	 * adapter chip type.
2597 	 */
2598 	switch (chip_version) {
2599 	case CHELSIO_T4:
2600 		reg_ranges = t4_reg_ranges;
2601 		reg_ranges_size = ARRAY_SIZE(t4_reg_ranges);
2602 		break;
2603 
2604 	case CHELSIO_T5:
2605 		reg_ranges = t5_reg_ranges;
2606 		reg_ranges_size = ARRAY_SIZE(t5_reg_ranges);
2607 		break;
2608 
2609 	case CHELSIO_T6:
2610 		reg_ranges = t6_reg_ranges;
2611 		reg_ranges_size = ARRAY_SIZE(t6_reg_ranges);
2612 		break;
2613 
2614 	default:
2615 		dev_err(adap->pdev_dev,
2616 			"Unsupported chip version %d\n", chip_version);
2617 		return;
2618 	}
2619 
2620 	/* Clear the register buffer and insert the appropriate register
2621 	 * values selected by the above register ranges.
2622 	 */
2623 	memset(buf, 0, buf_size);
2624 	for (range = 0; range < reg_ranges_size; range += 2) {
2625 		unsigned int reg = reg_ranges[range];
2626 		unsigned int last_reg = reg_ranges[range + 1];
2627 		u32 *bufp = (u32 *)((char *)buf + reg);
2628 
2629 		/* Iterate across the register range filling in the register
2630 		 * buffer but don't write past the end of the register buffer.
2631 		 */
2632 		while (reg <= last_reg && bufp < buf_end) {
2633 			*bufp++ = t4_read_reg(adap, reg);
2634 			reg += sizeof(u32);
2635 		}
2636 	}
2637 }
2638 
2639 #define EEPROM_STAT_ADDR   0x7bfc
2640 #define VPD_BASE           0x400
2641 #define VPD_BASE_OLD       0
2642 #define VPD_LEN            1024
2643 #define CHELSIO_VPD_UNIQUE_ID 0x82
2644 
2645 /**
2646  * t4_eeprom_ptov - translate a physical EEPROM address to virtual
2647  * @phys_addr: the physical EEPROM address
2648  * @fn: the PCI function number
2649  * @sz: size of function-specific area
2650  *
2651  * Translate a physical EEPROM address to virtual.  The first 1K is
2652  * accessed through virtual addresses starting at 31K, the rest is
2653  * accessed through virtual addresses starting at 0.
2654  *
2655  * The mapping is as follows:
2656  * [0..1K) -> [31K..32K)
2657  * [1K..1K+A) -> [31K-A..31K)
2658  * [1K+A..ES) -> [0..ES-A-1K)
2659  *
2660  * where A = @fn * @sz, and ES = EEPROM size.
2661  */
2662 int t4_eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
2663 {
2664 	fn *= sz;
2665 	if (phys_addr < 1024)
2666 		return phys_addr + (31 << 10);
2667 	if (phys_addr < 1024 + fn)
2668 		return 31744 - fn + phys_addr - 1024;
2669 	if (phys_addr < EEPROMSIZE)
2670 		return phys_addr - 1024 - fn;
2671 	return -EINVAL;
2672 }
2673 
2674 /**
2675  *	t4_seeprom_wp - enable/disable EEPROM write protection
2676  *	@adapter: the adapter
2677  *	@enable: whether to enable or disable write protection
2678  *
2679  *	Enables or disables write protection on the serial EEPROM.
2680  */
2681 int t4_seeprom_wp(struct adapter *adapter, bool enable)
2682 {
2683 	unsigned int v = enable ? 0xc : 0;
2684 	int ret = pci_write_vpd(adapter->pdev, EEPROM_STAT_ADDR, 4, &v);
2685 	return ret < 0 ? ret : 0;
2686 }
2687 
2688 /**
2689  *	t4_get_raw_vpd_params - read VPD parameters from VPD EEPROM
2690  *	@adapter: adapter to read
2691  *	@p: where to store the parameters
2692  *
2693  *	Reads card parameters stored in VPD EEPROM.
2694  */
2695 int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
2696 {
2697 	int i, ret = 0, addr;
2698 	int ec, sn, pn, na;
2699 	u8 *vpd, csum;
2700 	unsigned int vpdr_len, kw_offset, id_len;
2701 
2702 	vpd = vmalloc(VPD_LEN);
2703 	if (!vpd)
2704 		return -ENOMEM;
2705 
2706 	/* Card information normally starts at VPD_BASE but early cards had
2707 	 * it at 0.
2708 	 */
2709 	ret = pci_read_vpd(adapter->pdev, VPD_BASE, sizeof(u32), vpd);
2710 	if (ret < 0)
2711 		goto out;
2712 
2713 	/* The VPD shall have a unique identifier specified by the PCI SIG.
2714 	 * For chelsio adapters, the identifier is 0x82. The first byte of a VPD
2715 	 * shall be CHELSIO_VPD_UNIQUE_ID (0x82). The VPD programming software
2716 	 * is expected to automatically put this entry at the
2717 	 * beginning of the VPD.
2718 	 */
2719 	addr = *vpd == CHELSIO_VPD_UNIQUE_ID ? VPD_BASE : VPD_BASE_OLD;
2720 
2721 	ret = pci_read_vpd(adapter->pdev, addr, VPD_LEN, vpd);
2722 	if (ret < 0)
2723 		goto out;
2724 
2725 	if (vpd[0] != PCI_VPD_LRDT_ID_STRING) {
2726 		dev_err(adapter->pdev_dev, "missing VPD ID string\n");
2727 		ret = -EINVAL;
2728 		goto out;
2729 	}
2730 
2731 	id_len = pci_vpd_lrdt_size(vpd);
2732 	if (id_len > ID_LEN)
2733 		id_len = ID_LEN;
2734 
2735 	i = pci_vpd_find_tag(vpd, 0, VPD_LEN, PCI_VPD_LRDT_RO_DATA);
2736 	if (i < 0) {
2737 		dev_err(adapter->pdev_dev, "missing VPD-R section\n");
2738 		ret = -EINVAL;
2739 		goto out;
2740 	}
2741 
2742 	vpdr_len = pci_vpd_lrdt_size(&vpd[i]);
2743 	kw_offset = i + PCI_VPD_LRDT_TAG_SIZE;
2744 	if (vpdr_len + kw_offset > VPD_LEN) {
2745 		dev_err(adapter->pdev_dev, "bad VPD-R length %u\n", vpdr_len);
2746 		ret = -EINVAL;
2747 		goto out;
2748 	}
2749 
2750 #define FIND_VPD_KW(var, name) do { \
2751 	var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
2752 	if (var < 0) { \
2753 		dev_err(adapter->pdev_dev, "missing VPD keyword " name "\n"); \
2754 		ret = -EINVAL; \
2755 		goto out; \
2756 	} \
2757 	var += PCI_VPD_INFO_FLD_HDR_SIZE; \
2758 } while (0)
2759 
2760 	FIND_VPD_KW(i, "RV");
2761 	for (csum = 0; i >= 0; i--)
2762 		csum += vpd[i];
2763 
2764 	if (csum) {
2765 		dev_err(adapter->pdev_dev,
2766 			"corrupted VPD EEPROM, actual csum %u\n", csum);
2767 		ret = -EINVAL;
2768 		goto out;
2769 	}
2770 
2771 	FIND_VPD_KW(ec, "EC");
2772 	FIND_VPD_KW(sn, "SN");
2773 	FIND_VPD_KW(pn, "PN");
2774 	FIND_VPD_KW(na, "NA");
2775 #undef FIND_VPD_KW
2776 
2777 	memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
2778 	strim(p->id);
2779 	memcpy(p->ec, vpd + ec, EC_LEN);
2780 	strim(p->ec);
2781 	i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
2782 	memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
2783 	strim(p->sn);
2784 	i = pci_vpd_info_field_size(vpd + pn - PCI_VPD_INFO_FLD_HDR_SIZE);
2785 	memcpy(p->pn, vpd + pn, min(i, PN_LEN));
2786 	strim(p->pn);
2787 	memcpy(p->na, vpd + na, min(i, MACADDR_LEN));
2788 	strim((char *)p->na);
2789 
2790 out:
2791 	vfree(vpd);
2792 	return ret < 0 ? ret : 0;
2793 }
2794 
2795 /**
2796  *	t4_get_vpd_params - read VPD parameters & retrieve Core Clock
2797  *	@adapter: adapter to read
2798  *	@p: where to store the parameters
2799  *
2800  *	Reads card parameters stored in VPD EEPROM and retrieves the Core
2801  *	Clock.  This can only be called after a connection to the firmware
2802  *	is established.
2803  */
2804 int t4_get_vpd_params(struct adapter *adapter, struct vpd_params *p)
2805 {
2806 	u32 cclk_param, cclk_val;
2807 	int ret;
2808 
2809 	/* Grab the raw VPD parameters.
2810 	 */
2811 	ret = t4_get_raw_vpd_params(adapter, p);
2812 	if (ret)
2813 		return ret;
2814 
2815 	/* Ask firmware for the Core Clock since it knows how to translate the
2816 	 * Reference Clock ('V2') VPD field into a Core Clock value ...
2817 	 */
2818 	cclk_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
2819 		      FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_CCLK));
2820 	ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
2821 			      1, &cclk_param, &cclk_val);
2822 
2823 	if (ret)
2824 		return ret;
2825 	p->cclk = cclk_val;
2826 
2827 	return 0;
2828 }
2829 
2830 /* serial flash and firmware constants */
2831 enum {
2832 	SF_ATTEMPTS = 10,             /* max retries for SF operations */
2833 
2834 	/* flash command opcodes */
2835 	SF_PROG_PAGE    = 2,          /* program page */
2836 	SF_WR_DISABLE   = 4,          /* disable writes */
2837 	SF_RD_STATUS    = 5,          /* read status register */
2838 	SF_WR_ENABLE    = 6,          /* enable writes */
2839 	SF_RD_DATA_FAST = 0xb,        /* read flash */
2840 	SF_RD_ID        = 0x9f,       /* read ID */
2841 	SF_ERASE_SECTOR = 0xd8,       /* erase sector */
2842 };
2843 
2844 /**
2845  *	sf1_read - read data from the serial flash
2846  *	@adapter: the adapter
2847  *	@byte_cnt: number of bytes to read
2848  *	@cont: whether another operation will be chained
2849  *	@lock: whether to lock SF for PL access only
2850  *	@valp: where to store the read data
2851  *
2852  *	Reads up to 4 bytes of data from the serial flash.  The location of
2853  *	the read needs to be specified prior to calling this by issuing the
2854  *	appropriate commands to the serial flash.
2855  */
2856 static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
2857 		    int lock, u32 *valp)
2858 {
2859 	int ret;
2860 
2861 	if (!byte_cnt || byte_cnt > 4)
2862 		return -EINVAL;
2863 	if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F)
2864 		return -EBUSY;
2865 	t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) |
2866 		     SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1));
2867 	ret = t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5);
2868 	if (!ret)
2869 		*valp = t4_read_reg(adapter, SF_DATA_A);
2870 	return ret;
2871 }
2872 
2873 /**
2874  *	sf1_write - write data to the serial flash
2875  *	@adapter: the adapter
2876  *	@byte_cnt: number of bytes to write
2877  *	@cont: whether another operation will be chained
2878  *	@lock: whether to lock SF for PL access only
2879  *	@val: value to write
2880  *
2881  *	Writes up to 4 bytes of data to the serial flash.  The location of
2882  *	the write needs to be specified prior to calling this by issuing the
2883  *	appropriate commands to the serial flash.
2884  */
2885 static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
2886 		     int lock, u32 val)
2887 {
2888 	if (!byte_cnt || byte_cnt > 4)
2889 		return -EINVAL;
2890 	if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F)
2891 		return -EBUSY;
2892 	t4_write_reg(adapter, SF_DATA_A, val);
2893 	t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) |
2894 		     SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1) | OP_V(1));
2895 	return t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5);
2896 }
2897 
2898 /**
2899  *	flash_wait_op - wait for a flash operation to complete
2900  *	@adapter: the adapter
2901  *	@attempts: max number of polls of the status register
2902  *	@delay: delay between polls in ms
2903  *
2904  *	Wait for a flash operation to complete by polling the status register.
2905  */
2906 static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
2907 {
2908 	int ret;
2909 	u32 status;
2910 
2911 	while (1) {
2912 		if ((ret = sf1_write(adapter, 1, 1, 1, SF_RD_STATUS)) != 0 ||
2913 		    (ret = sf1_read(adapter, 1, 0, 1, &status)) != 0)
2914 			return ret;
2915 		if (!(status & 1))
2916 			return 0;
2917 		if (--attempts == 0)
2918 			return -EAGAIN;
2919 		if (delay)
2920 			msleep(delay);
2921 	}
2922 }
2923 
2924 /**
2925  *	t4_read_flash - read words from serial flash
2926  *	@adapter: the adapter
2927  *	@addr: the start address for the read
2928  *	@nwords: how many 32-bit words to read
2929  *	@data: where to store the read data
2930  *	@byte_oriented: whether to store data as bytes or as words
2931  *
2932  *	Read the specified number of 32-bit words from the serial flash.
2933  *	If @byte_oriented is set the read data is stored as a byte array
2934  *	(i.e., big-endian), otherwise as 32-bit words in the platform's
2935  *	natural endianness.
2936  */
2937 int t4_read_flash(struct adapter *adapter, unsigned int addr,
2938 		  unsigned int nwords, u32 *data, int byte_oriented)
2939 {
2940 	int ret;
2941 
2942 	if (addr + nwords * sizeof(u32) > adapter->params.sf_size || (addr & 3))
2943 		return -EINVAL;
2944 
2945 	addr = swab32(addr) | SF_RD_DATA_FAST;
2946 
2947 	if ((ret = sf1_write(adapter, 4, 1, 0, addr)) != 0 ||
2948 	    (ret = sf1_read(adapter, 1, 1, 0, data)) != 0)
2949 		return ret;
2950 
2951 	for ( ; nwords; nwords--, data++) {
2952 		ret = sf1_read(adapter, 4, nwords > 1, nwords == 1, data);
2953 		if (nwords == 1)
2954 			t4_write_reg(adapter, SF_OP_A, 0);    /* unlock SF */
2955 		if (ret)
2956 			return ret;
2957 		if (byte_oriented)
2958 			*data = (__force __u32)(cpu_to_be32(*data));
2959 	}
2960 	return 0;
2961 }
2962 
2963 /**
2964  *	t4_write_flash - write up to a page of data to the serial flash
2965  *	@adapter: the adapter
2966  *	@addr: the start address to write
2967  *	@n: length of data to write in bytes
2968  *	@data: the data to write
2969  *
2970  *	Writes up to a page of data (256 bytes) to the serial flash starting
2971  *	at the given address.  All the data must be written to the same page.
2972  */
2973 static int t4_write_flash(struct adapter *adapter, unsigned int addr,
2974 			  unsigned int n, const u8 *data)
2975 {
2976 	int ret;
2977 	u32 buf[64];
2978 	unsigned int i, c, left, val, offset = addr & 0xff;
2979 
2980 	if (addr >= adapter->params.sf_size || offset + n > SF_PAGE_SIZE)
2981 		return -EINVAL;
2982 
2983 	val = swab32(addr) | SF_PROG_PAGE;
2984 
2985 	if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
2986 	    (ret = sf1_write(adapter, 4, 1, 1, val)) != 0)
2987 		goto unlock;
2988 
2989 	for (left = n; left; left -= c) {
2990 		c = min(left, 4U);
2991 		for (val = 0, i = 0; i < c; ++i)
2992 			val = (val << 8) + *data++;
2993 
2994 		ret = sf1_write(adapter, c, c != left, 1, val);
2995 		if (ret)
2996 			goto unlock;
2997 	}
2998 	ret = flash_wait_op(adapter, 8, 1);
2999 	if (ret)
3000 		goto unlock;
3001 
3002 	t4_write_reg(adapter, SF_OP_A, 0);    /* unlock SF */
3003 
3004 	/* Read the page to verify the write succeeded */
3005 	ret = t4_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
3006 	if (ret)
3007 		return ret;
3008 
3009 	if (memcmp(data - n, (u8 *)buf + offset, n)) {
3010 		dev_err(adapter->pdev_dev,
3011 			"failed to correctly write the flash page at %#x\n",
3012 			addr);
3013 		return -EIO;
3014 	}
3015 	return 0;
3016 
3017 unlock:
3018 	t4_write_reg(adapter, SF_OP_A, 0);    /* unlock SF */
3019 	return ret;
3020 }
3021 
3022 /**
3023  *	t4_get_fw_version - read the firmware version
3024  *	@adapter: the adapter
3025  *	@vers: where to place the version
3026  *
3027  *	Reads the FW version from flash.
3028  */
3029 int t4_get_fw_version(struct adapter *adapter, u32 *vers)
3030 {
3031 	return t4_read_flash(adapter, FLASH_FW_START +
3032 			     offsetof(struct fw_hdr, fw_ver), 1,
3033 			     vers, 0);
3034 }
3035 
3036 /**
3037  *	t4_get_bs_version - read the firmware bootstrap version
3038  *	@adapter: the adapter
3039  *	@vers: where to place the version
3040  *
3041  *	Reads the FW Bootstrap version from flash.
3042  */
3043 int t4_get_bs_version(struct adapter *adapter, u32 *vers)
3044 {
3045 	return t4_read_flash(adapter, FLASH_FWBOOTSTRAP_START +
3046 			     offsetof(struct fw_hdr, fw_ver), 1,
3047 			     vers, 0);
3048 }
3049 
3050 /**
3051  *	t4_get_tp_version - read the TP microcode version
3052  *	@adapter: the adapter
3053  *	@vers: where to place the version
3054  *
3055  *	Reads the TP microcode version from flash.
3056  */
3057 int t4_get_tp_version(struct adapter *adapter, u32 *vers)
3058 {
3059 	return t4_read_flash(adapter, FLASH_FW_START +
3060 			     offsetof(struct fw_hdr, tp_microcode_ver),
3061 			     1, vers, 0);
3062 }
3063 
3064 /**
3065  *	t4_get_exprom_version - return the Expansion ROM version (if any)
3066  *	@adapter: the adapter
3067  *	@vers: where to place the version
3068  *
3069  *	Reads the Expansion ROM header from FLASH and returns the version
3070  *	number (if present) through the @vers return value pointer.  We return
3071  *	this in the Firmware Version Format since it's convenient.  Return
3072  *	0 on success, -ENOENT if no Expansion ROM is present.
3073  */
3074 int t4_get_exprom_version(struct adapter *adap, u32 *vers)
3075 {
3076 	struct exprom_header {
3077 		unsigned char hdr_arr[16];	/* must start with 0x55aa */
3078 		unsigned char hdr_ver[4];	/* Expansion ROM version */
3079 	} *hdr;
3080 	u32 exprom_header_buf[DIV_ROUND_UP(sizeof(struct exprom_header),
3081 					   sizeof(u32))];
3082 	int ret;
3083 
3084 	ret = t4_read_flash(adap, FLASH_EXP_ROM_START,
3085 			    ARRAY_SIZE(exprom_header_buf), exprom_header_buf,
3086 			    0);
3087 	if (ret)
3088 		return ret;
3089 
3090 	hdr = (struct exprom_header *)exprom_header_buf;
3091 	if (hdr->hdr_arr[0] != 0x55 || hdr->hdr_arr[1] != 0xaa)
3092 		return -ENOENT;
3093 
3094 	*vers = (FW_HDR_FW_VER_MAJOR_V(hdr->hdr_ver[0]) |
3095 		 FW_HDR_FW_VER_MINOR_V(hdr->hdr_ver[1]) |
3096 		 FW_HDR_FW_VER_MICRO_V(hdr->hdr_ver[2]) |
3097 		 FW_HDR_FW_VER_BUILD_V(hdr->hdr_ver[3]));
3098 	return 0;
3099 }
3100 
3101 /**
3102  *      t4_get_vpd_version - return the VPD version
3103  *      @adapter: the adapter
3104  *      @vers: where to place the version
3105  *
3106  *      Reads the VPD via the Firmware interface (thus this can only be called
3107  *      once we're ready to issue Firmware commands).  The format of the
3108  *      VPD version is adapter specific.  Returns 0 on success, an error on
3109  *      failure.
3110  *
3111  *      Note that early versions of the Firmware didn't include the ability
3112  *      to retrieve the VPD version, so we zero-out the return-value parameter
3113  *      in that case to avoid leaving it with garbage in it.
3114  *
3115  *      Also note that the Firmware will return its cached copy of the VPD
3116  *      Revision ID, not the actual Revision ID as written in the Serial
3117  *      EEPROM.  This is only an issue if a new VPD has been written and the
3118  *      Firmware/Chip haven't yet gone through a RESET sequence.  So it's best
3119  *      to defer calling this routine till after a FW_RESET_CMD has been issued
3120  *      if the Host Driver will be performing a full adapter initialization.
3121  */
3122 int t4_get_vpd_version(struct adapter *adapter, u32 *vers)
3123 {
3124 	u32 vpdrev_param;
3125 	int ret;
3126 
3127 	vpdrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3128 			FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_VPDREV));
3129 	ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
3130 			      1, &vpdrev_param, vers);
3131 	if (ret)
3132 		*vers = 0;
3133 	return ret;
3134 }
3135 
3136 /**
3137  *      t4_get_scfg_version - return the Serial Configuration version
3138  *      @adapter: the adapter
3139  *      @vers: where to place the version
3140  *
3141  *      Reads the Serial Configuration Version via the Firmware interface
3142  *      (thus this can only be called once we're ready to issue Firmware
3143  *      commands).  The format of the Serial Configuration version is
3144  *      adapter specific.  Returns 0 on success, an error on failure.
3145  *
3146  *      Note that early versions of the Firmware didn't include the ability
3147  *      to retrieve the Serial Configuration version, so we zero-out the
3148  *      return-value parameter in that case to avoid leaving it with
3149  *      garbage in it.
3150  *
3151  *      Also note that the Firmware will return its cached copy of the Serial
3152  *      Initialization Revision ID, not the actual Revision ID as written in
3153  *      the Serial EEPROM.  This is only an issue if a new VPD has been written
3154  *      and the Firmware/Chip haven't yet gone through a RESET sequence.  So
3155  *      it's best to defer calling this routine till after a FW_RESET_CMD has
3156  *      been issued if the Host Driver will be performing a full adapter
3157  *      initialization.
3158  */
3159 int t4_get_scfg_version(struct adapter *adapter, u32 *vers)
3160 {
3161 	u32 scfgrev_param;
3162 	int ret;
3163 
3164 	scfgrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3165 			 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_SCFGREV));
3166 	ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
3167 			      1, &scfgrev_param, vers);
3168 	if (ret)
3169 		*vers = 0;
3170 	return ret;
3171 }
3172 
3173 /**
3174  *      t4_get_version_info - extract various chip/firmware version information
3175  *      @adapter: the adapter
3176  *
3177  *      Reads various chip/firmware version numbers and stores them into the
3178  *      adapter Adapter Parameters structure.  If any of the efforts fails
3179  *      the first failure will be returned, but all of the version numbers
3180  *      will be read.
3181  */
3182 int t4_get_version_info(struct adapter *adapter)
3183 {
3184 	int ret = 0;
3185 
3186 	#define FIRST_RET(__getvinfo) \
3187 	do { \
3188 		int __ret = __getvinfo; \
3189 		if (__ret && !ret) \
3190 			ret = __ret; \
3191 	} while (0)
3192 
3193 	FIRST_RET(t4_get_fw_version(adapter, &adapter->params.fw_vers));
3194 	FIRST_RET(t4_get_bs_version(adapter, &adapter->params.bs_vers));
3195 	FIRST_RET(t4_get_tp_version(adapter, &adapter->params.tp_vers));
3196 	FIRST_RET(t4_get_exprom_version(adapter, &adapter->params.er_vers));
3197 	FIRST_RET(t4_get_scfg_version(adapter, &adapter->params.scfg_vers));
3198 	FIRST_RET(t4_get_vpd_version(adapter, &adapter->params.vpd_vers));
3199 
3200 	#undef FIRST_RET
3201 	return ret;
3202 }
3203 
3204 /**
3205  *      t4_dump_version_info - dump all of the adapter configuration IDs
3206  *      @adapter: the adapter
3207  *
3208  *      Dumps all of the various bits of adapter configuration version/revision
3209  *      IDs information.  This is typically called at some point after
3210  *      t4_get_version_info() has been called.
3211  */
3212 void t4_dump_version_info(struct adapter *adapter)
3213 {
3214 	/* Device information */
3215 	dev_info(adapter->pdev_dev, "Chelsio %s rev %d\n",
3216 		 adapter->params.vpd.id,
3217 		 CHELSIO_CHIP_RELEASE(adapter->params.chip));
3218 	dev_info(adapter->pdev_dev, "S/N: %s, P/N: %s\n",
3219 		 adapter->params.vpd.sn, adapter->params.vpd.pn);
3220 
3221 	/* Firmware Version */
3222 	if (!adapter->params.fw_vers)
3223 		dev_warn(adapter->pdev_dev, "No firmware loaded\n");
3224 	else
3225 		dev_info(adapter->pdev_dev, "Firmware version: %u.%u.%u.%u\n",
3226 			 FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers),
3227 			 FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers),
3228 			 FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers),
3229 			 FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers));
3230 
3231 	/* Bootstrap Firmware Version. (Some adapters don't have Bootstrap
3232 	 * Firmware, so dev_info() is more appropriate here.)
3233 	 */
3234 	if (!adapter->params.bs_vers)
3235 		dev_info(adapter->pdev_dev, "No bootstrap loaded\n");
3236 	else
3237 		dev_info(adapter->pdev_dev, "Bootstrap version: %u.%u.%u.%u\n",
3238 			 FW_HDR_FW_VER_MAJOR_G(adapter->params.bs_vers),
3239 			 FW_HDR_FW_VER_MINOR_G(adapter->params.bs_vers),
3240 			 FW_HDR_FW_VER_MICRO_G(adapter->params.bs_vers),
3241 			 FW_HDR_FW_VER_BUILD_G(adapter->params.bs_vers));
3242 
3243 	/* TP Microcode Version */
3244 	if (!adapter->params.tp_vers)
3245 		dev_warn(adapter->pdev_dev, "No TP Microcode loaded\n");
3246 	else
3247 		dev_info(adapter->pdev_dev,
3248 			 "TP Microcode version: %u.%u.%u.%u\n",
3249 			 FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers),
3250 			 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
3251 			 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
3252 			 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
3253 
3254 	/* Expansion ROM version */
3255 	if (!adapter->params.er_vers)
3256 		dev_info(adapter->pdev_dev, "No Expansion ROM loaded\n");
3257 	else
3258 		dev_info(adapter->pdev_dev,
3259 			 "Expansion ROM version: %u.%u.%u.%u\n",
3260 			 FW_HDR_FW_VER_MAJOR_G(adapter->params.er_vers),
3261 			 FW_HDR_FW_VER_MINOR_G(adapter->params.er_vers),
3262 			 FW_HDR_FW_VER_MICRO_G(adapter->params.er_vers),
3263 			 FW_HDR_FW_VER_BUILD_G(adapter->params.er_vers));
3264 
3265 	/* Serial Configuration version */
3266 	dev_info(adapter->pdev_dev, "Serial Configuration version: %#x\n",
3267 		 adapter->params.scfg_vers);
3268 
3269 	/* VPD Version */
3270 	dev_info(adapter->pdev_dev, "VPD version: %#x\n",
3271 		 adapter->params.vpd_vers);
3272 }
3273 
3274 /**
3275  *	t4_check_fw_version - check if the FW is supported with this driver
3276  *	@adap: the adapter
3277  *
3278  *	Checks if an adapter's FW is compatible with the driver.  Returns 0
3279  *	if there's exact match, a negative error if the version could not be
3280  *	read or there's a major version mismatch
3281  */
3282 int t4_check_fw_version(struct adapter *adap)
3283 {
3284 	int i, ret, major, minor, micro;
3285 	int exp_major, exp_minor, exp_micro;
3286 	unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
3287 
3288 	ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3289 	/* Try multiple times before returning error */
3290 	for (i = 0; (ret == -EBUSY || ret == -EAGAIN) && i < 3; i++)
3291 		ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3292 
3293 	if (ret)
3294 		return ret;
3295 
3296 	major = FW_HDR_FW_VER_MAJOR_G(adap->params.fw_vers);
3297 	minor = FW_HDR_FW_VER_MINOR_G(adap->params.fw_vers);
3298 	micro = FW_HDR_FW_VER_MICRO_G(adap->params.fw_vers);
3299 
3300 	switch (chip_version) {
3301 	case CHELSIO_T4:
3302 		exp_major = T4FW_MIN_VERSION_MAJOR;
3303 		exp_minor = T4FW_MIN_VERSION_MINOR;
3304 		exp_micro = T4FW_MIN_VERSION_MICRO;
3305 		break;
3306 	case CHELSIO_T5:
3307 		exp_major = T5FW_MIN_VERSION_MAJOR;
3308 		exp_minor = T5FW_MIN_VERSION_MINOR;
3309 		exp_micro = T5FW_MIN_VERSION_MICRO;
3310 		break;
3311 	case CHELSIO_T6:
3312 		exp_major = T6FW_MIN_VERSION_MAJOR;
3313 		exp_minor = T6FW_MIN_VERSION_MINOR;
3314 		exp_micro = T6FW_MIN_VERSION_MICRO;
3315 		break;
3316 	default:
3317 		dev_err(adap->pdev_dev, "Unsupported chip type, %x\n",
3318 			adap->chip);
3319 		return -EINVAL;
3320 	}
3321 
3322 	if (major < exp_major || (major == exp_major && minor < exp_minor) ||
3323 	    (major == exp_major && minor == exp_minor && micro < exp_micro)) {
3324 		dev_err(adap->pdev_dev,
3325 			"Card has firmware version %u.%u.%u, minimum "
3326 			"supported firmware is %u.%u.%u.\n", major, minor,
3327 			micro, exp_major, exp_minor, exp_micro);
3328 		return -EFAULT;
3329 	}
3330 	return 0;
3331 }
3332 
3333 /* Is the given firmware API compatible with the one the driver was compiled
3334  * with?
3335  */
3336 static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
3337 {
3338 
3339 	/* short circuit if it's the exact same firmware version */
3340 	if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
3341 		return 1;
3342 
3343 #define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
3344 	if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
3345 	    SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe))
3346 		return 1;
3347 #undef SAME_INTF
3348 
3349 	return 0;
3350 }
3351 
3352 /* The firmware in the filesystem is usable, but should it be installed?
3353  * This routine explains itself in detail if it indicates the filesystem
3354  * firmware should be installed.
3355  */
3356 static int should_install_fs_fw(struct adapter *adap, int card_fw_usable,
3357 				int k, int c)
3358 {
3359 	const char *reason;
3360 
3361 	if (!card_fw_usable) {
3362 		reason = "incompatible or unusable";
3363 		goto install;
3364 	}
3365 
3366 	if (k > c) {
3367 		reason = "older than the version supported with this driver";
3368 		goto install;
3369 	}
3370 
3371 	return 0;
3372 
3373 install:
3374 	dev_err(adap->pdev_dev, "firmware on card (%u.%u.%u.%u) is %s, "
3375 		"installing firmware %u.%u.%u.%u on card.\n",
3376 		FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
3377 		FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), reason,
3378 		FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
3379 		FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
3380 
3381 	return 1;
3382 }
3383 
3384 int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
3385 	       const u8 *fw_data, unsigned int fw_size,
3386 	       struct fw_hdr *card_fw, enum dev_state state,
3387 	       int *reset)
3388 {
3389 	int ret, card_fw_usable, fs_fw_usable;
3390 	const struct fw_hdr *fs_fw;
3391 	const struct fw_hdr *drv_fw;
3392 
3393 	drv_fw = &fw_info->fw_hdr;
3394 
3395 	/* Read the header of the firmware on the card */
3396 	ret = -t4_read_flash(adap, FLASH_FW_START,
3397 			    sizeof(*card_fw) / sizeof(uint32_t),
3398 			    (uint32_t *)card_fw, 1);
3399 	if (ret == 0) {
3400 		card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw);
3401 	} else {
3402 		dev_err(adap->pdev_dev,
3403 			"Unable to read card's firmware header: %d\n", ret);
3404 		card_fw_usable = 0;
3405 	}
3406 
3407 	if (fw_data != NULL) {
3408 		fs_fw = (const void *)fw_data;
3409 		fs_fw_usable = fw_compatible(drv_fw, fs_fw);
3410 	} else {
3411 		fs_fw = NULL;
3412 		fs_fw_usable = 0;
3413 	}
3414 
3415 	if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
3416 	    (!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) {
3417 		/* Common case: the firmware on the card is an exact match and
3418 		 * the filesystem one is an exact match too, or the filesystem
3419 		 * one is absent/incompatible.
3420 		 */
3421 	} else if (fs_fw_usable && state == DEV_STATE_UNINIT &&
3422 		   should_install_fs_fw(adap, card_fw_usable,
3423 					be32_to_cpu(fs_fw->fw_ver),
3424 					be32_to_cpu(card_fw->fw_ver))) {
3425 		ret = -t4_fw_upgrade(adap, adap->mbox, fw_data,
3426 				     fw_size, 0);
3427 		if (ret != 0) {
3428 			dev_err(adap->pdev_dev,
3429 				"failed to install firmware: %d\n", ret);
3430 			goto bye;
3431 		}
3432 
3433 		/* Installed successfully, update the cached header too. */
3434 		*card_fw = *fs_fw;
3435 		card_fw_usable = 1;
3436 		*reset = 0;	/* already reset as part of load_fw */
3437 	}
3438 
3439 	if (!card_fw_usable) {
3440 		uint32_t d, c, k;
3441 
3442 		d = be32_to_cpu(drv_fw->fw_ver);
3443 		c = be32_to_cpu(card_fw->fw_ver);
3444 		k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0;
3445 
3446 		dev_err(adap->pdev_dev, "Cannot find a usable firmware: "
3447 			"chip state %d, "
3448 			"driver compiled with %d.%d.%d.%d, "
3449 			"card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n",
3450 			state,
3451 			FW_HDR_FW_VER_MAJOR_G(d), FW_HDR_FW_VER_MINOR_G(d),
3452 			FW_HDR_FW_VER_MICRO_G(d), FW_HDR_FW_VER_BUILD_G(d),
3453 			FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
3454 			FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c),
3455 			FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
3456 			FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
3457 		ret = EINVAL;
3458 		goto bye;
3459 	}
3460 
3461 	/* We're using whatever's on the card and it's known to be good. */
3462 	adap->params.fw_vers = be32_to_cpu(card_fw->fw_ver);
3463 	adap->params.tp_vers = be32_to_cpu(card_fw->tp_microcode_ver);
3464 
3465 bye:
3466 	return ret;
3467 }
3468 
3469 /**
3470  *	t4_flash_erase_sectors - erase a range of flash sectors
3471  *	@adapter: the adapter
3472  *	@start: the first sector to erase
3473  *	@end: the last sector to erase
3474  *
3475  *	Erases the sectors in the given inclusive range.
3476  */
3477 static int t4_flash_erase_sectors(struct adapter *adapter, int start, int end)
3478 {
3479 	int ret = 0;
3480 
3481 	if (end >= adapter->params.sf_nsec)
3482 		return -EINVAL;
3483 
3484 	while (start <= end) {
3485 		if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
3486 		    (ret = sf1_write(adapter, 4, 0, 1,
3487 				     SF_ERASE_SECTOR | (start << 8))) != 0 ||
3488 		    (ret = flash_wait_op(adapter, 14, 500)) != 0) {
3489 			dev_err(adapter->pdev_dev,
3490 				"erase of flash sector %d failed, error %d\n",
3491 				start, ret);
3492 			break;
3493 		}
3494 		start++;
3495 	}
3496 	t4_write_reg(adapter, SF_OP_A, 0);    /* unlock SF */
3497 	return ret;
3498 }
3499 
3500 /**
3501  *	t4_flash_cfg_addr - return the address of the flash configuration file
3502  *	@adapter: the adapter
3503  *
3504  *	Return the address within the flash where the Firmware Configuration
3505  *	File is stored.
3506  */
3507 unsigned int t4_flash_cfg_addr(struct adapter *adapter)
3508 {
3509 	if (adapter->params.sf_size == 0x100000)
3510 		return FLASH_FPGA_CFG_START;
3511 	else
3512 		return FLASH_CFG_START;
3513 }
3514 
3515 /* Return TRUE if the specified firmware matches the adapter.  I.e. T4
3516  * firmware for T4 adapters, T5 firmware for T5 adapters, etc.  We go ahead
3517  * and emit an error message for mismatched firmware to save our caller the
3518  * effort ...
3519  */
3520 static bool t4_fw_matches_chip(const struct adapter *adap,
3521 			       const struct fw_hdr *hdr)
3522 {
3523 	/* The expression below will return FALSE for any unsupported adapter
3524 	 * which will keep us "honest" in the future ...
3525 	 */
3526 	if ((is_t4(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T4) ||
3527 	    (is_t5(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T5) ||
3528 	    (is_t6(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T6))
3529 		return true;
3530 
3531 	dev_err(adap->pdev_dev,
3532 		"FW image (%d) is not suitable for this adapter (%d)\n",
3533 		hdr->chip, CHELSIO_CHIP_VERSION(adap->params.chip));
3534 	return false;
3535 }
3536 
3537 /**
3538  *	t4_load_fw - download firmware
3539  *	@adap: the adapter
3540  *	@fw_data: the firmware image to write
3541  *	@size: image size
3542  *
3543  *	Write the supplied firmware image to the card's serial flash.
3544  */
3545 int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size)
3546 {
3547 	u32 csum;
3548 	int ret, addr;
3549 	unsigned int i;
3550 	u8 first_page[SF_PAGE_SIZE];
3551 	const __be32 *p = (const __be32 *)fw_data;
3552 	const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data;
3553 	unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
3554 	unsigned int fw_start_sec = FLASH_FW_START_SEC;
3555 	unsigned int fw_size = FLASH_FW_MAX_SIZE;
3556 	unsigned int fw_start = FLASH_FW_START;
3557 
3558 	if (!size) {
3559 		dev_err(adap->pdev_dev, "FW image has no data\n");
3560 		return -EINVAL;
3561 	}
3562 	if (size & 511) {
3563 		dev_err(adap->pdev_dev,
3564 			"FW image size not multiple of 512 bytes\n");
3565 		return -EINVAL;
3566 	}
3567 	if ((unsigned int)be16_to_cpu(hdr->len512) * 512 != size) {
3568 		dev_err(adap->pdev_dev,
3569 			"FW image size differs from size in FW header\n");
3570 		return -EINVAL;
3571 	}
3572 	if (size > fw_size) {
3573 		dev_err(adap->pdev_dev, "FW image too large, max is %u bytes\n",
3574 			fw_size);
3575 		return -EFBIG;
3576 	}
3577 	if (!t4_fw_matches_chip(adap, hdr))
3578 		return -EINVAL;
3579 
3580 	for (csum = 0, i = 0; i < size / sizeof(csum); i++)
3581 		csum += be32_to_cpu(p[i]);
3582 
3583 	if (csum != 0xffffffff) {
3584 		dev_err(adap->pdev_dev,
3585 			"corrupted firmware image, checksum %#x\n", csum);
3586 		return -EINVAL;
3587 	}
3588 
3589 	i = DIV_ROUND_UP(size, sf_sec_size);        /* # of sectors spanned */
3590 	ret = t4_flash_erase_sectors(adap, fw_start_sec, fw_start_sec + i - 1);
3591 	if (ret)
3592 		goto out;
3593 
3594 	/*
3595 	 * We write the correct version at the end so the driver can see a bad
3596 	 * version if the FW write fails.  Start by writing a copy of the
3597 	 * first page with a bad version.
3598 	 */
3599 	memcpy(first_page, fw_data, SF_PAGE_SIZE);
3600 	((struct fw_hdr *)first_page)->fw_ver = cpu_to_be32(0xffffffff);
3601 	ret = t4_write_flash(adap, fw_start, SF_PAGE_SIZE, first_page);
3602 	if (ret)
3603 		goto out;
3604 
3605 	addr = fw_start;
3606 	for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
3607 		addr += SF_PAGE_SIZE;
3608 		fw_data += SF_PAGE_SIZE;
3609 		ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, fw_data);
3610 		if (ret)
3611 			goto out;
3612 	}
3613 
3614 	ret = t4_write_flash(adap,
3615 			     fw_start + offsetof(struct fw_hdr, fw_ver),
3616 			     sizeof(hdr->fw_ver), (const u8 *)&hdr->fw_ver);
3617 out:
3618 	if (ret)
3619 		dev_err(adap->pdev_dev, "firmware download failed, error %d\n",
3620 			ret);
3621 	else
3622 		ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3623 	return ret;
3624 }
3625 
3626 /**
3627  *	t4_phy_fw_ver - return current PHY firmware version
3628  *	@adap: the adapter
3629  *	@phy_fw_ver: return value buffer for PHY firmware version
3630  *
3631  *	Returns the current version of external PHY firmware on the
3632  *	adapter.
3633  */
3634 int t4_phy_fw_ver(struct adapter *adap, int *phy_fw_ver)
3635 {
3636 	u32 param, val;
3637 	int ret;
3638 
3639 	param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3640 		 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3641 		 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3642 		 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_VERSION));
3643 	ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 1,
3644 			      &param, &val);
3645 	if (ret < 0)
3646 		return ret;
3647 	*phy_fw_ver = val;
3648 	return 0;
3649 }
3650 
3651 /**
3652  *	t4_load_phy_fw - download port PHY firmware
3653  *	@adap: the adapter
3654  *	@win: the PCI-E Memory Window index to use for t4_memory_rw()
3655  *	@win_lock: the lock to use to guard the memory copy
3656  *	@phy_fw_version: function to check PHY firmware versions
3657  *	@phy_fw_data: the PHY firmware image to write
3658  *	@phy_fw_size: image size
3659  *
3660  *	Transfer the specified PHY firmware to the adapter.  If a non-NULL
3661  *	@phy_fw_version is supplied, then it will be used to determine if
3662  *	it's necessary to perform the transfer by comparing the version
3663  *	of any existing adapter PHY firmware with that of the passed in
3664  *	PHY firmware image.  If @win_lock is non-NULL then it will be used
3665  *	around the call to t4_memory_rw() which transfers the PHY firmware
3666  *	to the adapter.
3667  *
3668  *	A negative error number will be returned if an error occurs.  If
3669  *	version number support is available and there's no need to upgrade
3670  *	the firmware, 0 will be returned.  If firmware is successfully
3671  *	transferred to the adapter, 1 will be retured.
3672  *
3673  *	NOTE: some adapters only have local RAM to store the PHY firmware.  As
3674  *	a result, a RESET of the adapter would cause that RAM to lose its
3675  *	contents.  Thus, loading PHY firmware on such adapters must happen
3676  *	after any FW_RESET_CMDs ...
3677  */
3678 int t4_load_phy_fw(struct adapter *adap,
3679 		   int win, spinlock_t *win_lock,
3680 		   int (*phy_fw_version)(const u8 *, size_t),
3681 		   const u8 *phy_fw_data, size_t phy_fw_size)
3682 {
3683 	unsigned long mtype = 0, maddr = 0;
3684 	u32 param, val;
3685 	int cur_phy_fw_ver = 0, new_phy_fw_vers = 0;
3686 	int ret;
3687 
3688 	/* If we have version number support, then check to see if the adapter
3689 	 * already has up-to-date PHY firmware loaded.
3690 	 */
3691 	 if (phy_fw_version) {
3692 		new_phy_fw_vers = phy_fw_version(phy_fw_data, phy_fw_size);
3693 		ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver);
3694 		if (ret < 0)
3695 			return ret;
3696 
3697 		if (cur_phy_fw_ver >= new_phy_fw_vers) {
3698 			CH_WARN(adap, "PHY Firmware already up-to-date, "
3699 				"version %#x\n", cur_phy_fw_ver);
3700 			return 0;
3701 		}
3702 	}
3703 
3704 	/* Ask the firmware where it wants us to copy the PHY firmware image.
3705 	 * The size of the file requires a special version of the READ coommand
3706 	 * which will pass the file size via the values field in PARAMS_CMD and
3707 	 * retrieve the return value from firmware and place it in the same
3708 	 * buffer values
3709 	 */
3710 	param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3711 		 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3712 		 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3713 		 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD));
3714 	val = phy_fw_size;
3715 	ret = t4_query_params_rw(adap, adap->mbox, adap->pf, 0, 1,
3716 				 &param, &val, 1, true);
3717 	if (ret < 0)
3718 		return ret;
3719 	mtype = val >> 8;
3720 	maddr = (val & 0xff) << 16;
3721 
3722 	/* Copy the supplied PHY Firmware image to the adapter memory location
3723 	 * allocated by the adapter firmware.
3724 	 */
3725 	if (win_lock)
3726 		spin_lock_bh(win_lock);
3727 	ret = t4_memory_rw(adap, win, mtype, maddr,
3728 			   phy_fw_size, (__be32 *)phy_fw_data,
3729 			   T4_MEMORY_WRITE);
3730 	if (win_lock)
3731 		spin_unlock_bh(win_lock);
3732 	if (ret)
3733 		return ret;
3734 
3735 	/* Tell the firmware that the PHY firmware image has been written to
3736 	 * RAM and it can now start copying it over to the PHYs.  The chip
3737 	 * firmware will RESET the affected PHYs as part of this operation
3738 	 * leaving them running the new PHY firmware image.
3739 	 */
3740 	param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3741 		 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3742 		 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3743 		 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD));
3744 	ret = t4_set_params_timeout(adap, adap->mbox, adap->pf, 0, 1,
3745 				    &param, &val, 30000);
3746 
3747 	/* If we have version number support, then check to see that the new
3748 	 * firmware got loaded properly.
3749 	 */
3750 	if (phy_fw_version) {
3751 		ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver);
3752 		if (ret < 0)
3753 			return ret;
3754 
3755 		if (cur_phy_fw_ver != new_phy_fw_vers) {
3756 			CH_WARN(adap, "PHY Firmware did not update: "
3757 				"version on adapter %#x, "
3758 				"version flashed %#x\n",
3759 				cur_phy_fw_ver, new_phy_fw_vers);
3760 			return -ENXIO;
3761 		}
3762 	}
3763 
3764 	return 1;
3765 }
3766 
3767 /**
3768  *	t4_fwcache - firmware cache operation
3769  *	@adap: the adapter
3770  *	@op  : the operation (flush or flush and invalidate)
3771  */
3772 int t4_fwcache(struct adapter *adap, enum fw_params_param_dev_fwcache op)
3773 {
3774 	struct fw_params_cmd c;
3775 
3776 	memset(&c, 0, sizeof(c));
3777 	c.op_to_vfn =
3778 		cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
3779 			    FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
3780 			    FW_PARAMS_CMD_PFN_V(adap->pf) |
3781 			    FW_PARAMS_CMD_VFN_V(0));
3782 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
3783 	c.param[0].mnem =
3784 		cpu_to_be32(FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3785 			    FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_FWCACHE));
3786 	c.param[0].val = (__force __be32)op;
3787 
3788 	return t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), NULL);
3789 }
3790 
3791 void t4_cim_read_pif_la(struct adapter *adap, u32 *pif_req, u32 *pif_rsp,
3792 			unsigned int *pif_req_wrptr,
3793 			unsigned int *pif_rsp_wrptr)
3794 {
3795 	int i, j;
3796 	u32 cfg, val, req, rsp;
3797 
3798 	cfg = t4_read_reg(adap, CIM_DEBUGCFG_A);
3799 	if (cfg & LADBGEN_F)
3800 		t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F);
3801 
3802 	val = t4_read_reg(adap, CIM_DEBUGSTS_A);
3803 	req = POLADBGWRPTR_G(val);
3804 	rsp = PILADBGWRPTR_G(val);
3805 	if (pif_req_wrptr)
3806 		*pif_req_wrptr = req;
3807 	if (pif_rsp_wrptr)
3808 		*pif_rsp_wrptr = rsp;
3809 
3810 	for (i = 0; i < CIM_PIFLA_SIZE; i++) {
3811 		for (j = 0; j < 6; j++) {
3812 			t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(req) |
3813 				     PILADBGRDPTR_V(rsp));
3814 			*pif_req++ = t4_read_reg(adap, CIM_PO_LA_DEBUGDATA_A);
3815 			*pif_rsp++ = t4_read_reg(adap, CIM_PI_LA_DEBUGDATA_A);
3816 			req++;
3817 			rsp++;
3818 		}
3819 		req = (req + 2) & POLADBGRDPTR_M;
3820 		rsp = (rsp + 2) & PILADBGRDPTR_M;
3821 	}
3822 	t4_write_reg(adap, CIM_DEBUGCFG_A, cfg);
3823 }
3824 
3825 void t4_cim_read_ma_la(struct adapter *adap, u32 *ma_req, u32 *ma_rsp)
3826 {
3827 	u32 cfg;
3828 	int i, j, idx;
3829 
3830 	cfg = t4_read_reg(adap, CIM_DEBUGCFG_A);
3831 	if (cfg & LADBGEN_F)
3832 		t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F);
3833 
3834 	for (i = 0; i < CIM_MALA_SIZE; i++) {
3835 		for (j = 0; j < 5; j++) {
3836 			idx = 8 * i + j;
3837 			t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(idx) |
3838 				     PILADBGRDPTR_V(idx));
3839 			*ma_req++ = t4_read_reg(adap, CIM_PO_LA_MADEBUGDATA_A);
3840 			*ma_rsp++ = t4_read_reg(adap, CIM_PI_LA_MADEBUGDATA_A);
3841 		}
3842 	}
3843 	t4_write_reg(adap, CIM_DEBUGCFG_A, cfg);
3844 }
3845 
3846 void t4_ulprx_read_la(struct adapter *adap, u32 *la_buf)
3847 {
3848 	unsigned int i, j;
3849 
3850 	for (i = 0; i < 8; i++) {
3851 		u32 *p = la_buf + i;
3852 
3853 		t4_write_reg(adap, ULP_RX_LA_CTL_A, i);
3854 		j = t4_read_reg(adap, ULP_RX_LA_WRPTR_A);
3855 		t4_write_reg(adap, ULP_RX_LA_RDPTR_A, j);
3856 		for (j = 0; j < ULPRX_LA_SIZE; j++, p += 8)
3857 			*p = t4_read_reg(adap, ULP_RX_LA_RDDATA_A);
3858 	}
3859 }
3860 
3861 #define ADVERT_MASK (FW_PORT_CAP32_SPEED_V(FW_PORT_CAP32_SPEED_M) | \
3862 		     FW_PORT_CAP32_ANEG)
3863 
3864 /**
3865  *	fwcaps16_to_caps32 - convert 16-bit Port Capabilities to 32-bits
3866  *	@caps16: a 16-bit Port Capabilities value
3867  *
3868  *	Returns the equivalent 32-bit Port Capabilities value.
3869  */
3870 static fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16)
3871 {
3872 	fw_port_cap32_t caps32 = 0;
3873 
3874 	#define CAP16_TO_CAP32(__cap) \
3875 		do { \
3876 			if (caps16 & FW_PORT_CAP_##__cap) \
3877 				caps32 |= FW_PORT_CAP32_##__cap; \
3878 		} while (0)
3879 
3880 	CAP16_TO_CAP32(SPEED_100M);
3881 	CAP16_TO_CAP32(SPEED_1G);
3882 	CAP16_TO_CAP32(SPEED_25G);
3883 	CAP16_TO_CAP32(SPEED_10G);
3884 	CAP16_TO_CAP32(SPEED_40G);
3885 	CAP16_TO_CAP32(SPEED_100G);
3886 	CAP16_TO_CAP32(FC_RX);
3887 	CAP16_TO_CAP32(FC_TX);
3888 	CAP16_TO_CAP32(ANEG);
3889 	CAP16_TO_CAP32(MDIX);
3890 	CAP16_TO_CAP32(MDIAUTO);
3891 	CAP16_TO_CAP32(FEC_RS);
3892 	CAP16_TO_CAP32(FEC_BASER_RS);
3893 	CAP16_TO_CAP32(802_3_PAUSE);
3894 	CAP16_TO_CAP32(802_3_ASM_DIR);
3895 
3896 	#undef CAP16_TO_CAP32
3897 
3898 	return caps32;
3899 }
3900 
3901 /**
3902  *	fwcaps32_to_caps16 - convert 32-bit Port Capabilities to 16-bits
3903  *	@caps32: a 32-bit Port Capabilities value
3904  *
3905  *	Returns the equivalent 16-bit Port Capabilities value.  Note that
3906  *	not all 32-bit Port Capabilities can be represented in the 16-bit
3907  *	Port Capabilities and some fields/values may not make it.
3908  */
3909 static fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32)
3910 {
3911 	fw_port_cap16_t caps16 = 0;
3912 
3913 	#define CAP32_TO_CAP16(__cap) \
3914 		do { \
3915 			if (caps32 & FW_PORT_CAP32_##__cap) \
3916 				caps16 |= FW_PORT_CAP_##__cap; \
3917 		} while (0)
3918 
3919 	CAP32_TO_CAP16(SPEED_100M);
3920 	CAP32_TO_CAP16(SPEED_1G);
3921 	CAP32_TO_CAP16(SPEED_10G);
3922 	CAP32_TO_CAP16(SPEED_25G);
3923 	CAP32_TO_CAP16(SPEED_40G);
3924 	CAP32_TO_CAP16(SPEED_100G);
3925 	CAP32_TO_CAP16(FC_RX);
3926 	CAP32_TO_CAP16(FC_TX);
3927 	CAP32_TO_CAP16(802_3_PAUSE);
3928 	CAP32_TO_CAP16(802_3_ASM_DIR);
3929 	CAP32_TO_CAP16(ANEG);
3930 	CAP32_TO_CAP16(MDIX);
3931 	CAP32_TO_CAP16(MDIAUTO);
3932 	CAP32_TO_CAP16(FEC_RS);
3933 	CAP32_TO_CAP16(FEC_BASER_RS);
3934 
3935 	#undef CAP32_TO_CAP16
3936 
3937 	return caps16;
3938 }
3939 
3940 /* Translate Firmware Port Capabilities Pause specification to Common Code */
3941 static inline enum cc_pause fwcap_to_cc_pause(fw_port_cap32_t fw_pause)
3942 {
3943 	enum cc_pause cc_pause = 0;
3944 
3945 	if (fw_pause & FW_PORT_CAP32_FC_RX)
3946 		cc_pause |= PAUSE_RX;
3947 	if (fw_pause & FW_PORT_CAP32_FC_TX)
3948 		cc_pause |= PAUSE_TX;
3949 
3950 	return cc_pause;
3951 }
3952 
3953 /* Translate Common Code Pause specification into Firmware Port Capabilities */
3954 static inline fw_port_cap32_t cc_to_fwcap_pause(enum cc_pause cc_pause)
3955 {
3956 	fw_port_cap32_t fw_pause = 0;
3957 
3958 	if (cc_pause & PAUSE_RX)
3959 		fw_pause |= FW_PORT_CAP32_FC_RX;
3960 	if (cc_pause & PAUSE_TX)
3961 		fw_pause |= FW_PORT_CAP32_FC_TX;
3962 
3963 	return fw_pause;
3964 }
3965 
3966 /* Translate Firmware Forward Error Correction specification to Common Code */
3967 static inline enum cc_fec fwcap_to_cc_fec(fw_port_cap32_t fw_fec)
3968 {
3969 	enum cc_fec cc_fec = 0;
3970 
3971 	if (fw_fec & FW_PORT_CAP32_FEC_RS)
3972 		cc_fec |= FEC_RS;
3973 	if (fw_fec & FW_PORT_CAP32_FEC_BASER_RS)
3974 		cc_fec |= FEC_BASER_RS;
3975 
3976 	return cc_fec;
3977 }
3978 
3979 /* Translate Common Code Forward Error Correction specification to Firmware */
3980 static inline fw_port_cap32_t cc_to_fwcap_fec(enum cc_fec cc_fec)
3981 {
3982 	fw_port_cap32_t fw_fec = 0;
3983 
3984 	if (cc_fec & FEC_RS)
3985 		fw_fec |= FW_PORT_CAP32_FEC_RS;
3986 	if (cc_fec & FEC_BASER_RS)
3987 		fw_fec |= FW_PORT_CAP32_FEC_BASER_RS;
3988 
3989 	return fw_fec;
3990 }
3991 
3992 /**
3993  *	t4_link_l1cfg - apply link configuration to MAC/PHY
3994  *	@adapter: the adapter
3995  *	@mbox: the Firmware Mailbox to use
3996  *	@port: the Port ID
3997  *	@lc: the Port's Link Configuration
3998  *
3999  *	Set up a port's MAC and PHY according to a desired link configuration.
4000  *	- If the PHY can auto-negotiate first decide what to advertise, then
4001  *	  enable/disable auto-negotiation as desired, and reset.
4002  *	- If the PHY does not auto-negotiate just reset it.
4003  *	- If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
4004  *	  otherwise do it later based on the outcome of auto-negotiation.
4005  */
4006 int t4_link_l1cfg(struct adapter *adapter, unsigned int mbox,
4007 		  unsigned int port, struct link_config *lc)
4008 {
4009 	unsigned int fw_caps = adapter->params.fw_caps_support;
4010 	struct fw_port_cmd cmd;
4011 	unsigned int fw_mdi = FW_PORT_CAP32_MDI_V(FW_PORT_CAP32_MDI_AUTO);
4012 	fw_port_cap32_t fw_fc, cc_fec, fw_fec, rcap;
4013 
4014 	lc->link_ok = 0;
4015 
4016 	/* Convert driver coding of Pause Frame Flow Control settings into the
4017 	 * Firmware's API.
4018 	 */
4019 	fw_fc = cc_to_fwcap_pause(lc->requested_fc);
4020 
4021 	/* Convert Common Code Forward Error Control settings into the
4022 	 * Firmware's API.  If the current Requested FEC has "Automatic"
4023 	 * (IEEE 802.3) specified, then we use whatever the Firmware
4024 	 * sent us as part of it's IEEE 802.3-based interpratation of
4025 	 * the Transceiver Module EPROM FEC parameters.  Otherwise we
4026 	 * use whatever is in the current Requested FEC settings.
4027 	 */
4028 	if (lc->requested_fec & FEC_AUTO)
4029 		cc_fec = fwcap_to_cc_fec(lc->def_acaps);
4030 	else
4031 		cc_fec = lc->requested_fec;
4032 	fw_fec = cc_to_fwcap_fec(cc_fec);
4033 
4034 	/* Figure out what our Requested Port Capabilities are going to be.
4035 	 */
4036 	if (!(lc->pcaps & FW_PORT_CAP32_ANEG)) {
4037 		rcap = (lc->pcaps & ADVERT_MASK) | fw_fc | fw_fec;
4038 		lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
4039 		lc->fec = cc_fec;
4040 	} else if (lc->autoneg == AUTONEG_DISABLE) {
4041 		rcap = lc->speed_caps | fw_fc | fw_fec | fw_mdi;
4042 		lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
4043 		lc->fec = cc_fec;
4044 	} else {
4045 		rcap = lc->acaps | fw_fc | fw_fec | fw_mdi;
4046 	}
4047 
4048 	/* And send that on to the Firmware ...
4049 	 */
4050 	memset(&cmd, 0, sizeof(cmd));
4051 	cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
4052 				       FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
4053 				       FW_PORT_CMD_PORTID_V(port));
4054 	cmd.action_to_len16 =
4055 		cpu_to_be32(FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
4056 						 ? FW_PORT_ACTION_L1_CFG
4057 						 : FW_PORT_ACTION_L1_CFG32) |
4058 			    FW_LEN16(cmd));
4059 	if (fw_caps == FW_CAPS16)
4060 		cmd.u.l1cfg.rcap = cpu_to_be32(fwcaps32_to_caps16(rcap));
4061 	else
4062 		cmd.u.l1cfg32.rcap32 = cpu_to_be32(rcap);
4063 	return t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
4064 }
4065 
4066 /**
4067  *	t4_restart_aneg - restart autonegotiation
4068  *	@adap: the adapter
4069  *	@mbox: mbox to use for the FW command
4070  *	@port: the port id
4071  *
4072  *	Restarts autonegotiation for the selected port.
4073  */
4074 int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port)
4075 {
4076 	struct fw_port_cmd c;
4077 
4078 	memset(&c, 0, sizeof(c));
4079 	c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
4080 				     FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
4081 				     FW_PORT_CMD_PORTID_V(port));
4082 	c.action_to_len16 =
4083 		cpu_to_be32(FW_PORT_CMD_ACTION_V(FW_PORT_ACTION_L1_CFG) |
4084 			    FW_LEN16(c));
4085 	c.u.l1cfg.rcap = cpu_to_be32(FW_PORT_CAP32_ANEG);
4086 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4087 }
4088 
4089 typedef void (*int_handler_t)(struct adapter *adap);
4090 
4091 struct intr_info {
4092 	unsigned int mask;       /* bits to check in interrupt status */
4093 	const char *msg;         /* message to print or NULL */
4094 	short stat_idx;          /* stat counter to increment or -1 */
4095 	unsigned short fatal;    /* whether the condition reported is fatal */
4096 	int_handler_t int_handler; /* platform-specific int handler */
4097 };
4098 
4099 /**
4100  *	t4_handle_intr_status - table driven interrupt handler
4101  *	@adapter: the adapter that generated the interrupt
4102  *	@reg: the interrupt status register to process
4103  *	@acts: table of interrupt actions
4104  *
4105  *	A table driven interrupt handler that applies a set of masks to an
4106  *	interrupt status word and performs the corresponding actions if the
4107  *	interrupts described by the mask have occurred.  The actions include
4108  *	optionally emitting a warning or alert message.  The table is terminated
4109  *	by an entry specifying mask 0.  Returns the number of fatal interrupt
4110  *	conditions.
4111  */
4112 static int t4_handle_intr_status(struct adapter *adapter, unsigned int reg,
4113 				 const struct intr_info *acts)
4114 {
4115 	int fatal = 0;
4116 	unsigned int mask = 0;
4117 	unsigned int status = t4_read_reg(adapter, reg);
4118 
4119 	for ( ; acts->mask; ++acts) {
4120 		if (!(status & acts->mask))
4121 			continue;
4122 		if (acts->fatal) {
4123 			fatal++;
4124 			dev_alert(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
4125 				  status & acts->mask);
4126 		} else if (acts->msg && printk_ratelimit())
4127 			dev_warn(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
4128 				 status & acts->mask);
4129 		if (acts->int_handler)
4130 			acts->int_handler(adapter);
4131 		mask |= acts->mask;
4132 	}
4133 	status &= mask;
4134 	if (status)                           /* clear processed interrupts */
4135 		t4_write_reg(adapter, reg, status);
4136 	return fatal;
4137 }
4138 
4139 /*
4140  * Interrupt handler for the PCIE module.
4141  */
4142 static void pcie_intr_handler(struct adapter *adapter)
4143 {
4144 	static const struct intr_info sysbus_intr_info[] = {
4145 		{ RNPP_F, "RXNP array parity error", -1, 1 },
4146 		{ RPCP_F, "RXPC array parity error", -1, 1 },
4147 		{ RCIP_F, "RXCIF array parity error", -1, 1 },
4148 		{ RCCP_F, "Rx completions control array parity error", -1, 1 },
4149 		{ RFTP_F, "RXFT array parity error", -1, 1 },
4150 		{ 0 }
4151 	};
4152 	static const struct intr_info pcie_port_intr_info[] = {
4153 		{ TPCP_F, "TXPC array parity error", -1, 1 },
4154 		{ TNPP_F, "TXNP array parity error", -1, 1 },
4155 		{ TFTP_F, "TXFT array parity error", -1, 1 },
4156 		{ TCAP_F, "TXCA array parity error", -1, 1 },
4157 		{ TCIP_F, "TXCIF array parity error", -1, 1 },
4158 		{ RCAP_F, "RXCA array parity error", -1, 1 },
4159 		{ OTDD_F, "outbound request TLP discarded", -1, 1 },
4160 		{ RDPE_F, "Rx data parity error", -1, 1 },
4161 		{ TDUE_F, "Tx uncorrectable data error", -1, 1 },
4162 		{ 0 }
4163 	};
4164 	static const struct intr_info pcie_intr_info[] = {
4165 		{ MSIADDRLPERR_F, "MSI AddrL parity error", -1, 1 },
4166 		{ MSIADDRHPERR_F, "MSI AddrH parity error", -1, 1 },
4167 		{ MSIDATAPERR_F, "MSI data parity error", -1, 1 },
4168 		{ MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 },
4169 		{ MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 },
4170 		{ MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 },
4171 		{ MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 },
4172 		{ PIOCPLPERR_F, "PCI PIO completion FIFO parity error", -1, 1 },
4173 		{ PIOREQPERR_F, "PCI PIO request FIFO parity error", -1, 1 },
4174 		{ TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 },
4175 		{ CCNTPERR_F, "PCI CMD channel count parity error", -1, 1 },
4176 		{ CREQPERR_F, "PCI CMD channel request parity error", -1, 1 },
4177 		{ CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 },
4178 		{ DCNTPERR_F, "PCI DMA channel count parity error", -1, 1 },
4179 		{ DREQPERR_F, "PCI DMA channel request parity error", -1, 1 },
4180 		{ DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 },
4181 		{ HCNTPERR_F, "PCI HMA channel count parity error", -1, 1 },
4182 		{ HREQPERR_F, "PCI HMA channel request parity error", -1, 1 },
4183 		{ HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 },
4184 		{ CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 },
4185 		{ FIDPERR_F, "PCI FID parity error", -1, 1 },
4186 		{ INTXCLRPERR_F, "PCI INTx clear parity error", -1, 1 },
4187 		{ MATAGPERR_F, "PCI MA tag parity error", -1, 1 },
4188 		{ PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 },
4189 		{ RXCPLPERR_F, "PCI Rx completion parity error", -1, 1 },
4190 		{ RXWRPERR_F, "PCI Rx write parity error", -1, 1 },
4191 		{ RPLPERR_F, "PCI replay buffer parity error", -1, 1 },
4192 		{ PCIESINT_F, "PCI core secondary fault", -1, 1 },
4193 		{ PCIEPINT_F, "PCI core primary fault", -1, 1 },
4194 		{ UNXSPLCPLERR_F, "PCI unexpected split completion error",
4195 		  -1, 0 },
4196 		{ 0 }
4197 	};
4198 
4199 	static struct intr_info t5_pcie_intr_info[] = {
4200 		{ MSTGRPPERR_F, "Master Response Read Queue parity error",
4201 		  -1, 1 },
4202 		{ MSTTIMEOUTPERR_F, "Master Timeout FIFO parity error", -1, 1 },
4203 		{ MSIXSTIPERR_F, "MSI-X STI SRAM parity error", -1, 1 },
4204 		{ MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 },
4205 		{ MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 },
4206 		{ MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 },
4207 		{ MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 },
4208 		{ PIOCPLGRPPERR_F, "PCI PIO completion Group FIFO parity error",
4209 		  -1, 1 },
4210 		{ PIOREQGRPPERR_F, "PCI PIO request Group FIFO parity error",
4211 		  -1, 1 },
4212 		{ TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 },
4213 		{ MSTTAGQPERR_F, "PCI master tag queue parity error", -1, 1 },
4214 		{ CREQPERR_F, "PCI CMD channel request parity error", -1, 1 },
4215 		{ CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 },
4216 		{ DREQWRPERR_F, "PCI DMA channel write request parity error",
4217 		  -1, 1 },
4218 		{ DREQPERR_F, "PCI DMA channel request parity error", -1, 1 },
4219 		{ DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 },
4220 		{ HREQWRPERR_F, "PCI HMA channel count parity error", -1, 1 },
4221 		{ HREQPERR_F, "PCI HMA channel request parity error", -1, 1 },
4222 		{ HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 },
4223 		{ CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 },
4224 		{ FIDPERR_F, "PCI FID parity error", -1, 1 },
4225 		{ VFIDPERR_F, "PCI INTx clear parity error", -1, 1 },
4226 		{ MAGRPPERR_F, "PCI MA group FIFO parity error", -1, 1 },
4227 		{ PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 },
4228 		{ IPRXHDRGRPPERR_F, "PCI IP Rx header group parity error",
4229 		  -1, 1 },
4230 		{ IPRXDATAGRPPERR_F, "PCI IP Rx data group parity error",
4231 		  -1, 1 },
4232 		{ RPLPERR_F, "PCI IP replay buffer parity error", -1, 1 },
4233 		{ IPSOTPERR_F, "PCI IP SOT buffer parity error", -1, 1 },
4234 		{ TRGT1GRPPERR_F, "PCI TRGT1 group FIFOs parity error", -1, 1 },
4235 		{ READRSPERR_F, "Outbound read error", -1, 0 },
4236 		{ 0 }
4237 	};
4238 
4239 	int fat;
4240 
4241 	if (is_t4(adapter->params.chip))
4242 		fat = t4_handle_intr_status(adapter,
4243 				PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS_A,
4244 				sysbus_intr_info) +
4245 			t4_handle_intr_status(adapter,
4246 					PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS_A,
4247 					pcie_port_intr_info) +
4248 			t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A,
4249 					      pcie_intr_info);
4250 	else
4251 		fat = t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A,
4252 					    t5_pcie_intr_info);
4253 
4254 	if (fat)
4255 		t4_fatal_err(adapter);
4256 }
4257 
4258 /*
4259  * TP interrupt handler.
4260  */
4261 static void tp_intr_handler(struct adapter *adapter)
4262 {
4263 	static const struct intr_info tp_intr_info[] = {
4264 		{ 0x3fffffff, "TP parity error", -1, 1 },
4265 		{ FLMTXFLSTEMPTY_F, "TP out of Tx pages", -1, 1 },
4266 		{ 0 }
4267 	};
4268 
4269 	if (t4_handle_intr_status(adapter, TP_INT_CAUSE_A, tp_intr_info))
4270 		t4_fatal_err(adapter);
4271 }
4272 
4273 /*
4274  * SGE interrupt handler.
4275  */
4276 static void sge_intr_handler(struct adapter *adapter)
4277 {
4278 	u64 v;
4279 	u32 err;
4280 
4281 	static const struct intr_info sge_intr_info[] = {
4282 		{ ERR_CPL_EXCEED_IQE_SIZE_F,
4283 		  "SGE received CPL exceeding IQE size", -1, 1 },
4284 		{ ERR_INVALID_CIDX_INC_F,
4285 		  "SGE GTS CIDX increment too large", -1, 0 },
4286 		{ ERR_CPL_OPCODE_0_F, "SGE received 0-length CPL", -1, 0 },
4287 		{ DBFIFO_LP_INT_F, NULL, -1, 0, t4_db_full },
4288 		{ ERR_DATA_CPL_ON_HIGH_QID1_F | ERR_DATA_CPL_ON_HIGH_QID0_F,
4289 		  "SGE IQID > 1023 received CPL for FL", -1, 0 },
4290 		{ ERR_BAD_DB_PIDX3_F, "SGE DBP 3 pidx increment too large", -1,
4291 		  0 },
4292 		{ ERR_BAD_DB_PIDX2_F, "SGE DBP 2 pidx increment too large", -1,
4293 		  0 },
4294 		{ ERR_BAD_DB_PIDX1_F, "SGE DBP 1 pidx increment too large", -1,
4295 		  0 },
4296 		{ ERR_BAD_DB_PIDX0_F, "SGE DBP 0 pidx increment too large", -1,
4297 		  0 },
4298 		{ ERR_ING_CTXT_PRIO_F,
4299 		  "SGE too many priority ingress contexts", -1, 0 },
4300 		{ INGRESS_SIZE_ERR_F, "SGE illegal ingress QID", -1, 0 },
4301 		{ EGRESS_SIZE_ERR_F, "SGE illegal egress QID", -1, 0 },
4302 		{ 0 }
4303 	};
4304 
4305 	static struct intr_info t4t5_sge_intr_info[] = {
4306 		{ ERR_DROPPED_DB_F, NULL, -1, 0, t4_db_dropped },
4307 		{ DBFIFO_HP_INT_F, NULL, -1, 0, t4_db_full },
4308 		{ ERR_EGR_CTXT_PRIO_F,
4309 		  "SGE too many priority egress contexts", -1, 0 },
4310 		{ 0 }
4311 	};
4312 
4313 	v = (u64)t4_read_reg(adapter, SGE_INT_CAUSE1_A) |
4314 		((u64)t4_read_reg(adapter, SGE_INT_CAUSE2_A) << 32);
4315 	if (v) {
4316 		dev_alert(adapter->pdev_dev, "SGE parity error (%#llx)\n",
4317 				(unsigned long long)v);
4318 		t4_write_reg(adapter, SGE_INT_CAUSE1_A, v);
4319 		t4_write_reg(adapter, SGE_INT_CAUSE2_A, v >> 32);
4320 	}
4321 
4322 	v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A, sge_intr_info);
4323 	if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
4324 		v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A,
4325 					   t4t5_sge_intr_info);
4326 
4327 	err = t4_read_reg(adapter, SGE_ERROR_STATS_A);
4328 	if (err & ERROR_QID_VALID_F) {
4329 		dev_err(adapter->pdev_dev, "SGE error for queue %u\n",
4330 			ERROR_QID_G(err));
4331 		if (err & UNCAPTURED_ERROR_F)
4332 			dev_err(adapter->pdev_dev,
4333 				"SGE UNCAPTURED_ERROR set (clearing)\n");
4334 		t4_write_reg(adapter, SGE_ERROR_STATS_A, ERROR_QID_VALID_F |
4335 			     UNCAPTURED_ERROR_F);
4336 	}
4337 
4338 	if (v != 0)
4339 		t4_fatal_err(adapter);
4340 }
4341 
4342 #define CIM_OBQ_INTR (OBQULP0PARERR_F | OBQULP1PARERR_F | OBQULP2PARERR_F |\
4343 		      OBQULP3PARERR_F | OBQSGEPARERR_F | OBQNCSIPARERR_F)
4344 #define CIM_IBQ_INTR (IBQTP0PARERR_F | IBQTP1PARERR_F | IBQULPPARERR_F |\
4345 		      IBQSGEHIPARERR_F | IBQSGELOPARERR_F | IBQNCSIPARERR_F)
4346 
4347 /*
4348  * CIM interrupt handler.
4349  */
4350 static void cim_intr_handler(struct adapter *adapter)
4351 {
4352 	static const struct intr_info cim_intr_info[] = {
4353 		{ PREFDROPINT_F, "CIM control register prefetch drop", -1, 1 },
4354 		{ CIM_OBQ_INTR, "CIM OBQ parity error", -1, 1 },
4355 		{ CIM_IBQ_INTR, "CIM IBQ parity error", -1, 1 },
4356 		{ MBUPPARERR_F, "CIM mailbox uP parity error", -1, 1 },
4357 		{ MBHOSTPARERR_F, "CIM mailbox host parity error", -1, 1 },
4358 		{ TIEQINPARERRINT_F, "CIM TIEQ outgoing parity error", -1, 1 },
4359 		{ TIEQOUTPARERRINT_F, "CIM TIEQ incoming parity error", -1, 1 },
4360 		{ TIMER0INT_F, "CIM TIMER0 interrupt", -1, 1 },
4361 		{ 0 }
4362 	};
4363 	static const struct intr_info cim_upintr_info[] = {
4364 		{ RSVDSPACEINT_F, "CIM reserved space access", -1, 1 },
4365 		{ ILLTRANSINT_F, "CIM illegal transaction", -1, 1 },
4366 		{ ILLWRINT_F, "CIM illegal write", -1, 1 },
4367 		{ ILLRDINT_F, "CIM illegal read", -1, 1 },
4368 		{ ILLRDBEINT_F, "CIM illegal read BE", -1, 1 },
4369 		{ ILLWRBEINT_F, "CIM illegal write BE", -1, 1 },
4370 		{ SGLRDBOOTINT_F, "CIM single read from boot space", -1, 1 },
4371 		{ SGLWRBOOTINT_F, "CIM single write to boot space", -1, 1 },
4372 		{ BLKWRBOOTINT_F, "CIM block write to boot space", -1, 1 },
4373 		{ SGLRDFLASHINT_F, "CIM single read from flash space", -1, 1 },
4374 		{ SGLWRFLASHINT_F, "CIM single write to flash space", -1, 1 },
4375 		{ BLKWRFLASHINT_F, "CIM block write to flash space", -1, 1 },
4376 		{ SGLRDEEPROMINT_F, "CIM single EEPROM read", -1, 1 },
4377 		{ SGLWREEPROMINT_F, "CIM single EEPROM write", -1, 1 },
4378 		{ BLKRDEEPROMINT_F, "CIM block EEPROM read", -1, 1 },
4379 		{ BLKWREEPROMINT_F, "CIM block EEPROM write", -1, 1 },
4380 		{ SGLRDCTLINT_F, "CIM single read from CTL space", -1, 1 },
4381 		{ SGLWRCTLINT_F, "CIM single write to CTL space", -1, 1 },
4382 		{ BLKRDCTLINT_F, "CIM block read from CTL space", -1, 1 },
4383 		{ BLKWRCTLINT_F, "CIM block write to CTL space", -1, 1 },
4384 		{ SGLRDPLINT_F, "CIM single read from PL space", -1, 1 },
4385 		{ SGLWRPLINT_F, "CIM single write to PL space", -1, 1 },
4386 		{ BLKRDPLINT_F, "CIM block read from PL space", -1, 1 },
4387 		{ BLKWRPLINT_F, "CIM block write to PL space", -1, 1 },
4388 		{ REQOVRLOOKUPINT_F, "CIM request FIFO overwrite", -1, 1 },
4389 		{ RSPOVRLOOKUPINT_F, "CIM response FIFO overwrite", -1, 1 },
4390 		{ TIMEOUTINT_F, "CIM PIF timeout", -1, 1 },
4391 		{ TIMEOUTMAINT_F, "CIM PIF MA timeout", -1, 1 },
4392 		{ 0 }
4393 	};
4394 
4395 	u32 val, fw_err;
4396 	int fat;
4397 
4398 	fw_err = t4_read_reg(adapter, PCIE_FW_A);
4399 	if (fw_err & PCIE_FW_ERR_F)
4400 		t4_report_fw_error(adapter);
4401 
4402 	/* When the Firmware detects an internal error which normally
4403 	 * wouldn't raise a Host Interrupt, it forces a CIM Timer0 interrupt
4404 	 * in order to make sure the Host sees the Firmware Crash.  So
4405 	 * if we have a Timer0 interrupt and don't see a Firmware Crash,
4406 	 * ignore the Timer0 interrupt.
4407 	 */
4408 
4409 	val = t4_read_reg(adapter, CIM_HOST_INT_CAUSE_A);
4410 	if (val & TIMER0INT_F)
4411 		if (!(fw_err & PCIE_FW_ERR_F) ||
4412 		    (PCIE_FW_EVAL_G(fw_err) != PCIE_FW_EVAL_CRASH))
4413 			t4_write_reg(adapter, CIM_HOST_INT_CAUSE_A,
4414 				     TIMER0INT_F);
4415 
4416 	fat = t4_handle_intr_status(adapter, CIM_HOST_INT_CAUSE_A,
4417 				    cim_intr_info) +
4418 	      t4_handle_intr_status(adapter, CIM_HOST_UPACC_INT_CAUSE_A,
4419 				    cim_upintr_info);
4420 	if (fat)
4421 		t4_fatal_err(adapter);
4422 }
4423 
4424 /*
4425  * ULP RX interrupt handler.
4426  */
4427 static void ulprx_intr_handler(struct adapter *adapter)
4428 {
4429 	static const struct intr_info ulprx_intr_info[] = {
4430 		{ 0x1800000, "ULPRX context error", -1, 1 },
4431 		{ 0x7fffff, "ULPRX parity error", -1, 1 },
4432 		{ 0 }
4433 	};
4434 
4435 	if (t4_handle_intr_status(adapter, ULP_RX_INT_CAUSE_A, ulprx_intr_info))
4436 		t4_fatal_err(adapter);
4437 }
4438 
4439 /*
4440  * ULP TX interrupt handler.
4441  */
4442 static void ulptx_intr_handler(struct adapter *adapter)
4443 {
4444 	static const struct intr_info ulptx_intr_info[] = {
4445 		{ PBL_BOUND_ERR_CH3_F, "ULPTX channel 3 PBL out of bounds", -1,
4446 		  0 },
4447 		{ PBL_BOUND_ERR_CH2_F, "ULPTX channel 2 PBL out of bounds", -1,
4448 		  0 },
4449 		{ PBL_BOUND_ERR_CH1_F, "ULPTX channel 1 PBL out of bounds", -1,
4450 		  0 },
4451 		{ PBL_BOUND_ERR_CH0_F, "ULPTX channel 0 PBL out of bounds", -1,
4452 		  0 },
4453 		{ 0xfffffff, "ULPTX parity error", -1, 1 },
4454 		{ 0 }
4455 	};
4456 
4457 	if (t4_handle_intr_status(adapter, ULP_TX_INT_CAUSE_A, ulptx_intr_info))
4458 		t4_fatal_err(adapter);
4459 }
4460 
4461 /*
4462  * PM TX interrupt handler.
4463  */
4464 static void pmtx_intr_handler(struct adapter *adapter)
4465 {
4466 	static const struct intr_info pmtx_intr_info[] = {
4467 		{ PCMD_LEN_OVFL0_F, "PMTX channel 0 pcmd too large", -1, 1 },
4468 		{ PCMD_LEN_OVFL1_F, "PMTX channel 1 pcmd too large", -1, 1 },
4469 		{ PCMD_LEN_OVFL2_F, "PMTX channel 2 pcmd too large", -1, 1 },
4470 		{ ZERO_C_CMD_ERROR_F, "PMTX 0-length pcmd", -1, 1 },
4471 		{ PMTX_FRAMING_ERROR_F, "PMTX framing error", -1, 1 },
4472 		{ OESPI_PAR_ERROR_F, "PMTX oespi parity error", -1, 1 },
4473 		{ DB_OPTIONS_PAR_ERROR_F, "PMTX db_options parity error",
4474 		  -1, 1 },
4475 		{ ICSPI_PAR_ERROR_F, "PMTX icspi parity error", -1, 1 },
4476 		{ PMTX_C_PCMD_PAR_ERROR_F, "PMTX c_pcmd parity error", -1, 1},
4477 		{ 0 }
4478 	};
4479 
4480 	if (t4_handle_intr_status(adapter, PM_TX_INT_CAUSE_A, pmtx_intr_info))
4481 		t4_fatal_err(adapter);
4482 }
4483 
4484 /*
4485  * PM RX interrupt handler.
4486  */
4487 static void pmrx_intr_handler(struct adapter *adapter)
4488 {
4489 	static const struct intr_info pmrx_intr_info[] = {
4490 		{ ZERO_E_CMD_ERROR_F, "PMRX 0-length pcmd", -1, 1 },
4491 		{ PMRX_FRAMING_ERROR_F, "PMRX framing error", -1, 1 },
4492 		{ OCSPI_PAR_ERROR_F, "PMRX ocspi parity error", -1, 1 },
4493 		{ DB_OPTIONS_PAR_ERROR_F, "PMRX db_options parity error",
4494 		  -1, 1 },
4495 		{ IESPI_PAR_ERROR_F, "PMRX iespi parity error", -1, 1 },
4496 		{ PMRX_E_PCMD_PAR_ERROR_F, "PMRX e_pcmd parity error", -1, 1},
4497 		{ 0 }
4498 	};
4499 
4500 	if (t4_handle_intr_status(adapter, PM_RX_INT_CAUSE_A, pmrx_intr_info))
4501 		t4_fatal_err(adapter);
4502 }
4503 
4504 /*
4505  * CPL switch interrupt handler.
4506  */
4507 static void cplsw_intr_handler(struct adapter *adapter)
4508 {
4509 	static const struct intr_info cplsw_intr_info[] = {
4510 		{ CIM_OP_MAP_PERR_F, "CPLSW CIM op_map parity error", -1, 1 },
4511 		{ CIM_OVFL_ERROR_F, "CPLSW CIM overflow", -1, 1 },
4512 		{ TP_FRAMING_ERROR_F, "CPLSW TP framing error", -1, 1 },
4513 		{ SGE_FRAMING_ERROR_F, "CPLSW SGE framing error", -1, 1 },
4514 		{ CIM_FRAMING_ERROR_F, "CPLSW CIM framing error", -1, 1 },
4515 		{ ZERO_SWITCH_ERROR_F, "CPLSW no-switch error", -1, 1 },
4516 		{ 0 }
4517 	};
4518 
4519 	if (t4_handle_intr_status(adapter, CPL_INTR_CAUSE_A, cplsw_intr_info))
4520 		t4_fatal_err(adapter);
4521 }
4522 
4523 /*
4524  * LE interrupt handler.
4525  */
4526 static void le_intr_handler(struct adapter *adap)
4527 {
4528 	enum chip_type chip = CHELSIO_CHIP_VERSION(adap->params.chip);
4529 	static const struct intr_info le_intr_info[] = {
4530 		{ LIPMISS_F, "LE LIP miss", -1, 0 },
4531 		{ LIP0_F, "LE 0 LIP error", -1, 0 },
4532 		{ PARITYERR_F, "LE parity error", -1, 1 },
4533 		{ UNKNOWNCMD_F, "LE unknown command", -1, 1 },
4534 		{ REQQPARERR_F, "LE request queue parity error", -1, 1 },
4535 		{ 0 }
4536 	};
4537 
4538 	static struct intr_info t6_le_intr_info[] = {
4539 		{ T6_LIPMISS_F, "LE LIP miss", -1, 0 },
4540 		{ T6_LIP0_F, "LE 0 LIP error", -1, 0 },
4541 		{ TCAMINTPERR_F, "LE parity error", -1, 1 },
4542 		{ T6_UNKNOWNCMD_F, "LE unknown command", -1, 1 },
4543 		{ SSRAMINTPERR_F, "LE request queue parity error", -1, 1 },
4544 		{ 0 }
4545 	};
4546 
4547 	if (t4_handle_intr_status(adap, LE_DB_INT_CAUSE_A,
4548 				  (chip <= CHELSIO_T5) ?
4549 				  le_intr_info : t6_le_intr_info))
4550 		t4_fatal_err(adap);
4551 }
4552 
4553 /*
4554  * MPS interrupt handler.
4555  */
4556 static void mps_intr_handler(struct adapter *adapter)
4557 {
4558 	static const struct intr_info mps_rx_intr_info[] = {
4559 		{ 0xffffff, "MPS Rx parity error", -1, 1 },
4560 		{ 0 }
4561 	};
4562 	static const struct intr_info mps_tx_intr_info[] = {
4563 		{ TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 },
4564 		{ NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 },
4565 		{ TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error",
4566 		  -1, 1 },
4567 		{ TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error",
4568 		  -1, 1 },
4569 		{ BUBBLE_F, "MPS Tx underflow", -1, 1 },
4570 		{ SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 },
4571 		{ FRMERR_F, "MPS Tx framing error", -1, 1 },
4572 		{ 0 }
4573 	};
4574 	static const struct intr_info t6_mps_tx_intr_info[] = {
4575 		{ TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 },
4576 		{ NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 },
4577 		{ TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error",
4578 		  -1, 1 },
4579 		{ TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error",
4580 		  -1, 1 },
4581 		/* MPS Tx Bubble is normal for T6 */
4582 		{ SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 },
4583 		{ FRMERR_F, "MPS Tx framing error", -1, 1 },
4584 		{ 0 }
4585 	};
4586 	static const struct intr_info mps_trc_intr_info[] = {
4587 		{ FILTMEM_V(FILTMEM_M), "MPS TRC filter parity error", -1, 1 },
4588 		{ PKTFIFO_V(PKTFIFO_M), "MPS TRC packet FIFO parity error",
4589 		  -1, 1 },
4590 		{ MISCPERR_F, "MPS TRC misc parity error", -1, 1 },
4591 		{ 0 }
4592 	};
4593 	static const struct intr_info mps_stat_sram_intr_info[] = {
4594 		{ 0x1fffff, "MPS statistics SRAM parity error", -1, 1 },
4595 		{ 0 }
4596 	};
4597 	static const struct intr_info mps_stat_tx_intr_info[] = {
4598 		{ 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 },
4599 		{ 0 }
4600 	};
4601 	static const struct intr_info mps_stat_rx_intr_info[] = {
4602 		{ 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 },
4603 		{ 0 }
4604 	};
4605 	static const struct intr_info mps_cls_intr_info[] = {
4606 		{ MATCHSRAM_F, "MPS match SRAM parity error", -1, 1 },
4607 		{ MATCHTCAM_F, "MPS match TCAM parity error", -1, 1 },
4608 		{ HASHSRAM_F, "MPS hash SRAM parity error", -1, 1 },
4609 		{ 0 }
4610 	};
4611 
4612 	int fat;
4613 
4614 	fat = t4_handle_intr_status(adapter, MPS_RX_PERR_INT_CAUSE_A,
4615 				    mps_rx_intr_info) +
4616 	      t4_handle_intr_status(adapter, MPS_TX_INT_CAUSE_A,
4617 				    is_t6(adapter->params.chip)
4618 				    ? t6_mps_tx_intr_info
4619 				    : mps_tx_intr_info) +
4620 	      t4_handle_intr_status(adapter, MPS_TRC_INT_CAUSE_A,
4621 				    mps_trc_intr_info) +
4622 	      t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_SRAM_A,
4623 				    mps_stat_sram_intr_info) +
4624 	      t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_TX_FIFO_A,
4625 				    mps_stat_tx_intr_info) +
4626 	      t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_RX_FIFO_A,
4627 				    mps_stat_rx_intr_info) +
4628 	      t4_handle_intr_status(adapter, MPS_CLS_INT_CAUSE_A,
4629 				    mps_cls_intr_info);
4630 
4631 	t4_write_reg(adapter, MPS_INT_CAUSE_A, 0);
4632 	t4_read_reg(adapter, MPS_INT_CAUSE_A);                    /* flush */
4633 	if (fat)
4634 		t4_fatal_err(adapter);
4635 }
4636 
4637 #define MEM_INT_MASK (PERR_INT_CAUSE_F | ECC_CE_INT_CAUSE_F | \
4638 		      ECC_UE_INT_CAUSE_F)
4639 
4640 /*
4641  * EDC/MC interrupt handler.
4642  */
4643 static void mem_intr_handler(struct adapter *adapter, int idx)
4644 {
4645 	static const char name[4][7] = { "EDC0", "EDC1", "MC/MC0", "MC1" };
4646 
4647 	unsigned int addr, cnt_addr, v;
4648 
4649 	if (idx <= MEM_EDC1) {
4650 		addr = EDC_REG(EDC_INT_CAUSE_A, idx);
4651 		cnt_addr = EDC_REG(EDC_ECC_STATUS_A, idx);
4652 	} else if (idx == MEM_MC) {
4653 		if (is_t4(adapter->params.chip)) {
4654 			addr = MC_INT_CAUSE_A;
4655 			cnt_addr = MC_ECC_STATUS_A;
4656 		} else {
4657 			addr = MC_P_INT_CAUSE_A;
4658 			cnt_addr = MC_P_ECC_STATUS_A;
4659 		}
4660 	} else {
4661 		addr = MC_REG(MC_P_INT_CAUSE_A, 1);
4662 		cnt_addr = MC_REG(MC_P_ECC_STATUS_A, 1);
4663 	}
4664 
4665 	v = t4_read_reg(adapter, addr) & MEM_INT_MASK;
4666 	if (v & PERR_INT_CAUSE_F)
4667 		dev_alert(adapter->pdev_dev, "%s FIFO parity error\n",
4668 			  name[idx]);
4669 	if (v & ECC_CE_INT_CAUSE_F) {
4670 		u32 cnt = ECC_CECNT_G(t4_read_reg(adapter, cnt_addr));
4671 
4672 		t4_edc_err_read(adapter, idx);
4673 
4674 		t4_write_reg(adapter, cnt_addr, ECC_CECNT_V(ECC_CECNT_M));
4675 		if (printk_ratelimit())
4676 			dev_warn(adapter->pdev_dev,
4677 				 "%u %s correctable ECC data error%s\n",
4678 				 cnt, name[idx], cnt > 1 ? "s" : "");
4679 	}
4680 	if (v & ECC_UE_INT_CAUSE_F)
4681 		dev_alert(adapter->pdev_dev,
4682 			  "%s uncorrectable ECC data error\n", name[idx]);
4683 
4684 	t4_write_reg(adapter, addr, v);
4685 	if (v & (PERR_INT_CAUSE_F | ECC_UE_INT_CAUSE_F))
4686 		t4_fatal_err(adapter);
4687 }
4688 
4689 /*
4690  * MA interrupt handler.
4691  */
4692 static void ma_intr_handler(struct adapter *adap)
4693 {
4694 	u32 v, status = t4_read_reg(adap, MA_INT_CAUSE_A);
4695 
4696 	if (status & MEM_PERR_INT_CAUSE_F) {
4697 		dev_alert(adap->pdev_dev,
4698 			  "MA parity error, parity status %#x\n",
4699 			  t4_read_reg(adap, MA_PARITY_ERROR_STATUS1_A));
4700 		if (is_t5(adap->params.chip))
4701 			dev_alert(adap->pdev_dev,
4702 				  "MA parity error, parity status %#x\n",
4703 				  t4_read_reg(adap,
4704 					      MA_PARITY_ERROR_STATUS2_A));
4705 	}
4706 	if (status & MEM_WRAP_INT_CAUSE_F) {
4707 		v = t4_read_reg(adap, MA_INT_WRAP_STATUS_A);
4708 		dev_alert(adap->pdev_dev, "MA address wrap-around error by "
4709 			  "client %u to address %#x\n",
4710 			  MEM_WRAP_CLIENT_NUM_G(v),
4711 			  MEM_WRAP_ADDRESS_G(v) << 4);
4712 	}
4713 	t4_write_reg(adap, MA_INT_CAUSE_A, status);
4714 	t4_fatal_err(adap);
4715 }
4716 
4717 /*
4718  * SMB interrupt handler.
4719  */
4720 static void smb_intr_handler(struct adapter *adap)
4721 {
4722 	static const struct intr_info smb_intr_info[] = {
4723 		{ MSTTXFIFOPARINT_F, "SMB master Tx FIFO parity error", -1, 1 },
4724 		{ MSTRXFIFOPARINT_F, "SMB master Rx FIFO parity error", -1, 1 },
4725 		{ SLVFIFOPARINT_F, "SMB slave FIFO parity error", -1, 1 },
4726 		{ 0 }
4727 	};
4728 
4729 	if (t4_handle_intr_status(adap, SMB_INT_CAUSE_A, smb_intr_info))
4730 		t4_fatal_err(adap);
4731 }
4732 
4733 /*
4734  * NC-SI interrupt handler.
4735  */
4736 static void ncsi_intr_handler(struct adapter *adap)
4737 {
4738 	static const struct intr_info ncsi_intr_info[] = {
4739 		{ CIM_DM_PRTY_ERR_F, "NC-SI CIM parity error", -1, 1 },
4740 		{ MPS_DM_PRTY_ERR_F, "NC-SI MPS parity error", -1, 1 },
4741 		{ TXFIFO_PRTY_ERR_F, "NC-SI Tx FIFO parity error", -1, 1 },
4742 		{ RXFIFO_PRTY_ERR_F, "NC-SI Rx FIFO parity error", -1, 1 },
4743 		{ 0 }
4744 	};
4745 
4746 	if (t4_handle_intr_status(adap, NCSI_INT_CAUSE_A, ncsi_intr_info))
4747 		t4_fatal_err(adap);
4748 }
4749 
4750 /*
4751  * XGMAC interrupt handler.
4752  */
4753 static void xgmac_intr_handler(struct adapter *adap, int port)
4754 {
4755 	u32 v, int_cause_reg;
4756 
4757 	if (is_t4(adap->params.chip))
4758 		int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE_A);
4759 	else
4760 		int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE_A);
4761 
4762 	v = t4_read_reg(adap, int_cause_reg);
4763 
4764 	v &= TXFIFO_PRTY_ERR_F | RXFIFO_PRTY_ERR_F;
4765 	if (!v)
4766 		return;
4767 
4768 	if (v & TXFIFO_PRTY_ERR_F)
4769 		dev_alert(adap->pdev_dev, "XGMAC %d Tx FIFO parity error\n",
4770 			  port);
4771 	if (v & RXFIFO_PRTY_ERR_F)
4772 		dev_alert(adap->pdev_dev, "XGMAC %d Rx FIFO parity error\n",
4773 			  port);
4774 	t4_write_reg(adap, PORT_REG(port, XGMAC_PORT_INT_CAUSE_A), v);
4775 	t4_fatal_err(adap);
4776 }
4777 
4778 /*
4779  * PL interrupt handler.
4780  */
4781 static void pl_intr_handler(struct adapter *adap)
4782 {
4783 	static const struct intr_info pl_intr_info[] = {
4784 		{ FATALPERR_F, "T4 fatal parity error", -1, 1 },
4785 		{ PERRVFID_F, "PL VFID_MAP parity error", -1, 1 },
4786 		{ 0 }
4787 	};
4788 
4789 	if (t4_handle_intr_status(adap, PL_PL_INT_CAUSE_A, pl_intr_info))
4790 		t4_fatal_err(adap);
4791 }
4792 
4793 #define PF_INTR_MASK (PFSW_F)
4794 #define GLBL_INTR_MASK (CIM_F | MPS_F | PL_F | PCIE_F | MC_F | EDC0_F | \
4795 		EDC1_F | LE_F | TP_F | MA_F | PM_TX_F | PM_RX_F | ULP_RX_F | \
4796 		CPL_SWITCH_F | SGE_F | ULP_TX_F | SF_F)
4797 
4798 /**
4799  *	t4_slow_intr_handler - control path interrupt handler
4800  *	@adapter: the adapter
4801  *
4802  *	T4 interrupt handler for non-data global interrupt events, e.g., errors.
4803  *	The designation 'slow' is because it involves register reads, while
4804  *	data interrupts typically don't involve any MMIOs.
4805  */
4806 int t4_slow_intr_handler(struct adapter *adapter)
4807 {
4808 	u32 cause = t4_read_reg(adapter, PL_INT_CAUSE_A);
4809 
4810 	if (!(cause & GLBL_INTR_MASK))
4811 		return 0;
4812 	if (cause & CIM_F)
4813 		cim_intr_handler(adapter);
4814 	if (cause & MPS_F)
4815 		mps_intr_handler(adapter);
4816 	if (cause & NCSI_F)
4817 		ncsi_intr_handler(adapter);
4818 	if (cause & PL_F)
4819 		pl_intr_handler(adapter);
4820 	if (cause & SMB_F)
4821 		smb_intr_handler(adapter);
4822 	if (cause & XGMAC0_F)
4823 		xgmac_intr_handler(adapter, 0);
4824 	if (cause & XGMAC1_F)
4825 		xgmac_intr_handler(adapter, 1);
4826 	if (cause & XGMAC_KR0_F)
4827 		xgmac_intr_handler(adapter, 2);
4828 	if (cause & XGMAC_KR1_F)
4829 		xgmac_intr_handler(adapter, 3);
4830 	if (cause & PCIE_F)
4831 		pcie_intr_handler(adapter);
4832 	if (cause & MC_F)
4833 		mem_intr_handler(adapter, MEM_MC);
4834 	if (is_t5(adapter->params.chip) && (cause & MC1_F))
4835 		mem_intr_handler(adapter, MEM_MC1);
4836 	if (cause & EDC0_F)
4837 		mem_intr_handler(adapter, MEM_EDC0);
4838 	if (cause & EDC1_F)
4839 		mem_intr_handler(adapter, MEM_EDC1);
4840 	if (cause & LE_F)
4841 		le_intr_handler(adapter);
4842 	if (cause & TP_F)
4843 		tp_intr_handler(adapter);
4844 	if (cause & MA_F)
4845 		ma_intr_handler(adapter);
4846 	if (cause & PM_TX_F)
4847 		pmtx_intr_handler(adapter);
4848 	if (cause & PM_RX_F)
4849 		pmrx_intr_handler(adapter);
4850 	if (cause & ULP_RX_F)
4851 		ulprx_intr_handler(adapter);
4852 	if (cause & CPL_SWITCH_F)
4853 		cplsw_intr_handler(adapter);
4854 	if (cause & SGE_F)
4855 		sge_intr_handler(adapter);
4856 	if (cause & ULP_TX_F)
4857 		ulptx_intr_handler(adapter);
4858 
4859 	/* Clear the interrupts just processed for which we are the master. */
4860 	t4_write_reg(adapter, PL_INT_CAUSE_A, cause & GLBL_INTR_MASK);
4861 	(void)t4_read_reg(adapter, PL_INT_CAUSE_A); /* flush */
4862 	return 1;
4863 }
4864 
4865 /**
4866  *	t4_intr_enable - enable interrupts
4867  *	@adapter: the adapter whose interrupts should be enabled
4868  *
4869  *	Enable PF-specific interrupts for the calling function and the top-level
4870  *	interrupt concentrator for global interrupts.  Interrupts are already
4871  *	enabled at each module,	here we just enable the roots of the interrupt
4872  *	hierarchies.
4873  *
4874  *	Note: this function should be called only when the driver manages
4875  *	non PF-specific interrupts from the various HW modules.  Only one PCI
4876  *	function at a time should be doing this.
4877  */
4878 void t4_intr_enable(struct adapter *adapter)
4879 {
4880 	u32 val = 0;
4881 	u32 whoami = t4_read_reg(adapter, PL_WHOAMI_A);
4882 	u32 pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ?
4883 			SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami);
4884 
4885 	if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
4886 		val = ERR_DROPPED_DB_F | ERR_EGR_CTXT_PRIO_F | DBFIFO_HP_INT_F;
4887 	t4_write_reg(adapter, SGE_INT_ENABLE3_A, ERR_CPL_EXCEED_IQE_SIZE_F |
4888 		     ERR_INVALID_CIDX_INC_F | ERR_CPL_OPCODE_0_F |
4889 		     ERR_DATA_CPL_ON_HIGH_QID1_F | INGRESS_SIZE_ERR_F |
4890 		     ERR_DATA_CPL_ON_HIGH_QID0_F | ERR_BAD_DB_PIDX3_F |
4891 		     ERR_BAD_DB_PIDX2_F | ERR_BAD_DB_PIDX1_F |
4892 		     ERR_BAD_DB_PIDX0_F | ERR_ING_CTXT_PRIO_F |
4893 		     DBFIFO_LP_INT_F | EGRESS_SIZE_ERR_F | val);
4894 	t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), PF_INTR_MASK);
4895 	t4_set_reg_field(adapter, PL_INT_MAP0_A, 0, 1 << pf);
4896 }
4897 
4898 /**
4899  *	t4_intr_disable - disable interrupts
4900  *	@adapter: the adapter whose interrupts should be disabled
4901  *
4902  *	Disable interrupts.  We only disable the top-level interrupt
4903  *	concentrators.  The caller must be a PCI function managing global
4904  *	interrupts.
4905  */
4906 void t4_intr_disable(struct adapter *adapter)
4907 {
4908 	u32 whoami, pf;
4909 
4910 	if (pci_channel_offline(adapter->pdev))
4911 		return;
4912 
4913 	whoami = t4_read_reg(adapter, PL_WHOAMI_A);
4914 	pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ?
4915 			SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami);
4916 
4917 	t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), 0);
4918 	t4_set_reg_field(adapter, PL_INT_MAP0_A, 1 << pf, 0);
4919 }
4920 
4921 unsigned int t4_chip_rss_size(struct adapter *adap)
4922 {
4923 	if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
4924 		return RSS_NENTRIES;
4925 	else
4926 		return T6_RSS_NENTRIES;
4927 }
4928 
4929 /**
4930  *	t4_config_rss_range - configure a portion of the RSS mapping table
4931  *	@adapter: the adapter
4932  *	@mbox: mbox to use for the FW command
4933  *	@viid: virtual interface whose RSS subtable is to be written
4934  *	@start: start entry in the table to write
4935  *	@n: how many table entries to write
4936  *	@rspq: values for the response queue lookup table
4937  *	@nrspq: number of values in @rspq
4938  *
4939  *	Programs the selected part of the VI's RSS mapping table with the
4940  *	provided values.  If @nrspq < @n the supplied values are used repeatedly
4941  *	until the full table range is populated.
4942  *
4943  *	The caller must ensure the values in @rspq are in the range allowed for
4944  *	@viid.
4945  */
4946 int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
4947 			int start, int n, const u16 *rspq, unsigned int nrspq)
4948 {
4949 	int ret;
4950 	const u16 *rsp = rspq;
4951 	const u16 *rsp_end = rspq + nrspq;
4952 	struct fw_rss_ind_tbl_cmd cmd;
4953 
4954 	memset(&cmd, 0, sizeof(cmd));
4955 	cmd.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_IND_TBL_CMD) |
4956 			       FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
4957 			       FW_RSS_IND_TBL_CMD_VIID_V(viid));
4958 	cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd));
4959 
4960 	/* each fw_rss_ind_tbl_cmd takes up to 32 entries */
4961 	while (n > 0) {
4962 		int nq = min(n, 32);
4963 		__be32 *qp = &cmd.iq0_to_iq2;
4964 
4965 		cmd.niqid = cpu_to_be16(nq);
4966 		cmd.startidx = cpu_to_be16(start);
4967 
4968 		start += nq;
4969 		n -= nq;
4970 
4971 		while (nq > 0) {
4972 			unsigned int v;
4973 
4974 			v = FW_RSS_IND_TBL_CMD_IQ0_V(*rsp);
4975 			if (++rsp >= rsp_end)
4976 				rsp = rspq;
4977 			v |= FW_RSS_IND_TBL_CMD_IQ1_V(*rsp);
4978 			if (++rsp >= rsp_end)
4979 				rsp = rspq;
4980 			v |= FW_RSS_IND_TBL_CMD_IQ2_V(*rsp);
4981 			if (++rsp >= rsp_end)
4982 				rsp = rspq;
4983 
4984 			*qp++ = cpu_to_be32(v);
4985 			nq -= 3;
4986 		}
4987 
4988 		ret = t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
4989 		if (ret)
4990 			return ret;
4991 	}
4992 	return 0;
4993 }
4994 
4995 /**
4996  *	t4_config_glbl_rss - configure the global RSS mode
4997  *	@adapter: the adapter
4998  *	@mbox: mbox to use for the FW command
4999  *	@mode: global RSS mode
5000  *	@flags: mode-specific flags
5001  *
5002  *	Sets the global RSS mode.
5003  */
5004 int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
5005 		       unsigned int flags)
5006 {
5007 	struct fw_rss_glb_config_cmd c;
5008 
5009 	memset(&c, 0, sizeof(c));
5010 	c.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_RSS_GLB_CONFIG_CMD) |
5011 				    FW_CMD_REQUEST_F | FW_CMD_WRITE_F);
5012 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
5013 	if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_MANUAL) {
5014 		c.u.manual.mode_pkd =
5015 			cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode));
5016 	} else if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) {
5017 		c.u.basicvirtual.mode_pkd =
5018 			cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode));
5019 		c.u.basicvirtual.synmapen_to_hashtoeplitz = cpu_to_be32(flags);
5020 	} else
5021 		return -EINVAL;
5022 	return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
5023 }
5024 
5025 /**
5026  *	t4_config_vi_rss - configure per VI RSS settings
5027  *	@adapter: the adapter
5028  *	@mbox: mbox to use for the FW command
5029  *	@viid: the VI id
5030  *	@flags: RSS flags
5031  *	@defq: id of the default RSS queue for the VI.
5032  *
5033  *	Configures VI-specific RSS properties.
5034  */
5035 int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
5036 		     unsigned int flags, unsigned int defq)
5037 {
5038 	struct fw_rss_vi_config_cmd c;
5039 
5040 	memset(&c, 0, sizeof(c));
5041 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) |
5042 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
5043 				   FW_RSS_VI_CONFIG_CMD_VIID_V(viid));
5044 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
5045 	c.u.basicvirtual.defaultq_to_udpen = cpu_to_be32(flags |
5046 					FW_RSS_VI_CONFIG_CMD_DEFAULTQ_V(defq));
5047 	return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
5048 }
5049 
5050 /* Read an RSS table row */
5051 static int rd_rss_row(struct adapter *adap, int row, u32 *val)
5052 {
5053 	t4_write_reg(adap, TP_RSS_LKP_TABLE_A, 0xfff00000 | row);
5054 	return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE_A, LKPTBLROWVLD_F, 1,
5055 				   5, 0, val);
5056 }
5057 
5058 /**
5059  *	t4_read_rss - read the contents of the RSS mapping table
5060  *	@adapter: the adapter
5061  *	@map: holds the contents of the RSS mapping table
5062  *
5063  *	Reads the contents of the RSS hash->queue mapping table.
5064  */
5065 int t4_read_rss(struct adapter *adapter, u16 *map)
5066 {
5067 	int i, ret, nentries;
5068 	u32 val;
5069 
5070 	nentries = t4_chip_rss_size(adapter);
5071 	for (i = 0; i < nentries / 2; ++i) {
5072 		ret = rd_rss_row(adapter, i, &val);
5073 		if (ret)
5074 			return ret;
5075 		*map++ = LKPTBLQUEUE0_G(val);
5076 		*map++ = LKPTBLQUEUE1_G(val);
5077 	}
5078 	return 0;
5079 }
5080 
5081 static unsigned int t4_use_ldst(struct adapter *adap)
5082 {
5083 	return (adap->flags & FW_OK) && !adap->use_bd;
5084 }
5085 
5086 /**
5087  * t4_tp_fw_ldst_rw - Access TP indirect register through LDST
5088  * @adap: the adapter
5089  * @cmd: TP fw ldst address space type
5090  * @vals: where the indirect register values are stored/written
5091  * @nregs: how many indirect registers to read/write
5092  * @start_idx: index of first indirect register to read/write
5093  * @rw: Read (1) or Write (0)
5094  * @sleep_ok: if true we may sleep while awaiting command completion
5095  *
5096  * Access TP indirect registers through LDST
5097  */
5098 static int t4_tp_fw_ldst_rw(struct adapter *adap, int cmd, u32 *vals,
5099 			    unsigned int nregs, unsigned int start_index,
5100 			    unsigned int rw, bool sleep_ok)
5101 {
5102 	int ret = 0;
5103 	unsigned int i;
5104 	struct fw_ldst_cmd c;
5105 
5106 	for (i = 0; i < nregs; i++) {
5107 		memset(&c, 0, sizeof(c));
5108 		c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
5109 						FW_CMD_REQUEST_F |
5110 						(rw ? FW_CMD_READ_F :
5111 						      FW_CMD_WRITE_F) |
5112 						FW_LDST_CMD_ADDRSPACE_V(cmd));
5113 		c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
5114 
5115 		c.u.addrval.addr = cpu_to_be32(start_index + i);
5116 		c.u.addrval.val  = rw ? 0 : cpu_to_be32(vals[i]);
5117 		ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c,
5118 				      sleep_ok);
5119 		if (ret)
5120 			return ret;
5121 
5122 		if (rw)
5123 			vals[i] = be32_to_cpu(c.u.addrval.val);
5124 	}
5125 	return 0;
5126 }
5127 
5128 /**
5129  * t4_tp_indirect_rw - Read/Write TP indirect register through LDST or backdoor
5130  * @adap: the adapter
5131  * @reg_addr: Address Register
5132  * @reg_data: Data register
5133  * @buff: where the indirect register values are stored/written
5134  * @nregs: how many indirect registers to read/write
5135  * @start_index: index of first indirect register to read/write
5136  * @rw: READ(1) or WRITE(0)
5137  * @sleep_ok: if true we may sleep while awaiting command completion
5138  *
5139  * Read/Write TP indirect registers through LDST if possible.
5140  * Else, use backdoor access
5141  **/
5142 static void t4_tp_indirect_rw(struct adapter *adap, u32 reg_addr, u32 reg_data,
5143 			      u32 *buff, u32 nregs, u32 start_index, int rw,
5144 			      bool sleep_ok)
5145 {
5146 	int rc = -EINVAL;
5147 	int cmd;
5148 
5149 	switch (reg_addr) {
5150 	case TP_PIO_ADDR_A:
5151 		cmd = FW_LDST_ADDRSPC_TP_PIO;
5152 		break;
5153 	case TP_TM_PIO_ADDR_A:
5154 		cmd = FW_LDST_ADDRSPC_TP_TM_PIO;
5155 		break;
5156 	case TP_MIB_INDEX_A:
5157 		cmd = FW_LDST_ADDRSPC_TP_MIB;
5158 		break;
5159 	default:
5160 		goto indirect_access;
5161 	}
5162 
5163 	if (t4_use_ldst(adap))
5164 		rc = t4_tp_fw_ldst_rw(adap, cmd, buff, nregs, start_index, rw,
5165 				      sleep_ok);
5166 
5167 indirect_access:
5168 
5169 	if (rc) {
5170 		if (rw)
5171 			t4_read_indirect(adap, reg_addr, reg_data, buff, nregs,
5172 					 start_index);
5173 		else
5174 			t4_write_indirect(adap, reg_addr, reg_data, buff, nregs,
5175 					  start_index);
5176 	}
5177 }
5178 
5179 /**
5180  * t4_tp_pio_read - Read TP PIO registers
5181  * @adap: the adapter
5182  * @buff: where the indirect register values are written
5183  * @nregs: how many indirect registers to read
5184  * @start_index: index of first indirect register to read
5185  * @sleep_ok: if true we may sleep while awaiting command completion
5186  *
5187  * Read TP PIO Registers
5188  **/
5189 void t4_tp_pio_read(struct adapter *adap, u32 *buff, u32 nregs,
5190 		    u32 start_index, bool sleep_ok)
5191 {
5192 	t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs,
5193 			  start_index, 1, sleep_ok);
5194 }
5195 
5196 /**
5197  * t4_tp_pio_write - Write TP PIO registers
5198  * @adap: the adapter
5199  * @buff: where the indirect register values are stored
5200  * @nregs: how many indirect registers to write
5201  * @start_index: index of first indirect register to write
5202  * @sleep_ok: if true we may sleep while awaiting command completion
5203  *
5204  * Write TP PIO Registers
5205  **/
5206 static void t4_tp_pio_write(struct adapter *adap, u32 *buff, u32 nregs,
5207 			    u32 start_index, bool sleep_ok)
5208 {
5209 	t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs,
5210 			  start_index, 0, sleep_ok);
5211 }
5212 
5213 /**
5214  * t4_tp_tm_pio_read - Read TP TM PIO registers
5215  * @adap: the adapter
5216  * @buff: where the indirect register values are written
5217  * @nregs: how many indirect registers to read
5218  * @start_index: index of first indirect register to read
5219  * @sleep_ok: if true we may sleep while awaiting command completion
5220  *
5221  * Read TP TM PIO Registers
5222  **/
5223 void t4_tp_tm_pio_read(struct adapter *adap, u32 *buff, u32 nregs,
5224 		       u32 start_index, bool sleep_ok)
5225 {
5226 	t4_tp_indirect_rw(adap, TP_TM_PIO_ADDR_A, TP_TM_PIO_DATA_A, buff,
5227 			  nregs, start_index, 1, sleep_ok);
5228 }
5229 
5230 /**
5231  * t4_tp_mib_read - Read TP MIB registers
5232  * @adap: the adapter
5233  * @buff: where the indirect register values are written
5234  * @nregs: how many indirect registers to read
5235  * @start_index: index of first indirect register to read
5236  * @sleep_ok: if true we may sleep while awaiting command completion
5237  *
5238  * Read TP MIB Registers
5239  **/
5240 void t4_tp_mib_read(struct adapter *adap, u32 *buff, u32 nregs, u32 start_index,
5241 		    bool sleep_ok)
5242 {
5243 	t4_tp_indirect_rw(adap, TP_MIB_INDEX_A, TP_MIB_DATA_A, buff, nregs,
5244 			  start_index, 1, sleep_ok);
5245 }
5246 
5247 /**
5248  *	t4_read_rss_key - read the global RSS key
5249  *	@adap: the adapter
5250  *	@key: 10-entry array holding the 320-bit RSS key
5251  *      @sleep_ok: if true we may sleep while awaiting command completion
5252  *
5253  *	Reads the global 320-bit RSS key.
5254  */
5255 void t4_read_rss_key(struct adapter *adap, u32 *key, bool sleep_ok)
5256 {
5257 	t4_tp_pio_read(adap, key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok);
5258 }
5259 
5260 /**
5261  *	t4_write_rss_key - program one of the RSS keys
5262  *	@adap: the adapter
5263  *	@key: 10-entry array holding the 320-bit RSS key
5264  *	@idx: which RSS key to write
5265  *      @sleep_ok: if true we may sleep while awaiting command completion
5266  *
5267  *	Writes one of the RSS keys with the given 320-bit value.  If @idx is
5268  *	0..15 the corresponding entry in the RSS key table is written,
5269  *	otherwise the global RSS key is written.
5270  */
5271 void t4_write_rss_key(struct adapter *adap, const u32 *key, int idx,
5272 		      bool sleep_ok)
5273 {
5274 	u8 rss_key_addr_cnt = 16;
5275 	u32 vrt = t4_read_reg(adap, TP_RSS_CONFIG_VRT_A);
5276 
5277 	/* T6 and later: for KeyMode 3 (per-vf and per-vf scramble),
5278 	 * allows access to key addresses 16-63 by using KeyWrAddrX
5279 	 * as index[5:4](upper 2) into key table
5280 	 */
5281 	if ((CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) &&
5282 	    (vrt & KEYEXTEND_F) && (KEYMODE_G(vrt) == 3))
5283 		rss_key_addr_cnt = 32;
5284 
5285 	t4_tp_pio_write(adap, (void *)key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok);
5286 
5287 	if (idx >= 0 && idx < rss_key_addr_cnt) {
5288 		if (rss_key_addr_cnt > 16)
5289 			t4_write_reg(adap, TP_RSS_CONFIG_VRT_A,
5290 				     KEYWRADDRX_V(idx >> 4) |
5291 				     T6_VFWRADDR_V(idx) | KEYWREN_F);
5292 		else
5293 			t4_write_reg(adap, TP_RSS_CONFIG_VRT_A,
5294 				     KEYWRADDR_V(idx) | KEYWREN_F);
5295 	}
5296 }
5297 
5298 /**
5299  *	t4_read_rss_pf_config - read PF RSS Configuration Table
5300  *	@adapter: the adapter
5301  *	@index: the entry in the PF RSS table to read
5302  *	@valp: where to store the returned value
5303  *      @sleep_ok: if true we may sleep while awaiting command completion
5304  *
5305  *	Reads the PF RSS Configuration Table at the specified index and returns
5306  *	the value found there.
5307  */
5308 void t4_read_rss_pf_config(struct adapter *adapter, unsigned int index,
5309 			   u32 *valp, bool sleep_ok)
5310 {
5311 	t4_tp_pio_read(adapter, valp, 1, TP_RSS_PF0_CONFIG_A + index, sleep_ok);
5312 }
5313 
5314 /**
5315  *	t4_read_rss_vf_config - read VF RSS Configuration Table
5316  *	@adapter: the adapter
5317  *	@index: the entry in the VF RSS table to read
5318  *	@vfl: where to store the returned VFL
5319  *	@vfh: where to store the returned VFH
5320  *      @sleep_ok: if true we may sleep while awaiting command completion
5321  *
5322  *	Reads the VF RSS Configuration Table at the specified index and returns
5323  *	the (VFL, VFH) values found there.
5324  */
5325 void t4_read_rss_vf_config(struct adapter *adapter, unsigned int index,
5326 			   u32 *vfl, u32 *vfh, bool sleep_ok)
5327 {
5328 	u32 vrt, mask, data;
5329 
5330 	if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) {
5331 		mask = VFWRADDR_V(VFWRADDR_M);
5332 		data = VFWRADDR_V(index);
5333 	} else {
5334 		 mask =  T6_VFWRADDR_V(T6_VFWRADDR_M);
5335 		 data = T6_VFWRADDR_V(index);
5336 	}
5337 
5338 	/* Request that the index'th VF Table values be read into VFL/VFH.
5339 	 */
5340 	vrt = t4_read_reg(adapter, TP_RSS_CONFIG_VRT_A);
5341 	vrt &= ~(VFRDRG_F | VFWREN_F | KEYWREN_F | mask);
5342 	vrt |= data | VFRDEN_F;
5343 	t4_write_reg(adapter, TP_RSS_CONFIG_VRT_A, vrt);
5344 
5345 	/* Grab the VFL/VFH values ...
5346 	 */
5347 	t4_tp_pio_read(adapter, vfl, 1, TP_RSS_VFL_CONFIG_A, sleep_ok);
5348 	t4_tp_pio_read(adapter, vfh, 1, TP_RSS_VFH_CONFIG_A, sleep_ok);
5349 }
5350 
5351 /**
5352  *	t4_read_rss_pf_map - read PF RSS Map
5353  *	@adapter: the adapter
5354  *      @sleep_ok: if true we may sleep while awaiting command completion
5355  *
5356  *	Reads the PF RSS Map register and returns its value.
5357  */
5358 u32 t4_read_rss_pf_map(struct adapter *adapter, bool sleep_ok)
5359 {
5360 	u32 pfmap;
5361 
5362 	t4_tp_pio_read(adapter, &pfmap, 1, TP_RSS_PF_MAP_A, sleep_ok);
5363 	return pfmap;
5364 }
5365 
5366 /**
5367  *	t4_read_rss_pf_mask - read PF RSS Mask
5368  *	@adapter: the adapter
5369  *      @sleep_ok: if true we may sleep while awaiting command completion
5370  *
5371  *	Reads the PF RSS Mask register and returns its value.
5372  */
5373 u32 t4_read_rss_pf_mask(struct adapter *adapter, bool sleep_ok)
5374 {
5375 	u32 pfmask;
5376 
5377 	t4_tp_pio_read(adapter, &pfmask, 1, TP_RSS_PF_MSK_A, sleep_ok);
5378 	return pfmask;
5379 }
5380 
5381 /**
5382  *	t4_tp_get_tcp_stats - read TP's TCP MIB counters
5383  *	@adap: the adapter
5384  *	@v4: holds the TCP/IP counter values
5385  *	@v6: holds the TCP/IPv6 counter values
5386  *      @sleep_ok: if true we may sleep while awaiting command completion
5387  *
5388  *	Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters.
5389  *	Either @v4 or @v6 may be %NULL to skip the corresponding stats.
5390  */
5391 void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
5392 			 struct tp_tcp_stats *v6, bool sleep_ok)
5393 {
5394 	u32 val[TP_MIB_TCP_RXT_SEG_LO_A - TP_MIB_TCP_OUT_RST_A + 1];
5395 
5396 #define STAT_IDX(x) ((TP_MIB_TCP_##x##_A) - TP_MIB_TCP_OUT_RST_A)
5397 #define STAT(x)     val[STAT_IDX(x)]
5398 #define STAT64(x)   (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
5399 
5400 	if (v4) {
5401 		t4_tp_mib_read(adap, val, ARRAY_SIZE(val),
5402 			       TP_MIB_TCP_OUT_RST_A, sleep_ok);
5403 		v4->tcp_out_rsts = STAT(OUT_RST);
5404 		v4->tcp_in_segs  = STAT64(IN_SEG);
5405 		v4->tcp_out_segs = STAT64(OUT_SEG);
5406 		v4->tcp_retrans_segs = STAT64(RXT_SEG);
5407 	}
5408 	if (v6) {
5409 		t4_tp_mib_read(adap, val, ARRAY_SIZE(val),
5410 			       TP_MIB_TCP_V6OUT_RST_A, sleep_ok);
5411 		v6->tcp_out_rsts = STAT(OUT_RST);
5412 		v6->tcp_in_segs  = STAT64(IN_SEG);
5413 		v6->tcp_out_segs = STAT64(OUT_SEG);
5414 		v6->tcp_retrans_segs = STAT64(RXT_SEG);
5415 	}
5416 #undef STAT64
5417 #undef STAT
5418 #undef STAT_IDX
5419 }
5420 
5421 /**
5422  *	t4_tp_get_err_stats - read TP's error MIB counters
5423  *	@adap: the adapter
5424  *	@st: holds the counter values
5425  *      @sleep_ok: if true we may sleep while awaiting command completion
5426  *
5427  *	Returns the values of TP's error counters.
5428  */
5429 void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st,
5430 			 bool sleep_ok)
5431 {
5432 	int nchan = adap->params.arch.nchan;
5433 
5434 	t4_tp_mib_read(adap, st->mac_in_errs, nchan, TP_MIB_MAC_IN_ERR_0_A,
5435 		       sleep_ok);
5436 	t4_tp_mib_read(adap, st->hdr_in_errs, nchan, TP_MIB_HDR_IN_ERR_0_A,
5437 		       sleep_ok);
5438 	t4_tp_mib_read(adap, st->tcp_in_errs, nchan, TP_MIB_TCP_IN_ERR_0_A,
5439 		       sleep_ok);
5440 	t4_tp_mib_read(adap, st->tnl_cong_drops, nchan,
5441 		       TP_MIB_TNL_CNG_DROP_0_A, sleep_ok);
5442 	t4_tp_mib_read(adap, st->ofld_chan_drops, nchan,
5443 		       TP_MIB_OFD_CHN_DROP_0_A, sleep_ok);
5444 	t4_tp_mib_read(adap, st->tnl_tx_drops, nchan, TP_MIB_TNL_DROP_0_A,
5445 		       sleep_ok);
5446 	t4_tp_mib_read(adap, st->ofld_vlan_drops, nchan,
5447 		       TP_MIB_OFD_VLN_DROP_0_A, sleep_ok);
5448 	t4_tp_mib_read(adap, st->tcp6_in_errs, nchan,
5449 		       TP_MIB_TCP_V6IN_ERR_0_A, sleep_ok);
5450 	t4_tp_mib_read(adap, &st->ofld_no_neigh, 2, TP_MIB_OFD_ARP_DROP_A,
5451 		       sleep_ok);
5452 }
5453 
5454 /**
5455  *	t4_tp_get_cpl_stats - read TP's CPL MIB counters
5456  *	@adap: the adapter
5457  *	@st: holds the counter values
5458  *      @sleep_ok: if true we may sleep while awaiting command completion
5459  *
5460  *	Returns the values of TP's CPL counters.
5461  */
5462 void t4_tp_get_cpl_stats(struct adapter *adap, struct tp_cpl_stats *st,
5463 			 bool sleep_ok)
5464 {
5465 	int nchan = adap->params.arch.nchan;
5466 
5467 	t4_tp_mib_read(adap, st->req, nchan, TP_MIB_CPL_IN_REQ_0_A, sleep_ok);
5468 
5469 	t4_tp_mib_read(adap, st->rsp, nchan, TP_MIB_CPL_OUT_RSP_0_A, sleep_ok);
5470 }
5471 
5472 /**
5473  *	t4_tp_get_rdma_stats - read TP's RDMA MIB counters
5474  *	@adap: the adapter
5475  *	@st: holds the counter values
5476  *      @sleep_ok: if true we may sleep while awaiting command completion
5477  *
5478  *	Returns the values of TP's RDMA counters.
5479  */
5480 void t4_tp_get_rdma_stats(struct adapter *adap, struct tp_rdma_stats *st,
5481 			  bool sleep_ok)
5482 {
5483 	t4_tp_mib_read(adap, &st->rqe_dfr_pkt, 2, TP_MIB_RQE_DFR_PKT_A,
5484 		       sleep_ok);
5485 }
5486 
5487 /**
5488  *	t4_get_fcoe_stats - read TP's FCoE MIB counters for a port
5489  *	@adap: the adapter
5490  *	@idx: the port index
5491  *	@st: holds the counter values
5492  *      @sleep_ok: if true we may sleep while awaiting command completion
5493  *
5494  *	Returns the values of TP's FCoE counters for the selected port.
5495  */
5496 void t4_get_fcoe_stats(struct adapter *adap, unsigned int idx,
5497 		       struct tp_fcoe_stats *st, bool sleep_ok)
5498 {
5499 	u32 val[2];
5500 
5501 	t4_tp_mib_read(adap, &st->frames_ddp, 1, TP_MIB_FCOE_DDP_0_A + idx,
5502 		       sleep_ok);
5503 
5504 	t4_tp_mib_read(adap, &st->frames_drop, 1,
5505 		       TP_MIB_FCOE_DROP_0_A + idx, sleep_ok);
5506 
5507 	t4_tp_mib_read(adap, val, 2, TP_MIB_FCOE_BYTE_0_HI_A + 2 * idx,
5508 		       sleep_ok);
5509 
5510 	st->octets_ddp = ((u64)val[0] << 32) | val[1];
5511 }
5512 
5513 /**
5514  *	t4_get_usm_stats - read TP's non-TCP DDP MIB counters
5515  *	@adap: the adapter
5516  *	@st: holds the counter values
5517  *      @sleep_ok: if true we may sleep while awaiting command completion
5518  *
5519  *	Returns the values of TP's counters for non-TCP directly-placed packets.
5520  */
5521 void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st,
5522 		      bool sleep_ok)
5523 {
5524 	u32 val[4];
5525 
5526 	t4_tp_mib_read(adap, val, 4, TP_MIB_USM_PKTS_A, sleep_ok);
5527 	st->frames = val[0];
5528 	st->drops = val[1];
5529 	st->octets = ((u64)val[2] << 32) | val[3];
5530 }
5531 
5532 /**
5533  *	t4_read_mtu_tbl - returns the values in the HW path MTU table
5534  *	@adap: the adapter
5535  *	@mtus: where to store the MTU values
5536  *	@mtu_log: where to store the MTU base-2 log (may be %NULL)
5537  *
5538  *	Reads the HW path MTU table.
5539  */
5540 void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log)
5541 {
5542 	u32 v;
5543 	int i;
5544 
5545 	for (i = 0; i < NMTUS; ++i) {
5546 		t4_write_reg(adap, TP_MTU_TABLE_A,
5547 			     MTUINDEX_V(0xff) | MTUVALUE_V(i));
5548 		v = t4_read_reg(adap, TP_MTU_TABLE_A);
5549 		mtus[i] = MTUVALUE_G(v);
5550 		if (mtu_log)
5551 			mtu_log[i] = MTUWIDTH_G(v);
5552 	}
5553 }
5554 
5555 /**
5556  *	t4_read_cong_tbl - reads the congestion control table
5557  *	@adap: the adapter
5558  *	@incr: where to store the alpha values
5559  *
5560  *	Reads the additive increments programmed into the HW congestion
5561  *	control table.
5562  */
5563 void t4_read_cong_tbl(struct adapter *adap, u16 incr[NMTUS][NCCTRL_WIN])
5564 {
5565 	unsigned int mtu, w;
5566 
5567 	for (mtu = 0; mtu < NMTUS; ++mtu)
5568 		for (w = 0; w < NCCTRL_WIN; ++w) {
5569 			t4_write_reg(adap, TP_CCTRL_TABLE_A,
5570 				     ROWINDEX_V(0xffff) | (mtu << 5) | w);
5571 			incr[mtu][w] = (u16)t4_read_reg(adap,
5572 						TP_CCTRL_TABLE_A) & 0x1fff;
5573 		}
5574 }
5575 
5576 /**
5577  *	t4_tp_wr_bits_indirect - set/clear bits in an indirect TP register
5578  *	@adap: the adapter
5579  *	@addr: the indirect TP register address
5580  *	@mask: specifies the field within the register to modify
5581  *	@val: new value for the field
5582  *
5583  *	Sets a field of an indirect TP register to the given value.
5584  */
5585 void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
5586 			    unsigned int mask, unsigned int val)
5587 {
5588 	t4_write_reg(adap, TP_PIO_ADDR_A, addr);
5589 	val |= t4_read_reg(adap, TP_PIO_DATA_A) & ~mask;
5590 	t4_write_reg(adap, TP_PIO_DATA_A, val);
5591 }
5592 
5593 /**
5594  *	init_cong_ctrl - initialize congestion control parameters
5595  *	@a: the alpha values for congestion control
5596  *	@b: the beta values for congestion control
5597  *
5598  *	Initialize the congestion control parameters.
5599  */
5600 static void init_cong_ctrl(unsigned short *a, unsigned short *b)
5601 {
5602 	a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
5603 	a[9] = 2;
5604 	a[10] = 3;
5605 	a[11] = 4;
5606 	a[12] = 5;
5607 	a[13] = 6;
5608 	a[14] = 7;
5609 	a[15] = 8;
5610 	a[16] = 9;
5611 	a[17] = 10;
5612 	a[18] = 14;
5613 	a[19] = 17;
5614 	a[20] = 21;
5615 	a[21] = 25;
5616 	a[22] = 30;
5617 	a[23] = 35;
5618 	a[24] = 45;
5619 	a[25] = 60;
5620 	a[26] = 80;
5621 	a[27] = 100;
5622 	a[28] = 200;
5623 	a[29] = 300;
5624 	a[30] = 400;
5625 	a[31] = 500;
5626 
5627 	b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
5628 	b[9] = b[10] = 1;
5629 	b[11] = b[12] = 2;
5630 	b[13] = b[14] = b[15] = b[16] = 3;
5631 	b[17] = b[18] = b[19] = b[20] = b[21] = 4;
5632 	b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
5633 	b[28] = b[29] = 6;
5634 	b[30] = b[31] = 7;
5635 }
5636 
5637 /* The minimum additive increment value for the congestion control table */
5638 #define CC_MIN_INCR 2U
5639 
5640 /**
5641  *	t4_load_mtus - write the MTU and congestion control HW tables
5642  *	@adap: the adapter
5643  *	@mtus: the values for the MTU table
5644  *	@alpha: the values for the congestion control alpha parameter
5645  *	@beta: the values for the congestion control beta parameter
5646  *
5647  *	Write the HW MTU table with the supplied MTUs and the high-speed
5648  *	congestion control table with the supplied alpha, beta, and MTUs.
5649  *	We write the two tables together because the additive increments
5650  *	depend on the MTUs.
5651  */
5652 void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
5653 		  const unsigned short *alpha, const unsigned short *beta)
5654 {
5655 	static const unsigned int avg_pkts[NCCTRL_WIN] = {
5656 		2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
5657 		896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
5658 		28672, 40960, 57344, 81920, 114688, 163840, 229376
5659 	};
5660 
5661 	unsigned int i, w;
5662 
5663 	for (i = 0; i < NMTUS; ++i) {
5664 		unsigned int mtu = mtus[i];
5665 		unsigned int log2 = fls(mtu);
5666 
5667 		if (!(mtu & ((1 << log2) >> 2)))     /* round */
5668 			log2--;
5669 		t4_write_reg(adap, TP_MTU_TABLE_A, MTUINDEX_V(i) |
5670 			     MTUWIDTH_V(log2) | MTUVALUE_V(mtu));
5671 
5672 		for (w = 0; w < NCCTRL_WIN; ++w) {
5673 			unsigned int inc;
5674 
5675 			inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
5676 				  CC_MIN_INCR);
5677 
5678 			t4_write_reg(adap, TP_CCTRL_TABLE_A, (i << 21) |
5679 				     (w << 16) | (beta[w] << 13) | inc);
5680 		}
5681 	}
5682 }
5683 
5684 /* Calculates a rate in bytes/s given the number of 256-byte units per 4K core
5685  * clocks.  The formula is
5686  *
5687  * bytes/s = bytes256 * 256 * ClkFreq / 4096
5688  *
5689  * which is equivalent to
5690  *
5691  * bytes/s = 62.5 * bytes256 * ClkFreq_ms
5692  */
5693 static u64 chan_rate(struct adapter *adap, unsigned int bytes256)
5694 {
5695 	u64 v = bytes256 * adap->params.vpd.cclk;
5696 
5697 	return v * 62 + v / 2;
5698 }
5699 
5700 /**
5701  *	t4_get_chan_txrate - get the current per channel Tx rates
5702  *	@adap: the adapter
5703  *	@nic_rate: rates for NIC traffic
5704  *	@ofld_rate: rates for offloaded traffic
5705  *
5706  *	Return the current Tx rates in bytes/s for NIC and offloaded traffic
5707  *	for each channel.
5708  */
5709 void t4_get_chan_txrate(struct adapter *adap, u64 *nic_rate, u64 *ofld_rate)
5710 {
5711 	u32 v;
5712 
5713 	v = t4_read_reg(adap, TP_TX_TRATE_A);
5714 	nic_rate[0] = chan_rate(adap, TNLRATE0_G(v));
5715 	nic_rate[1] = chan_rate(adap, TNLRATE1_G(v));
5716 	if (adap->params.arch.nchan == NCHAN) {
5717 		nic_rate[2] = chan_rate(adap, TNLRATE2_G(v));
5718 		nic_rate[3] = chan_rate(adap, TNLRATE3_G(v));
5719 	}
5720 
5721 	v = t4_read_reg(adap, TP_TX_ORATE_A);
5722 	ofld_rate[0] = chan_rate(adap, OFDRATE0_G(v));
5723 	ofld_rate[1] = chan_rate(adap, OFDRATE1_G(v));
5724 	if (adap->params.arch.nchan == NCHAN) {
5725 		ofld_rate[2] = chan_rate(adap, OFDRATE2_G(v));
5726 		ofld_rate[3] = chan_rate(adap, OFDRATE3_G(v));
5727 	}
5728 }
5729 
5730 /**
5731  *	t4_set_trace_filter - configure one of the tracing filters
5732  *	@adap: the adapter
5733  *	@tp: the desired trace filter parameters
5734  *	@idx: which filter to configure
5735  *	@enable: whether to enable or disable the filter
5736  *
5737  *	Configures one of the tracing filters available in HW.  If @enable is
5738  *	%0 @tp is not examined and may be %NULL. The user is responsible to
5739  *	set the single/multiple trace mode by writing to MPS_TRC_CFG_A register
5740  */
5741 int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp,
5742 			int idx, int enable)
5743 {
5744 	int i, ofst = idx * 4;
5745 	u32 data_reg, mask_reg, cfg;
5746 	u32 multitrc = TRCMULTIFILTER_F;
5747 
5748 	if (!enable) {
5749 		t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0);
5750 		return 0;
5751 	}
5752 
5753 	cfg = t4_read_reg(adap, MPS_TRC_CFG_A);
5754 	if (cfg & TRCMULTIFILTER_F) {
5755 		/* If multiple tracers are enabled, then maximum
5756 		 * capture size is 2.5KB (FIFO size of a single channel)
5757 		 * minus 2 flits for CPL_TRACE_PKT header.
5758 		 */
5759 		if (tp->snap_len > ((10 * 1024 / 4) - (2 * 8)))
5760 			return -EINVAL;
5761 	} else {
5762 		/* If multiple tracers are disabled, to avoid deadlocks
5763 		 * maximum packet capture size of 9600 bytes is recommended.
5764 		 * Also in this mode, only trace0 can be enabled and running.
5765 		 */
5766 		multitrc = 0;
5767 		if (tp->snap_len > 9600 || idx)
5768 			return -EINVAL;
5769 	}
5770 
5771 	if (tp->port > (is_t4(adap->params.chip) ? 11 : 19) || tp->invert > 1 ||
5772 	    tp->skip_len > TFLENGTH_M || tp->skip_ofst > TFOFFSET_M ||
5773 	    tp->min_len > TFMINPKTSIZE_M)
5774 		return -EINVAL;
5775 
5776 	/* stop the tracer we'll be changing */
5777 	t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0);
5778 
5779 	idx *= (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A);
5780 	data_reg = MPS_TRC_FILTER0_MATCH_A + idx;
5781 	mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + idx;
5782 
5783 	for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
5784 		t4_write_reg(adap, data_reg, tp->data[i]);
5785 		t4_write_reg(adap, mask_reg, ~tp->mask[i]);
5786 	}
5787 	t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst,
5788 		     TFCAPTUREMAX_V(tp->snap_len) |
5789 		     TFMINPKTSIZE_V(tp->min_len));
5790 	t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst,
5791 		     TFOFFSET_V(tp->skip_ofst) | TFLENGTH_V(tp->skip_len) |
5792 		     (is_t4(adap->params.chip) ?
5793 		     TFPORT_V(tp->port) | TFEN_F | TFINVERTMATCH_V(tp->invert) :
5794 		     T5_TFPORT_V(tp->port) | T5_TFEN_F |
5795 		     T5_TFINVERTMATCH_V(tp->invert)));
5796 
5797 	return 0;
5798 }
5799 
5800 /**
5801  *	t4_get_trace_filter - query one of the tracing filters
5802  *	@adap: the adapter
5803  *	@tp: the current trace filter parameters
5804  *	@idx: which trace filter to query
5805  *	@enabled: non-zero if the filter is enabled
5806  *
5807  *	Returns the current settings of one of the HW tracing filters.
5808  */
5809 void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx,
5810 			 int *enabled)
5811 {
5812 	u32 ctla, ctlb;
5813 	int i, ofst = idx * 4;
5814 	u32 data_reg, mask_reg;
5815 
5816 	ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst);
5817 	ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst);
5818 
5819 	if (is_t4(adap->params.chip)) {
5820 		*enabled = !!(ctla & TFEN_F);
5821 		tp->port =  TFPORT_G(ctla);
5822 		tp->invert = !!(ctla & TFINVERTMATCH_F);
5823 	} else {
5824 		*enabled = !!(ctla & T5_TFEN_F);
5825 		tp->port = T5_TFPORT_G(ctla);
5826 		tp->invert = !!(ctla & T5_TFINVERTMATCH_F);
5827 	}
5828 	tp->snap_len = TFCAPTUREMAX_G(ctlb);
5829 	tp->min_len = TFMINPKTSIZE_G(ctlb);
5830 	tp->skip_ofst = TFOFFSET_G(ctla);
5831 	tp->skip_len = TFLENGTH_G(ctla);
5832 
5833 	ofst = (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A) * idx;
5834 	data_reg = MPS_TRC_FILTER0_MATCH_A + ofst;
5835 	mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + ofst;
5836 
5837 	for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
5838 		tp->mask[i] = ~t4_read_reg(adap, mask_reg);
5839 		tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i];
5840 	}
5841 }
5842 
5843 /**
5844  *	t4_pmtx_get_stats - returns the HW stats from PMTX
5845  *	@adap: the adapter
5846  *	@cnt: where to store the count statistics
5847  *	@cycles: where to store the cycle statistics
5848  *
5849  *	Returns performance statistics from PMTX.
5850  */
5851 void t4_pmtx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
5852 {
5853 	int i;
5854 	u32 data[2];
5855 
5856 	for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) {
5857 		t4_write_reg(adap, PM_TX_STAT_CONFIG_A, i + 1);
5858 		cnt[i] = t4_read_reg(adap, PM_TX_STAT_COUNT_A);
5859 		if (is_t4(adap->params.chip)) {
5860 			cycles[i] = t4_read_reg64(adap, PM_TX_STAT_LSB_A);
5861 		} else {
5862 			t4_read_indirect(adap, PM_TX_DBG_CTRL_A,
5863 					 PM_TX_DBG_DATA_A, data, 2,
5864 					 PM_TX_DBG_STAT_MSB_A);
5865 			cycles[i] = (((u64)data[0] << 32) | data[1]);
5866 		}
5867 	}
5868 }
5869 
5870 /**
5871  *	t4_pmrx_get_stats - returns the HW stats from PMRX
5872  *	@adap: the adapter
5873  *	@cnt: where to store the count statistics
5874  *	@cycles: where to store the cycle statistics
5875  *
5876  *	Returns performance statistics from PMRX.
5877  */
5878 void t4_pmrx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
5879 {
5880 	int i;
5881 	u32 data[2];
5882 
5883 	for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) {
5884 		t4_write_reg(adap, PM_RX_STAT_CONFIG_A, i + 1);
5885 		cnt[i] = t4_read_reg(adap, PM_RX_STAT_COUNT_A);
5886 		if (is_t4(adap->params.chip)) {
5887 			cycles[i] = t4_read_reg64(adap, PM_RX_STAT_LSB_A);
5888 		} else {
5889 			t4_read_indirect(adap, PM_RX_DBG_CTRL_A,
5890 					 PM_RX_DBG_DATA_A, data, 2,
5891 					 PM_RX_DBG_STAT_MSB_A);
5892 			cycles[i] = (((u64)data[0] << 32) | data[1]);
5893 		}
5894 	}
5895 }
5896 
5897 /**
5898  *	compute_mps_bg_map - compute the MPS Buffer Group Map for a Port
5899  *	@adap: the adapter
5900  *	@pidx: the port index
5901  *
5902  *	Computes and returns a bitmap indicating which MPS buffer groups are
5903  *	associated with the given Port.  Bit i is set if buffer group i is
5904  *	used by the Port.
5905  */
5906 static inline unsigned int compute_mps_bg_map(struct adapter *adapter,
5907 					      int pidx)
5908 {
5909 	unsigned int chip_version, nports;
5910 
5911 	chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
5912 	nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A));
5913 
5914 	switch (chip_version) {
5915 	case CHELSIO_T4:
5916 	case CHELSIO_T5:
5917 		switch (nports) {
5918 		case 1: return 0xf;
5919 		case 2: return 3 << (2 * pidx);
5920 		case 4: return 1 << pidx;
5921 		}
5922 		break;
5923 
5924 	case CHELSIO_T6:
5925 		switch (nports) {
5926 		case 2: return 1 << (2 * pidx);
5927 		}
5928 		break;
5929 	}
5930 
5931 	dev_err(adapter->pdev_dev, "Need MPS Buffer Group Map for Chip %0x, Nports %d\n",
5932 		chip_version, nports);
5933 
5934 	return 0;
5935 }
5936 
5937 /**
5938  *	t4_get_mps_bg_map - return the buffer groups associated with a port
5939  *	@adapter: the adapter
5940  *	@pidx: the port index
5941  *
5942  *	Returns a bitmap indicating which MPS buffer groups are associated
5943  *	with the given Port.  Bit i is set if buffer group i is used by the
5944  *	Port.
5945  */
5946 unsigned int t4_get_mps_bg_map(struct adapter *adapter, int pidx)
5947 {
5948 	u8 *mps_bg_map;
5949 	unsigned int nports;
5950 
5951 	nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A));
5952 	if (pidx >= nports) {
5953 		CH_WARN(adapter, "MPS Port Index %d >= Nports %d\n",
5954 			pidx, nports);
5955 		return 0;
5956 	}
5957 
5958 	/* If we've already retrieved/computed this, just return the result.
5959 	 */
5960 	mps_bg_map = adapter->params.mps_bg_map;
5961 	if (mps_bg_map[pidx])
5962 		return mps_bg_map[pidx];
5963 
5964 	/* Newer Firmware can tell us what the MPS Buffer Group Map is.
5965 	 * If we're talking to such Firmware, let it tell us.  If the new
5966 	 * API isn't supported, revert back to old hardcoded way.  The value
5967 	 * obtained from Firmware is encoded in below format:
5968 	 *
5969 	 * val = (( MPSBGMAP[Port 3] << 24 ) |
5970 	 *        ( MPSBGMAP[Port 2] << 16 ) |
5971 	 *        ( MPSBGMAP[Port 1] <<  8 ) |
5972 	 *        ( MPSBGMAP[Port 0] <<  0 ))
5973 	 */
5974 	if (adapter->flags & FW_OK) {
5975 		u32 param, val;
5976 		int ret;
5977 
5978 		param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
5979 			 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_MPSBGMAP));
5980 		ret = t4_query_params_ns(adapter, adapter->mbox, adapter->pf,
5981 					 0, 1, &param, &val);
5982 		if (!ret) {
5983 			int p;
5984 
5985 			/* Store the BG Map for all of the Ports in order to
5986 			 * avoid more calls to the Firmware in the future.
5987 			 */
5988 			for (p = 0; p < MAX_NPORTS; p++, val >>= 8)
5989 				mps_bg_map[p] = val & 0xff;
5990 
5991 			return mps_bg_map[pidx];
5992 		}
5993 	}
5994 
5995 	/* Either we're not talking to the Firmware or we're dealing with
5996 	 * older Firmware which doesn't support the new API to get the MPS
5997 	 * Buffer Group Map.  Fall back to computing it ourselves.
5998 	 */
5999 	mps_bg_map[pidx] = compute_mps_bg_map(adapter, pidx);
6000 	return mps_bg_map[pidx];
6001 }
6002 
6003 /**
6004  *	t4_get_tp_ch_map - return TP ingress channels associated with a port
6005  *	@adapter: the adapter
6006  *	@pidx: the port index
6007  *
6008  *	Returns a bitmap indicating which TP Ingress Channels are associated
6009  *	with a given Port.  Bit i is set if TP Ingress Channel i is used by
6010  *	the Port.
6011  */
6012 unsigned int t4_get_tp_ch_map(struct adapter *adap, int pidx)
6013 {
6014 	unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
6015 	unsigned int nports = 1 << NUMPORTS_G(t4_read_reg(adap, MPS_CMN_CTL_A));
6016 
6017 	if (pidx >= nports) {
6018 		dev_warn(adap->pdev_dev, "TP Port Index %d >= Nports %d\n",
6019 			 pidx, nports);
6020 		return 0;
6021 	}
6022 
6023 	switch (chip_version) {
6024 	case CHELSIO_T4:
6025 	case CHELSIO_T5:
6026 		/* Note that this happens to be the same values as the MPS
6027 		 * Buffer Group Map for these Chips.  But we replicate the code
6028 		 * here because they're really separate concepts.
6029 		 */
6030 		switch (nports) {
6031 		case 1: return 0xf;
6032 		case 2: return 3 << (2 * pidx);
6033 		case 4: return 1 << pidx;
6034 		}
6035 		break;
6036 
6037 	case CHELSIO_T6:
6038 		switch (nports) {
6039 		case 2: return 1 << pidx;
6040 		}
6041 		break;
6042 	}
6043 
6044 	dev_err(adap->pdev_dev, "Need TP Channel Map for Chip %0x, Nports %d\n",
6045 		chip_version, nports);
6046 	return 0;
6047 }
6048 
6049 /**
6050  *      t4_get_port_type_description - return Port Type string description
6051  *      @port_type: firmware Port Type enumeration
6052  */
6053 const char *t4_get_port_type_description(enum fw_port_type port_type)
6054 {
6055 	static const char *const port_type_description[] = {
6056 		"Fiber_XFI",
6057 		"Fiber_XAUI",
6058 		"BT_SGMII",
6059 		"BT_XFI",
6060 		"BT_XAUI",
6061 		"KX4",
6062 		"CX4",
6063 		"KX",
6064 		"KR",
6065 		"SFP",
6066 		"BP_AP",
6067 		"BP4_AP",
6068 		"QSFP_10G",
6069 		"QSA",
6070 		"QSFP",
6071 		"BP40_BA",
6072 		"KR4_100G",
6073 		"CR4_QSFP",
6074 		"CR_QSFP",
6075 		"CR2_QSFP",
6076 		"SFP28",
6077 		"KR_SFP28",
6078 		"KR_XLAUI"
6079 	};
6080 
6081 	if (port_type < ARRAY_SIZE(port_type_description))
6082 		return port_type_description[port_type];
6083 	return "UNKNOWN";
6084 }
6085 
6086 /**
6087  *      t4_get_port_stats_offset - collect port stats relative to a previous
6088  *                                 snapshot
6089  *      @adap: The adapter
6090  *      @idx: The port
6091  *      @stats: Current stats to fill
6092  *      @offset: Previous stats snapshot
6093  */
6094 void t4_get_port_stats_offset(struct adapter *adap, int idx,
6095 			      struct port_stats *stats,
6096 			      struct port_stats *offset)
6097 {
6098 	u64 *s, *o;
6099 	int i;
6100 
6101 	t4_get_port_stats(adap, idx, stats);
6102 	for (i = 0, s = (u64 *)stats, o = (u64 *)offset;
6103 			i < (sizeof(struct port_stats) / sizeof(u64));
6104 			i++, s++, o++)
6105 		*s -= *o;
6106 }
6107 
6108 /**
6109  *	t4_get_port_stats - collect port statistics
6110  *	@adap: the adapter
6111  *	@idx: the port index
6112  *	@p: the stats structure to fill
6113  *
6114  *	Collect statistics related to the given port from HW.
6115  */
6116 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
6117 {
6118 	u32 bgmap = t4_get_mps_bg_map(adap, idx);
6119 	u32 stat_ctl = t4_read_reg(adap, MPS_STAT_CTL_A);
6120 
6121 #define GET_STAT(name) \
6122 	t4_read_reg64(adap, \
6123 	(is_t4(adap->params.chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \
6124 	T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L)))
6125 #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
6126 
6127 	p->tx_octets           = GET_STAT(TX_PORT_BYTES);
6128 	p->tx_frames           = GET_STAT(TX_PORT_FRAMES);
6129 	p->tx_bcast_frames     = GET_STAT(TX_PORT_BCAST);
6130 	p->tx_mcast_frames     = GET_STAT(TX_PORT_MCAST);
6131 	p->tx_ucast_frames     = GET_STAT(TX_PORT_UCAST);
6132 	p->tx_error_frames     = GET_STAT(TX_PORT_ERROR);
6133 	p->tx_frames_64        = GET_STAT(TX_PORT_64B);
6134 	p->tx_frames_65_127    = GET_STAT(TX_PORT_65B_127B);
6135 	p->tx_frames_128_255   = GET_STAT(TX_PORT_128B_255B);
6136 	p->tx_frames_256_511   = GET_STAT(TX_PORT_256B_511B);
6137 	p->tx_frames_512_1023  = GET_STAT(TX_PORT_512B_1023B);
6138 	p->tx_frames_1024_1518 = GET_STAT(TX_PORT_1024B_1518B);
6139 	p->tx_frames_1519_max  = GET_STAT(TX_PORT_1519B_MAX);
6140 	p->tx_drop             = GET_STAT(TX_PORT_DROP);
6141 	p->tx_pause            = GET_STAT(TX_PORT_PAUSE);
6142 	p->tx_ppp0             = GET_STAT(TX_PORT_PPP0);
6143 	p->tx_ppp1             = GET_STAT(TX_PORT_PPP1);
6144 	p->tx_ppp2             = GET_STAT(TX_PORT_PPP2);
6145 	p->tx_ppp3             = GET_STAT(TX_PORT_PPP3);
6146 	p->tx_ppp4             = GET_STAT(TX_PORT_PPP4);
6147 	p->tx_ppp5             = GET_STAT(TX_PORT_PPP5);
6148 	p->tx_ppp6             = GET_STAT(TX_PORT_PPP6);
6149 	p->tx_ppp7             = GET_STAT(TX_PORT_PPP7);
6150 
6151 	if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
6152 		if (stat_ctl & COUNTPAUSESTATTX_F)
6153 			p->tx_frames_64 -= p->tx_pause;
6154 		if (stat_ctl & COUNTPAUSEMCTX_F)
6155 			p->tx_mcast_frames -= p->tx_pause;
6156 	}
6157 	p->rx_octets           = GET_STAT(RX_PORT_BYTES);
6158 	p->rx_frames           = GET_STAT(RX_PORT_FRAMES);
6159 	p->rx_bcast_frames     = GET_STAT(RX_PORT_BCAST);
6160 	p->rx_mcast_frames     = GET_STAT(RX_PORT_MCAST);
6161 	p->rx_ucast_frames     = GET_STAT(RX_PORT_UCAST);
6162 	p->rx_too_long         = GET_STAT(RX_PORT_MTU_ERROR);
6163 	p->rx_jabber           = GET_STAT(RX_PORT_MTU_CRC_ERROR);
6164 	p->rx_fcs_err          = GET_STAT(RX_PORT_CRC_ERROR);
6165 	p->rx_len_err          = GET_STAT(RX_PORT_LEN_ERROR);
6166 	p->rx_symbol_err       = GET_STAT(RX_PORT_SYM_ERROR);
6167 	p->rx_runt             = GET_STAT(RX_PORT_LESS_64B);
6168 	p->rx_frames_64        = GET_STAT(RX_PORT_64B);
6169 	p->rx_frames_65_127    = GET_STAT(RX_PORT_65B_127B);
6170 	p->rx_frames_128_255   = GET_STAT(RX_PORT_128B_255B);
6171 	p->rx_frames_256_511   = GET_STAT(RX_PORT_256B_511B);
6172 	p->rx_frames_512_1023  = GET_STAT(RX_PORT_512B_1023B);
6173 	p->rx_frames_1024_1518 = GET_STAT(RX_PORT_1024B_1518B);
6174 	p->rx_frames_1519_max  = GET_STAT(RX_PORT_1519B_MAX);
6175 	p->rx_pause            = GET_STAT(RX_PORT_PAUSE);
6176 	p->rx_ppp0             = GET_STAT(RX_PORT_PPP0);
6177 	p->rx_ppp1             = GET_STAT(RX_PORT_PPP1);
6178 	p->rx_ppp2             = GET_STAT(RX_PORT_PPP2);
6179 	p->rx_ppp3             = GET_STAT(RX_PORT_PPP3);
6180 	p->rx_ppp4             = GET_STAT(RX_PORT_PPP4);
6181 	p->rx_ppp5             = GET_STAT(RX_PORT_PPP5);
6182 	p->rx_ppp6             = GET_STAT(RX_PORT_PPP6);
6183 	p->rx_ppp7             = GET_STAT(RX_PORT_PPP7);
6184 
6185 	if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
6186 		if (stat_ctl & COUNTPAUSESTATRX_F)
6187 			p->rx_frames_64 -= p->rx_pause;
6188 		if (stat_ctl & COUNTPAUSEMCRX_F)
6189 			p->rx_mcast_frames -= p->rx_pause;
6190 	}
6191 
6192 	p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0;
6193 	p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0;
6194 	p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0;
6195 	p->rx_ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_DROP_FRAME) : 0;
6196 	p->rx_trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_TRUNC_FRAME) : 0;
6197 	p->rx_trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_TRUNC_FRAME) : 0;
6198 	p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0;
6199 	p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0;
6200 
6201 #undef GET_STAT
6202 #undef GET_STAT_COM
6203 }
6204 
6205 /**
6206  *	t4_get_lb_stats - collect loopback port statistics
6207  *	@adap: the adapter
6208  *	@idx: the loopback port index
6209  *	@p: the stats structure to fill
6210  *
6211  *	Return HW statistics for the given loopback port.
6212  */
6213 void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p)
6214 {
6215 	u32 bgmap = t4_get_mps_bg_map(adap, idx);
6216 
6217 #define GET_STAT(name) \
6218 	t4_read_reg64(adap, \
6219 	(is_t4(adap->params.chip) ? \
6220 	PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L) : \
6221 	T5_PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L)))
6222 #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
6223 
6224 	p->octets           = GET_STAT(BYTES);
6225 	p->frames           = GET_STAT(FRAMES);
6226 	p->bcast_frames     = GET_STAT(BCAST);
6227 	p->mcast_frames     = GET_STAT(MCAST);
6228 	p->ucast_frames     = GET_STAT(UCAST);
6229 	p->error_frames     = GET_STAT(ERROR);
6230 
6231 	p->frames_64        = GET_STAT(64B);
6232 	p->frames_65_127    = GET_STAT(65B_127B);
6233 	p->frames_128_255   = GET_STAT(128B_255B);
6234 	p->frames_256_511   = GET_STAT(256B_511B);
6235 	p->frames_512_1023  = GET_STAT(512B_1023B);
6236 	p->frames_1024_1518 = GET_STAT(1024B_1518B);
6237 	p->frames_1519_max  = GET_STAT(1519B_MAX);
6238 	p->drop             = GET_STAT(DROP_FRAMES);
6239 
6240 	p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0;
6241 	p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0;
6242 	p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0;
6243 	p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0;
6244 	p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0;
6245 	p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0;
6246 	p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0;
6247 	p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0;
6248 
6249 #undef GET_STAT
6250 #undef GET_STAT_COM
6251 }
6252 
6253 /*     t4_mk_filtdelwr - create a delete filter WR
6254  *     @ftid: the filter ID
6255  *     @wr: the filter work request to populate
6256  *     @qid: ingress queue to receive the delete notification
6257  *
6258  *     Creates a filter work request to delete the supplied filter.  If @qid is
6259  *     negative the delete notification is suppressed.
6260  */
6261 void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid)
6262 {
6263 	memset(wr, 0, sizeof(*wr));
6264 	wr->op_pkd = cpu_to_be32(FW_WR_OP_V(FW_FILTER_WR));
6265 	wr->len16_pkd = cpu_to_be32(FW_WR_LEN16_V(sizeof(*wr) / 16));
6266 	wr->tid_to_iq = cpu_to_be32(FW_FILTER_WR_TID_V(ftid) |
6267 				    FW_FILTER_WR_NOREPLY_V(qid < 0));
6268 	wr->del_filter_to_l2tix = cpu_to_be32(FW_FILTER_WR_DEL_FILTER_F);
6269 	if (qid >= 0)
6270 		wr->rx_chan_rx_rpl_iq =
6271 			cpu_to_be16(FW_FILTER_WR_RX_RPL_IQ_V(qid));
6272 }
6273 
6274 #define INIT_CMD(var, cmd, rd_wr) do { \
6275 	(var).op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_##cmd##_CMD) | \
6276 					FW_CMD_REQUEST_F | \
6277 					FW_CMD_##rd_wr##_F); \
6278 	(var).retval_len16 = cpu_to_be32(FW_LEN16(var)); \
6279 } while (0)
6280 
6281 int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox,
6282 			  u32 addr, u32 val)
6283 {
6284 	u32 ldst_addrspace;
6285 	struct fw_ldst_cmd c;
6286 
6287 	memset(&c, 0, sizeof(c));
6288 	ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FIRMWARE);
6289 	c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6290 					FW_CMD_REQUEST_F |
6291 					FW_CMD_WRITE_F |
6292 					ldst_addrspace);
6293 	c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6294 	c.u.addrval.addr = cpu_to_be32(addr);
6295 	c.u.addrval.val = cpu_to_be32(val);
6296 
6297 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6298 }
6299 
6300 /**
6301  *	t4_mdio_rd - read a PHY register through MDIO
6302  *	@adap: the adapter
6303  *	@mbox: mailbox to use for the FW command
6304  *	@phy_addr: the PHY address
6305  *	@mmd: the PHY MMD to access (0 for clause 22 PHYs)
6306  *	@reg: the register to read
6307  *	@valp: where to store the value
6308  *
6309  *	Issues a FW command through the given mailbox to read a PHY register.
6310  */
6311 int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
6312 	       unsigned int mmd, unsigned int reg, u16 *valp)
6313 {
6314 	int ret;
6315 	u32 ldst_addrspace;
6316 	struct fw_ldst_cmd c;
6317 
6318 	memset(&c, 0, sizeof(c));
6319 	ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO);
6320 	c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6321 					FW_CMD_REQUEST_F | FW_CMD_READ_F |
6322 					ldst_addrspace);
6323 	c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6324 	c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) |
6325 					 FW_LDST_CMD_MMD_V(mmd));
6326 	c.u.mdio.raddr = cpu_to_be16(reg);
6327 
6328 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6329 	if (ret == 0)
6330 		*valp = be16_to_cpu(c.u.mdio.rval);
6331 	return ret;
6332 }
6333 
6334 /**
6335  *	t4_mdio_wr - write a PHY register through MDIO
6336  *	@adap: the adapter
6337  *	@mbox: mailbox to use for the FW command
6338  *	@phy_addr: the PHY address
6339  *	@mmd: the PHY MMD to access (0 for clause 22 PHYs)
6340  *	@reg: the register to write
6341  *	@valp: value to write
6342  *
6343  *	Issues a FW command through the given mailbox to write a PHY register.
6344  */
6345 int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
6346 	       unsigned int mmd, unsigned int reg, u16 val)
6347 {
6348 	u32 ldst_addrspace;
6349 	struct fw_ldst_cmd c;
6350 
6351 	memset(&c, 0, sizeof(c));
6352 	ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO);
6353 	c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6354 					FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
6355 					ldst_addrspace);
6356 	c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6357 	c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) |
6358 					 FW_LDST_CMD_MMD_V(mmd));
6359 	c.u.mdio.raddr = cpu_to_be16(reg);
6360 	c.u.mdio.rval = cpu_to_be16(val);
6361 
6362 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6363 }
6364 
6365 /**
6366  *	t4_sge_decode_idma_state - decode the idma state
6367  *	@adap: the adapter
6368  *	@state: the state idma is stuck in
6369  */
6370 void t4_sge_decode_idma_state(struct adapter *adapter, int state)
6371 {
6372 	static const char * const t4_decode[] = {
6373 		"IDMA_IDLE",
6374 		"IDMA_PUSH_MORE_CPL_FIFO",
6375 		"IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6376 		"Not used",
6377 		"IDMA_PHYSADDR_SEND_PCIEHDR",
6378 		"IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6379 		"IDMA_PHYSADDR_SEND_PAYLOAD",
6380 		"IDMA_SEND_FIFO_TO_IMSG",
6381 		"IDMA_FL_REQ_DATA_FL_PREP",
6382 		"IDMA_FL_REQ_DATA_FL",
6383 		"IDMA_FL_DROP",
6384 		"IDMA_FL_H_REQ_HEADER_FL",
6385 		"IDMA_FL_H_SEND_PCIEHDR",
6386 		"IDMA_FL_H_PUSH_CPL_FIFO",
6387 		"IDMA_FL_H_SEND_CPL",
6388 		"IDMA_FL_H_SEND_IP_HDR_FIRST",
6389 		"IDMA_FL_H_SEND_IP_HDR",
6390 		"IDMA_FL_H_REQ_NEXT_HEADER_FL",
6391 		"IDMA_FL_H_SEND_NEXT_PCIEHDR",
6392 		"IDMA_FL_H_SEND_IP_HDR_PADDING",
6393 		"IDMA_FL_D_SEND_PCIEHDR",
6394 		"IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6395 		"IDMA_FL_D_REQ_NEXT_DATA_FL",
6396 		"IDMA_FL_SEND_PCIEHDR",
6397 		"IDMA_FL_PUSH_CPL_FIFO",
6398 		"IDMA_FL_SEND_CPL",
6399 		"IDMA_FL_SEND_PAYLOAD_FIRST",
6400 		"IDMA_FL_SEND_PAYLOAD",
6401 		"IDMA_FL_REQ_NEXT_DATA_FL",
6402 		"IDMA_FL_SEND_NEXT_PCIEHDR",
6403 		"IDMA_FL_SEND_PADDING",
6404 		"IDMA_FL_SEND_COMPLETION_TO_IMSG",
6405 		"IDMA_FL_SEND_FIFO_TO_IMSG",
6406 		"IDMA_FL_REQ_DATAFL_DONE",
6407 		"IDMA_FL_REQ_HEADERFL_DONE",
6408 	};
6409 	static const char * const t5_decode[] = {
6410 		"IDMA_IDLE",
6411 		"IDMA_ALMOST_IDLE",
6412 		"IDMA_PUSH_MORE_CPL_FIFO",
6413 		"IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6414 		"IDMA_SGEFLRFLUSH_SEND_PCIEHDR",
6415 		"IDMA_PHYSADDR_SEND_PCIEHDR",
6416 		"IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6417 		"IDMA_PHYSADDR_SEND_PAYLOAD",
6418 		"IDMA_SEND_FIFO_TO_IMSG",
6419 		"IDMA_FL_REQ_DATA_FL",
6420 		"IDMA_FL_DROP",
6421 		"IDMA_FL_DROP_SEND_INC",
6422 		"IDMA_FL_H_REQ_HEADER_FL",
6423 		"IDMA_FL_H_SEND_PCIEHDR",
6424 		"IDMA_FL_H_PUSH_CPL_FIFO",
6425 		"IDMA_FL_H_SEND_CPL",
6426 		"IDMA_FL_H_SEND_IP_HDR_FIRST",
6427 		"IDMA_FL_H_SEND_IP_HDR",
6428 		"IDMA_FL_H_REQ_NEXT_HEADER_FL",
6429 		"IDMA_FL_H_SEND_NEXT_PCIEHDR",
6430 		"IDMA_FL_H_SEND_IP_HDR_PADDING",
6431 		"IDMA_FL_D_SEND_PCIEHDR",
6432 		"IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6433 		"IDMA_FL_D_REQ_NEXT_DATA_FL",
6434 		"IDMA_FL_SEND_PCIEHDR",
6435 		"IDMA_FL_PUSH_CPL_FIFO",
6436 		"IDMA_FL_SEND_CPL",
6437 		"IDMA_FL_SEND_PAYLOAD_FIRST",
6438 		"IDMA_FL_SEND_PAYLOAD",
6439 		"IDMA_FL_REQ_NEXT_DATA_FL",
6440 		"IDMA_FL_SEND_NEXT_PCIEHDR",
6441 		"IDMA_FL_SEND_PADDING",
6442 		"IDMA_FL_SEND_COMPLETION_TO_IMSG",
6443 	};
6444 	static const char * const t6_decode[] = {
6445 		"IDMA_IDLE",
6446 		"IDMA_PUSH_MORE_CPL_FIFO",
6447 		"IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6448 		"IDMA_SGEFLRFLUSH_SEND_PCIEHDR",
6449 		"IDMA_PHYSADDR_SEND_PCIEHDR",
6450 		"IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6451 		"IDMA_PHYSADDR_SEND_PAYLOAD",
6452 		"IDMA_FL_REQ_DATA_FL",
6453 		"IDMA_FL_DROP",
6454 		"IDMA_FL_DROP_SEND_INC",
6455 		"IDMA_FL_H_REQ_HEADER_FL",
6456 		"IDMA_FL_H_SEND_PCIEHDR",
6457 		"IDMA_FL_H_PUSH_CPL_FIFO",
6458 		"IDMA_FL_H_SEND_CPL",
6459 		"IDMA_FL_H_SEND_IP_HDR_FIRST",
6460 		"IDMA_FL_H_SEND_IP_HDR",
6461 		"IDMA_FL_H_REQ_NEXT_HEADER_FL",
6462 		"IDMA_FL_H_SEND_NEXT_PCIEHDR",
6463 		"IDMA_FL_H_SEND_IP_HDR_PADDING",
6464 		"IDMA_FL_D_SEND_PCIEHDR",
6465 		"IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6466 		"IDMA_FL_D_REQ_NEXT_DATA_FL",
6467 		"IDMA_FL_SEND_PCIEHDR",
6468 		"IDMA_FL_PUSH_CPL_FIFO",
6469 		"IDMA_FL_SEND_CPL",
6470 		"IDMA_FL_SEND_PAYLOAD_FIRST",
6471 		"IDMA_FL_SEND_PAYLOAD",
6472 		"IDMA_FL_REQ_NEXT_DATA_FL",
6473 		"IDMA_FL_SEND_NEXT_PCIEHDR",
6474 		"IDMA_FL_SEND_PADDING",
6475 		"IDMA_FL_SEND_COMPLETION_TO_IMSG",
6476 	};
6477 	static const u32 sge_regs[] = {
6478 		SGE_DEBUG_DATA_LOW_INDEX_2_A,
6479 		SGE_DEBUG_DATA_LOW_INDEX_3_A,
6480 		SGE_DEBUG_DATA_HIGH_INDEX_10_A,
6481 	};
6482 	const char **sge_idma_decode;
6483 	int sge_idma_decode_nstates;
6484 	int i;
6485 	unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
6486 
6487 	/* Select the right set of decode strings to dump depending on the
6488 	 * adapter chip type.
6489 	 */
6490 	switch (chip_version) {
6491 	case CHELSIO_T4:
6492 		sge_idma_decode = (const char **)t4_decode;
6493 		sge_idma_decode_nstates = ARRAY_SIZE(t4_decode);
6494 		break;
6495 
6496 	case CHELSIO_T5:
6497 		sge_idma_decode = (const char **)t5_decode;
6498 		sge_idma_decode_nstates = ARRAY_SIZE(t5_decode);
6499 		break;
6500 
6501 	case CHELSIO_T6:
6502 		sge_idma_decode = (const char **)t6_decode;
6503 		sge_idma_decode_nstates = ARRAY_SIZE(t6_decode);
6504 		break;
6505 
6506 	default:
6507 		dev_err(adapter->pdev_dev,
6508 			"Unsupported chip version %d\n", chip_version);
6509 		return;
6510 	}
6511 
6512 	if (is_t4(adapter->params.chip)) {
6513 		sge_idma_decode = (const char **)t4_decode;
6514 		sge_idma_decode_nstates = ARRAY_SIZE(t4_decode);
6515 	} else {
6516 		sge_idma_decode = (const char **)t5_decode;
6517 		sge_idma_decode_nstates = ARRAY_SIZE(t5_decode);
6518 	}
6519 
6520 	if (state < sge_idma_decode_nstates)
6521 		CH_WARN(adapter, "idma state %s\n", sge_idma_decode[state]);
6522 	else
6523 		CH_WARN(adapter, "idma state %d unknown\n", state);
6524 
6525 	for (i = 0; i < ARRAY_SIZE(sge_regs); i++)
6526 		CH_WARN(adapter, "SGE register %#x value %#x\n",
6527 			sge_regs[i], t4_read_reg(adapter, sge_regs[i]));
6528 }
6529 
6530 /**
6531  *      t4_sge_ctxt_flush - flush the SGE context cache
6532  *      @adap: the adapter
6533  *      @mbox: mailbox to use for the FW command
6534  *      @ctx_type: Egress or Ingress
6535  *
6536  *      Issues a FW command through the given mailbox to flush the
6537  *      SGE context cache.
6538  */
6539 int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox, int ctxt_type)
6540 {
6541 	int ret;
6542 	u32 ldst_addrspace;
6543 	struct fw_ldst_cmd c;
6544 
6545 	memset(&c, 0, sizeof(c));
6546 	ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(ctxt_type == CTXT_EGRESS ?
6547 						 FW_LDST_ADDRSPC_SGE_EGRC :
6548 						 FW_LDST_ADDRSPC_SGE_INGC);
6549 	c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6550 					FW_CMD_REQUEST_F | FW_CMD_READ_F |
6551 					ldst_addrspace);
6552 	c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6553 	c.u.idctxt.msg_ctxtflush = cpu_to_be32(FW_LDST_CMD_CTXTFLUSH_F);
6554 
6555 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6556 	return ret;
6557 }
6558 
6559 /**
6560  *      t4_fw_hello - establish communication with FW
6561  *      @adap: the adapter
6562  *      @mbox: mailbox to use for the FW command
6563  *      @evt_mbox: mailbox to receive async FW events
6564  *      @master: specifies the caller's willingness to be the device master
6565  *	@state: returns the current device state (if non-NULL)
6566  *
6567  *	Issues a command to establish communication with FW.  Returns either
6568  *	an error (negative integer) or the mailbox of the Master PF.
6569  */
6570 int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox,
6571 		enum dev_master master, enum dev_state *state)
6572 {
6573 	int ret;
6574 	struct fw_hello_cmd c;
6575 	u32 v;
6576 	unsigned int master_mbox;
6577 	int retries = FW_CMD_HELLO_RETRIES;
6578 
6579 retry:
6580 	memset(&c, 0, sizeof(c));
6581 	INIT_CMD(c, HELLO, WRITE);
6582 	c.err_to_clearinit = cpu_to_be32(
6583 		FW_HELLO_CMD_MASTERDIS_V(master == MASTER_CANT) |
6584 		FW_HELLO_CMD_MASTERFORCE_V(master == MASTER_MUST) |
6585 		FW_HELLO_CMD_MBMASTER_V(master == MASTER_MUST ?
6586 					mbox : FW_HELLO_CMD_MBMASTER_M) |
6587 		FW_HELLO_CMD_MBASYNCNOT_V(evt_mbox) |
6588 		FW_HELLO_CMD_STAGE_V(fw_hello_cmd_stage_os) |
6589 		FW_HELLO_CMD_CLEARINIT_F);
6590 
6591 	/*
6592 	 * Issue the HELLO command to the firmware.  If it's not successful
6593 	 * but indicates that we got a "busy" or "timeout" condition, retry
6594 	 * the HELLO until we exhaust our retry limit.  If we do exceed our
6595 	 * retry limit, check to see if the firmware left us any error
6596 	 * information and report that if so.
6597 	 */
6598 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6599 	if (ret < 0) {
6600 		if ((ret == -EBUSY || ret == -ETIMEDOUT) && retries-- > 0)
6601 			goto retry;
6602 		if (t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_ERR_F)
6603 			t4_report_fw_error(adap);
6604 		return ret;
6605 	}
6606 
6607 	v = be32_to_cpu(c.err_to_clearinit);
6608 	master_mbox = FW_HELLO_CMD_MBMASTER_G(v);
6609 	if (state) {
6610 		if (v & FW_HELLO_CMD_ERR_F)
6611 			*state = DEV_STATE_ERR;
6612 		else if (v & FW_HELLO_CMD_INIT_F)
6613 			*state = DEV_STATE_INIT;
6614 		else
6615 			*state = DEV_STATE_UNINIT;
6616 	}
6617 
6618 	/*
6619 	 * If we're not the Master PF then we need to wait around for the
6620 	 * Master PF Driver to finish setting up the adapter.
6621 	 *
6622 	 * Note that we also do this wait if we're a non-Master-capable PF and
6623 	 * there is no current Master PF; a Master PF may show up momentarily
6624 	 * and we wouldn't want to fail pointlessly.  (This can happen when an
6625 	 * OS loads lots of different drivers rapidly at the same time).  In
6626 	 * this case, the Master PF returned by the firmware will be
6627 	 * PCIE_FW_MASTER_M so the test below will work ...
6628 	 */
6629 	if ((v & (FW_HELLO_CMD_ERR_F|FW_HELLO_CMD_INIT_F)) == 0 &&
6630 	    master_mbox != mbox) {
6631 		int waiting = FW_CMD_HELLO_TIMEOUT;
6632 
6633 		/*
6634 		 * Wait for the firmware to either indicate an error or
6635 		 * initialized state.  If we see either of these we bail out
6636 		 * and report the issue to the caller.  If we exhaust the
6637 		 * "hello timeout" and we haven't exhausted our retries, try
6638 		 * again.  Otherwise bail with a timeout error.
6639 		 */
6640 		for (;;) {
6641 			u32 pcie_fw;
6642 
6643 			msleep(50);
6644 			waiting -= 50;
6645 
6646 			/*
6647 			 * If neither Error nor Initialialized are indicated
6648 			 * by the firmware keep waiting till we exaust our
6649 			 * timeout ... and then retry if we haven't exhausted
6650 			 * our retries ...
6651 			 */
6652 			pcie_fw = t4_read_reg(adap, PCIE_FW_A);
6653 			if (!(pcie_fw & (PCIE_FW_ERR_F|PCIE_FW_INIT_F))) {
6654 				if (waiting <= 0) {
6655 					if (retries-- > 0)
6656 						goto retry;
6657 
6658 					return -ETIMEDOUT;
6659 				}
6660 				continue;
6661 			}
6662 
6663 			/*
6664 			 * We either have an Error or Initialized condition
6665 			 * report errors preferentially.
6666 			 */
6667 			if (state) {
6668 				if (pcie_fw & PCIE_FW_ERR_F)
6669 					*state = DEV_STATE_ERR;
6670 				else if (pcie_fw & PCIE_FW_INIT_F)
6671 					*state = DEV_STATE_INIT;
6672 			}
6673 
6674 			/*
6675 			 * If we arrived before a Master PF was selected and
6676 			 * there's not a valid Master PF, grab its identity
6677 			 * for our caller.
6678 			 */
6679 			if (master_mbox == PCIE_FW_MASTER_M &&
6680 			    (pcie_fw & PCIE_FW_MASTER_VLD_F))
6681 				master_mbox = PCIE_FW_MASTER_G(pcie_fw);
6682 			break;
6683 		}
6684 	}
6685 
6686 	return master_mbox;
6687 }
6688 
6689 /**
6690  *	t4_fw_bye - end communication with FW
6691  *	@adap: the adapter
6692  *	@mbox: mailbox to use for the FW command
6693  *
6694  *	Issues a command to terminate communication with FW.
6695  */
6696 int t4_fw_bye(struct adapter *adap, unsigned int mbox)
6697 {
6698 	struct fw_bye_cmd c;
6699 
6700 	memset(&c, 0, sizeof(c));
6701 	INIT_CMD(c, BYE, WRITE);
6702 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6703 }
6704 
6705 /**
6706  *	t4_init_cmd - ask FW to initialize the device
6707  *	@adap: the adapter
6708  *	@mbox: mailbox to use for the FW command
6709  *
6710  *	Issues a command to FW to partially initialize the device.  This
6711  *	performs initialization that generally doesn't depend on user input.
6712  */
6713 int t4_early_init(struct adapter *adap, unsigned int mbox)
6714 {
6715 	struct fw_initialize_cmd c;
6716 
6717 	memset(&c, 0, sizeof(c));
6718 	INIT_CMD(c, INITIALIZE, WRITE);
6719 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6720 }
6721 
6722 /**
6723  *	t4_fw_reset - issue a reset to FW
6724  *	@adap: the adapter
6725  *	@mbox: mailbox to use for the FW command
6726  *	@reset: specifies the type of reset to perform
6727  *
6728  *	Issues a reset command of the specified type to FW.
6729  */
6730 int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset)
6731 {
6732 	struct fw_reset_cmd c;
6733 
6734 	memset(&c, 0, sizeof(c));
6735 	INIT_CMD(c, RESET, WRITE);
6736 	c.val = cpu_to_be32(reset);
6737 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6738 }
6739 
6740 /**
6741  *	t4_fw_halt - issue a reset/halt to FW and put uP into RESET
6742  *	@adap: the adapter
6743  *	@mbox: mailbox to use for the FW RESET command (if desired)
6744  *	@force: force uP into RESET even if FW RESET command fails
6745  *
6746  *	Issues a RESET command to firmware (if desired) with a HALT indication
6747  *	and then puts the microprocessor into RESET state.  The RESET command
6748  *	will only be issued if a legitimate mailbox is provided (mbox <=
6749  *	PCIE_FW_MASTER_M).
6750  *
6751  *	This is generally used in order for the host to safely manipulate the
6752  *	adapter without fear of conflicting with whatever the firmware might
6753  *	be doing.  The only way out of this state is to RESTART the firmware
6754  *	...
6755  */
6756 static int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
6757 {
6758 	int ret = 0;
6759 
6760 	/*
6761 	 * If a legitimate mailbox is provided, issue a RESET command
6762 	 * with a HALT indication.
6763 	 */
6764 	if (mbox <= PCIE_FW_MASTER_M) {
6765 		struct fw_reset_cmd c;
6766 
6767 		memset(&c, 0, sizeof(c));
6768 		INIT_CMD(c, RESET, WRITE);
6769 		c.val = cpu_to_be32(PIORST_F | PIORSTMODE_F);
6770 		c.halt_pkd = cpu_to_be32(FW_RESET_CMD_HALT_F);
6771 		ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6772 	}
6773 
6774 	/*
6775 	 * Normally we won't complete the operation if the firmware RESET
6776 	 * command fails but if our caller insists we'll go ahead and put the
6777 	 * uP into RESET.  This can be useful if the firmware is hung or even
6778 	 * missing ...  We'll have to take the risk of putting the uP into
6779 	 * RESET without the cooperation of firmware in that case.
6780 	 *
6781 	 * We also force the firmware's HALT flag to be on in case we bypassed
6782 	 * the firmware RESET command above or we're dealing with old firmware
6783 	 * which doesn't have the HALT capability.  This will serve as a flag
6784 	 * for the incoming firmware to know that it's coming out of a HALT
6785 	 * rather than a RESET ... if it's new enough to understand that ...
6786 	 */
6787 	if (ret == 0 || force) {
6788 		t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, UPCRST_F);
6789 		t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F,
6790 				 PCIE_FW_HALT_F);
6791 	}
6792 
6793 	/*
6794 	 * And we always return the result of the firmware RESET command
6795 	 * even when we force the uP into RESET ...
6796 	 */
6797 	return ret;
6798 }
6799 
6800 /**
6801  *	t4_fw_restart - restart the firmware by taking the uP out of RESET
6802  *	@adap: the adapter
6803  *	@reset: if we want to do a RESET to restart things
6804  *
6805  *	Restart firmware previously halted by t4_fw_halt().  On successful
6806  *	return the previous PF Master remains as the new PF Master and there
6807  *	is no need to issue a new HELLO command, etc.
6808  *
6809  *	We do this in two ways:
6810  *
6811  *	 1. If we're dealing with newer firmware we'll simply want to take
6812  *	    the chip's microprocessor out of RESET.  This will cause the
6813  *	    firmware to start up from its start vector.  And then we'll loop
6814  *	    until the firmware indicates it's started again (PCIE_FW.HALT
6815  *	    reset to 0) or we timeout.
6816  *
6817  *	 2. If we're dealing with older firmware then we'll need to RESET
6818  *	    the chip since older firmware won't recognize the PCIE_FW.HALT
6819  *	    flag and automatically RESET itself on startup.
6820  */
6821 static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
6822 {
6823 	if (reset) {
6824 		/*
6825 		 * Since we're directing the RESET instead of the firmware
6826 		 * doing it automatically, we need to clear the PCIE_FW.HALT
6827 		 * bit.
6828 		 */
6829 		t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F, 0);
6830 
6831 		/*
6832 		 * If we've been given a valid mailbox, first try to get the
6833 		 * firmware to do the RESET.  If that works, great and we can
6834 		 * return success.  Otherwise, if we haven't been given a
6835 		 * valid mailbox or the RESET command failed, fall back to
6836 		 * hitting the chip with a hammer.
6837 		 */
6838 		if (mbox <= PCIE_FW_MASTER_M) {
6839 			t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0);
6840 			msleep(100);
6841 			if (t4_fw_reset(adap, mbox,
6842 					PIORST_F | PIORSTMODE_F) == 0)
6843 				return 0;
6844 		}
6845 
6846 		t4_write_reg(adap, PL_RST_A, PIORST_F | PIORSTMODE_F);
6847 		msleep(2000);
6848 	} else {
6849 		int ms;
6850 
6851 		t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0);
6852 		for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) {
6853 			if (!(t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_HALT_F))
6854 				return 0;
6855 			msleep(100);
6856 			ms += 100;
6857 		}
6858 		return -ETIMEDOUT;
6859 	}
6860 	return 0;
6861 }
6862 
6863 /**
6864  *	t4_fw_upgrade - perform all of the steps necessary to upgrade FW
6865  *	@adap: the adapter
6866  *	@mbox: mailbox to use for the FW RESET command (if desired)
6867  *	@fw_data: the firmware image to write
6868  *	@size: image size
6869  *	@force: force upgrade even if firmware doesn't cooperate
6870  *
6871  *	Perform all of the steps necessary for upgrading an adapter's
6872  *	firmware image.  Normally this requires the cooperation of the
6873  *	existing firmware in order to halt all existing activities
6874  *	but if an invalid mailbox token is passed in we skip that step
6875  *	(though we'll still put the adapter microprocessor into RESET in
6876  *	that case).
6877  *
6878  *	On successful return the new firmware will have been loaded and
6879  *	the adapter will have been fully RESET losing all previous setup
6880  *	state.  On unsuccessful return the adapter may be completely hosed ...
6881  *	positive errno indicates that the adapter is ~probably~ intact, a
6882  *	negative errno indicates that things are looking bad ...
6883  */
6884 int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
6885 		  const u8 *fw_data, unsigned int size, int force)
6886 {
6887 	const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
6888 	int reset, ret;
6889 
6890 	if (!t4_fw_matches_chip(adap, fw_hdr))
6891 		return -EINVAL;
6892 
6893 	/* Disable FW_OK flag so that mbox commands with FW_OK flag set
6894 	 * wont be sent when we are flashing FW.
6895 	 */
6896 	adap->flags &= ~FW_OK;
6897 
6898 	ret = t4_fw_halt(adap, mbox, force);
6899 	if (ret < 0 && !force)
6900 		goto out;
6901 
6902 	ret = t4_load_fw(adap, fw_data, size);
6903 	if (ret < 0)
6904 		goto out;
6905 
6906 	/*
6907 	 * If there was a Firmware Configuration File stored in FLASH,
6908 	 * there's a good chance that it won't be compatible with the new
6909 	 * Firmware.  In order to prevent difficult to diagnose adapter
6910 	 * initialization issues, we clear out the Firmware Configuration File
6911 	 * portion of the FLASH .  The user will need to re-FLASH a new
6912 	 * Firmware Configuration File which is compatible with the new
6913 	 * Firmware if that's desired.
6914 	 */
6915 	(void)t4_load_cfg(adap, NULL, 0);
6916 
6917 	/*
6918 	 * Older versions of the firmware don't understand the new
6919 	 * PCIE_FW.HALT flag and so won't know to perform a RESET when they
6920 	 * restart.  So for newly loaded older firmware we'll have to do the
6921 	 * RESET for it so it starts up on a clean slate.  We can tell if
6922 	 * the newly loaded firmware will handle this right by checking
6923 	 * its header flags to see if it advertises the capability.
6924 	 */
6925 	reset = ((be32_to_cpu(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0);
6926 	ret = t4_fw_restart(adap, mbox, reset);
6927 
6928 	/* Grab potentially new Firmware Device Log parameters so we can see
6929 	 * how healthy the new Firmware is.  It's okay to contact the new
6930 	 * Firmware for these parameters even though, as far as it's
6931 	 * concerned, we've never said "HELLO" to it ...
6932 	 */
6933 	(void)t4_init_devlog_params(adap);
6934 out:
6935 	adap->flags |= FW_OK;
6936 	return ret;
6937 }
6938 
6939 /**
6940  *	t4_fl_pkt_align - return the fl packet alignment
6941  *	@adap: the adapter
6942  *
6943  *	T4 has a single field to specify the packing and padding boundary.
6944  *	T5 onwards has separate fields for this and hence the alignment for
6945  *	next packet offset is maximum of these two.
6946  *
6947  */
6948 int t4_fl_pkt_align(struct adapter *adap)
6949 {
6950 	u32 sge_control, sge_control2;
6951 	unsigned int ingpadboundary, ingpackboundary, fl_align, ingpad_shift;
6952 
6953 	sge_control = t4_read_reg(adap, SGE_CONTROL_A);
6954 
6955 	/* T4 uses a single control field to specify both the PCIe Padding and
6956 	 * Packing Boundary.  T5 introduced the ability to specify these
6957 	 * separately.  The actual Ingress Packet Data alignment boundary
6958 	 * within Packed Buffer Mode is the maximum of these two
6959 	 * specifications.  (Note that it makes no real practical sense to
6960 	 * have the Pading Boudary be larger than the Packing Boundary but you
6961 	 * could set the chip up that way and, in fact, legacy T4 code would
6962 	 * end doing this because it would initialize the Padding Boundary and
6963 	 * leave the Packing Boundary initialized to 0 (16 bytes).)
6964 	 * Padding Boundary values in T6 starts from 8B,
6965 	 * where as it is 32B for T4 and T5.
6966 	 */
6967 	if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
6968 		ingpad_shift = INGPADBOUNDARY_SHIFT_X;
6969 	else
6970 		ingpad_shift = T6_INGPADBOUNDARY_SHIFT_X;
6971 
6972 	ingpadboundary = 1 << (INGPADBOUNDARY_G(sge_control) + ingpad_shift);
6973 
6974 	fl_align = ingpadboundary;
6975 	if (!is_t4(adap->params.chip)) {
6976 		/* T5 has a weird interpretation of one of the PCIe Packing
6977 		 * Boundary values.  No idea why ...
6978 		 */
6979 		sge_control2 = t4_read_reg(adap, SGE_CONTROL2_A);
6980 		ingpackboundary = INGPACKBOUNDARY_G(sge_control2);
6981 		if (ingpackboundary == INGPACKBOUNDARY_16B_X)
6982 			ingpackboundary = 16;
6983 		else
6984 			ingpackboundary = 1 << (ingpackboundary +
6985 						INGPACKBOUNDARY_SHIFT_X);
6986 
6987 		fl_align = max(ingpadboundary, ingpackboundary);
6988 	}
6989 	return fl_align;
6990 }
6991 
6992 /**
6993  *	t4_fixup_host_params - fix up host-dependent parameters
6994  *	@adap: the adapter
6995  *	@page_size: the host's Base Page Size
6996  *	@cache_line_size: the host's Cache Line Size
6997  *
6998  *	Various registers in T4 contain values which are dependent on the
6999  *	host's Base Page and Cache Line Sizes.  This function will fix all of
7000  *	those registers with the appropriate values as passed in ...
7001  */
7002 int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
7003 			 unsigned int cache_line_size)
7004 {
7005 	unsigned int page_shift = fls(page_size) - 1;
7006 	unsigned int sge_hps = page_shift - 10;
7007 	unsigned int stat_len = cache_line_size > 64 ? 128 : 64;
7008 	unsigned int fl_align = cache_line_size < 32 ? 32 : cache_line_size;
7009 	unsigned int fl_align_log = fls(fl_align) - 1;
7010 
7011 	t4_write_reg(adap, SGE_HOST_PAGE_SIZE_A,
7012 		     HOSTPAGESIZEPF0_V(sge_hps) |
7013 		     HOSTPAGESIZEPF1_V(sge_hps) |
7014 		     HOSTPAGESIZEPF2_V(sge_hps) |
7015 		     HOSTPAGESIZEPF3_V(sge_hps) |
7016 		     HOSTPAGESIZEPF4_V(sge_hps) |
7017 		     HOSTPAGESIZEPF5_V(sge_hps) |
7018 		     HOSTPAGESIZEPF6_V(sge_hps) |
7019 		     HOSTPAGESIZEPF7_V(sge_hps));
7020 
7021 	if (is_t4(adap->params.chip)) {
7022 		t4_set_reg_field(adap, SGE_CONTROL_A,
7023 				 INGPADBOUNDARY_V(INGPADBOUNDARY_M) |
7024 				 EGRSTATUSPAGESIZE_F,
7025 				 INGPADBOUNDARY_V(fl_align_log -
7026 						  INGPADBOUNDARY_SHIFT_X) |
7027 				 EGRSTATUSPAGESIZE_V(stat_len != 64));
7028 	} else {
7029 		unsigned int pack_align;
7030 		unsigned int ingpad, ingpack;
7031 		unsigned int pcie_cap;
7032 
7033 		/* T5 introduced the separation of the Free List Padding and
7034 		 * Packing Boundaries.  Thus, we can select a smaller Padding
7035 		 * Boundary to avoid uselessly chewing up PCIe Link and Memory
7036 		 * Bandwidth, and use a Packing Boundary which is large enough
7037 		 * to avoid false sharing between CPUs, etc.
7038 		 *
7039 		 * For the PCI Link, the smaller the Padding Boundary the
7040 		 * better.  For the Memory Controller, a smaller Padding
7041 		 * Boundary is better until we cross under the Memory Line
7042 		 * Size (the minimum unit of transfer to/from Memory).  If we
7043 		 * have a Padding Boundary which is smaller than the Memory
7044 		 * Line Size, that'll involve a Read-Modify-Write cycle on the
7045 		 * Memory Controller which is never good.
7046 		 */
7047 
7048 		/* We want the Packing Boundary to be based on the Cache Line
7049 		 * Size in order to help avoid False Sharing performance
7050 		 * issues between CPUs, etc.  We also want the Packing
7051 		 * Boundary to incorporate the PCI-E Maximum Payload Size.  We
7052 		 * get best performance when the Packing Boundary is a
7053 		 * multiple of the Maximum Payload Size.
7054 		 */
7055 		pack_align = fl_align;
7056 		pcie_cap = pci_find_capability(adap->pdev, PCI_CAP_ID_EXP);
7057 		if (pcie_cap) {
7058 			unsigned int mps, mps_log;
7059 			u16 devctl;
7060 
7061 			/* The PCIe Device Control Maximum Payload Size field
7062 			 * [bits 7:5] encodes sizes as powers of 2 starting at
7063 			 * 128 bytes.
7064 			 */
7065 			pci_read_config_word(adap->pdev,
7066 					     pcie_cap + PCI_EXP_DEVCTL,
7067 					     &devctl);
7068 			mps_log = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5) + 7;
7069 			mps = 1 << mps_log;
7070 			if (mps > pack_align)
7071 				pack_align = mps;
7072 		}
7073 
7074 		/* N.B. T5/T6 have a crazy special interpretation of the "0"
7075 		 * value for the Packing Boundary.  This corresponds to 16
7076 		 * bytes instead of the expected 32 bytes.  So if we want 32
7077 		 * bytes, the best we can really do is 64 bytes ...
7078 		 */
7079 		if (pack_align <= 16) {
7080 			ingpack = INGPACKBOUNDARY_16B_X;
7081 			fl_align = 16;
7082 		} else if (pack_align == 32) {
7083 			ingpack = INGPACKBOUNDARY_64B_X;
7084 			fl_align = 64;
7085 		} else {
7086 			unsigned int pack_align_log = fls(pack_align) - 1;
7087 
7088 			ingpack = pack_align_log - INGPACKBOUNDARY_SHIFT_X;
7089 			fl_align = pack_align;
7090 		}
7091 
7092 		/* Use the smallest Ingress Padding which isn't smaller than
7093 		 * the Memory Controller Read/Write Size.  We'll take that as
7094 		 * being 8 bytes since we don't know of any system with a
7095 		 * wider Memory Controller Bus Width.
7096 		 */
7097 		if (is_t5(adap->params.chip))
7098 			ingpad = INGPADBOUNDARY_32B_X;
7099 		else
7100 			ingpad = T6_INGPADBOUNDARY_8B_X;
7101 
7102 		t4_set_reg_field(adap, SGE_CONTROL_A,
7103 				 INGPADBOUNDARY_V(INGPADBOUNDARY_M) |
7104 				 EGRSTATUSPAGESIZE_F,
7105 				 INGPADBOUNDARY_V(ingpad) |
7106 				 EGRSTATUSPAGESIZE_V(stat_len != 64));
7107 		t4_set_reg_field(adap, SGE_CONTROL2_A,
7108 				 INGPACKBOUNDARY_V(INGPACKBOUNDARY_M),
7109 				 INGPACKBOUNDARY_V(ingpack));
7110 	}
7111 	/*
7112 	 * Adjust various SGE Free List Host Buffer Sizes.
7113 	 *
7114 	 * This is something of a crock since we're using fixed indices into
7115 	 * the array which are also known by the sge.c code and the T4
7116 	 * Firmware Configuration File.  We need to come up with a much better
7117 	 * approach to managing this array.  For now, the first four entries
7118 	 * are:
7119 	 *
7120 	 *   0: Host Page Size
7121 	 *   1: 64KB
7122 	 *   2: Buffer size corresponding to 1500 byte MTU (unpacked mode)
7123 	 *   3: Buffer size corresponding to 9000 byte MTU (unpacked mode)
7124 	 *
7125 	 * For the single-MTU buffers in unpacked mode we need to include
7126 	 * space for the SGE Control Packet Shift, 14 byte Ethernet header,
7127 	 * possible 4 byte VLAN tag, all rounded up to the next Ingress Packet
7128 	 * Padding boundary.  All of these are accommodated in the Factory
7129 	 * Default Firmware Configuration File but we need to adjust it for
7130 	 * this host's cache line size.
7131 	 */
7132 	t4_write_reg(adap, SGE_FL_BUFFER_SIZE0_A, page_size);
7133 	t4_write_reg(adap, SGE_FL_BUFFER_SIZE2_A,
7134 		     (t4_read_reg(adap, SGE_FL_BUFFER_SIZE2_A) + fl_align-1)
7135 		     & ~(fl_align-1));
7136 	t4_write_reg(adap, SGE_FL_BUFFER_SIZE3_A,
7137 		     (t4_read_reg(adap, SGE_FL_BUFFER_SIZE3_A) + fl_align-1)
7138 		     & ~(fl_align-1));
7139 
7140 	t4_write_reg(adap, ULP_RX_TDDP_PSZ_A, HPZ0_V(page_shift - 12));
7141 
7142 	return 0;
7143 }
7144 
7145 /**
7146  *	t4_fw_initialize - ask FW to initialize the device
7147  *	@adap: the adapter
7148  *	@mbox: mailbox to use for the FW command
7149  *
7150  *	Issues a command to FW to partially initialize the device.  This
7151  *	performs initialization that generally doesn't depend on user input.
7152  */
7153 int t4_fw_initialize(struct adapter *adap, unsigned int mbox)
7154 {
7155 	struct fw_initialize_cmd c;
7156 
7157 	memset(&c, 0, sizeof(c));
7158 	INIT_CMD(c, INITIALIZE, WRITE);
7159 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7160 }
7161 
7162 /**
7163  *	t4_query_params_rw - query FW or device parameters
7164  *	@adap: the adapter
7165  *	@mbox: mailbox to use for the FW command
7166  *	@pf: the PF
7167  *	@vf: the VF
7168  *	@nparams: the number of parameters
7169  *	@params: the parameter names
7170  *	@val: the parameter values
7171  *	@rw: Write and read flag
7172  *	@sleep_ok: if true, we may sleep awaiting mbox cmd completion
7173  *
7174  *	Reads the value of FW or device parameters.  Up to 7 parameters can be
7175  *	queried at once.
7176  */
7177 int t4_query_params_rw(struct adapter *adap, unsigned int mbox, unsigned int pf,
7178 		       unsigned int vf, unsigned int nparams, const u32 *params,
7179 		       u32 *val, int rw, bool sleep_ok)
7180 {
7181 	int i, ret;
7182 	struct fw_params_cmd c;
7183 	__be32 *p = &c.param[0].mnem;
7184 
7185 	if (nparams > 7)
7186 		return -EINVAL;
7187 
7188 	memset(&c, 0, sizeof(c));
7189 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
7190 				  FW_CMD_REQUEST_F | FW_CMD_READ_F |
7191 				  FW_PARAMS_CMD_PFN_V(pf) |
7192 				  FW_PARAMS_CMD_VFN_V(vf));
7193 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7194 
7195 	for (i = 0; i < nparams; i++) {
7196 		*p++ = cpu_to_be32(*params++);
7197 		if (rw)
7198 			*p = cpu_to_be32(*(val + i));
7199 		p++;
7200 	}
7201 
7202 	ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7203 	if (ret == 0)
7204 		for (i = 0, p = &c.param[0].val; i < nparams; i++, p += 2)
7205 			*val++ = be32_to_cpu(*p);
7206 	return ret;
7207 }
7208 
7209 int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
7210 		    unsigned int vf, unsigned int nparams, const u32 *params,
7211 		    u32 *val)
7212 {
7213 	return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0,
7214 				  true);
7215 }
7216 
7217 int t4_query_params_ns(struct adapter *adap, unsigned int mbox, unsigned int pf,
7218 		       unsigned int vf, unsigned int nparams, const u32 *params,
7219 		       u32 *val)
7220 {
7221 	return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0,
7222 				  false);
7223 }
7224 
7225 /**
7226  *      t4_set_params_timeout - sets FW or device parameters
7227  *      @adap: the adapter
7228  *      @mbox: mailbox to use for the FW command
7229  *      @pf: the PF
7230  *      @vf: the VF
7231  *      @nparams: the number of parameters
7232  *      @params: the parameter names
7233  *      @val: the parameter values
7234  *      @timeout: the timeout time
7235  *
7236  *      Sets the value of FW or device parameters.  Up to 7 parameters can be
7237  *      specified at once.
7238  */
7239 int t4_set_params_timeout(struct adapter *adap, unsigned int mbox,
7240 			  unsigned int pf, unsigned int vf,
7241 			  unsigned int nparams, const u32 *params,
7242 			  const u32 *val, int timeout)
7243 {
7244 	struct fw_params_cmd c;
7245 	__be32 *p = &c.param[0].mnem;
7246 
7247 	if (nparams > 7)
7248 		return -EINVAL;
7249 
7250 	memset(&c, 0, sizeof(c));
7251 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
7252 				  FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7253 				  FW_PARAMS_CMD_PFN_V(pf) |
7254 				  FW_PARAMS_CMD_VFN_V(vf));
7255 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7256 
7257 	while (nparams--) {
7258 		*p++ = cpu_to_be32(*params++);
7259 		*p++ = cpu_to_be32(*val++);
7260 	}
7261 
7262 	return t4_wr_mbox_timeout(adap, mbox, &c, sizeof(c), NULL, timeout);
7263 }
7264 
7265 /**
7266  *	t4_set_params - sets FW or device parameters
7267  *	@adap: the adapter
7268  *	@mbox: mailbox to use for the FW command
7269  *	@pf: the PF
7270  *	@vf: the VF
7271  *	@nparams: the number of parameters
7272  *	@params: the parameter names
7273  *	@val: the parameter values
7274  *
7275  *	Sets the value of FW or device parameters.  Up to 7 parameters can be
7276  *	specified at once.
7277  */
7278 int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
7279 		  unsigned int vf, unsigned int nparams, const u32 *params,
7280 		  const u32 *val)
7281 {
7282 	return t4_set_params_timeout(adap, mbox, pf, vf, nparams, params, val,
7283 				     FW_CMD_MAX_TIMEOUT);
7284 }
7285 
7286 /**
7287  *	t4_cfg_pfvf - configure PF/VF resource limits
7288  *	@adap: the adapter
7289  *	@mbox: mailbox to use for the FW command
7290  *	@pf: the PF being configured
7291  *	@vf: the VF being configured
7292  *	@txq: the max number of egress queues
7293  *	@txq_eth_ctrl: the max number of egress Ethernet or control queues
7294  *	@rxqi: the max number of interrupt-capable ingress queues
7295  *	@rxq: the max number of interruptless ingress queues
7296  *	@tc: the PCI traffic class
7297  *	@vi: the max number of virtual interfaces
7298  *	@cmask: the channel access rights mask for the PF/VF
7299  *	@pmask: the port access rights mask for the PF/VF
7300  *	@nexact: the maximum number of exact MPS filters
7301  *	@rcaps: read capabilities
7302  *	@wxcaps: write/execute capabilities
7303  *
7304  *	Configures resource limits and capabilities for a physical or virtual
7305  *	function.
7306  */
7307 int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf,
7308 		unsigned int vf, unsigned int txq, unsigned int txq_eth_ctrl,
7309 		unsigned int rxqi, unsigned int rxq, unsigned int tc,
7310 		unsigned int vi, unsigned int cmask, unsigned int pmask,
7311 		unsigned int nexact, unsigned int rcaps, unsigned int wxcaps)
7312 {
7313 	struct fw_pfvf_cmd c;
7314 
7315 	memset(&c, 0, sizeof(c));
7316 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PFVF_CMD) | FW_CMD_REQUEST_F |
7317 				  FW_CMD_WRITE_F | FW_PFVF_CMD_PFN_V(pf) |
7318 				  FW_PFVF_CMD_VFN_V(vf));
7319 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7320 	c.niqflint_niq = cpu_to_be32(FW_PFVF_CMD_NIQFLINT_V(rxqi) |
7321 				     FW_PFVF_CMD_NIQ_V(rxq));
7322 	c.type_to_neq = cpu_to_be32(FW_PFVF_CMD_CMASK_V(cmask) |
7323 				    FW_PFVF_CMD_PMASK_V(pmask) |
7324 				    FW_PFVF_CMD_NEQ_V(txq));
7325 	c.tc_to_nexactf = cpu_to_be32(FW_PFVF_CMD_TC_V(tc) |
7326 				      FW_PFVF_CMD_NVI_V(vi) |
7327 				      FW_PFVF_CMD_NEXACTF_V(nexact));
7328 	c.r_caps_to_nethctrl = cpu_to_be32(FW_PFVF_CMD_R_CAPS_V(rcaps) |
7329 					FW_PFVF_CMD_WX_CAPS_V(wxcaps) |
7330 					FW_PFVF_CMD_NETHCTRL_V(txq_eth_ctrl));
7331 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7332 }
7333 
7334 /**
7335  *	t4_alloc_vi - allocate a virtual interface
7336  *	@adap: the adapter
7337  *	@mbox: mailbox to use for the FW command
7338  *	@port: physical port associated with the VI
7339  *	@pf: the PF owning the VI
7340  *	@vf: the VF owning the VI
7341  *	@nmac: number of MAC addresses needed (1 to 5)
7342  *	@mac: the MAC addresses of the VI
7343  *	@rss_size: size of RSS table slice associated with this VI
7344  *
7345  *	Allocates a virtual interface for the given physical port.  If @mac is
7346  *	not %NULL it contains the MAC addresses of the VI as assigned by FW.
7347  *	@mac should be large enough to hold @nmac Ethernet addresses, they are
7348  *	stored consecutively so the space needed is @nmac * 6 bytes.
7349  *	Returns a negative error number or the non-negative VI id.
7350  */
7351 int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
7352 		unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
7353 		unsigned int *rss_size)
7354 {
7355 	int ret;
7356 	struct fw_vi_cmd c;
7357 
7358 	memset(&c, 0, sizeof(c));
7359 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) | FW_CMD_REQUEST_F |
7360 				  FW_CMD_WRITE_F | FW_CMD_EXEC_F |
7361 				  FW_VI_CMD_PFN_V(pf) | FW_VI_CMD_VFN_V(vf));
7362 	c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_ALLOC_F | FW_LEN16(c));
7363 	c.portid_pkd = FW_VI_CMD_PORTID_V(port);
7364 	c.nmac = nmac - 1;
7365 
7366 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7367 	if (ret)
7368 		return ret;
7369 
7370 	if (mac) {
7371 		memcpy(mac, c.mac, sizeof(c.mac));
7372 		switch (nmac) {
7373 		case 5:
7374 			memcpy(mac + 24, c.nmac3, sizeof(c.nmac3));
7375 		case 4:
7376 			memcpy(mac + 18, c.nmac2, sizeof(c.nmac2));
7377 		case 3:
7378 			memcpy(mac + 12, c.nmac1, sizeof(c.nmac1));
7379 		case 2:
7380 			memcpy(mac + 6,  c.nmac0, sizeof(c.nmac0));
7381 		}
7382 	}
7383 	if (rss_size)
7384 		*rss_size = FW_VI_CMD_RSSSIZE_G(be16_to_cpu(c.rsssize_pkd));
7385 	return FW_VI_CMD_VIID_G(be16_to_cpu(c.type_viid));
7386 }
7387 
7388 /**
7389  *	t4_free_vi - free a virtual interface
7390  *	@adap: the adapter
7391  *	@mbox: mailbox to use for the FW command
7392  *	@pf: the PF owning the VI
7393  *	@vf: the VF owning the VI
7394  *	@viid: virtual interface identifiler
7395  *
7396  *	Free a previously allocated virtual interface.
7397  */
7398 int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
7399 	       unsigned int vf, unsigned int viid)
7400 {
7401 	struct fw_vi_cmd c;
7402 
7403 	memset(&c, 0, sizeof(c));
7404 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) |
7405 				  FW_CMD_REQUEST_F |
7406 				  FW_CMD_EXEC_F |
7407 				  FW_VI_CMD_PFN_V(pf) |
7408 				  FW_VI_CMD_VFN_V(vf));
7409 	c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_FREE_F | FW_LEN16(c));
7410 	c.type_viid = cpu_to_be16(FW_VI_CMD_VIID_V(viid));
7411 
7412 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7413 }
7414 
7415 /**
7416  *	t4_set_rxmode - set Rx properties of a virtual interface
7417  *	@adap: the adapter
7418  *	@mbox: mailbox to use for the FW command
7419  *	@viid: the VI id
7420  *	@mtu: the new MTU or -1
7421  *	@promisc: 1 to enable promiscuous mode, 0 to disable it, -1 no change
7422  *	@all_multi: 1 to enable all-multi mode, 0 to disable it, -1 no change
7423  *	@bcast: 1 to enable broadcast Rx, 0 to disable it, -1 no change
7424  *	@vlanex: 1 to enable HW VLAN extraction, 0 to disable it, -1 no change
7425  *	@sleep_ok: if true we may sleep while awaiting command completion
7426  *
7427  *	Sets Rx properties of a virtual interface.
7428  */
7429 int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
7430 		  int mtu, int promisc, int all_multi, int bcast, int vlanex,
7431 		  bool sleep_ok)
7432 {
7433 	struct fw_vi_rxmode_cmd c;
7434 
7435 	/* convert to FW values */
7436 	if (mtu < 0)
7437 		mtu = FW_RXMODE_MTU_NO_CHG;
7438 	if (promisc < 0)
7439 		promisc = FW_VI_RXMODE_CMD_PROMISCEN_M;
7440 	if (all_multi < 0)
7441 		all_multi = FW_VI_RXMODE_CMD_ALLMULTIEN_M;
7442 	if (bcast < 0)
7443 		bcast = FW_VI_RXMODE_CMD_BROADCASTEN_M;
7444 	if (vlanex < 0)
7445 		vlanex = FW_VI_RXMODE_CMD_VLANEXEN_M;
7446 
7447 	memset(&c, 0, sizeof(c));
7448 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_RXMODE_CMD) |
7449 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7450 				   FW_VI_RXMODE_CMD_VIID_V(viid));
7451 	c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7452 	c.mtu_to_vlanexen =
7453 		cpu_to_be32(FW_VI_RXMODE_CMD_MTU_V(mtu) |
7454 			    FW_VI_RXMODE_CMD_PROMISCEN_V(promisc) |
7455 			    FW_VI_RXMODE_CMD_ALLMULTIEN_V(all_multi) |
7456 			    FW_VI_RXMODE_CMD_BROADCASTEN_V(bcast) |
7457 			    FW_VI_RXMODE_CMD_VLANEXEN_V(vlanex));
7458 	return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
7459 }
7460 
7461 /**
7462  *	t4_free_raw_mac_filt - Frees a raw mac entry in mps tcam
7463  *	@adap: the adapter
7464  *	@viid: the VI id
7465  *	@addr: the MAC address
7466  *	@mask: the mask
7467  *	@idx: index of the entry in mps tcam
7468  *	@lookup_type: MAC address for inner (1) or outer (0) header
7469  *	@port_id: the port index
7470  *	@sleep_ok: call is allowed to sleep
7471  *
7472  *	Removes the mac entry at the specified index using raw mac interface.
7473  *
7474  *	Returns a negative error number on failure.
7475  */
7476 int t4_free_raw_mac_filt(struct adapter *adap, unsigned int viid,
7477 			 const u8 *addr, const u8 *mask, unsigned int idx,
7478 			 u8 lookup_type, u8 port_id, bool sleep_ok)
7479 {
7480 	struct fw_vi_mac_cmd c;
7481 	struct fw_vi_mac_raw *p = &c.u.raw;
7482 	u32 val;
7483 
7484 	memset(&c, 0, sizeof(c));
7485 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7486 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7487 				   FW_CMD_EXEC_V(0) |
7488 				   FW_VI_MAC_CMD_VIID_V(viid));
7489 	val = FW_CMD_LEN16_V(1) |
7490 	      FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW);
7491 	c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) |
7492 					  FW_CMD_LEN16_V(val));
7493 
7494 	p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx) |
7495 				     FW_VI_MAC_ID_BASED_FREE);
7496 
7497 	/* Lookup Type. Outer header: 0, Inner header: 1 */
7498 	p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) |
7499 				   DATAPORTNUM_V(port_id));
7500 	/* Lookup mask and port mask */
7501 	p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) |
7502 				    DATAPORTNUM_V(DATAPORTNUM_M));
7503 
7504 	/* Copy the address and the mask */
7505 	memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN);
7506 	memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN);
7507 
7508 	return t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok);
7509 }
7510 
7511 /**
7512  *	t4_alloc_raw_mac_filt - Adds a mac entry in mps tcam
7513  *	@adap: the adapter
7514  *	@viid: the VI id
7515  *	@mac: the MAC address
7516  *	@mask: the mask
7517  *	@idx: index at which to add this entry
7518  *	@port_id: the port index
7519  *	@lookup_type: MAC address for inner (1) or outer (0) header
7520  *	@sleep_ok: call is allowed to sleep
7521  *
7522  *	Adds the mac entry at the specified index using raw mac interface.
7523  *
7524  *	Returns a negative error number or the allocated index for this mac.
7525  */
7526 int t4_alloc_raw_mac_filt(struct adapter *adap, unsigned int viid,
7527 			  const u8 *addr, const u8 *mask, unsigned int idx,
7528 			  u8 lookup_type, u8 port_id, bool sleep_ok)
7529 {
7530 	int ret = 0;
7531 	struct fw_vi_mac_cmd c;
7532 	struct fw_vi_mac_raw *p = &c.u.raw;
7533 	u32 val;
7534 
7535 	memset(&c, 0, sizeof(c));
7536 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7537 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7538 				   FW_VI_MAC_CMD_VIID_V(viid));
7539 	val = FW_CMD_LEN16_V(1) |
7540 	      FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW);
7541 	c.freemacs_to_len16 = cpu_to_be32(val);
7542 
7543 	/* Specify that this is an inner mac address */
7544 	p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx));
7545 
7546 	/* Lookup Type. Outer header: 0, Inner header: 1 */
7547 	p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) |
7548 				   DATAPORTNUM_V(port_id));
7549 	/* Lookup mask and port mask */
7550 	p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) |
7551 				    DATAPORTNUM_V(DATAPORTNUM_M));
7552 
7553 	/* Copy the address and the mask */
7554 	memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN);
7555 	memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN);
7556 
7557 	ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok);
7558 	if (ret == 0) {
7559 		ret = FW_VI_MAC_CMD_RAW_IDX_G(be32_to_cpu(p->raw_idx_pkd));
7560 		if (ret != idx)
7561 			ret = -ENOMEM;
7562 	}
7563 
7564 	return ret;
7565 }
7566 
7567 /**
7568  *	t4_alloc_mac_filt - allocates exact-match filters for MAC addresses
7569  *	@adap: the adapter
7570  *	@mbox: mailbox to use for the FW command
7571  *	@viid: the VI id
7572  *	@free: if true any existing filters for this VI id are first removed
7573  *	@naddr: the number of MAC addresses to allocate filters for (up to 7)
7574  *	@addr: the MAC address(es)
7575  *	@idx: where to store the index of each allocated filter
7576  *	@hash: pointer to hash address filter bitmap
7577  *	@sleep_ok: call is allowed to sleep
7578  *
7579  *	Allocates an exact-match filter for each of the supplied addresses and
7580  *	sets it to the corresponding address.  If @idx is not %NULL it should
7581  *	have at least @naddr entries, each of which will be set to the index of
7582  *	the filter allocated for the corresponding MAC address.  If a filter
7583  *	could not be allocated for an address its index is set to 0xffff.
7584  *	If @hash is not %NULL addresses that fail to allocate an exact filter
7585  *	are hashed and update the hash filter bitmap pointed at by @hash.
7586  *
7587  *	Returns a negative error number or the number of filters allocated.
7588  */
7589 int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
7590 		      unsigned int viid, bool free, unsigned int naddr,
7591 		      const u8 **addr, u16 *idx, u64 *hash, bool sleep_ok)
7592 {
7593 	int offset, ret = 0;
7594 	struct fw_vi_mac_cmd c;
7595 	unsigned int nfilters = 0;
7596 	unsigned int max_naddr = adap->params.arch.mps_tcam_size;
7597 	unsigned int rem = naddr;
7598 
7599 	if (naddr > max_naddr)
7600 		return -EINVAL;
7601 
7602 	for (offset = 0; offset < naddr ; /**/) {
7603 		unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact) ?
7604 					 rem : ARRAY_SIZE(c.u.exact));
7605 		size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
7606 						     u.exact[fw_naddr]), 16);
7607 		struct fw_vi_mac_exact *p;
7608 		int i;
7609 
7610 		memset(&c, 0, sizeof(c));
7611 		c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7612 					   FW_CMD_REQUEST_F |
7613 					   FW_CMD_WRITE_F |
7614 					   FW_CMD_EXEC_V(free) |
7615 					   FW_VI_MAC_CMD_VIID_V(viid));
7616 		c.freemacs_to_len16 =
7617 			cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(free) |
7618 				    FW_CMD_LEN16_V(len16));
7619 
7620 		for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7621 			p->valid_to_idx =
7622 				cpu_to_be16(FW_VI_MAC_CMD_VALID_F |
7623 					    FW_VI_MAC_CMD_IDX_V(
7624 						    FW_VI_MAC_ADD_MAC));
7625 			memcpy(p->macaddr, addr[offset + i],
7626 			       sizeof(p->macaddr));
7627 		}
7628 
7629 		/* It's okay if we run out of space in our MAC address arena.
7630 		 * Some of the addresses we submit may get stored so we need
7631 		 * to run through the reply to see what the results were ...
7632 		 */
7633 		ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7634 		if (ret && ret != -FW_ENOMEM)
7635 			break;
7636 
7637 		for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7638 			u16 index = FW_VI_MAC_CMD_IDX_G(
7639 					be16_to_cpu(p->valid_to_idx));
7640 
7641 			if (idx)
7642 				idx[offset + i] = (index >= max_naddr ?
7643 						   0xffff : index);
7644 			if (index < max_naddr)
7645 				nfilters++;
7646 			else if (hash)
7647 				*hash |= (1ULL <<
7648 					  hash_mac_addr(addr[offset + i]));
7649 		}
7650 
7651 		free = false;
7652 		offset += fw_naddr;
7653 		rem -= fw_naddr;
7654 	}
7655 
7656 	if (ret == 0 || ret == -FW_ENOMEM)
7657 		ret = nfilters;
7658 	return ret;
7659 }
7660 
7661 /**
7662  *	t4_free_mac_filt - frees exact-match filters of given MAC addresses
7663  *	@adap: the adapter
7664  *	@mbox: mailbox to use for the FW command
7665  *	@viid: the VI id
7666  *	@naddr: the number of MAC addresses to allocate filters for (up to 7)
7667  *	@addr: the MAC address(es)
7668  *	@sleep_ok: call is allowed to sleep
7669  *
7670  *	Frees the exact-match filter for each of the supplied addresses
7671  *
7672  *	Returns a negative error number or the number of filters freed.
7673  */
7674 int t4_free_mac_filt(struct adapter *adap, unsigned int mbox,
7675 		     unsigned int viid, unsigned int naddr,
7676 		     const u8 **addr, bool sleep_ok)
7677 {
7678 	int offset, ret = 0;
7679 	struct fw_vi_mac_cmd c;
7680 	unsigned int nfilters = 0;
7681 	unsigned int max_naddr = is_t4(adap->params.chip) ?
7682 				       NUM_MPS_CLS_SRAM_L_INSTANCES :
7683 				       NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
7684 	unsigned int rem = naddr;
7685 
7686 	if (naddr > max_naddr)
7687 		return -EINVAL;
7688 
7689 	for (offset = 0; offset < (int)naddr ; /**/) {
7690 		unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact)
7691 					 ? rem
7692 					 : ARRAY_SIZE(c.u.exact));
7693 		size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
7694 						     u.exact[fw_naddr]), 16);
7695 		struct fw_vi_mac_exact *p;
7696 		int i;
7697 
7698 		memset(&c, 0, sizeof(c));
7699 		c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7700 				     FW_CMD_REQUEST_F |
7701 				     FW_CMD_WRITE_F |
7702 				     FW_CMD_EXEC_V(0) |
7703 				     FW_VI_MAC_CMD_VIID_V(viid));
7704 		c.freemacs_to_len16 =
7705 				cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) |
7706 					    FW_CMD_LEN16_V(len16));
7707 
7708 		for (i = 0, p = c.u.exact; i < (int)fw_naddr; i++, p++) {
7709 			p->valid_to_idx = cpu_to_be16(
7710 				FW_VI_MAC_CMD_VALID_F |
7711 				FW_VI_MAC_CMD_IDX_V(FW_VI_MAC_MAC_BASED_FREE));
7712 			memcpy(p->macaddr, addr[offset+i], sizeof(p->macaddr));
7713 		}
7714 
7715 		ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7716 		if (ret)
7717 			break;
7718 
7719 		for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7720 			u16 index = FW_VI_MAC_CMD_IDX_G(
7721 						be16_to_cpu(p->valid_to_idx));
7722 
7723 			if (index < max_naddr)
7724 				nfilters++;
7725 		}
7726 
7727 		offset += fw_naddr;
7728 		rem -= fw_naddr;
7729 	}
7730 
7731 	if (ret == 0)
7732 		ret = nfilters;
7733 	return ret;
7734 }
7735 
7736 /**
7737  *	t4_change_mac - modifies the exact-match filter for a MAC address
7738  *	@adap: the adapter
7739  *	@mbox: mailbox to use for the FW command
7740  *	@viid: the VI id
7741  *	@idx: index of existing filter for old value of MAC address, or -1
7742  *	@addr: the new MAC address value
7743  *	@persist: whether a new MAC allocation should be persistent
7744  *	@add_smt: if true also add the address to the HW SMT
7745  *
7746  *	Modifies an exact-match filter and sets it to the new MAC address.
7747  *	Note that in general it is not possible to modify the value of a given
7748  *	filter so the generic way to modify an address filter is to free the one
7749  *	being used by the old address value and allocate a new filter for the
7750  *	new address value.  @idx can be -1 if the address is a new addition.
7751  *
7752  *	Returns a negative error number or the index of the filter with the new
7753  *	MAC value.
7754  */
7755 int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
7756 		  int idx, const u8 *addr, bool persist, bool add_smt)
7757 {
7758 	int ret, mode;
7759 	struct fw_vi_mac_cmd c;
7760 	struct fw_vi_mac_exact *p = c.u.exact;
7761 	unsigned int max_mac_addr = adap->params.arch.mps_tcam_size;
7762 
7763 	if (idx < 0)                             /* new allocation */
7764 		idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC;
7765 	mode = add_smt ? FW_VI_MAC_SMT_AND_MPSTCAM : FW_VI_MAC_MPS_TCAM_ENTRY;
7766 
7767 	memset(&c, 0, sizeof(c));
7768 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7769 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7770 				   FW_VI_MAC_CMD_VIID_V(viid));
7771 	c.freemacs_to_len16 = cpu_to_be32(FW_CMD_LEN16_V(1));
7772 	p->valid_to_idx = cpu_to_be16(FW_VI_MAC_CMD_VALID_F |
7773 				      FW_VI_MAC_CMD_SMAC_RESULT_V(mode) |
7774 				      FW_VI_MAC_CMD_IDX_V(idx));
7775 	memcpy(p->macaddr, addr, sizeof(p->macaddr));
7776 
7777 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7778 	if (ret == 0) {
7779 		ret = FW_VI_MAC_CMD_IDX_G(be16_to_cpu(p->valid_to_idx));
7780 		if (ret >= max_mac_addr)
7781 			ret = -ENOMEM;
7782 	}
7783 	return ret;
7784 }
7785 
7786 /**
7787  *	t4_set_addr_hash - program the MAC inexact-match hash filter
7788  *	@adap: the adapter
7789  *	@mbox: mailbox to use for the FW command
7790  *	@viid: the VI id
7791  *	@ucast: whether the hash filter should also match unicast addresses
7792  *	@vec: the value to be written to the hash filter
7793  *	@sleep_ok: call is allowed to sleep
7794  *
7795  *	Sets the 64-bit inexact-match hash filter for a virtual interface.
7796  */
7797 int t4_set_addr_hash(struct adapter *adap, unsigned int mbox, unsigned int viid,
7798 		     bool ucast, u64 vec, bool sleep_ok)
7799 {
7800 	struct fw_vi_mac_cmd c;
7801 
7802 	memset(&c, 0, sizeof(c));
7803 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7804 				   FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7805 				   FW_VI_ENABLE_CMD_VIID_V(viid));
7806 	c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_HASHVECEN_F |
7807 					  FW_VI_MAC_CMD_HASHUNIEN_V(ucast) |
7808 					  FW_CMD_LEN16_V(1));
7809 	c.u.hash.hashvec = cpu_to_be64(vec);
7810 	return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
7811 }
7812 
7813 /**
7814  *      t4_enable_vi_params - enable/disable a virtual interface
7815  *      @adap: the adapter
7816  *      @mbox: mailbox to use for the FW command
7817  *      @viid: the VI id
7818  *      @rx_en: 1=enable Rx, 0=disable Rx
7819  *      @tx_en: 1=enable Tx, 0=disable Tx
7820  *      @dcb_en: 1=enable delivery of Data Center Bridging messages.
7821  *
7822  *      Enables/disables a virtual interface.  Note that setting DCB Enable
7823  *      only makes sense when enabling a Virtual Interface ...
7824  */
7825 int t4_enable_vi_params(struct adapter *adap, unsigned int mbox,
7826 			unsigned int viid, bool rx_en, bool tx_en, bool dcb_en)
7827 {
7828 	struct fw_vi_enable_cmd c;
7829 
7830 	memset(&c, 0, sizeof(c));
7831 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) |
7832 				   FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7833 				   FW_VI_ENABLE_CMD_VIID_V(viid));
7834 	c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_IEN_V(rx_en) |
7835 				     FW_VI_ENABLE_CMD_EEN_V(tx_en) |
7836 				     FW_VI_ENABLE_CMD_DCB_INFO_V(dcb_en) |
7837 				     FW_LEN16(c));
7838 	return t4_wr_mbox_ns(adap, mbox, &c, sizeof(c), NULL);
7839 }
7840 
7841 /**
7842  *	t4_enable_vi - enable/disable a virtual interface
7843  *	@adap: the adapter
7844  *	@mbox: mailbox to use for the FW command
7845  *	@viid: the VI id
7846  *	@rx_en: 1=enable Rx, 0=disable Rx
7847  *	@tx_en: 1=enable Tx, 0=disable Tx
7848  *
7849  *	Enables/disables a virtual interface.
7850  */
7851 int t4_enable_vi(struct adapter *adap, unsigned int mbox, unsigned int viid,
7852 		 bool rx_en, bool tx_en)
7853 {
7854 	return t4_enable_vi_params(adap, mbox, viid, rx_en, tx_en, 0);
7855 }
7856 
7857 /**
7858  *	t4_identify_port - identify a VI's port by blinking its LED
7859  *	@adap: the adapter
7860  *	@mbox: mailbox to use for the FW command
7861  *	@viid: the VI id
7862  *	@nblinks: how many times to blink LED at 2.5 Hz
7863  *
7864  *	Identifies a VI's port by blinking its LED.
7865  */
7866 int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid,
7867 		     unsigned int nblinks)
7868 {
7869 	struct fw_vi_enable_cmd c;
7870 
7871 	memset(&c, 0, sizeof(c));
7872 	c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) |
7873 				   FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7874 				   FW_VI_ENABLE_CMD_VIID_V(viid));
7875 	c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_LED_F | FW_LEN16(c));
7876 	c.blinkdur = cpu_to_be16(nblinks);
7877 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7878 }
7879 
7880 /**
7881  *	t4_iq_stop - stop an ingress queue and its FLs
7882  *	@adap: the adapter
7883  *	@mbox: mailbox to use for the FW command
7884  *	@pf: the PF owning the queues
7885  *	@vf: the VF owning the queues
7886  *	@iqtype: the ingress queue type (FW_IQ_TYPE_FL_INT_CAP, etc.)
7887  *	@iqid: ingress queue id
7888  *	@fl0id: FL0 queue id or 0xffff if no attached FL0
7889  *	@fl1id: FL1 queue id or 0xffff if no attached FL1
7890  *
7891  *	Stops an ingress queue and its associated FLs, if any.  This causes
7892  *	any current or future data/messages destined for these queues to be
7893  *	tossed.
7894  */
7895 int t4_iq_stop(struct adapter *adap, unsigned int mbox, unsigned int pf,
7896 	       unsigned int vf, unsigned int iqtype, unsigned int iqid,
7897 	       unsigned int fl0id, unsigned int fl1id)
7898 {
7899 	struct fw_iq_cmd c;
7900 
7901 	memset(&c, 0, sizeof(c));
7902 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F |
7903 				  FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) |
7904 				  FW_IQ_CMD_VFN_V(vf));
7905 	c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_IQSTOP_F | FW_LEN16(c));
7906 	c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype));
7907 	c.iqid = cpu_to_be16(iqid);
7908 	c.fl0id = cpu_to_be16(fl0id);
7909 	c.fl1id = cpu_to_be16(fl1id);
7910 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7911 }
7912 
7913 /**
7914  *	t4_iq_free - free an ingress queue and its FLs
7915  *	@adap: the adapter
7916  *	@mbox: mailbox to use for the FW command
7917  *	@pf: the PF owning the queues
7918  *	@vf: the VF owning the queues
7919  *	@iqtype: the ingress queue type
7920  *	@iqid: ingress queue id
7921  *	@fl0id: FL0 queue id or 0xffff if no attached FL0
7922  *	@fl1id: FL1 queue id or 0xffff if no attached FL1
7923  *
7924  *	Frees an ingress queue and its associated FLs, if any.
7925  */
7926 int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7927 	       unsigned int vf, unsigned int iqtype, unsigned int iqid,
7928 	       unsigned int fl0id, unsigned int fl1id)
7929 {
7930 	struct fw_iq_cmd c;
7931 
7932 	memset(&c, 0, sizeof(c));
7933 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F |
7934 				  FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) |
7935 				  FW_IQ_CMD_VFN_V(vf));
7936 	c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_FREE_F | FW_LEN16(c));
7937 	c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype));
7938 	c.iqid = cpu_to_be16(iqid);
7939 	c.fl0id = cpu_to_be16(fl0id);
7940 	c.fl1id = cpu_to_be16(fl1id);
7941 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7942 }
7943 
7944 /**
7945  *	t4_eth_eq_free - free an Ethernet egress queue
7946  *	@adap: the adapter
7947  *	@mbox: mailbox to use for the FW command
7948  *	@pf: the PF owning the queue
7949  *	@vf: the VF owning the queue
7950  *	@eqid: egress queue id
7951  *
7952  *	Frees an Ethernet egress queue.
7953  */
7954 int t4_eth_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7955 		   unsigned int vf, unsigned int eqid)
7956 {
7957 	struct fw_eq_eth_cmd c;
7958 
7959 	memset(&c, 0, sizeof(c));
7960 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_ETH_CMD) |
7961 				  FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7962 				  FW_EQ_ETH_CMD_PFN_V(pf) |
7963 				  FW_EQ_ETH_CMD_VFN_V(vf));
7964 	c.alloc_to_len16 = cpu_to_be32(FW_EQ_ETH_CMD_FREE_F | FW_LEN16(c));
7965 	c.eqid_pkd = cpu_to_be32(FW_EQ_ETH_CMD_EQID_V(eqid));
7966 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7967 }
7968 
7969 /**
7970  *	t4_ctrl_eq_free - free a control egress queue
7971  *	@adap: the adapter
7972  *	@mbox: mailbox to use for the FW command
7973  *	@pf: the PF owning the queue
7974  *	@vf: the VF owning the queue
7975  *	@eqid: egress queue id
7976  *
7977  *	Frees a control egress queue.
7978  */
7979 int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7980 		    unsigned int vf, unsigned int eqid)
7981 {
7982 	struct fw_eq_ctrl_cmd c;
7983 
7984 	memset(&c, 0, sizeof(c));
7985 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_CTRL_CMD) |
7986 				  FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7987 				  FW_EQ_CTRL_CMD_PFN_V(pf) |
7988 				  FW_EQ_CTRL_CMD_VFN_V(vf));
7989 	c.alloc_to_len16 = cpu_to_be32(FW_EQ_CTRL_CMD_FREE_F | FW_LEN16(c));
7990 	c.cmpliqid_eqid = cpu_to_be32(FW_EQ_CTRL_CMD_EQID_V(eqid));
7991 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7992 }
7993 
7994 /**
7995  *	t4_ofld_eq_free - free an offload egress queue
7996  *	@adap: the adapter
7997  *	@mbox: mailbox to use for the FW command
7998  *	@pf: the PF owning the queue
7999  *	@vf: the VF owning the queue
8000  *	@eqid: egress queue id
8001  *
8002  *	Frees a control egress queue.
8003  */
8004 int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
8005 		    unsigned int vf, unsigned int eqid)
8006 {
8007 	struct fw_eq_ofld_cmd c;
8008 
8009 	memset(&c, 0, sizeof(c));
8010 	c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_OFLD_CMD) |
8011 				  FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
8012 				  FW_EQ_OFLD_CMD_PFN_V(pf) |
8013 				  FW_EQ_OFLD_CMD_VFN_V(vf));
8014 	c.alloc_to_len16 = cpu_to_be32(FW_EQ_OFLD_CMD_FREE_F | FW_LEN16(c));
8015 	c.eqid_pkd = cpu_to_be32(FW_EQ_OFLD_CMD_EQID_V(eqid));
8016 	return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
8017 }
8018 
8019 /**
8020  *	t4_link_down_rc_str - return a string for a Link Down Reason Code
8021  *	@adap: the adapter
8022  *	@link_down_rc: Link Down Reason Code
8023  *
8024  *	Returns a string representation of the Link Down Reason Code.
8025  */
8026 static const char *t4_link_down_rc_str(unsigned char link_down_rc)
8027 {
8028 	static const char * const reason[] = {
8029 		"Link Down",
8030 		"Remote Fault",
8031 		"Auto-negotiation Failure",
8032 		"Reserved",
8033 		"Insufficient Airflow",
8034 		"Unable To Determine Reason",
8035 		"No RX Signal Detected",
8036 		"Reserved",
8037 	};
8038 
8039 	if (link_down_rc >= ARRAY_SIZE(reason))
8040 		return "Bad Reason Code";
8041 
8042 	return reason[link_down_rc];
8043 }
8044 
8045 /**
8046  * Return the highest speed set in the port capabilities, in Mb/s.
8047  */
8048 static unsigned int fwcap_to_speed(fw_port_cap32_t caps)
8049 {
8050 	#define TEST_SPEED_RETURN(__caps_speed, __speed) \
8051 		do { \
8052 			if (caps & FW_PORT_CAP32_SPEED_##__caps_speed) \
8053 				return __speed; \
8054 		} while (0)
8055 
8056 	TEST_SPEED_RETURN(400G, 400000);
8057 	TEST_SPEED_RETURN(200G, 200000);
8058 	TEST_SPEED_RETURN(100G, 100000);
8059 	TEST_SPEED_RETURN(50G,   50000);
8060 	TEST_SPEED_RETURN(40G,   40000);
8061 	TEST_SPEED_RETURN(25G,   25000);
8062 	TEST_SPEED_RETURN(10G,   10000);
8063 	TEST_SPEED_RETURN(1G,     1000);
8064 	TEST_SPEED_RETURN(100M,    100);
8065 
8066 	#undef TEST_SPEED_RETURN
8067 
8068 	return 0;
8069 }
8070 
8071 /**
8072  *	fwcap_to_fwspeed - return highest speed in Port Capabilities
8073  *	@acaps: advertised Port Capabilities
8074  *
8075  *	Get the highest speed for the port from the advertised Port
8076  *	Capabilities.  It will be either the highest speed from the list of
8077  *	speeds or whatever user has set using ethtool.
8078  */
8079 static fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps)
8080 {
8081 	#define TEST_SPEED_RETURN(__caps_speed) \
8082 		do { \
8083 			if (acaps & FW_PORT_CAP32_SPEED_##__caps_speed) \
8084 				return FW_PORT_CAP32_SPEED_##__caps_speed; \
8085 		} while (0)
8086 
8087 	TEST_SPEED_RETURN(400G);
8088 	TEST_SPEED_RETURN(200G);
8089 	TEST_SPEED_RETURN(100G);
8090 	TEST_SPEED_RETURN(50G);
8091 	TEST_SPEED_RETURN(40G);
8092 	TEST_SPEED_RETURN(25G);
8093 	TEST_SPEED_RETURN(10G);
8094 	TEST_SPEED_RETURN(1G);
8095 	TEST_SPEED_RETURN(100M);
8096 
8097 	#undef TEST_SPEED_RETURN
8098 
8099 	return 0;
8100 }
8101 
8102 /**
8103  *	lstatus_to_fwcap - translate old lstatus to 32-bit Port Capabilities
8104  *	@lstatus: old FW_PORT_ACTION_GET_PORT_INFO lstatus value
8105  *
8106  *	Translates old FW_PORT_ACTION_GET_PORT_INFO lstatus field into new
8107  *	32-bit Port Capabilities value.
8108  */
8109 static fw_port_cap32_t lstatus_to_fwcap(u32 lstatus)
8110 {
8111 	fw_port_cap32_t linkattr = 0;
8112 
8113 	/* Unfortunately the format of the Link Status in the old
8114 	 * 16-bit Port Information message isn't the same as the
8115 	 * 16-bit Port Capabilities bitfield used everywhere else ...
8116 	 */
8117 	if (lstatus & FW_PORT_CMD_RXPAUSE_F)
8118 		linkattr |= FW_PORT_CAP32_FC_RX;
8119 	if (lstatus & FW_PORT_CMD_TXPAUSE_F)
8120 		linkattr |= FW_PORT_CAP32_FC_TX;
8121 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100M))
8122 		linkattr |= FW_PORT_CAP32_SPEED_100M;
8123 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_1G))
8124 		linkattr |= FW_PORT_CAP32_SPEED_1G;
8125 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G))
8126 		linkattr |= FW_PORT_CAP32_SPEED_10G;
8127 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_25G))
8128 		linkattr |= FW_PORT_CAP32_SPEED_25G;
8129 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G))
8130 		linkattr |= FW_PORT_CAP32_SPEED_40G;
8131 	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100G))
8132 		linkattr |= FW_PORT_CAP32_SPEED_100G;
8133 
8134 	return linkattr;
8135 }
8136 
8137 /**
8138  *	t4_handle_get_port_info - process a FW reply message
8139  *	@pi: the port info
8140  *	@rpl: start of the FW message
8141  *
8142  *	Processes a GET_PORT_INFO FW reply message.
8143  */
8144 void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl)
8145 {
8146 	const struct fw_port_cmd *cmd = (const void *)rpl;
8147 	int action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
8148 	struct adapter *adapter = pi->adapter;
8149 	struct link_config *lc = &pi->link_cfg;
8150 	int link_ok, linkdnrc;
8151 	enum fw_port_type port_type;
8152 	enum fw_port_module_type mod_type;
8153 	unsigned int speed, fc, fec;
8154 	fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
8155 
8156 	/* Extract the various fields from the Port Information message.
8157 	 */
8158 	switch (action) {
8159 	case FW_PORT_ACTION_GET_PORT_INFO: {
8160 		u32 lstatus = be32_to_cpu(cmd->u.info.lstatus_to_modtype);
8161 
8162 		link_ok = (lstatus & FW_PORT_CMD_LSTATUS_F) != 0;
8163 		linkdnrc = FW_PORT_CMD_LINKDNRC_G(lstatus);
8164 		port_type = FW_PORT_CMD_PTYPE_G(lstatus);
8165 		mod_type = FW_PORT_CMD_MODTYPE_G(lstatus);
8166 		pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.pcap));
8167 		acaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.acap));
8168 		lpacaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.lpacap));
8169 		linkattr = lstatus_to_fwcap(lstatus);
8170 		break;
8171 	}
8172 
8173 	case FW_PORT_ACTION_GET_PORT_INFO32: {
8174 		u32 lstatus32;
8175 
8176 		lstatus32 = be32_to_cpu(cmd->u.info32.lstatus32_to_cbllen32);
8177 		link_ok = (lstatus32 & FW_PORT_CMD_LSTATUS32_F) != 0;
8178 		linkdnrc = FW_PORT_CMD_LINKDNRC32_G(lstatus32);
8179 		port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32);
8180 		mod_type = FW_PORT_CMD_MODTYPE32_G(lstatus32);
8181 		pcaps = be32_to_cpu(cmd->u.info32.pcaps32);
8182 		acaps = be32_to_cpu(cmd->u.info32.acaps32);
8183 		lpacaps = be32_to_cpu(cmd->u.info32.lpacaps32);
8184 		linkattr = be32_to_cpu(cmd->u.info32.linkattr32);
8185 		break;
8186 	}
8187 
8188 	default:
8189 		dev_err(adapter->pdev_dev, "Handle Port Information: Bad Command/Action %#x\n",
8190 			be32_to_cpu(cmd->action_to_len16));
8191 		return;
8192 	}
8193 
8194 	fec = fwcap_to_cc_fec(acaps);
8195 	fc = fwcap_to_cc_pause(linkattr);
8196 	speed = fwcap_to_speed(linkattr);
8197 
8198 	if (mod_type != pi->mod_type) {
8199 		/* With the newer SFP28 and QSFP28 Transceiver Module Types,
8200 		 * various fundamental Port Capabilities which used to be
8201 		 * immutable can now change radically.  We can now have
8202 		 * Speeds, Auto-Negotiation, Forward Error Correction, etc.
8203 		 * all change based on what Transceiver Module is inserted.
8204 		 * So we need to record the Physical "Port" Capabilities on
8205 		 * every Transceiver Module change.
8206 		 */
8207 		lc->pcaps = pcaps;
8208 
8209 		/* When a new Transceiver Module is inserted, the Firmware
8210 		 * will examine its i2c EPROM to determine its type and
8211 		 * general operating parameters including things like Forward
8212 		 * Error Control, etc.  Various IEEE 802.3 standards dictate
8213 		 * how to interpret these i2c values to determine default
8214 		 * "sutomatic" settings.  We record these for future use when
8215 		 * the user explicitly requests these standards-based values.
8216 		 */
8217 		lc->def_acaps = acaps;
8218 
8219 		/* Some versions of the early T6 Firmware "cheated" when
8220 		 * handling different Transceiver Modules by changing the
8221 		 * underlaying Port Type reported to the Host Drivers.  As
8222 		 * such we need to capture whatever Port Type the Firmware
8223 		 * sends us and record it in case it's different from what we
8224 		 * were told earlier.  Unfortunately, since Firmware is
8225 		 * forever, we'll need to keep this code here forever, but in
8226 		 * later T6 Firmware it should just be an assignment of the
8227 		 * same value already recorded.
8228 		 */
8229 		pi->port_type = port_type;
8230 
8231 		pi->mod_type = mod_type;
8232 		t4_os_portmod_changed(adapter, pi->port_id);
8233 	}
8234 
8235 	if (link_ok != lc->link_ok || speed != lc->speed ||
8236 	    fc != lc->fc || fec != lc->fec) {	/* something changed */
8237 		if (!link_ok && lc->link_ok) {
8238 			lc->link_down_rc = linkdnrc;
8239 			dev_warn(adapter->pdev_dev, "Port %d link down, reason: %s\n",
8240 				 pi->tx_chan, t4_link_down_rc_str(linkdnrc));
8241 		}
8242 		lc->link_ok = link_ok;
8243 		lc->speed = speed;
8244 		lc->fc = fc;
8245 		lc->fec = fec;
8246 
8247 		lc->lpacaps = lpacaps;
8248 		lc->acaps = acaps & ADVERT_MASK;
8249 
8250 		if (lc->acaps & FW_PORT_CAP32_ANEG) {
8251 			lc->autoneg = AUTONEG_ENABLE;
8252 		} else {
8253 			/* When Autoneg is disabled, user needs to set
8254 			 * single speed.
8255 			 * Similar to cxgb4_ethtool.c: set_link_ksettings
8256 			 */
8257 			lc->acaps = 0;
8258 			lc->speed_caps = fwcap_to_fwspeed(acaps);
8259 			lc->autoneg = AUTONEG_DISABLE;
8260 		}
8261 
8262 		t4_os_link_changed(adapter, pi->port_id, link_ok);
8263 	}
8264 }
8265 
8266 /**
8267  *	t4_update_port_info - retrieve and update port information if changed
8268  *	@pi: the port_info
8269  *
8270  *	We issue a Get Port Information Command to the Firmware and, if
8271  *	successful, we check to see if anything is different from what we
8272  *	last recorded and update things accordingly.
8273  */
8274 int t4_update_port_info(struct port_info *pi)
8275 {
8276 	unsigned int fw_caps = pi->adapter->params.fw_caps_support;
8277 	struct fw_port_cmd port_cmd;
8278 	int ret;
8279 
8280 	memset(&port_cmd, 0, sizeof(port_cmd));
8281 	port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
8282 					    FW_CMD_REQUEST_F | FW_CMD_READ_F |
8283 					    FW_PORT_CMD_PORTID_V(pi->tx_chan));
8284 	port_cmd.action_to_len16 = cpu_to_be32(
8285 		FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
8286 				     ? FW_PORT_ACTION_GET_PORT_INFO
8287 				     : FW_PORT_ACTION_GET_PORT_INFO32) |
8288 		FW_LEN16(port_cmd));
8289 	ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox,
8290 			 &port_cmd, sizeof(port_cmd), &port_cmd);
8291 	if (ret)
8292 		return ret;
8293 
8294 	t4_handle_get_port_info(pi, (__be64 *)&port_cmd);
8295 	return 0;
8296 }
8297 
8298 /**
8299  *	t4_get_link_params - retrieve basic link parameters for given port
8300  *	@pi: the port
8301  *	@link_okp: value return pointer for link up/down
8302  *	@speedp: value return pointer for speed (Mb/s)
8303  *	@mtup: value return pointer for mtu
8304  *
8305  *	Retrieves basic link parameters for a port: link up/down, speed (Mb/s),
8306  *	and MTU for a specified port.  A negative error is returned on
8307  *	failure; 0 on success.
8308  */
8309 int t4_get_link_params(struct port_info *pi, unsigned int *link_okp,
8310 		       unsigned int *speedp, unsigned int *mtup)
8311 {
8312 	unsigned int fw_caps = pi->adapter->params.fw_caps_support;
8313 	struct fw_port_cmd port_cmd;
8314 	unsigned int action, link_ok, speed, mtu;
8315 	fw_port_cap32_t linkattr;
8316 	int ret;
8317 
8318 	memset(&port_cmd, 0, sizeof(port_cmd));
8319 	port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
8320 					    FW_CMD_REQUEST_F | FW_CMD_READ_F |
8321 					    FW_PORT_CMD_PORTID_V(pi->tx_chan));
8322 	action = (fw_caps == FW_CAPS16
8323 		  ? FW_PORT_ACTION_GET_PORT_INFO
8324 		  : FW_PORT_ACTION_GET_PORT_INFO32);
8325 	port_cmd.action_to_len16 = cpu_to_be32(
8326 		FW_PORT_CMD_ACTION_V(action) |
8327 		FW_LEN16(port_cmd));
8328 	ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox,
8329 			 &port_cmd, sizeof(port_cmd), &port_cmd);
8330 	if (ret)
8331 		return ret;
8332 
8333 	if (action == FW_PORT_ACTION_GET_PORT_INFO) {
8334 		u32 lstatus = be32_to_cpu(port_cmd.u.info.lstatus_to_modtype);
8335 
8336 		link_ok = !!(lstatus & FW_PORT_CMD_LSTATUS_F);
8337 		linkattr = lstatus_to_fwcap(lstatus);
8338 		mtu = be16_to_cpu(port_cmd.u.info.mtu);
8339 	} else {
8340 		u32 lstatus32 =
8341 			   be32_to_cpu(port_cmd.u.info32.lstatus32_to_cbllen32);
8342 
8343 		link_ok = !!(lstatus32 & FW_PORT_CMD_LSTATUS32_F);
8344 		linkattr = be32_to_cpu(port_cmd.u.info32.linkattr32);
8345 		mtu = FW_PORT_CMD_MTU32_G(
8346 			be32_to_cpu(port_cmd.u.info32.auxlinfo32_mtu32));
8347 	}
8348 	speed = fwcap_to_speed(linkattr);
8349 
8350 	*link_okp = link_ok;
8351 	*speedp = fwcap_to_speed(linkattr);
8352 	*mtup = mtu;
8353 
8354 	return 0;
8355 }
8356 
8357 /**
8358  *      t4_handle_fw_rpl - process a FW reply message
8359  *      @adap: the adapter
8360  *      @rpl: start of the FW message
8361  *
8362  *      Processes a FW message, such as link state change messages.
8363  */
8364 int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
8365 {
8366 	u8 opcode = *(const u8 *)rpl;
8367 
8368 	/* This might be a port command ... this simplifies the following
8369 	 * conditionals ...  We can get away with pre-dereferencing
8370 	 * action_to_len16 because it's in the first 16 bytes and all messages
8371 	 * will be at least that long.
8372 	 */
8373 	const struct fw_port_cmd *p = (const void *)rpl;
8374 	unsigned int action =
8375 		FW_PORT_CMD_ACTION_G(be32_to_cpu(p->action_to_len16));
8376 
8377 	if (opcode == FW_PORT_CMD &&
8378 	    (action == FW_PORT_ACTION_GET_PORT_INFO ||
8379 	     action == FW_PORT_ACTION_GET_PORT_INFO32)) {
8380 		int i;
8381 		int chan = FW_PORT_CMD_PORTID_G(be32_to_cpu(p->op_to_portid));
8382 		struct port_info *pi = NULL;
8383 
8384 		for_each_port(adap, i) {
8385 			pi = adap2pinfo(adap, i);
8386 			if (pi->tx_chan == chan)
8387 				break;
8388 		}
8389 
8390 		t4_handle_get_port_info(pi, rpl);
8391 	} else {
8392 		dev_warn(adap->pdev_dev, "Unknown firmware reply %d\n",
8393 			 opcode);
8394 		return -EINVAL;
8395 	}
8396 	return 0;
8397 }
8398 
8399 static void get_pci_mode(struct adapter *adapter, struct pci_params *p)
8400 {
8401 	u16 val;
8402 
8403 	if (pci_is_pcie(adapter->pdev)) {
8404 		pcie_capability_read_word(adapter->pdev, PCI_EXP_LNKSTA, &val);
8405 		p->speed = val & PCI_EXP_LNKSTA_CLS;
8406 		p->width = (val & PCI_EXP_LNKSTA_NLW) >> 4;
8407 	}
8408 }
8409 
8410 /**
8411  *	init_link_config - initialize a link's SW state
8412  *	@lc: pointer to structure holding the link state
8413  *	@pcaps: link Port Capabilities
8414  *	@acaps: link current Advertised Port Capabilities
8415  *
8416  *	Initializes the SW state maintained for each link, including the link's
8417  *	capabilities and default speed/flow-control/autonegotiation settings.
8418  */
8419 static void init_link_config(struct link_config *lc, fw_port_cap32_t pcaps,
8420 			     fw_port_cap32_t acaps)
8421 {
8422 	lc->pcaps = pcaps;
8423 	lc->def_acaps = acaps;
8424 	lc->lpacaps = 0;
8425 	lc->speed_caps = 0;
8426 	lc->speed = 0;
8427 	lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
8428 
8429 	/* For Forward Error Control, we default to whatever the Firmware
8430 	 * tells us the Link is currently advertising.
8431 	 */
8432 	lc->requested_fec = FEC_AUTO;
8433 	lc->fec = fwcap_to_cc_fec(lc->def_acaps);
8434 
8435 	if (lc->pcaps & FW_PORT_CAP32_ANEG) {
8436 		lc->acaps = lc->pcaps & ADVERT_MASK;
8437 		lc->autoneg = AUTONEG_ENABLE;
8438 		lc->requested_fc |= PAUSE_AUTONEG;
8439 	} else {
8440 		lc->acaps = 0;
8441 		lc->autoneg = AUTONEG_DISABLE;
8442 	}
8443 }
8444 
8445 #define CIM_PF_NOACCESS 0xeeeeeeee
8446 
8447 int t4_wait_dev_ready(void __iomem *regs)
8448 {
8449 	u32 whoami;
8450 
8451 	whoami = readl(regs + PL_WHOAMI_A);
8452 	if (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS)
8453 		return 0;
8454 
8455 	msleep(500);
8456 	whoami = readl(regs + PL_WHOAMI_A);
8457 	return (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS ? 0 : -EIO);
8458 }
8459 
8460 struct flash_desc {
8461 	u32 vendor_and_model_id;
8462 	u32 size_mb;
8463 };
8464 
8465 static int t4_get_flash_params(struct adapter *adap)
8466 {
8467 	/* Table for non-Numonix supported flash parts.  Numonix parts are left
8468 	 * to the preexisting code.  All flash parts have 64KB sectors.
8469 	 */
8470 	static struct flash_desc supported_flash[] = {
8471 		{ 0x150201, 4 << 20 },       /* Spansion 4MB S25FL032P */
8472 	};
8473 
8474 	unsigned int part, manufacturer;
8475 	unsigned int density, size;
8476 	u32 flashid = 0;
8477 	int ret;
8478 
8479 	/* Issue a Read ID Command to the Flash part.  We decode supported
8480 	 * Flash parts and their sizes from this.  There's a newer Query
8481 	 * Command which can retrieve detailed geometry information but many
8482 	 * Flash parts don't support it.
8483 	 */
8484 
8485 	ret = sf1_write(adap, 1, 1, 0, SF_RD_ID);
8486 	if (!ret)
8487 		ret = sf1_read(adap, 3, 0, 1, &flashid);
8488 	t4_write_reg(adap, SF_OP_A, 0);                    /* unlock SF */
8489 	if (ret)
8490 		return ret;
8491 
8492 	/* Check to see if it's one of our non-standard supported Flash parts.
8493 	 */
8494 	for (part = 0; part < ARRAY_SIZE(supported_flash); part++)
8495 		if (supported_flash[part].vendor_and_model_id == flashid) {
8496 			adap->params.sf_size = supported_flash[part].size_mb;
8497 			adap->params.sf_nsec =
8498 				adap->params.sf_size / SF_SEC_SIZE;
8499 			goto found;
8500 		}
8501 
8502 	/* Decode Flash part size.  The code below looks repetative with
8503 	 * common encodings, but that's not guaranteed in the JEDEC
8504 	 * specification for the Read JADEC ID command.  The only thing that
8505 	 * we're guaranteed by the JADEC specification is where the
8506 	 * Manufacturer ID is in the returned result.  After that each
8507 	 * Manufacturer ~could~ encode things completely differently.
8508 	 * Note, all Flash parts must have 64KB sectors.
8509 	 */
8510 	manufacturer = flashid & 0xff;
8511 	switch (manufacturer) {
8512 	case 0x20: { /* Micron/Numonix */
8513 		/* This Density -> Size decoding table is taken from Micron
8514 		 * Data Sheets.
8515 		 */
8516 		density = (flashid >> 16) & 0xff;
8517 		switch (density) {
8518 		case 0x14: /* 1MB */
8519 			size = 1 << 20;
8520 			break;
8521 		case 0x15: /* 2MB */
8522 			size = 1 << 21;
8523 			break;
8524 		case 0x16: /* 4MB */
8525 			size = 1 << 22;
8526 			break;
8527 		case 0x17: /* 8MB */
8528 			size = 1 << 23;
8529 			break;
8530 		case 0x18: /* 16MB */
8531 			size = 1 << 24;
8532 			break;
8533 		case 0x19: /* 32MB */
8534 			size = 1 << 25;
8535 			break;
8536 		case 0x20: /* 64MB */
8537 			size = 1 << 26;
8538 			break;
8539 		case 0x21: /* 128MB */
8540 			size = 1 << 27;
8541 			break;
8542 		case 0x22: /* 256MB */
8543 			size = 1 << 28;
8544 			break;
8545 
8546 		default:
8547 			dev_err(adap->pdev_dev, "Micron Flash Part has bad size, ID = %#x, Density code = %#x\n",
8548 				flashid, density);
8549 			return -EINVAL;
8550 		}
8551 		break;
8552 	}
8553 	case 0xc2: { /* Macronix */
8554 		/* This Density -> Size decoding table is taken from Macronix
8555 		 * Data Sheets.
8556 		 */
8557 		density = (flashid >> 16) & 0xff;
8558 		switch (density) {
8559 		case 0x17: /* 8MB */
8560 			size = 1 << 23;
8561 			break;
8562 		case 0x18: /* 16MB */
8563 			size = 1 << 24;
8564 			break;
8565 		default:
8566 			dev_err(adap->pdev_dev, "Macronix Flash Part has bad size, ID = %#x, Density code = %#x\n",
8567 				flashid, density);
8568 			return -EINVAL;
8569 		}
8570 		break;
8571 	}
8572 	case 0xef: { /* Winbond */
8573 		/* This Density -> Size decoding table is taken from Winbond
8574 		 * Data Sheets.
8575 		 */
8576 		density = (flashid >> 16) & 0xff;
8577 		switch (density) {
8578 		case 0x17: /* 8MB */
8579 			size = 1 << 23;
8580 			break;
8581 		case 0x18: /* 16MB */
8582 			size = 1 << 24;
8583 			break;
8584 		default:
8585 			dev_err(adap->pdev_dev, "Winbond Flash Part has bad size, ID = %#x, Density code = %#x\n",
8586 				flashid, density);
8587 			return -EINVAL;
8588 		}
8589 		break;
8590 	}
8591 	default:
8592 		dev_err(adap->pdev_dev, "Unsupported Flash Part, ID = %#x\n",
8593 			flashid);
8594 		return -EINVAL;
8595 	}
8596 
8597 	/* Store decoded Flash size and fall through into vetting code. */
8598 	adap->params.sf_size = size;
8599 	adap->params.sf_nsec = size / SF_SEC_SIZE;
8600 
8601 found:
8602 	if (adap->params.sf_size < FLASH_MIN_SIZE)
8603 		dev_warn(adap->pdev_dev, "WARNING: Flash Part ID %#x, size %#x < %#x\n",
8604 			 flashid, adap->params.sf_size, FLASH_MIN_SIZE);
8605 	return 0;
8606 }
8607 
8608 /**
8609  *	t4_prep_adapter - prepare SW and HW for operation
8610  *	@adapter: the adapter
8611  *	@reset: if true perform a HW reset
8612  *
8613  *	Initialize adapter SW state for the various HW modules, set initial
8614  *	values for some adapter tunables, take PHYs out of reset, and
8615  *	initialize the MDIO interface.
8616  */
8617 int t4_prep_adapter(struct adapter *adapter)
8618 {
8619 	int ret, ver;
8620 	uint16_t device_id;
8621 	u32 pl_rev;
8622 
8623 	get_pci_mode(adapter, &adapter->params.pci);
8624 	pl_rev = REV_G(t4_read_reg(adapter, PL_REV_A));
8625 
8626 	ret = t4_get_flash_params(adapter);
8627 	if (ret < 0) {
8628 		dev_err(adapter->pdev_dev, "error %d identifying flash\n", ret);
8629 		return ret;
8630 	}
8631 
8632 	/* Retrieve adapter's device ID
8633 	 */
8634 	pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id);
8635 	ver = device_id >> 12;
8636 	adapter->params.chip = 0;
8637 	switch (ver) {
8638 	case CHELSIO_T4:
8639 		adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev);
8640 		adapter->params.arch.sge_fl_db = DBPRIO_F;
8641 		adapter->params.arch.mps_tcam_size =
8642 				 NUM_MPS_CLS_SRAM_L_INSTANCES;
8643 		adapter->params.arch.mps_rplc_size = 128;
8644 		adapter->params.arch.nchan = NCHAN;
8645 		adapter->params.arch.pm_stats_cnt = PM_NSTATS;
8646 		adapter->params.arch.vfcount = 128;
8647 		/* Congestion map is for 4 channels so that
8648 		 * MPS can have 4 priority per port.
8649 		 */
8650 		adapter->params.arch.cng_ch_bits_log = 2;
8651 		break;
8652 	case CHELSIO_T5:
8653 		adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev);
8654 		adapter->params.arch.sge_fl_db = DBPRIO_F | DBTYPE_F;
8655 		adapter->params.arch.mps_tcam_size =
8656 				 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
8657 		adapter->params.arch.mps_rplc_size = 128;
8658 		adapter->params.arch.nchan = NCHAN;
8659 		adapter->params.arch.pm_stats_cnt = PM_NSTATS;
8660 		adapter->params.arch.vfcount = 128;
8661 		adapter->params.arch.cng_ch_bits_log = 2;
8662 		break;
8663 	case CHELSIO_T6:
8664 		adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T6, pl_rev);
8665 		adapter->params.arch.sge_fl_db = 0;
8666 		adapter->params.arch.mps_tcam_size =
8667 				 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
8668 		adapter->params.arch.mps_rplc_size = 256;
8669 		adapter->params.arch.nchan = 2;
8670 		adapter->params.arch.pm_stats_cnt = T6_PM_NSTATS;
8671 		adapter->params.arch.vfcount = 256;
8672 		/* Congestion map will be for 2 channels so that
8673 		 * MPS can have 8 priority per port.
8674 		 */
8675 		adapter->params.arch.cng_ch_bits_log = 3;
8676 		break;
8677 	default:
8678 		dev_err(adapter->pdev_dev, "Device %d is not supported\n",
8679 			device_id);
8680 		return -EINVAL;
8681 	}
8682 
8683 	adapter->params.cim_la_size = CIMLA_SIZE;
8684 	init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
8685 
8686 	/*
8687 	 * Default port for debugging in case we can't reach FW.
8688 	 */
8689 	adapter->params.nports = 1;
8690 	adapter->params.portvec = 1;
8691 	adapter->params.vpd.cclk = 50000;
8692 
8693 	/* Set PCIe completion timeout to 4 seconds. */
8694 	pcie_capability_clear_and_set_word(adapter->pdev, PCI_EXP_DEVCTL2,
8695 					   PCI_EXP_DEVCTL2_COMP_TIMEOUT, 0xd);
8696 	return 0;
8697 }
8698 
8699 /**
8700  *	t4_shutdown_adapter - shut down adapter, host & wire
8701  *	@adapter: the adapter
8702  *
8703  *	Perform an emergency shutdown of the adapter and stop it from
8704  *	continuing any further communication on the ports or DMA to the
8705  *	host.  This is typically used when the adapter and/or firmware
8706  *	have crashed and we want to prevent any further accidental
8707  *	communication with the rest of the world.  This will also force
8708  *	the port Link Status to go down -- if register writes work --
8709  *	which should help our peers figure out that we're down.
8710  */
8711 int t4_shutdown_adapter(struct adapter *adapter)
8712 {
8713 	int port;
8714 
8715 	t4_intr_disable(adapter);
8716 	t4_write_reg(adapter, DBG_GPIO_EN_A, 0);
8717 	for_each_port(adapter, port) {
8718 		u32 a_port_cfg = is_t4(adapter->params.chip) ?
8719 				       PORT_REG(port, XGMAC_PORT_CFG_A) :
8720 				       T5_PORT_REG(port, MAC_PORT_CFG_A);
8721 
8722 		t4_write_reg(adapter, a_port_cfg,
8723 			     t4_read_reg(adapter, a_port_cfg)
8724 			     & ~SIGNAL_DET_V(1));
8725 	}
8726 	t4_set_reg_field(adapter, SGE_CONTROL_A, GLOBALENABLE_F, 0);
8727 
8728 	return 0;
8729 }
8730 
8731 /**
8732  *	t4_bar2_sge_qregs - return BAR2 SGE Queue register information
8733  *	@adapter: the adapter
8734  *	@qid: the Queue ID
8735  *	@qtype: the Ingress or Egress type for @qid
8736  *	@user: true if this request is for a user mode queue
8737  *	@pbar2_qoffset: BAR2 Queue Offset
8738  *	@pbar2_qid: BAR2 Queue ID or 0 for Queue ID inferred SGE Queues
8739  *
8740  *	Returns the BAR2 SGE Queue Registers information associated with the
8741  *	indicated Absolute Queue ID.  These are passed back in return value
8742  *	pointers.  @qtype should be T4_BAR2_QTYPE_EGRESS for Egress Queue
8743  *	and T4_BAR2_QTYPE_INGRESS for Ingress Queues.
8744  *
8745  *	This may return an error which indicates that BAR2 SGE Queue
8746  *	registers aren't available.  If an error is not returned, then the
8747  *	following values are returned:
8748  *
8749  *	  *@pbar2_qoffset: the BAR2 Offset of the @qid Registers
8750  *	  *@pbar2_qid: the BAR2 SGE Queue ID or 0 of @qid
8751  *
8752  *	If the returned BAR2 Queue ID is 0, then BAR2 SGE registers which
8753  *	require the "Inferred Queue ID" ability may be used.  E.g. the
8754  *	Write Combining Doorbell Buffer. If the BAR2 Queue ID is not 0,
8755  *	then these "Inferred Queue ID" register may not be used.
8756  */
8757 int t4_bar2_sge_qregs(struct adapter *adapter,
8758 		      unsigned int qid,
8759 		      enum t4_bar2_qtype qtype,
8760 		      int user,
8761 		      u64 *pbar2_qoffset,
8762 		      unsigned int *pbar2_qid)
8763 {
8764 	unsigned int page_shift, page_size, qpp_shift, qpp_mask;
8765 	u64 bar2_page_offset, bar2_qoffset;
8766 	unsigned int bar2_qid, bar2_qid_offset, bar2_qinferred;
8767 
8768 	/* T4 doesn't support BAR2 SGE Queue registers for kernel mode queues */
8769 	if (!user && is_t4(adapter->params.chip))
8770 		return -EINVAL;
8771 
8772 	/* Get our SGE Page Size parameters.
8773 	 */
8774 	page_shift = adapter->params.sge.hps + 10;
8775 	page_size = 1 << page_shift;
8776 
8777 	/* Get the right Queues per Page parameters for our Queue.
8778 	 */
8779 	qpp_shift = (qtype == T4_BAR2_QTYPE_EGRESS
8780 		     ? adapter->params.sge.eq_qpp
8781 		     : adapter->params.sge.iq_qpp);
8782 	qpp_mask = (1 << qpp_shift) - 1;
8783 
8784 	/*  Calculate the basics of the BAR2 SGE Queue register area:
8785 	 *  o The BAR2 page the Queue registers will be in.
8786 	 *  o The BAR2 Queue ID.
8787 	 *  o The BAR2 Queue ID Offset into the BAR2 page.
8788 	 */
8789 	bar2_page_offset = ((u64)(qid >> qpp_shift) << page_shift);
8790 	bar2_qid = qid & qpp_mask;
8791 	bar2_qid_offset = bar2_qid * SGE_UDB_SIZE;
8792 
8793 	/* If the BAR2 Queue ID Offset is less than the Page Size, then the
8794 	 * hardware will infer the Absolute Queue ID simply from the writes to
8795 	 * the BAR2 Queue ID Offset within the BAR2 Page (and we need to use a
8796 	 * BAR2 Queue ID of 0 for those writes).  Otherwise, we'll simply
8797 	 * write to the first BAR2 SGE Queue Area within the BAR2 Page with
8798 	 * the BAR2 Queue ID and the hardware will infer the Absolute Queue ID
8799 	 * from the BAR2 Page and BAR2 Queue ID.
8800 	 *
8801 	 * One important censequence of this is that some BAR2 SGE registers
8802 	 * have a "Queue ID" field and we can write the BAR2 SGE Queue ID
8803 	 * there.  But other registers synthesize the SGE Queue ID purely
8804 	 * from the writes to the registers -- the Write Combined Doorbell
8805 	 * Buffer is a good example.  These BAR2 SGE Registers are only
8806 	 * available for those BAR2 SGE Register areas where the SGE Absolute
8807 	 * Queue ID can be inferred from simple writes.
8808 	 */
8809 	bar2_qoffset = bar2_page_offset;
8810 	bar2_qinferred = (bar2_qid_offset < page_size);
8811 	if (bar2_qinferred) {
8812 		bar2_qoffset += bar2_qid_offset;
8813 		bar2_qid = 0;
8814 	}
8815 
8816 	*pbar2_qoffset = bar2_qoffset;
8817 	*pbar2_qid = bar2_qid;
8818 	return 0;
8819 }
8820 
8821 /**
8822  *	t4_init_devlog_params - initialize adapter->params.devlog
8823  *	@adap: the adapter
8824  *
8825  *	Initialize various fields of the adapter's Firmware Device Log
8826  *	Parameters structure.
8827  */
8828 int t4_init_devlog_params(struct adapter *adap)
8829 {
8830 	struct devlog_params *dparams = &adap->params.devlog;
8831 	u32 pf_dparams;
8832 	unsigned int devlog_meminfo;
8833 	struct fw_devlog_cmd devlog_cmd;
8834 	int ret;
8835 
8836 	/* If we're dealing with newer firmware, the Device Log Paramerters
8837 	 * are stored in a designated register which allows us to access the
8838 	 * Device Log even if we can't talk to the firmware.
8839 	 */
8840 	pf_dparams =
8841 		t4_read_reg(adap, PCIE_FW_REG(PCIE_FW_PF_A, PCIE_FW_PF_DEVLOG));
8842 	if (pf_dparams) {
8843 		unsigned int nentries, nentries128;
8844 
8845 		dparams->memtype = PCIE_FW_PF_DEVLOG_MEMTYPE_G(pf_dparams);
8846 		dparams->start = PCIE_FW_PF_DEVLOG_ADDR16_G(pf_dparams) << 4;
8847 
8848 		nentries128 = PCIE_FW_PF_DEVLOG_NENTRIES128_G(pf_dparams);
8849 		nentries = (nentries128 + 1) * 128;
8850 		dparams->size = nentries * sizeof(struct fw_devlog_e);
8851 
8852 		return 0;
8853 	}
8854 
8855 	/* Otherwise, ask the firmware for it's Device Log Parameters.
8856 	 */
8857 	memset(&devlog_cmd, 0, sizeof(devlog_cmd));
8858 	devlog_cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_DEVLOG_CMD) |
8859 					     FW_CMD_REQUEST_F | FW_CMD_READ_F);
8860 	devlog_cmd.retval_len16 = cpu_to_be32(FW_LEN16(devlog_cmd));
8861 	ret = t4_wr_mbox(adap, adap->mbox, &devlog_cmd, sizeof(devlog_cmd),
8862 			 &devlog_cmd);
8863 	if (ret)
8864 		return ret;
8865 
8866 	devlog_meminfo =
8867 		be32_to_cpu(devlog_cmd.memtype_devlog_memaddr16_devlog);
8868 	dparams->memtype = FW_DEVLOG_CMD_MEMTYPE_DEVLOG_G(devlog_meminfo);
8869 	dparams->start = FW_DEVLOG_CMD_MEMADDR16_DEVLOG_G(devlog_meminfo) << 4;
8870 	dparams->size = be32_to_cpu(devlog_cmd.memsize_devlog);
8871 
8872 	return 0;
8873 }
8874 
8875 /**
8876  *	t4_init_sge_params - initialize adap->params.sge
8877  *	@adapter: the adapter
8878  *
8879  *	Initialize various fields of the adapter's SGE Parameters structure.
8880  */
8881 int t4_init_sge_params(struct adapter *adapter)
8882 {
8883 	struct sge_params *sge_params = &adapter->params.sge;
8884 	u32 hps, qpp;
8885 	unsigned int s_hps, s_qpp;
8886 
8887 	/* Extract the SGE Page Size for our PF.
8888 	 */
8889 	hps = t4_read_reg(adapter, SGE_HOST_PAGE_SIZE_A);
8890 	s_hps = (HOSTPAGESIZEPF0_S +
8891 		 (HOSTPAGESIZEPF1_S - HOSTPAGESIZEPF0_S) * adapter->pf);
8892 	sge_params->hps = ((hps >> s_hps) & HOSTPAGESIZEPF0_M);
8893 
8894 	/* Extract the SGE Egress and Ingess Queues Per Page for our PF.
8895 	 */
8896 	s_qpp = (QUEUESPERPAGEPF0_S +
8897 		(QUEUESPERPAGEPF1_S - QUEUESPERPAGEPF0_S) * adapter->pf);
8898 	qpp = t4_read_reg(adapter, SGE_EGRESS_QUEUES_PER_PAGE_PF_A);
8899 	sge_params->eq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M);
8900 	qpp = t4_read_reg(adapter, SGE_INGRESS_QUEUES_PER_PAGE_PF_A);
8901 	sge_params->iq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M);
8902 
8903 	return 0;
8904 }
8905 
8906 /**
8907  *      t4_init_tp_params - initialize adap->params.tp
8908  *      @adap: the adapter
8909  *      @sleep_ok: if true we may sleep while awaiting command completion
8910  *
8911  *      Initialize various fields of the adapter's TP Parameters structure.
8912  */
8913 int t4_init_tp_params(struct adapter *adap, bool sleep_ok)
8914 {
8915 	int chan;
8916 	u32 v;
8917 
8918 	v = t4_read_reg(adap, TP_TIMER_RESOLUTION_A);
8919 	adap->params.tp.tre = TIMERRESOLUTION_G(v);
8920 	adap->params.tp.dack_re = DELAYEDACKRESOLUTION_G(v);
8921 
8922 	/* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */
8923 	for (chan = 0; chan < NCHAN; chan++)
8924 		adap->params.tp.tx_modq[chan] = chan;
8925 
8926 	/* Cache the adapter's Compressed Filter Mode and global Incress
8927 	 * Configuration.
8928 	 */
8929 	t4_tp_pio_read(adap, &adap->params.tp.vlan_pri_map, 1,
8930 		       TP_VLAN_PRI_MAP_A, sleep_ok);
8931 	t4_tp_pio_read(adap, &adap->params.tp.ingress_config, 1,
8932 		       TP_INGRESS_CONFIG_A, sleep_ok);
8933 
8934 	/* For T6, cache the adapter's compressed error vector
8935 	 * and passing outer header info for encapsulated packets.
8936 	 */
8937 	if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) {
8938 		v = t4_read_reg(adap, TP_OUT_CONFIG_A);
8939 		adap->params.tp.rx_pkt_encap = (v & CRXPKTENC_F) ? 1 : 0;
8940 	}
8941 
8942 	/* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field
8943 	 * shift positions of several elements of the Compressed Filter Tuple
8944 	 * for this adapter which we need frequently ...
8945 	 */
8946 	adap->params.tp.fcoe_shift = t4_filter_field_shift(adap, FCOE_F);
8947 	adap->params.tp.port_shift = t4_filter_field_shift(adap, PORT_F);
8948 	adap->params.tp.vnic_shift = t4_filter_field_shift(adap, VNIC_ID_F);
8949 	adap->params.tp.vlan_shift = t4_filter_field_shift(adap, VLAN_F);
8950 	adap->params.tp.tos_shift = t4_filter_field_shift(adap, TOS_F);
8951 	adap->params.tp.protocol_shift = t4_filter_field_shift(adap,
8952 							       PROTOCOL_F);
8953 	adap->params.tp.ethertype_shift = t4_filter_field_shift(adap,
8954 								ETHERTYPE_F);
8955 	adap->params.tp.macmatch_shift = t4_filter_field_shift(adap,
8956 							       MACMATCH_F);
8957 	adap->params.tp.matchtype_shift = t4_filter_field_shift(adap,
8958 								MPSHITTYPE_F);
8959 	adap->params.tp.frag_shift = t4_filter_field_shift(adap,
8960 							   FRAGMENTATION_F);
8961 
8962 	/* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID
8963 	 * represents the presence of an Outer VLAN instead of a VNIC ID.
8964 	 */
8965 	if ((adap->params.tp.ingress_config & VNIC_F) == 0)
8966 		adap->params.tp.vnic_shift = -1;
8967 
8968 	v = t4_read_reg(adap, LE_3_DB_HASH_MASK_GEN_IPV4_T6_A);
8969 	adap->params.tp.hash_filter_mask = v;
8970 	v = t4_read_reg(adap, LE_4_DB_HASH_MASK_GEN_IPV4_T6_A);
8971 	adap->params.tp.hash_filter_mask |= ((u64)v << 32);
8972 	return 0;
8973 }
8974 
8975 /**
8976  *      t4_filter_field_shift - calculate filter field shift
8977  *      @adap: the adapter
8978  *      @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits)
8979  *
8980  *      Return the shift position of a filter field within the Compressed
8981  *      Filter Tuple.  The filter field is specified via its selection bit
8982  *      within TP_VLAN_PRI_MAL (filter mode).  E.g. F_VLAN.
8983  */
8984 int t4_filter_field_shift(const struct adapter *adap, int filter_sel)
8985 {
8986 	unsigned int filter_mode = adap->params.tp.vlan_pri_map;
8987 	unsigned int sel;
8988 	int field_shift;
8989 
8990 	if ((filter_mode & filter_sel) == 0)
8991 		return -1;
8992 
8993 	for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) {
8994 		switch (filter_mode & sel) {
8995 		case FCOE_F:
8996 			field_shift += FT_FCOE_W;
8997 			break;
8998 		case PORT_F:
8999 			field_shift += FT_PORT_W;
9000 			break;
9001 		case VNIC_ID_F:
9002 			field_shift += FT_VNIC_ID_W;
9003 			break;
9004 		case VLAN_F:
9005 			field_shift += FT_VLAN_W;
9006 			break;
9007 		case TOS_F:
9008 			field_shift += FT_TOS_W;
9009 			break;
9010 		case PROTOCOL_F:
9011 			field_shift += FT_PROTOCOL_W;
9012 			break;
9013 		case ETHERTYPE_F:
9014 			field_shift += FT_ETHERTYPE_W;
9015 			break;
9016 		case MACMATCH_F:
9017 			field_shift += FT_MACMATCH_W;
9018 			break;
9019 		case MPSHITTYPE_F:
9020 			field_shift += FT_MPSHITTYPE_W;
9021 			break;
9022 		case FRAGMENTATION_F:
9023 			field_shift += FT_FRAGMENTATION_W;
9024 			break;
9025 		}
9026 	}
9027 	return field_shift;
9028 }
9029 
9030 int t4_init_rss_mode(struct adapter *adap, int mbox)
9031 {
9032 	int i, ret;
9033 	struct fw_rss_vi_config_cmd rvc;
9034 
9035 	memset(&rvc, 0, sizeof(rvc));
9036 
9037 	for_each_port(adap, i) {
9038 		struct port_info *p = adap2pinfo(adap, i);
9039 
9040 		rvc.op_to_viid =
9041 			cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) |
9042 				    FW_CMD_REQUEST_F | FW_CMD_READ_F |
9043 				    FW_RSS_VI_CONFIG_CMD_VIID_V(p->viid));
9044 		rvc.retval_len16 = cpu_to_be32(FW_LEN16(rvc));
9045 		ret = t4_wr_mbox(adap, mbox, &rvc, sizeof(rvc), &rvc);
9046 		if (ret)
9047 			return ret;
9048 		p->rss_mode = be32_to_cpu(rvc.u.basicvirtual.defaultq_to_udpen);
9049 	}
9050 	return 0;
9051 }
9052 
9053 /**
9054  *	t4_init_portinfo - allocate a virtual interface and initialize port_info
9055  *	@pi: the port_info
9056  *	@mbox: mailbox to use for the FW command
9057  *	@port: physical port associated with the VI
9058  *	@pf: the PF owning the VI
9059  *	@vf: the VF owning the VI
9060  *	@mac: the MAC address of the VI
9061  *
9062  *	Allocates a virtual interface for the given physical port.  If @mac is
9063  *	not %NULL it contains the MAC address of the VI as assigned by FW.
9064  *	@mac should be large enough to hold an Ethernet address.
9065  *	Returns < 0 on error.
9066  */
9067 int t4_init_portinfo(struct port_info *pi, int mbox,
9068 		     int port, int pf, int vf, u8 mac[])
9069 {
9070 	struct adapter *adapter = pi->adapter;
9071 	unsigned int fw_caps = adapter->params.fw_caps_support;
9072 	struct fw_port_cmd cmd;
9073 	unsigned int rss_size;
9074 	enum fw_port_type port_type;
9075 	int mdio_addr;
9076 	fw_port_cap32_t pcaps, acaps;
9077 	int ret;
9078 
9079 	/* If we haven't yet determined whether we're talking to Firmware
9080 	 * which knows the new 32-bit Port Capabilities, it's time to find
9081 	 * out now.  This will also tell new Firmware to send us Port Status
9082 	 * Updates using the new 32-bit Port Capabilities version of the
9083 	 * Port Information message.
9084 	 */
9085 	if (fw_caps == FW_CAPS_UNKNOWN) {
9086 		u32 param, val;
9087 
9088 		param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) |
9089 			 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_PORT_CAPS32));
9090 		val = 1;
9091 		ret = t4_set_params(adapter, mbox, pf, vf, 1, &param, &val);
9092 		fw_caps = (ret == 0 ? FW_CAPS32 : FW_CAPS16);
9093 		adapter->params.fw_caps_support = fw_caps;
9094 	}
9095 
9096 	memset(&cmd, 0, sizeof(cmd));
9097 	cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
9098 				       FW_CMD_REQUEST_F | FW_CMD_READ_F |
9099 				       FW_PORT_CMD_PORTID_V(port));
9100 	cmd.action_to_len16 = cpu_to_be32(
9101 		FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
9102 				     ? FW_PORT_ACTION_GET_PORT_INFO
9103 				     : FW_PORT_ACTION_GET_PORT_INFO32) |
9104 		FW_LEN16(cmd));
9105 	ret = t4_wr_mbox(pi->adapter, mbox, &cmd, sizeof(cmd), &cmd);
9106 	if (ret)
9107 		return ret;
9108 
9109 	/* Extract the various fields from the Port Information message.
9110 	 */
9111 	if (fw_caps == FW_CAPS16) {
9112 		u32 lstatus = be32_to_cpu(cmd.u.info.lstatus_to_modtype);
9113 
9114 		port_type = FW_PORT_CMD_PTYPE_G(lstatus);
9115 		mdio_addr = ((lstatus & FW_PORT_CMD_MDIOCAP_F)
9116 			     ? FW_PORT_CMD_MDIOADDR_G(lstatus)
9117 			     : -1);
9118 		pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.pcap));
9119 		acaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.acap));
9120 	} else {
9121 		u32 lstatus32 = be32_to_cpu(cmd.u.info32.lstatus32_to_cbllen32);
9122 
9123 		port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32);
9124 		mdio_addr = ((lstatus32 & FW_PORT_CMD_MDIOCAP32_F)
9125 			     ? FW_PORT_CMD_MDIOADDR32_G(lstatus32)
9126 			     : -1);
9127 		pcaps = be32_to_cpu(cmd.u.info32.pcaps32);
9128 		acaps = be32_to_cpu(cmd.u.info32.acaps32);
9129 	}
9130 
9131 	ret = t4_alloc_vi(pi->adapter, mbox, port, pf, vf, 1, mac, &rss_size);
9132 	if (ret < 0)
9133 		return ret;
9134 
9135 	pi->viid = ret;
9136 	pi->tx_chan = port;
9137 	pi->lport = port;
9138 	pi->rss_size = rss_size;
9139 
9140 	pi->port_type = port_type;
9141 	pi->mdio_addr = mdio_addr;
9142 	pi->mod_type = FW_PORT_MOD_TYPE_NA;
9143 
9144 	init_link_config(&pi->link_cfg, pcaps, acaps);
9145 	return 0;
9146 }
9147 
9148 int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
9149 {
9150 	u8 addr[6];
9151 	int ret, i, j = 0;
9152 
9153 	for_each_port(adap, i) {
9154 		struct port_info *pi = adap2pinfo(adap, i);
9155 
9156 		while ((adap->params.portvec & (1 << j)) == 0)
9157 			j++;
9158 
9159 		ret = t4_init_portinfo(pi, mbox, j, pf, vf, addr);
9160 		if (ret)
9161 			return ret;
9162 
9163 		memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
9164 		j++;
9165 	}
9166 	return 0;
9167 }
9168 
9169 /**
9170  *	t4_read_cimq_cfg - read CIM queue configuration
9171  *	@adap: the adapter
9172  *	@base: holds the queue base addresses in bytes
9173  *	@size: holds the queue sizes in bytes
9174  *	@thres: holds the queue full thresholds in bytes
9175  *
9176  *	Returns the current configuration of the CIM queues, starting with
9177  *	the IBQs, then the OBQs.
9178  */
9179 void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres)
9180 {
9181 	unsigned int i, v;
9182 	int cim_num_obq = is_t4(adap->params.chip) ?
9183 				CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
9184 
9185 	for (i = 0; i < CIM_NUM_IBQ; i++) {
9186 		t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, IBQSELECT_F |
9187 			     QUENUMSELECT_V(i));
9188 		v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9189 		/* value is in 256-byte units */
9190 		*base++ = CIMQBASE_G(v) * 256;
9191 		*size++ = CIMQSIZE_G(v) * 256;
9192 		*thres++ = QUEFULLTHRSH_G(v) * 8; /* 8-byte unit */
9193 	}
9194 	for (i = 0; i < cim_num_obq; i++) {
9195 		t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
9196 			     QUENUMSELECT_V(i));
9197 		v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9198 		/* value is in 256-byte units */
9199 		*base++ = CIMQBASE_G(v) * 256;
9200 		*size++ = CIMQSIZE_G(v) * 256;
9201 	}
9202 }
9203 
9204 /**
9205  *	t4_read_cim_ibq - read the contents of a CIM inbound queue
9206  *	@adap: the adapter
9207  *	@qid: the queue index
9208  *	@data: where to store the queue contents
9209  *	@n: capacity of @data in 32-bit words
9210  *
9211  *	Reads the contents of the selected CIM queue starting at address 0 up
9212  *	to the capacity of @data.  @n must be a multiple of 4.  Returns < 0 on
9213  *	error and the number of 32-bit words actually read on success.
9214  */
9215 int t4_read_cim_ibq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
9216 {
9217 	int i, err, attempts;
9218 	unsigned int addr;
9219 	const unsigned int nwords = CIM_IBQ_SIZE * 4;
9220 
9221 	if (qid > 5 || (n & 3))
9222 		return -EINVAL;
9223 
9224 	addr = qid * nwords;
9225 	if (n > nwords)
9226 		n = nwords;
9227 
9228 	/* It might take 3-10ms before the IBQ debug read access is allowed.
9229 	 * Wait for 1 Sec with a delay of 1 usec.
9230 	 */
9231 	attempts = 1000000;
9232 
9233 	for (i = 0; i < n; i++, addr++) {
9234 		t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, IBQDBGADDR_V(addr) |
9235 			     IBQDBGEN_F);
9236 		err = t4_wait_op_done(adap, CIM_IBQ_DBG_CFG_A, IBQDBGBUSY_F, 0,
9237 				      attempts, 1);
9238 		if (err)
9239 			return err;
9240 		*data++ = t4_read_reg(adap, CIM_IBQ_DBG_DATA_A);
9241 	}
9242 	t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, 0);
9243 	return i;
9244 }
9245 
9246 /**
9247  *	t4_read_cim_obq - read the contents of a CIM outbound queue
9248  *	@adap: the adapter
9249  *	@qid: the queue index
9250  *	@data: where to store the queue contents
9251  *	@n: capacity of @data in 32-bit words
9252  *
9253  *	Reads the contents of the selected CIM queue starting at address 0 up
9254  *	to the capacity of @data.  @n must be a multiple of 4.  Returns < 0 on
9255  *	error and the number of 32-bit words actually read on success.
9256  */
9257 int t4_read_cim_obq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
9258 {
9259 	int i, err;
9260 	unsigned int addr, v, nwords;
9261 	int cim_num_obq = is_t4(adap->params.chip) ?
9262 				CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
9263 
9264 	if ((qid > (cim_num_obq - 1)) || (n & 3))
9265 		return -EINVAL;
9266 
9267 	t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
9268 		     QUENUMSELECT_V(qid));
9269 	v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9270 
9271 	addr = CIMQBASE_G(v) * 64;    /* muliple of 256 -> muliple of 4 */
9272 	nwords = CIMQSIZE_G(v) * 64;  /* same */
9273 	if (n > nwords)
9274 		n = nwords;
9275 
9276 	for (i = 0; i < n; i++, addr++) {
9277 		t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, OBQDBGADDR_V(addr) |
9278 			     OBQDBGEN_F);
9279 		err = t4_wait_op_done(adap, CIM_OBQ_DBG_CFG_A, OBQDBGBUSY_F, 0,
9280 				      2, 1);
9281 		if (err)
9282 			return err;
9283 		*data++ = t4_read_reg(adap, CIM_OBQ_DBG_DATA_A);
9284 	}
9285 	t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, 0);
9286 	return i;
9287 }
9288 
9289 /**
9290  *	t4_cim_read - read a block from CIM internal address space
9291  *	@adap: the adapter
9292  *	@addr: the start address within the CIM address space
9293  *	@n: number of words to read
9294  *	@valp: where to store the result
9295  *
9296  *	Reads a block of 4-byte words from the CIM intenal address space.
9297  */
9298 int t4_cim_read(struct adapter *adap, unsigned int addr, unsigned int n,
9299 		unsigned int *valp)
9300 {
9301 	int ret = 0;
9302 
9303 	if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F)
9304 		return -EBUSY;
9305 
9306 	for ( ; !ret && n--; addr += 4) {
9307 		t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr);
9308 		ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F,
9309 				      0, 5, 2);
9310 		if (!ret)
9311 			*valp++ = t4_read_reg(adap, CIM_HOST_ACC_DATA_A);
9312 	}
9313 	return ret;
9314 }
9315 
9316 /**
9317  *	t4_cim_write - write a block into CIM internal address space
9318  *	@adap: the adapter
9319  *	@addr: the start address within the CIM address space
9320  *	@n: number of words to write
9321  *	@valp: set of values to write
9322  *
9323  *	Writes a block of 4-byte words into the CIM intenal address space.
9324  */
9325 int t4_cim_write(struct adapter *adap, unsigned int addr, unsigned int n,
9326 		 const unsigned int *valp)
9327 {
9328 	int ret = 0;
9329 
9330 	if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F)
9331 		return -EBUSY;
9332 
9333 	for ( ; !ret && n--; addr += 4) {
9334 		t4_write_reg(adap, CIM_HOST_ACC_DATA_A, *valp++);
9335 		t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr | HOSTWRITE_F);
9336 		ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F,
9337 				      0, 5, 2);
9338 	}
9339 	return ret;
9340 }
9341 
9342 static int t4_cim_write1(struct adapter *adap, unsigned int addr,
9343 			 unsigned int val)
9344 {
9345 	return t4_cim_write(adap, addr, 1, &val);
9346 }
9347 
9348 /**
9349  *	t4_cim_read_la - read CIM LA capture buffer
9350  *	@adap: the adapter
9351  *	@la_buf: where to store the LA data
9352  *	@wrptr: the HW write pointer within the capture buffer
9353  *
9354  *	Reads the contents of the CIM LA buffer with the most recent entry at
9355  *	the end	of the returned data and with the entry at @wrptr first.
9356  *	We try to leave the LA in the running state we find it in.
9357  */
9358 int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr)
9359 {
9360 	int i, ret;
9361 	unsigned int cfg, val, idx;
9362 
9363 	ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &cfg);
9364 	if (ret)
9365 		return ret;
9366 
9367 	if (cfg & UPDBGLAEN_F) {	/* LA is running, freeze it */
9368 		ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A, 0);
9369 		if (ret)
9370 			return ret;
9371 	}
9372 
9373 	ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val);
9374 	if (ret)
9375 		goto restart;
9376 
9377 	idx = UPDBGLAWRPTR_G(val);
9378 	if (wrptr)
9379 		*wrptr = idx;
9380 
9381 	for (i = 0; i < adap->params.cim_la_size; i++) {
9382 		ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A,
9383 				    UPDBGLARDPTR_V(idx) | UPDBGLARDEN_F);
9384 		if (ret)
9385 			break;
9386 		ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val);
9387 		if (ret)
9388 			break;
9389 		if (val & UPDBGLARDEN_F) {
9390 			ret = -ETIMEDOUT;
9391 			break;
9392 		}
9393 		ret = t4_cim_read(adap, UP_UP_DBG_LA_DATA_A, 1, &la_buf[i]);
9394 		if (ret)
9395 			break;
9396 
9397 		/* Bits 0-3 of UpDbgLaRdPtr can be between 0000 to 1001 to
9398 		 * identify the 32-bit portion of the full 312-bit data
9399 		 */
9400 		if (is_t6(adap->params.chip) && (idx & 0xf) >= 9)
9401 			idx = (idx & 0xff0) + 0x10;
9402 		else
9403 			idx++;
9404 		/* address can't exceed 0xfff */
9405 		idx &= UPDBGLARDPTR_M;
9406 	}
9407 restart:
9408 	if (cfg & UPDBGLAEN_F) {
9409 		int r = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A,
9410 				      cfg & ~UPDBGLARDEN_F);
9411 		if (!ret)
9412 			ret = r;
9413 	}
9414 	return ret;
9415 }
9416 
9417 /**
9418  *	t4_tp_read_la - read TP LA capture buffer
9419  *	@adap: the adapter
9420  *	@la_buf: where to store the LA data
9421  *	@wrptr: the HW write pointer within the capture buffer
9422  *
9423  *	Reads the contents of the TP LA buffer with the most recent entry at
9424  *	the end	of the returned data and with the entry at @wrptr first.
9425  *	We leave the LA in the running state we find it in.
9426  */
9427 void t4_tp_read_la(struct adapter *adap, u64 *la_buf, unsigned int *wrptr)
9428 {
9429 	bool last_incomplete;
9430 	unsigned int i, cfg, val, idx;
9431 
9432 	cfg = t4_read_reg(adap, TP_DBG_LA_CONFIG_A) & 0xffff;
9433 	if (cfg & DBGLAENABLE_F)			/* freeze LA */
9434 		t4_write_reg(adap, TP_DBG_LA_CONFIG_A,
9435 			     adap->params.tp.la_mask | (cfg ^ DBGLAENABLE_F));
9436 
9437 	val = t4_read_reg(adap, TP_DBG_LA_CONFIG_A);
9438 	idx = DBGLAWPTR_G(val);
9439 	last_incomplete = DBGLAMODE_G(val) >= 2 && (val & DBGLAWHLF_F) == 0;
9440 	if (last_incomplete)
9441 		idx = (idx + 1) & DBGLARPTR_M;
9442 	if (wrptr)
9443 		*wrptr = idx;
9444 
9445 	val &= 0xffff;
9446 	val &= ~DBGLARPTR_V(DBGLARPTR_M);
9447 	val |= adap->params.tp.la_mask;
9448 
9449 	for (i = 0; i < TPLA_SIZE; i++) {
9450 		t4_write_reg(adap, TP_DBG_LA_CONFIG_A, DBGLARPTR_V(idx) | val);
9451 		la_buf[i] = t4_read_reg64(adap, TP_DBG_LA_DATAL_A);
9452 		idx = (idx + 1) & DBGLARPTR_M;
9453 	}
9454 
9455 	/* Wipe out last entry if it isn't valid */
9456 	if (last_incomplete)
9457 		la_buf[TPLA_SIZE - 1] = ~0ULL;
9458 
9459 	if (cfg & DBGLAENABLE_F)                    /* restore running state */
9460 		t4_write_reg(adap, TP_DBG_LA_CONFIG_A,
9461 			     cfg | adap->params.tp.la_mask);
9462 }
9463 
9464 /* SGE Hung Ingress DMA Warning Threshold time and Warning Repeat Rate (in
9465  * seconds).  If we find one of the SGE Ingress DMA State Machines in the same
9466  * state for more than the Warning Threshold then we'll issue a warning about
9467  * a potential hang.  We'll repeat the warning as the SGE Ingress DMA Channel
9468  * appears to be hung every Warning Repeat second till the situation clears.
9469  * If the situation clears, we'll note that as well.
9470  */
9471 #define SGE_IDMA_WARN_THRESH 1
9472 #define SGE_IDMA_WARN_REPEAT 300
9473 
9474 /**
9475  *	t4_idma_monitor_init - initialize SGE Ingress DMA Monitor
9476  *	@adapter: the adapter
9477  *	@idma: the adapter IDMA Monitor state
9478  *
9479  *	Initialize the state of an SGE Ingress DMA Monitor.
9480  */
9481 void t4_idma_monitor_init(struct adapter *adapter,
9482 			  struct sge_idma_monitor_state *idma)
9483 {
9484 	/* Initialize the state variables for detecting an SGE Ingress DMA
9485 	 * hang.  The SGE has internal counters which count up on each clock
9486 	 * tick whenever the SGE finds its Ingress DMA State Engines in the
9487 	 * same state they were on the previous clock tick.  The clock used is
9488 	 * the Core Clock so we have a limit on the maximum "time" they can
9489 	 * record; typically a very small number of seconds.  For instance,
9490 	 * with a 600MHz Core Clock, we can only count up to a bit more than
9491 	 * 7s.  So we'll synthesize a larger counter in order to not run the
9492 	 * risk of having the "timers" overflow and give us the flexibility to
9493 	 * maintain a Hung SGE State Machine of our own which operates across
9494 	 * a longer time frame.
9495 	 */
9496 	idma->idma_1s_thresh = core_ticks_per_usec(adapter) * 1000000; /* 1s */
9497 	idma->idma_stalled[0] = 0;
9498 	idma->idma_stalled[1] = 0;
9499 }
9500 
9501 /**
9502  *	t4_idma_monitor - monitor SGE Ingress DMA state
9503  *	@adapter: the adapter
9504  *	@idma: the adapter IDMA Monitor state
9505  *	@hz: number of ticks/second
9506  *	@ticks: number of ticks since the last IDMA Monitor call
9507  */
9508 void t4_idma_monitor(struct adapter *adapter,
9509 		     struct sge_idma_monitor_state *idma,
9510 		     int hz, int ticks)
9511 {
9512 	int i, idma_same_state_cnt[2];
9513 
9514 	 /* Read the SGE Debug Ingress DMA Same State Count registers.  These
9515 	  * are counters inside the SGE which count up on each clock when the
9516 	  * SGE finds its Ingress DMA State Engines in the same states they
9517 	  * were in the previous clock.  The counters will peg out at
9518 	  * 0xffffffff without wrapping around so once they pass the 1s
9519 	  * threshold they'll stay above that till the IDMA state changes.
9520 	  */
9521 	t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 13);
9522 	idma_same_state_cnt[0] = t4_read_reg(adapter, SGE_DEBUG_DATA_HIGH_A);
9523 	idma_same_state_cnt[1] = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9524 
9525 	for (i = 0; i < 2; i++) {
9526 		u32 debug0, debug11;
9527 
9528 		/* If the Ingress DMA Same State Counter ("timer") is less
9529 		 * than 1s, then we can reset our synthesized Stall Timer and
9530 		 * continue.  If we have previously emitted warnings about a
9531 		 * potential stalled Ingress Queue, issue a note indicating
9532 		 * that the Ingress Queue has resumed forward progress.
9533 		 */
9534 		if (idma_same_state_cnt[i] < idma->idma_1s_thresh) {
9535 			if (idma->idma_stalled[i] >= SGE_IDMA_WARN_THRESH * hz)
9536 				dev_warn(adapter->pdev_dev, "SGE idma%d, queue %u, "
9537 					 "resumed after %d seconds\n",
9538 					 i, idma->idma_qid[i],
9539 					 idma->idma_stalled[i] / hz);
9540 			idma->idma_stalled[i] = 0;
9541 			continue;
9542 		}
9543 
9544 		/* Synthesize an SGE Ingress DMA Same State Timer in the Hz
9545 		 * domain.  The first time we get here it'll be because we
9546 		 * passed the 1s Threshold; each additional time it'll be
9547 		 * because the RX Timer Callback is being fired on its regular
9548 		 * schedule.
9549 		 *
9550 		 * If the stall is below our Potential Hung Ingress Queue
9551 		 * Warning Threshold, continue.
9552 		 */
9553 		if (idma->idma_stalled[i] == 0) {
9554 			idma->idma_stalled[i] = hz;
9555 			idma->idma_warn[i] = 0;
9556 		} else {
9557 			idma->idma_stalled[i] += ticks;
9558 			idma->idma_warn[i] -= ticks;
9559 		}
9560 
9561 		if (idma->idma_stalled[i] < SGE_IDMA_WARN_THRESH * hz)
9562 			continue;
9563 
9564 		/* We'll issue a warning every SGE_IDMA_WARN_REPEAT seconds.
9565 		 */
9566 		if (idma->idma_warn[i] > 0)
9567 			continue;
9568 		idma->idma_warn[i] = SGE_IDMA_WARN_REPEAT * hz;
9569 
9570 		/* Read and save the SGE IDMA State and Queue ID information.
9571 		 * We do this every time in case it changes across time ...
9572 		 * can't be too careful ...
9573 		 */
9574 		t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 0);
9575 		debug0 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9576 		idma->idma_state[i] = (debug0 >> (i * 9)) & 0x3f;
9577 
9578 		t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 11);
9579 		debug11 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9580 		idma->idma_qid[i] = (debug11 >> (i * 16)) & 0xffff;
9581 
9582 		dev_warn(adapter->pdev_dev, "SGE idma%u, queue %u, potentially stuck in "
9583 			 "state %u for %d seconds (debug0=%#x, debug11=%#x)\n",
9584 			 i, idma->idma_qid[i], idma->idma_state[i],
9585 			 idma->idma_stalled[i] / hz,
9586 			 debug0, debug11);
9587 		t4_sge_decode_idma_state(adapter, idma->idma_state[i]);
9588 	}
9589 }
9590 
9591 /**
9592  *	t4_load_cfg - download config file
9593  *	@adap: the adapter
9594  *	@cfg_data: the cfg text file to write
9595  *	@size: text file size
9596  *
9597  *	Write the supplied config text file to the card's serial flash.
9598  */
9599 int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size)
9600 {
9601 	int ret, i, n, cfg_addr;
9602 	unsigned int addr;
9603 	unsigned int flash_cfg_start_sec;
9604 	unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
9605 
9606 	cfg_addr = t4_flash_cfg_addr(adap);
9607 	if (cfg_addr < 0)
9608 		return cfg_addr;
9609 
9610 	addr = cfg_addr;
9611 	flash_cfg_start_sec = addr / SF_SEC_SIZE;
9612 
9613 	if (size > FLASH_CFG_MAX_SIZE) {
9614 		dev_err(adap->pdev_dev, "cfg file too large, max is %u bytes\n",
9615 			FLASH_CFG_MAX_SIZE);
9616 		return -EFBIG;
9617 	}
9618 
9619 	i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE,	/* # of sectors spanned */
9620 			 sf_sec_size);
9621 	ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec,
9622 				     flash_cfg_start_sec + i - 1);
9623 	/* If size == 0 then we're simply erasing the FLASH sectors associated
9624 	 * with the on-adapter Firmware Configuration File.
9625 	 */
9626 	if (ret || size == 0)
9627 		goto out;
9628 
9629 	/* this will write to the flash up to SF_PAGE_SIZE at a time */
9630 	for (i = 0; i < size; i += SF_PAGE_SIZE) {
9631 		if ((size - i) <  SF_PAGE_SIZE)
9632 			n = size - i;
9633 		else
9634 			n = SF_PAGE_SIZE;
9635 		ret = t4_write_flash(adap, addr, n, cfg_data);
9636 		if (ret)
9637 			goto out;
9638 
9639 		addr += SF_PAGE_SIZE;
9640 		cfg_data += SF_PAGE_SIZE;
9641 	}
9642 
9643 out:
9644 	if (ret)
9645 		dev_err(adap->pdev_dev, "config file %s failed %d\n",
9646 			(size == 0 ? "clear" : "download"), ret);
9647 	return ret;
9648 }
9649 
9650 /**
9651  *	t4_set_vf_mac - Set MAC address for the specified VF
9652  *	@adapter: The adapter
9653  *	@vf: one of the VFs instantiated by the specified PF
9654  *	@naddr: the number of MAC addresses
9655  *	@addr: the MAC address(es) to be set to the specified VF
9656  */
9657 int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf,
9658 		      unsigned int naddr, u8 *addr)
9659 {
9660 	struct fw_acl_mac_cmd cmd;
9661 
9662 	memset(&cmd, 0, sizeof(cmd));
9663 	cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_MAC_CMD) |
9664 				    FW_CMD_REQUEST_F |
9665 				    FW_CMD_WRITE_F |
9666 				    FW_ACL_MAC_CMD_PFN_V(adapter->pf) |
9667 				    FW_ACL_MAC_CMD_VFN_V(vf));
9668 
9669 	/* Note: Do not enable the ACL */
9670 	cmd.en_to_len16 = cpu_to_be32((unsigned int)FW_LEN16(cmd));
9671 	cmd.nmac = naddr;
9672 
9673 	switch (adapter->pf) {
9674 	case 3:
9675 		memcpy(cmd.macaddr3, addr, sizeof(cmd.macaddr3));
9676 		break;
9677 	case 2:
9678 		memcpy(cmd.macaddr2, addr, sizeof(cmd.macaddr2));
9679 		break;
9680 	case 1:
9681 		memcpy(cmd.macaddr1, addr, sizeof(cmd.macaddr1));
9682 		break;
9683 	case 0:
9684 		memcpy(cmd.macaddr0, addr, sizeof(cmd.macaddr0));
9685 		break;
9686 	}
9687 
9688 	return t4_wr_mbox(adapter, adapter->mbox, &cmd, sizeof(cmd), &cmd);
9689 }
9690 
9691 /**
9692  * t4_read_pace_tbl - read the pace table
9693  * @adap: the adapter
9694  * @pace_vals: holds the returned values
9695  *
9696  * Returns the values of TP's pace table in microseconds.
9697  */
9698 void t4_read_pace_tbl(struct adapter *adap, unsigned int pace_vals[NTX_SCHED])
9699 {
9700 	unsigned int i, v;
9701 
9702 	for (i = 0; i < NTX_SCHED; i++) {
9703 		t4_write_reg(adap, TP_PACE_TABLE_A, 0xffff0000 + i);
9704 		v = t4_read_reg(adap, TP_PACE_TABLE_A);
9705 		pace_vals[i] = dack_ticks_to_usec(adap, v);
9706 	}
9707 }
9708 
9709 /**
9710  * t4_get_tx_sched - get the configuration of a Tx HW traffic scheduler
9711  * @adap: the adapter
9712  * @sched: the scheduler index
9713  * @kbps: the byte rate in Kbps
9714  * @ipg: the interpacket delay in tenths of nanoseconds
9715  * @sleep_ok: if true we may sleep while awaiting command completion
9716  *
9717  * Return the current configuration of a HW Tx scheduler.
9718  */
9719 void t4_get_tx_sched(struct adapter *adap, unsigned int sched,
9720 		     unsigned int *kbps, unsigned int *ipg, bool sleep_ok)
9721 {
9722 	unsigned int v, addr, bpt, cpt;
9723 
9724 	if (kbps) {
9725 		addr = TP_TX_MOD_Q1_Q0_RATE_LIMIT_A - sched / 2;
9726 		t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok);
9727 		if (sched & 1)
9728 			v >>= 16;
9729 		bpt = (v >> 8) & 0xff;
9730 		cpt = v & 0xff;
9731 		if (!cpt) {
9732 			*kbps = 0;	/* scheduler disabled */
9733 		} else {
9734 			v = (adap->params.vpd.cclk * 1000) / cpt; /* ticks/s */
9735 			*kbps = (v * bpt) / 125;
9736 		}
9737 	}
9738 	if (ipg) {
9739 		addr = TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR_A - sched / 2;
9740 		t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok);
9741 		if (sched & 1)
9742 			v >>= 16;
9743 		v &= 0xffff;
9744 		*ipg = (10000 * v) / core_ticks_per_usec(adap);
9745 	}
9746 }
9747 
9748 /* t4_sge_ctxt_rd - read an SGE context through FW
9749  * @adap: the adapter
9750  * @mbox: mailbox to use for the FW command
9751  * @cid: the context id
9752  * @ctype: the context type
9753  * @data: where to store the context data
9754  *
9755  * Issues a FW command through the given mailbox to read an SGE context.
9756  */
9757 int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid,
9758 		   enum ctxt_type ctype, u32 *data)
9759 {
9760 	struct fw_ldst_cmd c;
9761 	int ret;
9762 
9763 	if (ctype == CTXT_FLM)
9764 		ret = FW_LDST_ADDRSPC_SGE_FLMC;
9765 	else
9766 		ret = FW_LDST_ADDRSPC_SGE_CONMC;
9767 
9768 	memset(&c, 0, sizeof(c));
9769 	c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
9770 					FW_CMD_REQUEST_F | FW_CMD_READ_F |
9771 					FW_LDST_CMD_ADDRSPACE_V(ret));
9772 	c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
9773 	c.u.idctxt.physid = cpu_to_be32(cid);
9774 
9775 	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
9776 	if (ret == 0) {
9777 		data[0] = be32_to_cpu(c.u.idctxt.ctxt_data0);
9778 		data[1] = be32_to_cpu(c.u.idctxt.ctxt_data1);
9779 		data[2] = be32_to_cpu(c.u.idctxt.ctxt_data2);
9780 		data[3] = be32_to_cpu(c.u.idctxt.ctxt_data3);
9781 		data[4] = be32_to_cpu(c.u.idctxt.ctxt_data4);
9782 		data[5] = be32_to_cpu(c.u.idctxt.ctxt_data5);
9783 	}
9784 	return ret;
9785 }
9786 
9787 /**
9788  * t4_sge_ctxt_rd_bd - read an SGE context bypassing FW
9789  * @adap: the adapter
9790  * @cid: the context id
9791  * @ctype: the context type
9792  * @data: where to store the context data
9793  *
9794  * Reads an SGE context directly, bypassing FW.  This is only for
9795  * debugging when FW is unavailable.
9796  */
9797 int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid,
9798 		      enum ctxt_type ctype, u32 *data)
9799 {
9800 	int i, ret;
9801 
9802 	t4_write_reg(adap, SGE_CTXT_CMD_A, CTXTQID_V(cid) | CTXTTYPE_V(ctype));
9803 	ret = t4_wait_op_done(adap, SGE_CTXT_CMD_A, BUSY_F, 0, 3, 1);
9804 	if (!ret)
9805 		for (i = SGE_CTXT_DATA0_A; i <= SGE_CTXT_DATA5_A; i += 4)
9806 			*data++ = t4_read_reg(adap, i);
9807 	return ret;
9808 }
9809 
9810 int t4_sched_params(struct adapter *adapter, int type, int level, int mode,
9811 		    int rateunit, int ratemode, int channel, int class,
9812 		    int minrate, int maxrate, int weight, int pktsize)
9813 {
9814 	struct fw_sched_cmd cmd;
9815 
9816 	memset(&cmd, 0, sizeof(cmd));
9817 	cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_SCHED_CMD) |
9818 				      FW_CMD_REQUEST_F |
9819 				      FW_CMD_WRITE_F);
9820 	cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd));
9821 
9822 	cmd.u.params.sc = FW_SCHED_SC_PARAMS;
9823 	cmd.u.params.type = type;
9824 	cmd.u.params.level = level;
9825 	cmd.u.params.mode = mode;
9826 	cmd.u.params.ch = channel;
9827 	cmd.u.params.cl = class;
9828 	cmd.u.params.unit = rateunit;
9829 	cmd.u.params.rate = ratemode;
9830 	cmd.u.params.min = cpu_to_be32(minrate);
9831 	cmd.u.params.max = cpu_to_be32(maxrate);
9832 	cmd.u.params.weight = cpu_to_be16(weight);
9833 	cmd.u.params.pktsize = cpu_to_be16(pktsize);
9834 
9835 	return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd),
9836 			       NULL, 1);
9837 }
9838 
9839 /**
9840  *	t4_i2c_rd - read I2C data from adapter
9841  *	@adap: the adapter
9842  *	@port: Port number if per-port device; <0 if not
9843  *	@devid: per-port device ID or absolute device ID
9844  *	@offset: byte offset into device I2C space
9845  *	@len: byte length of I2C space data
9846  *	@buf: buffer in which to return I2C data
9847  *
9848  *	Reads the I2C data from the indicated device and location.
9849  */
9850 int t4_i2c_rd(struct adapter *adap, unsigned int mbox, int port,
9851 	      unsigned int devid, unsigned int offset,
9852 	      unsigned int len, u8 *buf)
9853 {
9854 	struct fw_ldst_cmd ldst_cmd, ldst_rpl;
9855 	unsigned int i2c_max = sizeof(ldst_cmd.u.i2c.data);
9856 	int ret = 0;
9857 
9858 	if (len > I2C_PAGE_SIZE)
9859 		return -EINVAL;
9860 
9861 	/* Dont allow reads that spans multiple pages */
9862 	if (offset < I2C_PAGE_SIZE && offset + len > I2C_PAGE_SIZE)
9863 		return -EINVAL;
9864 
9865 	memset(&ldst_cmd, 0, sizeof(ldst_cmd));
9866 	ldst_cmd.op_to_addrspace =
9867 		cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
9868 			    FW_CMD_REQUEST_F |
9869 			    FW_CMD_READ_F |
9870 			    FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_I2C));
9871 	ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd));
9872 	ldst_cmd.u.i2c.pid = (port < 0 ? 0xff : port);
9873 	ldst_cmd.u.i2c.did = devid;
9874 
9875 	while (len > 0) {
9876 		unsigned int i2c_len = (len < i2c_max) ? len : i2c_max;
9877 
9878 		ldst_cmd.u.i2c.boffset = offset;
9879 		ldst_cmd.u.i2c.blen = i2c_len;
9880 
9881 		ret = t4_wr_mbox(adap, mbox, &ldst_cmd, sizeof(ldst_cmd),
9882 				 &ldst_rpl);
9883 		if (ret)
9884 			break;
9885 
9886 		memcpy(buf, ldst_rpl.u.i2c.data, i2c_len);
9887 		offset += i2c_len;
9888 		buf += i2c_len;
9889 		len -= i2c_len;
9890 	}
9891 
9892 	return ret;
9893 }
9894 
9895 /**
9896  *      t4_set_vlan_acl - Set a VLAN id for the specified VF
9897  *      @adapter: the adapter
9898  *      @mbox: mailbox to use for the FW command
9899  *      @vf: one of the VFs instantiated by the specified PF
9900  *      @vlan: The vlanid to be set
9901  */
9902 int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf,
9903 		    u16 vlan)
9904 {
9905 	struct fw_acl_vlan_cmd vlan_cmd;
9906 	unsigned int enable;
9907 
9908 	enable = (vlan ? FW_ACL_VLAN_CMD_EN_F : 0);
9909 	memset(&vlan_cmd, 0, sizeof(vlan_cmd));
9910 	vlan_cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_VLAN_CMD) |
9911 					 FW_CMD_REQUEST_F |
9912 					 FW_CMD_WRITE_F |
9913 					 FW_CMD_EXEC_F |
9914 					 FW_ACL_VLAN_CMD_PFN_V(adap->pf) |
9915 					 FW_ACL_VLAN_CMD_VFN_V(vf));
9916 	vlan_cmd.en_to_len16 = cpu_to_be32(enable | FW_LEN16(vlan_cmd));
9917 	/* Drop all packets that donot match vlan id */
9918 	vlan_cmd.dropnovlan_fm = FW_ACL_VLAN_CMD_FM_F;
9919 	if (enable != 0) {
9920 		vlan_cmd.nvlan = 1;
9921 		vlan_cmd.vlanid[0] = cpu_to_be16(vlan);
9922 	}
9923 
9924 	return t4_wr_mbox(adap, adap->mbox, &vlan_cmd, sizeof(vlan_cmd), NULL);
9925 }
9926