]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - sys/dev/cxgbe/common/t4_hw.c
MFC r231592:
[FreeBSD/stable/9.git] / sys / dev / cxgbe / common / t4_hw.c
1 /*-
2  * Copyright (c) 2011 Chelsio Communications, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include "common.h"
31 #include "t4_regs.h"
32 #include "t4_regs_values.h"
33 #include "firmware/t4fw_interface.h"
34
35 #undef msleep
36 #define msleep(x) pause("t4hw", (x) * hz / 1000)
37
38 /**
39  *      t4_wait_op_done_val - wait until an operation is completed
40  *      @adapter: the adapter performing the operation
41  *      @reg: the register to check for completion
42  *      @mask: a single-bit field within @reg that indicates completion
43  *      @polarity: the value of the field when the operation is completed
44  *      @attempts: number of check iterations
45  *      @delay: delay in usecs between iterations
46  *      @valp: where to store the value of the register at completion time
47  *
48  *      Wait until an operation is completed by checking a bit in a register
49  *      up to @attempts times.  If @valp is not NULL the value of the register
50  *      at the time it indicated completion is stored there.  Returns 0 if the
51  *      operation completes and -EAGAIN otherwise.
52  */
53 int t4_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
54                         int polarity, int attempts, int delay, u32 *valp)
55 {
56         while (1) {
57                 u32 val = t4_read_reg(adapter, reg);
58
59                 if (!!(val & mask) == polarity) {
60                         if (valp)
61                                 *valp = val;
62                         return 0;
63                 }
64                 if (--attempts == 0)
65                         return -EAGAIN;
66                 if (delay)
67                         udelay(delay);
68         }
69 }
70
71 /**
72  *      t4_set_reg_field - set a register field to a value
73  *      @adapter: the adapter to program
74  *      @addr: the register address
75  *      @mask: specifies the portion of the register to modify
76  *      @val: the new value for the register field
77  *
78  *      Sets a register field specified by the supplied mask to the
79  *      given value.
80  */
81 void t4_set_reg_field(struct adapter *adapter, unsigned int addr, u32 mask,
82                       u32 val)
83 {
84         u32 v = t4_read_reg(adapter, addr) & ~mask;
85
86         t4_write_reg(adapter, addr, v | val);
87         (void) t4_read_reg(adapter, addr);      /* flush */
88 }
89
90 /**
91  *      t4_read_indirect - read indirectly addressed registers
92  *      @adap: the adapter
93  *      @addr_reg: register holding the indirect address
94  *      @data_reg: register holding the value of the indirect register
95  *      @vals: where the read register values are stored
96  *      @nregs: how many indirect registers to read
97  *      @start_idx: index of first indirect register to read
98  *
99  *      Reads registers that are accessed indirectly through an address/data
100  *      register pair.
101  */
102 void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
103                       unsigned int data_reg, u32 *vals, unsigned int nregs,
104                       unsigned int start_idx)
105 {
106         while (nregs--) {
107                 t4_write_reg(adap, addr_reg, start_idx);
108                 *vals++ = t4_read_reg(adap, data_reg);
109                 start_idx++;
110         }
111 }
112
113 /**
114  *      t4_write_indirect - write indirectly addressed registers
115  *      @adap: the adapter
116  *      @addr_reg: register holding the indirect addresses
117  *      @data_reg: register holding the value for the indirect registers
118  *      @vals: values to write
119  *      @nregs: how many indirect registers to write
120  *      @start_idx: address of first indirect register to write
121  *
122  *      Writes a sequential block of registers that are accessed indirectly
123  *      through an address/data register pair.
124  */
125 void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
126                        unsigned int data_reg, const u32 *vals,
127                        unsigned int nregs, unsigned int start_idx)
128 {
129         while (nregs--) {
130                 t4_write_reg(adap, addr_reg, start_idx++);
131                 t4_write_reg(adap, data_reg, *vals++);
132         }
133 }
134
135 /*
136  * Get the reply to a mailbox command and store it in @rpl in big-endian order.
137  */
138 static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit,
139                          u32 mbox_addr)
140 {
141         for ( ; nflit; nflit--, mbox_addr += 8)
142                 *rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr));
143 }
144
145 /*
146  * Handle a FW assertion reported in a mailbox.
147  */
148 static void fw_asrt(struct adapter *adap, u32 mbox_addr)
149 {
150         struct fw_debug_cmd asrt;
151
152         get_mbox_rpl(adap, (__be64 *)&asrt, sizeof(asrt) / 8, mbox_addr);
153         CH_ALERT(adap, "FW assertion at %.16s:%u, val0 %#x, val1 %#x\n",
154                  asrt.u.assert.filename_0_7, ntohl(asrt.u.assert.line),
155                  ntohl(asrt.u.assert.x), ntohl(asrt.u.assert.y));
156 }
157
158 #define X_CIM_PF_NOACCESS 0xeeeeeeee
159 /**
160  *      t4_wr_mbox_meat - send a command to FW through the given mailbox
161  *      @adap: the adapter
162  *      @mbox: index of the mailbox to use
163  *      @cmd: the command to write
164  *      @size: command length in bytes
165  *      @rpl: where to optionally store the reply
166  *      @sleep_ok: if true we may sleep while awaiting command completion
167  *
168  *      Sends the given command to FW through the selected mailbox and waits
169  *      for the FW to execute the command.  If @rpl is not %NULL it is used to
170  *      store the FW's reply to the command.  The command and its optional
171  *      reply are of the same length.  Some FW commands like RESET and
172  *      INITIALIZE can take a considerable amount of time to execute.
173  *      @sleep_ok determines whether we may sleep while awaiting the response.
174  *      If sleeping is allowed we use progressive backoff otherwise we spin.
175  *
176  *      The return value is 0 on success or a negative errno on failure.  A
177  *      failure can happen either because we are not able to execute the
178  *      command or FW executes it but signals an error.  In the latter case
179  *      the return value is the error code indicated by FW (negated).
180  */
181 int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size,
182                     void *rpl, bool sleep_ok)
183 {
184         /*
185          * We delay in small increments at first in an effort to maintain
186          * responsiveness for simple, fast executing commands but then back
187          * off to larger delays to a maximum retry delay.
188          */
189         static const int delay[] = {
190                 1, 1, 3, 5, 10, 10, 20, 50, 100
191         };
192
193         u32 v;
194         u64 res;
195         int i, ms, delay_idx;
196         const __be64 *p = cmd;
197
198         u32 data_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_DATA);
199         u32 ctl_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_CTRL);
200
201         if ((size & 15) || size > MBOX_LEN)
202                 return -EINVAL;
203
204         v = G_MBOWNER(t4_read_reg(adap, ctl_reg));
205         for (i = 0; v == X_MBOWNER_NONE && i < 3; i++)
206                 v = G_MBOWNER(t4_read_reg(adap, ctl_reg));
207
208         if (v != X_MBOWNER_PL)
209                 return v ? -EBUSY : -ETIMEDOUT;
210
211         for (i = 0; i < size; i += 8, p++)
212                 t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p));
213
214         t4_write_reg(adap, ctl_reg, F_MBMSGVALID | V_MBOWNER(X_MBOWNER_FW));
215         t4_read_reg(adap, ctl_reg);          /* flush write */
216
217         delay_idx = 0;
218         ms = delay[0];
219
220         for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
221                 if (sleep_ok) {
222                         ms = delay[delay_idx];  /* last element may repeat */
223                         if (delay_idx < ARRAY_SIZE(delay) - 1)
224                                 delay_idx++;
225                         msleep(ms);
226                 } else
227                         mdelay(ms);
228
229                 v = t4_read_reg(adap, ctl_reg);
230                 if (v == X_CIM_PF_NOACCESS)
231                         continue;
232                 if (G_MBOWNER(v) == X_MBOWNER_PL) {
233                         if (!(v & F_MBMSGVALID)) {
234                                 t4_write_reg(adap, ctl_reg,
235                                              V_MBOWNER(X_MBOWNER_NONE));
236                                 continue;
237                         }
238
239                         res = t4_read_reg64(adap, data_reg);
240                         if (G_FW_CMD_OP(res >> 32) == FW_DEBUG_CMD) {
241                                 fw_asrt(adap, data_reg);
242                                 res = V_FW_CMD_RETVAL(EIO);
243                         } else if (rpl)
244                                 get_mbox_rpl(adap, rpl, size / 8, data_reg);
245                         t4_write_reg(adap, ctl_reg, V_MBOWNER(X_MBOWNER_NONE));
246                         return -G_FW_CMD_RETVAL((int)res);
247                 }
248         }
249
250         CH_ERR(adap, "command %#x in mailbox %d timed out\n",
251                *(const u8 *)cmd, mbox);
252         return -ETIMEDOUT;
253 }
254
255 /**
256  *      t4_mc_read - read from MC through backdoor accesses
257  *      @adap: the adapter
258  *      @addr: address of first byte requested
259  *      @data: 64 bytes of data containing the requested address
260  *      @ecc: where to store the corresponding 64-bit ECC word
261  *
262  *      Read 64 bytes of data from MC starting at a 64-byte-aligned address
263  *      that covers the requested address @addr.  If @parity is not %NULL it
264  *      is assigned the 64-bit ECC word for the read data.
265  */
266 int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *ecc)
267 {
268         int i;
269
270         if (t4_read_reg(adap, A_MC_BIST_CMD) & F_START_BIST)
271                 return -EBUSY;
272         t4_write_reg(adap, A_MC_BIST_CMD_ADDR, addr & ~0x3fU);
273         t4_write_reg(adap, A_MC_BIST_CMD_LEN, 64);
274         t4_write_reg(adap, A_MC_BIST_DATA_PATTERN, 0xc);
275         t4_write_reg(adap, A_MC_BIST_CMD, V_BIST_OPCODE(1) | F_START_BIST |
276                      V_BIST_CMD_GAP(1));
277         i = t4_wait_op_done(adap, A_MC_BIST_CMD, F_START_BIST, 0, 10, 1);
278         if (i)
279                 return i;
280
281 #define MC_DATA(i) MC_BIST_STATUS_REG(A_MC_BIST_STATUS_RDATA, i)
282
283         for (i = 15; i >= 0; i--)
284                 *data++ = htonl(t4_read_reg(adap, MC_DATA(i)));
285         if (ecc)
286                 *ecc = t4_read_reg64(adap, MC_DATA(16));
287 #undef MC_DATA
288         return 0;
289 }
290
291 /**
292  *      t4_edc_read - read from EDC through backdoor accesses
293  *      @adap: the adapter
294  *      @idx: which EDC to access
295  *      @addr: address of first byte requested
296  *      @data: 64 bytes of data containing the requested address
297  *      @ecc: where to store the corresponding 64-bit ECC word
298  *
299  *      Read 64 bytes of data from EDC starting at a 64-byte-aligned address
300  *      that covers the requested address @addr.  If @parity is not %NULL it
301  *      is assigned the 64-bit ECC word for the read data.
302  */
303 int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
304 {
305         int i;
306
307         idx *= EDC_STRIDE;
308         if (t4_read_reg(adap, A_EDC_BIST_CMD + idx) & F_START_BIST)
309                 return -EBUSY;
310         t4_write_reg(adap, A_EDC_BIST_CMD_ADDR + idx, addr & ~0x3fU);
311         t4_write_reg(adap, A_EDC_BIST_CMD_LEN + idx, 64);
312         t4_write_reg(adap, A_EDC_BIST_DATA_PATTERN + idx, 0xc);
313         t4_write_reg(adap, A_EDC_BIST_CMD + idx,
314                      V_BIST_OPCODE(1) | V_BIST_CMD_GAP(1) | F_START_BIST);
315         i = t4_wait_op_done(adap, A_EDC_BIST_CMD + idx, F_START_BIST, 0, 10, 1);
316         if (i)
317                 return i;
318
319 #define EDC_DATA(i) (EDC_BIST_STATUS_REG(A_EDC_BIST_STATUS_RDATA, i) + idx)
320
321         for (i = 15; i >= 0; i--)
322                 *data++ = htonl(t4_read_reg(adap, EDC_DATA(i)));
323         if (ecc)
324                 *ecc = t4_read_reg64(adap, EDC_DATA(16));
325 #undef EDC_DATA
326         return 0;
327 }
328
329 /**
330  *      t4_mem_read - read EDC 0, EDC 1 or MC into buffer
331  *      @adap: the adapter
332  *      @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC
333  *      @addr: address within indicated memory type
334  *      @len: amount of memory to read
335  *      @buf: host memory buffer
336  *
337  *      Reads an [almost] arbitrary memory region in the firmware: the
338  *      firmware memory address, length and host buffer must be aligned on
339  *      32-bit boudaries.  The memory is returned as a raw byte sequence from
340  *      the firmware's memory.  If this memory contains data structures which
341  *      contain multi-byte integers, it's the callers responsibility to
342  *      perform appropriate byte order conversions.
343  */
344 int t4_mem_read(struct adapter *adap, int mtype, u32 addr, u32 len,
345                 __be32 *buf)
346 {
347         u32 pos, start, end, offset;
348         int ret;
349
350         /*
351          * Argument sanity checks ...
352          */
353         if ((addr & 0x3) || (len & 0x3))
354                 return -EINVAL;
355
356         /*
357          * The underlaying EDC/MC read routines read 64 bytes at a time so we
358          * need to round down the start and round up the end.  We'll start
359          * copying out of the first line at (addr - start) a word at a time.
360          */
361         start = addr & ~(64-1);
362         end = (addr + len + 64-1) & ~(64-1);
363         offset = (addr - start)/sizeof(__be32);
364
365         for (pos = start; pos < end; pos += 64, offset = 0) {
366                 __be32 data[16];
367
368                 /*
369                  * Read the chip's memory block and bail if there's an error.
370                  */
371                 if (mtype == MEM_MC)
372                         ret = t4_mc_read(adap, pos, data, NULL);
373                 else
374                         ret = t4_edc_read(adap, mtype, pos, data, NULL);
375                 if (ret)
376                         return ret;
377
378                 /*
379                  * Copy the data into the caller's memory buffer.
380                  */
381                 while (offset < 16 && len > 0) {
382                         *buf++ = data[offset++];
383                         len -= sizeof(__be32);
384                 }
385         }
386
387         return 0;
388 }
389
390 /*
391  * Partial EEPROM Vital Product Data structure.  Includes only the ID and
392  * VPD-R header.
393  */
394 struct t4_vpd_hdr {
395         u8  id_tag;
396         u8  id_len[2];
397         u8  id_data[ID_LEN];
398         u8  vpdr_tag;
399         u8  vpdr_len[2];
400 };
401
402 /*
403  * EEPROM reads take a few tens of us while writes can take a bit over 5 ms.
404  */
405 #define EEPROM_MAX_RD_POLL 40
406 #define EEPROM_MAX_WR_POLL 6
407 #define EEPROM_STAT_ADDR   0x7bfc
408 #define VPD_BASE           0x400
409 #define VPD_BASE_OLD       0
410 #define VPD_LEN            512
411 #define VPD_INFO_FLD_HDR_SIZE   3
412
413 /**
414  *      t4_seeprom_read - read a serial EEPROM location
415  *      @adapter: adapter to read
416  *      @addr: EEPROM virtual address
417  *      @data: where to store the read data
418  *
419  *      Read a 32-bit word from a location in serial EEPROM using the card's PCI
420  *      VPD capability.  Note that this function must be called with a virtual
421  *      address.
422  */
423 int t4_seeprom_read(struct adapter *adapter, u32 addr, u32 *data)
424 {
425         u16 val;
426         int attempts = EEPROM_MAX_RD_POLL;
427         unsigned int base = adapter->params.pci.vpd_cap_addr;
428
429         if (addr >= EEPROMVSIZE || (addr & 3))
430                 return -EINVAL;
431
432         t4_os_pci_write_cfg2(adapter, base + PCI_VPD_ADDR, (u16)addr);
433         do {
434                 udelay(10);
435                 t4_os_pci_read_cfg2(adapter, base + PCI_VPD_ADDR, &val);
436         } while (!(val & PCI_VPD_ADDR_F) && --attempts);
437
438         if (!(val & PCI_VPD_ADDR_F)) {
439                 CH_ERR(adapter, "reading EEPROM address 0x%x failed\n", addr);
440                 return -EIO;
441         }
442         t4_os_pci_read_cfg4(adapter, base + PCI_VPD_DATA, data);
443         *data = le32_to_cpu(*data);
444         return 0;
445 }
446
447 /**
448  *      t4_seeprom_write - write a serial EEPROM location
449  *      @adapter: adapter to write
450  *      @addr: virtual EEPROM address
451  *      @data: value to write
452  *
453  *      Write a 32-bit word to a location in serial EEPROM using the card's PCI
454  *      VPD capability.  Note that this function must be called with a virtual
455  *      address.
456  */
457 int t4_seeprom_write(struct adapter *adapter, u32 addr, u32 data)
458 {
459         u16 val;
460         int attempts = EEPROM_MAX_WR_POLL;
461         unsigned int base = adapter->params.pci.vpd_cap_addr;
462
463         if (addr >= EEPROMVSIZE || (addr & 3))
464                 return -EINVAL;
465
466         t4_os_pci_write_cfg4(adapter, base + PCI_VPD_DATA,
467                                  cpu_to_le32(data));
468         t4_os_pci_write_cfg2(adapter, base + PCI_VPD_ADDR,
469                                  (u16)addr | PCI_VPD_ADDR_F);
470         do {
471                 msleep(1);
472                 t4_os_pci_read_cfg2(adapter, base + PCI_VPD_ADDR, &val);
473         } while ((val & PCI_VPD_ADDR_F) && --attempts);
474
475         if (val & PCI_VPD_ADDR_F) {
476                 CH_ERR(adapter, "write to EEPROM address 0x%x failed\n", addr);
477                 return -EIO;
478         }
479         return 0;
480 }
481
482 /**
483  *      t4_eeprom_ptov - translate a physical EEPROM address to virtual
484  *      @phys_addr: the physical EEPROM address
485  *      @fn: the PCI function number
486  *      @sz: size of function-specific area
487  *
488  *      Translate a physical EEPROM address to virtual.  The first 1K is
489  *      accessed through virtual addresses starting at 31K, the rest is
490  *      accessed through virtual addresses starting at 0.
491  *
492  *      The mapping is as follows:
493  *      [0..1K) -> [31K..32K)
494  *      [1K..1K+A) -> [ES-A..ES)
495  *      [1K+A..ES) -> [0..ES-A-1K)
496  *
497  *      where A = @fn * @sz, and ES = EEPROM size.
498  */
499 int t4_eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
500 {
501         fn *= sz;
502         if (phys_addr < 1024)
503                 return phys_addr + (31 << 10);
504         if (phys_addr < 1024 + fn)
505                 return EEPROMSIZE - fn + phys_addr - 1024;
506         if (phys_addr < EEPROMSIZE)
507                 return phys_addr - 1024 - fn;
508         return -EINVAL;
509 }
510
511 /**
512  *      t4_seeprom_wp - enable/disable EEPROM write protection
513  *      @adapter: the adapter
514  *      @enable: whether to enable or disable write protection
515  *
516  *      Enables or disables write protection on the serial EEPROM.
517  */
518 int t4_seeprom_wp(struct adapter *adapter, int enable)
519 {
520         return t4_seeprom_write(adapter, EEPROM_STAT_ADDR, enable ? 0xc : 0);
521 }
522
523 /**
524  *      get_vpd_keyword_val - Locates an information field keyword in the VPD
525  *      @v: Pointer to buffered vpd data structure
526  *      @kw: The keyword to search for
527  *      
528  *      Returns the value of the information field keyword or
529  *      -ENOENT otherwise.
530  */
531 static int get_vpd_keyword_val(const struct t4_vpd_hdr *v, const char *kw)
532 {
533          int i;
534          unsigned int offset , len;
535          const u8 *buf = &v->id_tag;
536          const u8 *vpdr_len = &v->vpdr_tag; 
537          offset = sizeof(struct t4_vpd_hdr);
538          len =  (u16)vpdr_len[1] + ((u16)vpdr_len[2] << 8);
539          
540          if (len + sizeof(struct t4_vpd_hdr) > VPD_LEN) {
541                  return -ENOENT;
542          }
543
544          for (i = offset; i + VPD_INFO_FLD_HDR_SIZE <= offset + len;) {
545                  if(memcmp(buf + i , kw , 2) == 0){
546                          i += VPD_INFO_FLD_HDR_SIZE;
547                          return i;
548                   }
549
550                  i += VPD_INFO_FLD_HDR_SIZE + buf[i+2];
551          }
552
553          return -ENOENT;
554 }
555
556
557 /**
558  *      get_vpd_params - read VPD parameters from VPD EEPROM
559  *      @adapter: adapter to read
560  *      @p: where to store the parameters
561  *
562  *      Reads card parameters stored in VPD EEPROM.
563  */
564 static int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
565 {
566         int i, ret, addr;
567         int ec, sn;
568         u8 vpd[VPD_LEN], csum;
569         const struct t4_vpd_hdr *v;
570
571         /*
572          * Card information normally starts at VPD_BASE but early cards had
573          * it at 0.
574          */
575         ret = t4_seeprom_read(adapter, VPD_BASE, (u32 *)(vpd));
576         addr = *vpd == 0x82 ? VPD_BASE : VPD_BASE_OLD; 
577
578         for (i = 0; i < sizeof(vpd); i += 4) {
579                 ret = t4_seeprom_read(adapter, addr + i, (u32 *)(vpd + i));
580                 if (ret)
581                         return ret;
582         }
583         v = (const struct t4_vpd_hdr *)vpd;
584         
585 #define FIND_VPD_KW(var,name) do { \
586         var = get_vpd_keyword_val(v , name); \
587         if (var < 0) { \
588                 CH_ERR(adapter, "missing VPD keyword " name "\n"); \
589                 return -EINVAL; \
590         } \
591 } while (0)     
592
593         FIND_VPD_KW(i, "RV");
594         for (csum = 0; i >= 0; i--)
595                 csum += vpd[i];
596
597         if (csum) {
598                 CH_ERR(adapter, "corrupted VPD EEPROM, actual csum %u\n", csum);
599                 return -EINVAL;
600         }
601         FIND_VPD_KW(ec, "EC");
602         FIND_VPD_KW(sn, "SN");
603 #undef FIND_VPD_KW
604
605         memcpy(p->id, v->id_data, ID_LEN);
606         strstrip(p->id);
607         memcpy(p->ec, vpd + ec, EC_LEN);
608         strstrip(p->ec);
609         i = vpd[sn - VPD_INFO_FLD_HDR_SIZE + 2];
610         memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
611         strstrip(p->sn);
612
613         return 0;
614 }
615
616 /* serial flash and firmware constants and flash config file constants */
617 enum {
618         SF_ATTEMPTS = 10,             /* max retries for SF operations */
619
620         /* flash command opcodes */
621         SF_PROG_PAGE    = 2,          /* program page */
622         SF_WR_DISABLE   = 4,          /* disable writes */
623         SF_RD_STATUS    = 5,          /* read status register */
624         SF_WR_ENABLE    = 6,          /* enable writes */
625         SF_RD_DATA_FAST = 0xb,        /* read flash */
626         SF_RD_ID        = 0x9f,       /* read ID */
627         SF_ERASE_SECTOR = 0xd8,       /* erase sector */
628 };
629
630 /**
631  *      sf1_read - read data from the serial flash
632  *      @adapter: the adapter
633  *      @byte_cnt: number of bytes to read
634  *      @cont: whether another operation will be chained
635  *      @lock: whether to lock SF for PL access only
636  *      @valp: where to store the read data
637  *
638  *      Reads up to 4 bytes of data from the serial flash.  The location of
639  *      the read needs to be specified prior to calling this by issuing the
640  *      appropriate commands to the serial flash.
641  */
642 static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
643                     int lock, u32 *valp)
644 {
645         int ret;
646
647         if (!byte_cnt || byte_cnt > 4)
648                 return -EINVAL;
649         if (t4_read_reg(adapter, A_SF_OP) & F_BUSY)
650                 return -EBUSY;
651         t4_write_reg(adapter, A_SF_OP,
652                      V_SF_LOCK(lock) | V_CONT(cont) | V_BYTECNT(byte_cnt - 1));
653         ret = t4_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 5);
654         if (!ret)
655                 *valp = t4_read_reg(adapter, A_SF_DATA);
656         return ret;
657 }
658
659 /**
660  *      sf1_write - write data to the serial flash
661  *      @adapter: the adapter
662  *      @byte_cnt: number of bytes to write
663  *      @cont: whether another operation will be chained
664  *      @lock: whether to lock SF for PL access only
665  *      @val: value to write
666  *
667  *      Writes up to 4 bytes of data to the serial flash.  The location of
668  *      the write needs to be specified prior to calling this by issuing the
669  *      appropriate commands to the serial flash.
670  */
671 static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
672                      int lock, u32 val)
673 {
674         if (!byte_cnt || byte_cnt > 4)
675                 return -EINVAL;
676         if (t4_read_reg(adapter, A_SF_OP) & F_BUSY)
677                 return -EBUSY;
678         t4_write_reg(adapter, A_SF_DATA, val);
679         t4_write_reg(adapter, A_SF_OP, V_SF_LOCK(lock) |
680                      V_CONT(cont) | V_BYTECNT(byte_cnt - 1) | V_OP(1));
681         return t4_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 5);
682 }
683
684 /**
685  *      flash_wait_op - wait for a flash operation to complete
686  *      @adapter: the adapter
687  *      @attempts: max number of polls of the status register
688  *      @delay: delay between polls in ms
689  *
690  *      Wait for a flash operation to complete by polling the status register.
691  */
692 static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
693 {
694         int ret;
695         u32 status;
696
697         while (1) {
698                 if ((ret = sf1_write(adapter, 1, 1, 1, SF_RD_STATUS)) != 0 ||
699                     (ret = sf1_read(adapter, 1, 0, 1, &status)) != 0)
700                         return ret;
701                 if (!(status & 1))
702                         return 0;
703                 if (--attempts == 0)
704                         return -EAGAIN;
705                 if (delay)
706                         msleep(delay);
707         }
708 }
709
710 /**
711  *      t4_read_flash - read words from serial flash
712  *      @adapter: the adapter
713  *      @addr: the start address for the read
714  *      @nwords: how many 32-bit words to read
715  *      @data: where to store the read data
716  *      @byte_oriented: whether to store data as bytes or as words
717  *
718  *      Read the specified number of 32-bit words from the serial flash.
719  *      If @byte_oriented is set the read data is stored as a byte array
720  *      (i.e., big-endian), otherwise as 32-bit words in the platform's
721  *      natural endianess.
722  */
723 int t4_read_flash(struct adapter *adapter, unsigned int addr,
724                   unsigned int nwords, u32 *data, int byte_oriented)
725 {
726         int ret;
727
728         if (addr + nwords * sizeof(u32) > adapter->params.sf_size || (addr & 3))
729                 return -EINVAL;
730
731         addr = swab32(addr) | SF_RD_DATA_FAST;
732
733         if ((ret = sf1_write(adapter, 4, 1, 0, addr)) != 0 ||
734             (ret = sf1_read(adapter, 1, 1, 0, data)) != 0)
735                 return ret;
736
737         for ( ; nwords; nwords--, data++) {
738                 ret = sf1_read(adapter, 4, nwords > 1, nwords == 1, data);
739                 if (nwords == 1)
740                         t4_write_reg(adapter, A_SF_OP, 0);    /* unlock SF */
741                 if (ret)
742                         return ret;
743                 if (byte_oriented)
744                         *data = htonl(*data);
745         }
746         return 0;
747 }
748
749 /**
750  *      t4_write_flash - write up to a page of data to the serial flash
751  *      @adapter: the adapter
752  *      @addr: the start address to write
753  *      @n: length of data to write in bytes
754  *      @data: the data to write
755  *      @byte_oriented: whether to store data as bytes or as words
756  *
757  *      Writes up to a page of data (256 bytes) to the serial flash starting
758  *      at the given address.  All the data must be written to the same page.
759  *      If @byte_oriented is set the write data is stored as byte stream 
760  *      (i.e. matches what on disk), otherwise in big-endian.
761  */
762 static int t4_write_flash(struct adapter *adapter, unsigned int addr,
763                           unsigned int n, const u8 *data, int byte_oriented)
764 {
765         int ret;
766         u32 buf[SF_PAGE_SIZE / 4];
767         unsigned int i, c, left, val, offset = addr & 0xff;
768
769         if (addr >= adapter->params.sf_size || offset + n > SF_PAGE_SIZE)
770                 return -EINVAL;
771
772         val = swab32(addr) | SF_PROG_PAGE;
773
774         if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
775             (ret = sf1_write(adapter, 4, 1, 1, val)) != 0)
776                 goto unlock;
777
778         for (left = n; left; left -= c) {
779                 c = min(left, 4U);
780                 for (val = 0, i = 0; i < c; ++i)
781                         val = (val << 8) + *data++;
782
783                 if (!byte_oriented)
784                         val = htonl(val);
785
786                 ret = sf1_write(adapter, c, c != left, 1, val);
787                 if (ret)
788                         goto unlock;
789         }
790         ret = flash_wait_op(adapter, 8, 1);
791         if (ret)
792                 goto unlock;
793
794         t4_write_reg(adapter, A_SF_OP, 0);    /* unlock SF */
795
796         /* Read the page to verify the write succeeded */
797         ret = t4_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf,
798                             byte_oriented);
799         if (ret)
800                 return ret;
801
802         if (memcmp(data - n, (u8 *)buf + offset, n)) {
803                 CH_ERR(adapter, "failed to correctly write the flash page "
804                        "at %#x\n", addr);
805                 return -EIO;
806         }
807         return 0;
808
809 unlock:
810         t4_write_reg(adapter, A_SF_OP, 0);    /* unlock SF */
811         return ret;
812 }
813
814 /**
815  *      t4_get_fw_version - read the firmware version
816  *      @adapter: the adapter
817  *      @vers: where to place the version
818  *
819  *      Reads the FW version from flash.
820  */
821 int t4_get_fw_version(struct adapter *adapter, u32 *vers)
822 {
823         return t4_read_flash(adapter,
824                              FLASH_FW_START + offsetof(struct fw_hdr, fw_ver), 1,
825                              vers, 0);
826 }
827
828 /**
829  *      t4_get_tp_version - read the TP microcode version
830  *      @adapter: the adapter
831  *      @vers: where to place the version
832  *
833  *      Reads the TP microcode version from flash.
834  */
835 int t4_get_tp_version(struct adapter *adapter, u32 *vers)
836 {
837         return t4_read_flash(adapter, FLASH_FW_START + offsetof(struct fw_hdr,
838                                                               tp_microcode_ver),
839                              1, vers, 0);
840 }
841
842 /**
843  *      t4_check_fw_version - check if the FW is compatible with this driver
844  *      @adapter: the adapter
845  *
846  *      Checks if an adapter's FW is compatible with the driver.  Returns 0
847  *      if there's exact match, a negative error if the version could not be
848  *      read or there's a major version mismatch, and a positive value if the
849  *      expected major version is found but there's a minor version mismatch.
850  */
851 int t4_check_fw_version(struct adapter *adapter)
852 {
853         int ret, major, minor, micro;
854
855         ret = t4_get_fw_version(adapter, &adapter->params.fw_vers);
856         if (!ret)
857                 ret = t4_get_tp_version(adapter, &adapter->params.tp_vers);
858         if (ret)
859                 return ret;
860
861         major = G_FW_HDR_FW_VER_MAJOR(adapter->params.fw_vers);
862         minor = G_FW_HDR_FW_VER_MINOR(adapter->params.fw_vers);
863         micro = G_FW_HDR_FW_VER_MICRO(adapter->params.fw_vers);
864
865         if (major != FW_VERSION_MAJOR) {            /* major mismatch - fail */
866                 CH_ERR(adapter, "card FW has major version %u, driver wants "
867                        "%u\n", major, FW_VERSION_MAJOR);
868                 return -EINVAL;
869         }
870
871         if (minor == FW_VERSION_MINOR && micro == FW_VERSION_MICRO)
872                 return 0;                                   /* perfect match */
873
874         /* Minor/micro version mismatch.  Report it but often it's OK. */
875         return 1;
876 }
877
878 /**
879  *      t4_flash_erase_sectors - erase a range of flash sectors
880  *      @adapter: the adapter
881  *      @start: the first sector to erase
882  *      @end: the last sector to erase
883  *
884  *      Erases the sectors in the given inclusive range.
885  */
886 static int t4_flash_erase_sectors(struct adapter *adapter, int start, int end)
887 {
888         int ret = 0;
889
890         while (start <= end) {
891                 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
892                     (ret = sf1_write(adapter, 4, 0, 1,
893                                      SF_ERASE_SECTOR | (start << 8))) != 0 ||
894                     (ret = flash_wait_op(adapter, 14, 500)) != 0) {
895                         CH_ERR(adapter, "erase of flash sector %d failed, "
896                                "error %d\n", start, ret);
897                         break;
898                 }
899                 start++;
900         }
901         t4_write_reg(adapter, A_SF_OP, 0);    /* unlock SF */
902         return ret;
903 }
904
905 /**
906  *      t4_flash_cfg_addr - return the address of the flash configuration file
907  *      @adapter: the adapter
908  *
909  *      Return the address within the flash where the Firmware Configuration
910  *      File is stored.
911  */
912 unsigned int t4_flash_cfg_addr(struct adapter *adapter)
913 {
914         if (adapter->params.sf_size == 0x100000)
915                 return FLASH_FPGA_CFG_START;
916         else
917                 return FLASH_CFG_START;
918 }
919
920 /**
921  *      t4_load_cfg - download config file
922  *      @adap: the adapter
923  *      @cfg_data: the cfg text file to write
924  *      @size: text file size
925  *
926  *      Write the supplied config text file to the card's serial flash.
927  */
928 int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size)
929 {
930         int ret, i, n;
931         unsigned int addr;
932         unsigned int flash_cfg_start_sec;
933         unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
934
935         addr = t4_flash_cfg_addr(adap);
936         flash_cfg_start_sec = addr / SF_SEC_SIZE;
937
938         if (size > FLASH_CFG_MAX_SIZE) {
939                 CH_ERR(adap, "cfg file too large, max is %u bytes\n",
940                        FLASH_CFG_MAX_SIZE);
941                 return -EFBIG;
942         }
943
944         i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE,    /* # of sectors spanned */
945                          sf_sec_size);
946         ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec,
947                                      flash_cfg_start_sec + i - 1);
948         /*
949          * If size == 0 then we're simply erasing the FLASH sectors associated
950          * with the on-adapter Firmware Configuration File.
951          */
952         if (ret || size == 0)
953                 goto out;
954
955         /* this will write to the flash up to SF_PAGE_SIZE at a time */
956         for (i = 0; i< size; i+= SF_PAGE_SIZE) {
957                 if ( (size - i) <  SF_PAGE_SIZE) 
958                         n = size - i;
959                 else 
960                         n = SF_PAGE_SIZE;
961                 ret = t4_write_flash(adap, addr, n, cfg_data, 1);
962                 if (ret)
963                         goto out;
964                 
965                 addr += SF_PAGE_SIZE;
966                 cfg_data += SF_PAGE_SIZE;
967         } 
968                 
969 out:
970         if (ret)
971                 CH_ERR(adap, "config file %s failed %d\n",
972                        (size == 0 ? "clear" : "download"), ret);
973         return ret;
974 }
975
976
977 /**
978  *      t4_load_fw - download firmware
979  *      @adap: the adapter
980  *      @fw_data: the firmware image to write
981  *      @size: image size
982  *
983  *      Write the supplied firmware image to the card's serial flash.
984  */
985 int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size)
986 {
987         u32 csum;
988         int ret, addr;
989         unsigned int i;
990         u8 first_page[SF_PAGE_SIZE];
991         const u32 *p = (const u32 *)fw_data;
992         const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data;
993         unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
994
995         if (!size) {
996                 CH_ERR(adap, "FW image has no data\n");
997                 return -EINVAL;
998         }
999         if (size & 511) {
1000                 CH_ERR(adap, "FW image size not multiple of 512 bytes\n");
1001                 return -EINVAL;
1002         }
1003         if (ntohs(hdr->len512) * 512 != size) {
1004                 CH_ERR(adap, "FW image size differs from size in FW header\n");
1005                 return -EINVAL;
1006         }
1007         if (size > FLASH_FW_MAX_SIZE) {
1008                 CH_ERR(adap, "FW image too large, max is %u bytes\n",
1009                        FLASH_FW_MAX_SIZE);
1010                 return -EFBIG;
1011         }
1012
1013         for (csum = 0, i = 0; i < size / sizeof(csum); i++)
1014                 csum += ntohl(p[i]);
1015
1016         if (csum != 0xffffffff) {
1017                 CH_ERR(adap, "corrupted firmware image, checksum %#x\n",
1018                        csum);
1019                 return -EINVAL;
1020         }
1021
1022         i = DIV_ROUND_UP(size, sf_sec_size);        /* # of sectors spanned */
1023         ret = t4_flash_erase_sectors(adap, FLASH_FW_START_SEC,
1024             FLASH_FW_START_SEC + i - 1);
1025         if (ret)
1026                 goto out;
1027
1028         /*
1029          * We write the correct version at the end so the driver can see a bad
1030          * version if the FW write fails.  Start by writing a copy of the
1031          * first page with a bad version.
1032          */
1033         memcpy(first_page, fw_data, SF_PAGE_SIZE);
1034         ((struct fw_hdr *)first_page)->fw_ver = htonl(0xffffffff);
1035         ret = t4_write_flash(adap, FLASH_FW_START, SF_PAGE_SIZE, first_page, 1);
1036         if (ret)
1037                 goto out;
1038
1039         addr = FLASH_FW_START;
1040         for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
1041                 addr += SF_PAGE_SIZE;
1042                 fw_data += SF_PAGE_SIZE;
1043                 ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, fw_data, 1);
1044                 if (ret)
1045                         goto out;
1046         }
1047
1048         ret = t4_write_flash(adap,
1049                              FLASH_FW_START + offsetof(struct fw_hdr, fw_ver),
1050                              sizeof(hdr->fw_ver), (const u8 *)&hdr->fw_ver, 1);
1051 out:
1052         if (ret)
1053                 CH_ERR(adap, "firmware download failed, error %d\n", ret);
1054         return ret;
1055 }
1056
1057 /* BIOS boot header */
1058 typedef struct boot_header_s {
1059         u8      signature[2];   /* signature */
1060         u8      length;         /* image length (include header) */
1061         u8      offset[4];      /* initialization vector */
1062         u8      reserved[19];   /* reserved */
1063         u8      exheader[2];    /* offset to expansion header */
1064 } boot_header_t;
1065
1066 enum {
1067         BOOT_FLASH_BOOT_ADDR = 0x0,/* start address of boot image in flash */
1068         BOOT_SIGNATURE = 0xaa55,   /* signature of BIOS boot ROM */
1069         BOOT_SIZE_INC = 512,       /* image size measured in 512B chunks */
1070         BOOT_MIN_SIZE = sizeof(boot_header_t), /* at least basic header */
1071         BOOT_MAX_SIZE = 1024*BOOT_SIZE_INC /* 1 byte * length increment  */
1072 };
1073
1074 /*
1075  *      t4_load_boot - download boot flash
1076  *      @adapter: the adapter
1077  *      @boot_data: the boot image to write
1078  *      @size: image size
1079  *
1080  *      Write the supplied boot image to the card's serial flash.
1081  *      The boot image has the following sections: a 28-byte header and the
1082  *      boot image.
1083  */
1084 int t4_load_boot(struct adapter *adap, const u8 *boot_data, 
1085                  unsigned int boot_addr, unsigned int size)
1086 {
1087         int ret, addr;
1088         unsigned int i;
1089         unsigned int boot_sector = boot_addr * 1024;
1090         unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
1091
1092         /*
1093          * Perform some primitive sanity testing to avoid accidentally
1094          * writing garbage over the boot sectors.  We ought to check for
1095          * more but it's not worth it for now ...
1096          */
1097         if (size < BOOT_MIN_SIZE || size > BOOT_MAX_SIZE) {
1098                 CH_ERR(adap, "boot image too small/large\n");
1099                 return -EFBIG;
1100         }
1101
1102         /*
1103          * Make sure the boot image does not encroach on the firmware region
1104          */
1105         if ((boot_sector + size) >> 16 > FLASH_FW_START_SEC) {
1106                 CH_ERR(adap, "boot image encroaching on firmware region\n");
1107                 return -EFBIG;
1108         }
1109
1110         i = DIV_ROUND_UP(size, sf_sec_size);        /* # of sectors spanned */
1111         ret = t4_flash_erase_sectors(adap, boot_sector >> 16, 
1112                                      (boot_sector >> 16) + i - 1);
1113         if (ret)
1114                 goto out;
1115
1116         /*
1117          * Skip over the first SF_PAGE_SIZE worth of data and write it after
1118          * we finish copying the rest of the boot image. This will ensure
1119          * that the BIOS boot header will only be written if the boot image
1120          * was written in full.
1121          */
1122         addr = boot_sector;
1123         for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
1124                 addr += SF_PAGE_SIZE; 
1125                 boot_data += SF_PAGE_SIZE;
1126                 ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, boot_data, 0);
1127                 if (ret)
1128                         goto out;
1129         }
1130
1131         ret = t4_write_flash(adap, boot_sector, SF_PAGE_SIZE, boot_data, 0);
1132
1133 out:
1134         if (ret)
1135                 CH_ERR(adap, "boot image download failed, error %d\n", ret);
1136         return ret;
1137 }
1138
1139 /**
1140  *      t4_read_cimq_cfg - read CIM queue configuration
1141  *      @adap: the adapter
1142  *      @base: holds the queue base addresses in bytes
1143  *      @size: holds the queue sizes in bytes
1144  *      @thres: holds the queue full thresholds in bytes
1145  *
1146  *      Returns the current configuration of the CIM queues, starting with
1147  *      the IBQs, then the OBQs.
1148  */
1149 void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres)
1150 {
1151         unsigned int i, v;
1152
1153         for (i = 0; i < CIM_NUM_IBQ; i++) {
1154                 t4_write_reg(adap, A_CIM_QUEUE_CONFIG_REF, F_IBQSELECT |
1155                              V_QUENUMSELECT(i));
1156                 v = t4_read_reg(adap, A_CIM_QUEUE_CONFIG_CTRL);
1157                 *base++ = G_CIMQBASE(v) * 256; /* value is in 256-byte units */
1158                 *size++ = G_CIMQSIZE(v) * 256; /* value is in 256-byte units */
1159                 *thres++ = G_QUEFULLTHRSH(v) * 8;   /* 8-byte unit */
1160         }
1161         for (i = 0; i < CIM_NUM_OBQ; i++) {
1162                 t4_write_reg(adap, A_CIM_QUEUE_CONFIG_REF, F_OBQSELECT |
1163                              V_QUENUMSELECT(i));
1164                 v = t4_read_reg(adap, A_CIM_QUEUE_CONFIG_CTRL);
1165                 *base++ = G_CIMQBASE(v) * 256; /* value is in 256-byte units */
1166                 *size++ = G_CIMQSIZE(v) * 256; /* value is in 256-byte units */
1167         }
1168 }
1169
1170 /**
1171  *      t4_read_cim_ibq - read the contents of a CIM inbound queue
1172  *      @adap: the adapter
1173  *      @qid: the queue index
1174  *      @data: where to store the queue contents
1175  *      @n: capacity of @data in 32-bit words
1176  *
1177  *      Reads the contents of the selected CIM queue starting at address 0 up
1178  *      to the capacity of @data.  @n must be a multiple of 4.  Returns < 0 on
1179  *      error and the number of 32-bit words actually read on success.
1180  */
1181 int t4_read_cim_ibq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
1182 {
1183         int i, err;
1184         unsigned int addr;
1185         const unsigned int nwords = CIM_IBQ_SIZE * 4;
1186
1187         if (qid > 5 || (n & 3))
1188                 return -EINVAL;
1189
1190         addr = qid * nwords;
1191         if (n > nwords)
1192                 n = nwords;
1193
1194         for (i = 0; i < n; i++, addr++) {
1195                 t4_write_reg(adap, A_CIM_IBQ_DBG_CFG, V_IBQDBGADDR(addr) |
1196                              F_IBQDBGEN);
1197                 err = t4_wait_op_done(adap, A_CIM_IBQ_DBG_CFG, F_IBQDBGBUSY, 0,
1198                                       2, 1);
1199                 if (err)
1200                         return err;
1201                 *data++ = t4_read_reg(adap, A_CIM_IBQ_DBG_DATA);
1202         }
1203         t4_write_reg(adap, A_CIM_IBQ_DBG_CFG, 0);
1204         return i;
1205 }
1206
1207 /**
1208  *      t4_read_cim_obq - read the contents of a CIM outbound queue
1209  *      @adap: the adapter
1210  *      @qid: the queue index
1211  *      @data: where to store the queue contents
1212  *      @n: capacity of @data in 32-bit words
1213  *
1214  *      Reads the contents of the selected CIM queue starting at address 0 up
1215  *      to the capacity of @data.  @n must be a multiple of 4.  Returns < 0 on
1216  *      error and the number of 32-bit words actually read on success.
1217  */
1218 int t4_read_cim_obq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
1219 {
1220         int i, err;
1221         unsigned int addr, v, nwords;
1222
1223         if (qid > 5 || (n & 3))
1224                 return -EINVAL;
1225
1226         t4_write_reg(adap, A_CIM_QUEUE_CONFIG_REF, F_OBQSELECT |
1227                      V_QUENUMSELECT(qid));
1228         v = t4_read_reg(adap, A_CIM_QUEUE_CONFIG_CTRL);
1229
1230         addr = G_CIMQBASE(v) * 64;    /* muliple of 256 -> muliple of 4 */
1231         nwords = G_CIMQSIZE(v) * 64;  /* same */
1232         if (n > nwords)
1233                 n = nwords;
1234
1235         for (i = 0; i < n; i++, addr++) {
1236                 t4_write_reg(adap, A_CIM_OBQ_DBG_CFG, V_OBQDBGADDR(addr) |
1237                              F_OBQDBGEN);
1238                 err = t4_wait_op_done(adap, A_CIM_OBQ_DBG_CFG, F_OBQDBGBUSY, 0,
1239                                       2, 1);
1240                 if (err)
1241                         return err;
1242                 *data++ = t4_read_reg(adap, A_CIM_OBQ_DBG_DATA);
1243         }
1244         t4_write_reg(adap, A_CIM_OBQ_DBG_CFG, 0);
1245         return i;
1246 }
1247
1248 enum {
1249         CIM_QCTL_BASE     = 0,
1250         CIM_CTL_BASE      = 0x2000,
1251         CIM_PBT_ADDR_BASE = 0x2800,
1252         CIM_PBT_LRF_BASE  = 0x3000,
1253         CIM_PBT_DATA_BASE = 0x3800
1254 };
1255
1256 /**
1257  *      t4_cim_read - read a block from CIM internal address space
1258  *      @adap: the adapter
1259  *      @addr: the start address within the CIM address space
1260  *      @n: number of words to read
1261  *      @valp: where to store the result
1262  *
1263  *      Reads a block of 4-byte words from the CIM intenal address space.
1264  */
1265 int t4_cim_read(struct adapter *adap, unsigned int addr, unsigned int n,
1266                 unsigned int *valp)
1267 {
1268         int ret = 0;
1269
1270         if (t4_read_reg(adap, A_CIM_HOST_ACC_CTRL) & F_HOSTBUSY)
1271                 return -EBUSY;
1272
1273         for ( ; !ret && n--; addr += 4) {
1274                 t4_write_reg(adap, A_CIM_HOST_ACC_CTRL, addr);
1275                 ret = t4_wait_op_done(adap, A_CIM_HOST_ACC_CTRL, F_HOSTBUSY,
1276                                       0, 5, 2);
1277                 if (!ret)
1278                         *valp++ = t4_read_reg(adap, A_CIM_HOST_ACC_DATA);
1279         }
1280         return ret;
1281 }
1282
1283 /**
1284  *      t4_cim_write - write a block into CIM internal address space
1285  *      @adap: the adapter
1286  *      @addr: the start address within the CIM address space
1287  *      @n: number of words to write
1288  *      @valp: set of values to write
1289  *
1290  *      Writes a block of 4-byte words into the CIM intenal address space.
1291  */
1292 int t4_cim_write(struct adapter *adap, unsigned int addr, unsigned int n,
1293                  const unsigned int *valp)
1294 {
1295         int ret = 0;
1296
1297         if (t4_read_reg(adap, A_CIM_HOST_ACC_CTRL) & F_HOSTBUSY)
1298                 return -EBUSY;
1299
1300         for ( ; !ret && n--; addr += 4) {
1301                 t4_write_reg(adap, A_CIM_HOST_ACC_DATA, *valp++);
1302                 t4_write_reg(adap, A_CIM_HOST_ACC_CTRL, addr | F_HOSTWRITE);
1303                 ret = t4_wait_op_done(adap, A_CIM_HOST_ACC_CTRL, F_HOSTBUSY,
1304                                       0, 5, 2);
1305         }
1306         return ret;
1307 }
1308
1309 static int t4_cim_write1(struct adapter *adap, unsigned int addr, unsigned int val)
1310 {
1311         return t4_cim_write(adap, addr, 1, &val);
1312 }
1313
1314 /**
1315  *      t4_cim_ctl_read - read a block from CIM control region
1316  *      @adap: the adapter
1317  *      @addr: the start address within the CIM control region
1318  *      @n: number of words to read
1319  *      @valp: where to store the result
1320  *
1321  *      Reads a block of 4-byte words from the CIM control region.
1322  */
1323 int t4_cim_ctl_read(struct adapter *adap, unsigned int addr, unsigned int n,
1324                     unsigned int *valp)
1325 {
1326         return t4_cim_read(adap, addr + CIM_CTL_BASE, n, valp);
1327 }
1328
1329 /**
1330  *      t4_cim_read_la - read CIM LA capture buffer
1331  *      @adap: the adapter
1332  *      @la_buf: where to store the LA data
1333  *      @wrptr: the HW write pointer within the capture buffer
1334  *
1335  *      Reads the contents of the CIM LA buffer with the most recent entry at
1336  *      the end of the returned data and with the entry at @wrptr first.
1337  *      We try to leave the LA in the running state we find it in.
1338  */
1339 int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr)
1340 {
1341         int i, ret;
1342         unsigned int cfg, val, idx;
1343
1344         ret = t4_cim_read(adap, A_UP_UP_DBG_LA_CFG, 1, &cfg);
1345         if (ret)
1346                 return ret;
1347
1348         if (cfg & F_UPDBGLAEN) {                /* LA is running, freeze it */
1349                 ret = t4_cim_write1(adap, A_UP_UP_DBG_LA_CFG, 0);
1350                 if (ret)
1351                         return ret;
1352         }
1353
1354         ret = t4_cim_read(adap, A_UP_UP_DBG_LA_CFG, 1, &val);
1355         if (ret)
1356                 goto restart;
1357
1358         idx = G_UPDBGLAWRPTR(val);
1359         if (wrptr)
1360                 *wrptr = idx;
1361
1362         for (i = 0; i < adap->params.cim_la_size; i++) {
1363                 ret = t4_cim_write1(adap, A_UP_UP_DBG_LA_CFG,
1364                                     V_UPDBGLARDPTR(idx) | F_UPDBGLARDEN);
1365                 if (ret)
1366                         break;
1367                 ret = t4_cim_read(adap, A_UP_UP_DBG_LA_CFG, 1, &val);
1368                 if (ret)
1369                         break;
1370                 if (val & F_UPDBGLARDEN) {
1371                         ret = -ETIMEDOUT;
1372                         break;
1373                 }
1374                 ret = t4_cim_read(adap, A_UP_UP_DBG_LA_DATA, 1, &la_buf[i]);
1375                 if (ret)
1376                         break;
1377                 idx = (idx + 1) & M_UPDBGLARDPTR;
1378         }
1379 restart:
1380         if (cfg & F_UPDBGLAEN) {
1381                 int r = t4_cim_write1(adap, A_UP_UP_DBG_LA_CFG,
1382                                       cfg & ~F_UPDBGLARDEN);
1383                 if (!ret)
1384                         ret = r;
1385         }
1386         return ret;
1387 }
1388
1389 void t4_cim_read_pif_la(struct adapter *adap, u32 *pif_req, u32 *pif_rsp,
1390                         unsigned int *pif_req_wrptr,
1391                         unsigned int *pif_rsp_wrptr)
1392 {
1393         int i, j;
1394         u32 cfg, val, req, rsp;
1395
1396         cfg = t4_read_reg(adap, A_CIM_DEBUGCFG);
1397         if (cfg & F_LADBGEN)
1398                 t4_write_reg(adap, A_CIM_DEBUGCFG, cfg ^ F_LADBGEN);
1399
1400         val = t4_read_reg(adap, A_CIM_DEBUGSTS);
1401         req = G_POLADBGWRPTR(val);
1402         rsp = G_PILADBGWRPTR(val);
1403         if (pif_req_wrptr)
1404                 *pif_req_wrptr = req;
1405         if (pif_rsp_wrptr)
1406                 *pif_rsp_wrptr = rsp;
1407
1408         for (i = 0; i < CIM_PIFLA_SIZE; i++) {
1409                 for (j = 0; j < 6; j++) {
1410                         t4_write_reg(adap, A_CIM_DEBUGCFG, V_POLADBGRDPTR(req) |
1411                                      V_PILADBGRDPTR(rsp));
1412                         *pif_req++ = t4_read_reg(adap, A_CIM_PO_LA_DEBUGDATA);
1413                         *pif_rsp++ = t4_read_reg(adap, A_CIM_PI_LA_DEBUGDATA);
1414                         req++;
1415                         rsp++;
1416                 }
1417                 req = (req + 2) & M_POLADBGRDPTR;
1418                 rsp = (rsp + 2) & M_PILADBGRDPTR;
1419         }
1420         t4_write_reg(adap, A_CIM_DEBUGCFG, cfg);
1421 }
1422
1423 void t4_cim_read_ma_la(struct adapter *adap, u32 *ma_req, u32 *ma_rsp)
1424 {
1425         u32 cfg;
1426         int i, j, idx;
1427
1428         cfg = t4_read_reg(adap, A_CIM_DEBUGCFG);
1429         if (cfg & F_LADBGEN)
1430                 t4_write_reg(adap, A_CIM_DEBUGCFG, cfg ^ F_LADBGEN);
1431
1432         for (i = 0; i < CIM_MALA_SIZE; i++) {
1433                 for (j = 0; j < 5; j++) {
1434                         idx = 8 * i + j;
1435                         t4_write_reg(adap, A_CIM_DEBUGCFG, V_POLADBGRDPTR(idx) |
1436                                      V_PILADBGRDPTR(idx));
1437                         *ma_req++ = t4_read_reg(adap, A_CIM_PO_LA_MADEBUGDATA);
1438                         *ma_rsp++ = t4_read_reg(adap, A_CIM_PI_LA_MADEBUGDATA);
1439                 }
1440         }
1441         t4_write_reg(adap, A_CIM_DEBUGCFG, cfg);
1442 }
1443
1444 /**
1445  *      t4_tp_read_la - read TP LA capture buffer
1446  *      @adap: the adapter
1447  *      @la_buf: where to store the LA data
1448  *      @wrptr: the HW write pointer within the capture buffer
1449  *
1450  *      Reads the contents of the TP LA buffer with the most recent entry at
1451  *      the end of the returned data and with the entry at @wrptr first.
1452  *      We leave the LA in the running state we find it in.
1453  */
1454 void t4_tp_read_la(struct adapter *adap, u64 *la_buf, unsigned int *wrptr)
1455 {
1456         bool last_incomplete;
1457         unsigned int i, cfg, val, idx;
1458
1459         cfg = t4_read_reg(adap, A_TP_DBG_LA_CONFIG) & 0xffff;
1460         if (cfg & F_DBGLAENABLE)                    /* freeze LA */
1461                 t4_write_reg(adap, A_TP_DBG_LA_CONFIG,
1462                              adap->params.tp.la_mask | (cfg ^ F_DBGLAENABLE));
1463
1464         val = t4_read_reg(adap, A_TP_DBG_LA_CONFIG);
1465         idx = G_DBGLAWPTR(val);
1466         last_incomplete = G_DBGLAMODE(val) >= 2 && (val & F_DBGLAWHLF) == 0;
1467         if (last_incomplete)
1468                 idx = (idx + 1) & M_DBGLARPTR;
1469         if (wrptr)
1470                 *wrptr = idx;
1471
1472         val &= 0xffff;
1473         val &= ~V_DBGLARPTR(M_DBGLARPTR);
1474         val |= adap->params.tp.la_mask;
1475
1476         for (i = 0; i < TPLA_SIZE; i++) {
1477                 t4_write_reg(adap, A_TP_DBG_LA_CONFIG, V_DBGLARPTR(idx) | val);
1478                 la_buf[i] = t4_read_reg64(adap, A_TP_DBG_LA_DATAL);
1479                 idx = (idx + 1) & M_DBGLARPTR;
1480         }
1481
1482         /* Wipe out last entry if it isn't valid */
1483         if (last_incomplete)
1484                 la_buf[TPLA_SIZE - 1] = ~0ULL;
1485
1486         if (cfg & F_DBGLAENABLE)                    /* restore running state */
1487                 t4_write_reg(adap, A_TP_DBG_LA_CONFIG,
1488                              cfg | adap->params.tp.la_mask);
1489 }
1490
1491 void t4_ulprx_read_la(struct adapter *adap, u32 *la_buf)
1492 {
1493         unsigned int i, j;
1494
1495         for (i = 0; i < 8; i++) {
1496                 u32 *p = la_buf + i;
1497
1498                 t4_write_reg(adap, A_ULP_RX_LA_CTL, i);
1499                 j = t4_read_reg(adap, A_ULP_RX_LA_WRPTR);
1500                 t4_write_reg(adap, A_ULP_RX_LA_RDPTR, j);
1501                 for (j = 0; j < ULPRX_LA_SIZE; j++, p += 8)
1502                         *p = t4_read_reg(adap, A_ULP_RX_LA_RDDATA);
1503         }
1504 }
1505
1506 #define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
1507                      FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_ANEG)
1508
1509 /**
1510  *      t4_link_start - apply link configuration to MAC/PHY
1511  *      @phy: the PHY to setup
1512  *      @mac: the MAC to setup
1513  *      @lc: the requested link configuration
1514  *
1515  *      Set up a port's MAC and PHY according to a desired link configuration.
1516  *      - If the PHY can auto-negotiate first decide what to advertise, then
1517  *        enable/disable auto-negotiation as desired, and reset.
1518  *      - If the PHY does not auto-negotiate just reset it.
1519  *      - If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
1520  *        otherwise do it later based on the outcome of auto-negotiation.
1521  */
1522 int t4_link_start(struct adapter *adap, unsigned int mbox, unsigned int port,
1523                   struct link_config *lc)
1524 {
1525         struct fw_port_cmd c;
1526         unsigned int fc = 0, mdi = V_FW_PORT_CAP_MDI(FW_PORT_CAP_MDI_AUTO);
1527
1528         lc->link_ok = 0;
1529         if (lc->requested_fc & PAUSE_RX)
1530                 fc |= FW_PORT_CAP_FC_RX;
1531         if (lc->requested_fc & PAUSE_TX)
1532                 fc |= FW_PORT_CAP_FC_TX;
1533
1534         memset(&c, 0, sizeof(c));
1535         c.op_to_portid = htonl(V_FW_CMD_OP(FW_PORT_CMD) | F_FW_CMD_REQUEST |
1536                                F_FW_CMD_EXEC | V_FW_PORT_CMD_PORTID(port));
1537         c.action_to_len16 = htonl(V_FW_PORT_CMD_ACTION(FW_PORT_ACTION_L1_CFG) |
1538                                   FW_LEN16(c));
1539
1540         if (!(lc->supported & FW_PORT_CAP_ANEG)) {
1541                 c.u.l1cfg.rcap = htonl((lc->supported & ADVERT_MASK) | fc);
1542                 lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1543         } else if (lc->autoneg == AUTONEG_DISABLE) {
1544                 c.u.l1cfg.rcap = htonl(lc->requested_speed | fc | mdi);
1545                 lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1546         } else
1547                 c.u.l1cfg.rcap = htonl(lc->advertising | fc | mdi);
1548
1549         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
1550 }
1551
1552 /**
1553  *      t4_restart_aneg - restart autonegotiation
1554  *      @adap: the adapter
1555  *      @mbox: mbox to use for the FW command
1556  *      @port: the port id
1557  *
1558  *      Restarts autonegotiation for the selected port.
1559  */
1560 int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port)
1561 {
1562         struct fw_port_cmd c;
1563
1564         memset(&c, 0, sizeof(c));
1565         c.op_to_portid = htonl(V_FW_CMD_OP(FW_PORT_CMD) | F_FW_CMD_REQUEST |
1566                                F_FW_CMD_EXEC | V_FW_PORT_CMD_PORTID(port));
1567         c.action_to_len16 = htonl(V_FW_PORT_CMD_ACTION(FW_PORT_ACTION_L1_CFG) |
1568                                   FW_LEN16(c));
1569         c.u.l1cfg.rcap = htonl(FW_PORT_CAP_ANEG);
1570         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
1571 }
1572
1573 struct intr_info {
1574         unsigned int mask;       /* bits to check in interrupt status */
1575         const char *msg;         /* message to print or NULL */
1576         short stat_idx;          /* stat counter to increment or -1 */
1577         unsigned short fatal;    /* whether the condition reported is fatal */
1578 };
1579
1580 /**
1581  *      t4_handle_intr_status - table driven interrupt handler
1582  *      @adapter: the adapter that generated the interrupt
1583  *      @reg: the interrupt status register to process
1584  *      @acts: table of interrupt actions
1585  *
1586  *      A table driven interrupt handler that applies a set of masks to an
1587  *      interrupt status word and performs the corresponding actions if the
1588  *      interrupts described by the mask have occured.  The actions include
1589  *      optionally emitting a warning or alert message.  The table is terminated
1590  *      by an entry specifying mask 0.  Returns the number of fatal interrupt
1591  *      conditions.
1592  */
1593 static int t4_handle_intr_status(struct adapter *adapter, unsigned int reg,
1594                                  const struct intr_info *acts)
1595 {
1596         int fatal = 0;
1597         unsigned int mask = 0;
1598         unsigned int status = t4_read_reg(adapter, reg);
1599
1600         for ( ; acts->mask; ++acts) {
1601                 if (!(status & acts->mask))
1602                         continue;
1603                 if (acts->fatal) {
1604                         fatal++;
1605                         CH_ALERT(adapter, "%s (0x%x)\n",
1606                                  acts->msg, status & acts->mask);
1607                 } else if (acts->msg)
1608                         CH_WARN_RATELIMIT(adapter, "%s (0x%x)\n",
1609                                           acts->msg, status & acts->mask);
1610                 mask |= acts->mask;
1611         }
1612         status &= mask;
1613         if (status)                           /* clear processed interrupts */
1614                 t4_write_reg(adapter, reg, status);
1615         return fatal;
1616 }
1617
1618 /*
1619  * Interrupt handler for the PCIE module.
1620  */
1621 static void pcie_intr_handler(struct adapter *adapter)
1622 {
1623         static struct intr_info sysbus_intr_info[] = {
1624                 { F_RNPP, "RXNP array parity error", -1, 1 },
1625                 { F_RPCP, "RXPC array parity error", -1, 1 },
1626                 { F_RCIP, "RXCIF array parity error", -1, 1 },
1627                 { F_RCCP, "Rx completions control array parity error", -1, 1 },
1628                 { F_RFTP, "RXFT array parity error", -1, 1 },
1629                 { 0 }
1630         };
1631         static struct intr_info pcie_port_intr_info[] = {
1632                 { F_TPCP, "TXPC array parity error", -1, 1 },
1633                 { F_TNPP, "TXNP array parity error", -1, 1 },
1634                 { F_TFTP, "TXFT array parity error", -1, 1 },
1635                 { F_TCAP, "TXCA array parity error", -1, 1 },
1636                 { F_TCIP, "TXCIF array parity error", -1, 1 },
1637                 { F_RCAP, "RXCA array parity error", -1, 1 },
1638                 { F_OTDD, "outbound request TLP discarded", -1, 1 },
1639                 { F_RDPE, "Rx data parity error", -1, 1 },
1640                 { F_TDUE, "Tx uncorrectable data error", -1, 1 },
1641                 { 0 }
1642         };
1643         static struct intr_info pcie_intr_info[] = {
1644                 { F_MSIADDRLPERR, "MSI AddrL parity error", -1, 1 },
1645                 { F_MSIADDRHPERR, "MSI AddrH parity error", -1, 1 },
1646                 { F_MSIDATAPERR, "MSI data parity error", -1, 1 },
1647                 { F_MSIXADDRLPERR, "MSI-X AddrL parity error", -1, 1 },
1648                 { F_MSIXADDRHPERR, "MSI-X AddrH parity error", -1, 1 },
1649                 { F_MSIXDATAPERR, "MSI-X data parity error", -1, 1 },
1650                 { F_MSIXDIPERR, "MSI-X DI parity error", -1, 1 },
1651                 { F_PIOCPLPERR, "PCI PIO completion FIFO parity error", -1, 1 },
1652                 { F_PIOREQPERR, "PCI PIO request FIFO parity error", -1, 1 },
1653                 { F_TARTAGPERR, "PCI PCI target tag FIFO parity error", -1, 1 },
1654                 { F_CCNTPERR, "PCI CMD channel count parity error", -1, 1 },
1655                 { F_CREQPERR, "PCI CMD channel request parity error", -1, 1 },
1656                 { F_CRSPPERR, "PCI CMD channel response parity error", -1, 1 },
1657                 { F_DCNTPERR, "PCI DMA channel count parity error", -1, 1 },
1658                 { F_DREQPERR, "PCI DMA channel request parity error", -1, 1 },
1659                 { F_DRSPPERR, "PCI DMA channel response parity error", -1, 1 },
1660                 { F_HCNTPERR, "PCI HMA channel count parity error", -1, 1 },
1661                 { F_HREQPERR, "PCI HMA channel request parity error", -1, 1 },
1662                 { F_HRSPPERR, "PCI HMA channel response parity error", -1, 1 },
1663                 { F_CFGSNPPERR, "PCI config snoop FIFO parity error", -1, 1 },
1664                 { F_FIDPERR, "PCI FID parity error", -1, 1 },
1665                 { F_INTXCLRPERR, "PCI INTx clear parity error", -1, 1 },
1666                 { F_MATAGPERR, "PCI MA tag parity error", -1, 1 },
1667                 { F_PIOTAGPERR, "PCI PIO tag parity error", -1, 1 },
1668                 { F_RXCPLPERR, "PCI Rx completion parity error", -1, 1 },
1669                 { F_RXWRPERR, "PCI Rx write parity error", -1, 1 },
1670                 { F_RPLPERR, "PCI replay buffer parity error", -1, 1 },
1671                 { F_PCIESINT, "PCI core secondary fault", -1, 1 },
1672                 { F_PCIEPINT, "PCI core primary fault", -1, 1 },
1673                 { F_UNXSPLCPLERR, "PCI unexpected split completion error", -1,
1674                   0 },
1675                 { 0 }
1676         };
1677
1678         int fat;
1679
1680         fat = t4_handle_intr_status(adapter,
1681                                     A_PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS,
1682                                     sysbus_intr_info) +
1683               t4_handle_intr_status(adapter,
1684                                     A_PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
1685                                     pcie_port_intr_info) +
1686               t4_handle_intr_status(adapter, A_PCIE_INT_CAUSE, pcie_intr_info);
1687         if (fat)
1688                 t4_fatal_err(adapter);
1689 }
1690
1691 /*
1692  * TP interrupt handler.
1693  */
1694 static void tp_intr_handler(struct adapter *adapter)
1695 {
1696         static struct intr_info tp_intr_info[] = {
1697                 { 0x3fffffff, "TP parity error", -1, 1 },
1698                 { F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 },
1699                 { 0 }
1700         };
1701
1702         if (t4_handle_intr_status(adapter, A_TP_INT_CAUSE, tp_intr_info))
1703                 t4_fatal_err(adapter);
1704 }
1705
1706 /*
1707  * SGE interrupt handler.
1708  */
1709 static void sge_intr_handler(struct adapter *adapter)
1710 {
1711         u64 v;
1712         u32 err;
1713
1714         static struct intr_info sge_intr_info[] = {
1715                 { F_ERR_CPL_EXCEED_IQE_SIZE,
1716                   "SGE received CPL exceeding IQE size", -1, 1 },
1717                 { F_ERR_INVALID_CIDX_INC,
1718                   "SGE GTS CIDX increment too large", -1, 0 },
1719                 { F_ERR_CPL_OPCODE_0, "SGE received 0-length CPL", -1, 0 },
1720                 { F_ERR_DROPPED_DB, "SGE doorbell dropped", -1, 0 },
1721                 { F_ERR_DATA_CPL_ON_HIGH_QID1 | F_ERR_DATA_CPL_ON_HIGH_QID0,
1722                   "SGE IQID > 1023 received CPL for FL", -1, 0 },
1723                 { F_ERR_BAD_DB_PIDX3, "SGE DBP 3 pidx increment too large", -1,
1724                   0 },
1725                 { F_ERR_BAD_DB_PIDX2, "SGE DBP 2 pidx increment too large", -1,
1726                   0 },
1727                 { F_ERR_BAD_DB_PIDX1, "SGE DBP 1 pidx increment too large", -1,
1728                   0 },
1729                 { F_ERR_BAD_DB_PIDX0, "SGE DBP 0 pidx increment too large", -1,
1730                   0 },
1731                 { F_ERR_ING_CTXT_PRIO,
1732                   "SGE too many priority ingress contexts", -1, 0 },
1733                 { F_ERR_EGR_CTXT_PRIO,
1734                   "SGE too many priority egress contexts", -1, 0 },
1735                 { F_INGRESS_SIZE_ERR, "SGE illegal ingress QID", -1, 0 },
1736                 { F_EGRESS_SIZE_ERR, "SGE illegal egress QID", -1, 0 },
1737                 { 0 }
1738         };
1739
1740         v = (u64)t4_read_reg(adapter, A_SGE_INT_CAUSE1) |
1741             ((u64)t4_read_reg(adapter, A_SGE_INT_CAUSE2) << 32);
1742         if (v) {
1743                 CH_ALERT(adapter, "SGE parity error (%#llx)\n",
1744                          (unsigned long long)v);
1745                 t4_write_reg(adapter, A_SGE_INT_CAUSE1, v);
1746                 t4_write_reg(adapter, A_SGE_INT_CAUSE2, v >> 32);
1747         }
1748
1749         v |= t4_handle_intr_status(adapter, A_SGE_INT_CAUSE3, sge_intr_info);
1750
1751         err = t4_read_reg(adapter, A_SGE_ERROR_STATS);
1752         if (err & F_ERROR_QID_VALID) {
1753                 CH_ERR(adapter, "SGE error for queue %u\n", G_ERROR_QID(err));
1754                 if (err & F_UNCAPTURED_ERROR)
1755                         CH_ERR(adapter, "SGE UNCAPTURED_ERROR set (clearing)\n");
1756                 t4_write_reg(adapter, A_SGE_ERROR_STATS, F_ERROR_QID_VALID |
1757                              F_UNCAPTURED_ERROR);
1758         }
1759
1760         if (v != 0)
1761                 t4_fatal_err(adapter);
1762 }
1763
1764 #define CIM_OBQ_INTR (F_OBQULP0PARERR | F_OBQULP1PARERR | F_OBQULP2PARERR |\
1765                       F_OBQULP3PARERR | F_OBQSGEPARERR | F_OBQNCSIPARERR)
1766 #define CIM_IBQ_INTR (F_IBQTP0PARERR | F_IBQTP1PARERR | F_IBQULPPARERR |\
1767                       F_IBQSGEHIPARERR | F_IBQSGELOPARERR | F_IBQNCSIPARERR)
1768
1769 /*
1770  * CIM interrupt handler.
1771  */
1772 static void cim_intr_handler(struct adapter *adapter)
1773 {
1774         static struct intr_info cim_intr_info[] = {
1775                 { F_PREFDROPINT, "CIM control register prefetch drop", -1, 1 },
1776                 { CIM_OBQ_INTR, "CIM OBQ parity error", -1, 1 },
1777                 { CIM_IBQ_INTR, "CIM IBQ parity error", -1, 1 },
1778                 { F_MBUPPARERR, "CIM mailbox uP parity error", -1, 1 },
1779                 { F_MBHOSTPARERR, "CIM mailbox host parity error", -1, 1 },
1780                 { F_TIEQINPARERRINT, "CIM TIEQ outgoing parity error", -1, 1 },
1781                 { F_TIEQOUTPARERRINT, "CIM TIEQ incoming parity error", -1, 1 },
1782                 { 0 }
1783         };
1784         static struct intr_info cim_upintr_info[] = {
1785                 { F_RSVDSPACEINT, "CIM reserved space access", -1, 1 },
1786                 { F_ILLTRANSINT, "CIM illegal transaction", -1, 1 },
1787                 { F_ILLWRINT, "CIM illegal write", -1, 1 },
1788                 { F_ILLRDINT, "CIM illegal read", -1, 1 },
1789                 { F_ILLRDBEINT, "CIM illegal read BE", -1, 1 },
1790                 { F_ILLWRBEINT, "CIM illegal write BE", -1, 1 },
1791                 { F_SGLRDBOOTINT, "CIM single read from boot space", -1, 1 },
1792                 { F_SGLWRBOOTINT, "CIM single write to boot space", -1, 1 },
1793                 { F_BLKWRBOOTINT, "CIM block write to boot space", -1, 1 },
1794                 { F_SGLRDFLASHINT, "CIM single read from flash space", -1, 1 },
1795                 { F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1 },
1796                 { F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1 },
1797                 { F_SGLRDEEPROMINT, "CIM single EEPROM read", -1, 1 },
1798                 { F_SGLWREEPROMINT, "CIM single EEPROM write", -1, 1 },
1799                 { F_BLKRDEEPROMINT, "CIM block EEPROM read", -1, 1 },
1800                 { F_BLKWREEPROMINT, "CIM block EEPROM write", -1, 1 },
1801                 { F_SGLRDCTLINT , "CIM single read from CTL space", -1, 1 },
1802                 { F_SGLWRCTLINT , "CIM single write to CTL space", -1, 1 },
1803                 { F_BLKRDCTLINT , "CIM block read from CTL space", -1, 1 },
1804                 { F_BLKWRCTLINT , "CIM block write to CTL space", -1, 1 },
1805                 { F_SGLRDPLINT , "CIM single read from PL space", -1, 1 },
1806                 { F_SGLWRPLINT , "CIM single write to PL space", -1, 1 },
1807                 { F_BLKRDPLINT , "CIM block read from PL space", -1, 1 },
1808                 { F_BLKWRPLINT , "CIM block write to PL space", -1, 1 },
1809                 { F_REQOVRLOOKUPINT , "CIM request FIFO overwrite", -1, 1 },
1810                 { F_RSPOVRLOOKUPINT , "CIM response FIFO overwrite", -1, 1 },
1811                 { F_TIMEOUTINT , "CIM PIF timeout", -1, 1 },
1812                 { F_TIMEOUTMAINT , "CIM PIF MA timeout", -1, 1 },
1813                 { 0 }
1814         };
1815
1816         int fat;
1817
1818         fat = t4_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE,
1819                                     cim_intr_info) +
1820               t4_handle_intr_status(adapter, A_CIM_HOST_UPACC_INT_CAUSE,
1821                                     cim_upintr_info);
1822         if (fat)
1823                 t4_fatal_err(adapter);
1824 }
1825
1826 /*
1827  * ULP RX interrupt handler.
1828  */
1829 static void ulprx_intr_handler(struct adapter *adapter)
1830 {
1831         static struct intr_info ulprx_intr_info[] = {
1832                 { F_CAUSE_CTX_1, "ULPRX channel 1 context error", -1, 1 },
1833                 { F_CAUSE_CTX_0, "ULPRX channel 0 context error", -1, 1 },
1834                 { 0x7fffff, "ULPRX parity error", -1, 1 },
1835                 { 0 }
1836         };
1837
1838         if (t4_handle_intr_status(adapter, A_ULP_RX_INT_CAUSE, ulprx_intr_info))
1839                 t4_fatal_err(adapter);
1840 }
1841
1842 /*
1843  * ULP TX interrupt handler.
1844  */
1845 static void ulptx_intr_handler(struct adapter *adapter)
1846 {
1847         static struct intr_info ulptx_intr_info[] = {
1848                 { F_PBL_BOUND_ERR_CH3, "ULPTX channel 3 PBL out of bounds", -1,
1849                   0 },
1850                 { F_PBL_BOUND_ERR_CH2, "ULPTX channel 2 PBL out of bounds", -1,
1851                   0 },
1852                 { F_PBL_BOUND_ERR_CH1, "ULPTX channel 1 PBL out of bounds", -1,
1853                   0 },
1854                 { F_PBL_BOUND_ERR_CH0, "ULPTX channel 0 PBL out of bounds", -1,
1855                   0 },
1856                 { 0xfffffff, "ULPTX parity error", -1, 1 },
1857                 { 0 }
1858         };
1859
1860         if (t4_handle_intr_status(adapter, A_ULP_TX_INT_CAUSE, ulptx_intr_info))
1861                 t4_fatal_err(adapter);
1862 }
1863
1864 /*
1865  * PM TX interrupt handler.
1866  */
1867 static void pmtx_intr_handler(struct adapter *adapter)
1868 {
1869         static struct intr_info pmtx_intr_info[] = {
1870                 { F_PCMD_LEN_OVFL0, "PMTX channel 0 pcmd too large", -1, 1 },
1871                 { F_PCMD_LEN_OVFL1, "PMTX channel 1 pcmd too large", -1, 1 },
1872                 { F_PCMD_LEN_OVFL2, "PMTX channel 2 pcmd too large", -1, 1 },
1873                 { F_ZERO_C_CMD_ERROR, "PMTX 0-length pcmd", -1, 1 },
1874                 { 0xffffff0, "PMTX framing error", -1, 1 },
1875                 { F_OESPI_PAR_ERROR, "PMTX oespi parity error", -1, 1 },
1876                 { F_DB_OPTIONS_PAR_ERROR, "PMTX db_options parity error", -1,
1877                   1 },
1878                 { F_ICSPI_PAR_ERROR, "PMTX icspi parity error", -1, 1 },
1879                 { F_C_PCMD_PAR_ERROR, "PMTX c_pcmd parity error", -1, 1},
1880                 { 0 }
1881         };
1882
1883         if (t4_handle_intr_status(adapter, A_PM_TX_INT_CAUSE, pmtx_intr_info))
1884                 t4_fatal_err(adapter);
1885 }
1886
1887 /*
1888  * PM RX interrupt handler.
1889  */
1890 static void pmrx_intr_handler(struct adapter *adapter)
1891 {
1892         static struct intr_info pmrx_intr_info[] = {
1893                 { F_ZERO_E_CMD_ERROR, "PMRX 0-length pcmd", -1, 1 },
1894                 { 0x3ffff0, "PMRX framing error", -1, 1 },
1895                 { F_OCSPI_PAR_ERROR, "PMRX ocspi parity error", -1, 1 },
1896                 { F_DB_OPTIONS_PAR_ERROR, "PMRX db_options parity error", -1,
1897                   1 },
1898                 { F_IESPI_PAR_ERROR, "PMRX iespi parity error", -1, 1 },
1899                 { F_E_PCMD_PAR_ERROR, "PMRX e_pcmd parity error", -1, 1},
1900                 { 0 }
1901         };
1902
1903         if (t4_handle_intr_status(adapter, A_PM_RX_INT_CAUSE, pmrx_intr_info))
1904                 t4_fatal_err(adapter);
1905 }
1906
1907 /*
1908  * CPL switch interrupt handler.
1909  */
1910 static void cplsw_intr_handler(struct adapter *adapter)
1911 {
1912         static struct intr_info cplsw_intr_info[] = {
1913                 { F_CIM_OP_MAP_PERR, "CPLSW CIM op_map parity error", -1, 1 },
1914                 { F_CIM_OVFL_ERROR, "CPLSW CIM overflow", -1, 1 },
1915                 { F_TP_FRAMING_ERROR, "CPLSW TP framing error", -1, 1 },
1916                 { F_SGE_FRAMING_ERROR, "CPLSW SGE framing error", -1, 1 },
1917                 { F_CIM_FRAMING_ERROR, "CPLSW CIM framing error", -1, 1 },
1918                 { F_ZERO_SWITCH_ERROR, "CPLSW no-switch error", -1, 1 },
1919                 { 0 }
1920         };
1921
1922         if (t4_handle_intr_status(adapter, A_CPL_INTR_CAUSE, cplsw_intr_info))
1923                 t4_fatal_err(adapter);
1924 }
1925
1926 /*
1927  * LE interrupt handler.
1928  */
1929 static void le_intr_handler(struct adapter *adap)
1930 {
1931         static struct intr_info le_intr_info[] = {
1932                 { F_LIPMISS, "LE LIP miss", -1, 0 },
1933                 { F_LIP0, "LE 0 LIP error", -1, 0 },
1934                 { F_PARITYERR, "LE parity error", -1, 1 },
1935                 { F_UNKNOWNCMD, "LE unknown command", -1, 1 },
1936                 { F_REQQPARERR, "LE request queue parity error", -1, 1 },
1937                 { 0 }
1938         };
1939
1940         if (t4_handle_intr_status(adap, A_LE_DB_INT_CAUSE, le_intr_info))
1941                 t4_fatal_err(adap);
1942 }
1943
1944 /*
1945  * MPS interrupt handler.
1946  */
1947 static void mps_intr_handler(struct adapter *adapter)
1948 {
1949         static struct intr_info mps_rx_intr_info[] = {
1950                 { 0xffffff, "MPS Rx parity error", -1, 1 },
1951                 { 0 }
1952         };
1953         static struct intr_info mps_tx_intr_info[] = {
1954                 { V_TPFIFO(M_TPFIFO), "MPS Tx TP FIFO parity error", -1, 1 },
1955                 { F_NCSIFIFO, "MPS Tx NC-SI FIFO parity error", -1, 1 },
1956                 { V_TXDATAFIFO(M_TXDATAFIFO), "MPS Tx data FIFO parity error",
1957                   -1, 1 },
1958                 { V_TXDESCFIFO(M_TXDESCFIFO), "MPS Tx desc FIFO parity error",
1959                   -1, 1 },
1960                 { F_BUBBLE, "MPS Tx underflow", -1, 1 },
1961                 { F_SECNTERR, "MPS Tx SOP/EOP error", -1, 1 },
1962                 { F_FRMERR, "MPS Tx framing error", -1, 1 },
1963                 { 0 }
1964         };
1965         static struct intr_info mps_trc_intr_info[] = {
1966                 { V_FILTMEM(M_FILTMEM), "MPS TRC filter parity error", -1, 1 },
1967                 { V_PKTFIFO(M_PKTFIFO), "MPS TRC packet FIFO parity error", -1,
1968                   1 },
1969                 { F_MISCPERR, "MPS TRC misc parity error", -1, 1 },
1970                 { 0 }
1971         };
1972         static struct intr_info mps_stat_sram_intr_info[] = {
1973                 { 0x1fffff, "MPS statistics SRAM parity error", -1, 1 },
1974                 { 0 }
1975         };
1976         static struct intr_info mps_stat_tx_intr_info[] = {
1977                 { 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 },
1978                 { 0 }
1979         };
1980         static struct intr_info mps_stat_rx_intr_info[] = {
1981                 { 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 },
1982                 { 0 }
1983         };
1984         static struct intr_info mps_cls_intr_info[] = {
1985                 { F_MATCHSRAM, "MPS match SRAM parity error", -1, 1 },
1986                 { F_MATCHTCAM, "MPS match TCAM parity error", -1, 1 },
1987                 { F_HASHSRAM, "MPS hash SRAM parity error", -1, 1 },
1988                 { 0 }
1989         };
1990
1991         int fat;
1992
1993         fat = t4_handle_intr_status(adapter, A_MPS_RX_PERR_INT_CAUSE,
1994                                     mps_rx_intr_info) +
1995               t4_handle_intr_status(adapter, A_MPS_TX_INT_CAUSE,
1996                                     mps_tx_intr_info) +
1997               t4_handle_intr_status(adapter, A_MPS_TRC_INT_CAUSE,
1998                                     mps_trc_intr_info) +
1999               t4_handle_intr_status(adapter, A_MPS_STAT_PERR_INT_CAUSE_SRAM,
2000                                     mps_stat_sram_intr_info) +
2001               t4_handle_intr_status(adapter, A_MPS_STAT_PERR_INT_CAUSE_TX_FIFO,
2002                                     mps_stat_tx_intr_info) +
2003               t4_handle_intr_status(adapter, A_MPS_STAT_PERR_INT_CAUSE_RX_FIFO,
2004                                     mps_stat_rx_intr_info) +
2005               t4_handle_intr_status(adapter, A_MPS_CLS_INT_CAUSE,
2006                                     mps_cls_intr_info);
2007
2008         t4_write_reg(adapter, A_MPS_INT_CAUSE, 0);
2009         t4_read_reg(adapter, A_MPS_INT_CAUSE);                    /* flush */
2010         if (fat)
2011                 t4_fatal_err(adapter);
2012 }
2013
2014 #define MEM_INT_MASK (F_PERR_INT_CAUSE | F_ECC_CE_INT_CAUSE | F_ECC_UE_INT_CAUSE)
2015
2016 /*
2017  * EDC/MC interrupt handler.
2018  */
2019 static void mem_intr_handler(struct adapter *adapter, int idx)
2020 {
2021         static const char name[3][5] = { "EDC0", "EDC1", "MC" };
2022
2023         unsigned int addr, cnt_addr, v;
2024
2025         if (idx <= MEM_EDC1) {
2026                 addr = EDC_REG(A_EDC_INT_CAUSE, idx);
2027                 cnt_addr = EDC_REG(A_EDC_ECC_STATUS, idx);
2028         } else {
2029                 addr = A_MC_INT_CAUSE;
2030                 cnt_addr = A_MC_ECC_STATUS;
2031         }
2032
2033         v = t4_read_reg(adapter, addr) & MEM_INT_MASK;
2034         if (v & F_PERR_INT_CAUSE)
2035                 CH_ALERT(adapter, "%s FIFO parity error\n", name[idx]);
2036         if (v & F_ECC_CE_INT_CAUSE) {
2037                 u32 cnt = G_ECC_CECNT(t4_read_reg(adapter, cnt_addr));
2038
2039                 t4_write_reg(adapter, cnt_addr, V_ECC_CECNT(M_ECC_CECNT));
2040                 CH_WARN_RATELIMIT(adapter,
2041                                   "%u %s correctable ECC data error%s\n",
2042                                   cnt, name[idx], cnt > 1 ? "s" : "");
2043         }
2044         if (v & F_ECC_UE_INT_CAUSE)
2045                 CH_ALERT(adapter, "%s uncorrectable ECC data error\n",
2046                          name[idx]);
2047
2048         t4_write_reg(adapter, addr, v);
2049         if (v & (F_PERR_INT_CAUSE | F_ECC_UE_INT_CAUSE))
2050                 t4_fatal_err(adapter);
2051 }
2052
2053 /*
2054  * MA interrupt handler.
2055  */
2056 static void ma_intr_handler(struct adapter *adapter)
2057 {
2058         u32 v, status = t4_read_reg(adapter, A_MA_INT_CAUSE);
2059
2060         if (status & F_MEM_PERR_INT_CAUSE)
2061                 CH_ALERT(adapter, "MA parity error, parity status %#x\n",
2062                          t4_read_reg(adapter, A_MA_PARITY_ERROR_STATUS));
2063         if (status & F_MEM_WRAP_INT_CAUSE) {
2064                 v = t4_read_reg(adapter, A_MA_INT_WRAP_STATUS);
2065                 CH_ALERT(adapter, "MA address wrap-around error by client %u to"
2066                          " address %#x\n", G_MEM_WRAP_CLIENT_NUM(v),
2067                          G_MEM_WRAP_ADDRESS(v) << 4);
2068         }
2069         t4_write_reg(adapter, A_MA_INT_CAUSE, status);
2070         t4_fatal_err(adapter);
2071 }
2072
2073 /*
2074  * SMB interrupt handler.
2075  */
2076 static void smb_intr_handler(struct adapter *adap)
2077 {
2078         static struct intr_info smb_intr_info[] = {
2079                 { F_MSTTXFIFOPARINT, "SMB master Tx FIFO parity error", -1, 1 },
2080                 { F_MSTRXFIFOPARINT, "SMB master Rx FIFO parity error", -1, 1 },
2081                 { F_SLVFIFOPARINT, "SMB slave FIFO parity error", -1, 1 },
2082                 { 0 }
2083         };
2084
2085         if (t4_handle_intr_status(adap, A_SMB_INT_CAUSE, smb_intr_info))
2086                 t4_fatal_err(adap);
2087 }
2088
2089 /*
2090  * NC-SI interrupt handler.
2091  */
2092 static void ncsi_intr_handler(struct adapter *adap)
2093 {
2094         static struct intr_info ncsi_intr_info[] = {
2095                 { F_CIM_DM_PRTY_ERR, "NC-SI CIM parity error", -1, 1 },
2096                 { F_MPS_DM_PRTY_ERR, "NC-SI MPS parity error", -1, 1 },
2097                 { F_TXFIFO_PRTY_ERR, "NC-SI Tx FIFO parity error", -1, 1 },
2098                 { F_RXFIFO_PRTY_ERR, "NC-SI Rx FIFO parity error", -1, 1 },
2099                 { 0 }
2100         };
2101
2102         if (t4_handle_intr_status(adap, A_NCSI_INT_CAUSE, ncsi_intr_info))
2103                 t4_fatal_err(adap);
2104 }
2105
2106 /*
2107  * XGMAC interrupt handler.
2108  */
2109 static void xgmac_intr_handler(struct adapter *adap, int port)
2110 {
2111         u32 v = t4_read_reg(adap, PORT_REG(port, A_XGMAC_PORT_INT_CAUSE));
2112
2113         v &= F_TXFIFO_PRTY_ERR | F_RXFIFO_PRTY_ERR;
2114         if (!v)
2115                 return;
2116
2117         if (v & F_TXFIFO_PRTY_ERR)
2118                 CH_ALERT(adap, "XGMAC %d Tx FIFO parity error\n", port);
2119         if (v & F_RXFIFO_PRTY_ERR)
2120                 CH_ALERT(adap, "XGMAC %d Rx FIFO parity error\n", port);
2121         t4_write_reg(adap, PORT_REG(port, A_XGMAC_PORT_INT_CAUSE), v);
2122         t4_fatal_err(adap);
2123 }
2124
2125 /*
2126  * PL interrupt handler.
2127  */
2128 static void pl_intr_handler(struct adapter *adap)
2129 {
2130         static struct intr_info pl_intr_info[] = {
2131                 { F_FATALPERR, "T4 fatal parity error", -1, 1 },
2132                 { F_PERRVFID, "PL VFID_MAP parity error", -1, 1 },
2133                 { 0 }
2134         };
2135
2136         if (t4_handle_intr_status(adap, A_PL_PL_INT_CAUSE, pl_intr_info))
2137                 t4_fatal_err(adap);
2138 }
2139
2140 #define PF_INTR_MASK (F_PFSW | F_PFCIM)
2141 #define GLBL_INTR_MASK (F_CIM | F_MPS | F_PL | F_PCIE | F_MC | F_EDC0 | \
2142                 F_EDC1 | F_LE | F_TP | F_MA | F_PM_TX | F_PM_RX | F_ULP_RX | \
2143                 F_CPL_SWITCH | F_SGE | F_ULP_TX)
2144
2145 /**
2146  *      t4_slow_intr_handler - control path interrupt handler
2147  *      @adapter: the adapter
2148  *
2149  *      T4 interrupt handler for non-data global interrupt events, e.g., errors.
2150  *      The designation 'slow' is because it involves register reads, while
2151  *      data interrupts typically don't involve any MMIOs.
2152  */
2153 int t4_slow_intr_handler(struct adapter *adapter)
2154 {
2155         u32 cause = t4_read_reg(adapter, A_PL_INT_CAUSE);
2156
2157         if (!(cause & GLBL_INTR_MASK))
2158                 return 0;
2159         if (cause & F_CIM)
2160                 cim_intr_handler(adapter);
2161         if (cause & F_MPS)
2162                 mps_intr_handler(adapter);
2163         if (cause & F_NCSI)
2164                 ncsi_intr_handler(adapter);
2165         if (cause & F_PL)
2166                 pl_intr_handler(adapter);
2167         if (cause & F_SMB)
2168                 smb_intr_handler(adapter);
2169         if (cause & F_XGMAC0)
2170                 xgmac_intr_handler(adapter, 0);
2171         if (cause & F_XGMAC1)
2172                 xgmac_intr_handler(adapter, 1);
2173         if (cause & F_XGMAC_KR0)
2174                 xgmac_intr_handler(adapter, 2);
2175         if (cause & F_XGMAC_KR1)
2176                 xgmac_intr_handler(adapter, 3);
2177         if (cause & F_PCIE)
2178                 pcie_intr_handler(adapter);
2179         if (cause & F_MC)
2180                 mem_intr_handler(adapter, MEM_MC);
2181         if (cause & F_EDC0)
2182                 mem_intr_handler(adapter, MEM_EDC0);
2183         if (cause & F_EDC1)
2184                 mem_intr_handler(adapter, MEM_EDC1);
2185         if (cause & F_LE)
2186                 le_intr_handler(adapter);
2187         if (cause & F_TP)
2188                 tp_intr_handler(adapter);
2189         if (cause & F_MA)
2190                 ma_intr_handler(adapter);
2191         if (cause & F_PM_TX)
2192                 pmtx_intr_handler(adapter);
2193         if (cause & F_PM_RX)
2194                 pmrx_intr_handler(adapter);
2195         if (cause & F_ULP_RX)
2196                 ulprx_intr_handler(adapter);
2197         if (cause & F_CPL_SWITCH)
2198                 cplsw_intr_handler(adapter);
2199         if (cause & F_SGE)
2200                 sge_intr_handler(adapter);
2201         if (cause & F_ULP_TX)
2202                 ulptx_intr_handler(adapter);
2203
2204         /* Clear the interrupts just processed for which we are the master. */
2205         t4_write_reg(adapter, A_PL_INT_CAUSE, cause & GLBL_INTR_MASK);
2206         (void) t4_read_reg(adapter, A_PL_INT_CAUSE); /* flush */
2207         return 1;
2208 }
2209
2210 /**
2211  *      t4_intr_enable - enable interrupts
2212  *      @adapter: the adapter whose interrupts should be enabled
2213  *
2214  *      Enable PF-specific interrupts for the calling function and the top-level
2215  *      interrupt concentrator for global interrupts.  Interrupts are already
2216  *      enabled at each module, here we just enable the roots of the interrupt
2217  *      hierarchies.
2218  *
2219  *      Note: this function should be called only when the driver manages
2220  *      non PF-specific interrupts from the various HW modules.  Only one PCI
2221  *      function at a time should be doing this.
2222  */
2223 void t4_intr_enable(struct adapter *adapter)
2224 {
2225         u32 pf = G_SOURCEPF(t4_read_reg(adapter, A_PL_WHOAMI));
2226
2227         t4_write_reg(adapter, A_SGE_INT_ENABLE3, F_ERR_CPL_EXCEED_IQE_SIZE |
2228                      F_ERR_INVALID_CIDX_INC | F_ERR_CPL_OPCODE_0 |
2229                      F_ERR_DROPPED_DB | F_ERR_DATA_CPL_ON_HIGH_QID1 |
2230                      F_ERR_DATA_CPL_ON_HIGH_QID0 | F_ERR_BAD_DB_PIDX3 |
2231                      F_ERR_BAD_DB_PIDX2 | F_ERR_BAD_DB_PIDX1 |
2232                      F_ERR_BAD_DB_PIDX0 | F_ERR_ING_CTXT_PRIO |
2233                      F_ERR_EGR_CTXT_PRIO | F_INGRESS_SIZE_ERR |
2234                      F_EGRESS_SIZE_ERR);
2235         t4_write_reg(adapter, MYPF_REG(A_PL_PF_INT_ENABLE), PF_INTR_MASK);
2236         t4_set_reg_field(adapter, A_PL_INT_MAP0, 0, 1 << pf);
2237 }
2238
2239 /**
2240  *      t4_intr_disable - disable interrupts
2241  *      @adapter: the adapter whose interrupts should be disabled
2242  *
2243  *      Disable interrupts.  We only disable the top-level interrupt
2244  *      concentrators.  The caller must be a PCI function managing global
2245  *      interrupts.
2246  */
2247 void t4_intr_disable(struct adapter *adapter)
2248 {
2249         u32 pf = G_SOURCEPF(t4_read_reg(adapter, A_PL_WHOAMI));
2250
2251         t4_write_reg(adapter, MYPF_REG(A_PL_PF_INT_ENABLE), 0);
2252         t4_set_reg_field(adapter, A_PL_INT_MAP0, 1 << pf, 0);
2253 }
2254
2255 /**
2256  *      t4_intr_clear - clear all interrupts
2257  *      @adapter: the adapter whose interrupts should be cleared
2258  *
2259  *      Clears all interrupts.  The caller must be a PCI function managing
2260  *      global interrupts.
2261  */
2262 void t4_intr_clear(struct adapter *adapter)
2263 {
2264         static const unsigned int cause_reg[] = {
2265                 A_SGE_INT_CAUSE1, A_SGE_INT_CAUSE2, A_SGE_INT_CAUSE3,
2266                 A_PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS,
2267                 A_PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
2268                 A_PCIE_NONFAT_ERR, A_PCIE_INT_CAUSE,
2269                 A_MC_INT_CAUSE,
2270                 A_MA_INT_WRAP_STATUS, A_MA_PARITY_ERROR_STATUS, A_MA_INT_CAUSE,
2271                 A_EDC_INT_CAUSE, EDC_REG(A_EDC_INT_CAUSE, 1),
2272                 A_CIM_HOST_INT_CAUSE, A_CIM_HOST_UPACC_INT_CAUSE,
2273                 MYPF_REG(A_CIM_PF_HOST_INT_CAUSE),
2274                 A_TP_INT_CAUSE,
2275                 A_ULP_RX_INT_CAUSE, A_ULP_TX_INT_CAUSE,
2276                 A_PM_RX_INT_CAUSE, A_PM_TX_INT_CAUSE,
2277                 A_MPS_RX_PERR_INT_CAUSE,
2278                 A_CPL_INTR_CAUSE,
2279                 MYPF_REG(A_PL_PF_INT_CAUSE),
2280                 A_PL_PL_INT_CAUSE,
2281                 A_LE_DB_INT_CAUSE,
2282         };
2283
2284         unsigned int i;
2285
2286         for (i = 0; i < ARRAY_SIZE(cause_reg); ++i)
2287                 t4_write_reg(adapter, cause_reg[i], 0xffffffff);
2288
2289         t4_write_reg(adapter, A_PL_INT_CAUSE, GLBL_INTR_MASK);
2290         (void) t4_read_reg(adapter, A_PL_INT_CAUSE);          /* flush */
2291 }
2292
2293 /**
2294  *      hash_mac_addr - return the hash value of a MAC address
2295  *      @addr: the 48-bit Ethernet MAC address
2296  *
2297  *      Hashes a MAC address according to the hash function used by HW inexact
2298  *      (hash) address matching.
2299  */
2300 static int hash_mac_addr(const u8 *addr)
2301 {
2302         u32 a = ((u32)addr[0] << 16) | ((u32)addr[1] << 8) | addr[2];
2303         u32 b = ((u32)addr[3] << 16) | ((u32)addr[4] << 8) | addr[5];
2304         a ^= b;
2305         a ^= (a >> 12);
2306         a ^= (a >> 6);
2307         return a & 0x3f;
2308 }
2309
2310 /**
2311  *      t4_config_rss_range - configure a portion of the RSS mapping table
2312  *      @adapter: the adapter
2313  *      @mbox: mbox to use for the FW command
2314  *      @viid: virtual interface whose RSS subtable is to be written
2315  *      @start: start entry in the table to write
2316  *      @n: how many table entries to write
2317  *      @rspq: values for the "response queue" (Ingress Queue) lookup table
2318  *      @nrspq: number of values in @rspq
2319  *
2320  *      Programs the selected part of the VI's RSS mapping table with the
2321  *      provided values.  If @nrspq < @n the supplied values are used repeatedly
2322  *      until the full table range is populated.
2323  *
2324  *      The caller must ensure the values in @rspq are in the range allowed for
2325  *      @viid.
2326  */
2327 int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
2328                         int start, int n, const u16 *rspq, unsigned int nrspq)
2329 {
2330         int ret;
2331         const u16 *rsp = rspq;
2332         const u16 *rsp_end = rspq + nrspq;
2333         struct fw_rss_ind_tbl_cmd cmd;
2334
2335         memset(&cmd, 0, sizeof(cmd));
2336         cmd.op_to_viid = htonl(V_FW_CMD_OP(FW_RSS_IND_TBL_CMD) |
2337                                F_FW_CMD_REQUEST | F_FW_CMD_WRITE |
2338                                V_FW_RSS_IND_TBL_CMD_VIID(viid));
2339         cmd.retval_len16 = htonl(FW_LEN16(cmd));
2340
2341
2342         /*
2343          * Each firmware RSS command can accommodate up to 32 RSS Ingress
2344          * Queue Identifiers.  These Ingress Queue IDs are packed three to
2345          * a 32-bit word as 10-bit values with the upper remaining 2 bits
2346          * reserved.
2347          */
2348         while (n > 0) {
2349                 int nq = min(n, 32);
2350                 int nq_packed = 0;
2351                 __be32 *qp = &cmd.iq0_to_iq2;
2352
2353                 /*
2354                  * Set up the firmware RSS command header to send the next
2355                  * "nq" Ingress Queue IDs to the firmware.
2356                  */
2357                 cmd.niqid = htons(nq);
2358                 cmd.startidx = htons(start);
2359
2360                 /*
2361                  * "nq" more done for the start of the next loop.
2362                  */
2363                 start += nq;
2364                 n -= nq;
2365
2366                 /*
2367                  * While there are still Ingress Queue IDs to stuff into the
2368                  * current firmware RSS command, retrieve them from the
2369                  * Ingress Queue ID array and insert them into the command.
2370                  */
2371                 while (nq > 0) {
2372                         /*
2373                          * Grab up to the next 3 Ingress Queue IDs (wrapping
2374                          * around the Ingress Queue ID array if necessary) and
2375                          * insert them into the firmware RSS command at the
2376                          * current 3-tuple position within the commad.
2377                          */
2378                         u16 qbuf[3];
2379                         u16 *qbp = qbuf;
2380                         int nqbuf = min(3, nq);
2381
2382                         nq -= nqbuf;
2383                         qbuf[0] = qbuf[1] = qbuf[2] = 0;
2384                         while (nqbuf && nq_packed < 32) {
2385                                 nqbuf--;
2386                                 nq_packed++;
2387                                 *qbp++ = *rsp++;
2388                                 if (rsp >= rsp_end)
2389                                         rsp = rspq;
2390                         }
2391                         *qp++ = cpu_to_be32(V_FW_RSS_IND_TBL_CMD_IQ0(qbuf[0]) |
2392                                             V_FW_RSS_IND_TBL_CMD_IQ1(qbuf[1]) |
2393                                             V_FW_RSS_IND_TBL_CMD_IQ2(qbuf[2]));
2394                 }
2395
2396                 /*
2397                  * Send this portion of the RRS table update to the firmware;
2398                  * bail out on any errors.
2399                  */
2400                 ret = t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
2401                 if (ret)
2402                         return ret;
2403         }
2404
2405         return 0;
2406 }
2407
2408 /**
2409  *      t4_config_glbl_rss - configure the global RSS mode
2410  *      @adapter: the adapter
2411  *      @mbox: mbox to use for the FW command
2412  *      @mode: global RSS mode
2413  *      @flags: mode-specific flags
2414  *
2415  *      Sets the global RSS mode.
2416  */
2417 int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
2418                        unsigned int flags)
2419 {
2420         struct fw_rss_glb_config_cmd c;
2421
2422         memset(&c, 0, sizeof(c));
2423         c.op_to_write = htonl(V_FW_CMD_OP(FW_RSS_GLB_CONFIG_CMD) |
2424                               F_FW_CMD_REQUEST | F_FW_CMD_WRITE);
2425         c.retval_len16 = htonl(FW_LEN16(c));
2426         if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_MANUAL) {
2427                 c.u.manual.mode_pkd = htonl(V_FW_RSS_GLB_CONFIG_CMD_MODE(mode));
2428         } else if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) {
2429                 c.u.basicvirtual.mode_pkd =
2430                         htonl(V_FW_RSS_GLB_CONFIG_CMD_MODE(mode));
2431                 c.u.basicvirtual.synmapen_to_hashtoeplitz = htonl(flags);
2432         } else
2433                 return -EINVAL;
2434         return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
2435 }
2436
2437 /**
2438  *      t4_config_vi_rss - configure per VI RSS settings
2439  *      @adapter: the adapter
2440  *      @mbox: mbox to use for the FW command
2441  *      @viid: the VI id
2442  *      @flags: RSS flags
2443  *      @defq: id of the default RSS queue for the VI.
2444  *
2445  *      Configures VI-specific RSS properties.
2446  */
2447 int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
2448                      unsigned int flags, unsigned int defq)
2449 {
2450         struct fw_rss_vi_config_cmd c;
2451
2452         memset(&c, 0, sizeof(c));
2453         c.op_to_viid = htonl(V_FW_CMD_OP(FW_RSS_VI_CONFIG_CMD) |
2454                              F_FW_CMD_REQUEST | F_FW_CMD_WRITE |
2455                              V_FW_RSS_VI_CONFIG_CMD_VIID(viid));
2456         c.retval_len16 = htonl(FW_LEN16(c));
2457         c.u.basicvirtual.defaultq_to_udpen = htonl(flags |
2458                                         V_FW_RSS_VI_CONFIG_CMD_DEFAULTQ(defq));
2459         return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
2460 }
2461
2462 /* Read an RSS table row */
2463 static int rd_rss_row(struct adapter *adap, int row, u32 *val)
2464 {
2465         t4_write_reg(adap, A_TP_RSS_LKP_TABLE, 0xfff00000 | row);
2466         return t4_wait_op_done_val(adap, A_TP_RSS_LKP_TABLE, F_LKPTBLROWVLD, 1,
2467                                    5, 0, val);
2468 }
2469         
2470 /**
2471  *      t4_read_rss - read the contents of the RSS mapping table
2472  *      @adapter: the adapter
2473  *      @map: holds the contents of the RSS mapping table
2474  *
2475  *      Reads the contents of the RSS hash->queue mapping table.
2476  */
2477 int t4_read_rss(struct adapter *adapter, u16 *map)
2478 {
2479         u32 val;
2480         int i, ret;
2481
2482         for (i = 0; i < RSS_NENTRIES / 2; ++i) {
2483                 ret = rd_rss_row(adapter, i, &val);
2484                 if (ret)
2485                         return ret;
2486                 *map++ = G_LKPTBLQUEUE0(val);
2487                 *map++ = G_LKPTBLQUEUE1(val);
2488         }
2489         return 0;
2490 }
2491
2492 /**
2493  *      t4_read_rss_key - read the global RSS key
2494  *      @adap: the adapter
2495  *      @key: 10-entry array holding the 320-bit RSS key
2496  *
2497  *      Reads the global 320-bit RSS key.
2498  */
2499 void t4_read_rss_key(struct adapter *adap, u32 *key)
2500 {
2501         t4_read_indirect(adap, A_TP_PIO_ADDR, A_TP_PIO_DATA, key, 10,
2502                          A_TP_RSS_SECRET_KEY0);
2503 }
2504
2505 /**
2506  *      t4_write_rss_key - program one of the RSS keys
2507  *      @adap: the adapter
2508  *      @key: 10-entry array holding the 320-bit RSS key
2509  *      @idx: which RSS key to write
2510  *
2511  *      Writes one of the RSS keys with the given 320-bit value.  If @idx is
2512  *      0..15 the corresponding entry in the RSS key table is written,
2513  *      otherwise the global RSS key is written.
2514  */
2515 void t4_write_rss_key(struct adapter *adap, const u32 *key, int idx)
2516 {
2517         t4_write_indirect(adap, A_TP_PIO_ADDR, A_TP_PIO_DATA, key, 10,
2518                           A_TP_RSS_SECRET_KEY0);
2519         if (idx >= 0 && idx < 16)
2520                 t4_write_reg(adap, A_TP_RSS_CONFIG_VRT,
2521                              V_KEYWRADDR(idx) | F_KEYWREN);
2522 }
2523
2524 /**
2525  *      t4_read_rss_pf_config - read PF RSS Configuration Table
2526  *      @adapter: the adapter
2527  *      @index: the entry in the PF RSS table to read
2528  *      @valp: where to store the returned value
2529  *
2530  *      Reads the PF RSS Configuration Table at the specified index and returns
2531  *      the value found there.
2532  */
2533 void t4_read_rss_pf_config(struct adapter *adapter, unsigned int index, u32 *valp)
2534 {
2535         t4_read_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2536                          valp, 1, A_TP_RSS_PF0_CONFIG + index);
2537 }
2538
2539 /**
2540  *      t4_write_rss_pf_config - write PF RSS Configuration Table
2541  *      @adapter: the adapter
2542  *      @index: the entry in the VF RSS table to read
2543  *      @val: the value to store
2544  *
2545  *      Writes the PF RSS Configuration Table at the specified index with the
2546  *      specified value.
2547  */
2548 void t4_write_rss_pf_config(struct adapter *adapter, unsigned int index, u32 val)
2549 {
2550         t4_write_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2551                           &val, 1, A_TP_RSS_PF0_CONFIG + index);
2552 }
2553
2554 /**
2555  *      t4_read_rss_vf_config - read VF RSS Configuration Table
2556  *      @adapter: the adapter
2557  *      @index: the entry in the VF RSS table to read
2558  *      @vfl: where to store the returned VFL
2559  *      @vfh: where to store the returned VFH
2560  *
2561  *      Reads the VF RSS Configuration Table at the specified index and returns
2562  *      the (VFL, VFH) values found there.
2563  */
2564 void t4_read_rss_vf_config(struct adapter *adapter, unsigned int index,
2565                            u32 *vfl, u32 *vfh)
2566 {
2567         u32 vrt;
2568
2569         /*
2570          * Request that the index'th VF Table values be read into VFL/VFH.
2571          */
2572         vrt = t4_read_reg(adapter, A_TP_RSS_CONFIG_VRT);
2573         vrt &= ~(F_VFRDRG | V_VFWRADDR(M_VFWRADDR) | F_VFWREN | F_KEYWREN);
2574         vrt |= V_VFWRADDR(index) | F_VFRDEN;
2575         t4_write_reg(adapter, A_TP_RSS_CONFIG_VRT, vrt);
2576
2577         /*
2578          * Grab the VFL/VFH values ...
2579          */
2580         t4_read_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2581                          vfl, 1, A_TP_RSS_VFL_CONFIG);
2582         t4_read_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2583                          vfh, 1, A_TP_RSS_VFH_CONFIG);
2584 }
2585
2586 /**
2587  *      t4_write_rss_vf_config - write VF RSS Configuration Table
2588  *      
2589  *      @adapter: the adapter
2590  *      @index: the entry in the VF RSS table to write
2591  *      @vfl: the VFL to store
2592  *      @vfh: the VFH to store
2593  *
2594  *      Writes the VF RSS Configuration Table at the specified index with the
2595  *      specified (VFL, VFH) values.
2596  */
2597 void t4_write_rss_vf_config(struct adapter *adapter, unsigned int index,
2598                             u32 vfl, u32 vfh)
2599 {
2600         u32 vrt;
2601
2602         /*
2603          * Load up VFL/VFH with the values to be written ...
2604          */
2605         t4_write_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2606                           &vfl, 1, A_TP_RSS_VFL_CONFIG);
2607         t4_write_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2608                           &vfh, 1, A_TP_RSS_VFH_CONFIG);
2609
2610         /*
2611          * Write the VFL/VFH into the VF Table at index'th location.
2612          */
2613         vrt = t4_read_reg(adapter, A_TP_RSS_CONFIG_VRT);
2614         vrt &= ~(F_VFRDRG | F_VFRDEN | V_VFWRADDR(M_VFWRADDR) | F_KEYWREN);
2615         vrt |= V_VFWRADDR(index) | F_VFWREN;
2616         t4_write_reg(adapter, A_TP_RSS_CONFIG_VRT, vrt);
2617 }
2618
2619 /**
2620  *      t4_read_rss_pf_map - read PF RSS Map
2621  *      @adapter: the adapter
2622  *
2623  *      Reads the PF RSS Map register and returns its value.
2624  */
2625 u32 t4_read_rss_pf_map(struct adapter *adapter)
2626 {
2627         u32 pfmap;
2628
2629         t4_read_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2630                          &pfmap, 1, A_TP_RSS_PF_MAP);
2631         return pfmap;
2632 }
2633
2634 /**
2635  *      t4_write_rss_pf_map - write PF RSS Map
2636  *      @adapter: the adapter
2637  *      @pfmap: PF RSS Map value
2638  *
2639  *      Writes the specified value to the PF RSS Map register.
2640  */
2641 void t4_write_rss_pf_map(struct adapter *adapter, u32 pfmap)
2642 {
2643         t4_write_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2644                           &pfmap, 1, A_TP_RSS_PF_MAP);
2645 }
2646
2647 /**
2648  *      t4_read_rss_pf_mask - read PF RSS Mask
2649  *      @adapter: the adapter
2650  *
2651  *      Reads the PF RSS Mask register and returns its value.
2652  */
2653 u32 t4_read_rss_pf_mask(struct adapter *adapter)
2654 {
2655         u32 pfmask;
2656
2657         t4_read_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2658                          &pfmask, 1, A_TP_RSS_PF_MSK);
2659         return pfmask;
2660 }
2661
2662 /**
2663  *      t4_write_rss_pf_mask - write PF RSS Mask
2664  *      @adapter: the adapter
2665  *      @pfmask: PF RSS Mask value
2666  *
2667  *      Writes the specified value to the PF RSS Mask register.
2668  */
2669 void t4_write_rss_pf_mask(struct adapter *adapter, u32 pfmask)
2670 {
2671         t4_write_indirect(adapter, A_TP_PIO_ADDR, A_TP_PIO_DATA,
2672                           &pfmask, 1, A_TP_RSS_PF_MSK);
2673 }
2674
2675 /**
2676  *      t4_set_filter_mode - configure the optional components of filter tuples
2677  *      @adap: the adapter
2678  *      @mode_map: a bitmap selcting which optional filter components to enable
2679  *
2680  *      Sets the filter mode by selecting the optional components to enable
2681  *      in filter tuples.  Returns 0 on success and a negative error if the
2682  *      requested mode needs more bits than are available for optional
2683  *      components.
2684  */
2685 int t4_set_filter_mode(struct adapter *adap, unsigned int mode_map)
2686 {
2687         static u8 width[] = { 1, 3, 17, 17, 8, 8, 16, 9, 3, 1 };
2688
2689         int i, nbits = 0;
2690
2691         for (i = S_FCOE; i <= S_FRAGMENTATION; i++)
2692                 if (mode_map & (1 << i))
2693                         nbits += width[i];
2694         if (nbits > FILTER_OPT_LEN)
2695                 return -EINVAL;
2696         t4_write_indirect(adap, A_TP_PIO_ADDR, A_TP_PIO_DATA, &mode_map, 1,
2697                           A_TP_VLAN_PRI_MAP);
2698         return 0;
2699 }
2700
2701 /**
2702  *      t4_tp_get_tcp_stats - read TP's TCP MIB counters
2703  *      @adap: the adapter
2704  *      @v4: holds the TCP/IP counter values
2705  *      @v6: holds the TCP/IPv6 counter values
2706  *
2707  *      Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters.
2708  *      Either @v4 or @v6 may be %NULL to skip the corresponding stats.
2709  */
2710 void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
2711                          struct tp_tcp_stats *v6)
2712 {
2713         u32 val[A_TP_MIB_TCP_RXT_SEG_LO - A_TP_MIB_TCP_OUT_RST + 1];
2714
2715 #define STAT_IDX(x) ((A_TP_MIB_TCP_##x) - A_TP_MIB_TCP_OUT_RST)
2716 #define STAT(x)     val[STAT_IDX(x)]
2717 #define STAT64(x)   (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
2718
2719         if (v4) {
2720                 t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, val,
2721                                  ARRAY_SIZE(val), A_TP_MIB_TCP_OUT_RST);
2722                 v4->tcpOutRsts = STAT(OUT_RST);
2723                 v4->tcpInSegs  = STAT64(IN_SEG);
2724                 v4->tcpOutSegs = STAT64(OUT_SEG);
2725                 v4->tcpRetransSegs = STAT64(RXT_SEG);
2726         }
2727         if (v6) {
2728                 t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, val,
2729                                  ARRAY_SIZE(val), A_TP_MIB_TCP_V6OUT_RST);
2730                 v6->tcpOutRsts = STAT(OUT_RST);
2731                 v6->tcpInSegs  = STAT64(IN_SEG);
2732                 v6->tcpOutSegs = STAT64(OUT_SEG);
2733                 v6->tcpRetransSegs = STAT64(RXT_SEG);
2734         }
2735 #undef STAT64
2736 #undef STAT
2737 #undef STAT_IDX
2738 }
2739
2740 /**
2741  *      t4_tp_get_err_stats - read TP's error MIB counters
2742  *      @adap: the adapter
2743  *      @st: holds the counter values
2744  *
2745  *      Returns the values of TP's error counters.
2746  */
2747 void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st)
2748 {
2749         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->macInErrs,
2750                          12, A_TP_MIB_MAC_IN_ERR_0);
2751         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->tnlCongDrops,
2752                          8, A_TP_MIB_TNL_CNG_DROP_0);
2753         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->tnlTxDrops,
2754                          4, A_TP_MIB_TNL_DROP_0);
2755         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->ofldVlanDrops,
2756                          4, A_TP_MIB_OFD_VLN_DROP_0);
2757         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->tcp6InErrs,
2758                          4, A_TP_MIB_TCP_V6IN_ERR_0);
2759         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, &st->ofldNoNeigh,
2760                          2, A_TP_MIB_OFD_ARP_DROP);
2761 }
2762
2763 /**
2764  *      t4_tp_get_proxy_stats - read TP's proxy MIB counters
2765  *      @adap: the adapter
2766  *      @st: holds the counter values
2767  *
2768  *      Returns the values of TP's proxy counters.
2769  */
2770 void t4_tp_get_proxy_stats(struct adapter *adap, struct tp_proxy_stats *st)
2771 {
2772         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->proxy,
2773                          4, A_TP_MIB_TNL_LPBK_0);
2774 }
2775
2776 /**
2777  *      t4_tp_get_cpl_stats - read TP's CPL MIB counters
2778  *      @adap: the adapter
2779  *      @st: holds the counter values
2780  *
2781  *      Returns the values of TP's CPL counters.
2782  */
2783 void t4_tp_get_cpl_stats(struct adapter *adap, struct tp_cpl_stats *st)
2784 {
2785         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, st->req,
2786                          8, A_TP_MIB_CPL_IN_REQ_0);
2787 }
2788
2789 /**
2790  *      t4_tp_get_rdma_stats - read TP's RDMA MIB counters
2791  *      @adap: the adapter
2792  *      @st: holds the counter values
2793  *
2794  *      Returns the values of TP's RDMA counters.
2795  */
2796 void t4_tp_get_rdma_stats(struct adapter *adap, struct tp_rdma_stats *st)
2797 {
2798         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, &st->rqe_dfr_mod,
2799                          2, A_TP_MIB_RQE_DFR_MOD);
2800 }
2801
2802 /**
2803  *      t4_get_fcoe_stats - read TP's FCoE MIB counters for a port
2804  *      @adap: the adapter
2805  *      @idx: the port index
2806  *      @st: holds the counter values
2807  *
2808  *      Returns the values of TP's FCoE counters for the selected port.
2809  */
2810 void t4_get_fcoe_stats(struct adapter *adap, unsigned int idx,
2811                        struct tp_fcoe_stats *st)
2812 {
2813         u32 val[2];
2814
2815         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, &st->framesDDP,
2816                          1, A_TP_MIB_FCOE_DDP_0 + idx);
2817         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, &st->framesDrop,
2818                          1, A_TP_MIB_FCOE_DROP_0 + idx);
2819         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, val,
2820                          2, A_TP_MIB_FCOE_BYTE_0_HI + 2 * idx);
2821         st->octetsDDP = ((u64)val[0] << 32) | val[1];
2822 }
2823
2824 /**
2825  *      t4_get_usm_stats - read TP's non-TCP DDP MIB counters
2826  *      @adap: the adapter
2827  *      @st: holds the counter values
2828  *
2829  *      Returns the values of TP's counters for non-TCP directly-placed packets.
2830  */
2831 void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st)
2832 {
2833         u32 val[4];
2834
2835         t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, val, 4,
2836                          A_TP_MIB_USM_PKTS);
2837         st->frames = val[0];
2838         st->drops = val[1];
2839         st->octets = ((u64)val[2] << 32) | val[3];
2840 }
2841
2842 /**
2843  *      t4_read_mtu_tbl - returns the values in the HW path MTU table
2844  *      @adap: the adapter
2845  *      @mtus: where to store the MTU values
2846  *      @mtu_log: where to store the MTU base-2 log (may be %NULL)
2847  *
2848  *      Reads the HW path MTU table.
2849  */
2850 void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log)
2851 {
2852         u32 v;
2853         int i;
2854
2855         for (i = 0; i < NMTUS; ++i) {
2856                 t4_write_reg(adap, A_TP_MTU_TABLE,
2857                              V_MTUINDEX(0xff) | V_MTUVALUE(i));
2858                 v = t4_read_reg(adap, A_TP_MTU_TABLE);
2859                 mtus[i] = G_MTUVALUE(v);
2860                 if (mtu_log)
2861                         mtu_log[i] = G_MTUWIDTH(v);
2862         }
2863 }
2864
2865 /**
2866  *      t4_read_cong_tbl - reads the congestion control table
2867  *      @adap: the adapter
2868  *      @incr: where to store the alpha values
2869  *
2870  *      Reads the additive increments programmed into the HW congestion
2871  *      control table.
2872  */
2873 void t4_read_cong_tbl(struct adapter *adap, u16 incr[NMTUS][NCCTRL_WIN])
2874 {
2875         unsigned int mtu, w;
2876
2877         for (mtu = 0; mtu < NMTUS; ++mtu)
2878                 for (w = 0; w < NCCTRL_WIN; ++w) {
2879                         t4_write_reg(adap, A_TP_CCTRL_TABLE,
2880                                      V_ROWINDEX(0xffff) | (mtu << 5) | w);
2881                         incr[mtu][w] = (u16)t4_read_reg(adap,
2882                                                 A_TP_CCTRL_TABLE) & 0x1fff;
2883                 }
2884 }
2885
2886 /**
2887  *      t4_read_pace_tbl - read the pace table
2888  *      @adap: the adapter
2889  *      @pace_vals: holds the returned values
2890  *
2891  *      Returns the values of TP's pace table in microseconds.
2892  */
2893 void t4_read_pace_tbl(struct adapter *adap, unsigned int pace_vals[NTX_SCHED])
2894 {
2895         unsigned int i, v;
2896
2897         for (i = 0; i < NTX_SCHED; i++) {
2898                 t4_write_reg(adap, A_TP_PACE_TABLE, 0xffff0000 + i);
2899                 v = t4_read_reg(adap, A_TP_PACE_TABLE);
2900                 pace_vals[i] = dack_ticks_to_usec(adap, v);
2901         }
2902 }
2903
2904 /**
2905  *      t4_tp_wr_bits_indirect - set/clear bits in an indirect TP register
2906  *      @adap: the adapter
2907  *      @addr: the indirect TP register address
2908  *      @mask: specifies the field within the register to modify
2909  *      @val: new value for the field
2910  *
2911  *      Sets a field of an indirect TP register to the given value.
2912  */
2913 void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
2914                             unsigned int mask, unsigned int val)
2915 {
2916         t4_write_reg(adap, A_TP_PIO_ADDR, addr);
2917         val |= t4_read_reg(adap, A_TP_PIO_DATA) & ~mask;
2918         t4_write_reg(adap, A_TP_PIO_DATA, val);
2919 }
2920
2921 /**
2922  *      init_cong_ctrl - initialize congestion control parameters
2923  *      @a: the alpha values for congestion control
2924  *      @b: the beta values for congestion control
2925  *
2926  *      Initialize the congestion control parameters.
2927  */
2928 static void __devinit init_cong_ctrl(unsigned short *a, unsigned short *b)
2929 {
2930         a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
2931         a[9] = 2;
2932         a[10] = 3;
2933         a[11] = 4;
2934         a[12] = 5;
2935         a[13] = 6;
2936         a[14] = 7;
2937         a[15] = 8;
2938         a[16] = 9;
2939         a[17] = 10;
2940         a[18] = 14;
2941         a[19] = 17;
2942         a[20] = 21;
2943         a[21] = 25;
2944         a[22] = 30;
2945         a[23] = 35;
2946         a[24] = 45;
2947         a[25] = 60;
2948         a[26] = 80;
2949         a[27] = 100;
2950         a[28] = 200;
2951         a[29] = 300;
2952         a[30] = 400;
2953         a[31] = 500;
2954
2955         b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
2956         b[9] = b[10] = 1;
2957         b[11] = b[12] = 2;
2958         b[13] = b[14] = b[15] = b[16] = 3;
2959         b[17] = b[18] = b[19] = b[20] = b[21] = 4;
2960         b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
2961         b[28] = b[29] = 6;
2962         b[30] = b[31] = 7;
2963 }
2964
2965 /* The minimum additive increment value for the congestion control table */
2966 #define CC_MIN_INCR 2U
2967
2968 /**
2969  *      t4_load_mtus - write the MTU and congestion control HW tables
2970  *      @adap: the adapter
2971  *      @mtus: the values for the MTU table
2972  *      @alpha: the values for the congestion control alpha parameter
2973  *      @beta: the values for the congestion control beta parameter
2974  *
2975  *      Write the HW MTU table with the supplied MTUs and the high-speed
2976  *      congestion control table with the supplied alpha, beta, and MTUs.
2977  *      We write the two tables together because the additive increments
2978  *      depend on the MTUs.
2979  */
2980 void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
2981                   const unsigned short *alpha, const unsigned short *beta)
2982 {
2983         static const unsigned int avg_pkts[NCCTRL_WIN] = {
2984                 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
2985                 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
2986                 28672, 40960, 57344, 81920, 114688, 163840, 229376
2987         };
2988
2989         unsigned int i, w;
2990
2991         for (i = 0; i < NMTUS; ++i) {
2992                 unsigned int mtu = mtus[i];
2993                 unsigned int log2 = fls(mtu);
2994
2995                 if (!(mtu & ((1 << log2) >> 2)))     /* round */
2996                         log2--;
2997                 t4_write_reg(adap, A_TP_MTU_TABLE, V_MTUINDEX(i) |
2998                              V_MTUWIDTH(log2) | V_MTUVALUE(mtu));
2999
3000                 for (w = 0; w < NCCTRL_WIN; ++w) {
3001                         unsigned int inc;
3002
3003                         inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
3004                                   CC_MIN_INCR);
3005
3006                         t4_write_reg(adap, A_TP_CCTRL_TABLE, (i << 21) |
3007                                      (w << 16) | (beta[w] << 13) | inc);
3008                 }
3009         }
3010 }
3011
3012 /**
3013  *      t4_set_pace_tbl - set the pace table
3014  *      @adap: the adapter
3015  *      @pace_vals: the pace values in microseconds
3016  *      @start: index of the first entry in the HW pace table to set
3017  *      @n: how many entries to set
3018  *
3019  *      Sets (a subset of the) HW pace table.
3020  */
3021 int t4_set_pace_tbl(struct adapter *adap, const unsigned int *pace_vals,
3022                      unsigned int start, unsigned int n)
3023 {
3024         unsigned int vals[NTX_SCHED], i;
3025         unsigned int tick_ns = dack_ticks_to_usec(adap, 1000);
3026
3027         if (n > NTX_SCHED)
3028             return -ERANGE;
3029     
3030         /* convert values from us to dack ticks, rounding to closest value */
3031         for (i = 0; i < n; i++, pace_vals++) {
3032                 vals[i] = (1000 * *pace_vals + tick_ns / 2) / tick_ns;
3033                 if (vals[i] > 0x7ff)
3034                         return -ERANGE;
3035                 if (*pace_vals && vals[i] == 0)
3036                         return -ERANGE;
3037         }
3038         for (i = 0; i < n; i++, start++)
3039                 t4_write_reg(adap, A_TP_PACE_TABLE, (start << 16) | vals[i]);
3040         return 0;
3041 }
3042
3043 /**
3044  *      t4_set_sched_bps - set the bit rate for a HW traffic scheduler
3045  *      @adap: the adapter
3046  *      @kbps: target rate in Kbps
3047  *      @sched: the scheduler index
3048  *
3049  *      Configure a Tx HW scheduler for the target rate.
3050  */
3051 int t4_set_sched_bps(struct adapter *adap, int sched, unsigned int kbps)
3052 {
3053         unsigned int v, tps, cpt, bpt, delta, mindelta = ~0;
3054         unsigned int clk = adap->params.vpd.cclk * 1000;
3055         unsigned int selected_cpt = 0, selected_bpt = 0;
3056
3057         if (kbps > 0) {
3058                 kbps *= 125;     /* -> bytes */
3059                 for (cpt = 1; cpt <= 255; cpt++) {
3060                         tps = clk / cpt;
3061                         bpt = (kbps + tps / 2) / tps;
3062                         if (bpt > 0 && bpt <= 255) {
3063                                 v = bpt * tps;
3064                                 delta = v >= kbps ? v - kbps : kbps - v;
3065                                 if (delta < mindelta) {
3066                                         mindelta = delta;
3067                                         selected_cpt = cpt;
3068                                         selected_bpt = bpt;
3069                                 }
3070                         } else if (selected_cpt)
3071                                 break;
3072                 }
3073                 if (!selected_cpt)
3074                         return -EINVAL;
3075         }
3076         t4_write_reg(adap, A_TP_TM_PIO_ADDR,
3077                      A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2);
3078         v = t4_read_reg(adap, A_TP_TM_PIO_DATA);
3079         if (sched & 1)
3080                 v = (v & 0xffff) | (selected_cpt << 16) | (selected_bpt << 24);
3081         else
3082                 v = (v & 0xffff0000) | selected_cpt | (selected_bpt << 8);
3083         t4_write_reg(adap, A_TP_TM_PIO_DATA, v);
3084         return 0;
3085 }
3086
3087 /**
3088  *      t4_set_sched_ipg - set the IPG for a Tx HW packet rate scheduler
3089  *      @adap: the adapter
3090  *      @sched: the scheduler index
3091  *      @ipg: the interpacket delay in tenths of nanoseconds
3092  *
3093  *      Set the interpacket delay for a HW packet rate scheduler.
3094  */
3095 int t4_set_sched_ipg(struct adapter *adap, int sched, unsigned int ipg)
3096 {
3097         unsigned int v, addr = A_TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR - sched / 2;
3098
3099         /* convert ipg to nearest number of core clocks */
3100         ipg *= core_ticks_per_usec(adap);
3101         ipg = (ipg + 5000) / 10000;
3102         if (ipg > M_TXTIMERSEPQ0)
3103                 return -EINVAL;
3104
3105         t4_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3106         v = t4_read_reg(adap, A_TP_TM_PIO_DATA);
3107         if (sched & 1)
3108                 v = (v & V_TXTIMERSEPQ0(M_TXTIMERSEPQ0)) | V_TXTIMERSEPQ1(ipg);
3109         else
3110                 v = (v & V_TXTIMERSEPQ1(M_TXTIMERSEPQ1)) | V_TXTIMERSEPQ0(ipg);
3111         t4_write_reg(adap, A_TP_TM_PIO_DATA, v);
3112         t4_read_reg(adap, A_TP_TM_PIO_DATA);
3113         return 0;
3114 }
3115
3116 /**
3117  *      t4_get_tx_sched - get the configuration of a Tx HW traffic scheduler
3118  *      @adap: the adapter
3119  *      @sched: the scheduler index
3120  *      @kbps: the byte rate in Kbps
3121  *      @ipg: the interpacket delay in tenths of nanoseconds
3122  *
3123  *      Return the current configuration of a HW Tx scheduler.
3124  */
3125 void t4_get_tx_sched(struct adapter *adap, unsigned int sched, unsigned int *kbps,
3126                      unsigned int *ipg)
3127 {
3128         unsigned int v, addr, bpt, cpt;
3129
3130         if (kbps) {
3131                 addr = A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2;
3132                 t4_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3133                 v = t4_read_reg(adap, A_TP_TM_PIO_DATA);
3134                 if (sched & 1)
3135                         v >>= 16;
3136                 bpt = (v >> 8) & 0xff;
3137                 cpt = v & 0xff;
3138                 if (!cpt)
3139                         *kbps = 0;        /* scheduler disabled */
3140                 else {
3141                         v = (adap->params.vpd.cclk * 1000) / cpt; /* ticks/s */
3142                         *kbps = (v * bpt) / 125;
3143                 }
3144         }
3145         if (ipg) {
3146                 addr = A_TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR - sched / 2;
3147                 t4_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3148                 v = t4_read_reg(adap, A_TP_TM_PIO_DATA);
3149                 if (sched & 1)
3150                         v >>= 16;
3151                 v &= 0xffff;
3152                 *ipg = (10000 * v) / core_ticks_per_usec(adap);
3153         }
3154 }
3155
3156 /*
3157  * Calculates a rate in bytes/s given the number of 256-byte units per 4K core
3158  * clocks.  The formula is
3159  *
3160  * bytes/s = bytes256 * 256 * ClkFreq / 4096
3161  *
3162  * which is equivalent to
3163  *
3164  * bytes/s = 62.5 * bytes256 * ClkFreq_ms
3165  */
3166 static u64 chan_rate(struct adapter *adap, unsigned int bytes256)
3167 {
3168         u64 v = bytes256 * adap->params.vpd.cclk;
3169
3170         return v * 62 + v / 2;
3171 }
3172
3173 /**
3174  *      t4_get_chan_txrate - get the current per channel Tx rates
3175  *      @adap: the adapter
3176  *      @nic_rate: rates for NIC traffic
3177  *      @ofld_rate: rates for offloaded traffic
3178  *
3179  *      Return the current Tx rates in bytes/s for NIC and offloaded traffic
3180  *      for each channel.
3181  */
3182 void t4_get_chan_txrate(struct adapter *adap, u64 *nic_rate, u64 *ofld_rate)
3183 {
3184         u32 v;
3185
3186         v = t4_read_reg(adap, A_TP_TX_TRATE);
3187         nic_rate[0] = chan_rate(adap, G_TNLRATE0(v));
3188         nic_rate[1] = chan_rate(adap, G_TNLRATE1(v));
3189         nic_rate[2] = chan_rate(adap, G_TNLRATE2(v));
3190         nic_rate[3] = chan_rate(adap, G_TNLRATE3(v));
3191
3192         v = t4_read_reg(adap, A_TP_TX_ORATE);
3193         ofld_rate[0] = chan_rate(adap, G_OFDRATE0(v));
3194         ofld_rate[1] = chan_rate(adap, G_OFDRATE1(v));
3195         ofld_rate[2] = chan_rate(adap, G_OFDRATE2(v));
3196         ofld_rate[3] = chan_rate(adap, G_OFDRATE3(v));
3197 }
3198
3199 /**
3200  *      t4_set_trace_filter - configure one of the tracing filters
3201  *      @adap: the adapter
3202  *      @tp: the desired trace filter parameters
3203  *      @idx: which filter to configure
3204  *      @enable: whether to enable or disable the filter
3205  *
3206  *      Configures one of the tracing filters available in HW.  If @enable is
3207  *      %0 @tp is not examined and may be %NULL.
3208  */
3209 int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, int idx,
3210                         int enable)
3211 {
3212         int i, ofst = idx * 4;
3213         u32 data_reg, mask_reg, cfg;
3214         u32 multitrc = F_TRCMULTIFILTER;
3215
3216         if (!enable) {
3217                 t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
3218                 goto out;
3219         }
3220
3221         if (tp->port > 11 || tp->invert > 1 || tp->skip_len > M_TFLENGTH ||
3222             tp->skip_ofst > M_TFOFFSET || tp->min_len > M_TFMINPKTSIZE ||
3223             tp->snap_len > 9600 || (idx && tp->snap_len > 256))
3224                 return -EINVAL;
3225
3226         if (tp->snap_len > 256) {            /* must be tracer 0 */
3227                 if ((t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 4) |
3228                      t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 8) |
3229                      t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 12)) &
3230                     F_TFEN)
3231                         return -EINVAL;  /* other tracers are enabled */
3232                 multitrc = 0;
3233         } else if (idx) {
3234                 i = t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_B);
3235                 if (G_TFCAPTUREMAX(i) > 256 &&
3236                     (t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A) & F_TFEN))
3237                         return -EINVAL;
3238         }
3239
3240         /* stop the tracer we'll be changing */
3241         t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
3242
3243         /* disable tracing globally if running in the wrong single/multi mode */
3244         cfg = t4_read_reg(adap, A_MPS_TRC_CFG);
3245         if ((cfg & F_TRCEN) && multitrc != (cfg & F_TRCMULTIFILTER)) {
3246                 t4_write_reg(adap, A_MPS_TRC_CFG, cfg ^ F_TRCEN);
3247                 t4_read_reg(adap, A_MPS_TRC_CFG);                  /* flush */
3248                 msleep(1);
3249                 if (!(t4_read_reg(adap, A_MPS_TRC_CFG) & F_TRCFIFOEMPTY))
3250                         return -ETIMEDOUT;
3251         }
3252         /*
3253          * At this point either the tracing is enabled and in the right mode or
3254          * disabled.
3255          */
3256
3257         idx *= (A_MPS_TRC_FILTER1_MATCH - A_MPS_TRC_FILTER0_MATCH);
3258         data_reg = A_MPS_TRC_FILTER0_MATCH + idx;
3259         mask_reg = A_MPS_TRC_FILTER0_DONT_CARE + idx;
3260
3261         for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
3262                 t4_write_reg(adap, data_reg, tp->data[i]);
3263                 t4_write_reg(adap, mask_reg, ~tp->mask[i]);
3264         }
3265         t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_B + ofst,
3266                      V_TFCAPTUREMAX(tp->snap_len) |
3267                      V_TFMINPKTSIZE(tp->min_len));
3268         t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst,
3269                      V_TFOFFSET(tp->skip_ofst) | V_TFLENGTH(tp->skip_len) |
3270                      V_TFPORT(tp->port) | F_TFEN | V_TFINVERTMATCH(tp->invert));
3271
3272         cfg &= ~F_TRCMULTIFILTER;
3273         t4_write_reg(adap, A_MPS_TRC_CFG, cfg | F_TRCEN | multitrc);
3274 out:    t4_read_reg(adap, A_MPS_TRC_CFG);  /* flush */
3275         return 0;
3276 }
3277
3278 /**
3279  *      t4_get_trace_filter - query one of the tracing filters
3280  *      @adap: the adapter
3281  *      @tp: the current trace filter parameters
3282  *      @idx: which trace filter to query
3283  *      @enabled: non-zero if the filter is enabled
3284  *
3285  *      Returns the current settings of one of the HW tracing filters.
3286  */
3287 void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx,
3288                          int *enabled)
3289 {
3290         u32 ctla, ctlb;
3291         int i, ofst = idx * 4;
3292         u32 data_reg, mask_reg;
3293
3294         ctla = t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst);
3295         ctlb = t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_B + ofst);
3296
3297         *enabled = !!(ctla & F_TFEN);
3298         tp->snap_len = G_TFCAPTUREMAX(ctlb);
3299         tp->min_len = G_TFMINPKTSIZE(ctlb);
3300         tp->skip_ofst = G_TFOFFSET(ctla);
3301         tp->skip_len = G_TFLENGTH(ctla);
3302         tp->invert = !!(ctla & F_TFINVERTMATCH);
3303         tp->port = G_TFPORT(ctla);
3304
3305         ofst = (A_MPS_TRC_FILTER1_MATCH - A_MPS_TRC_FILTER0_MATCH) * idx;
3306         data_reg = A_MPS_TRC_FILTER0_MATCH + ofst;
3307         mask_reg = A_MPS_TRC_FILTER0_DONT_CARE + ofst;
3308
3309         for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
3310                 tp->mask[i] = ~t4_read_reg(adap, mask_reg);
3311                 tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i];
3312         }
3313 }
3314
3315 /**
3316  *      t4_pmtx_get_stats - returns the HW stats from PMTX
3317  *      @adap: the adapter
3318  *      @cnt: where to store the count statistics
3319  *      @cycles: where to store the cycle statistics
3320  *
3321  *      Returns performance statistics from PMTX.
3322  */
3323 void t4_pmtx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
3324 {
3325         int i;
3326
3327         for (i = 0; i < PM_NSTATS; i++) {
3328                 t4_write_reg(adap, A_PM_TX_STAT_CONFIG, i + 1);
3329                 cnt[i] = t4_read_reg(adap, A_PM_TX_STAT_COUNT);
3330                 cycles[i] = t4_read_reg64(adap, A_PM_TX_STAT_LSB);
3331         }
3332 }
3333
3334 /**
3335  *      t4_pmrx_get_stats - returns the HW stats from PMRX
3336  *      @adap: the adapter
3337  *      @cnt: where to store the count statistics
3338  *      @cycles: where to store the cycle statistics
3339  *
3340  *      Returns performance statistics from PMRX.
3341  */
3342 void t4_pmrx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
3343 {
3344         int i;
3345
3346         for (i = 0; i < PM_NSTATS; i++) {
3347                 t4_write_reg(adap, A_PM_RX_STAT_CONFIG, i + 1);
3348                 cnt[i] = t4_read_reg(adap, A_PM_RX_STAT_COUNT);
3349                 cycles[i] = t4_read_reg64(adap, A_PM_RX_STAT_LSB);
3350         }
3351 }
3352
3353 /**
3354  *      get_mps_bg_map - return the buffer groups associated with a port
3355  *      @adap: the adapter
3356  *      @idx: the port index
3357  *
3358  *      Returns a bitmap indicating which MPS buffer groups are associated
3359  *      with the given port.  Bit i is set if buffer group i is used by the
3360  *      port.
3361  */
3362 static unsigned int get_mps_bg_map(struct adapter *adap, int idx)
3363 {
3364         u32 n = G_NUMPORTS(t4_read_reg(adap, A_MPS_CMN_CTL));
3365
3366         if (n == 0)
3367                 return idx == 0 ? 0xf : 0;
3368         if (n == 1)
3369                 return idx < 2 ? (3 << (2 * idx)) : 0;
3370         return 1 << idx;
3371 }
3372
3373 /**
3374  *      t4_get_port_stats - collect port statistics
3375  *      @adap: the adapter
3376  *      @idx: the port index
3377  *      @p: the stats structure to fill
3378  *
3379  *      Collect statistics related to the given port from HW.
3380  */
3381 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
3382 {
3383         u32 bgmap = get_mps_bg_map(adap, idx);
3384
3385 #define GET_STAT(name) \
3386         t4_read_reg64(adap, PORT_REG(idx, A_MPS_PORT_STAT_##name##_L))
3387 #define GET_STAT_COM(name) t4_read_reg64(adap, A_MPS_STAT_##name##_L)
3388
3389         p->tx_pause            = GET_STAT(TX_PORT_PAUSE);
3390         p->tx_octets           = GET_STAT(TX_PORT_BYTES);
3391         p->tx_frames           = GET_STAT(TX_PORT_FRAMES);
3392         p->tx_bcast_frames     = GET_STAT(TX_PORT_BCAST);
3393         p->tx_mcast_frames     = GET_STAT(TX_PORT_MCAST);
3394         p->tx_ucast_frames     = GET_STAT(TX_PORT_UCAST);
3395         p->tx_error_frames     = GET_STAT(TX_PORT_ERROR);
3396         p->tx_frames_64        = GET_STAT(TX_PORT_64B);
3397         p->tx_frames_65_127    = GET_STAT(TX_PORT_65B_127B);
3398         p->tx_frames_128_255   = GET_STAT(TX_PORT_128B_255B);
3399         p->tx_frames_256_511   = GET_STAT(TX_PORT_256B_511B);
3400         p->tx_frames_512_1023  = GET_STAT(TX_PORT_512B_1023B);
3401         p->tx_frames_1024_1518 = GET_STAT(TX_PORT_1024B_1518B);
3402         p->tx_frames_1519_max  = GET_STAT(TX_PORT_1519B_MAX);
3403         p->tx_drop             = GET_STAT(TX_PORT_DROP);
3404         p->tx_ppp0             = GET_STAT(TX_PORT_PPP0);
3405         p->tx_ppp1             = GET_STAT(TX_PORT_PPP1);
3406         p->tx_ppp2             = GET_STAT(TX_PORT_PPP2);
3407         p->tx_ppp3             = GET_STAT(TX_PORT_PPP3);
3408         p->tx_ppp4             = GET_STAT(TX_PORT_PPP4);
3409         p->tx_ppp5             = GET_STAT(TX_PORT_PPP5);
3410         p->tx_ppp6             = GET_STAT(TX_PORT_PPP6);
3411         p->tx_ppp7             = GET_STAT(TX_PORT_PPP7);
3412
3413         p->rx_pause            = GET_STAT(RX_PORT_PAUSE);
3414         p->rx_octets           = GET_STAT(RX_PORT_BYTES);
3415         p->rx_frames           = GET_STAT(RX_PORT_FRAMES);
3416         p->rx_bcast_frames     = GET_STAT(RX_PORT_BCAST);
3417         p->rx_mcast_frames     = GET_STAT(RX_PORT_MCAST);
3418         p->rx_ucast_frames     = GET_STAT(RX_PORT_UCAST);
3419         p->rx_too_long         = GET_STAT(RX_PORT_MTU_ERROR);
3420         p->rx_jabber           = GET_STAT(RX_PORT_MTU_CRC_ERROR);
3421         p->rx_fcs_err          = GET_STAT(RX_PORT_CRC_ERROR);
3422         p->rx_len_err          = GET_STAT(RX_PORT_LEN_ERROR);
3423         p->rx_symbol_err       = GET_STAT(RX_PORT_SYM_ERROR);
3424         p->rx_runt             = GET_STAT(RX_PORT_LESS_64B);
3425         p->rx_frames_64        = GET_STAT(RX_PORT_64B);
3426         p->rx_frames_65_127    = GET_STAT(RX_PORT_65B_127B);
3427         p->rx_frames_128_255   = GET_STAT(RX_PORT_128B_255B);
3428         p->rx_frames_256_511   = GET_STAT(RX_PORT_256B_511B);
3429         p->rx_frames_512_1023  = GET_STAT(RX_PORT_512B_1023B);
3430         p->rx_frames_1024_1518 = GET_STAT(RX_PORT_1024B_1518B);
3431         p->rx_frames_1519_max  = GET_STAT(RX_PORT_1519B_MAX);
3432         p->rx_ppp0             = GET_STAT(RX_PORT_PPP0);
3433         p->rx_ppp1             = GET_STAT(RX_PORT_PPP1);
3434         p->rx_ppp2             = GET_STAT(RX_PORT_PPP2);
3435         p->rx_ppp3             = GET_STAT(RX_PORT_PPP3);
3436         p->rx_ppp4             = GET_STAT(RX_PORT_PPP4);
3437         p->rx_ppp5             = GET_STAT(RX_PORT_PPP5);
3438         p->rx_ppp6             = GET_STAT(RX_PORT_PPP6);
3439         p->rx_ppp7             = GET_STAT(RX_PORT_PPP7);
3440
3441         p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0;
3442         p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0;
3443         p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0;
3444         p->rx_ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_DROP_FRAME) : 0;
3445         p->rx_trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_TRUNC_FRAME) : 0;
3446         p->rx_trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_TRUNC_FRAME) : 0;
3447         p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0;
3448         p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0;
3449
3450 #undef GET_STAT
3451 #undef GET_STAT_COM
3452 }
3453
3454 /**
3455  *      t4_clr_port_stats - clear port statistics
3456  *      @adap: the adapter
3457  *      @idx: the port index
3458  *
3459  *      Clear HW statistics for the given port.
3460  */
3461 void t4_clr_port_stats(struct adapter *adap, int idx)
3462 {
3463         unsigned int i;
3464         u32 bgmap = get_mps_bg_map(adap, idx);
3465
3466         for (i = A_MPS_PORT_STAT_TX_PORT_BYTES_L;
3467              i <= A_MPS_PORT_STAT_TX_PORT_PPP7_H; i += 8)
3468                 t4_write_reg(adap, PORT_REG(idx, i), 0);
3469         for (i = A_MPS_PORT_STAT_RX_PORT_BYTES_L;
3470              i <= A_MPS_PORT_STAT_RX_PORT_LESS_64B_H; i += 8)
3471                 t4_write_reg(adap, PORT_REG(idx, i), 0);
3472         for (i = 0; i < 4; i++)
3473                 if (bgmap & (1 << i)) {
3474                         t4_write_reg(adap,
3475                                 A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L + i * 8, 0);
3476                         t4_write_reg(adap,
3477                                 A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L + i * 8, 0);
3478                 }
3479 }
3480
3481 /**
3482  *      t4_get_lb_stats - collect loopback port statistics
3483  *      @adap: the adapter
3484  *      @idx: the loopback port index
3485  *      @p: the stats structure to fill
3486  *
3487  *      Return HW statistics for the given loopback port.
3488  */
3489 void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p)
3490 {
3491         u32 bgmap = get_mps_bg_map(adap, idx);
3492
3493 #define GET_STAT(name) \
3494         t4_read_reg64(adap, PORT_REG(idx, A_MPS_PORT_STAT_LB_PORT_##name##_L))
3495 #define GET_STAT_COM(name) t4_read_reg64(adap, A_MPS_STAT_##name##_L)
3496
3497         p->octets           = GET_STAT(BYTES);
3498         p->frames           = GET_STAT(FRAMES);
3499         p->bcast_frames     = GET_STAT(BCAST);
3500         p->mcast_frames     = GET_STAT(MCAST);
3501         p->ucast_frames     = GET_STAT(UCAST);
3502         p->error_frames     = GET_STAT(ERROR);
3503
3504         p->frames_64        = GET_STAT(64B);
3505         p->frames_65_127    = GET_STAT(65B_127B);
3506         p->frames_128_255   = GET_STAT(128B_255B);
3507         p->frames_256_511   = GET_STAT(256B_511B);
3508         p->frames_512_1023  = GET_STAT(512B_1023B);
3509         p->frames_1024_1518 = GET_STAT(1024B_1518B);
3510         p->frames_1519_max  = GET_STAT(1519B_MAX);
3511         p->drop             = t4_read_reg(adap, PORT_REG(idx,
3512                                           A_MPS_PORT_STAT_LB_PORT_DROP_FRAMES));
3513
3514         p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0;
3515         p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0;
3516         p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0;
3517         p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0;
3518         p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0;
3519         p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0;
3520         p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0;
3521         p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0;
3522
3523 #undef GET_STAT
3524 #undef GET_STAT_COM
3525 }
3526
3527 /**
3528  *      t4_wol_magic_enable - enable/disable magic packet WoL
3529  *      @adap: the adapter
3530  *      @port: the physical port index
3531  *      @addr: MAC address expected in magic packets, %NULL to disable
3532  *
3533  *      Enables/disables magic packet wake-on-LAN for the selected port.
3534  */
3535 void t4_wol_magic_enable(struct adapter *adap, unsigned int port,
3536                          const u8 *addr)
3537 {
3538         if (addr) {
3539                 t4_write_reg(adap, PORT_REG(port, A_XGMAC_PORT_MAGIC_MACID_LO),
3540                              (addr[2] << 24) | (addr[3] << 16) |
3541                              (addr[4] << 8) | addr[5]);
3542                 t4_write_reg(adap, PORT_REG(port, A_XGMAC_PORT_MAGIC_MACID_HI),
3543                              (addr[0] << 8) | addr[1]);
3544         }
3545         t4_set_reg_field(adap, PORT_REG(port, A_XGMAC_PORT_CFG2), F_MAGICEN,
3546                          V_MAGICEN(addr != NULL));
3547 }
3548
3549 /**
3550  *      t4_wol_pat_enable - enable/disable pattern-based WoL
3551  *      @adap: the adapter
3552  *      @port: the physical port index
3553  *      @map: bitmap of which HW pattern filters to set
3554  *      @mask0: byte mask for bytes 0-63 of a packet
3555  *      @mask1: byte mask for bytes 64-127 of a packet
3556  *      @crc: Ethernet CRC for selected bytes
3557  *      @enable: enable/disable switch
3558  *
3559  *      Sets the pattern filters indicated in @map to mask out the bytes
3560  *      specified in @mask0/@mask1 in received packets and compare the CRC of
3561  *      the resulting packet against @crc.  If @enable is %true pattern-based
3562  *      WoL is enabled, otherwise disabled.
3563  */
3564 int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map,
3565                       u64 mask0, u64 mask1, unsigned int crc, bool enable)
3566 {
3567         int i;
3568
3569         if (!enable) {
3570                 t4_set_reg_field(adap, PORT_REG(port, A_XGMAC_PORT_CFG2),
3571                                  F_PATEN, 0);
3572                 return 0;
3573         }
3574         if (map > 0xff)
3575                 return -EINVAL;
3576
3577 #define EPIO_REG(name) PORT_REG(port, A_XGMAC_PORT_EPIO_##name)
3578
3579         t4_write_reg(adap, EPIO_REG(DATA1), mask0 >> 32);
3580         t4_write_reg(adap, EPIO_REG(DATA2), mask1);
3581         t4_write_reg(adap, EPIO_REG(DATA3), mask1 >> 32);
3582
3583         for (i = 0; i < NWOL_PAT; i++, map >>= 1) {
3584                 if (!(map & 1))
3585                         continue;
3586
3587                 /* write byte masks */
3588                 t4_write_reg(adap, EPIO_REG(DATA0), mask0);
3589                 t4_write_reg(adap, EPIO_REG(OP), V_ADDRESS(i) | F_EPIOWR);
3590                 t4_read_reg(adap, EPIO_REG(OP));                /* flush */
3591                 if (t4_read_reg(adap, EPIO_REG(OP)) & F_BUSY)
3592                         return -ETIMEDOUT;
3593
3594                 /* write CRC */
3595                 t4_write_reg(adap, EPIO_REG(DATA0), crc);
3596                 t4_write_reg(adap, EPIO_REG(OP), V_ADDRESS(i + 32) | F_EPIOWR);
3597                 t4_read_reg(adap, EPIO_REG(OP));                /* flush */
3598                 if (t4_read_reg(adap, EPIO_REG(OP)) & F_BUSY)
3599                         return -ETIMEDOUT;
3600         }
3601 #undef EPIO_REG
3602
3603         t4_set_reg_field(adap, PORT_REG(port, A_XGMAC_PORT_CFG2), 0, F_PATEN);
3604         return 0;
3605 }
3606
3607 /**
3608  *      t4_mk_filtdelwr - create a delete filter WR
3609  *      @ftid: the filter ID
3610  *      @wr: the filter work request to populate
3611  *      @qid: ingress queue to receive the delete notification
3612  *
3613  *      Creates a filter work request to delete the supplied filter.  If @qid is
3614  *      negative the delete notification is suppressed.
3615  */
3616 void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid)
3617 {
3618         memset(wr, 0, sizeof(*wr));
3619         wr->op_pkd = htonl(V_FW_WR_OP(FW_FILTER_WR));
3620         wr->len16_pkd = htonl(V_FW_WR_LEN16(sizeof(*wr) / 16));
3621         wr->tid_to_iq = htonl(V_FW_FILTER_WR_TID(ftid) |
3622                               V_FW_FILTER_WR_NOREPLY(qid < 0));
3623         wr->del_filter_to_l2tix = htonl(F_FW_FILTER_WR_DEL_FILTER);
3624         if (qid >= 0)
3625                 wr->rx_chan_rx_rpl_iq = htons(V_FW_FILTER_WR_RX_RPL_IQ(qid));
3626 }
3627
3628 #define INIT_CMD(var, cmd, rd_wr) do { \
3629         (var).op_to_write = htonl(V_FW_CMD_OP(FW_##cmd##_CMD) | \
3630                                   F_FW_CMD_REQUEST | F_FW_CMD_##rd_wr); \
3631         (var).retval_len16 = htonl(FW_LEN16(var)); \
3632 } while (0)
3633
3634 /**
3635  *      t4_mdio_rd - read a PHY register through MDIO
3636  *      @adap: the adapter
3637  *      @mbox: mailbox to use for the FW command
3638  *      @phy_addr: the PHY address
3639  *      @mmd: the PHY MMD to access (0 for clause 22 PHYs)
3640  *      @reg: the register to read
3641  *      @valp: where to store the value
3642  *
3643  *      Issues a FW command through the given mailbox to read a PHY register.
3644  */
3645 int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
3646                unsigned int mmd, unsigned int reg, unsigned int *valp)
3647 {
3648         int ret;
3649         struct fw_ldst_cmd c;
3650
3651         memset(&c, 0, sizeof(c));
3652         c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST |
3653                 F_FW_CMD_READ | V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MDIO));
3654         c.cycles_to_len16 = htonl(FW_LEN16(c));
3655         c.u.mdio.paddr_mmd = htons(V_FW_LDST_CMD_PADDR(phy_addr) |
3656                                    V_FW_LDST_CMD_MMD(mmd));
3657         c.u.mdio.raddr = htons(reg);
3658
3659         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3660         if (ret == 0)
3661                 *valp = ntohs(c.u.mdio.rval);
3662         return ret;
3663 }
3664
3665 /**
3666  *      t4_mdio_wr - write a PHY register through MDIO
3667  *      @adap: the adapter
3668  *      @mbox: mailbox to use for the FW command
3669  *      @phy_addr: the PHY address
3670  *      @mmd: the PHY MMD to access (0 for clause 22 PHYs)
3671  *      @reg: the register to write
3672  *      @valp: value to write
3673  *
3674  *      Issues a FW command through the given mailbox to write a PHY register.
3675  */
3676 int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
3677                unsigned int mmd, unsigned int reg, unsigned int val)
3678 {
3679         struct fw_ldst_cmd c;
3680
3681         memset(&c, 0, sizeof(c));
3682         c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST |
3683                 F_FW_CMD_WRITE | V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MDIO));
3684         c.cycles_to_len16 = htonl(FW_LEN16(c));
3685         c.u.mdio.paddr_mmd = htons(V_FW_LDST_CMD_PADDR(phy_addr) |
3686                                    V_FW_LDST_CMD_MMD(mmd));
3687         c.u.mdio.raddr = htons(reg);
3688         c.u.mdio.rval = htons(val);
3689
3690         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3691 }
3692
3693 /**
3694  *      t4_sge_ctxt_rd - read an SGE context through FW
3695  *      @adap: the adapter
3696  *      @mbox: mailbox to use for the FW command
3697  *      @cid: the context id
3698  *      @ctype: the context type
3699  *      @data: where to store the context data
3700  *
3701  *      Issues a FW command through the given mailbox to read an SGE context.
3702  */
3703 int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid,
3704                    enum ctxt_type ctype, u32 *data)
3705 {
3706         int ret;
3707         struct fw_ldst_cmd c;
3708
3709         if (ctype == CTXT_EGRESS)
3710                 ret = FW_LDST_ADDRSPC_SGE_EGRC;
3711         else if (ctype == CTXT_INGRESS)
3712                 ret = FW_LDST_ADDRSPC_SGE_INGC;
3713         else if (ctype == CTXT_FLM)
3714                 ret = FW_LDST_ADDRSPC_SGE_FLMC;
3715         else
3716                 ret = FW_LDST_ADDRSPC_SGE_CONMC;
3717
3718         memset(&c, 0, sizeof(c));
3719         c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST |
3720                                   F_FW_CMD_READ | V_FW_LDST_CMD_ADDRSPACE(ret));
3721         c.cycles_to_len16 = htonl(FW_LEN16(c));
3722         c.u.idctxt.physid = htonl(cid);
3723
3724         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3725         if (ret == 0) {
3726                 data[0] = ntohl(c.u.idctxt.ctxt_data0);
3727                 data[1] = ntohl(c.u.idctxt.ctxt_data1);
3728                 data[2] = ntohl(c.u.idctxt.ctxt_data2);
3729                 data[3] = ntohl(c.u.idctxt.ctxt_data3);
3730                 data[4] = ntohl(c.u.idctxt.ctxt_data4);
3731                 data[5] = ntohl(c.u.idctxt.ctxt_data5);
3732         }
3733         return ret;
3734 }
3735
3736 /**
3737  *      t4_sge_ctxt_rd_bd - read an SGE context bypassing FW
3738  *      @adap: the adapter
3739  *      @cid: the context id
3740  *      @ctype: the context type
3741  *      @data: where to store the context data
3742  *
3743  *      Reads an SGE context directly, bypassing FW.  This is only for
3744  *      debugging when FW is unavailable.
3745  */
3746 int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, enum ctxt_type ctype,
3747                       u32 *data)
3748 {
3749         int i, ret;
3750
3751         t4_write_reg(adap, A_SGE_CTXT_CMD, V_CTXTQID(cid) | V_CTXTTYPE(ctype));
3752         ret = t4_wait_op_done(adap, A_SGE_CTXT_CMD, F_BUSY, 0, 3, 1);
3753         if (!ret)
3754                 for (i = A_SGE_CTXT_DATA0; i <= A_SGE_CTXT_DATA5; i += 4)
3755                         *data++ = t4_read_reg(adap, i);
3756         return ret;
3757 }
3758
3759 /**
3760  *      t4_fw_hello - establish communication with FW
3761  *      @adap: the adapter
3762  *      @mbox: mailbox to use for the FW command
3763  *      @evt_mbox: mailbox to receive async FW events
3764  *      @master: specifies the caller's willingness to be the device master
3765  *      @state: returns the current device state
3766  *
3767  *      Issues a command to establish communication with FW.
3768  */
3769 int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox,
3770                 enum dev_master master, enum dev_state *state)
3771 {
3772         int ret;
3773         struct fw_hello_cmd c;
3774         u32 v;
3775         unsigned int master_mbox;
3776         int retries = FW_CMD_HELLO_RETRIES;
3777
3778 retry:
3779         memset(&c, 0, sizeof(c));
3780         INIT_CMD(c, HELLO, WRITE);
3781         c.err_to_clearinit = htonl(
3782                 V_FW_HELLO_CMD_MASTERDIS(master == MASTER_CANT) |
3783                 V_FW_HELLO_CMD_MASTERFORCE(master == MASTER_MUST) |
3784                 V_FW_HELLO_CMD_MBMASTER(master == MASTER_MUST ? mbox :
3785                         M_FW_HELLO_CMD_MBMASTER) |
3786                 V_FW_HELLO_CMD_MBASYNCNOT(evt_mbox) |
3787                 V_FW_HELLO_CMD_STAGE(FW_HELLO_CMD_STAGE_OS) |
3788                 F_FW_HELLO_CMD_CLEARINIT);
3789
3790         /*
3791          * Issue the HELLO command to the firmware.  If it's not successful
3792          * but indicates that we got a "busy" or "timeout" condition, retry
3793          * the HELLO until we exhaust our retry limit.
3794          */
3795         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3796         if (ret != FW_SUCCESS) {
3797                 if ((ret == -EBUSY || ret == -ETIMEDOUT) && retries-- > 0)
3798                         goto retry;
3799                 return ret;
3800         }
3801
3802         v = ntohl(c.err_to_clearinit);
3803         master_mbox = G_FW_HELLO_CMD_MBMASTER(v);
3804         if (state) {
3805                 if (v & F_FW_HELLO_CMD_ERR)
3806                         *state = DEV_STATE_ERR;
3807                 else if (v & F_FW_HELLO_CMD_INIT)
3808                         *state = DEV_STATE_INIT;
3809                 else
3810                         *state = DEV_STATE_UNINIT;
3811         }
3812
3813         /*
3814          * If we're not the Master PF then we need to wait around for the
3815          * Master PF Driver to finish setting up the adapter.
3816          *
3817          * Note that we also do this wait if we're a non-Master-capable PF and
3818          * there is no current Master PF; a Master PF may show up momentarily
3819          * and we wouldn't want to fail pointlessly.  (This can happen when an
3820          * OS loads lots of different drivers rapidly at the same time).  In
3821          * this case, the Master PF returned by the firmware will be
3822          * M_PCIE_FW_MASTER so the test below will work ...
3823          */
3824         if ((v & (F_FW_HELLO_CMD_ERR|F_FW_HELLO_CMD_INIT)) == 0 &&
3825             master_mbox != mbox) {
3826                 int waiting = FW_CMD_HELLO_TIMEOUT;
3827
3828                 /*
3829                  * Wait for the firmware to either indicate an error or
3830                  * initialized state.  If we see either of these we bail out
3831                  * and report the issue to the caller.  If we exhaust the
3832                  * "hello timeout" and we haven't exhausted our retries, try
3833                  * again.  Otherwise bail with a timeout error.
3834                  */
3835                 for (;;) {
3836                         u32 pcie_fw;
3837
3838                         msleep(50);
3839                         waiting -= 50;
3840
3841                         /*
3842                          * If neither Error nor Initialialized are indicated
3843                          * by the firmware keep waiting till we exhaust our
3844                          * timeout ... and then retry if we haven't exhausted
3845                          * our retries ...
3846                          */
3847                         pcie_fw = t4_read_reg(adap, A_PCIE_FW);
3848                         if (!(pcie_fw & (F_PCIE_FW_ERR|F_PCIE_FW_INIT))) {
3849                                 if (waiting <= 0) {
3850                                         if (retries-- > 0)
3851                                                 goto retry;
3852
3853                                         return -ETIMEDOUT;
3854                                 }
3855                                 continue;
3856                         }
3857
3858                         /*
3859                          * We either have an Error or Initialized condition
3860                          * report errors preferentially.
3861                          */
3862                         if (state) {
3863                                 if (pcie_fw & F_PCIE_FW_ERR)
3864                                         *state = DEV_STATE_ERR;
3865                                 else if (pcie_fw & F_PCIE_FW_INIT)
3866                                         *state = DEV_STATE_INIT;
3867                         }
3868
3869                         /*
3870                          * If we arrived before a Master PF was selected and
3871                          * there's not a valid Master PF, grab its identity
3872                          * for our caller.
3873                          */
3874                         if (master_mbox == M_PCIE_FW_MASTER &&
3875                             (pcie_fw & F_PCIE_FW_MASTER_VLD))
3876                                 master_mbox = G_PCIE_FW_MASTER(pcie_fw);
3877                         break;
3878                 }
3879         }
3880
3881         return master_mbox;
3882 }
3883
3884 /**
3885  *      t4_fw_bye - end communication with FW
3886  *      @adap: the adapter
3887  *      @mbox: mailbox to use for the FW command
3888  *
3889  *      Issues a command to terminate communication with FW.
3890  */
3891 int t4_fw_bye(struct adapter *adap, unsigned int mbox)
3892 {
3893         struct fw_bye_cmd c;
3894
3895         memset(&c, 0, sizeof(c));
3896         INIT_CMD(c, BYE, WRITE);
3897         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3898 }
3899
3900 /**
3901  *      t4_fw_reset - issue a reset to FW
3902  *      @adap: the adapter
3903  *      @mbox: mailbox to use for the FW command
3904  *      @reset: specifies the type of reset to perform
3905  *
3906  *      Issues a reset command of the specified type to FW.
3907  */
3908 int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset)
3909 {
3910         struct fw_reset_cmd c;
3911
3912         memset(&c, 0, sizeof(c));
3913         INIT_CMD(c, RESET, WRITE);
3914         c.val = htonl(reset);
3915         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3916 }
3917
3918 /**
3919  *      t4_fw_initialize - ask FW to initialize the device
3920  *      @adap: the adapter
3921  *      @mbox: mailbox to use for the FW command
3922  *
3923  *      Issues a command to FW to partially initialize the device.  This
3924  *      performs initialization that generally doesn't depend on user input.
3925  */
3926 int t4_fw_initialize(struct adapter *adap, unsigned int mbox)
3927 {
3928         struct fw_initialize_cmd c;
3929
3930         memset(&c, 0, sizeof(c));
3931         INIT_CMD(c, INITIALIZE, WRITE);
3932         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
3933 }
3934
3935 /**
3936  *      t4_query_params - query FW or device parameters
3937  *      @adap: the adapter
3938  *      @mbox: mailbox to use for the FW command
3939  *      @pf: the PF
3940  *      @vf: the VF
3941  *      @nparams: the number of parameters
3942  *      @params: the parameter names
3943  *      @val: the parameter values
3944  *
3945  *      Reads the value of FW or device parameters.  Up to 7 parameters can be
3946  *      queried at once.
3947  */
3948 int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
3949                     unsigned int vf, unsigned int nparams, const u32 *params,
3950                     u32 *val)
3951 {
3952         int i, ret;
3953         struct fw_params_cmd c;
3954         __be32 *p = &c.param[0].mnem;
3955
3956         if (nparams > 7)
3957                 return -EINVAL;
3958
3959         memset(&c, 0, sizeof(c));
3960         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_PARAMS_CMD) | F_FW_CMD_REQUEST |
3961                             F_FW_CMD_READ | V_FW_PARAMS_CMD_PFN(pf) |
3962                             V_FW_PARAMS_CMD_VFN(vf));
3963         c.retval_len16 = htonl(FW_LEN16(c));
3964
3965         for (i = 0; i < nparams; i++, p += 2)
3966                 *p = htonl(*params++);
3967
3968         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
3969         if (ret == 0)
3970                 for (i = 0, p = &c.param[0].val; i < nparams; i++, p += 2)
3971                         *val++ = ntohl(*p);
3972         return ret;
3973 }
3974
3975 /**
3976  *      t4_set_params - sets FW or device parameters
3977  *      @adap: the adapter
3978  *      @mbox: mailbox to use for the FW command
3979  *      @pf: the PF
3980  *      @vf: the VF
3981  *      @nparams: the number of parameters
3982  *      @params: the parameter names
3983  *      @val: the parameter values
3984  *
3985  *      Sets the value of FW or device parameters.  Up to 7 parameters can be
3986  *      specified at once.
3987  */
3988 int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
3989                   unsigned int vf, unsigned int nparams, const u32 *params,
3990                   const u32 *val)
3991 {
3992         struct fw_params_cmd c;
3993         __be32 *p = &c.param[0].mnem;
3994
3995         if (nparams > 7)
3996                 return -EINVAL;
3997
3998         memset(&c, 0, sizeof(c));
3999         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_PARAMS_CMD) | F_FW_CMD_REQUEST |
4000                             F_FW_CMD_WRITE | V_FW_PARAMS_CMD_PFN(pf) |
4001                             V_FW_PARAMS_CMD_VFN(vf));
4002         c.retval_len16 = htonl(FW_LEN16(c));
4003
4004         while (nparams--) {
4005                 *p++ = htonl(*params++);
4006                 *p++ = htonl(*val++);
4007         }
4008
4009         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4010 }
4011
4012 /**
4013  *      t4_cfg_pfvf - configure PF/VF resource limits
4014  *      @adap: the adapter
4015  *      @mbox: mailbox to use for the FW command
4016  *      @pf: the PF being configured
4017  *      @vf: the VF being configured
4018  *      @txq: the max number of egress queues
4019  *      @txq_eth_ctrl: the max number of egress Ethernet or control queues
4020  *      @rxqi: the max number of interrupt-capable ingress queues
4021  *      @rxq: the max number of interruptless ingress queues
4022  *      @tc: the PCI traffic class
4023  *      @vi: the max number of virtual interfaces
4024  *      @cmask: the channel access rights mask for the PF/VF
4025  *      @pmask: the port access rights mask for the PF/VF
4026  *      @nexact: the maximum number of exact MPS filters
4027  *      @rcaps: read capabilities
4028  *      @wxcaps: write/execute capabilities
4029  *
4030  *      Configures resource limits and capabilities for a physical or virtual
4031  *      function.
4032  */
4033 int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf,
4034                 unsigned int vf, unsigned int txq, unsigned int txq_eth_ctrl,
4035                 unsigned int rxqi, unsigned int rxq, unsigned int tc,
4036                 unsigned int vi, unsigned int cmask, unsigned int pmask,
4037                 unsigned int nexact, unsigned int rcaps, unsigned int wxcaps)
4038 {
4039         struct fw_pfvf_cmd c;
4040
4041         memset(&c, 0, sizeof(c));
4042         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_PFVF_CMD) | F_FW_CMD_REQUEST |
4043                             F_FW_CMD_WRITE | V_FW_PFVF_CMD_PFN(pf) |
4044                             V_FW_PFVF_CMD_VFN(vf));
4045         c.retval_len16 = htonl(FW_LEN16(c));
4046         c.niqflint_niq = htonl(V_FW_PFVF_CMD_NIQFLINT(rxqi) |
4047                                V_FW_PFVF_CMD_NIQ(rxq));
4048         c.type_to_neq = htonl(V_FW_PFVF_CMD_CMASK(cmask) |
4049                               V_FW_PFVF_CMD_PMASK(pmask) |
4050                               V_FW_PFVF_CMD_NEQ(txq));
4051         c.tc_to_nexactf = htonl(V_FW_PFVF_CMD_TC(tc) | V_FW_PFVF_CMD_NVI(vi) |
4052                                 V_FW_PFVF_CMD_NEXACTF(nexact));
4053         c.r_caps_to_nethctrl = htonl(V_FW_PFVF_CMD_R_CAPS(rcaps) |
4054                                      V_FW_PFVF_CMD_WX_CAPS(wxcaps) |
4055                                      V_FW_PFVF_CMD_NETHCTRL(txq_eth_ctrl));
4056         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4057 }
4058
4059 /**
4060  *      t4_alloc_vi - allocate a virtual interface
4061  *      @adap: the adapter
4062  *      @mbox: mailbox to use for the FW command
4063  *      @port: physical port associated with the VI
4064  *      @pf: the PF owning the VI
4065  *      @vf: the VF owning the VI
4066  *      @nmac: number of MAC addresses needed (1 to 5)
4067  *      @mac: the MAC addresses of the VI
4068  *      @rss_size: size of RSS table slice associated with this VI
4069  *
4070  *      Allocates a virtual interface for the given physical port.  If @mac is
4071  *      not %NULL it contains the MAC addresses of the VI as assigned by FW.
4072  *      @mac should be large enough to hold @nmac Ethernet addresses, they are
4073  *      stored consecutively so the space needed is @nmac * 6 bytes.
4074  *      Returns a negative error number or the non-negative VI id.
4075  */
4076 int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
4077                 unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
4078                 unsigned int *rss_size)
4079 {
4080         int ret;
4081         struct fw_vi_cmd c;
4082
4083         memset(&c, 0, sizeof(c));
4084         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_VI_CMD) | F_FW_CMD_REQUEST |
4085                             F_FW_CMD_WRITE | F_FW_CMD_EXEC |
4086                             V_FW_VI_CMD_PFN(pf) | V_FW_VI_CMD_VFN(vf));
4087         c.alloc_to_len16 = htonl(F_FW_VI_CMD_ALLOC | FW_LEN16(c));
4088         c.portid_pkd = V_FW_VI_CMD_PORTID(port);
4089         c.nmac = nmac - 1;
4090
4091         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
4092         if (ret)
4093                 return ret;
4094
4095         if (mac) {
4096                 memcpy(mac, c.mac, sizeof(c.mac));
4097                 switch (nmac) {
4098                 case 5:
4099                         memcpy(mac + 24, c.nmac3, sizeof(c.nmac3));
4100                 case 4:
4101                         memcpy(mac + 18, c.nmac2, sizeof(c.nmac2));
4102                 case 3:
4103                         memcpy(mac + 12, c.nmac1, sizeof(c.nmac1));
4104                 case 2:
4105                         memcpy(mac + 6,  c.nmac0, sizeof(c.nmac0));
4106                 }
4107         }
4108         if (rss_size)
4109                 *rss_size = G_FW_VI_CMD_RSSSIZE(ntohs(c.rsssize_pkd));
4110         return G_FW_VI_CMD_VIID(ntohs(c.type_to_viid));
4111 }
4112
4113 /**
4114  *      t4_free_vi - free a virtual interface
4115  *      @adap: the adapter
4116  *      @mbox: mailbox to use for the FW command
4117  *      @pf: the PF owning the VI
4118  *      @vf: the VF owning the VI
4119  *      @viid: virtual interface identifiler
4120  *
4121  *      Free a previously allocated virtual interface.
4122  */
4123 int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
4124                unsigned int vf, unsigned int viid)
4125 {
4126         struct fw_vi_cmd c;
4127
4128         memset(&c, 0, sizeof(c));
4129         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_VI_CMD) |
4130                             F_FW_CMD_REQUEST |
4131                             F_FW_CMD_EXEC |
4132                             V_FW_VI_CMD_PFN(pf) |
4133                             V_FW_VI_CMD_VFN(vf));
4134         c.alloc_to_len16 = htonl(F_FW_VI_CMD_FREE | FW_LEN16(c));
4135         c.type_to_viid = htons(V_FW_VI_CMD_VIID(viid));
4136
4137         return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
4138 }
4139
4140 /**
4141  *      t4_set_rxmode - set Rx properties of a virtual interface
4142  *      @adap: the adapter
4143  *      @mbox: mailbox to use for the FW command
4144  *      @viid: the VI id
4145  *      @mtu: the new MTU or -1
4146  *      @promisc: 1 to enable promiscuous mode, 0 to disable it, -1 no change
4147  *      @all_multi: 1 to enable all-multi mode, 0 to disable it, -1 no change
4148  *      @bcast: 1 to enable broadcast Rx, 0 to disable it, -1 no change
4149  *      @vlanex: 1 to enable HVLAN extraction, 0 to disable it, -1 no change
4150  *      @sleep_ok: if true we may sleep while awaiting command completion
4151  *
4152  *      Sets Rx properties of a virtual interface.
4153  */
4154 int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
4155                   int mtu, int promisc, int all_multi, int bcast, int vlanex,
4156                   bool sleep_ok)
4157 {
4158         struct fw_vi_rxmode_cmd c;
4159
4160         /* convert to FW values */
4161         if (mtu < 0)
4162                 mtu = M_FW_VI_RXMODE_CMD_MTU;
4163         if (promisc < 0)
4164                 promisc = M_FW_VI_RXMODE_CMD_PROMISCEN;
4165         if (all_multi < 0)
4166                 all_multi = M_FW_VI_RXMODE_CMD_ALLMULTIEN;
4167         if (bcast < 0)
4168                 bcast = M_FW_VI_RXMODE_CMD_BROADCASTEN;
4169         if (vlanex < 0)
4170                 vlanex = M_FW_VI_RXMODE_CMD_VLANEXEN;
4171
4172         memset(&c, 0, sizeof(c));
4173         c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_RXMODE_CMD) | F_FW_CMD_REQUEST |
4174                              F_FW_CMD_WRITE | V_FW_VI_RXMODE_CMD_VIID(viid));
4175         c.retval_len16 = htonl(FW_LEN16(c));
4176         c.mtu_to_vlanexen = htonl(V_FW_VI_RXMODE_CMD_MTU(mtu) |
4177                                   V_FW_VI_RXMODE_CMD_PROMISCEN(promisc) |
4178                                   V_FW_VI_RXMODE_CMD_ALLMULTIEN(all_multi) |
4179                                   V_FW_VI_RXMODE_CMD_BROADCASTEN(bcast) |
4180                                   V_FW_VI_RXMODE_CMD_VLANEXEN(vlanex));
4181         return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
4182 }
4183
4184 /**
4185  *      t4_alloc_mac_filt - allocates exact-match filters for MAC addresses
4186  *      @adap: the adapter
4187  *      @mbox: mailbox to use for the FW command
4188  *      @viid: the VI id
4189  *      @free: if true any existing filters for this VI id are first removed
4190  *      @naddr: the number of MAC addresses to allocate filters for (up to 7)
4191  *      @addr: the MAC address(es)
4192  *      @idx: where to store the index of each allocated filter
4193  *      @hash: pointer to hash address filter bitmap
4194  *      @sleep_ok: call is allowed to sleep
4195  *
4196  *      Allocates an exact-match filter for each of the supplied addresses and
4197  *      sets it to the corresponding address.  If @idx is not %NULL it should
4198  *      have at least @naddr entries, each of which will be set to the index of
4199  *      the filter allocated for the corresponding MAC address.  If a filter
4200  *      could not be allocated for an address its index is set to 0xffff.
4201  *      If @hash is not %NULL addresses that fail to allocate an exact filter
4202  *      are hashed and update the hash filter bitmap pointed at by @hash.
4203  *
4204  *      Returns a negative error number or the number of filters allocated.
4205  */
4206 int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
4207                       unsigned int viid, bool free, unsigned int naddr,
4208                       const u8 **addr, u16 *idx, u64 *hash, bool sleep_ok)
4209 {
4210         int offset, ret = 0;
4211         struct fw_vi_mac_cmd c;
4212         unsigned int nfilters = 0;
4213         unsigned int rem = naddr;
4214
4215         if (naddr > FW_CLS_TCAM_NUM_ENTRIES)
4216                 return -EINVAL;
4217
4218         for (offset = 0; offset < naddr ; /**/) {
4219                 unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact)
4220                                          ? rem
4221                                          : ARRAY_SIZE(c.u.exact));
4222                 size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
4223                                                      u.exact[fw_naddr]), 16);
4224                 struct fw_vi_mac_exact *p;
4225                 int i;
4226
4227                 memset(&c, 0, sizeof(c));
4228                 c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_MAC_CMD) |
4229                                      F_FW_CMD_REQUEST |
4230                                      F_FW_CMD_WRITE |
4231                                      V_FW_CMD_EXEC(free) |
4232                                      V_FW_VI_MAC_CMD_VIID(viid));
4233                 c.freemacs_to_len16 = htonl(V_FW_VI_MAC_CMD_FREEMACS(free) |
4234                                             V_FW_CMD_LEN16(len16));
4235
4236                 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
4237                         p->valid_to_idx = htons(
4238                                 F_FW_VI_MAC_CMD_VALID |
4239                                 V_FW_VI_MAC_CMD_IDX(FW_VI_MAC_ADD_MAC));
4240                         memcpy(p->macaddr, addr[offset+i], sizeof(p->macaddr));
4241                 }
4242
4243                 /*
4244                  * It's okay if we run out of space in our MAC address arena.
4245                  * Some of the addresses we submit may get stored so we need
4246                  * to run through the reply to see what the results were ...
4247                  */
4248                 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
4249                 if (ret && ret != -FW_ENOMEM)
4250                         break;
4251
4252                 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
4253                         u16 index = G_FW_VI_MAC_CMD_IDX(ntohs(p->valid_to_idx));
4254
4255                         if (idx)
4256                                 idx[offset+i] = (index >= FW_CLS_TCAM_NUM_ENTRIES
4257                                                  ? 0xffff
4258                                                  : index);
4259                         if (index < FW_CLS_TCAM_NUM_ENTRIES)
4260                                 nfilters++;
4261                         else if (hash)
4262                                 *hash |= (1ULL << hash_mac_addr(addr[offset+i]));
4263                 }
4264
4265                 free = false;
4266                 offset += fw_naddr;
4267                 rem -= fw_naddr;
4268         }
4269
4270         if (ret == 0 || ret == -FW_ENOMEM)
4271                 ret = nfilters; 
4272         return ret;
4273 }
4274
4275 /**
4276  *      t4_change_mac - modifies the exact-match filter for a MAC address
4277  *      @adap: the adapter
4278  *      @mbox: mailbox to use for the FW command
4279  *      @viid: the VI id
4280  *      @idx: index of existing filter for old value of MAC address, or -1
4281  *      @addr: the new MAC address value
4282  *      @persist: whether a new MAC allocation should be persistent
4283  *      @add_smt: if true also add the address to the HW SMT
4284  *
4285  *      Modifies an exact-match filter and sets it to the new MAC address if
4286  *      @idx >= 0, or adds the MAC address to a new filter if @idx < 0.  In the
4287  *      latter case the address is added persistently if @persist is %true.
4288  *
4289  *      Note that in general it is not possible to modify the value of a given
4290  *      filter so the generic way to modify an address filter is to free the one
4291  *      being used by the old address value and allocate a new filter for the
4292  *      new address value.
4293  *
4294  *      Returns a negative error number or the index of the filter with the new
4295  *      MAC value.  Note that this index may differ from @idx.
4296  */
4297 int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
4298                   int idx, const u8 *addr, bool persist, bool add_smt)
4299 {
4300         int ret, mode;
4301         struct fw_vi_mac_cmd c;
4302         struct fw_vi_mac_exact *p = c.u.exact;
4303
4304         if (idx < 0)                             /* new allocation */
4305                 idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC;
4306         mode = add_smt ? FW_VI_MAC_SMT_AND_MPSTCAM : FW_VI_MAC_MPS_TCAM_ENTRY;
4307
4308         memset(&c, 0, sizeof(c));
4309         c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_MAC_CMD) | F_FW_CMD_REQUEST |
4310                              F_FW_CMD_WRITE | V_FW_VI_MAC_CMD_VIID(viid));
4311         c.freemacs_to_len16 = htonl(V_FW_CMD_LEN16(1));
4312         p->valid_to_idx = htons(F_FW_VI_MAC_CMD_VALID |
4313                                 V_FW_VI_MAC_CMD_SMAC_RESULT(mode) |
4314                                 V_FW_VI_MAC_CMD_IDX(idx));
4315         memcpy(p->macaddr, addr, sizeof(p->macaddr));
4316
4317         ret = t4_wr_mbox_ns(adap, mbox, &c, sizeof(c), &c);
4318         if (ret == 0) {
4319                 ret = G_FW_VI_MAC_CMD_IDX(ntohs(p->valid_to_idx));
4320                 if (ret >= FW_CLS_TCAM_NUM_ENTRIES)
4321                         ret = -ENOMEM;
4322         }
4323         return ret;
4324 }
4325
4326 /**
4327  *      t4_set_addr_hash - program the MAC inexact-match hash filter
4328  *      @adap: the adapter
4329  *      @mbox: mailbox to use for the FW command
4330  *      @viid: the VI id
4331  *      @ucast: whether the hash filter should also match unicast addresses
4332  *      @vec: the value to be written to the hash filter
4333  *      @sleep_ok: call is allowed to sleep
4334  *
4335  *      Sets the 64-bit inexact-match hash filter for a virtual interface.
4336  */
4337 int t4_set_addr_hash(struct adapter *adap, unsigned int mbox, unsigned int viid,
4338                      bool ucast, u64 vec, bool sleep_ok)
4339 {
4340         struct fw_vi_mac_cmd c;
4341
4342         memset(&c, 0, sizeof(c));
4343         c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_MAC_CMD) | F_FW_CMD_REQUEST |
4344                              F_FW_CMD_WRITE | V_FW_VI_ENABLE_CMD_VIID(viid));
4345         c.freemacs_to_len16 = htonl(F_FW_VI_MAC_CMD_HASHVECEN |
4346                                     V_FW_VI_MAC_CMD_HASHUNIEN(ucast) |
4347                                     V_FW_CMD_LEN16(1));
4348         c.u.hash.hashvec = cpu_to_be64(vec);
4349         return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
4350 }
4351
4352 /**
4353  *      t4_enable_vi - enable/disable a virtual interface
4354  *      @adap: the adapter
4355  *      @mbox: mailbox to use for the FW command
4356  *      @viid: the VI id
4357  *      @rx_en: 1=enable Rx, 0=disable Rx
4358  *      @tx_en: 1=enable Tx, 0=disable Tx
4359  *
4360  *      Enables/disables a virtual interface.
4361  */
4362 int t4_enable_vi(struct adapter *adap, unsigned int mbox, unsigned int viid,
4363                  bool rx_en, bool tx_en)
4364 {
4365         struct fw_vi_enable_cmd c;
4366
4367         memset(&c, 0, sizeof(c));
4368         c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_ENABLE_CMD) | F_FW_CMD_REQUEST |
4369                              F_FW_CMD_EXEC | V_FW_VI_ENABLE_CMD_VIID(viid));
4370         c.ien_to_len16 = htonl(V_FW_VI_ENABLE_CMD_IEN(rx_en) |
4371                                V_FW_VI_ENABLE_CMD_EEN(tx_en) | FW_LEN16(c));
4372         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4373 }
4374
4375 /**
4376  *      t4_identify_port - identify a VI's port by blinking its LED
4377  *      @adap: the adapter
4378  *      @mbox: mailbox to use for the FW command
4379  *      @viid: the VI id
4380  *      @nblinks: how many times to blink LED at 2.5 Hz
4381  *
4382  *      Identifies a VI's port by blinking its LED.
4383  */
4384 int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid,
4385                      unsigned int nblinks)
4386 {
4387         struct fw_vi_enable_cmd c;
4388
4389         memset(&c, 0, sizeof(c));
4390         c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_ENABLE_CMD) | F_FW_CMD_REQUEST |
4391                              F_FW_CMD_EXEC | V_FW_VI_ENABLE_CMD_VIID(viid));
4392         c.ien_to_len16 = htonl(F_FW_VI_ENABLE_CMD_LED | FW_LEN16(c));
4393         c.blinkdur = htons(nblinks);
4394         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4395 }
4396
4397 /**
4398  *      t4_iq_start_stop - enable/disable an ingress queue and its FLs
4399  *      @adap: the adapter
4400  *      @mbox: mailbox to use for the FW command
4401  *      @start: %true to enable the queues, %false to disable them
4402  *      @pf: the PF owning the queues
4403  *      @vf: the VF owning the queues
4404  *      @iqid: ingress queue id
4405  *      @fl0id: FL0 queue id or 0xffff if no attached FL0
4406  *      @fl1id: FL1 queue id or 0xffff if no attached FL1
4407  *
4408  *      Starts or stops an ingress queue and its associated FLs, if any.
4409  */
4410 int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start,
4411                      unsigned int pf, unsigned int vf, unsigned int iqid,
4412                      unsigned int fl0id, unsigned int fl1id)
4413 {
4414         struct fw_iq_cmd c;
4415
4416         memset(&c, 0, sizeof(c));
4417         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_IQ_CMD) | F_FW_CMD_REQUEST |
4418                             F_FW_CMD_EXEC | V_FW_IQ_CMD_PFN(pf) |
4419                             V_FW_IQ_CMD_VFN(vf));
4420         c.alloc_to_len16 = htonl(V_FW_IQ_CMD_IQSTART(start) |
4421                                  V_FW_IQ_CMD_IQSTOP(!start) | FW_LEN16(c));
4422         c.iqid = htons(iqid);
4423         c.fl0id = htons(fl0id);
4424         c.fl1id = htons(fl1id);
4425         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4426 }
4427
4428 /**
4429  *      t4_iq_free - free an ingress queue and its FLs
4430  *      @adap: the adapter
4431  *      @mbox: mailbox to use for the FW command
4432  *      @pf: the PF owning the queues
4433  *      @vf: the VF owning the queues
4434  *      @iqtype: the ingress queue type (FW_IQ_TYPE_FL_INT_CAP, etc.)
4435  *      @iqid: ingress queue id
4436  *      @fl0id: FL0 queue id or 0xffff if no attached FL0
4437  *      @fl1id: FL1 queue id or 0xffff if no attached FL1
4438  *
4439  *      Frees an ingress queue and its associated FLs, if any.
4440  */
4441 int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
4442                unsigned int vf, unsigned int iqtype, unsigned int iqid,
4443                unsigned int fl0id, unsigned int fl1id)
4444 {
4445         struct fw_iq_cmd c;
4446
4447         memset(&c, 0, sizeof(c));
4448         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_IQ_CMD) | F_FW_CMD_REQUEST |
4449                             F_FW_CMD_EXEC | V_FW_IQ_CMD_PFN(pf) |
4450                             V_FW_IQ_CMD_VFN(vf));
4451         c.alloc_to_len16 = htonl(F_FW_IQ_CMD_FREE | FW_LEN16(c));
4452         c.type_to_iqandstindex = htonl(V_FW_IQ_CMD_TYPE(iqtype));
4453         c.iqid = htons(iqid);
4454         c.fl0id = htons(fl0id);
4455         c.fl1id = htons(fl1id);
4456         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4457 }
4458
4459 /**
4460  *      t4_eth_eq_free - free an Ethernet egress queue
4461  *      @adap: the adapter
4462  *      @mbox: mailbox to use for the FW command
4463  *      @pf: the PF owning the queue
4464  *      @vf: the VF owning the queue
4465  *      @eqid: egress queue id
4466  *
4467  *      Frees an Ethernet egress queue.
4468  */
4469 int t4_eth_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
4470                    unsigned int vf, unsigned int eqid)
4471 {
4472         struct fw_eq_eth_cmd c;
4473
4474         memset(&c, 0, sizeof(c));
4475         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_EQ_ETH_CMD) | F_FW_CMD_REQUEST |
4476                             F_FW_CMD_EXEC | V_FW_EQ_ETH_CMD_PFN(pf) |
4477                             V_FW_EQ_ETH_CMD_VFN(vf));
4478         c.alloc_to_len16 = htonl(F_FW_EQ_ETH_CMD_FREE | FW_LEN16(c));
4479         c.eqid_pkd = htonl(V_FW_EQ_ETH_CMD_EQID(eqid));
4480         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4481 }
4482
4483 /**
4484  *      t4_ctrl_eq_free - free a control egress queue
4485  *      @adap: the adapter
4486  *      @mbox: mailbox to use for the FW command
4487  *      @pf: the PF owning the queue
4488  *      @vf: the VF owning the queue
4489  *      @eqid: egress queue id
4490  *
4491  *      Frees a control egress queue.
4492  */
4493 int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
4494                     unsigned int vf, unsigned int eqid)
4495 {
4496         struct fw_eq_ctrl_cmd c;
4497
4498         memset(&c, 0, sizeof(c));
4499         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_EQ_CTRL_CMD) | F_FW_CMD_REQUEST |
4500                             F_FW_CMD_EXEC | V_FW_EQ_CTRL_CMD_PFN(pf) |
4501                             V_FW_EQ_CTRL_CMD_VFN(vf));
4502         c.alloc_to_len16 = htonl(F_FW_EQ_CTRL_CMD_FREE | FW_LEN16(c));
4503         c.cmpliqid_eqid = htonl(V_FW_EQ_CTRL_CMD_EQID(eqid));
4504         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4505 }
4506
4507 /**
4508  *      t4_ofld_eq_free - free an offload egress queue
4509  *      @adap: the adapter
4510  *      @mbox: mailbox to use for the FW command
4511  *      @pf: the PF owning the queue
4512  *      @vf: the VF owning the queue
4513  *      @eqid: egress queue id
4514  *
4515  *      Frees a control egress queue.
4516  */
4517 int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
4518                     unsigned int vf, unsigned int eqid)
4519 {
4520         struct fw_eq_ofld_cmd c;
4521
4522         memset(&c, 0, sizeof(c));
4523         c.op_to_vfn = htonl(V_FW_CMD_OP(FW_EQ_OFLD_CMD) | F_FW_CMD_REQUEST |
4524                             F_FW_CMD_EXEC | V_FW_EQ_OFLD_CMD_PFN(pf) |
4525                             V_FW_EQ_OFLD_CMD_VFN(vf));
4526         c.alloc_to_len16 = htonl(F_FW_EQ_OFLD_CMD_FREE | FW_LEN16(c));
4527         c.eqid_pkd = htonl(V_FW_EQ_OFLD_CMD_EQID(eqid));
4528         return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4529 }
4530
4531 /**
4532  *      t4_handle_fw_rpl - process a FW reply message
4533  *      @adap: the adapter
4534  *      @rpl: start of the FW message
4535  *
4536  *      Processes a FW message, such as link state change messages.
4537  */
4538 int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
4539 {
4540         u8 opcode = *(const u8 *)rpl;
4541
4542         if (opcode == FW_PORT_CMD) {    /* link/module state change message */
4543                 int speed = 0, fc = 0, i;
4544                 const struct fw_port_cmd *p = (const void *)rpl;
4545                 int chan = G_FW_PORT_CMD_PORTID(ntohl(p->op_to_portid));
4546                 struct port_info *pi = NULL;
4547                 struct link_config *lc;
4548                 u32 stat = ntohl(p->u.info.lstatus_to_modtype);
4549                 int link_ok = (stat & F_FW_PORT_CMD_LSTATUS) != 0;
4550                 u32 mod = G_FW_PORT_CMD_MODTYPE(stat);
4551
4552                 if (stat & F_FW_PORT_CMD_RXPAUSE)
4553                         fc |= PAUSE_RX;
4554                 if (stat & F_FW_PORT_CMD_TXPAUSE)
4555                         fc |= PAUSE_TX;
4556                 if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_100M))
4557                         speed = SPEED_100;
4558                 else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_1G))
4559                         speed = SPEED_1000;
4560                 else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_10G))
4561                         speed = SPEED_10000;
4562
4563                 for_each_port(adap, i) {
4564                         pi = adap2pinfo(adap, i);
4565                         if (pi->tx_chan == chan)
4566                                 break;
4567                 }
4568                 lc = &pi->link_cfg;
4569
4570                 if (link_ok != lc->link_ok || speed != lc->speed ||
4571                     fc != lc->fc) {                    /* something changed */
4572                         lc->link_ok = link_ok;
4573                         lc->speed = speed;
4574                         lc->fc = fc;
4575                         t4_os_link_changed(adap, i, link_ok);
4576                 }
4577                 if (mod != pi->mod_type) {
4578                         pi->mod_type = mod;
4579                         t4_os_portmod_changed(adap, i);
4580                 }
4581         }
4582         return 0;
4583 }
4584
4585 /**
4586  *      get_pci_mode - determine a card's PCI mode
4587  *      @adapter: the adapter
4588  *      @p: where to store the PCI settings
4589  *
4590  *      Determines a card's PCI mode and associated parameters, such as speed
4591  *      and width.
4592  */
4593 static void __devinit get_pci_mode(struct adapter *adapter,
4594                                    struct pci_params *p)
4595 {
4596         u16 val;
4597         u32 pcie_cap;
4598
4599         pcie_cap = t4_os_find_pci_capability(adapter, PCI_CAP_ID_EXP);
4600         if (pcie_cap) {
4601                 t4_os_pci_read_cfg2(adapter, pcie_cap + PCI_EXP_LNKSTA, &val);
4602                 p->speed = val & PCI_EXP_LNKSTA_CLS;
4603                 p->width = (val & PCI_EXP_LNKSTA_NLW) >> 4;
4604         }
4605 }
4606
4607 /**
4608  *      init_link_config - initialize a link's SW state
4609  *      @lc: structure holding the link state
4610  *      @caps: link capabilities
4611  *
4612  *      Initializes the SW state maintained for each link, including the link's
4613  *      capabilities and default speed/flow-control/autonegotiation settings.
4614  */
4615 static void __devinit init_link_config(struct link_config *lc,
4616                                        unsigned int caps)
4617 {
4618         lc->supported = caps;
4619         lc->requested_speed = 0;
4620         lc->speed = 0;
4621         lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
4622         if (lc->supported & FW_PORT_CAP_ANEG) {
4623                 lc->advertising = lc->supported & ADVERT_MASK;
4624                 lc->autoneg = AUTONEG_ENABLE;
4625                 lc->requested_fc |= PAUSE_AUTONEG;
4626         } else {
4627                 lc->advertising = 0;
4628                 lc->autoneg = AUTONEG_DISABLE;
4629         }
4630 }
4631
4632 static int __devinit wait_dev_ready(struct adapter *adap)
4633 {
4634         u32 whoami;
4635
4636         whoami = t4_read_reg(adap, A_PL_WHOAMI);
4637
4638         if (whoami != 0xffffffff && whoami != X_CIM_PF_NOACCESS)
4639                 return 0;
4640
4641         msleep(500);
4642         whoami = t4_read_reg(adap, A_PL_WHOAMI);
4643         return (whoami != 0xffffffff && whoami != X_CIM_PF_NOACCESS
4644                 ? 0 : -EIO);
4645 }
4646
4647 static int __devinit get_flash_params(struct adapter *adapter)
4648 {
4649         int ret;
4650         u32 info = 0;
4651
4652         ret = sf1_write(adapter, 1, 1, 0, SF_RD_ID);
4653         if (!ret)
4654                 ret = sf1_read(adapter, 3, 0, 1, &info);
4655         t4_write_reg(adapter, A_SF_OP, 0);               /* unlock SF */
4656         if (ret < 0)
4657                 return ret;
4658
4659         if ((info & 0xff) != 0x20)             /* not a Numonix flash */
4660                 return -EINVAL;
4661         info >>= 16;                           /* log2 of size */
4662         if (info >= 0x14 && info < 0x18)
4663                 adapter->params.sf_nsec = 1 << (info - 16);
4664         else if (info == 0x18)
4665                 adapter->params.sf_nsec = 64;
4666         else
4667                 return -EINVAL;
4668         adapter->params.sf_size = 1 << info;
4669         return 0;
4670 }
4671
4672 static void __devinit set_pcie_completion_timeout(struct adapter *adapter,
4673                                                   u8 range)
4674 {
4675         u16 val;
4676         u32 pcie_cap;
4677
4678         pcie_cap = t4_os_find_pci_capability(adapter, PCI_CAP_ID_EXP);
4679         if (pcie_cap) {
4680                 t4_os_pci_read_cfg2(adapter, pcie_cap + PCI_EXP_DEVCTL2, &val);
4681                 val &= 0xfff0;
4682                 val |= range ;
4683                 t4_os_pci_write_cfg2(adapter, pcie_cap + PCI_EXP_DEVCTL2, val);
4684         }
4685 }
4686
4687 /**
4688  *      t4_prep_adapter - prepare SW and HW for operation
4689  *      @adapter: the adapter
4690  *      @reset: if true perform a HW reset
4691  *
4692  *      Initialize adapter SW state for the various HW modules, set initial
4693  *      values for some adapter tunables, take PHYs out of reset, and
4694  *      initialize the MDIO interface.
4695  */
4696 int __devinit t4_prep_adapter(struct adapter *adapter)
4697 {
4698         int ret;
4699
4700         ret = wait_dev_ready(adapter);
4701         if (ret < 0)
4702                 return ret;
4703
4704         get_pci_mode(adapter, &adapter->params.pci);
4705
4706         adapter->params.rev = t4_read_reg(adapter, A_PL_REV);
4707         adapter->params.pci.vpd_cap_addr =
4708                 t4_os_find_pci_capability(adapter, PCI_CAP_ID_VPD);
4709
4710         ret = get_flash_params(adapter);
4711         if (ret < 0)
4712                 return ret;
4713
4714         ret = get_vpd_params(adapter, &adapter->params.vpd);
4715         if (ret < 0)
4716                 return ret;
4717
4718         if (t4_read_reg(adapter, A_SGE_PC0_REQ_BIST_CMD) != 0xffffffff) {
4719                 adapter->params.cim_la_size = 2 * CIMLA_SIZE;
4720         } else {
4721                 adapter->params.cim_la_size = CIMLA_SIZE;
4722         }
4723
4724         init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
4725
4726         /*
4727          * Default port and clock for debugging in case we can't reach FW.
4728          */
4729         adapter->params.nports = 1;
4730         adapter->params.portvec = 1;
4731         adapter->params.vpd.cclk = 50000;
4732
4733         /* Set pci completion timeout value to 4 seconds. */
4734         set_pcie_completion_timeout(adapter, 0xd);
4735         return 0;
4736 }
4737
4738 int __devinit t4_port_init(struct port_info *p, int mbox, int pf, int vf)
4739 {
4740         u8 addr[6];
4741         int ret, i, j;
4742         struct fw_port_cmd c;
4743         unsigned int rss_size;
4744         adapter_t *adap = p->adapter;
4745
4746         memset(&c, 0, sizeof(c));
4747
4748         for (i = 0, j = -1; i <= p->port_id; i++) {
4749                 do {
4750                         j++;
4751                 } while ((adap->params.portvec & (1 << j)) == 0);
4752         }
4753
4754         c.op_to_portid = htonl(V_FW_CMD_OP(FW_PORT_CMD) |
4755                                F_FW_CMD_REQUEST | F_FW_CMD_READ |
4756                                V_FW_PORT_CMD_PORTID(j));
4757         c.action_to_len16 = htonl(
4758                 V_FW_PORT_CMD_ACTION(FW_PORT_ACTION_GET_PORT_INFO) |
4759                 FW_LEN16(c));
4760         ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
4761         if (ret)
4762                 return ret;
4763
4764         ret = t4_alloc_vi(adap, mbox, j, pf, vf, 1, addr, &rss_size);
4765         if (ret < 0)
4766                 return ret;
4767
4768         p->viid = ret;
4769         p->tx_chan = j;
4770         p->lport = j;
4771         p->rss_size = rss_size;
4772         t4_os_set_hw_addr(adap, p->port_id, addr);
4773
4774         ret = ntohl(c.u.info.lstatus_to_modtype);
4775         p->mdio_addr = (ret & F_FW_PORT_CMD_MDIOCAP) ?
4776                 G_FW_PORT_CMD_MDIOADDR(ret) : -1;
4777         p->port_type = G_FW_PORT_CMD_PTYPE(ret);
4778         p->mod_type = G_FW_PORT_CMD_MODTYPE(ret);
4779
4780         init_link_config(&p->link_cfg, ntohs(c.u.info.pcap));
4781
4782         return 0;
4783 }