blob: d3c2a516fa886b300e305224c5b8c85f7473f145 [file] [log] [blame]
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001/*
2 * This file is part of the Chelsio T4 Ethernet driver for Linux.
3 *
4 * Copyright (c) 2003-2010 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
Dimitris Michailidis56d36be2010-04-01 15:28:23 +000035#include <linux/delay.h>
36#include "cxgb4.h"
37#include "t4_regs.h"
38#include "t4fw_api.h"
39
stephen hemmingerde5b8672013-12-18 14:16:47 -080040static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
41 const u8 *fw_data, unsigned int size, int force);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +000042/**
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 */
Roland Dreierde498c82010-04-21 08:59:17 +000057static int t4_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
58 int polarity, int attempts, int delay, u32 *valp)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +000059{
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
75static 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 */
92void 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 */
Vipul Pandyaf2b7e782012-12-10 09:30:52 +0000113void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
Roland Dreierde498c82010-04-21 08:59:17 +0000114 unsigned int data_reg, u32 *vals,
115 unsigned int nregs, unsigned int start_idx)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000116{
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
Vipul Pandya13ee15d2012-09-26 02:39:40 +0000124/**
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 */
136void 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
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000146/*
147 * Get the reply to a mailbox command and store it in @rpl in big-endian order.
148 */
149static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit,
150 u32 mbox_addr)
151{
152 for ( ; nflit; nflit--, mbox_addr += 8)
153 *rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr));
154}
155
156/*
157 * Handle a FW assertion reported in a mailbox.
158 */
159static void fw_asrt(struct adapter *adap, u32 mbox_addr)
160{
161 struct fw_debug_cmd asrt;
162
163 get_mbox_rpl(adap, (__be64 *)&asrt, sizeof(asrt) / 8, mbox_addr);
164 dev_alert(adap->pdev_dev,
165 "FW assertion at %.16s:%u, val0 %#x, val1 %#x\n",
166 asrt.u.assert.filename_0_7, ntohl(asrt.u.assert.line),
167 ntohl(asrt.u.assert.x), ntohl(asrt.u.assert.y));
168}
169
170static void dump_mbox(struct adapter *adap, int mbox, u32 data_reg)
171{
172 dev_err(adap->pdev_dev,
173 "mbox %d: %llx %llx %llx %llx %llx %llx %llx %llx\n", mbox,
174 (unsigned long long)t4_read_reg64(adap, data_reg),
175 (unsigned long long)t4_read_reg64(adap, data_reg + 8),
176 (unsigned long long)t4_read_reg64(adap, data_reg + 16),
177 (unsigned long long)t4_read_reg64(adap, data_reg + 24),
178 (unsigned long long)t4_read_reg64(adap, data_reg + 32),
179 (unsigned long long)t4_read_reg64(adap, data_reg + 40),
180 (unsigned long long)t4_read_reg64(adap, data_reg + 48),
181 (unsigned long long)t4_read_reg64(adap, data_reg + 56));
182}
183
184/**
185 * t4_wr_mbox_meat - send a command to FW through the given mailbox
186 * @adap: the adapter
187 * @mbox: index of the mailbox to use
188 * @cmd: the command to write
189 * @size: command length in bytes
190 * @rpl: where to optionally store the reply
191 * @sleep_ok: if true we may sleep while awaiting command completion
192 *
193 * Sends the given command to FW through the selected mailbox and waits
194 * for the FW to execute the command. If @rpl is not %NULL it is used to
195 * store the FW's reply to the command. The command and its optional
196 * reply are of the same length. FW can take up to %FW_CMD_MAX_TIMEOUT ms
197 * to respond. @sleep_ok determines whether we may sleep while awaiting
198 * the response. If sleeping is allowed we use progressive backoff
199 * otherwise we spin.
200 *
201 * The return value is 0 on success or a negative errno on failure. A
202 * failure can happen either because we are not able to execute the
203 * command or FW executes it but signals an error. In the latter case
204 * the return value is the error code indicated by FW (negated).
205 */
206int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size,
207 void *rpl, bool sleep_ok)
208{
Joe Perches005b5712010-12-14 21:36:53 +0000209 static const int delay[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000210 1, 1, 3, 5, 10, 10, 20, 50, 100, 200
211 };
212
213 u32 v;
214 u64 res;
215 int i, ms, delay_idx;
216 const __be64 *p = cmd;
217 u32 data_reg = PF_REG(mbox, CIM_PF_MAILBOX_DATA);
218 u32 ctl_reg = PF_REG(mbox, CIM_PF_MAILBOX_CTRL);
219
220 if ((size & 15) || size > MBOX_LEN)
221 return -EINVAL;
222
Dimitris Michailidis204dc3c2010-06-18 10:05:29 +0000223 /*
224 * If the device is off-line, as in EEH, commands will time out.
225 * Fail them early so we don't waste time waiting.
226 */
227 if (adap->pdev->error_state != pci_channel_io_normal)
228 return -EIO;
229
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000230 v = MBOWNER_GET(t4_read_reg(adap, ctl_reg));
231 for (i = 0; v == MBOX_OWNER_NONE && i < 3; i++)
232 v = MBOWNER_GET(t4_read_reg(adap, ctl_reg));
233
234 if (v != MBOX_OWNER_DRV)
235 return v ? -EBUSY : -ETIMEDOUT;
236
237 for (i = 0; i < size; i += 8)
238 t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++));
239
240 t4_write_reg(adap, ctl_reg, MBMSGVALID | MBOWNER(MBOX_OWNER_FW));
241 t4_read_reg(adap, ctl_reg); /* flush write */
242
243 delay_idx = 0;
244 ms = delay[0];
245
246 for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
247 if (sleep_ok) {
248 ms = delay[delay_idx]; /* last element may repeat */
249 if (delay_idx < ARRAY_SIZE(delay) - 1)
250 delay_idx++;
251 msleep(ms);
252 } else
253 mdelay(ms);
254
255 v = t4_read_reg(adap, ctl_reg);
256 if (MBOWNER_GET(v) == MBOX_OWNER_DRV) {
257 if (!(v & MBMSGVALID)) {
258 t4_write_reg(adap, ctl_reg, 0);
259 continue;
260 }
261
262 res = t4_read_reg64(adap, data_reg);
263 if (FW_CMD_OP_GET(res >> 32) == FW_DEBUG_CMD) {
264 fw_asrt(adap, data_reg);
265 res = FW_CMD_RETVAL(EIO);
266 } else if (rpl)
267 get_mbox_rpl(adap, rpl, size / 8, data_reg);
268
269 if (FW_CMD_RETVAL_GET((int)res))
270 dump_mbox(adap, mbox, data_reg);
271 t4_write_reg(adap, ctl_reg, 0);
272 return -FW_CMD_RETVAL_GET((int)res);
273 }
274 }
275
276 dump_mbox(adap, mbox, data_reg);
277 dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n",
278 *(const u8 *)cmd, mbox);
279 return -ETIMEDOUT;
280}
281
282/**
283 * t4_mc_read - read from MC through backdoor accesses
284 * @adap: the adapter
285 * @addr: address of first byte requested
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000286 * @idx: which MC to access
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000287 * @data: 64 bytes of data containing the requested address
288 * @ecc: where to store the corresponding 64-bit ECC word
289 *
290 * Read 64 bytes of data from MC starting at a 64-byte-aligned address
291 * that covers the requested address @addr. If @parity is not %NULL it
292 * is assigned the 64-bit ECC word for the read data.
293 */
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000294int t4_mc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000295{
296 int i;
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000297 u32 mc_bist_cmd, mc_bist_cmd_addr, mc_bist_cmd_len;
298 u32 mc_bist_status_rdata, mc_bist_data_pattern;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000299
Hariprasad Shenaid14807d2013-12-03 17:05:56 +0530300 if (is_t4(adap->params.chip)) {
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000301 mc_bist_cmd = MC_BIST_CMD;
302 mc_bist_cmd_addr = MC_BIST_CMD_ADDR;
303 mc_bist_cmd_len = MC_BIST_CMD_LEN;
304 mc_bist_status_rdata = MC_BIST_STATUS_RDATA;
305 mc_bist_data_pattern = MC_BIST_DATA_PATTERN;
306 } else {
307 mc_bist_cmd = MC_REG(MC_P_BIST_CMD, idx);
308 mc_bist_cmd_addr = MC_REG(MC_P_BIST_CMD_ADDR, idx);
309 mc_bist_cmd_len = MC_REG(MC_P_BIST_CMD_LEN, idx);
310 mc_bist_status_rdata = MC_REG(MC_P_BIST_STATUS_RDATA, idx);
311 mc_bist_data_pattern = MC_REG(MC_P_BIST_DATA_PATTERN, idx);
312 }
313
314 if (t4_read_reg(adap, mc_bist_cmd) & START_BIST)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000315 return -EBUSY;
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000316 t4_write_reg(adap, mc_bist_cmd_addr, addr & ~0x3fU);
317 t4_write_reg(adap, mc_bist_cmd_len, 64);
318 t4_write_reg(adap, mc_bist_data_pattern, 0xc);
319 t4_write_reg(adap, mc_bist_cmd, BIST_OPCODE(1) | START_BIST |
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000320 BIST_CMD_GAP(1));
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000321 i = t4_wait_op_done(adap, mc_bist_cmd, START_BIST, 0, 10, 1);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000322 if (i)
323 return i;
324
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000325#define MC_DATA(i) MC_BIST_STATUS_REG(mc_bist_status_rdata, i)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000326
327 for (i = 15; i >= 0; i--)
328 *data++ = htonl(t4_read_reg(adap, MC_DATA(i)));
329 if (ecc)
330 *ecc = t4_read_reg64(adap, MC_DATA(16));
331#undef MC_DATA
332 return 0;
333}
334
335/**
336 * t4_edc_read - read from EDC through backdoor accesses
337 * @adap: the adapter
338 * @idx: which EDC to access
339 * @addr: address of first byte requested
340 * @data: 64 bytes of data containing the requested address
341 * @ecc: where to store the corresponding 64-bit ECC word
342 *
343 * Read 64 bytes of data from EDC starting at a 64-byte-aligned address
344 * that covers the requested address @addr. If @parity is not %NULL it
345 * is assigned the 64-bit ECC word for the read data.
346 */
347int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
348{
349 int i;
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000350 u32 edc_bist_cmd, edc_bist_cmd_addr, edc_bist_cmd_len;
351 u32 edc_bist_cmd_data_pattern, edc_bist_status_rdata;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000352
Hariprasad Shenaid14807d2013-12-03 17:05:56 +0530353 if (is_t4(adap->params.chip)) {
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000354 edc_bist_cmd = EDC_REG(EDC_BIST_CMD, idx);
355 edc_bist_cmd_addr = EDC_REG(EDC_BIST_CMD_ADDR, idx);
356 edc_bist_cmd_len = EDC_REG(EDC_BIST_CMD_LEN, idx);
357 edc_bist_cmd_data_pattern = EDC_REG(EDC_BIST_DATA_PATTERN,
358 idx);
359 edc_bist_status_rdata = EDC_REG(EDC_BIST_STATUS_RDATA,
360 idx);
361 } else {
362 edc_bist_cmd = EDC_REG_T5(EDC_H_BIST_CMD, idx);
363 edc_bist_cmd_addr = EDC_REG_T5(EDC_H_BIST_CMD_ADDR, idx);
364 edc_bist_cmd_len = EDC_REG_T5(EDC_H_BIST_CMD_LEN, idx);
365 edc_bist_cmd_data_pattern =
366 EDC_REG_T5(EDC_H_BIST_DATA_PATTERN, idx);
367 edc_bist_status_rdata =
368 EDC_REG_T5(EDC_H_BIST_STATUS_RDATA, idx);
369 }
370
371 if (t4_read_reg(adap, edc_bist_cmd) & START_BIST)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000372 return -EBUSY;
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000373 t4_write_reg(adap, edc_bist_cmd_addr, addr & ~0x3fU);
374 t4_write_reg(adap, edc_bist_cmd_len, 64);
375 t4_write_reg(adap, edc_bist_cmd_data_pattern, 0xc);
376 t4_write_reg(adap, edc_bist_cmd,
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000377 BIST_OPCODE(1) | BIST_CMD_GAP(1) | START_BIST);
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000378 i = t4_wait_op_done(adap, edc_bist_cmd, START_BIST, 0, 10, 1);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000379 if (i)
380 return i;
381
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000382#define EDC_DATA(i) (EDC_BIST_STATUS_REG(edc_bist_status_rdata, i))
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000383
384 for (i = 15; i >= 0; i--)
385 *data++ = htonl(t4_read_reg(adap, EDC_DATA(i)));
386 if (ecc)
387 *ecc = t4_read_reg64(adap, EDC_DATA(16));
388#undef EDC_DATA
389 return 0;
390}
391
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000392/*
393 * t4_mem_win_rw - read/write memory through PCIE memory window
394 * @adap: the adapter
395 * @addr: address of first byte requested
396 * @data: MEMWIN0_APERTURE bytes of data containing the requested address
397 * @dir: direction of transfer 1 => read, 0 => write
398 *
399 * Read/write MEMWIN0_APERTURE bytes of data from MC starting at a
400 * MEMWIN0_APERTURE-byte-aligned address that covers the requested
401 * address @addr.
402 */
403static int t4_mem_win_rw(struct adapter *adap, u32 addr, __be32 *data, int dir)
404{
405 int i;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +0530406 u32 win_pf = is_t4(adap->params.chip) ? 0 : V_PFNUM(adap->fn);
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000407
408 /*
409 * Setup offset into PCIE memory window. Address must be a
410 * MEMWIN0_APERTURE-byte-aligned address. (Read back MA register to
411 * ensure that changes propagate before we attempt to use the new
412 * values.)
413 */
414 t4_write_reg(adap, PCIE_MEM_ACCESS_OFFSET,
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000415 (addr & ~(MEMWIN0_APERTURE - 1)) | win_pf);
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000416 t4_read_reg(adap, PCIE_MEM_ACCESS_OFFSET);
417
418 /* Collecting data 4 bytes at a time upto MEMWIN0_APERTURE */
419 for (i = 0; i < MEMWIN0_APERTURE; i = i+0x4) {
420 if (dir)
Vipul Pandya404d9e32012-10-08 02:59:43 +0000421 *data++ = (__force __be32) t4_read_reg(adap,
422 (MEMWIN0_BASE + i));
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000423 else
Vipul Pandya404d9e32012-10-08 02:59:43 +0000424 t4_write_reg(adap, (MEMWIN0_BASE + i),
425 (__force u32) *data++);
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000426 }
427
428 return 0;
429}
430
431/**
432 * t4_memory_rw - read/write EDC 0, EDC 1 or MC via PCIE memory window
433 * @adap: the adapter
434 * @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC
435 * @addr: address within indicated memory type
436 * @len: amount of memory to transfer
437 * @buf: host memory buffer
438 * @dir: direction of transfer 1 => read, 0 => write
439 *
440 * Reads/writes an [almost] arbitrary memory region in the firmware: the
441 * firmware memory address, length and host buffer must be aligned on
442 * 32-bit boudaries. The memory is transferred as a raw byte sequence
443 * from/to the firmware's memory. If this memory contains data
444 * structures which contain multi-byte integers, it's the callers
445 * responsibility to perform appropriate byte order conversions.
446 */
447static int t4_memory_rw(struct adapter *adap, int mtype, u32 addr, u32 len,
448 __be32 *buf, int dir)
449{
450 u32 pos, start, end, offset, memoffset;
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000451 u32 edc_size, mc_size;
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000452 int ret = 0;
453 __be32 *data;
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000454
455 /*
456 * Argument sanity checks ...
457 */
458 if ((addr & 0x3) || (len & 0x3))
459 return -EINVAL;
460
Dan Carpenter594f88e92012-10-08 10:12:11 +0300461 data = vmalloc(MEMWIN0_APERTURE);
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000462 if (!data)
463 return -ENOMEM;
464
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000465 /* Offset into the region of memory which is being accessed
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000466 * MEM_EDC0 = 0
467 * MEM_EDC1 = 1
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000468 * MEM_MC = 2 -- T4
469 * MEM_MC0 = 2 -- For T5
470 * MEM_MC1 = 3 -- For T5
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000471 */
Santosh Rastapur19dd37b2013-03-14 05:08:53 +0000472 edc_size = EDRAM_SIZE_GET(t4_read_reg(adap, MA_EDRAM0_BAR));
473 if (mtype != MEM_MC1)
474 memoffset = (mtype * (edc_size * 1024 * 1024));
475 else {
476 mc_size = EXT_MEM_SIZE_GET(t4_read_reg(adap,
477 MA_EXT_MEMORY_BAR));
478 memoffset = (MEM_MC0 * edc_size + mc_size) * 1024 * 1024;
479 }
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000480
481 /* Determine the PCIE_MEM_ACCESS_OFFSET */
482 addr = addr + memoffset;
483
484 /*
485 * The underlaying EDC/MC read routines read MEMWIN0_APERTURE bytes
486 * at a time so we need to round down the start and round up the end.
487 * We'll start copying out of the first line at (addr - start) a word
488 * at a time.
489 */
490 start = addr & ~(MEMWIN0_APERTURE-1);
491 end = (addr + len + MEMWIN0_APERTURE-1) & ~(MEMWIN0_APERTURE-1);
492 offset = (addr - start)/sizeof(__be32);
493
494 for (pos = start; pos < end; pos += MEMWIN0_APERTURE, offset = 0) {
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000495
496 /*
497 * If we're writing, copy the data from the caller's memory
498 * buffer
499 */
500 if (!dir) {
501 /*
502 * If we're doing a partial write, then we need to do
503 * a read-modify-write ...
504 */
505 if (offset || len < MEMWIN0_APERTURE) {
506 ret = t4_mem_win_rw(adap, pos, data, 1);
507 if (ret)
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000508 break;
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000509 }
510 while (offset < (MEMWIN0_APERTURE/sizeof(__be32)) &&
511 len > 0) {
512 data[offset++] = *buf++;
513 len -= sizeof(__be32);
514 }
515 }
516
517 /*
518 * Transfer a block of memory and bail if there's an error.
519 */
520 ret = t4_mem_win_rw(adap, pos, data, dir);
521 if (ret)
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000522 break;
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000523
524 /*
525 * If we're reading, copy the data into the caller's memory
526 * buffer.
527 */
528 if (dir)
529 while (offset < (MEMWIN0_APERTURE/sizeof(__be32)) &&
530 len > 0) {
531 *buf++ = data[offset++];
532 len -= sizeof(__be32);
533 }
534 }
535
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000536 vfree(data);
537 return ret;
Vipul Pandya5afc8b82012-09-26 02:39:37 +0000538}
539
540int t4_memory_write(struct adapter *adap, int mtype, u32 addr, u32 len,
541 __be32 *buf)
542{
543 return t4_memory_rw(adap, mtype, addr, len, buf, 0);
544}
545
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000546#define EEPROM_STAT_ADDR 0x7bfc
Santosh Rastapur47ce9c42013-03-08 03:35:29 +0000547#define VPD_BASE 0x400
548#define VPD_BASE_OLD 0
Santosh Rastapur0a57a532013-03-14 05:08:49 +0000549#define VPD_LEN 1024
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000550
551/**
552 * t4_seeprom_wp - enable/disable EEPROM write protection
553 * @adapter: the adapter
554 * @enable: whether to enable or disable write protection
555 *
556 * Enables or disables write protection on the serial EEPROM.
557 */
558int t4_seeprom_wp(struct adapter *adapter, bool enable)
559{
560 unsigned int v = enable ? 0xc : 0;
561 int ret = pci_write_vpd(adapter->pdev, EEPROM_STAT_ADDR, 4, &v);
562 return ret < 0 ? ret : 0;
563}
564
565/**
566 * get_vpd_params - read VPD parameters from VPD EEPROM
567 * @adapter: adapter to read
568 * @p: where to store the parameters
569 *
570 * Reads card parameters stored in VPD EEPROM.
571 */
Vipul Pandya636f9d32012-09-26 02:39:39 +0000572int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000573{
Vipul Pandya636f9d32012-09-26 02:39:39 +0000574 u32 cclk_param, cclk_val;
Santosh Rastapur47ce9c42013-03-08 03:35:29 +0000575 int i, ret, addr;
Kumar Sanghvia94cd702014-02-18 17:56:09 +0530576 int ec, sn, pn;
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000577 u8 *vpd, csum;
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000578 unsigned int vpdr_len, kw_offset, id_len;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000579
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000580 vpd = vmalloc(VPD_LEN);
581 if (!vpd)
582 return -ENOMEM;
583
Santosh Rastapur47ce9c42013-03-08 03:35:29 +0000584 ret = pci_read_vpd(adapter->pdev, VPD_BASE, sizeof(u32), vpd);
585 if (ret < 0)
586 goto out;
587 addr = *vpd == 0x82 ? VPD_BASE : VPD_BASE_OLD;
588
589 ret = pci_read_vpd(adapter->pdev, addr, VPD_LEN, vpd);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000590 if (ret < 0)
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000591 goto out;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000592
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000593 if (vpd[0] != PCI_VPD_LRDT_ID_STRING) {
594 dev_err(adapter->pdev_dev, "missing VPD ID string\n");
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000595 ret = -EINVAL;
596 goto out;
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000597 }
598
599 id_len = pci_vpd_lrdt_size(vpd);
600 if (id_len > ID_LEN)
601 id_len = ID_LEN;
602
603 i = pci_vpd_find_tag(vpd, 0, VPD_LEN, PCI_VPD_LRDT_RO_DATA);
604 if (i < 0) {
605 dev_err(adapter->pdev_dev, "missing VPD-R section\n");
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000606 ret = -EINVAL;
607 goto out;
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000608 }
609
610 vpdr_len = pci_vpd_lrdt_size(&vpd[i]);
611 kw_offset = i + PCI_VPD_LRDT_TAG_SIZE;
612 if (vpdr_len + kw_offset > VPD_LEN) {
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000613 dev_err(adapter->pdev_dev, "bad VPD-R length %u\n", vpdr_len);
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000614 ret = -EINVAL;
615 goto out;
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000616 }
617
618#define FIND_VPD_KW(var, name) do { \
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000619 var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000620 if (var < 0) { \
621 dev_err(adapter->pdev_dev, "missing VPD keyword " name "\n"); \
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000622 ret = -EINVAL; \
623 goto out; \
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000624 } \
625 var += PCI_VPD_INFO_FLD_HDR_SIZE; \
626} while (0)
627
628 FIND_VPD_KW(i, "RV");
629 for (csum = 0; i >= 0; i--)
630 csum += vpd[i];
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000631
632 if (csum) {
633 dev_err(adapter->pdev_dev,
634 "corrupted VPD EEPROM, actual csum %u\n", csum);
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000635 ret = -EINVAL;
636 goto out;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000637 }
638
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000639 FIND_VPD_KW(ec, "EC");
640 FIND_VPD_KW(sn, "SN");
Kumar Sanghvia94cd702014-02-18 17:56:09 +0530641 FIND_VPD_KW(pn, "PN");
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000642#undef FIND_VPD_KW
643
Dimitris Michailidis23d88e12010-12-14 21:36:54 +0000644 memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000645 strim(p->id);
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000646 memcpy(p->ec, vpd + ec, EC_LEN);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000647 strim(p->ec);
Dimitris Michailidis226ec5f2010-04-27 12:24:15 +0000648 i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
649 memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000650 strim(p->sn);
Kumar Sanghvia94cd702014-02-18 17:56:09 +0530651 memcpy(p->pn, vpd + pn, min(i, PN_LEN));
652 strim(p->pn);
Vipul Pandya636f9d32012-09-26 02:39:39 +0000653
654 /*
655 * Ask firmware for the Core Clock since it knows how to translate the
656 * Reference Clock ('V2') VPD field into a Core Clock value ...
657 */
658 cclk_param = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
659 FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_CCLK));
660 ret = t4_query_params(adapter, adapter->mbox, 0, 0,
661 1, &cclk_param, &cclk_val);
Vipul Pandya8c357eb2012-10-03 03:22:32 +0000662
663out:
664 vfree(vpd);
Vipul Pandya636f9d32012-09-26 02:39:39 +0000665 if (ret)
666 return ret;
667 p->cclk = cclk_val;
668
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000669 return 0;
670}
671
672/* serial flash and firmware constants */
673enum {
674 SF_ATTEMPTS = 10, /* max retries for SF operations */
675
676 /* flash command opcodes */
677 SF_PROG_PAGE = 2, /* program page */
678 SF_WR_DISABLE = 4, /* disable writes */
679 SF_RD_STATUS = 5, /* read status register */
680 SF_WR_ENABLE = 6, /* enable writes */
681 SF_RD_DATA_FAST = 0xb, /* read flash */
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000682 SF_RD_ID = 0x9f, /* read ID */
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000683 SF_ERASE_SECTOR = 0xd8, /* erase sector */
684
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000685 FW_MAX_SIZE = 512 * 1024,
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000686};
687
688/**
689 * sf1_read - read data from the serial flash
690 * @adapter: the adapter
691 * @byte_cnt: number of bytes to read
692 * @cont: whether another operation will be chained
693 * @lock: whether to lock SF for PL access only
694 * @valp: where to store the read data
695 *
696 * Reads up to 4 bytes of data from the serial flash. The location of
697 * the read needs to be specified prior to calling this by issuing the
698 * appropriate commands to the serial flash.
699 */
700static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
701 int lock, u32 *valp)
702{
703 int ret;
704
705 if (!byte_cnt || byte_cnt > 4)
706 return -EINVAL;
Naresh Kumar Innace91a922012-11-15 22:41:17 +0530707 if (t4_read_reg(adapter, SF_OP) & SF_BUSY)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000708 return -EBUSY;
709 cont = cont ? SF_CONT : 0;
710 lock = lock ? SF_LOCK : 0;
711 t4_write_reg(adapter, SF_OP, lock | cont | BYTECNT(byte_cnt - 1));
Naresh Kumar Innace91a922012-11-15 22:41:17 +0530712 ret = t4_wait_op_done(adapter, SF_OP, SF_BUSY, 0, SF_ATTEMPTS, 5);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000713 if (!ret)
714 *valp = t4_read_reg(adapter, SF_DATA);
715 return ret;
716}
717
718/**
719 * sf1_write - write data to the serial flash
720 * @adapter: the adapter
721 * @byte_cnt: number of bytes to write
722 * @cont: whether another operation will be chained
723 * @lock: whether to lock SF for PL access only
724 * @val: value to write
725 *
726 * Writes up to 4 bytes of data to the serial flash. The location of
727 * the write needs to be specified prior to calling this by issuing the
728 * appropriate commands to the serial flash.
729 */
730static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
731 int lock, u32 val)
732{
733 if (!byte_cnt || byte_cnt > 4)
734 return -EINVAL;
Naresh Kumar Innace91a922012-11-15 22:41:17 +0530735 if (t4_read_reg(adapter, SF_OP) & SF_BUSY)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000736 return -EBUSY;
737 cont = cont ? SF_CONT : 0;
738 lock = lock ? SF_LOCK : 0;
739 t4_write_reg(adapter, SF_DATA, val);
740 t4_write_reg(adapter, SF_OP, lock |
741 cont | BYTECNT(byte_cnt - 1) | OP_WR);
Naresh Kumar Innace91a922012-11-15 22:41:17 +0530742 return t4_wait_op_done(adapter, SF_OP, SF_BUSY, 0, SF_ATTEMPTS, 5);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000743}
744
745/**
746 * flash_wait_op - wait for a flash operation to complete
747 * @adapter: the adapter
748 * @attempts: max number of polls of the status register
749 * @delay: delay between polls in ms
750 *
751 * Wait for a flash operation to complete by polling the status register.
752 */
753static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
754{
755 int ret;
756 u32 status;
757
758 while (1) {
759 if ((ret = sf1_write(adapter, 1, 1, 1, SF_RD_STATUS)) != 0 ||
760 (ret = sf1_read(adapter, 1, 0, 1, &status)) != 0)
761 return ret;
762 if (!(status & 1))
763 return 0;
764 if (--attempts == 0)
765 return -EAGAIN;
766 if (delay)
767 msleep(delay);
768 }
769}
770
771/**
772 * t4_read_flash - read words from serial flash
773 * @adapter: the adapter
774 * @addr: the start address for the read
775 * @nwords: how many 32-bit words to read
776 * @data: where to store the read data
777 * @byte_oriented: whether to store data as bytes or as words
778 *
779 * Read the specified number of 32-bit words from the serial flash.
780 * If @byte_oriented is set the read data is stored as a byte array
781 * (i.e., big-endian), otherwise as 32-bit words in the platform's
782 * natural endianess.
783 */
Roland Dreierde498c82010-04-21 08:59:17 +0000784static int t4_read_flash(struct adapter *adapter, unsigned int addr,
785 unsigned int nwords, u32 *data, int byte_oriented)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000786{
787 int ret;
788
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000789 if (addr + nwords * sizeof(u32) > adapter->params.sf_size || (addr & 3))
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000790 return -EINVAL;
791
792 addr = swab32(addr) | SF_RD_DATA_FAST;
793
794 if ((ret = sf1_write(adapter, 4, 1, 0, addr)) != 0 ||
795 (ret = sf1_read(adapter, 1, 1, 0, data)) != 0)
796 return ret;
797
798 for ( ; nwords; nwords--, data++) {
799 ret = sf1_read(adapter, 4, nwords > 1, nwords == 1, data);
800 if (nwords == 1)
801 t4_write_reg(adapter, SF_OP, 0); /* unlock SF */
802 if (ret)
803 return ret;
804 if (byte_oriented)
Vipul Pandya404d9e32012-10-08 02:59:43 +0000805 *data = (__force __u32) (htonl(*data));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000806 }
807 return 0;
808}
809
810/**
811 * t4_write_flash - write up to a page of data to the serial flash
812 * @adapter: the adapter
813 * @addr: the start address to write
814 * @n: length of data to write in bytes
815 * @data: the data to write
816 *
817 * Writes up to a page of data (256 bytes) to the serial flash starting
818 * at the given address. All the data must be written to the same page.
819 */
820static int t4_write_flash(struct adapter *adapter, unsigned int addr,
821 unsigned int n, const u8 *data)
822{
823 int ret;
824 u32 buf[64];
825 unsigned int i, c, left, val, offset = addr & 0xff;
826
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000827 if (addr >= adapter->params.sf_size || offset + n > SF_PAGE_SIZE)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000828 return -EINVAL;
829
830 val = swab32(addr) | SF_PROG_PAGE;
831
832 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
833 (ret = sf1_write(adapter, 4, 1, 1, val)) != 0)
834 goto unlock;
835
836 for (left = n; left; left -= c) {
837 c = min(left, 4U);
838 for (val = 0, i = 0; i < c; ++i)
839 val = (val << 8) + *data++;
840
841 ret = sf1_write(adapter, c, c != left, 1, val);
842 if (ret)
843 goto unlock;
844 }
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000845 ret = flash_wait_op(adapter, 8, 1);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000846 if (ret)
847 goto unlock;
848
849 t4_write_reg(adapter, SF_OP, 0); /* unlock SF */
850
851 /* Read the page to verify the write succeeded */
852 ret = t4_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
853 if (ret)
854 return ret;
855
856 if (memcmp(data - n, (u8 *)buf + offset, n)) {
857 dev_err(adapter->pdev_dev,
858 "failed to correctly write the flash page at %#x\n",
859 addr);
860 return -EIO;
861 }
862 return 0;
863
864unlock:
865 t4_write_reg(adapter, SF_OP, 0); /* unlock SF */
866 return ret;
867}
868
869/**
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530870 * t4_get_fw_version - read the firmware version
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000871 * @adapter: the adapter
872 * @vers: where to place the version
873 *
874 * Reads the FW version from flash.
875 */
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530876int t4_get_fw_version(struct adapter *adapter, u32 *vers)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000877{
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530878 return t4_read_flash(adapter, FLASH_FW_START +
879 offsetof(struct fw_hdr, fw_ver), 1,
880 vers, 0);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000881}
882
883/**
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530884 * t4_get_tp_version - read the TP microcode version
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000885 * @adapter: the adapter
886 * @vers: where to place the version
887 *
888 * Reads the TP microcode version from flash.
889 */
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530890int t4_get_tp_version(struct adapter *adapter, u32 *vers)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000891{
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530892 return t4_read_flash(adapter, FLASH_FW_START +
Dimitris Michailidis900a6592010-06-18 10:05:27 +0000893 offsetof(struct fw_hdr, tp_microcode_ver),
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000894 1, vers, 0);
895}
896
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530897/* Is the given firmware API compatible with the one the driver was compiled
898 * with?
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000899 */
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530900static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000901{
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000902
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530903 /* short circuit if it's the exact same firmware version */
904 if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
905 return 1;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000906
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530907#define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
908 if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
909 SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe))
910 return 1;
911#undef SAME_INTF
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000912
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530913 return 0;
914}
915
916/* The firmware in the filesystem is usable, but should it be installed?
917 * This routine explains itself in detail if it indicates the filesystem
918 * firmware should be installed.
919 */
920static int should_install_fs_fw(struct adapter *adap, int card_fw_usable,
921 int k, int c)
922{
923 const char *reason;
924
925 if (!card_fw_usable) {
926 reason = "incompatible or unusable";
927 goto install;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000928 }
929
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530930 if (k > c) {
931 reason = "older than the version supported with this driver";
932 goto install;
Jay Hernandeze69972f2013-05-30 03:24:14 +0000933 }
934
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530935 return 0;
Santosh Rastapur0a57a532013-03-14 05:08:49 +0000936
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530937install:
938 dev_err(adap->pdev_dev, "firmware on card (%u.%u.%u.%u) is %s, "
939 "installing firmware %u.%u.%u.%u on card.\n",
940 FW_HDR_FW_VER_MAJOR_GET(c), FW_HDR_FW_VER_MINOR_GET(c),
941 FW_HDR_FW_VER_MICRO_GET(c), FW_HDR_FW_VER_BUILD_GET(c), reason,
942 FW_HDR_FW_VER_MAJOR_GET(k), FW_HDR_FW_VER_MINOR_GET(k),
943 FW_HDR_FW_VER_MICRO_GET(k), FW_HDR_FW_VER_BUILD_GET(k));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000944
Dimitris Michailidis56d36be2010-04-01 15:28:23 +0000945 return 1;
946}
947
Hariprasad Shenai16e47622013-12-03 17:05:58 +0530948int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
949 const u8 *fw_data, unsigned int fw_size,
950 struct fw_hdr *card_fw, enum dev_state state,
951 int *reset)
952{
953 int ret, card_fw_usable, fs_fw_usable;
954 const struct fw_hdr *fs_fw;
955 const struct fw_hdr *drv_fw;
956
957 drv_fw = &fw_info->fw_hdr;
958
959 /* Read the header of the firmware on the card */
960 ret = -t4_read_flash(adap, FLASH_FW_START,
961 sizeof(*card_fw) / sizeof(uint32_t),
962 (uint32_t *)card_fw, 1);
963 if (ret == 0) {
964 card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw);
965 } else {
966 dev_err(adap->pdev_dev,
967 "Unable to read card's firmware header: %d\n", ret);
968 card_fw_usable = 0;
969 }
970
971 if (fw_data != NULL) {
972 fs_fw = (const void *)fw_data;
973 fs_fw_usable = fw_compatible(drv_fw, fs_fw);
974 } else {
975 fs_fw = NULL;
976 fs_fw_usable = 0;
977 }
978
979 if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
980 (!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) {
981 /* Common case: the firmware on the card is an exact match and
982 * the filesystem one is an exact match too, or the filesystem
983 * one is absent/incompatible.
984 */
985 } else if (fs_fw_usable && state == DEV_STATE_UNINIT &&
986 should_install_fs_fw(adap, card_fw_usable,
987 be32_to_cpu(fs_fw->fw_ver),
988 be32_to_cpu(card_fw->fw_ver))) {
989 ret = -t4_fw_upgrade(adap, adap->mbox, fw_data,
990 fw_size, 0);
991 if (ret != 0) {
992 dev_err(adap->pdev_dev,
993 "failed to install firmware: %d\n", ret);
994 goto bye;
995 }
996
997 /* Installed successfully, update the cached header too. */
998 memcpy(card_fw, fs_fw, sizeof(*card_fw));
999 card_fw_usable = 1;
1000 *reset = 0; /* already reset as part of load_fw */
1001 }
1002
1003 if (!card_fw_usable) {
1004 uint32_t d, c, k;
1005
1006 d = be32_to_cpu(drv_fw->fw_ver);
1007 c = be32_to_cpu(card_fw->fw_ver);
1008 k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0;
1009
1010 dev_err(adap->pdev_dev, "Cannot find a usable firmware: "
1011 "chip state %d, "
1012 "driver compiled with %d.%d.%d.%d, "
1013 "card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n",
1014 state,
1015 FW_HDR_FW_VER_MAJOR_GET(d), FW_HDR_FW_VER_MINOR_GET(d),
1016 FW_HDR_FW_VER_MICRO_GET(d), FW_HDR_FW_VER_BUILD_GET(d),
1017 FW_HDR_FW_VER_MAJOR_GET(c), FW_HDR_FW_VER_MINOR_GET(c),
1018 FW_HDR_FW_VER_MICRO_GET(c), FW_HDR_FW_VER_BUILD_GET(c),
1019 FW_HDR_FW_VER_MAJOR_GET(k), FW_HDR_FW_VER_MINOR_GET(k),
1020 FW_HDR_FW_VER_MICRO_GET(k), FW_HDR_FW_VER_BUILD_GET(k));
1021 ret = EINVAL;
1022 goto bye;
1023 }
1024
1025 /* We're using whatever's on the card and it's known to be good. */
1026 adap->params.fw_vers = be32_to_cpu(card_fw->fw_ver);
1027 adap->params.tp_vers = be32_to_cpu(card_fw->tp_microcode_ver);
1028
1029bye:
1030 return ret;
1031}
1032
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001033/**
1034 * t4_flash_erase_sectors - erase a range of flash sectors
1035 * @adapter: the adapter
1036 * @start: the first sector to erase
1037 * @end: the last sector to erase
1038 *
1039 * Erases the sectors in the given inclusive range.
1040 */
1041static int t4_flash_erase_sectors(struct adapter *adapter, int start, int end)
1042{
1043 int ret = 0;
1044
1045 while (start <= end) {
1046 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
1047 (ret = sf1_write(adapter, 4, 0, 1,
1048 SF_ERASE_SECTOR | (start << 8))) != 0 ||
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001049 (ret = flash_wait_op(adapter, 14, 500)) != 0) {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001050 dev_err(adapter->pdev_dev,
1051 "erase of flash sector %d failed, error %d\n",
1052 start, ret);
1053 break;
1054 }
1055 start++;
1056 }
1057 t4_write_reg(adapter, SF_OP, 0); /* unlock SF */
1058 return ret;
1059}
1060
1061/**
Vipul Pandya636f9d32012-09-26 02:39:39 +00001062 * t4_flash_cfg_addr - return the address of the flash configuration file
1063 * @adapter: the adapter
1064 *
1065 * Return the address within the flash where the Firmware Configuration
1066 * File is stored.
1067 */
1068unsigned int t4_flash_cfg_addr(struct adapter *adapter)
1069{
1070 if (adapter->params.sf_size == 0x100000)
1071 return FLASH_FPGA_CFG_START;
1072 else
1073 return FLASH_CFG_START;
1074}
1075
1076/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001077 * t4_load_fw - download firmware
1078 * @adap: the adapter
1079 * @fw_data: the firmware image to write
1080 * @size: image size
1081 *
1082 * Write the supplied firmware image to the card's serial flash.
1083 */
1084int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size)
1085{
1086 u32 csum;
1087 int ret, addr;
1088 unsigned int i;
1089 u8 first_page[SF_PAGE_SIZE];
Vipul Pandya404d9e32012-10-08 02:59:43 +00001090 const __be32 *p = (const __be32 *)fw_data;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001091 const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data;
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001092 unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
1093 unsigned int fw_img_start = adap->params.sf_fw_start;
1094 unsigned int fw_start_sec = fw_img_start / sf_sec_size;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001095
1096 if (!size) {
1097 dev_err(adap->pdev_dev, "FW image has no data\n");
1098 return -EINVAL;
1099 }
1100 if (size & 511) {
1101 dev_err(adap->pdev_dev,
1102 "FW image size not multiple of 512 bytes\n");
1103 return -EINVAL;
1104 }
1105 if (ntohs(hdr->len512) * 512 != size) {
1106 dev_err(adap->pdev_dev,
1107 "FW image size differs from size in FW header\n");
1108 return -EINVAL;
1109 }
1110 if (size > FW_MAX_SIZE) {
1111 dev_err(adap->pdev_dev, "FW image too large, max is %u bytes\n",
1112 FW_MAX_SIZE);
1113 return -EFBIG;
1114 }
1115
1116 for (csum = 0, i = 0; i < size / sizeof(csum); i++)
1117 csum += ntohl(p[i]);
1118
1119 if (csum != 0xffffffff) {
1120 dev_err(adap->pdev_dev,
1121 "corrupted firmware image, checksum %#x\n", csum);
1122 return -EINVAL;
1123 }
1124
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001125 i = DIV_ROUND_UP(size, sf_sec_size); /* # of sectors spanned */
1126 ret = t4_flash_erase_sectors(adap, fw_start_sec, fw_start_sec + i - 1);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001127 if (ret)
1128 goto out;
1129
1130 /*
1131 * We write the correct version at the end so the driver can see a bad
1132 * version if the FW write fails. Start by writing a copy of the
1133 * first page with a bad version.
1134 */
1135 memcpy(first_page, fw_data, SF_PAGE_SIZE);
1136 ((struct fw_hdr *)first_page)->fw_ver = htonl(0xffffffff);
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001137 ret = t4_write_flash(adap, fw_img_start, SF_PAGE_SIZE, first_page);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001138 if (ret)
1139 goto out;
1140
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001141 addr = fw_img_start;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001142 for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
1143 addr += SF_PAGE_SIZE;
1144 fw_data += SF_PAGE_SIZE;
1145 ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, fw_data);
1146 if (ret)
1147 goto out;
1148 }
1149
1150 ret = t4_write_flash(adap,
Dimitris Michailidis900a6592010-06-18 10:05:27 +00001151 fw_img_start + offsetof(struct fw_hdr, fw_ver),
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001152 sizeof(hdr->fw_ver), (const u8 *)&hdr->fw_ver);
1153out:
1154 if (ret)
1155 dev_err(adap->pdev_dev, "firmware download failed, error %d\n",
1156 ret);
1157 return ret;
1158}
1159
1160#define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
Kumar Sanghvi72aca4b2014-02-18 17:56:08 +05301161 FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_40G | \
1162 FW_PORT_CAP_ANEG)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001163
1164/**
1165 * t4_link_start - apply link configuration to MAC/PHY
1166 * @phy: the PHY to setup
1167 * @mac: the MAC to setup
1168 * @lc: the requested link configuration
1169 *
1170 * Set up a port's MAC and PHY according to a desired link configuration.
1171 * - If the PHY can auto-negotiate first decide what to advertise, then
1172 * enable/disable auto-negotiation as desired, and reset.
1173 * - If the PHY does not auto-negotiate just reset it.
1174 * - If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
1175 * otherwise do it later based on the outcome of auto-negotiation.
1176 */
1177int t4_link_start(struct adapter *adap, unsigned int mbox, unsigned int port,
1178 struct link_config *lc)
1179{
1180 struct fw_port_cmd c;
1181 unsigned int fc = 0, mdi = FW_PORT_MDI(FW_PORT_MDI_AUTO);
1182
1183 lc->link_ok = 0;
1184 if (lc->requested_fc & PAUSE_RX)
1185 fc |= FW_PORT_CAP_FC_RX;
1186 if (lc->requested_fc & PAUSE_TX)
1187 fc |= FW_PORT_CAP_FC_TX;
1188
1189 memset(&c, 0, sizeof(c));
1190 c.op_to_portid = htonl(FW_CMD_OP(FW_PORT_CMD) | FW_CMD_REQUEST |
1191 FW_CMD_EXEC | FW_PORT_CMD_PORTID(port));
1192 c.action_to_len16 = htonl(FW_PORT_CMD_ACTION(FW_PORT_ACTION_L1_CFG) |
1193 FW_LEN16(c));
1194
1195 if (!(lc->supported & FW_PORT_CAP_ANEG)) {
1196 c.u.l1cfg.rcap = htonl((lc->supported & ADVERT_MASK) | fc);
1197 lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1198 } else if (lc->autoneg == AUTONEG_DISABLE) {
1199 c.u.l1cfg.rcap = htonl(lc->requested_speed | fc | mdi);
1200 lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1201 } else
1202 c.u.l1cfg.rcap = htonl(lc->advertising | fc | mdi);
1203
1204 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
1205}
1206
1207/**
1208 * t4_restart_aneg - restart autonegotiation
1209 * @adap: the adapter
1210 * @mbox: mbox to use for the FW command
1211 * @port: the port id
1212 *
1213 * Restarts autonegotiation for the selected port.
1214 */
1215int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port)
1216{
1217 struct fw_port_cmd c;
1218
1219 memset(&c, 0, sizeof(c));
1220 c.op_to_portid = htonl(FW_CMD_OP(FW_PORT_CMD) | FW_CMD_REQUEST |
1221 FW_CMD_EXEC | FW_PORT_CMD_PORTID(port));
1222 c.action_to_len16 = htonl(FW_PORT_CMD_ACTION(FW_PORT_ACTION_L1_CFG) |
1223 FW_LEN16(c));
1224 c.u.l1cfg.rcap = htonl(FW_PORT_CAP_ANEG);
1225 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
1226}
1227
Vipul Pandya8caa1e82012-05-18 15:29:25 +05301228typedef void (*int_handler_t)(struct adapter *adap);
1229
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001230struct intr_info {
1231 unsigned int mask; /* bits to check in interrupt status */
1232 const char *msg; /* message to print or NULL */
1233 short stat_idx; /* stat counter to increment or -1 */
1234 unsigned short fatal; /* whether the condition reported is fatal */
Vipul Pandya8caa1e82012-05-18 15:29:25 +05301235 int_handler_t int_handler; /* platform-specific int handler */
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001236};
1237
1238/**
1239 * t4_handle_intr_status - table driven interrupt handler
1240 * @adapter: the adapter that generated the interrupt
1241 * @reg: the interrupt status register to process
1242 * @acts: table of interrupt actions
1243 *
1244 * A table driven interrupt handler that applies a set of masks to an
1245 * interrupt status word and performs the corresponding actions if the
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001246 * interrupts described by the mask have occurred. The actions include
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001247 * optionally emitting a warning or alert message. The table is terminated
1248 * by an entry specifying mask 0. Returns the number of fatal interrupt
1249 * conditions.
1250 */
1251static int t4_handle_intr_status(struct adapter *adapter, unsigned int reg,
1252 const struct intr_info *acts)
1253{
1254 int fatal = 0;
1255 unsigned int mask = 0;
1256 unsigned int status = t4_read_reg(adapter, reg);
1257
1258 for ( ; acts->mask; ++acts) {
1259 if (!(status & acts->mask))
1260 continue;
1261 if (acts->fatal) {
1262 fatal++;
1263 dev_alert(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
1264 status & acts->mask);
1265 } else if (acts->msg && printk_ratelimit())
1266 dev_warn(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
1267 status & acts->mask);
Vipul Pandya8caa1e82012-05-18 15:29:25 +05301268 if (acts->int_handler)
1269 acts->int_handler(adapter);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001270 mask |= acts->mask;
1271 }
1272 status &= mask;
1273 if (status) /* clear processed interrupts */
1274 t4_write_reg(adapter, reg, status);
1275 return fatal;
1276}
1277
1278/*
1279 * Interrupt handler for the PCIE module.
1280 */
1281static void pcie_intr_handler(struct adapter *adapter)
1282{
Joe Perches005b5712010-12-14 21:36:53 +00001283 static const struct intr_info sysbus_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001284 { RNPP, "RXNP array parity error", -1, 1 },
1285 { RPCP, "RXPC array parity error", -1, 1 },
1286 { RCIP, "RXCIF array parity error", -1, 1 },
1287 { RCCP, "Rx completions control array parity error", -1, 1 },
1288 { RFTP, "RXFT array parity error", -1, 1 },
1289 { 0 }
1290 };
Joe Perches005b5712010-12-14 21:36:53 +00001291 static const struct intr_info pcie_port_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001292 { TPCP, "TXPC array parity error", -1, 1 },
1293 { TNPP, "TXNP array parity error", -1, 1 },
1294 { TFTP, "TXFT array parity error", -1, 1 },
1295 { TCAP, "TXCA array parity error", -1, 1 },
1296 { TCIP, "TXCIF array parity error", -1, 1 },
1297 { RCAP, "RXCA array parity error", -1, 1 },
1298 { OTDD, "outbound request TLP discarded", -1, 1 },
1299 { RDPE, "Rx data parity error", -1, 1 },
1300 { TDUE, "Tx uncorrectable data error", -1, 1 },
1301 { 0 }
1302 };
Joe Perches005b5712010-12-14 21:36:53 +00001303 static const struct intr_info pcie_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001304 { MSIADDRLPERR, "MSI AddrL parity error", -1, 1 },
1305 { MSIADDRHPERR, "MSI AddrH parity error", -1, 1 },
1306 { MSIDATAPERR, "MSI data parity error", -1, 1 },
1307 { MSIXADDRLPERR, "MSI-X AddrL parity error", -1, 1 },
1308 { MSIXADDRHPERR, "MSI-X AddrH parity error", -1, 1 },
1309 { MSIXDATAPERR, "MSI-X data parity error", -1, 1 },
1310 { MSIXDIPERR, "MSI-X DI parity error", -1, 1 },
1311 { PIOCPLPERR, "PCI PIO completion FIFO parity error", -1, 1 },
1312 { PIOREQPERR, "PCI PIO request FIFO parity error", -1, 1 },
1313 { TARTAGPERR, "PCI PCI target tag FIFO parity error", -1, 1 },
1314 { CCNTPERR, "PCI CMD channel count parity error", -1, 1 },
1315 { CREQPERR, "PCI CMD channel request parity error", -1, 1 },
1316 { CRSPPERR, "PCI CMD channel response parity error", -1, 1 },
1317 { DCNTPERR, "PCI DMA channel count parity error", -1, 1 },
1318 { DREQPERR, "PCI DMA channel request parity error", -1, 1 },
1319 { DRSPPERR, "PCI DMA channel response parity error", -1, 1 },
1320 { HCNTPERR, "PCI HMA channel count parity error", -1, 1 },
1321 { HREQPERR, "PCI HMA channel request parity error", -1, 1 },
1322 { HRSPPERR, "PCI HMA channel response parity error", -1, 1 },
1323 { CFGSNPPERR, "PCI config snoop FIFO parity error", -1, 1 },
1324 { FIDPERR, "PCI FID parity error", -1, 1 },
1325 { INTXCLRPERR, "PCI INTx clear parity error", -1, 1 },
1326 { MATAGPERR, "PCI MA tag parity error", -1, 1 },
1327 { PIOTAGPERR, "PCI PIO tag parity error", -1, 1 },
1328 { RXCPLPERR, "PCI Rx completion parity error", -1, 1 },
1329 { RXWRPERR, "PCI Rx write parity error", -1, 1 },
1330 { RPLPERR, "PCI replay buffer parity error", -1, 1 },
1331 { PCIESINT, "PCI core secondary fault", -1, 1 },
1332 { PCIEPINT, "PCI core primary fault", -1, 1 },
1333 { UNXSPLCPLERR, "PCI unexpected split completion error", -1, 0 },
1334 { 0 }
1335 };
1336
Santosh Rastapur0a57a532013-03-14 05:08:49 +00001337 static struct intr_info t5_pcie_intr_info[] = {
1338 { MSTGRPPERR, "Master Response Read Queue parity error",
1339 -1, 1 },
1340 { MSTTIMEOUTPERR, "Master Timeout FIFO parity error", -1, 1 },
1341 { MSIXSTIPERR, "MSI-X STI SRAM parity error", -1, 1 },
1342 { MSIXADDRLPERR, "MSI-X AddrL parity error", -1, 1 },
1343 { MSIXADDRHPERR, "MSI-X AddrH parity error", -1, 1 },
1344 { MSIXDATAPERR, "MSI-X data parity error", -1, 1 },
1345 { MSIXDIPERR, "MSI-X DI parity error", -1, 1 },
1346 { PIOCPLGRPPERR, "PCI PIO completion Group FIFO parity error",
1347 -1, 1 },
1348 { PIOREQGRPPERR, "PCI PIO request Group FIFO parity error",
1349 -1, 1 },
1350 { TARTAGPERR, "PCI PCI target tag FIFO parity error", -1, 1 },
1351 { MSTTAGQPERR, "PCI master tag queue parity error", -1, 1 },
1352 { CREQPERR, "PCI CMD channel request parity error", -1, 1 },
1353 { CRSPPERR, "PCI CMD channel response parity error", -1, 1 },
1354 { DREQWRPERR, "PCI DMA channel write request parity error",
1355 -1, 1 },
1356 { DREQPERR, "PCI DMA channel request parity error", -1, 1 },
1357 { DRSPPERR, "PCI DMA channel response parity error", -1, 1 },
1358 { HREQWRPERR, "PCI HMA channel count parity error", -1, 1 },
1359 { HREQPERR, "PCI HMA channel request parity error", -1, 1 },
1360 { HRSPPERR, "PCI HMA channel response parity error", -1, 1 },
1361 { CFGSNPPERR, "PCI config snoop FIFO parity error", -1, 1 },
1362 { FIDPERR, "PCI FID parity error", -1, 1 },
1363 { VFIDPERR, "PCI INTx clear parity error", -1, 1 },
1364 { MAGRPPERR, "PCI MA group FIFO parity error", -1, 1 },
1365 { PIOTAGPERR, "PCI PIO tag parity error", -1, 1 },
1366 { IPRXHDRGRPPERR, "PCI IP Rx header group parity error",
1367 -1, 1 },
1368 { IPRXDATAGRPPERR, "PCI IP Rx data group parity error", -1, 1 },
1369 { RPLPERR, "PCI IP replay buffer parity error", -1, 1 },
1370 { IPSOTPERR, "PCI IP SOT buffer parity error", -1, 1 },
1371 { TRGT1GRPPERR, "PCI TRGT1 group FIFOs parity error", -1, 1 },
1372 { READRSPERR, "Outbound read error", -1, 0 },
1373 { 0 }
1374 };
1375
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001376 int fat;
1377
1378 fat = t4_handle_intr_status(adapter,
1379 PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS,
1380 sysbus_intr_info) +
1381 t4_handle_intr_status(adapter,
1382 PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
1383 pcie_port_intr_info) +
Santosh Rastapur0a57a532013-03-14 05:08:49 +00001384 t4_handle_intr_status(adapter, PCIE_INT_CAUSE,
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05301385 is_t4(adapter->params.chip) ?
Santosh Rastapur0a57a532013-03-14 05:08:49 +00001386 pcie_intr_info : t5_pcie_intr_info);
1387
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001388 if (fat)
1389 t4_fatal_err(adapter);
1390}
1391
1392/*
1393 * TP interrupt handler.
1394 */
1395static void tp_intr_handler(struct adapter *adapter)
1396{
Joe Perches005b5712010-12-14 21:36:53 +00001397 static const struct intr_info tp_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001398 { 0x3fffffff, "TP parity error", -1, 1 },
1399 { FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 },
1400 { 0 }
1401 };
1402
1403 if (t4_handle_intr_status(adapter, TP_INT_CAUSE, tp_intr_info))
1404 t4_fatal_err(adapter);
1405}
1406
1407/*
1408 * SGE interrupt handler.
1409 */
1410static void sge_intr_handler(struct adapter *adapter)
1411{
1412 u64 v;
1413
Joe Perches005b5712010-12-14 21:36:53 +00001414 static const struct intr_info sge_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001415 { ERR_CPL_EXCEED_IQE_SIZE,
1416 "SGE received CPL exceeding IQE size", -1, 1 },
1417 { ERR_INVALID_CIDX_INC,
1418 "SGE GTS CIDX increment too large", -1, 0 },
1419 { ERR_CPL_OPCODE_0, "SGE received 0-length CPL", -1, 0 },
Vipul Pandya840f3002012-09-05 02:01:55 +00001420 { DBFIFO_LP_INT, NULL, -1, 0, t4_db_full },
1421 { DBFIFO_HP_INT, NULL, -1, 0, t4_db_full },
1422 { ERR_DROPPED_DB, NULL, -1, 0, t4_db_dropped },
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001423 { ERR_DATA_CPL_ON_HIGH_QID1 | ERR_DATA_CPL_ON_HIGH_QID0,
1424 "SGE IQID > 1023 received CPL for FL", -1, 0 },
1425 { ERR_BAD_DB_PIDX3, "SGE DBP 3 pidx increment too large", -1,
1426 0 },
1427 { ERR_BAD_DB_PIDX2, "SGE DBP 2 pidx increment too large", -1,
1428 0 },
1429 { ERR_BAD_DB_PIDX1, "SGE DBP 1 pidx increment too large", -1,
1430 0 },
1431 { ERR_BAD_DB_PIDX0, "SGE DBP 0 pidx increment too large", -1,
1432 0 },
1433 { ERR_ING_CTXT_PRIO,
1434 "SGE too many priority ingress contexts", -1, 0 },
1435 { ERR_EGR_CTXT_PRIO,
1436 "SGE too many priority egress contexts", -1, 0 },
1437 { INGRESS_SIZE_ERR, "SGE illegal ingress QID", -1, 0 },
1438 { EGRESS_SIZE_ERR, "SGE illegal egress QID", -1, 0 },
1439 { 0 }
1440 };
1441
1442 v = (u64)t4_read_reg(adapter, SGE_INT_CAUSE1) |
Vipul Pandya8caa1e82012-05-18 15:29:25 +05301443 ((u64)t4_read_reg(adapter, SGE_INT_CAUSE2) << 32);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001444 if (v) {
1445 dev_alert(adapter->pdev_dev, "SGE parity error (%#llx)\n",
Vipul Pandya8caa1e82012-05-18 15:29:25 +05301446 (unsigned long long)v);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001447 t4_write_reg(adapter, SGE_INT_CAUSE1, v);
1448 t4_write_reg(adapter, SGE_INT_CAUSE2, v >> 32);
1449 }
1450
1451 if (t4_handle_intr_status(adapter, SGE_INT_CAUSE3, sge_intr_info) ||
1452 v != 0)
1453 t4_fatal_err(adapter);
1454}
1455
1456/*
1457 * CIM interrupt handler.
1458 */
1459static void cim_intr_handler(struct adapter *adapter)
1460{
Joe Perches005b5712010-12-14 21:36:53 +00001461 static const struct intr_info cim_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001462 { PREFDROPINT, "CIM control register prefetch drop", -1, 1 },
1463 { OBQPARERR, "CIM OBQ parity error", -1, 1 },
1464 { IBQPARERR, "CIM IBQ parity error", -1, 1 },
1465 { MBUPPARERR, "CIM mailbox uP parity error", -1, 1 },
1466 { MBHOSTPARERR, "CIM mailbox host parity error", -1, 1 },
1467 { TIEQINPARERRINT, "CIM TIEQ outgoing parity error", -1, 1 },
1468 { TIEQOUTPARERRINT, "CIM TIEQ incoming parity error", -1, 1 },
1469 { 0 }
1470 };
Joe Perches005b5712010-12-14 21:36:53 +00001471 static const struct intr_info cim_upintr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001472 { RSVDSPACEINT, "CIM reserved space access", -1, 1 },
1473 { ILLTRANSINT, "CIM illegal transaction", -1, 1 },
1474 { ILLWRINT, "CIM illegal write", -1, 1 },
1475 { ILLRDINT, "CIM illegal read", -1, 1 },
1476 { ILLRDBEINT, "CIM illegal read BE", -1, 1 },
1477 { ILLWRBEINT, "CIM illegal write BE", -1, 1 },
1478 { SGLRDBOOTINT, "CIM single read from boot space", -1, 1 },
1479 { SGLWRBOOTINT, "CIM single write to boot space", -1, 1 },
1480 { BLKWRBOOTINT, "CIM block write to boot space", -1, 1 },
1481 { SGLRDFLASHINT, "CIM single read from flash space", -1, 1 },
1482 { SGLWRFLASHINT, "CIM single write to flash space", -1, 1 },
1483 { BLKWRFLASHINT, "CIM block write to flash space", -1, 1 },
1484 { SGLRDEEPROMINT, "CIM single EEPROM read", -1, 1 },
1485 { SGLWREEPROMINT, "CIM single EEPROM write", -1, 1 },
1486 { BLKRDEEPROMINT, "CIM block EEPROM read", -1, 1 },
1487 { BLKWREEPROMINT, "CIM block EEPROM write", -1, 1 },
1488 { SGLRDCTLINT , "CIM single read from CTL space", -1, 1 },
1489 { SGLWRCTLINT , "CIM single write to CTL space", -1, 1 },
1490 { BLKRDCTLINT , "CIM block read from CTL space", -1, 1 },
1491 { BLKWRCTLINT , "CIM block write to CTL space", -1, 1 },
1492 { SGLRDPLINT , "CIM single read from PL space", -1, 1 },
1493 { SGLWRPLINT , "CIM single write to PL space", -1, 1 },
1494 { BLKRDPLINT , "CIM block read from PL space", -1, 1 },
1495 { BLKWRPLINT , "CIM block write to PL space", -1, 1 },
1496 { REQOVRLOOKUPINT , "CIM request FIFO overwrite", -1, 1 },
1497 { RSPOVRLOOKUPINT , "CIM response FIFO overwrite", -1, 1 },
1498 { TIMEOUTINT , "CIM PIF timeout", -1, 1 },
1499 { TIMEOUTMAINT , "CIM PIF MA timeout", -1, 1 },
1500 { 0 }
1501 };
1502
1503 int fat;
1504
1505 fat = t4_handle_intr_status(adapter, CIM_HOST_INT_CAUSE,
1506 cim_intr_info) +
1507 t4_handle_intr_status(adapter, CIM_HOST_UPACC_INT_CAUSE,
1508 cim_upintr_info);
1509 if (fat)
1510 t4_fatal_err(adapter);
1511}
1512
1513/*
1514 * ULP RX interrupt handler.
1515 */
1516static void ulprx_intr_handler(struct adapter *adapter)
1517{
Joe Perches005b5712010-12-14 21:36:53 +00001518 static const struct intr_info ulprx_intr_info[] = {
Dimitris Michailidis91e9a1e2010-06-18 10:05:33 +00001519 { 0x1800000, "ULPRX context error", -1, 1 },
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001520 { 0x7fffff, "ULPRX parity error", -1, 1 },
1521 { 0 }
1522 };
1523
1524 if (t4_handle_intr_status(adapter, ULP_RX_INT_CAUSE, ulprx_intr_info))
1525 t4_fatal_err(adapter);
1526}
1527
1528/*
1529 * ULP TX interrupt handler.
1530 */
1531static void ulptx_intr_handler(struct adapter *adapter)
1532{
Joe Perches005b5712010-12-14 21:36:53 +00001533 static const struct intr_info ulptx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001534 { PBL_BOUND_ERR_CH3, "ULPTX channel 3 PBL out of bounds", -1,
1535 0 },
1536 { PBL_BOUND_ERR_CH2, "ULPTX channel 2 PBL out of bounds", -1,
1537 0 },
1538 { PBL_BOUND_ERR_CH1, "ULPTX channel 1 PBL out of bounds", -1,
1539 0 },
1540 { PBL_BOUND_ERR_CH0, "ULPTX channel 0 PBL out of bounds", -1,
1541 0 },
1542 { 0xfffffff, "ULPTX parity error", -1, 1 },
1543 { 0 }
1544 };
1545
1546 if (t4_handle_intr_status(adapter, ULP_TX_INT_CAUSE, ulptx_intr_info))
1547 t4_fatal_err(adapter);
1548}
1549
1550/*
1551 * PM TX interrupt handler.
1552 */
1553static void pmtx_intr_handler(struct adapter *adapter)
1554{
Joe Perches005b5712010-12-14 21:36:53 +00001555 static const struct intr_info pmtx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001556 { PCMD_LEN_OVFL0, "PMTX channel 0 pcmd too large", -1, 1 },
1557 { PCMD_LEN_OVFL1, "PMTX channel 1 pcmd too large", -1, 1 },
1558 { PCMD_LEN_OVFL2, "PMTX channel 2 pcmd too large", -1, 1 },
1559 { ZERO_C_CMD_ERROR, "PMTX 0-length pcmd", -1, 1 },
1560 { PMTX_FRAMING_ERROR, "PMTX framing error", -1, 1 },
1561 { OESPI_PAR_ERROR, "PMTX oespi parity error", -1, 1 },
1562 { DB_OPTIONS_PAR_ERROR, "PMTX db_options parity error", -1, 1 },
1563 { ICSPI_PAR_ERROR, "PMTX icspi parity error", -1, 1 },
1564 { C_PCMD_PAR_ERROR, "PMTX c_pcmd parity error", -1, 1},
1565 { 0 }
1566 };
1567
1568 if (t4_handle_intr_status(adapter, PM_TX_INT_CAUSE, pmtx_intr_info))
1569 t4_fatal_err(adapter);
1570}
1571
1572/*
1573 * PM RX interrupt handler.
1574 */
1575static void pmrx_intr_handler(struct adapter *adapter)
1576{
Joe Perches005b5712010-12-14 21:36:53 +00001577 static const struct intr_info pmrx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001578 { ZERO_E_CMD_ERROR, "PMRX 0-length pcmd", -1, 1 },
1579 { PMRX_FRAMING_ERROR, "PMRX framing error", -1, 1 },
1580 { OCSPI_PAR_ERROR, "PMRX ocspi parity error", -1, 1 },
1581 { DB_OPTIONS_PAR_ERROR, "PMRX db_options parity error", -1, 1 },
1582 { IESPI_PAR_ERROR, "PMRX iespi parity error", -1, 1 },
1583 { E_PCMD_PAR_ERROR, "PMRX e_pcmd parity error", -1, 1},
1584 { 0 }
1585 };
1586
1587 if (t4_handle_intr_status(adapter, PM_RX_INT_CAUSE, pmrx_intr_info))
1588 t4_fatal_err(adapter);
1589}
1590
1591/*
1592 * CPL switch interrupt handler.
1593 */
1594static void cplsw_intr_handler(struct adapter *adapter)
1595{
Joe Perches005b5712010-12-14 21:36:53 +00001596 static const struct intr_info cplsw_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001597 { CIM_OP_MAP_PERR, "CPLSW CIM op_map parity error", -1, 1 },
1598 { CIM_OVFL_ERROR, "CPLSW CIM overflow", -1, 1 },
1599 { TP_FRAMING_ERROR, "CPLSW TP framing error", -1, 1 },
1600 { SGE_FRAMING_ERROR, "CPLSW SGE framing error", -1, 1 },
1601 { CIM_FRAMING_ERROR, "CPLSW CIM framing error", -1, 1 },
1602 { ZERO_SWITCH_ERROR, "CPLSW no-switch error", -1, 1 },
1603 { 0 }
1604 };
1605
1606 if (t4_handle_intr_status(adapter, CPL_INTR_CAUSE, cplsw_intr_info))
1607 t4_fatal_err(adapter);
1608}
1609
1610/*
1611 * LE interrupt handler.
1612 */
1613static void le_intr_handler(struct adapter *adap)
1614{
Joe Perches005b5712010-12-14 21:36:53 +00001615 static const struct intr_info le_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001616 { LIPMISS, "LE LIP miss", -1, 0 },
1617 { LIP0, "LE 0 LIP error", -1, 0 },
1618 { PARITYERR, "LE parity error", -1, 1 },
1619 { UNKNOWNCMD, "LE unknown command", -1, 1 },
1620 { REQQPARERR, "LE request queue parity error", -1, 1 },
1621 { 0 }
1622 };
1623
1624 if (t4_handle_intr_status(adap, LE_DB_INT_CAUSE, le_intr_info))
1625 t4_fatal_err(adap);
1626}
1627
1628/*
1629 * MPS interrupt handler.
1630 */
1631static void mps_intr_handler(struct adapter *adapter)
1632{
Joe Perches005b5712010-12-14 21:36:53 +00001633 static const struct intr_info mps_rx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001634 { 0xffffff, "MPS Rx parity error", -1, 1 },
1635 { 0 }
1636 };
Joe Perches005b5712010-12-14 21:36:53 +00001637 static const struct intr_info mps_tx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001638 { TPFIFO, "MPS Tx TP FIFO parity error", -1, 1 },
1639 { NCSIFIFO, "MPS Tx NC-SI FIFO parity error", -1, 1 },
1640 { TXDATAFIFO, "MPS Tx data FIFO parity error", -1, 1 },
1641 { TXDESCFIFO, "MPS Tx desc FIFO parity error", -1, 1 },
1642 { BUBBLE, "MPS Tx underflow", -1, 1 },
1643 { SECNTERR, "MPS Tx SOP/EOP error", -1, 1 },
1644 { FRMERR, "MPS Tx framing error", -1, 1 },
1645 { 0 }
1646 };
Joe Perches005b5712010-12-14 21:36:53 +00001647 static const struct intr_info mps_trc_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001648 { FILTMEM, "MPS TRC filter parity error", -1, 1 },
1649 { PKTFIFO, "MPS TRC packet FIFO parity error", -1, 1 },
1650 { MISCPERR, "MPS TRC misc parity error", -1, 1 },
1651 { 0 }
1652 };
Joe Perches005b5712010-12-14 21:36:53 +00001653 static const struct intr_info mps_stat_sram_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001654 { 0x1fffff, "MPS statistics SRAM parity error", -1, 1 },
1655 { 0 }
1656 };
Joe Perches005b5712010-12-14 21:36:53 +00001657 static const struct intr_info mps_stat_tx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001658 { 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 },
1659 { 0 }
1660 };
Joe Perches005b5712010-12-14 21:36:53 +00001661 static const struct intr_info mps_stat_rx_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001662 { 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 },
1663 { 0 }
1664 };
Joe Perches005b5712010-12-14 21:36:53 +00001665 static const struct intr_info mps_cls_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001666 { MATCHSRAM, "MPS match SRAM parity error", -1, 1 },
1667 { MATCHTCAM, "MPS match TCAM parity error", -1, 1 },
1668 { HASHSRAM, "MPS hash SRAM parity error", -1, 1 },
1669 { 0 }
1670 };
1671
1672 int fat;
1673
1674 fat = t4_handle_intr_status(adapter, MPS_RX_PERR_INT_CAUSE,
1675 mps_rx_intr_info) +
1676 t4_handle_intr_status(adapter, MPS_TX_INT_CAUSE,
1677 mps_tx_intr_info) +
1678 t4_handle_intr_status(adapter, MPS_TRC_INT_CAUSE,
1679 mps_trc_intr_info) +
1680 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_SRAM,
1681 mps_stat_sram_intr_info) +
1682 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_TX_FIFO,
1683 mps_stat_tx_intr_info) +
1684 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_RX_FIFO,
1685 mps_stat_rx_intr_info) +
1686 t4_handle_intr_status(adapter, MPS_CLS_INT_CAUSE,
1687 mps_cls_intr_info);
1688
1689 t4_write_reg(adapter, MPS_INT_CAUSE, CLSINT | TRCINT |
1690 RXINT | TXINT | STATINT);
1691 t4_read_reg(adapter, MPS_INT_CAUSE); /* flush */
1692 if (fat)
1693 t4_fatal_err(adapter);
1694}
1695
1696#define MEM_INT_MASK (PERR_INT_CAUSE | ECC_CE_INT_CAUSE | ECC_UE_INT_CAUSE)
1697
1698/*
1699 * EDC/MC interrupt handler.
1700 */
1701static void mem_intr_handler(struct adapter *adapter, int idx)
1702{
1703 static const char name[3][5] = { "EDC0", "EDC1", "MC" };
1704
1705 unsigned int addr, cnt_addr, v;
1706
1707 if (idx <= MEM_EDC1) {
1708 addr = EDC_REG(EDC_INT_CAUSE, idx);
1709 cnt_addr = EDC_REG(EDC_ECC_STATUS, idx);
1710 } else {
1711 addr = MC_INT_CAUSE;
1712 cnt_addr = MC_ECC_STATUS;
1713 }
1714
1715 v = t4_read_reg(adapter, addr) & MEM_INT_MASK;
1716 if (v & PERR_INT_CAUSE)
1717 dev_alert(adapter->pdev_dev, "%s FIFO parity error\n",
1718 name[idx]);
1719 if (v & ECC_CE_INT_CAUSE) {
1720 u32 cnt = ECC_CECNT_GET(t4_read_reg(adapter, cnt_addr));
1721
1722 t4_write_reg(adapter, cnt_addr, ECC_CECNT_MASK);
1723 if (printk_ratelimit())
1724 dev_warn(adapter->pdev_dev,
1725 "%u %s correctable ECC data error%s\n",
1726 cnt, name[idx], cnt > 1 ? "s" : "");
1727 }
1728 if (v & ECC_UE_INT_CAUSE)
1729 dev_alert(adapter->pdev_dev,
1730 "%s uncorrectable ECC data error\n", name[idx]);
1731
1732 t4_write_reg(adapter, addr, v);
1733 if (v & (PERR_INT_CAUSE | ECC_UE_INT_CAUSE))
1734 t4_fatal_err(adapter);
1735}
1736
1737/*
1738 * MA interrupt handler.
1739 */
1740static void ma_intr_handler(struct adapter *adap)
1741{
1742 u32 v, status = t4_read_reg(adap, MA_INT_CAUSE);
1743
1744 if (status & MEM_PERR_INT_CAUSE)
1745 dev_alert(adap->pdev_dev,
1746 "MA parity error, parity status %#x\n",
1747 t4_read_reg(adap, MA_PARITY_ERROR_STATUS));
1748 if (status & MEM_WRAP_INT_CAUSE) {
1749 v = t4_read_reg(adap, MA_INT_WRAP_STATUS);
1750 dev_alert(adap->pdev_dev, "MA address wrap-around error by "
1751 "client %u to address %#x\n",
1752 MEM_WRAP_CLIENT_NUM_GET(v),
1753 MEM_WRAP_ADDRESS_GET(v) << 4);
1754 }
1755 t4_write_reg(adap, MA_INT_CAUSE, status);
1756 t4_fatal_err(adap);
1757}
1758
1759/*
1760 * SMB interrupt handler.
1761 */
1762static void smb_intr_handler(struct adapter *adap)
1763{
Joe Perches005b5712010-12-14 21:36:53 +00001764 static const struct intr_info smb_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001765 { MSTTXFIFOPARINT, "SMB master Tx FIFO parity error", -1, 1 },
1766 { MSTRXFIFOPARINT, "SMB master Rx FIFO parity error", -1, 1 },
1767 { SLVFIFOPARINT, "SMB slave FIFO parity error", -1, 1 },
1768 { 0 }
1769 };
1770
1771 if (t4_handle_intr_status(adap, SMB_INT_CAUSE, smb_intr_info))
1772 t4_fatal_err(adap);
1773}
1774
1775/*
1776 * NC-SI interrupt handler.
1777 */
1778static void ncsi_intr_handler(struct adapter *adap)
1779{
Joe Perches005b5712010-12-14 21:36:53 +00001780 static const struct intr_info ncsi_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001781 { CIM_DM_PRTY_ERR, "NC-SI CIM parity error", -1, 1 },
1782 { MPS_DM_PRTY_ERR, "NC-SI MPS parity error", -1, 1 },
1783 { TXFIFO_PRTY_ERR, "NC-SI Tx FIFO parity error", -1, 1 },
1784 { RXFIFO_PRTY_ERR, "NC-SI Rx FIFO parity error", -1, 1 },
1785 { 0 }
1786 };
1787
1788 if (t4_handle_intr_status(adap, NCSI_INT_CAUSE, ncsi_intr_info))
1789 t4_fatal_err(adap);
1790}
1791
1792/*
1793 * XGMAC interrupt handler.
1794 */
1795static void xgmac_intr_handler(struct adapter *adap, int port)
1796{
Santosh Rastapur0a57a532013-03-14 05:08:49 +00001797 u32 v, int_cause_reg;
1798
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05301799 if (is_t4(adap->params.chip))
Santosh Rastapur0a57a532013-03-14 05:08:49 +00001800 int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE);
1801 else
1802 int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE);
1803
1804 v = t4_read_reg(adap, int_cause_reg);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001805
1806 v &= TXFIFO_PRTY_ERR | RXFIFO_PRTY_ERR;
1807 if (!v)
1808 return;
1809
1810 if (v & TXFIFO_PRTY_ERR)
1811 dev_alert(adap->pdev_dev, "XGMAC %d Tx FIFO parity error\n",
1812 port);
1813 if (v & RXFIFO_PRTY_ERR)
1814 dev_alert(adap->pdev_dev, "XGMAC %d Rx FIFO parity error\n",
1815 port);
1816 t4_write_reg(adap, PORT_REG(port, XGMAC_PORT_INT_CAUSE), v);
1817 t4_fatal_err(adap);
1818}
1819
1820/*
1821 * PL interrupt handler.
1822 */
1823static void pl_intr_handler(struct adapter *adap)
1824{
Joe Perches005b5712010-12-14 21:36:53 +00001825 static const struct intr_info pl_intr_info[] = {
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001826 { FATALPERR, "T4 fatal parity error", -1, 1 },
1827 { PERRVFID, "PL VFID_MAP parity error", -1, 1 },
1828 { 0 }
1829 };
1830
1831 if (t4_handle_intr_status(adap, PL_PL_INT_CAUSE, pl_intr_info))
1832 t4_fatal_err(adap);
1833}
1834
Dimitris Michailidis63bccee2010-08-02 13:19:16 +00001835#define PF_INTR_MASK (PFSW)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001836#define GLBL_INTR_MASK (CIM | MPS | PL | PCIE | MC | EDC0 | \
1837 EDC1 | LE | TP | MA | PM_TX | PM_RX | ULP_RX | \
1838 CPL_SWITCH | SGE | ULP_TX)
1839
1840/**
1841 * t4_slow_intr_handler - control path interrupt handler
1842 * @adapter: the adapter
1843 *
1844 * T4 interrupt handler for non-data global interrupt events, e.g., errors.
1845 * The designation 'slow' is because it involves register reads, while
1846 * data interrupts typically don't involve any MMIOs.
1847 */
1848int t4_slow_intr_handler(struct adapter *adapter)
1849{
1850 u32 cause = t4_read_reg(adapter, PL_INT_CAUSE);
1851
1852 if (!(cause & GLBL_INTR_MASK))
1853 return 0;
1854 if (cause & CIM)
1855 cim_intr_handler(adapter);
1856 if (cause & MPS)
1857 mps_intr_handler(adapter);
1858 if (cause & NCSI)
1859 ncsi_intr_handler(adapter);
1860 if (cause & PL)
1861 pl_intr_handler(adapter);
1862 if (cause & SMB)
1863 smb_intr_handler(adapter);
1864 if (cause & XGMAC0)
1865 xgmac_intr_handler(adapter, 0);
1866 if (cause & XGMAC1)
1867 xgmac_intr_handler(adapter, 1);
1868 if (cause & XGMAC_KR0)
1869 xgmac_intr_handler(adapter, 2);
1870 if (cause & XGMAC_KR1)
1871 xgmac_intr_handler(adapter, 3);
1872 if (cause & PCIE)
1873 pcie_intr_handler(adapter);
1874 if (cause & MC)
1875 mem_intr_handler(adapter, MEM_MC);
1876 if (cause & EDC0)
1877 mem_intr_handler(adapter, MEM_EDC0);
1878 if (cause & EDC1)
1879 mem_intr_handler(adapter, MEM_EDC1);
1880 if (cause & LE)
1881 le_intr_handler(adapter);
1882 if (cause & TP)
1883 tp_intr_handler(adapter);
1884 if (cause & MA)
1885 ma_intr_handler(adapter);
1886 if (cause & PM_TX)
1887 pmtx_intr_handler(adapter);
1888 if (cause & PM_RX)
1889 pmrx_intr_handler(adapter);
1890 if (cause & ULP_RX)
1891 ulprx_intr_handler(adapter);
1892 if (cause & CPL_SWITCH)
1893 cplsw_intr_handler(adapter);
1894 if (cause & SGE)
1895 sge_intr_handler(adapter);
1896 if (cause & ULP_TX)
1897 ulptx_intr_handler(adapter);
1898
1899 /* Clear the interrupts just processed for which we are the master. */
1900 t4_write_reg(adapter, PL_INT_CAUSE, cause & GLBL_INTR_MASK);
1901 (void) t4_read_reg(adapter, PL_INT_CAUSE); /* flush */
1902 return 1;
1903}
1904
1905/**
1906 * t4_intr_enable - enable interrupts
1907 * @adapter: the adapter whose interrupts should be enabled
1908 *
1909 * Enable PF-specific interrupts for the calling function and the top-level
1910 * interrupt concentrator for global interrupts. Interrupts are already
1911 * enabled at each module, here we just enable the roots of the interrupt
1912 * hierarchies.
1913 *
1914 * Note: this function should be called only when the driver manages
1915 * non PF-specific interrupts from the various HW modules. Only one PCI
1916 * function at a time should be doing this.
1917 */
1918void t4_intr_enable(struct adapter *adapter)
1919{
1920 u32 pf = SOURCEPF_GET(t4_read_reg(adapter, PL_WHOAMI));
1921
1922 t4_write_reg(adapter, SGE_INT_ENABLE3, ERR_CPL_EXCEED_IQE_SIZE |
1923 ERR_INVALID_CIDX_INC | ERR_CPL_OPCODE_0 |
1924 ERR_DROPPED_DB | ERR_DATA_CPL_ON_HIGH_QID1 |
1925 ERR_DATA_CPL_ON_HIGH_QID0 | ERR_BAD_DB_PIDX3 |
1926 ERR_BAD_DB_PIDX2 | ERR_BAD_DB_PIDX1 |
1927 ERR_BAD_DB_PIDX0 | ERR_ING_CTXT_PRIO |
1928 ERR_EGR_CTXT_PRIO | INGRESS_SIZE_ERR |
Vipul Pandya840f3002012-09-05 02:01:55 +00001929 DBFIFO_HP_INT | DBFIFO_LP_INT |
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001930 EGRESS_SIZE_ERR);
1931 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE), PF_INTR_MASK);
1932 t4_set_reg_field(adapter, PL_INT_MAP0, 0, 1 << pf);
1933}
1934
1935/**
1936 * t4_intr_disable - disable interrupts
1937 * @adapter: the adapter whose interrupts should be disabled
1938 *
1939 * Disable interrupts. We only disable the top-level interrupt
1940 * concentrators. The caller must be a PCI function managing global
1941 * interrupts.
1942 */
1943void t4_intr_disable(struct adapter *adapter)
1944{
1945 u32 pf = SOURCEPF_GET(t4_read_reg(adapter, PL_WHOAMI));
1946
1947 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE), 0);
1948 t4_set_reg_field(adapter, PL_INT_MAP0, 1 << pf, 0);
1949}
1950
1951/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00001952 * hash_mac_addr - return the hash value of a MAC address
1953 * @addr: the 48-bit Ethernet MAC address
1954 *
1955 * Hashes a MAC address according to the hash function used by HW inexact
1956 * (hash) address matching.
1957 */
1958static int hash_mac_addr(const u8 *addr)
1959{
1960 u32 a = ((u32)addr[0] << 16) | ((u32)addr[1] << 8) | addr[2];
1961 u32 b = ((u32)addr[3] << 16) | ((u32)addr[4] << 8) | addr[5];
1962 a ^= b;
1963 a ^= (a >> 12);
1964 a ^= (a >> 6);
1965 return a & 0x3f;
1966}
1967
1968/**
1969 * t4_config_rss_range - configure a portion of the RSS mapping table
1970 * @adapter: the adapter
1971 * @mbox: mbox to use for the FW command
1972 * @viid: virtual interface whose RSS subtable is to be written
1973 * @start: start entry in the table to write
1974 * @n: how many table entries to write
1975 * @rspq: values for the response queue lookup table
1976 * @nrspq: number of values in @rspq
1977 *
1978 * Programs the selected part of the VI's RSS mapping table with the
1979 * provided values. If @nrspq < @n the supplied values are used repeatedly
1980 * until the full table range is populated.
1981 *
1982 * The caller must ensure the values in @rspq are in the range allowed for
1983 * @viid.
1984 */
1985int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
1986 int start, int n, const u16 *rspq, unsigned int nrspq)
1987{
1988 int ret;
1989 const u16 *rsp = rspq;
1990 const u16 *rsp_end = rspq + nrspq;
1991 struct fw_rss_ind_tbl_cmd cmd;
1992
1993 memset(&cmd, 0, sizeof(cmd));
1994 cmd.op_to_viid = htonl(FW_CMD_OP(FW_RSS_IND_TBL_CMD) |
1995 FW_CMD_REQUEST | FW_CMD_WRITE |
1996 FW_RSS_IND_TBL_CMD_VIID(viid));
1997 cmd.retval_len16 = htonl(FW_LEN16(cmd));
1998
1999 /* each fw_rss_ind_tbl_cmd takes up to 32 entries */
2000 while (n > 0) {
2001 int nq = min(n, 32);
2002 __be32 *qp = &cmd.iq0_to_iq2;
2003
2004 cmd.niqid = htons(nq);
2005 cmd.startidx = htons(start);
2006
2007 start += nq;
2008 n -= nq;
2009
2010 while (nq > 0) {
2011 unsigned int v;
2012
2013 v = FW_RSS_IND_TBL_CMD_IQ0(*rsp);
2014 if (++rsp >= rsp_end)
2015 rsp = rspq;
2016 v |= FW_RSS_IND_TBL_CMD_IQ1(*rsp);
2017 if (++rsp >= rsp_end)
2018 rsp = rspq;
2019 v |= FW_RSS_IND_TBL_CMD_IQ2(*rsp);
2020 if (++rsp >= rsp_end)
2021 rsp = rspq;
2022
2023 *qp++ = htonl(v);
2024 nq -= 3;
2025 }
2026
2027 ret = t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
2028 if (ret)
2029 return ret;
2030 }
2031 return 0;
2032}
2033
2034/**
2035 * t4_config_glbl_rss - configure the global RSS mode
2036 * @adapter: the adapter
2037 * @mbox: mbox to use for the FW command
2038 * @mode: global RSS mode
2039 * @flags: mode-specific flags
2040 *
2041 * Sets the global RSS mode.
2042 */
2043int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
2044 unsigned int flags)
2045{
2046 struct fw_rss_glb_config_cmd c;
2047
2048 memset(&c, 0, sizeof(c));
2049 c.op_to_write = htonl(FW_CMD_OP(FW_RSS_GLB_CONFIG_CMD) |
2050 FW_CMD_REQUEST | FW_CMD_WRITE);
2051 c.retval_len16 = htonl(FW_LEN16(c));
2052 if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_MANUAL) {
2053 c.u.manual.mode_pkd = htonl(FW_RSS_GLB_CONFIG_CMD_MODE(mode));
2054 } else if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) {
2055 c.u.basicvirtual.mode_pkd =
2056 htonl(FW_RSS_GLB_CONFIG_CMD_MODE(mode));
2057 c.u.basicvirtual.synmapen_to_hashtoeplitz = htonl(flags);
2058 } else
2059 return -EINVAL;
2060 return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
2061}
2062
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002063/**
2064 * t4_tp_get_tcp_stats - read TP's TCP MIB counters
2065 * @adap: the adapter
2066 * @v4: holds the TCP/IP counter values
2067 * @v6: holds the TCP/IPv6 counter values
2068 *
2069 * Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters.
2070 * Either @v4 or @v6 may be %NULL to skip the corresponding stats.
2071 */
2072void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
2073 struct tp_tcp_stats *v6)
2074{
2075 u32 val[TP_MIB_TCP_RXT_SEG_LO - TP_MIB_TCP_OUT_RST + 1];
2076
2077#define STAT_IDX(x) ((TP_MIB_TCP_##x) - TP_MIB_TCP_OUT_RST)
2078#define STAT(x) val[STAT_IDX(x)]
2079#define STAT64(x) (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
2080
2081 if (v4) {
2082 t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
2083 ARRAY_SIZE(val), TP_MIB_TCP_OUT_RST);
2084 v4->tcpOutRsts = STAT(OUT_RST);
2085 v4->tcpInSegs = STAT64(IN_SEG);
2086 v4->tcpOutSegs = STAT64(OUT_SEG);
2087 v4->tcpRetransSegs = STAT64(RXT_SEG);
2088 }
2089 if (v6) {
2090 t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
2091 ARRAY_SIZE(val), TP_MIB_TCP_V6OUT_RST);
2092 v6->tcpOutRsts = STAT(OUT_RST);
2093 v6->tcpInSegs = STAT64(IN_SEG);
2094 v6->tcpOutSegs = STAT64(OUT_SEG);
2095 v6->tcpRetransSegs = STAT64(RXT_SEG);
2096 }
2097#undef STAT64
2098#undef STAT
2099#undef STAT_IDX
2100}
2101
2102/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002103 * t4_read_mtu_tbl - returns the values in the HW path MTU table
2104 * @adap: the adapter
2105 * @mtus: where to store the MTU values
2106 * @mtu_log: where to store the MTU base-2 log (may be %NULL)
2107 *
2108 * Reads the HW path MTU table.
2109 */
2110void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log)
2111{
2112 u32 v;
2113 int i;
2114
2115 for (i = 0; i < NMTUS; ++i) {
2116 t4_write_reg(adap, TP_MTU_TABLE,
2117 MTUINDEX(0xff) | MTUVALUE(i));
2118 v = t4_read_reg(adap, TP_MTU_TABLE);
2119 mtus[i] = MTUVALUE_GET(v);
2120 if (mtu_log)
2121 mtu_log[i] = MTUWIDTH_GET(v);
2122 }
2123}
2124
2125/**
Vipul Pandya636f9d32012-09-26 02:39:39 +00002126 * t4_tp_wr_bits_indirect - set/clear bits in an indirect TP register
2127 * @adap: the adapter
2128 * @addr: the indirect TP register address
2129 * @mask: specifies the field within the register to modify
2130 * @val: new value for the field
2131 *
2132 * Sets a field of an indirect TP register to the given value.
2133 */
2134void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
2135 unsigned int mask, unsigned int val)
2136{
2137 t4_write_reg(adap, TP_PIO_ADDR, addr);
2138 val |= t4_read_reg(adap, TP_PIO_DATA) & ~mask;
2139 t4_write_reg(adap, TP_PIO_DATA, val);
2140}
2141
2142/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002143 * init_cong_ctrl - initialize congestion control parameters
2144 * @a: the alpha values for congestion control
2145 * @b: the beta values for congestion control
2146 *
2147 * Initialize the congestion control parameters.
2148 */
Bill Pemberton91744942012-12-03 09:23:02 -05002149static void init_cong_ctrl(unsigned short *a, unsigned short *b)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002150{
2151 a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
2152 a[9] = 2;
2153 a[10] = 3;
2154 a[11] = 4;
2155 a[12] = 5;
2156 a[13] = 6;
2157 a[14] = 7;
2158 a[15] = 8;
2159 a[16] = 9;
2160 a[17] = 10;
2161 a[18] = 14;
2162 a[19] = 17;
2163 a[20] = 21;
2164 a[21] = 25;
2165 a[22] = 30;
2166 a[23] = 35;
2167 a[24] = 45;
2168 a[25] = 60;
2169 a[26] = 80;
2170 a[27] = 100;
2171 a[28] = 200;
2172 a[29] = 300;
2173 a[30] = 400;
2174 a[31] = 500;
2175
2176 b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
2177 b[9] = b[10] = 1;
2178 b[11] = b[12] = 2;
2179 b[13] = b[14] = b[15] = b[16] = 3;
2180 b[17] = b[18] = b[19] = b[20] = b[21] = 4;
2181 b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
2182 b[28] = b[29] = 6;
2183 b[30] = b[31] = 7;
2184}
2185
2186/* The minimum additive increment value for the congestion control table */
2187#define CC_MIN_INCR 2U
2188
2189/**
2190 * t4_load_mtus - write the MTU and congestion control HW tables
2191 * @adap: the adapter
2192 * @mtus: the values for the MTU table
2193 * @alpha: the values for the congestion control alpha parameter
2194 * @beta: the values for the congestion control beta parameter
2195 *
2196 * Write the HW MTU table with the supplied MTUs and the high-speed
2197 * congestion control table with the supplied alpha, beta, and MTUs.
2198 * We write the two tables together because the additive increments
2199 * depend on the MTUs.
2200 */
2201void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
2202 const unsigned short *alpha, const unsigned short *beta)
2203{
2204 static const unsigned int avg_pkts[NCCTRL_WIN] = {
2205 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
2206 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
2207 28672, 40960, 57344, 81920, 114688, 163840, 229376
2208 };
2209
2210 unsigned int i, w;
2211
2212 for (i = 0; i < NMTUS; ++i) {
2213 unsigned int mtu = mtus[i];
2214 unsigned int log2 = fls(mtu);
2215
2216 if (!(mtu & ((1 << log2) >> 2))) /* round */
2217 log2--;
2218 t4_write_reg(adap, TP_MTU_TABLE, MTUINDEX(i) |
2219 MTUWIDTH(log2) | MTUVALUE(mtu));
2220
2221 for (w = 0; w < NCCTRL_WIN; ++w) {
2222 unsigned int inc;
2223
2224 inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
2225 CC_MIN_INCR);
2226
2227 t4_write_reg(adap, TP_CCTRL_TABLE, (i << 21) |
2228 (w << 16) | (beta[w] << 13) | inc);
2229 }
2230 }
2231}
2232
2233/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002234 * get_mps_bg_map - return the buffer groups associated with a port
2235 * @adap: the adapter
2236 * @idx: the port index
2237 *
2238 * Returns a bitmap indicating which MPS buffer groups are associated
2239 * with the given port. Bit i is set if buffer group i is used by the
2240 * port.
2241 */
2242static unsigned int get_mps_bg_map(struct adapter *adap, int idx)
2243{
2244 u32 n = NUMPORTS_GET(t4_read_reg(adap, MPS_CMN_CTL));
2245
2246 if (n == 0)
2247 return idx == 0 ? 0xf : 0;
2248 if (n == 1)
2249 return idx < 2 ? (3 << (2 * idx)) : 0;
2250 return 1 << idx;
2251}
2252
2253/**
Kumar Sanghvi72aca4b2014-02-18 17:56:08 +05302254 * t4_get_port_type_description - return Port Type string description
2255 * @port_type: firmware Port Type enumeration
2256 */
2257const char *t4_get_port_type_description(enum fw_port_type port_type)
2258{
2259 static const char *const port_type_description[] = {
2260 "R XFI",
2261 "R XAUI",
2262 "T SGMII",
2263 "T XFI",
2264 "T XAUI",
2265 "KX4",
2266 "CX4",
2267 "KX",
2268 "KR",
2269 "R SFP+",
2270 "KR/KX",
2271 "KR/KX/KX4",
2272 "R QSFP_10G",
2273 "",
2274 "R QSFP",
2275 "R BP40_BA",
2276 };
2277
2278 if (port_type < ARRAY_SIZE(port_type_description))
2279 return port_type_description[port_type];
2280 return "UNKNOWN";
2281}
2282
2283/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002284 * t4_get_port_stats - collect port statistics
2285 * @adap: the adapter
2286 * @idx: the port index
2287 * @p: the stats structure to fill
2288 *
2289 * Collect statistics related to the given port from HW.
2290 */
2291void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
2292{
2293 u32 bgmap = get_mps_bg_map(adap, idx);
2294
2295#define GET_STAT(name) \
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002296 t4_read_reg64(adap, \
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05302297 (is_t4(adap->params.chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002298 T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L)))
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002299#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
2300
2301 p->tx_octets = GET_STAT(TX_PORT_BYTES);
2302 p->tx_frames = GET_STAT(TX_PORT_FRAMES);
2303 p->tx_bcast_frames = GET_STAT(TX_PORT_BCAST);
2304 p->tx_mcast_frames = GET_STAT(TX_PORT_MCAST);
2305 p->tx_ucast_frames = GET_STAT(TX_PORT_UCAST);
2306 p->tx_error_frames = GET_STAT(TX_PORT_ERROR);
2307 p->tx_frames_64 = GET_STAT(TX_PORT_64B);
2308 p->tx_frames_65_127 = GET_STAT(TX_PORT_65B_127B);
2309 p->tx_frames_128_255 = GET_STAT(TX_PORT_128B_255B);
2310 p->tx_frames_256_511 = GET_STAT(TX_PORT_256B_511B);
2311 p->tx_frames_512_1023 = GET_STAT(TX_PORT_512B_1023B);
2312 p->tx_frames_1024_1518 = GET_STAT(TX_PORT_1024B_1518B);
2313 p->tx_frames_1519_max = GET_STAT(TX_PORT_1519B_MAX);
2314 p->tx_drop = GET_STAT(TX_PORT_DROP);
2315 p->tx_pause = GET_STAT(TX_PORT_PAUSE);
2316 p->tx_ppp0 = GET_STAT(TX_PORT_PPP0);
2317 p->tx_ppp1 = GET_STAT(TX_PORT_PPP1);
2318 p->tx_ppp2 = GET_STAT(TX_PORT_PPP2);
2319 p->tx_ppp3 = GET_STAT(TX_PORT_PPP3);
2320 p->tx_ppp4 = GET_STAT(TX_PORT_PPP4);
2321 p->tx_ppp5 = GET_STAT(TX_PORT_PPP5);
2322 p->tx_ppp6 = GET_STAT(TX_PORT_PPP6);
2323 p->tx_ppp7 = GET_STAT(TX_PORT_PPP7);
2324
2325 p->rx_octets = GET_STAT(RX_PORT_BYTES);
2326 p->rx_frames = GET_STAT(RX_PORT_FRAMES);
2327 p->rx_bcast_frames = GET_STAT(RX_PORT_BCAST);
2328 p->rx_mcast_frames = GET_STAT(RX_PORT_MCAST);
2329 p->rx_ucast_frames = GET_STAT(RX_PORT_UCAST);
2330 p->rx_too_long = GET_STAT(RX_PORT_MTU_ERROR);
2331 p->rx_jabber = GET_STAT(RX_PORT_MTU_CRC_ERROR);
2332 p->rx_fcs_err = GET_STAT(RX_PORT_CRC_ERROR);
2333 p->rx_len_err = GET_STAT(RX_PORT_LEN_ERROR);
2334 p->rx_symbol_err = GET_STAT(RX_PORT_SYM_ERROR);
2335 p->rx_runt = GET_STAT(RX_PORT_LESS_64B);
2336 p->rx_frames_64 = GET_STAT(RX_PORT_64B);
2337 p->rx_frames_65_127 = GET_STAT(RX_PORT_65B_127B);
2338 p->rx_frames_128_255 = GET_STAT(RX_PORT_128B_255B);
2339 p->rx_frames_256_511 = GET_STAT(RX_PORT_256B_511B);
2340 p->rx_frames_512_1023 = GET_STAT(RX_PORT_512B_1023B);
2341 p->rx_frames_1024_1518 = GET_STAT(RX_PORT_1024B_1518B);
2342 p->rx_frames_1519_max = GET_STAT(RX_PORT_1519B_MAX);
2343 p->rx_pause = GET_STAT(RX_PORT_PAUSE);
2344 p->rx_ppp0 = GET_STAT(RX_PORT_PPP0);
2345 p->rx_ppp1 = GET_STAT(RX_PORT_PPP1);
2346 p->rx_ppp2 = GET_STAT(RX_PORT_PPP2);
2347 p->rx_ppp3 = GET_STAT(RX_PORT_PPP3);
2348 p->rx_ppp4 = GET_STAT(RX_PORT_PPP4);
2349 p->rx_ppp5 = GET_STAT(RX_PORT_PPP5);
2350 p->rx_ppp6 = GET_STAT(RX_PORT_PPP6);
2351 p->rx_ppp7 = GET_STAT(RX_PORT_PPP7);
2352
2353 p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0;
2354 p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0;
2355 p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0;
2356 p->rx_ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_DROP_FRAME) : 0;
2357 p->rx_trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_TRUNC_FRAME) : 0;
2358 p->rx_trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_TRUNC_FRAME) : 0;
2359 p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0;
2360 p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0;
2361
2362#undef GET_STAT
2363#undef GET_STAT_COM
2364}
2365
2366/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002367 * t4_wol_magic_enable - enable/disable magic packet WoL
2368 * @adap: the adapter
2369 * @port: the physical port index
2370 * @addr: MAC address expected in magic packets, %NULL to disable
2371 *
2372 * Enables/disables magic packet wake-on-LAN for the selected port.
2373 */
2374void t4_wol_magic_enable(struct adapter *adap, unsigned int port,
2375 const u8 *addr)
2376{
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002377 u32 mag_id_reg_l, mag_id_reg_h, port_cfg_reg;
2378
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05302379 if (is_t4(adap->params.chip)) {
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002380 mag_id_reg_l = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_LO);
2381 mag_id_reg_h = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_HI);
2382 port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2);
2383 } else {
2384 mag_id_reg_l = T5_PORT_REG(port, MAC_PORT_MAGIC_MACID_LO);
2385 mag_id_reg_h = T5_PORT_REG(port, MAC_PORT_MAGIC_MACID_HI);
2386 port_cfg_reg = T5_PORT_REG(port, MAC_PORT_CFG2);
2387 }
2388
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002389 if (addr) {
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002390 t4_write_reg(adap, mag_id_reg_l,
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002391 (addr[2] << 24) | (addr[3] << 16) |
2392 (addr[4] << 8) | addr[5]);
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002393 t4_write_reg(adap, mag_id_reg_h,
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002394 (addr[0] << 8) | addr[1]);
2395 }
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002396 t4_set_reg_field(adap, port_cfg_reg, MAGICEN,
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002397 addr ? MAGICEN : 0);
2398}
2399
2400/**
2401 * t4_wol_pat_enable - enable/disable pattern-based WoL
2402 * @adap: the adapter
2403 * @port: the physical port index
2404 * @map: bitmap of which HW pattern filters to set
2405 * @mask0: byte mask for bytes 0-63 of a packet
2406 * @mask1: byte mask for bytes 64-127 of a packet
2407 * @crc: Ethernet CRC for selected bytes
2408 * @enable: enable/disable switch
2409 *
2410 * Sets the pattern filters indicated in @map to mask out the bytes
2411 * specified in @mask0/@mask1 in received packets and compare the CRC of
2412 * the resulting packet against @crc. If @enable is %true pattern-based
2413 * WoL is enabled, otherwise disabled.
2414 */
2415int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map,
2416 u64 mask0, u64 mask1, unsigned int crc, bool enable)
2417{
2418 int i;
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002419 u32 port_cfg_reg;
2420
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05302421 if (is_t4(adap->params.chip))
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002422 port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2);
2423 else
2424 port_cfg_reg = T5_PORT_REG(port, MAC_PORT_CFG2);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002425
2426 if (!enable) {
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002427 t4_set_reg_field(adap, port_cfg_reg, PATEN, 0);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002428 return 0;
2429 }
2430 if (map > 0xff)
2431 return -EINVAL;
2432
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002433#define EPIO_REG(name) \
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05302434 (is_t4(adap->params.chip) ? PORT_REG(port, XGMAC_PORT_EPIO_##name) : \
Santosh Rastapur0a57a532013-03-14 05:08:49 +00002435 T5_PORT_REG(port, MAC_PORT_EPIO_##name))
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002436
2437 t4_write_reg(adap, EPIO_REG(DATA1), mask0 >> 32);
2438 t4_write_reg(adap, EPIO_REG(DATA2), mask1);
2439 t4_write_reg(adap, EPIO_REG(DATA3), mask1 >> 32);
2440
2441 for (i = 0; i < NWOL_PAT; i++, map >>= 1) {
2442 if (!(map & 1))
2443 continue;
2444
2445 /* write byte masks */
2446 t4_write_reg(adap, EPIO_REG(DATA0), mask0);
2447 t4_write_reg(adap, EPIO_REG(OP), ADDRESS(i) | EPIOWR);
2448 t4_read_reg(adap, EPIO_REG(OP)); /* flush */
Naresh Kumar Innace91a922012-11-15 22:41:17 +05302449 if (t4_read_reg(adap, EPIO_REG(OP)) & SF_BUSY)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002450 return -ETIMEDOUT;
2451
2452 /* write CRC */
2453 t4_write_reg(adap, EPIO_REG(DATA0), crc);
2454 t4_write_reg(adap, EPIO_REG(OP), ADDRESS(i + 32) | EPIOWR);
2455 t4_read_reg(adap, EPIO_REG(OP)); /* flush */
Naresh Kumar Innace91a922012-11-15 22:41:17 +05302456 if (t4_read_reg(adap, EPIO_REG(OP)) & SF_BUSY)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002457 return -ETIMEDOUT;
2458 }
2459#undef EPIO_REG
2460
2461 t4_set_reg_field(adap, PORT_REG(port, XGMAC_PORT_CFG2), 0, PATEN);
2462 return 0;
2463}
2464
Vipul Pandyaf2b7e782012-12-10 09:30:52 +00002465/* t4_mk_filtdelwr - create a delete filter WR
2466 * @ftid: the filter ID
2467 * @wr: the filter work request to populate
2468 * @qid: ingress queue to receive the delete notification
2469 *
2470 * Creates a filter work request to delete the supplied filter. If @qid is
2471 * negative the delete notification is suppressed.
2472 */
2473void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid)
2474{
2475 memset(wr, 0, sizeof(*wr));
2476 wr->op_pkd = htonl(FW_WR_OP(FW_FILTER_WR));
2477 wr->len16_pkd = htonl(FW_WR_LEN16(sizeof(*wr) / 16));
2478 wr->tid_to_iq = htonl(V_FW_FILTER_WR_TID(ftid) |
2479 V_FW_FILTER_WR_NOREPLY(qid < 0));
2480 wr->del_filter_to_l2tix = htonl(F_FW_FILTER_WR_DEL_FILTER);
2481 if (qid >= 0)
2482 wr->rx_chan_rx_rpl_iq = htons(V_FW_FILTER_WR_RX_RPL_IQ(qid));
2483}
2484
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002485#define INIT_CMD(var, cmd, rd_wr) do { \
2486 (var).op_to_write = htonl(FW_CMD_OP(FW_##cmd##_CMD) | \
2487 FW_CMD_REQUEST | FW_CMD_##rd_wr); \
2488 (var).retval_len16 = htonl(FW_LEN16(var)); \
2489} while (0)
2490
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302491int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox,
2492 u32 addr, u32 val)
2493{
2494 struct fw_ldst_cmd c;
2495
2496 memset(&c, 0, sizeof(c));
Vipul Pandya636f9d32012-09-26 02:39:39 +00002497 c.op_to_addrspace = htonl(FW_CMD_OP(FW_LDST_CMD) | FW_CMD_REQUEST |
2498 FW_CMD_WRITE |
2499 FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_FIRMWARE));
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302500 c.cycles_to_len16 = htonl(FW_LEN16(c));
2501 c.u.addrval.addr = htonl(addr);
2502 c.u.addrval.val = htonl(val);
2503
2504 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2505}
2506
Ben Hutchings49ce9c22012-07-10 10:56:00 +00002507/**
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302508 * t4_mem_win_read_len - read memory through PCIE memory window
2509 * @adap: the adapter
2510 * @addr: address of first byte requested aligned on 32b.
2511 * @data: len bytes to hold the data read
2512 * @len: amount of data to read from window. Must be <=
Santosh Rastapur19dd37b2013-03-14 05:08:53 +00002513 * MEMWIN0_APERATURE after adjusting for 16B for T4 and
2514 * 128B for T5 alignment requirements of the the memory window.
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302515 *
2516 * Read len bytes of data from MC starting at @addr.
2517 */
2518int t4_mem_win_read_len(struct adapter *adap, u32 addr, __be32 *data, int len)
2519{
Santosh Rastapur19dd37b2013-03-14 05:08:53 +00002520 int i, off;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05302521 u32 win_pf = is_t4(adap->params.chip) ? 0 : V_PFNUM(adap->fn);
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302522
Santosh Rastapur19dd37b2013-03-14 05:08:53 +00002523 /* Align on a 2KB boundary.
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302524 */
Santosh Rastapur19dd37b2013-03-14 05:08:53 +00002525 off = addr & MEMWIN0_APERTURE;
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302526 if ((addr & 3) || (len + off) > MEMWIN0_APERTURE)
2527 return -EINVAL;
2528
Santosh Rastapur19dd37b2013-03-14 05:08:53 +00002529 t4_write_reg(adap, PCIE_MEM_ACCESS_OFFSET,
2530 (addr & ~MEMWIN0_APERTURE) | win_pf);
Vipul Pandya840f3002012-09-05 02:01:55 +00002531 t4_read_reg(adap, PCIE_MEM_ACCESS_OFFSET);
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302532
2533 for (i = 0; i < len; i += 4)
Vipul Pandya404d9e32012-10-08 02:59:43 +00002534 *data++ = (__force __be32) t4_read_reg(adap,
2535 (MEMWIN0_BASE + off + i));
Vipul Pandya8caa1e82012-05-18 15:29:25 +05302536
2537 return 0;
2538}
2539
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002540/**
2541 * t4_mdio_rd - read a PHY register through MDIO
2542 * @adap: the adapter
2543 * @mbox: mailbox to use for the FW command
2544 * @phy_addr: the PHY address
2545 * @mmd: the PHY MMD to access (0 for clause 22 PHYs)
2546 * @reg: the register to read
2547 * @valp: where to store the value
2548 *
2549 * Issues a FW command through the given mailbox to read a PHY register.
2550 */
2551int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
2552 unsigned int mmd, unsigned int reg, u16 *valp)
2553{
2554 int ret;
2555 struct fw_ldst_cmd c;
2556
2557 memset(&c, 0, sizeof(c));
2558 c.op_to_addrspace = htonl(FW_CMD_OP(FW_LDST_CMD) | FW_CMD_REQUEST |
2559 FW_CMD_READ | FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MDIO));
2560 c.cycles_to_len16 = htonl(FW_LEN16(c));
2561 c.u.mdio.paddr_mmd = htons(FW_LDST_CMD_PADDR(phy_addr) |
2562 FW_LDST_CMD_MMD(mmd));
2563 c.u.mdio.raddr = htons(reg);
2564
2565 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
2566 if (ret == 0)
2567 *valp = ntohs(c.u.mdio.rval);
2568 return ret;
2569}
2570
2571/**
2572 * t4_mdio_wr - write a PHY register through MDIO
2573 * @adap: the adapter
2574 * @mbox: mailbox to use for the FW command
2575 * @phy_addr: the PHY address
2576 * @mmd: the PHY MMD to access (0 for clause 22 PHYs)
2577 * @reg: the register to write
2578 * @valp: value to write
2579 *
2580 * Issues a FW command through the given mailbox to write a PHY register.
2581 */
2582int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
2583 unsigned int mmd, unsigned int reg, u16 val)
2584{
2585 struct fw_ldst_cmd c;
2586
2587 memset(&c, 0, sizeof(c));
2588 c.op_to_addrspace = htonl(FW_CMD_OP(FW_LDST_CMD) | FW_CMD_REQUEST |
2589 FW_CMD_WRITE | FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MDIO));
2590 c.cycles_to_len16 = htonl(FW_LEN16(c));
2591 c.u.mdio.paddr_mmd = htons(FW_LDST_CMD_PADDR(phy_addr) |
2592 FW_LDST_CMD_MMD(mmd));
2593 c.u.mdio.raddr = htons(reg);
2594 c.u.mdio.rval = htons(val);
2595
2596 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2597}
2598
2599/**
Vipul Pandya636f9d32012-09-26 02:39:39 +00002600 * t4_fw_hello - establish communication with FW
2601 * @adap: the adapter
2602 * @mbox: mailbox to use for the FW command
2603 * @evt_mbox: mailbox to receive async FW events
2604 * @master: specifies the caller's willingness to be the device master
2605 * @state: returns the current device state (if non-NULL)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002606 *
Vipul Pandya636f9d32012-09-26 02:39:39 +00002607 * Issues a command to establish communication with FW. Returns either
2608 * an error (negative integer) or the mailbox of the Master PF.
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002609 */
2610int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox,
2611 enum dev_master master, enum dev_state *state)
2612{
2613 int ret;
2614 struct fw_hello_cmd c;
Vipul Pandya636f9d32012-09-26 02:39:39 +00002615 u32 v;
2616 unsigned int master_mbox;
2617 int retries = FW_CMD_HELLO_RETRIES;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002618
Vipul Pandya636f9d32012-09-26 02:39:39 +00002619retry:
2620 memset(&c, 0, sizeof(c));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002621 INIT_CMD(c, HELLO, WRITE);
Naresh Kumar Innace91a922012-11-15 22:41:17 +05302622 c.err_to_clearinit = htonl(
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002623 FW_HELLO_CMD_MASTERDIS(master == MASTER_CANT) |
2624 FW_HELLO_CMD_MASTERFORCE(master == MASTER_MUST) |
Vipul Pandya636f9d32012-09-26 02:39:39 +00002625 FW_HELLO_CMD_MBMASTER(master == MASTER_MUST ? mbox :
2626 FW_HELLO_CMD_MBMASTER_MASK) |
2627 FW_HELLO_CMD_MBASYNCNOT(evt_mbox) |
2628 FW_HELLO_CMD_STAGE(fw_hello_cmd_stage_os) |
2629 FW_HELLO_CMD_CLEARINIT);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002630
Vipul Pandya636f9d32012-09-26 02:39:39 +00002631 /*
2632 * Issue the HELLO command to the firmware. If it's not successful
2633 * but indicates that we got a "busy" or "timeout" condition, retry
2634 * the HELLO until we exhaust our retry limit.
2635 */
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002636 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
Vipul Pandya636f9d32012-09-26 02:39:39 +00002637 if (ret < 0) {
2638 if ((ret == -EBUSY || ret == -ETIMEDOUT) && retries-- > 0)
2639 goto retry;
2640 return ret;
2641 }
2642
Naresh Kumar Innace91a922012-11-15 22:41:17 +05302643 v = ntohl(c.err_to_clearinit);
Vipul Pandya636f9d32012-09-26 02:39:39 +00002644 master_mbox = FW_HELLO_CMD_MBMASTER_GET(v);
2645 if (state) {
2646 if (v & FW_HELLO_CMD_ERR)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002647 *state = DEV_STATE_ERR;
Vipul Pandya636f9d32012-09-26 02:39:39 +00002648 else if (v & FW_HELLO_CMD_INIT)
2649 *state = DEV_STATE_INIT;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002650 else
2651 *state = DEV_STATE_UNINIT;
2652 }
Vipul Pandya636f9d32012-09-26 02:39:39 +00002653
2654 /*
2655 * If we're not the Master PF then we need to wait around for the
2656 * Master PF Driver to finish setting up the adapter.
2657 *
2658 * Note that we also do this wait if we're a non-Master-capable PF and
2659 * there is no current Master PF; a Master PF may show up momentarily
2660 * and we wouldn't want to fail pointlessly. (This can happen when an
2661 * OS loads lots of different drivers rapidly at the same time). In
2662 * this case, the Master PF returned by the firmware will be
2663 * FW_PCIE_FW_MASTER_MASK so the test below will work ...
2664 */
2665 if ((v & (FW_HELLO_CMD_ERR|FW_HELLO_CMD_INIT)) == 0 &&
2666 master_mbox != mbox) {
2667 int waiting = FW_CMD_HELLO_TIMEOUT;
2668
2669 /*
2670 * Wait for the firmware to either indicate an error or
2671 * initialized state. If we see either of these we bail out
2672 * and report the issue to the caller. If we exhaust the
2673 * "hello timeout" and we haven't exhausted our retries, try
2674 * again. Otherwise bail with a timeout error.
2675 */
2676 for (;;) {
2677 u32 pcie_fw;
2678
2679 msleep(50);
2680 waiting -= 50;
2681
2682 /*
2683 * If neither Error nor Initialialized are indicated
2684 * by the firmware keep waiting till we exaust our
2685 * timeout ... and then retry if we haven't exhausted
2686 * our retries ...
2687 */
2688 pcie_fw = t4_read_reg(adap, MA_PCIE_FW);
2689 if (!(pcie_fw & (FW_PCIE_FW_ERR|FW_PCIE_FW_INIT))) {
2690 if (waiting <= 0) {
2691 if (retries-- > 0)
2692 goto retry;
2693
2694 return -ETIMEDOUT;
2695 }
2696 continue;
2697 }
2698
2699 /*
2700 * We either have an Error or Initialized condition
2701 * report errors preferentially.
2702 */
2703 if (state) {
2704 if (pcie_fw & FW_PCIE_FW_ERR)
2705 *state = DEV_STATE_ERR;
2706 else if (pcie_fw & FW_PCIE_FW_INIT)
2707 *state = DEV_STATE_INIT;
2708 }
2709
2710 /*
2711 * If we arrived before a Master PF was selected and
2712 * there's not a valid Master PF, grab its identity
2713 * for our caller.
2714 */
2715 if (master_mbox == FW_PCIE_FW_MASTER_MASK &&
2716 (pcie_fw & FW_PCIE_FW_MASTER_VLD))
2717 master_mbox = FW_PCIE_FW_MASTER_GET(pcie_fw);
2718 break;
2719 }
2720 }
2721
2722 return master_mbox;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002723}
2724
2725/**
2726 * t4_fw_bye - end communication with FW
2727 * @adap: the adapter
2728 * @mbox: mailbox to use for the FW command
2729 *
2730 * Issues a command to terminate communication with FW.
2731 */
2732int t4_fw_bye(struct adapter *adap, unsigned int mbox)
2733{
2734 struct fw_bye_cmd c;
2735
Vipul Pandya0062b152012-11-06 03:37:09 +00002736 memset(&c, 0, sizeof(c));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002737 INIT_CMD(c, BYE, WRITE);
2738 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2739}
2740
2741/**
2742 * t4_init_cmd - ask FW to initialize the device
2743 * @adap: the adapter
2744 * @mbox: mailbox to use for the FW command
2745 *
2746 * Issues a command to FW to partially initialize the device. This
2747 * performs initialization that generally doesn't depend on user input.
2748 */
2749int t4_early_init(struct adapter *adap, unsigned int mbox)
2750{
2751 struct fw_initialize_cmd c;
2752
Vipul Pandya0062b152012-11-06 03:37:09 +00002753 memset(&c, 0, sizeof(c));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002754 INIT_CMD(c, INITIALIZE, WRITE);
2755 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2756}
2757
2758/**
2759 * t4_fw_reset - issue a reset to FW
2760 * @adap: the adapter
2761 * @mbox: mailbox to use for the FW command
2762 * @reset: specifies the type of reset to perform
2763 *
2764 * Issues a reset command of the specified type to FW.
2765 */
2766int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset)
2767{
2768 struct fw_reset_cmd c;
2769
Vipul Pandya0062b152012-11-06 03:37:09 +00002770 memset(&c, 0, sizeof(c));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00002771 INIT_CMD(c, RESET, WRITE);
2772 c.val = htonl(reset);
2773 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2774}
2775
2776/**
Vipul Pandya26f7cbc2012-09-26 02:39:42 +00002777 * t4_fw_halt - issue a reset/halt to FW and put uP into RESET
2778 * @adap: the adapter
2779 * @mbox: mailbox to use for the FW RESET command (if desired)
2780 * @force: force uP into RESET even if FW RESET command fails
2781 *
2782 * Issues a RESET command to firmware (if desired) with a HALT indication
2783 * and then puts the microprocessor into RESET state. The RESET command
2784 * will only be issued if a legitimate mailbox is provided (mbox <=
2785 * FW_PCIE_FW_MASTER_MASK).
2786 *
2787 * This is generally used in order for the host to safely manipulate the
2788 * adapter without fear of conflicting with whatever the firmware might
2789 * be doing. The only way out of this state is to RESTART the firmware
2790 * ...
2791 */
stephen hemmingerde5b8672013-12-18 14:16:47 -08002792static int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
Vipul Pandya26f7cbc2012-09-26 02:39:42 +00002793{
2794 int ret = 0;
2795
2796 /*
2797 * If a legitimate mailbox is provided, issue a RESET command
2798 * with a HALT indication.
2799 */
2800 if (mbox <= FW_PCIE_FW_MASTER_MASK) {
2801 struct fw_reset_cmd c;
2802
2803 memset(&c, 0, sizeof(c));
2804 INIT_CMD(c, RESET, WRITE);
2805 c.val = htonl(PIORST | PIORSTMODE);
2806 c.halt_pkd = htonl(FW_RESET_CMD_HALT(1U));
2807 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
2808 }
2809
2810 /*
2811 * Normally we won't complete the operation if the firmware RESET
2812 * command fails but if our caller insists we'll go ahead and put the
2813 * uP into RESET. This can be useful if the firmware is hung or even
2814 * missing ... We'll have to take the risk of putting the uP into
2815 * RESET without the cooperation of firmware in that case.
2816 *
2817 * We also force the firmware's HALT flag to be on in case we bypassed
2818 * the firmware RESET command above or we're dealing with old firmware
2819 * which doesn't have the HALT capability. This will serve as a flag
2820 * for the incoming firmware to know that it's coming out of a HALT
2821 * rather than a RESET ... if it's new enough to understand that ...
2822 */
2823 if (ret == 0 || force) {
2824 t4_set_reg_field(adap, CIM_BOOT_CFG, UPCRST, UPCRST);
2825 t4_set_reg_field(adap, PCIE_FW, FW_PCIE_FW_HALT,
2826 FW_PCIE_FW_HALT);
2827 }
2828
2829 /*
2830 * And we always return the result of the firmware RESET command
2831 * even when we force the uP into RESET ...
2832 */
2833 return ret;
2834}
2835
2836/**
2837 * t4_fw_restart - restart the firmware by taking the uP out of RESET
2838 * @adap: the adapter
2839 * @reset: if we want to do a RESET to restart things
2840 *
2841 * Restart firmware previously halted by t4_fw_halt(). On successful
2842 * return the previous PF Master remains as the new PF Master and there
2843 * is no need to issue a new HELLO command, etc.
2844 *
2845 * We do this in two ways:
2846 *
2847 * 1. If we're dealing with newer firmware we'll simply want to take
2848 * the chip's microprocessor out of RESET. This will cause the
2849 * firmware to start up from its start vector. And then we'll loop
2850 * until the firmware indicates it's started again (PCIE_FW.HALT
2851 * reset to 0) or we timeout.
2852 *
2853 * 2. If we're dealing with older firmware then we'll need to RESET
2854 * the chip since older firmware won't recognize the PCIE_FW.HALT
2855 * flag and automatically RESET itself on startup.
2856 */
stephen hemmingerde5b8672013-12-18 14:16:47 -08002857static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
Vipul Pandya26f7cbc2012-09-26 02:39:42 +00002858{
2859 if (reset) {
2860 /*
2861 * Since we're directing the RESET instead of the firmware
2862 * doing it automatically, we need to clear the PCIE_FW.HALT
2863 * bit.
2864 */
2865 t4_set_reg_field(adap, PCIE_FW, FW_PCIE_FW_HALT, 0);
2866
2867 /*
2868 * If we've been given a valid mailbox, first try to get the
2869 * firmware to do the RESET. If that works, great and we can
2870 * return success. Otherwise, if we haven't been given a
2871 * valid mailbox or the RESET command failed, fall back to
2872 * hitting the chip with a hammer.
2873 */
2874 if (mbox <= FW_PCIE_FW_MASTER_MASK) {
2875 t4_set_reg_field(adap, CIM_BOOT_CFG, UPCRST, 0);
2876 msleep(100);
2877 if (t4_fw_reset(adap, mbox,
2878 PIORST | PIORSTMODE) == 0)
2879 return 0;
2880 }
2881
2882 t4_write_reg(adap, PL_RST, PIORST | PIORSTMODE);
2883 msleep(2000);
2884 } else {
2885 int ms;
2886
2887 t4_set_reg_field(adap, CIM_BOOT_CFG, UPCRST, 0);
2888 for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) {
2889 if (!(t4_read_reg(adap, PCIE_FW) & FW_PCIE_FW_HALT))
2890 return 0;
2891 msleep(100);
2892 ms += 100;
2893 }
2894 return -ETIMEDOUT;
2895 }
2896 return 0;
2897}
2898
2899/**
2900 * t4_fw_upgrade - perform all of the steps necessary to upgrade FW
2901 * @adap: the adapter
2902 * @mbox: mailbox to use for the FW RESET command (if desired)
2903 * @fw_data: the firmware image to write
2904 * @size: image size
2905 * @force: force upgrade even if firmware doesn't cooperate
2906 *
2907 * Perform all of the steps necessary for upgrading an adapter's
2908 * firmware image. Normally this requires the cooperation of the
2909 * existing firmware in order to halt all existing activities
2910 * but if an invalid mailbox token is passed in we skip that step
2911 * (though we'll still put the adapter microprocessor into RESET in
2912 * that case).
2913 *
2914 * On successful return the new firmware will have been loaded and
2915 * the adapter will have been fully RESET losing all previous setup
2916 * state. On unsuccessful return the adapter may be completely hosed ...
2917 * positive errno indicates that the adapter is ~probably~ intact, a
2918 * negative errno indicates that things are looking bad ...
2919 */
stephen hemmingerde5b8672013-12-18 14:16:47 -08002920static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
2921 const u8 *fw_data, unsigned int size, int force)
Vipul Pandya26f7cbc2012-09-26 02:39:42 +00002922{
2923 const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
2924 int reset, ret;
2925
2926 ret = t4_fw_halt(adap, mbox, force);
2927 if (ret < 0 && !force)
2928 return ret;
2929
2930 ret = t4_load_fw(adap, fw_data, size);
2931 if (ret < 0)
2932 return ret;
2933
2934 /*
2935 * Older versions of the firmware don't understand the new
2936 * PCIE_FW.HALT flag and so won't know to perform a RESET when they
2937 * restart. So for newly loaded older firmware we'll have to do the
2938 * RESET for it so it starts up on a clean slate. We can tell if
2939 * the newly loaded firmware will handle this right by checking
2940 * its header flags to see if it advertises the capability.
2941 */
2942 reset = ((ntohl(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0);
2943 return t4_fw_restart(adap, mbox, reset);
2944}
2945
Vipul Pandya636f9d32012-09-26 02:39:39 +00002946/**
2947 * t4_fixup_host_params - fix up host-dependent parameters
2948 * @adap: the adapter
2949 * @page_size: the host's Base Page Size
2950 * @cache_line_size: the host's Cache Line Size
2951 *
2952 * Various registers in T4 contain values which are dependent on the
2953 * host's Base Page and Cache Line Sizes. This function will fix all of
2954 * those registers with the appropriate values as passed in ...
2955 */
2956int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
2957 unsigned int cache_line_size)
2958{
2959 unsigned int page_shift = fls(page_size) - 1;
2960 unsigned int sge_hps = page_shift - 10;
2961 unsigned int stat_len = cache_line_size > 64 ? 128 : 64;
2962 unsigned int fl_align = cache_line_size < 32 ? 32 : cache_line_size;
2963 unsigned int fl_align_log = fls(fl_align) - 1;
2964
2965 t4_write_reg(adap, SGE_HOST_PAGE_SIZE,
2966 HOSTPAGESIZEPF0(sge_hps) |
2967 HOSTPAGESIZEPF1(sge_hps) |
2968 HOSTPAGESIZEPF2(sge_hps) |
2969 HOSTPAGESIZEPF3(sge_hps) |
2970 HOSTPAGESIZEPF4(sge_hps) |
2971 HOSTPAGESIZEPF5(sge_hps) |
2972 HOSTPAGESIZEPF6(sge_hps) |
2973 HOSTPAGESIZEPF7(sge_hps));
2974
2975 t4_set_reg_field(adap, SGE_CONTROL,
Vipul Pandya0dad9e92012-11-07 03:45:46 +00002976 INGPADBOUNDARY_MASK |
Vipul Pandya636f9d32012-09-26 02:39:39 +00002977 EGRSTATUSPAGESIZE_MASK,
2978 INGPADBOUNDARY(fl_align_log - 5) |
2979 EGRSTATUSPAGESIZE(stat_len != 64));
2980
2981 /*
2982 * Adjust various SGE Free List Host Buffer Sizes.
2983 *
2984 * This is something of a crock since we're using fixed indices into
2985 * the array which are also known by the sge.c code and the T4
2986 * Firmware Configuration File. We need to come up with a much better
2987 * approach to managing this array. For now, the first four entries
2988 * are:
2989 *
2990 * 0: Host Page Size
2991 * 1: 64KB
2992 * 2: Buffer size corresponding to 1500 byte MTU (unpacked mode)
2993 * 3: Buffer size corresponding to 9000 byte MTU (unpacked mode)
2994 *
2995 * For the single-MTU buffers in unpacked mode we need to include
2996 * space for the SGE Control Packet Shift, 14 byte Ethernet header,
2997 * possible 4 byte VLAN tag, all rounded up to the next Ingress Packet
2998 * Padding boundry. All of these are accommodated in the Factory
2999 * Default Firmware Configuration File but we need to adjust it for
3000 * this host's cache line size.
3001 */
3002 t4_write_reg(adap, SGE_FL_BUFFER_SIZE0, page_size);
3003 t4_write_reg(adap, SGE_FL_BUFFER_SIZE2,
3004 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE2) + fl_align-1)
3005 & ~(fl_align-1));
3006 t4_write_reg(adap, SGE_FL_BUFFER_SIZE3,
3007 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE3) + fl_align-1)
3008 & ~(fl_align-1));
3009
3010 t4_write_reg(adap, ULP_RX_TDDP_PSZ, HPZ0(page_shift - 12));
3011
3012 return 0;
3013}
3014
3015/**
3016 * t4_fw_initialize - ask FW to initialize the device
3017 * @adap: the adapter
3018 * @mbox: mailbox to use for the FW command
3019 *
3020 * Issues a command to FW to partially initialize the device. This
3021 * performs initialization that generally doesn't depend on user input.
3022 */
3023int t4_fw_initialize(struct adapter *adap, unsigned int mbox)
3024{
3025 struct fw_initialize_cmd c;
3026
3027 memset(&c, 0, sizeof(c));
3028 INIT_CMD(c, INITIALIZE, WRITE);
3029 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3030}
3031
3032/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003033 * t4_query_params - query FW or device parameters
3034 * @adap: the adapter
3035 * @mbox: mailbox to use for the FW command
3036 * @pf: the PF
3037 * @vf: the VF
3038 * @nparams: the number of parameters
3039 * @params: the parameter names
3040 * @val: the parameter values
3041 *
3042 * Reads the value of FW or device parameters. Up to 7 parameters can be
3043 * queried at once.
3044 */
3045int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
3046 unsigned int vf, unsigned int nparams, const u32 *params,
3047 u32 *val)
3048{
3049 int i, ret;
3050 struct fw_params_cmd c;
3051 __be32 *p = &c.param[0].mnem;
3052
3053 if (nparams > 7)
3054 return -EINVAL;
3055
3056 memset(&c, 0, sizeof(c));
3057 c.op_to_vfn = htonl(FW_CMD_OP(FW_PARAMS_CMD) | FW_CMD_REQUEST |
3058 FW_CMD_READ | FW_PARAMS_CMD_PFN(pf) |
3059 FW_PARAMS_CMD_VFN(vf));
3060 c.retval_len16 = htonl(FW_LEN16(c));
3061 for (i = 0; i < nparams; i++, p += 2)
3062 *p = htonl(*params++);
3063
3064 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3065 if (ret == 0)
3066 for (i = 0, p = &c.param[0].val; i < nparams; i++, p += 2)
3067 *val++ = ntohl(*p);
3068 return ret;
3069}
3070
3071/**
3072 * t4_set_params - sets FW or device parameters
3073 * @adap: the adapter
3074 * @mbox: mailbox to use for the FW command
3075 * @pf: the PF
3076 * @vf: the VF
3077 * @nparams: the number of parameters
3078 * @params: the parameter names
3079 * @val: the parameter values
3080 *
3081 * Sets the value of FW or device parameters. Up to 7 parameters can be
3082 * specified at once.
3083 */
3084int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
3085 unsigned int vf, unsigned int nparams, const u32 *params,
3086 const u32 *val)
3087{
3088 struct fw_params_cmd c;
3089 __be32 *p = &c.param[0].mnem;
3090
3091 if (nparams > 7)
3092 return -EINVAL;
3093
3094 memset(&c, 0, sizeof(c));
3095 c.op_to_vfn = htonl(FW_CMD_OP(FW_PARAMS_CMD) | FW_CMD_REQUEST |
3096 FW_CMD_WRITE | FW_PARAMS_CMD_PFN(pf) |
3097 FW_PARAMS_CMD_VFN(vf));
3098 c.retval_len16 = htonl(FW_LEN16(c));
3099 while (nparams--) {
3100 *p++ = htonl(*params++);
3101 *p++ = htonl(*val++);
3102 }
3103
3104 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3105}
3106
3107/**
3108 * t4_cfg_pfvf - configure PF/VF resource limits
3109 * @adap: the adapter
3110 * @mbox: mailbox to use for the FW command
3111 * @pf: the PF being configured
3112 * @vf: the VF being configured
3113 * @txq: the max number of egress queues
3114 * @txq_eth_ctrl: the max number of egress Ethernet or control queues
3115 * @rxqi: the max number of interrupt-capable ingress queues
3116 * @rxq: the max number of interruptless ingress queues
3117 * @tc: the PCI traffic class
3118 * @vi: the max number of virtual interfaces
3119 * @cmask: the channel access rights mask for the PF/VF
3120 * @pmask: the port access rights mask for the PF/VF
3121 * @nexact: the maximum number of exact MPS filters
3122 * @rcaps: read capabilities
3123 * @wxcaps: write/execute capabilities
3124 *
3125 * Configures resource limits and capabilities for a physical or virtual
3126 * function.
3127 */
3128int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf,
3129 unsigned int vf, unsigned int txq, unsigned int txq_eth_ctrl,
3130 unsigned int rxqi, unsigned int rxq, unsigned int tc,
3131 unsigned int vi, unsigned int cmask, unsigned int pmask,
3132 unsigned int nexact, unsigned int rcaps, unsigned int wxcaps)
3133{
3134 struct fw_pfvf_cmd c;
3135
3136 memset(&c, 0, sizeof(c));
3137 c.op_to_vfn = htonl(FW_CMD_OP(FW_PFVF_CMD) | FW_CMD_REQUEST |
3138 FW_CMD_WRITE | FW_PFVF_CMD_PFN(pf) |
3139 FW_PFVF_CMD_VFN(vf));
3140 c.retval_len16 = htonl(FW_LEN16(c));
3141 c.niqflint_niq = htonl(FW_PFVF_CMD_NIQFLINT(rxqi) |
3142 FW_PFVF_CMD_NIQ(rxq));
Casey Leedom81323b72010-06-25 12:10:32 +00003143 c.type_to_neq = htonl(FW_PFVF_CMD_CMASK(cmask) |
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003144 FW_PFVF_CMD_PMASK(pmask) |
3145 FW_PFVF_CMD_NEQ(txq));
3146 c.tc_to_nexactf = htonl(FW_PFVF_CMD_TC(tc) | FW_PFVF_CMD_NVI(vi) |
3147 FW_PFVF_CMD_NEXACTF(nexact));
3148 c.r_caps_to_nethctrl = htonl(FW_PFVF_CMD_R_CAPS(rcaps) |
3149 FW_PFVF_CMD_WX_CAPS(wxcaps) |
3150 FW_PFVF_CMD_NETHCTRL(txq_eth_ctrl));
3151 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3152}
3153
3154/**
3155 * t4_alloc_vi - allocate a virtual interface
3156 * @adap: the adapter
3157 * @mbox: mailbox to use for the FW command
3158 * @port: physical port associated with the VI
3159 * @pf: the PF owning the VI
3160 * @vf: the VF owning the VI
3161 * @nmac: number of MAC addresses needed (1 to 5)
3162 * @mac: the MAC addresses of the VI
3163 * @rss_size: size of RSS table slice associated with this VI
3164 *
3165 * Allocates a virtual interface for the given physical port. If @mac is
3166 * not %NULL it contains the MAC addresses of the VI as assigned by FW.
3167 * @mac should be large enough to hold @nmac Ethernet addresses, they are
3168 * stored consecutively so the space needed is @nmac * 6 bytes.
3169 * Returns a negative error number or the non-negative VI id.
3170 */
3171int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
3172 unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
3173 unsigned int *rss_size)
3174{
3175 int ret;
3176 struct fw_vi_cmd c;
3177
3178 memset(&c, 0, sizeof(c));
3179 c.op_to_vfn = htonl(FW_CMD_OP(FW_VI_CMD) | FW_CMD_REQUEST |
3180 FW_CMD_WRITE | FW_CMD_EXEC |
3181 FW_VI_CMD_PFN(pf) | FW_VI_CMD_VFN(vf));
3182 c.alloc_to_len16 = htonl(FW_VI_CMD_ALLOC | FW_LEN16(c));
3183 c.portid_pkd = FW_VI_CMD_PORTID(port);
3184 c.nmac = nmac - 1;
3185
3186 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3187 if (ret)
3188 return ret;
3189
3190 if (mac) {
3191 memcpy(mac, c.mac, sizeof(c.mac));
3192 switch (nmac) {
3193 case 5:
3194 memcpy(mac + 24, c.nmac3, sizeof(c.nmac3));
3195 case 4:
3196 memcpy(mac + 18, c.nmac2, sizeof(c.nmac2));
3197 case 3:
3198 memcpy(mac + 12, c.nmac1, sizeof(c.nmac1));
3199 case 2:
3200 memcpy(mac + 6, c.nmac0, sizeof(c.nmac0));
3201 }
3202 }
3203 if (rss_size)
3204 *rss_size = FW_VI_CMD_RSSSIZE_GET(ntohs(c.rsssize_pkd));
Dimitris Michailidisa0881ca2010-06-18 10:05:34 +00003205 return FW_VI_CMD_VIID_GET(ntohs(c.type_viid));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003206}
3207
3208/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003209 * t4_set_rxmode - set Rx properties of a virtual interface
3210 * @adap: the adapter
3211 * @mbox: mailbox to use for the FW command
3212 * @viid: the VI id
3213 * @mtu: the new MTU or -1
3214 * @promisc: 1 to enable promiscuous mode, 0 to disable it, -1 no change
3215 * @all_multi: 1 to enable all-multi mode, 0 to disable it, -1 no change
3216 * @bcast: 1 to enable broadcast Rx, 0 to disable it, -1 no change
Dimitris Michailidisf8f5aaf2010-05-10 15:58:07 +00003217 * @vlanex: 1 to enable HW VLAN extraction, 0 to disable it, -1 no change
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003218 * @sleep_ok: if true we may sleep while awaiting command completion
3219 *
3220 * Sets Rx properties of a virtual interface.
3221 */
3222int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
Dimitris Michailidisf8f5aaf2010-05-10 15:58:07 +00003223 int mtu, int promisc, int all_multi, int bcast, int vlanex,
3224 bool sleep_ok)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003225{
3226 struct fw_vi_rxmode_cmd c;
3227
3228 /* convert to FW values */
3229 if (mtu < 0)
3230 mtu = FW_RXMODE_MTU_NO_CHG;
3231 if (promisc < 0)
3232 promisc = FW_VI_RXMODE_CMD_PROMISCEN_MASK;
3233 if (all_multi < 0)
3234 all_multi = FW_VI_RXMODE_CMD_ALLMULTIEN_MASK;
3235 if (bcast < 0)
3236 bcast = FW_VI_RXMODE_CMD_BROADCASTEN_MASK;
Dimitris Michailidisf8f5aaf2010-05-10 15:58:07 +00003237 if (vlanex < 0)
3238 vlanex = FW_VI_RXMODE_CMD_VLANEXEN_MASK;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003239
3240 memset(&c, 0, sizeof(c));
3241 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_RXMODE_CMD) | FW_CMD_REQUEST |
3242 FW_CMD_WRITE | FW_VI_RXMODE_CMD_VIID(viid));
3243 c.retval_len16 = htonl(FW_LEN16(c));
Dimitris Michailidisf8f5aaf2010-05-10 15:58:07 +00003244 c.mtu_to_vlanexen = htonl(FW_VI_RXMODE_CMD_MTU(mtu) |
3245 FW_VI_RXMODE_CMD_PROMISCEN(promisc) |
3246 FW_VI_RXMODE_CMD_ALLMULTIEN(all_multi) |
3247 FW_VI_RXMODE_CMD_BROADCASTEN(bcast) |
3248 FW_VI_RXMODE_CMD_VLANEXEN(vlanex));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003249 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
3250}
3251
3252/**
3253 * t4_alloc_mac_filt - allocates exact-match filters for MAC addresses
3254 * @adap: the adapter
3255 * @mbox: mailbox to use for the FW command
3256 * @viid: the VI id
3257 * @free: if true any existing filters for this VI id are first removed
3258 * @naddr: the number of MAC addresses to allocate filters for (up to 7)
3259 * @addr: the MAC address(es)
3260 * @idx: where to store the index of each allocated filter
3261 * @hash: pointer to hash address filter bitmap
3262 * @sleep_ok: call is allowed to sleep
3263 *
3264 * Allocates an exact-match filter for each of the supplied addresses and
3265 * sets it to the corresponding address. If @idx is not %NULL it should
3266 * have at least @naddr entries, each of which will be set to the index of
3267 * the filter allocated for the corresponding MAC address. If a filter
3268 * could not be allocated for an address its index is set to 0xffff.
3269 * If @hash is not %NULL addresses that fail to allocate an exact filter
3270 * are hashed and update the hash filter bitmap pointed at by @hash.
3271 *
3272 * Returns a negative error number or the number of filters allocated.
3273 */
3274int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
3275 unsigned int viid, bool free, unsigned int naddr,
3276 const u8 **addr, u16 *idx, u64 *hash, bool sleep_ok)
3277{
3278 int i, ret;
3279 struct fw_vi_mac_cmd c;
3280 struct fw_vi_mac_exact *p;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303281 unsigned int max_naddr = is_t4(adap->params.chip) ?
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003282 NUM_MPS_CLS_SRAM_L_INSTANCES :
3283 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003284
3285 if (naddr > 7)
3286 return -EINVAL;
3287
3288 memset(&c, 0, sizeof(c));
3289 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_MAC_CMD) | FW_CMD_REQUEST |
3290 FW_CMD_WRITE | (free ? FW_CMD_EXEC : 0) |
3291 FW_VI_MAC_CMD_VIID(viid));
3292 c.freemacs_to_len16 = htonl(FW_VI_MAC_CMD_FREEMACS(free) |
3293 FW_CMD_LEN16((naddr + 2) / 2));
3294
3295 for (i = 0, p = c.u.exact; i < naddr; i++, p++) {
3296 p->valid_to_idx = htons(FW_VI_MAC_CMD_VALID |
3297 FW_VI_MAC_CMD_IDX(FW_VI_MAC_ADD_MAC));
3298 memcpy(p->macaddr, addr[i], sizeof(p->macaddr));
3299 }
3300
3301 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
3302 if (ret)
3303 return ret;
3304
3305 for (i = 0, p = c.u.exact; i < naddr; i++, p++) {
3306 u16 index = FW_VI_MAC_CMD_IDX_GET(ntohs(p->valid_to_idx));
3307
3308 if (idx)
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003309 idx[i] = index >= max_naddr ? 0xffff : index;
3310 if (index < max_naddr)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003311 ret++;
3312 else if (hash)
Dimitris Michailidisce9aeb52010-12-03 10:39:04 +00003313 *hash |= (1ULL << hash_mac_addr(addr[i]));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003314 }
3315 return ret;
3316}
3317
3318/**
3319 * t4_change_mac - modifies the exact-match filter for a MAC address
3320 * @adap: the adapter
3321 * @mbox: mailbox to use for the FW command
3322 * @viid: the VI id
3323 * @idx: index of existing filter for old value of MAC address, or -1
3324 * @addr: the new MAC address value
3325 * @persist: whether a new MAC allocation should be persistent
3326 * @add_smt: if true also add the address to the HW SMT
3327 *
3328 * Modifies an exact-match filter and sets it to the new MAC address.
3329 * Note that in general it is not possible to modify the value of a given
3330 * filter so the generic way to modify an address filter is to free the one
3331 * being used by the old address value and allocate a new filter for the
3332 * new address value. @idx can be -1 if the address is a new addition.
3333 *
3334 * Returns a negative error number or the index of the filter with the new
3335 * MAC value.
3336 */
3337int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
3338 int idx, const u8 *addr, bool persist, bool add_smt)
3339{
3340 int ret, mode;
3341 struct fw_vi_mac_cmd c;
3342 struct fw_vi_mac_exact *p = c.u.exact;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303343 unsigned int max_mac_addr = is_t4(adap->params.chip) ?
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003344 NUM_MPS_CLS_SRAM_L_INSTANCES :
3345 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003346
3347 if (idx < 0) /* new allocation */
3348 idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC;
3349 mode = add_smt ? FW_VI_MAC_SMT_AND_MPSTCAM : FW_VI_MAC_MPS_TCAM_ENTRY;
3350
3351 memset(&c, 0, sizeof(c));
3352 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_MAC_CMD) | FW_CMD_REQUEST |
3353 FW_CMD_WRITE | FW_VI_MAC_CMD_VIID(viid));
3354 c.freemacs_to_len16 = htonl(FW_CMD_LEN16(1));
3355 p->valid_to_idx = htons(FW_VI_MAC_CMD_VALID |
3356 FW_VI_MAC_CMD_SMAC_RESULT(mode) |
3357 FW_VI_MAC_CMD_IDX(idx));
3358 memcpy(p->macaddr, addr, sizeof(p->macaddr));
3359
3360 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3361 if (ret == 0) {
3362 ret = FW_VI_MAC_CMD_IDX_GET(ntohs(p->valid_to_idx));
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003363 if (ret >= max_mac_addr)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003364 ret = -ENOMEM;
3365 }
3366 return ret;
3367}
3368
3369/**
3370 * t4_set_addr_hash - program the MAC inexact-match hash filter
3371 * @adap: the adapter
3372 * @mbox: mailbox to use for the FW command
3373 * @viid: the VI id
3374 * @ucast: whether the hash filter should also match unicast addresses
3375 * @vec: the value to be written to the hash filter
3376 * @sleep_ok: call is allowed to sleep
3377 *
3378 * Sets the 64-bit inexact-match hash filter for a virtual interface.
3379 */
3380int t4_set_addr_hash(struct adapter *adap, unsigned int mbox, unsigned int viid,
3381 bool ucast, u64 vec, bool sleep_ok)
3382{
3383 struct fw_vi_mac_cmd c;
3384
3385 memset(&c, 0, sizeof(c));
3386 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_MAC_CMD) | FW_CMD_REQUEST |
3387 FW_CMD_WRITE | FW_VI_ENABLE_CMD_VIID(viid));
3388 c.freemacs_to_len16 = htonl(FW_VI_MAC_CMD_HASHVECEN |
3389 FW_VI_MAC_CMD_HASHUNIEN(ucast) |
3390 FW_CMD_LEN16(1));
3391 c.u.hash.hashvec = cpu_to_be64(vec);
3392 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
3393}
3394
3395/**
3396 * t4_enable_vi - enable/disable a virtual interface
3397 * @adap: the adapter
3398 * @mbox: mailbox to use for the FW command
3399 * @viid: the VI id
3400 * @rx_en: 1=enable Rx, 0=disable Rx
3401 * @tx_en: 1=enable Tx, 0=disable Tx
3402 *
3403 * Enables/disables a virtual interface.
3404 */
3405int t4_enable_vi(struct adapter *adap, unsigned int mbox, unsigned int viid,
3406 bool rx_en, bool tx_en)
3407{
3408 struct fw_vi_enable_cmd c;
3409
3410 memset(&c, 0, sizeof(c));
3411 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_ENABLE_CMD) | FW_CMD_REQUEST |
3412 FW_CMD_EXEC | FW_VI_ENABLE_CMD_VIID(viid));
3413 c.ien_to_len16 = htonl(FW_VI_ENABLE_CMD_IEN(rx_en) |
3414 FW_VI_ENABLE_CMD_EEN(tx_en) | FW_LEN16(c));
3415 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3416}
3417
3418/**
3419 * t4_identify_port - identify a VI's port by blinking its LED
3420 * @adap: the adapter
3421 * @mbox: mailbox to use for the FW command
3422 * @viid: the VI id
3423 * @nblinks: how many times to blink LED at 2.5 Hz
3424 *
3425 * Identifies a VI's port by blinking its LED.
3426 */
3427int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid,
3428 unsigned int nblinks)
3429{
3430 struct fw_vi_enable_cmd c;
3431
Vipul Pandya0062b152012-11-06 03:37:09 +00003432 memset(&c, 0, sizeof(c));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003433 c.op_to_viid = htonl(FW_CMD_OP(FW_VI_ENABLE_CMD) | FW_CMD_REQUEST |
3434 FW_CMD_EXEC | FW_VI_ENABLE_CMD_VIID(viid));
3435 c.ien_to_len16 = htonl(FW_VI_ENABLE_CMD_LED | FW_LEN16(c));
3436 c.blinkdur = htons(nblinks);
3437 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3438}
3439
3440/**
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003441 * t4_iq_free - free an ingress queue and its FLs
3442 * @adap: the adapter
3443 * @mbox: mailbox to use for the FW command
3444 * @pf: the PF owning the queues
3445 * @vf: the VF owning the queues
3446 * @iqtype: the ingress queue type
3447 * @iqid: ingress queue id
3448 * @fl0id: FL0 queue id or 0xffff if no attached FL0
3449 * @fl1id: FL1 queue id or 0xffff if no attached FL1
3450 *
3451 * Frees an ingress queue and its associated FLs, if any.
3452 */
3453int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
3454 unsigned int vf, unsigned int iqtype, unsigned int iqid,
3455 unsigned int fl0id, unsigned int fl1id)
3456{
3457 struct fw_iq_cmd c;
3458
3459 memset(&c, 0, sizeof(c));
3460 c.op_to_vfn = htonl(FW_CMD_OP(FW_IQ_CMD) | FW_CMD_REQUEST |
3461 FW_CMD_EXEC | FW_IQ_CMD_PFN(pf) |
3462 FW_IQ_CMD_VFN(vf));
3463 c.alloc_to_len16 = htonl(FW_IQ_CMD_FREE | FW_LEN16(c));
3464 c.type_to_iqandstindex = htonl(FW_IQ_CMD_TYPE(iqtype));
3465 c.iqid = htons(iqid);
3466 c.fl0id = htons(fl0id);
3467 c.fl1id = htons(fl1id);
3468 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3469}
3470
3471/**
3472 * t4_eth_eq_free - free an Ethernet egress queue
3473 * @adap: the adapter
3474 * @mbox: mailbox to use for the FW command
3475 * @pf: the PF owning the queue
3476 * @vf: the VF owning the queue
3477 * @eqid: egress queue id
3478 *
3479 * Frees an Ethernet egress queue.
3480 */
3481int t4_eth_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
3482 unsigned int vf, unsigned int eqid)
3483{
3484 struct fw_eq_eth_cmd c;
3485
3486 memset(&c, 0, sizeof(c));
3487 c.op_to_vfn = htonl(FW_CMD_OP(FW_EQ_ETH_CMD) | FW_CMD_REQUEST |
3488 FW_CMD_EXEC | FW_EQ_ETH_CMD_PFN(pf) |
3489 FW_EQ_ETH_CMD_VFN(vf));
3490 c.alloc_to_len16 = htonl(FW_EQ_ETH_CMD_FREE | FW_LEN16(c));
3491 c.eqid_pkd = htonl(FW_EQ_ETH_CMD_EQID(eqid));
3492 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3493}
3494
3495/**
3496 * t4_ctrl_eq_free - free a control egress queue
3497 * @adap: the adapter
3498 * @mbox: mailbox to use for the FW command
3499 * @pf: the PF owning the queue
3500 * @vf: the VF owning the queue
3501 * @eqid: egress queue id
3502 *
3503 * Frees a control egress queue.
3504 */
3505int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
3506 unsigned int vf, unsigned int eqid)
3507{
3508 struct fw_eq_ctrl_cmd c;
3509
3510 memset(&c, 0, sizeof(c));
3511 c.op_to_vfn = htonl(FW_CMD_OP(FW_EQ_CTRL_CMD) | FW_CMD_REQUEST |
3512 FW_CMD_EXEC | FW_EQ_CTRL_CMD_PFN(pf) |
3513 FW_EQ_CTRL_CMD_VFN(vf));
3514 c.alloc_to_len16 = htonl(FW_EQ_CTRL_CMD_FREE | FW_LEN16(c));
3515 c.cmpliqid_eqid = htonl(FW_EQ_CTRL_CMD_EQID(eqid));
3516 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3517}
3518
3519/**
3520 * t4_ofld_eq_free - free an offload egress queue
3521 * @adap: the adapter
3522 * @mbox: mailbox to use for the FW command
3523 * @pf: the PF owning the queue
3524 * @vf: the VF owning the queue
3525 * @eqid: egress queue id
3526 *
3527 * Frees a control egress queue.
3528 */
3529int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
3530 unsigned int vf, unsigned int eqid)
3531{
3532 struct fw_eq_ofld_cmd c;
3533
3534 memset(&c, 0, sizeof(c));
3535 c.op_to_vfn = htonl(FW_CMD_OP(FW_EQ_OFLD_CMD) | FW_CMD_REQUEST |
3536 FW_CMD_EXEC | FW_EQ_OFLD_CMD_PFN(pf) |
3537 FW_EQ_OFLD_CMD_VFN(vf));
3538 c.alloc_to_len16 = htonl(FW_EQ_OFLD_CMD_FREE | FW_LEN16(c));
3539 c.eqid_pkd = htonl(FW_EQ_OFLD_CMD_EQID(eqid));
3540 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3541}
3542
3543/**
3544 * t4_handle_fw_rpl - process a FW reply message
3545 * @adap: the adapter
3546 * @rpl: start of the FW message
3547 *
3548 * Processes a FW message, such as link state change messages.
3549 */
3550int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
3551{
3552 u8 opcode = *(const u8 *)rpl;
3553
3554 if (opcode == FW_PORT_CMD) { /* link/module state change message */
3555 int speed = 0, fc = 0;
3556 const struct fw_port_cmd *p = (void *)rpl;
3557 int chan = FW_PORT_CMD_PORTID_GET(ntohl(p->op_to_portid));
3558 int port = adap->chan_map[chan];
3559 struct port_info *pi = adap2pinfo(adap, port);
3560 struct link_config *lc = &pi->link_cfg;
3561 u32 stat = ntohl(p->u.info.lstatus_to_modtype);
3562 int link_ok = (stat & FW_PORT_CMD_LSTATUS) != 0;
3563 u32 mod = FW_PORT_CMD_MODTYPE_GET(stat);
3564
3565 if (stat & FW_PORT_CMD_RXPAUSE)
3566 fc |= PAUSE_RX;
3567 if (stat & FW_PORT_CMD_TXPAUSE)
3568 fc |= PAUSE_TX;
3569 if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_100M))
Ben Hutchingse8b39012014-02-23 00:03:24 +00003570 speed = 100;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003571 else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_1G))
Ben Hutchingse8b39012014-02-23 00:03:24 +00003572 speed = 1000;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003573 else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_10G))
Ben Hutchingse8b39012014-02-23 00:03:24 +00003574 speed = 10000;
Kumar Sanghvi72aca4b2014-02-18 17:56:08 +05303575 else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_40G))
Ben Hutchingse8b39012014-02-23 00:03:24 +00003576 speed = 40000;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003577
3578 if (link_ok != lc->link_ok || speed != lc->speed ||
3579 fc != lc->fc) { /* something changed */
3580 lc->link_ok = link_ok;
3581 lc->speed = speed;
3582 lc->fc = fc;
3583 t4_os_link_changed(adap, port, link_ok);
3584 }
3585 if (mod != pi->mod_type) {
3586 pi->mod_type = mod;
3587 t4_os_portmod_changed(adap, port);
3588 }
3589 }
3590 return 0;
3591}
3592
Greg Kroah-Hartman1dd06ae2012-12-06 14:30:56 +00003593static void get_pci_mode(struct adapter *adapter, struct pci_params *p)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003594{
3595 u16 val;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003596
Jiang Liue5c8ae52012-08-20 13:53:19 -06003597 if (pci_is_pcie(adapter->pdev)) {
3598 pcie_capability_read_word(adapter->pdev, PCI_EXP_LNKSTA, &val);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003599 p->speed = val & PCI_EXP_LNKSTA_CLS;
3600 p->width = (val & PCI_EXP_LNKSTA_NLW) >> 4;
3601 }
3602}
3603
3604/**
3605 * init_link_config - initialize a link's SW state
3606 * @lc: structure holding the link state
3607 * @caps: link capabilities
3608 *
3609 * Initializes the SW state maintained for each link, including the link's
3610 * capabilities and default speed/flow-control/autonegotiation settings.
3611 */
Greg Kroah-Hartman1dd06ae2012-12-06 14:30:56 +00003612static void init_link_config(struct link_config *lc, unsigned int caps)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003613{
3614 lc->supported = caps;
3615 lc->requested_speed = 0;
3616 lc->speed = 0;
3617 lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
3618 if (lc->supported & FW_PORT_CAP_ANEG) {
3619 lc->advertising = lc->supported & ADVERT_MASK;
3620 lc->autoneg = AUTONEG_ENABLE;
3621 lc->requested_fc |= PAUSE_AUTONEG;
3622 } else {
3623 lc->advertising = 0;
3624 lc->autoneg = AUTONEG_DISABLE;
3625 }
3626}
3627
Dimitris Michailidis204dc3c2010-06-18 10:05:29 +00003628int t4_wait_dev_ready(struct adapter *adap)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003629{
3630 if (t4_read_reg(adap, PL_WHOAMI) != 0xffffffff)
3631 return 0;
3632 msleep(500);
3633 return t4_read_reg(adap, PL_WHOAMI) != 0xffffffff ? 0 : -EIO;
3634}
3635
Bill Pemberton91744942012-12-03 09:23:02 -05003636static int get_flash_params(struct adapter *adap)
Dimitris Michailidis900a6592010-06-18 10:05:27 +00003637{
3638 int ret;
3639 u32 info;
3640
3641 ret = sf1_write(adap, 1, 1, 0, SF_RD_ID);
3642 if (!ret)
3643 ret = sf1_read(adap, 3, 0, 1, &info);
3644 t4_write_reg(adap, SF_OP, 0); /* unlock SF */
3645 if (ret)
3646 return ret;
3647
3648 if ((info & 0xff) != 0x20) /* not a Numonix flash */
3649 return -EINVAL;
3650 info >>= 16; /* log2 of size */
3651 if (info >= 0x14 && info < 0x18)
3652 adap->params.sf_nsec = 1 << (info - 16);
3653 else if (info == 0x18)
3654 adap->params.sf_nsec = 64;
3655 else
3656 return -EINVAL;
3657 adap->params.sf_size = 1 << info;
3658 adap->params.sf_fw_start =
3659 t4_read_reg(adap, CIM_BOOT_CFG) & BOOTADDR_MASK;
3660 return 0;
3661}
3662
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003663/**
3664 * t4_prep_adapter - prepare SW and HW for operation
3665 * @adapter: the adapter
3666 * @reset: if true perform a HW reset
3667 *
3668 * Initialize adapter SW state for the various HW modules, set initial
3669 * values for some adapter tunables, take PHYs out of reset, and
3670 * initialize the MDIO interface.
3671 */
Bill Pemberton91744942012-12-03 09:23:02 -05003672int t4_prep_adapter(struct adapter *adapter)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003673{
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003674 int ret, ver;
3675 uint16_t device_id;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303676 u32 pl_rev;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003677
Dimitris Michailidis204dc3c2010-06-18 10:05:29 +00003678 ret = t4_wait_dev_ready(adapter);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003679 if (ret < 0)
3680 return ret;
3681
3682 get_pci_mode(adapter, &adapter->params.pci);
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303683 pl_rev = G_REV(t4_read_reg(adapter, PL_REV));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003684
Dimitris Michailidis900a6592010-06-18 10:05:27 +00003685 ret = get_flash_params(adapter);
3686 if (ret < 0) {
3687 dev_err(adapter->pdev_dev, "error %d identifying flash\n", ret);
3688 return ret;
3689 }
3690
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003691 /* Retrieve adapter's device ID
3692 */
3693 pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id);
3694 ver = device_id >> 12;
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303695 adapter->params.chip = 0;
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003696 switch (ver) {
3697 case CHELSIO_T4:
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303698 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev);
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003699 break;
3700 case CHELSIO_T5:
Hariprasad Shenaid14807d2013-12-03 17:05:56 +05303701 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev);
Santosh Rastapur0a57a532013-03-14 05:08:49 +00003702 break;
3703 default:
3704 dev_err(adapter->pdev_dev, "Device %d is not supported\n",
3705 device_id);
3706 return -EINVAL;
3707 }
3708
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003709 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
3710
3711 /*
3712 * Default port for debugging in case we can't reach FW.
3713 */
3714 adapter->params.nports = 1;
3715 adapter->params.portvec = 1;
Vipul Pandya636f9d32012-09-26 02:39:39 +00003716 adapter->params.vpd.cclk = 50000;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003717 return 0;
3718}
3719
Kumar Sanghvidcf7b6f2013-12-18 16:38:23 +05303720/**
3721 * t4_init_tp_params - initialize adap->params.tp
3722 * @adap: the adapter
3723 *
3724 * Initialize various fields of the adapter's TP Parameters structure.
3725 */
3726int t4_init_tp_params(struct adapter *adap)
3727{
3728 int chan;
3729 u32 v;
3730
3731 v = t4_read_reg(adap, TP_TIMER_RESOLUTION);
3732 adap->params.tp.tre = TIMERRESOLUTION_GET(v);
3733 adap->params.tp.dack_re = DELAYEDACKRESOLUTION_GET(v);
3734
3735 /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */
3736 for (chan = 0; chan < NCHAN; chan++)
3737 adap->params.tp.tx_modq[chan] = chan;
3738
3739 /* Cache the adapter's Compressed Filter Mode and global Incress
3740 * Configuration.
3741 */
3742 t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA,
3743 &adap->params.tp.vlan_pri_map, 1,
3744 TP_VLAN_PRI_MAP);
3745 t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA,
3746 &adap->params.tp.ingress_config, 1,
3747 TP_INGRESS_CONFIG);
3748
3749 /* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field
3750 * shift positions of several elements of the Compressed Filter Tuple
3751 * for this adapter which we need frequently ...
3752 */
3753 adap->params.tp.vlan_shift = t4_filter_field_shift(adap, F_VLAN);
3754 adap->params.tp.vnic_shift = t4_filter_field_shift(adap, F_VNIC_ID);
3755 adap->params.tp.port_shift = t4_filter_field_shift(adap, F_PORT);
3756 adap->params.tp.protocol_shift = t4_filter_field_shift(adap,
3757 F_PROTOCOL);
3758
3759 /* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID
3760 * represents the presense of an Outer VLAN instead of a VNIC ID.
3761 */
3762 if ((adap->params.tp.ingress_config & F_VNIC) == 0)
3763 adap->params.tp.vnic_shift = -1;
3764
3765 return 0;
3766}
3767
3768/**
3769 * t4_filter_field_shift - calculate filter field shift
3770 * @adap: the adapter
3771 * @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits)
3772 *
3773 * Return the shift position of a filter field within the Compressed
3774 * Filter Tuple. The filter field is specified via its selection bit
3775 * within TP_VLAN_PRI_MAL (filter mode). E.g. F_VLAN.
3776 */
3777int t4_filter_field_shift(const struct adapter *adap, int filter_sel)
3778{
3779 unsigned int filter_mode = adap->params.tp.vlan_pri_map;
3780 unsigned int sel;
3781 int field_shift;
3782
3783 if ((filter_mode & filter_sel) == 0)
3784 return -1;
3785
3786 for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) {
3787 switch (filter_mode & sel) {
3788 case F_FCOE:
3789 field_shift += W_FT_FCOE;
3790 break;
3791 case F_PORT:
3792 field_shift += W_FT_PORT;
3793 break;
3794 case F_VNIC_ID:
3795 field_shift += W_FT_VNIC_ID;
3796 break;
3797 case F_VLAN:
3798 field_shift += W_FT_VLAN;
3799 break;
3800 case F_TOS:
3801 field_shift += W_FT_TOS;
3802 break;
3803 case F_PROTOCOL:
3804 field_shift += W_FT_PROTOCOL;
3805 break;
3806 case F_ETHERTYPE:
3807 field_shift += W_FT_ETHERTYPE;
3808 break;
3809 case F_MACMATCH:
3810 field_shift += W_FT_MACMATCH;
3811 break;
3812 case F_MPSHITTYPE:
3813 field_shift += W_FT_MPSHITTYPE;
3814 break;
3815 case F_FRAGMENTATION:
3816 field_shift += W_FT_FRAGMENTATION;
3817 break;
3818 }
3819 }
3820 return field_shift;
3821}
3822
Bill Pemberton91744942012-12-03 09:23:02 -05003823int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003824{
3825 u8 addr[6];
3826 int ret, i, j = 0;
3827 struct fw_port_cmd c;
Dimitris Michailidisf7965642010-07-11 12:01:18 +00003828 struct fw_rss_vi_config_cmd rvc;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003829
3830 memset(&c, 0, sizeof(c));
Dimitris Michailidisf7965642010-07-11 12:01:18 +00003831 memset(&rvc, 0, sizeof(rvc));
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003832
3833 for_each_port(adap, i) {
3834 unsigned int rss_size;
3835 struct port_info *p = adap2pinfo(adap, i);
3836
3837 while ((adap->params.portvec & (1 << j)) == 0)
3838 j++;
3839
3840 c.op_to_portid = htonl(FW_CMD_OP(FW_PORT_CMD) |
3841 FW_CMD_REQUEST | FW_CMD_READ |
3842 FW_PORT_CMD_PORTID(j));
3843 c.action_to_len16 = htonl(
3844 FW_PORT_CMD_ACTION(FW_PORT_ACTION_GET_PORT_INFO) |
3845 FW_LEN16(c));
3846 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3847 if (ret)
3848 return ret;
3849
3850 ret = t4_alloc_vi(adap, mbox, j, pf, vf, 1, addr, &rss_size);
3851 if (ret < 0)
3852 return ret;
3853
3854 p->viid = ret;
3855 p->tx_chan = j;
3856 p->lport = j;
3857 p->rss_size = rss_size;
3858 memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003859
3860 ret = ntohl(c.u.info.lstatus_to_modtype);
3861 p->mdio_addr = (ret & FW_PORT_CMD_MDIOCAP) ?
3862 FW_PORT_CMD_MDIOADDR_GET(ret) : -1;
3863 p->port_type = FW_PORT_CMD_PTYPE_GET(ret);
Dimitris Michailidisa0881ca2010-06-18 10:05:34 +00003864 p->mod_type = FW_PORT_MOD_TYPE_NA;
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003865
Dimitris Michailidisf7965642010-07-11 12:01:18 +00003866 rvc.op_to_viid = htonl(FW_CMD_OP(FW_RSS_VI_CONFIG_CMD) |
3867 FW_CMD_REQUEST | FW_CMD_READ |
3868 FW_RSS_VI_CONFIG_CMD_VIID(p->viid));
3869 rvc.retval_len16 = htonl(FW_LEN16(rvc));
3870 ret = t4_wr_mbox(adap, mbox, &rvc, sizeof(rvc), &rvc);
3871 if (ret)
3872 return ret;
3873 p->rss_mode = ntohl(rvc.u.basicvirtual.defaultq_to_udpen);
3874
Dimitris Michailidis56d36be2010-04-01 15:28:23 +00003875 init_link_config(&p->link_cfg, ntohs(c.u.info.pcap));
3876 j++;
3877 }
3878 return 0;
3879}