]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/cxgb/common/cxgb_t3_hw.c
MFV r353143 (phillip):
[FreeBSD/FreeBSD.git] / sys / dev / cxgb / common / cxgb_t3_hw.c
1 /**************************************************************************
2 SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3
4 Copyright (c) 2007-2009, Chelsio Inc.
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10  1. Redistributions of source code must retain the above copyright notice,
11     this list of conditions and the following disclaimer.
12
13  2. Neither the name of the Chelsio Corporation nor the names of its
14     contributors may be used to endorse or promote products derived from
15     this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 POSSIBILITY OF SUCH DAMAGE.
28
29 ***************************************************************************/
30
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33
34
35 #include <cxgb_include.h>
36
37 #undef msleep
38 #define msleep t3_os_sleep
39
40 /**
41  *      t3_wait_op_done_val - wait until an operation is completed
42  *      @adapter: the adapter performing the operation
43  *      @reg: the register to check for completion
44  *      @mask: a single-bit field within @reg that indicates completion
45  *      @polarity: the value of the field when the operation is completed
46  *      @attempts: number of check iterations
47  *      @delay: delay in usecs between iterations
48  *      @valp: where to store the value of the register at completion time
49  *
50  *      Wait until an operation is completed by checking a bit in a register
51  *      up to @attempts times.  If @valp is not NULL the value of the register
52  *      at the time it indicated completion is stored there.  Returns 0 if the
53  *      operation completes and -EAGAIN otherwise.
54  */
55 int t3_wait_op_done_val(adapter_t *adapter, int reg, u32 mask, int polarity,
56                         int attempts, int delay, u32 *valp)
57 {
58         while (1) {
59                 u32 val = t3_read_reg(adapter, reg);
60
61                 if (!!(val & mask) == polarity) {
62                         if (valp)
63                                 *valp = val;
64                         return 0;
65                 }
66                 if (--attempts == 0)
67                         return -EAGAIN;
68                 if (delay)
69                         udelay(delay);
70         }
71 }
72
73 /**
74  *      t3_write_regs - write a bunch of registers
75  *      @adapter: the adapter to program
76  *      @p: an array of register address/register value pairs
77  *      @n: the number of address/value pairs
78  *      @offset: register address offset
79  *
80  *      Takes an array of register address/register value pairs and writes each
81  *      value to the corresponding register.  Register addresses are adjusted
82  *      by the supplied offset.
83  */
84 void t3_write_regs(adapter_t *adapter, const struct addr_val_pair *p, int n,
85                    unsigned int offset)
86 {
87         while (n--) {
88                 t3_write_reg(adapter, p->reg_addr + offset, p->val);
89                 p++;
90         }
91 }
92
93 /**
94  *      t3_set_reg_field - set a register field to a value
95  *      @adapter: the adapter to program
96  *      @addr: the register address
97  *      @mask: specifies the portion of the register to modify
98  *      @val: the new value for the register field
99  *
100  *      Sets a register field specified by the supplied mask to the
101  *      given value.
102  */
103 void t3_set_reg_field(adapter_t *adapter, unsigned int addr, u32 mask, u32 val)
104 {
105         u32 v = t3_read_reg(adapter, addr) & ~mask;
106
107         t3_write_reg(adapter, addr, v | val);
108         (void) t3_read_reg(adapter, addr);      /* flush */
109 }
110
111 /**
112  *      t3_read_indirect - read indirectly addressed registers
113  *      @adap: the adapter
114  *      @addr_reg: register holding the indirect address
115  *      @data_reg: register holding the value of the indirect register
116  *      @vals: where the read register values are stored
117  *      @start_idx: index of first indirect register to read
118  *      @nregs: how many indirect registers to read
119  *
120  *      Reads registers that are accessed indirectly through an address/data
121  *      register pair.
122  */
123 static void t3_read_indirect(adapter_t *adap, unsigned int addr_reg,
124                       unsigned int data_reg, u32 *vals, unsigned int nregs,
125                       unsigned int start_idx)
126 {
127         while (nregs--) {
128                 t3_write_reg(adap, addr_reg, start_idx);
129                 *vals++ = t3_read_reg(adap, data_reg);
130                 start_idx++;
131         }
132 }
133
134 /**
135  *      t3_mc7_bd_read - read from MC7 through backdoor accesses
136  *      @mc7: identifies MC7 to read from
137  *      @start: index of first 64-bit word to read
138  *      @n: number of 64-bit words to read
139  *      @buf: where to store the read result
140  *
141  *      Read n 64-bit words from MC7 starting at word start, using backdoor
142  *      accesses.
143  */
144 int t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n,
145                    u64 *buf)
146 {
147         static int shift[] = { 0, 0, 16, 24 };
148         static int step[]  = { 0, 32, 16, 8 };
149
150         unsigned int size64 = mc7->size / 8;  /* # of 64-bit words */
151         adapter_t *adap = mc7->adapter;
152
153         if (start >= size64 || start + n > size64)
154                 return -EINVAL;
155
156         start *= (8 << mc7->width);
157         while (n--) {
158                 int i;
159                 u64 val64 = 0;
160
161                 for (i = (1 << mc7->width) - 1; i >= 0; --i) {
162                         int attempts = 10;
163                         u32 val;
164
165                         t3_write_reg(adap, mc7->offset + A_MC7_BD_ADDR,
166                                        start);
167                         t3_write_reg(adap, mc7->offset + A_MC7_BD_OP, 0);
168                         val = t3_read_reg(adap, mc7->offset + A_MC7_BD_OP);
169                         while ((val & F_BUSY) && attempts--)
170                                 val = t3_read_reg(adap,
171                                                   mc7->offset + A_MC7_BD_OP);
172                         if (val & F_BUSY)
173                                 return -EIO;
174
175                         val = t3_read_reg(adap, mc7->offset + A_MC7_BD_DATA1);
176                         if (mc7->width == 0) {
177                                 val64 = t3_read_reg(adap,
178                                                 mc7->offset + A_MC7_BD_DATA0);
179                                 val64 |= (u64)val << 32;
180                         } else {
181                                 if (mc7->width > 1)
182                                         val >>= shift[mc7->width];
183                                 val64 |= (u64)val << (step[mc7->width] * i);
184                         }
185                         start += 8;
186                 }
187                 *buf++ = val64;
188         }
189         return 0;
190 }
191
192 /*
193  * Low-level I2C read and write routines.  These simply read and write a
194  * single byte with the option of indicating a "continue" if another operation
195  * is to be chained.  Generally most code will use higher-level routines to
196  * read and write to I2C Slave Devices.
197  */
198 #define I2C_ATTEMPTS 100
199
200 /*
201  * Read an 8-bit value from the I2C bus.  If the "chained" parameter is
202  * non-zero then a STOP bit will not be written after the read command.  On
203  * error (the read timed out, etc.), a negative errno will be returned (e.g.
204  * -EAGAIN, etc.).  On success, the 8-bit value read from the I2C bus is
205  * stored into the buffer *valp and the value of the I2C ACK bit is returned
206  * as a 0/1 value.
207  */
208 int t3_i2c_read8(adapter_t *adapter, int chained, u8 *valp)
209 {
210         int ret;
211         u32 opval;
212         MDIO_LOCK(adapter);
213         t3_write_reg(adapter, A_I2C_OP,
214                      F_I2C_READ | (chained ? F_I2C_CONT : 0));
215         ret = t3_wait_op_done_val(adapter, A_I2C_OP, F_I2C_BUSY, 0,
216                                   I2C_ATTEMPTS, 10, &opval);
217         if (ret >= 0) {
218                 ret = ((opval & F_I2C_ACK) == F_I2C_ACK);
219                 *valp = G_I2C_DATA(t3_read_reg(adapter, A_I2C_DATA));
220         }
221         MDIO_UNLOCK(adapter);
222         return ret;
223 }
224
225 /*
226  * Write an 8-bit value to the I2C bus.  If the "chained" parameter is
227  * non-zero, then a STOP bit will not be written after the write command.  On
228  * error (the write timed out, etc.), a negative errno will be returned (e.g.
229  * -EAGAIN, etc.).  On success, the value of the I2C ACK bit is returned as a
230  * 0/1 value.
231  */
232 int t3_i2c_write8(adapter_t *adapter, int chained, u8 val)
233 {
234         int ret;
235         u32 opval;
236         MDIO_LOCK(adapter);
237         t3_write_reg(adapter, A_I2C_DATA, V_I2C_DATA(val));
238         t3_write_reg(adapter, A_I2C_OP,
239                      F_I2C_WRITE | (chained ? F_I2C_CONT : 0));
240         ret = t3_wait_op_done_val(adapter, A_I2C_OP, F_I2C_BUSY, 0,
241                                   I2C_ATTEMPTS, 10, &opval);
242         if (ret >= 0)
243                 ret = ((opval & F_I2C_ACK) == F_I2C_ACK);
244         MDIO_UNLOCK(adapter);
245         return ret;
246 }
247
248 /*
249  * Initialize MI1.
250  */
251 static void mi1_init(adapter_t *adap, const struct adapter_info *ai)
252 {
253         u32 clkdiv = adap->params.vpd.cclk / (2 * adap->params.vpd.mdc) - 1;
254         u32 val = F_PREEN | V_CLKDIV(clkdiv);
255
256         t3_write_reg(adap, A_MI1_CFG, val);
257 }
258
259 #define MDIO_ATTEMPTS 20
260
261 /*
262  * MI1 read/write operations for clause 22 PHYs.
263  */
264 int t3_mi1_read(adapter_t *adapter, int phy_addr, int mmd_addr,
265                 int reg_addr, unsigned int *valp)
266 {
267         int ret;
268         u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
269
270         if (mmd_addr)
271                 return -EINVAL;
272
273         MDIO_LOCK(adapter);
274         t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), V_ST(1));
275         t3_write_reg(adapter, A_MI1_ADDR, addr);
276         t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(2));
277         ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
278         if (!ret)
279                 *valp = t3_read_reg(adapter, A_MI1_DATA);
280         MDIO_UNLOCK(adapter);
281         return ret;
282 }
283
284 int t3_mi1_write(adapter_t *adapter, int phy_addr, int mmd_addr,
285                  int reg_addr, unsigned int val)
286 {
287         int ret;
288         u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
289
290         if (mmd_addr)
291                 return -EINVAL;
292
293         MDIO_LOCK(adapter);
294         t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), V_ST(1));
295         t3_write_reg(adapter, A_MI1_ADDR, addr);
296         t3_write_reg(adapter, A_MI1_DATA, val);
297         t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
298         ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
299         MDIO_UNLOCK(adapter);
300         return ret;
301 }
302
303 static struct mdio_ops mi1_mdio_ops = {
304         t3_mi1_read,
305         t3_mi1_write
306 };
307
308 /*
309  * MI1 read/write operations for clause 45 PHYs.
310  */
311 static int mi1_ext_read(adapter_t *adapter, int phy_addr, int mmd_addr,
312                         int reg_addr, unsigned int *valp)
313 {
314         int ret;
315         u32 addr = V_REGADDR(mmd_addr) | V_PHYADDR(phy_addr);
316
317         MDIO_LOCK(adapter);
318         t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), 0);
319         t3_write_reg(adapter, A_MI1_ADDR, addr);
320         t3_write_reg(adapter, A_MI1_DATA, reg_addr);
321         t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
322         ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
323         if (!ret) {
324                 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(3));
325                 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
326                                       MDIO_ATTEMPTS, 10);
327                 if (!ret)
328                         *valp = t3_read_reg(adapter, A_MI1_DATA);
329         }
330         MDIO_UNLOCK(adapter);
331         return ret;
332 }
333
334 static int mi1_ext_write(adapter_t *adapter, int phy_addr, int mmd_addr,
335                          int reg_addr, unsigned int val)
336 {
337         int ret;
338         u32 addr = V_REGADDR(mmd_addr) | V_PHYADDR(phy_addr);
339
340         MDIO_LOCK(adapter);
341         t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), 0);
342         t3_write_reg(adapter, A_MI1_ADDR, addr);
343         t3_write_reg(adapter, A_MI1_DATA, reg_addr);
344         t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
345         ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
346         if (!ret) {
347                 t3_write_reg(adapter, A_MI1_DATA, val);
348                 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
349                 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
350                                       MDIO_ATTEMPTS, 10);
351         }
352         MDIO_UNLOCK(adapter);
353         return ret;
354 }
355
356 static struct mdio_ops mi1_mdio_ext_ops = {
357         mi1_ext_read,
358         mi1_ext_write
359 };
360
361 /**
362  *      t3_mdio_change_bits - modify the value of a PHY register
363  *      @phy: the PHY to operate on
364  *      @mmd: the device address
365  *      @reg: the register address
366  *      @clear: what part of the register value to mask off
367  *      @set: what part of the register value to set
368  *
369  *      Changes the value of a PHY register by applying a mask to its current
370  *      value and ORing the result with a new value.
371  */
372 int t3_mdio_change_bits(struct cphy *phy, int mmd, int reg, unsigned int clear,
373                         unsigned int set)
374 {
375         int ret;
376         unsigned int val;
377
378         ret = mdio_read(phy, mmd, reg, &val);
379         if (!ret) {
380                 val &= ~clear;
381                 ret = mdio_write(phy, mmd, reg, val | set);
382         }
383         return ret;
384 }
385
386 /**
387  *      t3_phy_reset - reset a PHY block
388  *      @phy: the PHY to operate on
389  *      @mmd: the device address of the PHY block to reset
390  *      @wait: how long to wait for the reset to complete in 1ms increments
391  *
392  *      Resets a PHY block and optionally waits for the reset to complete.
393  *      @mmd should be 0 for 10/100/1000 PHYs and the device address to reset
394  *      for 10G PHYs.
395  */
396 int t3_phy_reset(struct cphy *phy, int mmd, int wait)
397 {
398         int err;
399         unsigned int ctl;
400
401         err = t3_mdio_change_bits(phy, mmd, MII_BMCR, BMCR_PDOWN, BMCR_RESET);
402         if (err || !wait)
403                 return err;
404
405         do {
406                 err = mdio_read(phy, mmd, MII_BMCR, &ctl);
407                 if (err)
408                         return err;
409                 ctl &= BMCR_RESET;
410                 if (ctl)
411                         msleep(1);
412         } while (ctl && --wait);
413
414         return ctl ? -1 : 0;
415 }
416
417 /**
418  *      t3_phy_advertise - set the PHY advertisement registers for autoneg
419  *      @phy: the PHY to operate on
420  *      @advert: bitmap of capabilities the PHY should advertise
421  *
422  *      Sets a 10/100/1000 PHY's advertisement registers to advertise the
423  *      requested capabilities.
424  */
425 int t3_phy_advertise(struct cphy *phy, unsigned int advert)
426 {
427         int err;
428         unsigned int val = 0;
429
430         err = mdio_read(phy, 0, MII_CTRL1000, &val);
431         if (err)
432                 return err;
433
434         val &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
435         if (advert & ADVERTISED_1000baseT_Half)
436                 val |= ADVERTISE_1000HALF;
437         if (advert & ADVERTISED_1000baseT_Full)
438                 val |= ADVERTISE_1000FULL;
439
440         err = mdio_write(phy, 0, MII_CTRL1000, val);
441         if (err)
442                 return err;
443
444         val = 1;
445         if (advert & ADVERTISED_10baseT_Half)
446                 val |= ADVERTISE_10HALF;
447         if (advert & ADVERTISED_10baseT_Full)
448                 val |= ADVERTISE_10FULL;
449         if (advert & ADVERTISED_100baseT_Half)
450                 val |= ADVERTISE_100HALF;
451         if (advert & ADVERTISED_100baseT_Full)
452                 val |= ADVERTISE_100FULL;
453         if (advert & ADVERTISED_Pause)
454                 val |= ADVERTISE_PAUSE_CAP;
455         if (advert & ADVERTISED_Asym_Pause)
456                 val |= ADVERTISE_PAUSE_ASYM;
457         return mdio_write(phy, 0, MII_ADVERTISE, val);
458 }
459
460 /**
461  *      t3_phy_advertise_fiber - set fiber PHY advertisement register
462  *      @phy: the PHY to operate on
463  *      @advert: bitmap of capabilities the PHY should advertise
464  *
465  *      Sets a fiber PHY's advertisement register to advertise the
466  *      requested capabilities.
467  */
468 int t3_phy_advertise_fiber(struct cphy *phy, unsigned int advert)
469 {
470         unsigned int val = 0;
471
472         if (advert & ADVERTISED_1000baseT_Half)
473                 val |= ADVERTISE_1000XHALF;
474         if (advert & ADVERTISED_1000baseT_Full)
475                 val |= ADVERTISE_1000XFULL;
476         if (advert & ADVERTISED_Pause)
477                 val |= ADVERTISE_1000XPAUSE;
478         if (advert & ADVERTISED_Asym_Pause)
479                 val |= ADVERTISE_1000XPSE_ASYM;
480         return mdio_write(phy, 0, MII_ADVERTISE, val);
481 }
482
483 /**
484  *      t3_set_phy_speed_duplex - force PHY speed and duplex
485  *      @phy: the PHY to operate on
486  *      @speed: requested PHY speed
487  *      @duplex: requested PHY duplex
488  *
489  *      Force a 10/100/1000 PHY's speed and duplex.  This also disables
490  *      auto-negotiation except for GigE, where auto-negotiation is mandatory.
491  */
492 int t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex)
493 {
494         int err;
495         unsigned int ctl;
496
497         err = mdio_read(phy, 0, MII_BMCR, &ctl);
498         if (err)
499                 return err;
500
501         if (speed >= 0) {
502                 ctl &= ~(BMCR_SPEED100 | BMCR_SPEED1000 | BMCR_ANENABLE);
503                 if (speed == SPEED_100)
504                         ctl |= BMCR_SPEED100;
505                 else if (speed == SPEED_1000)
506                         ctl |= BMCR_SPEED1000;
507         }
508         if (duplex >= 0) {
509                 ctl &= ~(BMCR_FULLDPLX | BMCR_ANENABLE);
510                 if (duplex == DUPLEX_FULL)
511                         ctl |= BMCR_FULLDPLX;
512         }
513         if (ctl & BMCR_SPEED1000)  /* auto-negotiation required for GigE */
514                 ctl |= BMCR_ANENABLE;
515         return mdio_write(phy, 0, MII_BMCR, ctl);
516 }
517
518 int t3_phy_lasi_intr_enable(struct cphy *phy)
519 {
520         return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 1);
521 }
522
523 int t3_phy_lasi_intr_disable(struct cphy *phy)
524 {
525         return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 0);
526 }
527
528 int t3_phy_lasi_intr_clear(struct cphy *phy)
529 {
530         u32 val;
531
532         return mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_STAT, &val);
533 }
534
535 int t3_phy_lasi_intr_handler(struct cphy *phy)
536 {
537         unsigned int status;
538         int err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_STAT, &status);
539
540         if (err)
541                 return err;
542         return (status & 1) ?  cphy_cause_link_change : 0;
543 }
544
545 static struct adapter_info t3_adap_info[] = {
546         { 1, 1, 0,
547           F_GPIO2_OEN | F_GPIO4_OEN |
548           F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, { S_GPIO3, S_GPIO5 }, 0,
549           &mi1_mdio_ops, "Chelsio PE9000" },
550         { 1, 1, 0,
551           F_GPIO2_OEN | F_GPIO4_OEN |
552           F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, { S_GPIO3, S_GPIO5 }, 0,
553           &mi1_mdio_ops, "Chelsio T302" },
554         { 1, 0, 0,
555           F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN |
556           F_GPIO11_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
557           { 0 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
558           &mi1_mdio_ext_ops, "Chelsio T310" },
559         { 1, 1, 0,
560           F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN |
561           F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL |
562           F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
563           { S_GPIO9, S_GPIO3 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
564           &mi1_mdio_ext_ops, "Chelsio T320" },
565         { 4, 0, 0,
566           F_GPIO5_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO5_OUT_VAL |
567           F_GPIO6_OUT_VAL | F_GPIO7_OUT_VAL,
568           { S_GPIO1, S_GPIO2, S_GPIO3, S_GPIO4 }, SUPPORTED_AUI,
569           &mi1_mdio_ops, "Chelsio T304" },
570         { 0 },
571         { 1, 0, 0,
572           F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO6_OEN | F_GPIO7_OEN |
573           F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
574           { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
575           &mi1_mdio_ext_ops, "Chelsio T310" },
576         { 1, 0, 0,
577           F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | 
578           F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL,
579           { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
580           &mi1_mdio_ext_ops, "Chelsio N320E-G2" },
581 };
582
583 /*
584  * Return the adapter_info structure with a given index.  Out-of-range indices
585  * return NULL.
586  */
587 const struct adapter_info *t3_get_adapter_info(unsigned int id)
588 {
589         return id < ARRAY_SIZE(t3_adap_info) ? &t3_adap_info[id] : NULL;
590 }
591
592 struct port_type_info {
593         int (*phy_prep)(pinfo_t *pinfo, int phy_addr,
594                         const struct mdio_ops *ops);
595 };
596
597 static struct port_type_info port_types[] = {
598         { NULL },
599         { t3_ael1002_phy_prep },
600         { t3_vsc8211_phy_prep },
601         { t3_mv88e1xxx_phy_prep },
602         { t3_xaui_direct_phy_prep },
603         { t3_ael2005_phy_prep },
604         { t3_qt2045_phy_prep },
605         { t3_ael1006_phy_prep },
606         { t3_tn1010_phy_prep },
607         { t3_aq100x_phy_prep },
608         { t3_ael2020_phy_prep },
609 };
610
611 #define VPD_ENTRY(name, len) \
612         u8 name##_kword[2]; u8 name##_len; u8 name##_data[len]
613
614 /*
615  * Partial EEPROM Vital Product Data structure.  Includes only the ID and
616  * VPD-R sections.
617  */
618 struct t3_vpd {
619         u8  id_tag;
620         u8  id_len[2];
621         u8  id_data[16];
622         u8  vpdr_tag;
623         u8  vpdr_len[2];
624         VPD_ENTRY(pn, 16);                     /* part number */
625         VPD_ENTRY(ec, ECNUM_LEN);              /* EC level */
626         VPD_ENTRY(sn, SERNUM_LEN);             /* serial number */
627         VPD_ENTRY(na, 12);                     /* MAC address base */
628         VPD_ENTRY(cclk, 6);                    /* core clock */
629         VPD_ENTRY(mclk, 6);                    /* mem clock */
630         VPD_ENTRY(uclk, 6);                    /* uP clk */
631         VPD_ENTRY(mdc, 6);                     /* MDIO clk */
632         VPD_ENTRY(mt, 2);                      /* mem timing */
633         VPD_ENTRY(xaui0cfg, 6);                /* XAUI0 config */
634         VPD_ENTRY(xaui1cfg, 6);                /* XAUI1 config */
635         VPD_ENTRY(port0, 2);                   /* PHY0 complex */
636         VPD_ENTRY(port1, 2);                   /* PHY1 complex */
637         VPD_ENTRY(port2, 2);                   /* PHY2 complex */
638         VPD_ENTRY(port3, 2);                   /* PHY3 complex */
639         VPD_ENTRY(rv, 1);                      /* csum */
640         u32 pad;                  /* for multiple-of-4 sizing and alignment */
641 };
642
643 #define EEPROM_MAX_POLL   40
644 #define EEPROM_STAT_ADDR  0x4000
645 #define VPD_BASE          0xc00
646
647 /**
648  *      t3_seeprom_read - read a VPD EEPROM location
649  *      @adapter: adapter to read
650  *      @addr: EEPROM address
651  *      @data: where to store the read data
652  *
653  *      Read a 32-bit word from a location in VPD EEPROM using the card's PCI
654  *      VPD ROM capability.  A zero is written to the flag bit when the
655  *      address is written to the control register.  The hardware device will
656  *      set the flag to 1 when 4 bytes have been read into the data register.
657  */
658 int t3_seeprom_read(adapter_t *adapter, u32 addr, u32 *data)
659 {
660         u16 val;
661         int attempts = EEPROM_MAX_POLL;
662         unsigned int base = adapter->params.pci.vpd_cap_addr;
663
664         if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3))
665                 return -EINVAL;
666
667         t3_os_pci_write_config_2(adapter, base + PCI_VPD_ADDR, (u16)addr);
668         do {
669                 udelay(10);
670                 t3_os_pci_read_config_2(adapter, base + PCI_VPD_ADDR, &val);
671         } while (!(val & PCI_VPD_ADDR_F) && --attempts);
672
673         if (!(val & PCI_VPD_ADDR_F)) {
674                 CH_ERR(adapter, "reading EEPROM address 0x%x failed\n", addr);
675                 return -EIO;
676         }
677         t3_os_pci_read_config_4(adapter, base + PCI_VPD_DATA, data);
678         *data = le32_to_cpu(*data);
679         return 0;
680 }
681
682 /**
683  *      t3_seeprom_write - write a VPD EEPROM location
684  *      @adapter: adapter to write
685  *      @addr: EEPROM address
686  *      @data: value to write
687  *
688  *      Write a 32-bit word to a location in VPD EEPROM using the card's PCI
689  *      VPD ROM capability.
690  */
691 int t3_seeprom_write(adapter_t *adapter, u32 addr, u32 data)
692 {
693         u16 val;
694         int attempts = EEPROM_MAX_POLL;
695         unsigned int base = adapter->params.pci.vpd_cap_addr;
696
697         if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3))
698                 return -EINVAL;
699
700         t3_os_pci_write_config_4(adapter, base + PCI_VPD_DATA,
701                                  cpu_to_le32(data));
702         t3_os_pci_write_config_2(adapter, base + PCI_VPD_ADDR,
703                                  (u16)addr | PCI_VPD_ADDR_F);
704         do {
705                 msleep(1);
706                 t3_os_pci_read_config_2(adapter, base + PCI_VPD_ADDR, &val);
707         } while ((val & PCI_VPD_ADDR_F) && --attempts);
708
709         if (val & PCI_VPD_ADDR_F) {
710                 CH_ERR(adapter, "write to EEPROM address 0x%x failed\n", addr);
711                 return -EIO;
712         }
713         return 0;
714 }
715
716 /**
717  *      t3_seeprom_wp - enable/disable EEPROM write protection
718  *      @adapter: the adapter
719  *      @enable: 1 to enable write protection, 0 to disable it
720  *
721  *      Enables or disables write protection on the serial EEPROM.
722  */
723 int t3_seeprom_wp(adapter_t *adapter, int enable)
724 {
725         return t3_seeprom_write(adapter, EEPROM_STAT_ADDR, enable ? 0xc : 0);
726 }
727
728 /*
729  * Convert a character holding a hex digit to a number.
730  */
731 static unsigned int hex2int(unsigned char c)
732 {
733         return isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
734 }
735
736 /**
737  *      get_desc_len - get the length of a vpd descriptor.
738  *      @adapter: the adapter
739  *      @offset: first byte offset of the vpd descriptor
740  *
741  *      Retrieves the length of the small/large resource
742  *      data type starting at offset.
743  */
744 static int get_desc_len(adapter_t *adapter, u32 offset)
745 {
746         u32 read_offset, tmp, shift, len = 0;
747         u8 tag, buf[8];
748         int ret;
749
750         read_offset = offset & 0xfffffffc;
751         shift = offset & 0x03;
752
753         ret = t3_seeprom_read(adapter, read_offset, &tmp);
754         if (ret < 0)
755                 return ret;
756
757         *((u32 *)buf) = cpu_to_le32(tmp);
758
759         tag = buf[shift];
760         if (tag & 0x80) {
761                 ret = t3_seeprom_read(adapter, read_offset + 4, &tmp);
762                 if (ret < 0)
763                         return ret;
764
765                 *((u32 *)(&buf[4])) = cpu_to_le32(tmp);
766                 len = (buf[shift + 1] & 0xff) +
767                       ((buf[shift+2] << 8) & 0xff00) + 3;
768         } else
769                 len = (tag & 0x07) + 1;
770
771         return len;
772 }
773
774 /**
775  *      is_end_tag - Check if a vpd tag is the end tag.
776  *      @adapter: the adapter
777  *      @offset: first byte offset of the tag
778  *
779  *      Checks if the tag located at offset is the end tag.
780  */
781 static int is_end_tag(adapter_t * adapter, u32 offset)
782 {
783         u32 read_offset, shift, ret, tmp;
784         u8 buf[4];
785
786         read_offset = offset & 0xfffffffc;
787         shift = offset & 0x03;
788
789         ret = t3_seeprom_read(adapter, read_offset, &tmp);
790         if (ret)
791                 return ret;
792         *((u32 *)buf) = cpu_to_le32(tmp);
793
794         if (buf[shift] == 0x78)
795                 return 1;
796         else
797                 return 0;
798 }
799
800 /**
801  *      t3_get_vpd_len - computes the length of a vpd structure
802  *      @adapter: the adapter
803  *      @vpd: contains the offset of first byte of vpd
804  *
805  *      Computes the lentgh of the vpd structure starting at vpd->offset.
806  */
807
808 int t3_get_vpd_len(adapter_t * adapter, struct generic_vpd *vpd)
809 {
810         u32 len=0, offset;
811         int inc, ret;
812
813         offset = vpd->offset;
814
815         while (offset < (vpd->offset + MAX_VPD_BYTES)) {
816                 ret = is_end_tag(adapter, offset);
817                 if (ret < 0)
818                         return ret;
819                 else if (ret == 1)
820                         break;
821
822                 inc = get_desc_len(adapter, offset);
823                 if (inc < 0)
824                         return inc;
825                 len += inc;
826                 offset += inc;
827         }
828         return (len + 1);
829 }
830
831 /**
832  *      t3_read_vpd - reads the stream of bytes containing a vpd structure
833  *      @adapter: the adapter
834  *      @vpd: contains a buffer that would hold the stream of bytes
835  *
836  *      Reads the vpd structure starting at vpd->offset into vpd->data,
837  *      the length of the byte stream to read is vpd->len.
838  */
839
840 int t3_read_vpd(adapter_t *adapter, struct generic_vpd *vpd)
841 {
842         u32 i, ret;
843
844         for (i = 0; i < vpd->len; i += 4) {
845                 ret = t3_seeprom_read(adapter, vpd->offset + i,
846                                       (u32 *) &(vpd->data[i]));
847                 if (ret)
848                         return ret;
849         }
850
851         return 0;
852 }
853
854
855 /**
856  *      get_vpd_params - read VPD parameters from VPD EEPROM
857  *      @adapter: adapter to read
858  *      @p: where to store the parameters
859  *
860  *      Reads card parameters stored in VPD EEPROM.
861  */
862 static int get_vpd_params(adapter_t *adapter, struct vpd_params *p)
863 {
864         int i, addr, ret;
865         struct t3_vpd vpd;
866
867         /*
868          * Card information is normally at VPD_BASE but some early cards had
869          * it at 0.
870          */
871         ret = t3_seeprom_read(adapter, VPD_BASE, (u32 *)&vpd);
872         if (ret)
873                 return ret;
874         addr = vpd.id_tag == 0x82 ? VPD_BASE : 0;
875
876         for (i = 0; i < sizeof(vpd); i += 4) {
877                 ret = t3_seeprom_read(adapter, addr + i,
878                                       (u32 *)((u8 *)&vpd + i));
879                 if (ret)
880                         return ret;
881         }
882
883         p->cclk = simple_strtoul(vpd.cclk_data, NULL, 10);
884         p->mclk = simple_strtoul(vpd.mclk_data, NULL, 10);
885         p->uclk = simple_strtoul(vpd.uclk_data, NULL, 10);
886         p->mdc = simple_strtoul(vpd.mdc_data, NULL, 10);
887         p->mem_timing = simple_strtoul(vpd.mt_data, NULL, 10);
888         memcpy(p->sn, vpd.sn_data, SERNUM_LEN);
889         memcpy(p->ec, vpd.ec_data, ECNUM_LEN);
890
891         /* Old eeproms didn't have port information */
892         if (adapter->params.rev == 0 && !vpd.port0_data[0]) {
893                 p->port_type[0] = uses_xaui(adapter) ? 1 : 2;
894                 p->port_type[1] = uses_xaui(adapter) ? 6 : 2;
895         } else {
896                 p->port_type[0] = (u8)hex2int(vpd.port0_data[0]);
897                 p->port_type[1] = (u8)hex2int(vpd.port1_data[0]);
898                 p->port_type[2] = (u8)hex2int(vpd.port2_data[0]);
899                 p->port_type[3] = (u8)hex2int(vpd.port3_data[0]);
900                 p->xauicfg[0] = simple_strtoul(vpd.xaui0cfg_data, NULL, 16);
901                 p->xauicfg[1] = simple_strtoul(vpd.xaui1cfg_data, NULL, 16);
902         }
903
904         for (i = 0; i < 6; i++)
905                 p->eth_base[i] = hex2int(vpd.na_data[2 * i]) * 16 +
906                                  hex2int(vpd.na_data[2 * i + 1]);
907         return 0;
908 }
909
910 /* BIOS boot header */
911 typedef struct boot_header_s {
912         u8      signature[2];   /* signature */
913         u8      length;         /* image length (include header) */
914         u8      offset[4];      /* initialization vector */
915         u8      reserved[19];   /* reserved */
916         u8      exheader[2];    /* offset to expansion header */
917 } boot_header_t;
918
919 /* serial flash and firmware constants */
920 enum {
921         SF_ATTEMPTS = 5,           /* max retries for SF1 operations */
922         SF_SEC_SIZE = 64 * 1024,   /* serial flash sector size */
923         SF_SIZE = SF_SEC_SIZE * 8, /* serial flash size */
924
925         /* flash command opcodes */
926         SF_PROG_PAGE    = 2,       /* program page */
927         SF_WR_DISABLE   = 4,       /* disable writes */
928         SF_RD_STATUS    = 5,       /* read status register */
929         SF_WR_ENABLE    = 6,       /* enable writes */
930         SF_RD_DATA_FAST = 0xb,     /* read flash */
931         SF_ERASE_SECTOR = 0xd8,    /* erase sector */
932
933         FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */
934         FW_VERS_ADDR = 0x7fffc,    /* flash address holding FW version */
935         FW_VERS_ADDR_PRE8 = 0x77ffc,/* flash address holding FW version pre8 */
936         FW_MIN_SIZE = 8,           /* at least version and csum */
937         FW_MAX_SIZE = FW_VERS_ADDR - FW_FLASH_BOOT_ADDR,
938         FW_MAX_SIZE_PRE8 = FW_VERS_ADDR_PRE8 - FW_FLASH_BOOT_ADDR,
939
940         BOOT_FLASH_BOOT_ADDR = 0x0,/* start address of boot image in flash */
941         BOOT_SIGNATURE = 0xaa55,   /* signature of BIOS boot ROM */
942         BOOT_SIZE_INC = 512,       /* image size measured in 512B chunks */
943         BOOT_MIN_SIZE = sizeof(boot_header_t), /* at least basic header */
944         BOOT_MAX_SIZE = 1024*BOOT_SIZE_INC /* 1 byte * length increment  */
945 };
946
947 /**
948  *      sf1_read - read data from the serial flash
949  *      @adapter: the adapter
950  *      @byte_cnt: number of bytes to read
951  *      @cont: whether another operation will be chained
952  *      @valp: where to store the read data
953  *
954  *      Reads up to 4 bytes of data from the serial flash.  The location of
955  *      the read needs to be specified prior to calling this by issuing the
956  *      appropriate commands to the serial flash.
957  */
958 static int sf1_read(adapter_t *adapter, unsigned int byte_cnt, int cont,
959                     u32 *valp)
960 {
961         int ret;
962
963         if (!byte_cnt || byte_cnt > 4)
964                 return -EINVAL;
965         if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
966                 return -EBUSY;
967         t3_write_reg(adapter, A_SF_OP, V_CONT(cont) | V_BYTECNT(byte_cnt - 1));
968         ret = t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
969         if (!ret)
970                 *valp = t3_read_reg(adapter, A_SF_DATA);
971         return ret;
972 }
973
974 /**
975  *      sf1_write - write data to the serial flash
976  *      @adapter: the adapter
977  *      @byte_cnt: number of bytes to write
978  *      @cont: whether another operation will be chained
979  *      @val: value to write
980  *
981  *      Writes up to 4 bytes of data to the serial flash.  The location of
982  *      the write needs to be specified prior to calling this by issuing the
983  *      appropriate commands to the serial flash.
984  */
985 static int sf1_write(adapter_t *adapter, unsigned int byte_cnt, int cont,
986                      u32 val)
987 {
988         if (!byte_cnt || byte_cnt > 4)
989                 return -EINVAL;
990         if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
991                 return -EBUSY;
992         t3_write_reg(adapter, A_SF_DATA, val);
993         t3_write_reg(adapter, A_SF_OP,
994                      V_CONT(cont) | V_BYTECNT(byte_cnt - 1) | V_OP(1));
995         return t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
996 }
997
998 /**
999  *      flash_wait_op - wait for a flash operation to complete
1000  *      @adapter: the adapter
1001  *      @attempts: max number of polls of the status register
1002  *      @delay: delay between polls in ms
1003  *
1004  *      Wait for a flash operation to complete by polling the status register.
1005  */
1006 static int flash_wait_op(adapter_t *adapter, int attempts, int delay)
1007 {
1008         int ret;
1009         u32 status;
1010
1011         while (1) {
1012                 if ((ret = sf1_write(adapter, 1, 1, SF_RD_STATUS)) != 0 ||
1013                     (ret = sf1_read(adapter, 1, 0, &status)) != 0)
1014                         return ret;
1015                 if (!(status & 1))
1016                         return 0;
1017                 if (--attempts == 0)
1018                         return -EAGAIN;
1019                 if (delay)
1020                         msleep(delay);
1021         }
1022 }
1023
1024 /**
1025  *      t3_read_flash - read words from serial flash
1026  *      @adapter: the adapter
1027  *      @addr: the start address for the read
1028  *      @nwords: how many 32-bit words to read
1029  *      @data: where to store the read data
1030  *      @byte_oriented: whether to store data as bytes or as words
1031  *
1032  *      Read the specified number of 32-bit words from the serial flash.
1033  *      If @byte_oriented is set the read data is stored as a byte array
1034  *      (i.e., big-endian), otherwise as 32-bit words in the platform's
1035  *      natural endianness.
1036  */
1037 int t3_read_flash(adapter_t *adapter, unsigned int addr, unsigned int nwords,
1038                   u32 *data, int byte_oriented)
1039 {
1040         int ret;
1041
1042         if (addr + nwords * sizeof(u32) > SF_SIZE || (addr & 3))
1043                 return -EINVAL;
1044
1045         addr = swab32(addr) | SF_RD_DATA_FAST;
1046
1047         if ((ret = sf1_write(adapter, 4, 1, addr)) != 0 ||
1048             (ret = sf1_read(adapter, 1, 1, data)) != 0)
1049                 return ret;
1050
1051         for ( ; nwords; nwords--, data++) {
1052                 ret = sf1_read(adapter, 4, nwords > 1, data);
1053                 if (ret)
1054                         return ret;
1055                 if (byte_oriented)
1056                         *data = htonl(*data);
1057         }
1058         return 0;
1059 }
1060
1061 /**
1062  *      t3_write_flash - write up to a page of data to the serial flash
1063  *      @adapter: the adapter
1064  *      @addr: the start address to write
1065  *      @n: length of data to write
1066  *      @data: the data to write
1067  *      @byte_oriented: whether to store data as bytes or as words
1068  *
1069  *      Writes up to a page of data (256 bytes) to the serial flash starting
1070  *      at the given address.
1071  *      If @byte_oriented is set the write data is stored as a 32-bit
1072  *      big-endian array, otherwise in the processor's native endianness.
1073  *
1074  */
1075 static int t3_write_flash(adapter_t *adapter, unsigned int addr,
1076                           unsigned int n, const u8 *data,
1077                           int byte_oriented)
1078 {
1079         int ret;
1080         u32 buf[64];
1081         unsigned int c, left, val, offset = addr & 0xff;
1082
1083         if (addr + n > SF_SIZE || offset + n > 256)
1084                 return -EINVAL;
1085
1086         val = swab32(addr) | SF_PROG_PAGE;
1087
1088         if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
1089             (ret = sf1_write(adapter, 4, 1, val)) != 0)
1090                 return ret;
1091
1092         for (left = n; left; left -= c) {
1093                 c = min(left, 4U);
1094                 val = *(const u32*)data;
1095                 data += c;
1096                 if (byte_oriented)
1097                         val = htonl(val);
1098
1099                 ret = sf1_write(adapter, c, c != left, val);
1100                 if (ret)
1101                         return ret;
1102         }
1103         if ((ret = flash_wait_op(adapter, 5, 1)) != 0)
1104                 return ret;
1105
1106         /* Read the page to verify the write succeeded */
1107         ret = t3_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf,
1108                             byte_oriented);
1109         if (ret)
1110                 return ret;
1111
1112         if (memcmp(data - n, (u8 *)buf + offset, n))
1113                 return -EIO;
1114         return 0;
1115 }
1116
1117 /**
1118  *      t3_get_tp_version - read the tp sram version
1119  *      @adapter: the adapter
1120  *      @vers: where to place the version
1121  *
1122  *      Reads the protocol sram version from sram.
1123  */
1124 int t3_get_tp_version(adapter_t *adapter, u32 *vers)
1125 {
1126         int ret;
1127
1128         /* Get version loaded in SRAM */
1129         t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0);
1130         ret = t3_wait_op_done(adapter, A_TP_EMBED_OP_FIELD0,
1131                               1, 1, 5, 1);
1132         if (ret)
1133                 return ret;
1134
1135         *vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1);
1136
1137         return 0;
1138 }
1139
1140 /**
1141  *      t3_check_tpsram_version - read the tp sram version
1142  *      @adapter: the adapter
1143  *
1144  */
1145 int t3_check_tpsram_version(adapter_t *adapter)
1146 {
1147         int ret;
1148         u32 vers;
1149         unsigned int major, minor;
1150
1151         if (adapter->params.rev == T3_REV_A)
1152                 return 0;
1153
1154
1155         ret = t3_get_tp_version(adapter, &vers);
1156         if (ret)
1157                 return ret;
1158
1159         vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1);
1160
1161         major = G_TP_VERSION_MAJOR(vers);
1162         minor = G_TP_VERSION_MINOR(vers);
1163
1164         if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR)
1165                 return 0;
1166         else {
1167                 CH_ERR(adapter, "found wrong TP version (%u.%u), "
1168                        "driver compiled for version %d.%d\n", major, minor,
1169                        TP_VERSION_MAJOR, TP_VERSION_MINOR);
1170         }
1171         return -EINVAL;
1172 }
1173
1174 /**
1175  *      t3_check_tpsram - check if provided protocol SRAM
1176  *                        is compatible with this driver
1177  *      @adapter: the adapter
1178  *      @tp_sram: the firmware image to write
1179  *      @size: image size
1180  *
1181  *      Checks if an adapter's tp sram is compatible with the driver.
1182  *      Returns 0 if the versions are compatible, a negative error otherwise.
1183  */
1184 int t3_check_tpsram(adapter_t *adapter, const u8 *tp_sram, unsigned int size)
1185 {
1186         u32 csum;
1187         unsigned int i;
1188         const u32 *p = (const u32 *)tp_sram;
1189
1190         /* Verify checksum */
1191         for (csum = 0, i = 0; i < size / sizeof(csum); i++)
1192                 csum += ntohl(p[i]);
1193         if (csum != 0xffffffff) {
1194                 CH_ERR(adapter, "corrupted protocol SRAM image, checksum %u\n",
1195                        csum);
1196                 return -EINVAL;
1197         }
1198
1199         return 0;
1200 }
1201
1202 enum fw_version_type {
1203         FW_VERSION_N3,
1204         FW_VERSION_T3
1205 };
1206
1207 /**
1208  *      t3_get_fw_version - read the firmware version
1209  *      @adapter: the adapter
1210  *      @vers: where to place the version
1211  *
1212  *      Reads the FW version from flash. Note that we had to move the version
1213  *      due to FW size. If we don't find a valid FW version in the new location
1214  *      we fall back and read the old location.
1215  */
1216 int t3_get_fw_version(adapter_t *adapter, u32 *vers)
1217 {
1218         int ret = t3_read_flash(adapter, FW_VERS_ADDR, 1, vers, 0);
1219         if (!ret && *vers != 0xffffffff)
1220                 return 0;
1221         else
1222                 return t3_read_flash(adapter, FW_VERS_ADDR_PRE8, 1, vers, 0);
1223 }
1224
1225 /**
1226  *      t3_check_fw_version - check if the FW is compatible with this driver
1227  *      @adapter: the adapter
1228  *
1229  *      Checks if an adapter's FW is compatible with the driver.  Returns 0
1230  *      if the versions are compatible, a negative error otherwise.
1231  */
1232 int t3_check_fw_version(adapter_t *adapter)
1233 {
1234         int ret;
1235         u32 vers;
1236         unsigned int type, major, minor;
1237
1238         ret = t3_get_fw_version(adapter, &vers);
1239         if (ret)
1240                 return ret;
1241
1242         type = G_FW_VERSION_TYPE(vers);
1243         major = G_FW_VERSION_MAJOR(vers);
1244         minor = G_FW_VERSION_MINOR(vers);
1245
1246         if (type == FW_VERSION_T3 && major == FW_VERSION_MAJOR &&
1247             minor == FW_VERSION_MINOR)
1248                 return 0;
1249
1250         else if (major != FW_VERSION_MAJOR || minor < FW_VERSION_MINOR)
1251                 CH_WARN(adapter, "found old FW minor version(%u.%u), "
1252                         "driver compiled for version %u.%u\n", major, minor,
1253                         FW_VERSION_MAJOR, FW_VERSION_MINOR);
1254         else {
1255                 CH_WARN(adapter, "found newer FW version(%u.%u), "
1256                         "driver compiled for version %u.%u\n", major, minor,
1257                         FW_VERSION_MAJOR, FW_VERSION_MINOR);
1258                         return 0;
1259         }
1260         return -EINVAL;
1261 }
1262
1263 /**
1264  *      t3_flash_erase_sectors - erase a range of flash sectors
1265  *      @adapter: the adapter
1266  *      @start: the first sector to erase
1267  *      @end: the last sector to erase
1268  *
1269  *      Erases the sectors in the given range.
1270  */
1271 static int t3_flash_erase_sectors(adapter_t *adapter, int start, int end)
1272 {
1273         while (start <= end) {
1274                 int ret;
1275
1276                 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
1277                     (ret = sf1_write(adapter, 4, 0,
1278                                      SF_ERASE_SECTOR | (start << 8))) != 0 ||
1279                     (ret = flash_wait_op(adapter, 5, 500)) != 0)
1280                         return ret;
1281                 start++;
1282         }
1283         return 0;
1284 }
1285
1286 /*
1287  *      t3_load_fw - download firmware
1288  *      @adapter: the adapter
1289  *      @fw_data: the firmware image to write
1290  *      @size: image size
1291  *
1292  *      Write the supplied firmware image to the card's serial flash.
1293  *      The FW image has the following sections: @size - 8 bytes of code and
1294  *      data, followed by 4 bytes of FW version, followed by the 32-bit
1295  *      1's complement checksum of the whole image.
1296  */
1297 int t3_load_fw(adapter_t *adapter, const u8 *fw_data, unsigned int size)
1298 {
1299         u32 version, csum, fw_version_addr;
1300         unsigned int i;
1301         const u32 *p = (const u32 *)fw_data;
1302         int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16;
1303
1304         if ((size & 3) || size < FW_MIN_SIZE)
1305                 return -EINVAL;
1306         if (size - 8 > FW_MAX_SIZE)
1307                 return -EFBIG;
1308
1309         version = ntohl(*(const u32 *)(fw_data + size - 8));
1310         if (G_FW_VERSION_MAJOR(version) < 8) {
1311
1312                 fw_version_addr = FW_VERS_ADDR_PRE8;
1313
1314                 if (size - 8 > FW_MAX_SIZE_PRE8)
1315                         return -EFBIG;
1316         } else
1317                 fw_version_addr = FW_VERS_ADDR;
1318
1319         for (csum = 0, i = 0; i < size / sizeof(csum); i++)
1320                 csum += ntohl(p[i]);
1321         if (csum != 0xffffffff) {
1322                 CH_ERR(adapter, "corrupted firmware image, checksum %u\n",
1323                        csum);
1324                 return -EINVAL;
1325         }
1326
1327         ret = t3_flash_erase_sectors(adapter, fw_sector, fw_sector);
1328         if (ret)
1329                 goto out;
1330
1331         size -= 8;  /* trim off version and checksum */
1332         for (addr = FW_FLASH_BOOT_ADDR; size; ) {
1333                 unsigned int chunk_size = min(size, 256U);
1334
1335                 ret = t3_write_flash(adapter, addr, chunk_size, fw_data, 1);
1336                 if (ret)
1337                         goto out;
1338
1339                 addr += chunk_size;
1340                 fw_data += chunk_size;
1341                 size -= chunk_size;
1342         }
1343
1344         ret = t3_write_flash(adapter, fw_version_addr, 4, fw_data, 1);
1345 out:
1346         if (ret)
1347                 CH_ERR(adapter, "firmware download failed, error %d\n", ret);
1348         return ret;
1349 }
1350
1351 /*
1352  *      t3_load_boot - download boot flash
1353  *      @adapter: the adapter
1354  *      @boot_data: the boot image to write
1355  *      @size: image size
1356  *
1357  *      Write the supplied boot image to the card's serial flash.
1358  *      The boot image has the following sections: a 28-byte header and the
1359  *      boot image.
1360  */
1361 int t3_load_boot(adapter_t *adapter, u8 *boot_data, unsigned int size)
1362 {
1363         boot_header_t *header = (boot_header_t *)boot_data;
1364         int ret;
1365         unsigned int addr;
1366         unsigned int boot_sector = BOOT_FLASH_BOOT_ADDR >> 16;
1367         unsigned int boot_end = (BOOT_FLASH_BOOT_ADDR + size - 1) >> 16;
1368
1369         /*
1370          * Perform some primitive sanity testing to avoid accidentally
1371          * writing garbage over the boot sectors.  We ought to check for
1372          * more but it's not worth it for now ...
1373          */
1374         if (size < BOOT_MIN_SIZE || size > BOOT_MAX_SIZE) {
1375                 CH_ERR(adapter, "boot image too small/large\n");
1376                 return -EFBIG;
1377         }
1378         if (le16_to_cpu(*(u16*)header->signature) != BOOT_SIGNATURE) {
1379                 CH_ERR(adapter, "boot image missing signature\n");
1380                 return -EINVAL;
1381         }
1382         if (header->length * BOOT_SIZE_INC != size) {
1383                 CH_ERR(adapter, "boot image header length != image length\n");
1384                 return -EINVAL;
1385         }
1386
1387         ret = t3_flash_erase_sectors(adapter, boot_sector, boot_end);
1388         if (ret)
1389                 goto out;
1390
1391         for (addr = BOOT_FLASH_BOOT_ADDR; size; ) {
1392                 unsigned int chunk_size = min(size, 256U);
1393
1394                 ret = t3_write_flash(adapter, addr, chunk_size, boot_data, 0);
1395                 if (ret)
1396                         goto out;
1397
1398                 addr += chunk_size;
1399                 boot_data += chunk_size;
1400                 size -= chunk_size;
1401         }
1402
1403 out:
1404         if (ret)
1405                 CH_ERR(adapter, "boot image download failed, error %d\n", ret);
1406         return ret;
1407 }
1408
1409 #define CIM_CTL_BASE 0x2000
1410
1411 /**
1412  *      t3_cim_ctl_blk_read - read a block from CIM control region
1413  *      @adap: the adapter
1414  *      @addr: the start address within the CIM control region
1415  *      @n: number of words to read
1416  *      @valp: where to store the result
1417  *
1418  *      Reads a block of 4-byte words from the CIM control region.
1419  */
1420 int t3_cim_ctl_blk_read(adapter_t *adap, unsigned int addr, unsigned int n,
1421                         unsigned int *valp)
1422 {
1423         int ret = 0;
1424
1425         if (t3_read_reg(adap, A_CIM_HOST_ACC_CTRL) & F_HOSTBUSY)
1426                 return -EBUSY;
1427
1428         for ( ; !ret && n--; addr += 4) {
1429                 t3_write_reg(adap, A_CIM_HOST_ACC_CTRL, CIM_CTL_BASE + addr);
1430                 ret = t3_wait_op_done(adap, A_CIM_HOST_ACC_CTRL, F_HOSTBUSY,
1431                                       0, 5, 2);
1432                 if (!ret)
1433                         *valp++ = t3_read_reg(adap, A_CIM_HOST_ACC_DATA);
1434         }
1435         return ret;
1436 }
1437
1438 static void t3_gate_rx_traffic(struct cmac *mac, u32 *rx_cfg,
1439                                u32 *rx_hash_high, u32 *rx_hash_low)
1440 {
1441         /* stop Rx unicast traffic */
1442         t3_mac_disable_exact_filters(mac);
1443
1444         /* stop broadcast, multicast, promiscuous mode traffic */
1445         *rx_cfg = t3_read_reg(mac->adapter, A_XGM_RX_CFG + mac->offset);
1446         t3_set_reg_field(mac->adapter, A_XGM_RX_CFG + mac->offset, 
1447                          F_ENHASHMCAST | F_DISBCAST | F_COPYALLFRAMES,
1448                          F_DISBCAST);
1449
1450         *rx_hash_high = t3_read_reg(mac->adapter, A_XGM_RX_HASH_HIGH +
1451             mac->offset);
1452         t3_write_reg(mac->adapter, A_XGM_RX_HASH_HIGH + mac->offset, 0);
1453
1454         *rx_hash_low = t3_read_reg(mac->adapter, A_XGM_RX_HASH_LOW +
1455             mac->offset);
1456         t3_write_reg(mac->adapter, A_XGM_RX_HASH_LOW + mac->offset, 0);
1457
1458         /* Leave time to drain max RX fifo */
1459         msleep(1);
1460 }
1461
1462 static void t3_open_rx_traffic(struct cmac *mac, u32 rx_cfg,
1463                                u32 rx_hash_high, u32 rx_hash_low)
1464 {
1465         t3_mac_enable_exact_filters(mac);
1466         t3_set_reg_field(mac->adapter, A_XGM_RX_CFG + mac->offset,
1467                          F_ENHASHMCAST | F_DISBCAST | F_COPYALLFRAMES,
1468                          rx_cfg);
1469         t3_write_reg(mac->adapter, A_XGM_RX_HASH_HIGH + mac->offset,
1470             rx_hash_high);
1471         t3_write_reg(mac->adapter, A_XGM_RX_HASH_LOW + mac->offset,
1472             rx_hash_low);
1473 }
1474
1475 static int t3_detect_link_fault(adapter_t *adapter, int port_id)
1476 {
1477         struct port_info *pi = adap2pinfo(adapter, port_id);
1478         struct cmac *mac = &pi->mac;
1479         uint32_t rx_cfg, rx_hash_high, rx_hash_low;
1480         int link_fault;
1481
1482         /* stop rx */
1483         t3_gate_rx_traffic(mac, &rx_cfg, &rx_hash_high, &rx_hash_low);
1484         t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, 0);
1485
1486         /* clear status and make sure intr is enabled */
1487         (void) t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset);
1488         t3_xgm_intr_enable(adapter, port_id);
1489
1490         /* restart rx */
1491         t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, F_RXEN);
1492         t3_open_rx_traffic(mac, rx_cfg, rx_hash_high, rx_hash_low);
1493
1494         link_fault = t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset);
1495         return (link_fault & F_LINKFAULTCHANGE ? 1 : 0);
1496 }
1497
1498 static void t3_clear_faults(adapter_t *adapter, int port_id)
1499 {
1500         struct port_info *pi = adap2pinfo(adapter, port_id);
1501         struct cmac *mac = &pi->mac;
1502
1503         if (adapter->params.nports <= 2) {
1504                 t3_xgm_intr_disable(adapter, pi->port_id);
1505                 t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset);
1506                 t3_write_reg(adapter, A_XGM_INT_CAUSE + mac->offset, F_XGM_INT);
1507                 t3_set_reg_field(adapter, A_XGM_INT_ENABLE + mac->offset,
1508                                  F_XGM_INT, F_XGM_INT);
1509                 t3_xgm_intr_enable(adapter, pi->port_id);
1510         }
1511 }
1512
1513 /**
1514  *      t3_link_changed - handle interface link changes
1515  *      @adapter: the adapter
1516  *      @port_id: the port index that changed link state
1517  *
1518  *      Called when a port's link settings change to propagate the new values
1519  *      to the associated PHY and MAC.  After performing the common tasks it
1520  *      invokes an OS-specific handler.
1521  */
1522 void t3_link_changed(adapter_t *adapter, int port_id)
1523 {
1524         int link_ok, speed, duplex, fc, link_fault, link_state;
1525         struct port_info *pi = adap2pinfo(adapter, port_id);
1526         struct cphy *phy = &pi->phy;
1527         struct cmac *mac = &pi->mac;
1528         struct link_config *lc = &pi->link_config;
1529
1530         link_ok = lc->link_ok;
1531         speed = lc->speed;
1532         duplex = lc->duplex;
1533         fc = lc->fc;
1534         link_fault = 0;
1535
1536         phy->ops->get_link_status(phy, &link_state, &speed, &duplex, &fc);
1537         link_ok = (link_state == PHY_LINK_UP);
1538         if (link_state != PHY_LINK_PARTIAL)
1539                 phy->rst = 0;
1540         else if (++phy->rst == 3) {
1541                 phy->ops->reset(phy, 0);
1542                 phy->rst = 0;
1543         }
1544
1545         if (link_ok == 0)
1546                 pi->link_fault = LF_NO;
1547
1548         if (lc->requested_fc & PAUSE_AUTONEG)
1549                 fc &= lc->requested_fc;
1550         else
1551                 fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1552
1553         /* Update mac speed before checking for link fault. */
1554         if (link_ok && speed >= 0 && lc->autoneg == AUTONEG_ENABLE &&
1555             (speed != lc->speed || duplex != lc->duplex || fc != lc->fc))
1556                 t3_mac_set_speed_duplex_fc(mac, speed, duplex, fc);
1557
1558         /*
1559          * Check for link faults if any of these is true:
1560          * a) A link fault is suspected, and PHY says link ok
1561          * b) PHY link transitioned from down -> up
1562          */
1563         if (adapter->params.nports <= 2 &&
1564             ((pi->link_fault && link_ok) || (!lc->link_ok && link_ok))) {
1565
1566                 link_fault = t3_detect_link_fault(adapter, port_id);
1567                 if (link_fault) {
1568                         if (pi->link_fault != LF_YES) {
1569                                 mac->stats.link_faults++;
1570                                 pi->link_fault = LF_YES;
1571                         }
1572
1573                         if (uses_xaui(adapter)) {
1574                                 if (adapter->params.rev >= T3_REV_C)
1575                                         t3c_pcs_force_los(mac);
1576                                 else
1577                                         t3b_pcs_reset(mac);
1578                         }
1579
1580                         /* Don't report link up */
1581                         link_ok = 0;
1582                 } else {
1583                         /* clear faults here if this was a false alarm. */
1584                         if (pi->link_fault == LF_MAYBE &&
1585                             link_ok && lc->link_ok)
1586                                 t3_clear_faults(adapter, port_id);
1587
1588                         pi->link_fault = LF_NO;
1589                 }
1590         }
1591
1592         if (link_ok == lc->link_ok && speed == lc->speed &&
1593             duplex == lc->duplex && fc == lc->fc)
1594                 return;                            /* nothing changed */
1595
1596         lc->link_ok = (unsigned char)link_ok;
1597         lc->speed = speed < 0 ? SPEED_INVALID : speed;
1598         lc->duplex = duplex < 0 ? DUPLEX_INVALID : duplex;
1599         lc->fc = fc;
1600
1601         if (link_ok) {
1602
1603                 /* down -> up, or up -> up with changed settings */
1604
1605                 if (adapter->params.rev > 0 && uses_xaui(adapter)) {
1606
1607                         if (adapter->params.rev >= T3_REV_C)
1608                                 t3c_pcs_force_los(mac);
1609                         else
1610                                 t3b_pcs_reset(mac);
1611
1612                         t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset,
1613                                      F_TXACTENABLE | F_RXEN);
1614                 }
1615
1616                 /* disable TX FIFO drain */
1617                 t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + mac->offset,
1618                                  F_ENDROPPKT, 0);
1619
1620                 t3_mac_enable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
1621                 t3_set_reg_field(adapter, A_XGM_STAT_CTRL + mac->offset,
1622                                  F_CLRSTATS, 1);
1623                 t3_clear_faults(adapter, port_id);
1624
1625         } else {
1626
1627                 /* up -> down */
1628
1629                 if (adapter->params.rev > 0 && uses_xaui(adapter)) {
1630                         t3_write_reg(adapter,
1631                                      A_XGM_XAUI_ACT_CTRL + mac->offset, 0);
1632                 }
1633
1634                 t3_xgm_intr_disable(adapter, pi->port_id);
1635                 if (adapter->params.nports <= 2) {
1636                         t3_set_reg_field(adapter,
1637                                          A_XGM_INT_ENABLE + mac->offset,
1638                                          F_XGM_INT, 0);
1639
1640                         t3_mac_disable(mac, MAC_DIRECTION_RX);
1641
1642                         /*
1643                          * Make sure Tx FIFO continues to drain, even as rxen is
1644                          * left high to help detect and indicate remote faults.
1645                          */
1646                         t3_set_reg_field(adapter,
1647                             A_XGM_TXFIFO_CFG + mac->offset, 0, F_ENDROPPKT);
1648                         t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, 0);
1649                         t3_write_reg(adapter,
1650                             A_XGM_TX_CTRL + mac->offset, F_TXEN);
1651                         t3_write_reg(adapter,
1652                             A_XGM_RX_CTRL + mac->offset, F_RXEN);
1653                 }
1654         }
1655
1656         t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc,
1657             mac->was_reset);
1658         mac->was_reset = 0;
1659 }
1660
1661 /**
1662  *      t3_link_start - apply link configuration to MAC/PHY
1663  *      @phy: the PHY to setup
1664  *      @mac: the MAC to setup
1665  *      @lc: the requested link configuration
1666  *
1667  *      Set up a port's MAC and PHY according to a desired link configuration.
1668  *      - If the PHY can auto-negotiate first decide what to advertise, then
1669  *        enable/disable auto-negotiation as desired, and reset.
1670  *      - If the PHY does not auto-negotiate just reset it.
1671  *      - If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
1672  *        otherwise do it later based on the outcome of auto-negotiation.
1673  */
1674 int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc)
1675 {
1676         unsigned int fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1677
1678         lc->link_ok = 0;
1679         if (lc->supported & SUPPORTED_Autoneg) {
1680                 lc->advertising &= ~(ADVERTISED_Asym_Pause | ADVERTISED_Pause);
1681                 if (fc) {
1682                         lc->advertising |= ADVERTISED_Asym_Pause;
1683                         if (fc & PAUSE_RX)
1684                                 lc->advertising |= ADVERTISED_Pause;
1685                 }
1686
1687                 phy->ops->advertise(phy, lc->advertising);
1688
1689                 if (lc->autoneg == AUTONEG_DISABLE) {
1690                         lc->speed = lc->requested_speed;
1691                         lc->duplex = lc->requested_duplex;
1692                         lc->fc = (unsigned char)fc;
1693                         t3_mac_set_speed_duplex_fc(mac, lc->speed, lc->duplex,
1694                                                    fc);
1695                         /* Also disables autoneg */
1696                         phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex);
1697                         /* PR 5666. Power phy up when doing an ifup */
1698                         if (!is_10G(phy->adapter))
1699                                 phy->ops->power_down(phy, 0);
1700                 } else
1701                         phy->ops->autoneg_enable(phy);
1702         } else {
1703                 t3_mac_set_speed_duplex_fc(mac, -1, -1, fc);
1704                 lc->fc = (unsigned char)fc;
1705                 phy->ops->reset(phy, 0);
1706         }
1707         return 0;
1708 }
1709
1710 /**
1711  *      t3_set_vlan_accel - control HW VLAN extraction
1712  *      @adapter: the adapter
1713  *      @ports: bitmap of adapter ports to operate on
1714  *      @on: enable (1) or disable (0) HW VLAN extraction
1715  *
1716  *      Enables or disables HW extraction of VLAN tags for the given port.
1717  */
1718 void t3_set_vlan_accel(adapter_t *adapter, unsigned int ports, int on)
1719 {
1720         t3_set_reg_field(adapter, A_TP_OUT_CONFIG,
1721                          ports << S_VLANEXTRACTIONENABLE,
1722                          on ? (ports << S_VLANEXTRACTIONENABLE) : 0);
1723 }
1724
1725 struct intr_info {
1726         unsigned int mask;       /* bits to check in interrupt status */
1727         const char *msg;         /* message to print or NULL */
1728         short stat_idx;          /* stat counter to increment or -1 */
1729         unsigned short fatal;    /* whether the condition reported is fatal */
1730 };
1731
1732 /**
1733  *      t3_handle_intr_status - table driven interrupt handler
1734  *      @adapter: the adapter that generated the interrupt
1735  *      @reg: the interrupt status register to process
1736  *      @mask: a mask to apply to the interrupt status
1737  *      @acts: table of interrupt actions
1738  *      @stats: statistics counters tracking interrupt occurrences
1739  *
1740  *      A table driven interrupt handler that applies a set of masks to an
1741  *      interrupt status word and performs the corresponding actions if the
1742  *      interrupts described by the mask have occurred.  The actions include
1743  *      optionally printing a warning or alert message, and optionally
1744  *      incrementing a stat counter.  The table is terminated by an entry
1745  *      specifying mask 0.  Returns the number of fatal interrupt conditions.
1746  */
1747 static int t3_handle_intr_status(adapter_t *adapter, unsigned int reg,
1748                                  unsigned int mask,
1749                                  const struct intr_info *acts,
1750                                  unsigned long *stats)
1751 {
1752         int fatal = 0;
1753         unsigned int status = t3_read_reg(adapter, reg) & mask;
1754
1755         for ( ; acts->mask; ++acts) {
1756                 if (!(status & acts->mask)) continue;
1757                 if (acts->fatal) {
1758                         fatal++;
1759                         CH_ALERT(adapter, "%s (0x%x)\n",
1760                                  acts->msg, status & acts->mask);
1761                         status &= ~acts->mask;
1762                 } else if (acts->msg)
1763                         CH_WARN(adapter, "%s (0x%x)\n",
1764                                 acts->msg, status & acts->mask);
1765                 if (acts->stat_idx >= 0)
1766                         stats[acts->stat_idx]++;
1767         }
1768         if (status)                           /* clear processed interrupts */
1769                 t3_write_reg(adapter, reg, status);
1770         return fatal;
1771 }
1772
1773 #define SGE_INTR_MASK (F_RSPQDISABLED | \
1774                        F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR | \
1775                        F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \
1776                        F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \
1777                        V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \
1778                        F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \
1779                        F_HIRCQPARITYERROR)
1780 #define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \
1781                        F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \
1782                        F_NFASRCHFAIL)
1783 #define MC7_INTR_MASK (F_AE | F_UE | F_CE | V_PE(M_PE))
1784 #define XGM_INTR_MASK (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
1785                        V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR) | \
1786                        F_TXFIFO_UNDERRUN)
1787 #define PCIX_INTR_MASK (F_MSTDETPARERR | F_SIGTARABT | F_RCVTARABT | \
1788                         F_RCVMSTABT | F_SIGSYSERR | F_DETPARERR | \
1789                         F_SPLCMPDIS | F_UNXSPLCMP | F_RCVSPLCMPERR | \
1790                         F_DETCORECCERR | F_DETUNCECCERR | F_PIOPARERR | \
1791                         V_WFPARERR(M_WFPARERR) | V_RFPARERR(M_RFPARERR) | \
1792                         V_CFPARERR(M_CFPARERR) /* | V_MSIXPARERR(M_MSIXPARERR) */)
1793 #define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\
1794                         F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \
1795                         /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \
1796                         F_RETRYBUFPARERR | F_RETRYLUTPARERR | F_RXPARERR | \
1797                         F_TXPARERR | V_BISTERR(M_BISTERR))
1798 #define ULPRX_INTR_MASK (F_PARERRDATA | F_PARERRPCMD | F_ARBPF1PERR | \
1799                          F_ARBPF0PERR | F_ARBFPERR | F_PCMDMUXPERR | \
1800                          F_DATASELFRAMEERR1 | F_DATASELFRAMEERR0)
1801 #define ULPTX_INTR_MASK 0xfc
1802 #define CPLSW_INTR_MASK (F_CIM_OP_MAP_PERR | F_TP_FRAMING_ERROR | \
1803                          F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \
1804                          F_ZERO_SWITCH_ERROR)
1805 #define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \
1806                        F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \
1807                        F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \
1808                        F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT | \
1809                        F_DRAMPARERR | F_ICACHEPARERR | F_DCACHEPARERR | \
1810                        F_OBQSGEPARERR | F_OBQULPHIPARERR | F_OBQULPLOPARERR | \
1811                        F_IBQSGELOPARERR | F_IBQSGEHIPARERR | F_IBQULPPARERR | \
1812                        F_IBQTPPARERR | F_ITAGPARERR | F_DTAGPARERR)
1813 #define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \
1814                         V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \
1815                         V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR))
1816 #define PMRX_INTR_MASK (F_ZERO_E_CMD_ERROR | IESPI_FRM_ERR | OCSPI_FRM_ERR | \
1817                         V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR) | \
1818                         V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR))
1819 #define MPS_INTR_MASK (V_TX0TPPARERRENB(M_TX0TPPARERRENB) | \
1820                        V_TX1TPPARERRENB(M_TX1TPPARERRENB) | \
1821                        V_RXTPPARERRENB(M_RXTPPARERRENB) | \
1822                        V_MCAPARERRENB(M_MCAPARERRENB))
1823 #define XGM_EXTRA_INTR_MASK (F_LINKFAULTCHANGE)
1824 #define PL_INTR_MASK (F_T3DBG | F_XGMAC0_0 | F_XGMAC0_1 | F_MC5A | F_PM1_TX | \
1825                       F_PM1_RX | F_ULP2_TX | F_ULP2_RX | F_TP1 | F_CIM | \
1826                       F_MC7_CM | F_MC7_PMTX | F_MC7_PMRX | F_SGE3 | F_PCIM0 | \
1827                       F_MPS0 | F_CPL_SWITCH)
1828 /*
1829  * Interrupt handler for the PCIX1 module.
1830  */
1831 static void pci_intr_handler(adapter_t *adapter)
1832 {
1833         static struct intr_info pcix1_intr_info[] = {
1834                 { F_MSTDETPARERR, "PCI master detected parity error", -1, 1 },
1835                 { F_SIGTARABT, "PCI signaled target abort", -1, 1 },
1836                 { F_RCVTARABT, "PCI received target abort", -1, 1 },
1837                 { F_RCVMSTABT, "PCI received master abort", -1, 1 },
1838                 { F_SIGSYSERR, "PCI signaled system error", -1, 1 },
1839                 { F_DETPARERR, "PCI detected parity error", -1, 1 },
1840                 { F_SPLCMPDIS, "PCI split completion discarded", -1, 1 },
1841                 { F_UNXSPLCMP, "PCI unexpected split completion error", -1, 1 },
1842                 { F_RCVSPLCMPERR, "PCI received split completion error", -1,
1843                   1 },
1844                 { F_DETCORECCERR, "PCI correctable ECC error",
1845                   STAT_PCI_CORR_ECC, 0 },
1846                 { F_DETUNCECCERR, "PCI uncorrectable ECC error", -1, 1 },
1847                 { F_PIOPARERR, "PCI PIO FIFO parity error", -1, 1 },
1848                 { V_WFPARERR(M_WFPARERR), "PCI write FIFO parity error", -1,
1849                   1 },
1850                 { V_RFPARERR(M_RFPARERR), "PCI read FIFO parity error", -1,
1851                   1 },
1852                 { V_CFPARERR(M_CFPARERR), "PCI command FIFO parity error", -1,
1853                   1 },
1854                 { V_MSIXPARERR(M_MSIXPARERR), "PCI MSI-X table/PBA parity "
1855                   "error", -1, 1 },
1856                 { 0 }
1857         };
1858
1859         if (t3_handle_intr_status(adapter, A_PCIX_INT_CAUSE, PCIX_INTR_MASK,
1860                                   pcix1_intr_info, adapter->irq_stats))
1861                 t3_fatal_err(adapter);
1862 }
1863
1864 /*
1865  * Interrupt handler for the PCIE module.
1866  */
1867 static void pcie_intr_handler(adapter_t *adapter)
1868 {
1869         static struct intr_info pcie_intr_info[] = {
1870                 { F_PEXERR, "PCI PEX error", -1, 1 },
1871                 { F_UNXSPLCPLERRR,
1872                   "PCI unexpected split completion DMA read error", -1, 1 },
1873                 { F_UNXSPLCPLERRC,
1874                   "PCI unexpected split completion DMA command error", -1, 1 },
1875                 { F_PCIE_PIOPARERR, "PCI PIO FIFO parity error", -1, 1 },
1876                 { F_PCIE_WFPARERR, "PCI write FIFO parity error", -1, 1 },
1877                 { F_PCIE_RFPARERR, "PCI read FIFO parity error", -1, 1 },
1878                 { F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1 },
1879                 { V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR),
1880                   "PCI MSI-X table/PBA parity error", -1, 1 },
1881                 { F_RETRYBUFPARERR, "PCI retry buffer parity error", -1, 1 },
1882                 { F_RETRYLUTPARERR, "PCI retry LUT parity error", -1, 1 },
1883                 { F_RXPARERR, "PCI Rx parity error", -1, 1 },
1884                 { F_TXPARERR, "PCI Tx parity error", -1, 1 },
1885                 { V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1 },
1886                 { 0 }
1887         };
1888
1889         if (t3_read_reg(adapter, A_PCIE_INT_CAUSE) & F_PEXERR)
1890                 CH_ALERT(adapter, "PEX error code 0x%x\n",
1891                          t3_read_reg(adapter, A_PCIE_PEX_ERR));
1892
1893         if (t3_handle_intr_status(adapter, A_PCIE_INT_CAUSE, PCIE_INTR_MASK,
1894                                   pcie_intr_info, adapter->irq_stats))
1895                 t3_fatal_err(adapter);
1896 }
1897
1898 /*
1899  * TP interrupt handler.
1900  */
1901 static void tp_intr_handler(adapter_t *adapter)
1902 {
1903         static struct intr_info tp_intr_info[] = {
1904                 { 0xffffff,  "TP parity error", -1, 1 },
1905                 { 0x1000000, "TP out of Rx pages", -1, 1 },
1906                 { 0x2000000, "TP out of Tx pages", -1, 1 },
1907                 { 0 }
1908         };
1909         static struct intr_info tp_intr_info_t3c[] = {
1910                 { 0x1fffffff,  "TP parity error", -1, 1 },
1911                 { F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1 },
1912                 { F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 },
1913                 { 0 }
1914         };
1915
1916         if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff,
1917                                   adapter->params.rev < T3_REV_C ?
1918                                         tp_intr_info : tp_intr_info_t3c, NULL))
1919                 t3_fatal_err(adapter);
1920 }
1921
1922 /*
1923  * CIM interrupt handler.
1924  */
1925 static void cim_intr_handler(adapter_t *adapter)
1926 {
1927         static struct intr_info cim_intr_info[] = {
1928                 { F_RSVDSPACEINT, "CIM reserved space write", -1, 1 },
1929                 { F_SDRAMRANGEINT, "CIM SDRAM address out of range", -1, 1 },
1930                 { F_FLASHRANGEINT, "CIM flash address out of range", -1, 1 },
1931                 { F_BLKWRBOOTINT, "CIM block write to boot space", -1, 1 },
1932                 { F_WRBLKFLASHINT, "CIM write to cached flash space", -1, 1 },
1933                 { F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1 },
1934                 { F_BLKRDFLASHINT, "CIM block read from flash space", -1, 1 },
1935                 { F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1 },
1936                 { F_BLKRDCTLINT, "CIM block read from CTL space", -1, 1 },
1937                 { F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1 },
1938                 { F_BLKRDPLINT, "CIM block read from PL space", -1, 1 },
1939                 { F_BLKWRPLINT, "CIM block write to PL space", -1, 1 },
1940                 { F_DRAMPARERR, "CIM DRAM parity error", -1, 1 },
1941                 { F_ICACHEPARERR, "CIM icache parity error", -1, 1 },
1942                 { F_DCACHEPARERR, "CIM dcache parity error", -1, 1 },
1943                 { F_OBQSGEPARERR, "CIM OBQ SGE parity error", -1, 1 },
1944                 { F_OBQULPHIPARERR, "CIM OBQ ULPHI parity error", -1, 1 },
1945                 { F_OBQULPLOPARERR, "CIM OBQ ULPLO parity error", -1, 1 },
1946                 { F_IBQSGELOPARERR, "CIM IBQ SGELO parity error", -1, 1 },
1947                 { F_IBQSGEHIPARERR, "CIM IBQ SGEHI parity error", -1, 1 },
1948                 { F_IBQULPPARERR, "CIM IBQ ULP parity error", -1, 1 },
1949                 { F_IBQTPPARERR, "CIM IBQ TP parity error", -1, 1 },
1950                 { F_ITAGPARERR, "CIM itag parity error", -1, 1 },
1951                 { F_DTAGPARERR, "CIM dtag parity error", -1, 1 },
1952                 { 0 }
1953         };
1954
1955         if (t3_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE, CIM_INTR_MASK,
1956                                   cim_intr_info, NULL))
1957                 t3_fatal_err(adapter);
1958 }
1959
1960 /*
1961  * ULP RX interrupt handler.
1962  */
1963 static void ulprx_intr_handler(adapter_t *adapter)
1964 {
1965         static struct intr_info ulprx_intr_info[] = {
1966                 { F_PARERRDATA, "ULP RX data parity error", -1, 1 },
1967                 { F_PARERRPCMD, "ULP RX command parity error", -1, 1 },
1968                 { F_ARBPF1PERR, "ULP RX ArbPF1 parity error", -1, 1 },
1969                 { F_ARBPF0PERR, "ULP RX ArbPF0 parity error", -1, 1 },
1970                 { F_ARBFPERR, "ULP RX ArbF parity error", -1, 1 },
1971                 { F_PCMDMUXPERR, "ULP RX PCMDMUX parity error", -1, 1 },
1972                 { F_DATASELFRAMEERR1, "ULP RX frame error", -1, 1 },
1973                 { F_DATASELFRAMEERR0, "ULP RX frame error", -1, 1 },
1974                 { 0 }
1975         };
1976
1977         if (t3_handle_intr_status(adapter, A_ULPRX_INT_CAUSE, 0xffffffff,
1978                                   ulprx_intr_info, NULL))
1979                 t3_fatal_err(adapter);
1980 }
1981
1982 /*
1983  * ULP TX interrupt handler.
1984  */
1985 static void ulptx_intr_handler(adapter_t *adapter)
1986 {
1987         static struct intr_info ulptx_intr_info[] = {
1988                 { F_PBL_BOUND_ERR_CH0, "ULP TX channel 0 PBL out of bounds",
1989                   STAT_ULP_CH0_PBL_OOB, 0 },
1990                 { F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds",
1991                   STAT_ULP_CH1_PBL_OOB, 0 },
1992                 { 0xfc, "ULP TX parity error", -1, 1 },
1993                 { 0 }
1994         };
1995
1996         if (t3_handle_intr_status(adapter, A_ULPTX_INT_CAUSE, 0xffffffff,
1997                                   ulptx_intr_info, adapter->irq_stats))
1998                 t3_fatal_err(adapter);
1999 }
2000
2001 #define ICSPI_FRM_ERR (F_ICSPI0_FIFO2X_RX_FRAMING_ERROR | \
2002         F_ICSPI1_FIFO2X_RX_FRAMING_ERROR | F_ICSPI0_RX_FRAMING_ERROR | \
2003         F_ICSPI1_RX_FRAMING_ERROR | F_ICSPI0_TX_FRAMING_ERROR | \
2004         F_ICSPI1_TX_FRAMING_ERROR)
2005 #define OESPI_FRM_ERR (F_OESPI0_RX_FRAMING_ERROR | \
2006         F_OESPI1_RX_FRAMING_ERROR | F_OESPI0_TX_FRAMING_ERROR | \
2007         F_OESPI1_TX_FRAMING_ERROR | F_OESPI0_OFIFO2X_TX_FRAMING_ERROR | \
2008         F_OESPI1_OFIFO2X_TX_FRAMING_ERROR)
2009
2010 /*
2011  * PM TX interrupt handler.
2012  */
2013 static void pmtx_intr_handler(adapter_t *adapter)
2014 {
2015         static struct intr_info pmtx_intr_info[] = {
2016                 { F_ZERO_C_CMD_ERROR, "PMTX 0-length pcmd", -1, 1 },
2017                 { ICSPI_FRM_ERR, "PMTX ispi framing error", -1, 1 },
2018                 { OESPI_FRM_ERR, "PMTX ospi framing error", -1, 1 },
2019                 { V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR),
2020                   "PMTX ispi parity error", -1, 1 },
2021                 { V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR),
2022                   "PMTX ospi parity error", -1, 1 },
2023                 { 0 }
2024         };
2025
2026         if (t3_handle_intr_status(adapter, A_PM1_TX_INT_CAUSE, 0xffffffff,
2027                                   pmtx_intr_info, NULL))
2028                 t3_fatal_err(adapter);
2029 }
2030
2031 #define IESPI_FRM_ERR (F_IESPI0_FIFO2X_RX_FRAMING_ERROR | \
2032         F_IESPI1_FIFO2X_RX_FRAMING_ERROR | F_IESPI0_RX_FRAMING_ERROR | \
2033         F_IESPI1_RX_FRAMING_ERROR | F_IESPI0_TX_FRAMING_ERROR | \
2034         F_IESPI1_TX_FRAMING_ERROR)
2035 #define OCSPI_FRM_ERR (F_OCSPI0_RX_FRAMING_ERROR | \
2036         F_OCSPI1_RX_FRAMING_ERROR | F_OCSPI0_TX_FRAMING_ERROR | \
2037         F_OCSPI1_TX_FRAMING_ERROR | F_OCSPI0_OFIFO2X_TX_FRAMING_ERROR | \
2038         F_OCSPI1_OFIFO2X_TX_FRAMING_ERROR)
2039
2040 /*
2041  * PM RX interrupt handler.
2042  */
2043 static void pmrx_intr_handler(adapter_t *adapter)
2044 {
2045         static struct intr_info pmrx_intr_info[] = {
2046                 { F_ZERO_E_CMD_ERROR, "PMRX 0-length pcmd", -1, 1 },
2047                 { IESPI_FRM_ERR, "PMRX ispi framing error", -1, 1 },
2048                 { OCSPI_FRM_ERR, "PMRX ospi framing error", -1, 1 },
2049                 { V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR),
2050                   "PMRX ispi parity error", -1, 1 },
2051                 { V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR),
2052                   "PMRX ospi parity error", -1, 1 },
2053                 { 0 }
2054         };
2055
2056         if (t3_handle_intr_status(adapter, A_PM1_RX_INT_CAUSE, 0xffffffff,
2057                                   pmrx_intr_info, NULL))
2058                 t3_fatal_err(adapter);
2059 }
2060
2061 /*
2062  * CPL switch interrupt handler.
2063  */
2064 static void cplsw_intr_handler(adapter_t *adapter)
2065 {
2066         static struct intr_info cplsw_intr_info[] = {
2067                 { F_CIM_OP_MAP_PERR, "CPL switch CIM parity error", -1, 1 },
2068                 { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 },
2069                 { F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1 },
2070                 { F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1 },
2071                 { F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1 },
2072                 { F_ZERO_SWITCH_ERROR, "CPL switch no-switch error", -1, 1 },
2073                 { 0 }
2074         };
2075
2076         if (t3_handle_intr_status(adapter, A_CPL_INTR_CAUSE, 0xffffffff,
2077                                   cplsw_intr_info, NULL))
2078                 t3_fatal_err(adapter);
2079 }
2080
2081 /*
2082  * MPS interrupt handler.
2083  */
2084 static void mps_intr_handler(adapter_t *adapter)
2085 {
2086         static struct intr_info mps_intr_info[] = {
2087                 { 0x1ff, "MPS parity error", -1, 1 },
2088                 { 0 }
2089         };
2090
2091         if (t3_handle_intr_status(adapter, A_MPS_INT_CAUSE, 0xffffffff,
2092                                   mps_intr_info, NULL))
2093                 t3_fatal_err(adapter);
2094 }
2095
2096 #define MC7_INTR_FATAL (F_UE | V_PE(M_PE) | F_AE)
2097
2098 /*
2099  * MC7 interrupt handler.
2100  */
2101 static void mc7_intr_handler(struct mc7 *mc7)
2102 {
2103         adapter_t *adapter = mc7->adapter;
2104         u32 cause = t3_read_reg(adapter, mc7->offset + A_MC7_INT_CAUSE);
2105
2106         if (cause & F_CE) {
2107                 mc7->stats.corr_err++;
2108                 CH_WARN(adapter, "%s MC7 correctable error at addr 0x%x, "
2109                         "data 0x%x 0x%x 0x%x\n", mc7->name,
2110                         t3_read_reg(adapter, mc7->offset + A_MC7_CE_ADDR),
2111                         t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA0),
2112                         t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA1),
2113                         t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA2));
2114         }
2115
2116         if (cause & F_UE) {
2117                 mc7->stats.uncorr_err++;
2118                 CH_ALERT(adapter, "%s MC7 uncorrectable error at addr 0x%x, "
2119                          "data 0x%x 0x%x 0x%x\n", mc7->name,
2120                          t3_read_reg(adapter, mc7->offset + A_MC7_UE_ADDR),
2121                          t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA0),
2122                          t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA1),
2123                          t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA2));
2124         }
2125
2126         if (G_PE(cause)) {
2127                 mc7->stats.parity_err++;
2128                 CH_ALERT(adapter, "%s MC7 parity error 0x%x\n",
2129                          mc7->name, G_PE(cause));
2130         }
2131
2132         if (cause & F_AE) {
2133                 u32 addr = 0;
2134
2135                 if (adapter->params.rev > 0)
2136                         addr = t3_read_reg(adapter,
2137                                            mc7->offset + A_MC7_ERR_ADDR);
2138                 mc7->stats.addr_err++;
2139                 CH_ALERT(adapter, "%s MC7 address error: 0x%x\n",
2140                          mc7->name, addr);
2141         }
2142
2143         if (cause & MC7_INTR_FATAL)
2144                 t3_fatal_err(adapter);
2145
2146         t3_write_reg(adapter, mc7->offset + A_MC7_INT_CAUSE, cause);
2147 }
2148
2149 #define XGM_INTR_FATAL (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
2150                         V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR))
2151 /*
2152  * XGMAC interrupt handler.
2153  */
2154 static int mac_intr_handler(adapter_t *adap, unsigned int idx)
2155 {
2156         u32 cause;
2157         struct port_info *pi;
2158         struct cmac *mac;
2159
2160         idx = idx == 0 ? 0 : adapter_info(adap)->nports0; /* MAC idx -> port */
2161         pi = adap2pinfo(adap, idx);
2162         mac = &pi->mac;
2163
2164         /*
2165          * We mask out interrupt causes for which we're not taking interrupts.
2166          * This allows us to use polling logic to monitor some of the other
2167          * conditions when taking interrupts would impose too much load on the
2168          * system.
2169          */
2170         cause = (t3_read_reg(adap, A_XGM_INT_CAUSE + mac->offset)
2171                  & ~(F_RXFIFO_OVERFLOW));
2172
2173         if (cause & V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR)) {
2174                 mac->stats.tx_fifo_parity_err++;
2175                 CH_ALERT(adap, "port%d: MAC TX FIFO parity error\n", idx);
2176         }
2177         if (cause & V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR)) {
2178                 mac->stats.rx_fifo_parity_err++;
2179                 CH_ALERT(adap, "port%d: MAC RX FIFO parity error\n", idx);
2180         }
2181         if (cause & F_TXFIFO_UNDERRUN)
2182                 mac->stats.tx_fifo_urun++;
2183         if (cause & F_RXFIFO_OVERFLOW)
2184                 mac->stats.rx_fifo_ovfl++;
2185         if (cause & V_SERDES_LOS(M_SERDES_LOS))
2186                 mac->stats.serdes_signal_loss++;
2187         if (cause & F_XAUIPCSCTCERR)
2188                 mac->stats.xaui_pcs_ctc_err++;
2189         if (cause & F_XAUIPCSALIGNCHANGE)
2190                 mac->stats.xaui_pcs_align_change++;
2191         if (cause & F_XGM_INT &
2192             t3_read_reg(adap, A_XGM_INT_ENABLE + mac->offset)) {
2193                 t3_set_reg_field(adap, A_XGM_INT_ENABLE + mac->offset,
2194                     F_XGM_INT, 0);
2195
2196                 /* link fault suspected */
2197                 pi->link_fault = LF_MAYBE;
2198                 t3_os_link_intr(pi);
2199         }
2200
2201         if (cause & XGM_INTR_FATAL)
2202                 t3_fatal_err(adap);
2203
2204         t3_write_reg(adap, A_XGM_INT_CAUSE + mac->offset, cause);
2205         return cause != 0;
2206 }
2207
2208 /*
2209  * Interrupt handler for PHY events.
2210  */
2211 static int phy_intr_handler(adapter_t *adapter)
2212 {
2213         u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE);
2214
2215         for_each_port(adapter, i) {
2216                 struct port_info *p = adap2pinfo(adapter, i);
2217
2218                 if (!(p->phy.caps & SUPPORTED_IRQ))
2219                         continue;
2220
2221                 if (cause & (1 << adapter_info(adapter)->gpio_intr[i])) {
2222                         int phy_cause = p->phy.ops->intr_handler(&p->phy);
2223
2224                         if (phy_cause & cphy_cause_link_change)
2225                                 t3_os_link_intr(p);
2226                         if (phy_cause & cphy_cause_fifo_error)
2227                                 p->phy.fifo_errors++;
2228                         if (phy_cause & cphy_cause_module_change)
2229                                 t3_os_phymod_changed(adapter, i);
2230                         if (phy_cause & cphy_cause_alarm)
2231                                 CH_WARN(adapter, "Operation affected due to "
2232                                     "adverse environment.  Check the spec "
2233                                     "sheet for corrective action.");
2234                 }
2235         }
2236
2237         t3_write_reg(adapter, A_T3DBG_INT_CAUSE, cause);
2238         return 0;
2239 }
2240
2241 /**
2242  *      t3_slow_intr_handler - control path interrupt handler
2243  *      @adapter: the adapter
2244  *
2245  *      T3 interrupt handler for non-data interrupt events, e.g., errors.
2246  *      The designation 'slow' is because it involves register reads, while
2247  *      data interrupts typically don't involve any MMIOs.
2248  */
2249 int t3_slow_intr_handler(adapter_t *adapter)
2250 {
2251         u32 cause = t3_read_reg(adapter, A_PL_INT_CAUSE0);
2252
2253         cause &= adapter->slow_intr_mask;
2254         if (!cause)
2255                 return 0;
2256         if (cause & F_PCIM0) {
2257                 if (is_pcie(adapter))
2258                         pcie_intr_handler(adapter);
2259                 else
2260                         pci_intr_handler(adapter);
2261         }
2262         if (cause & F_SGE3)
2263                 t3_sge_err_intr_handler(adapter);
2264         if (cause & F_MC7_PMRX)
2265                 mc7_intr_handler(&adapter->pmrx);
2266         if (cause & F_MC7_PMTX)
2267                 mc7_intr_handler(&adapter->pmtx);
2268         if (cause & F_MC7_CM)
2269                 mc7_intr_handler(&adapter->cm);
2270         if (cause & F_CIM)
2271                 cim_intr_handler(adapter);
2272         if (cause & F_TP1)
2273                 tp_intr_handler(adapter);
2274         if (cause & F_ULP2_RX)
2275                 ulprx_intr_handler(adapter);
2276         if (cause & F_ULP2_TX)
2277                 ulptx_intr_handler(adapter);
2278         if (cause & F_PM1_RX)
2279                 pmrx_intr_handler(adapter);
2280         if (cause & F_PM1_TX)
2281                 pmtx_intr_handler(adapter);
2282         if (cause & F_CPL_SWITCH)
2283                 cplsw_intr_handler(adapter);
2284         if (cause & F_MPS0)
2285                 mps_intr_handler(adapter);
2286         if (cause & F_MC5A)
2287                 t3_mc5_intr_handler(&adapter->mc5);
2288         if (cause & F_XGMAC0_0)
2289                 mac_intr_handler(adapter, 0);
2290         if (cause & F_XGMAC0_1)
2291                 mac_intr_handler(adapter, 1);
2292         if (cause & F_T3DBG)
2293                 phy_intr_handler(adapter);
2294
2295         /* Clear the interrupts just processed. */
2296         t3_write_reg(adapter, A_PL_INT_CAUSE0, cause);
2297         (void) t3_read_reg(adapter, A_PL_INT_CAUSE0); /* flush */
2298         return 1;
2299 }
2300
2301 static unsigned int calc_gpio_intr(adapter_t *adap)
2302 {
2303         unsigned int i, gpi_intr = 0;
2304
2305         for_each_port(adap, i)
2306                 if ((adap2pinfo(adap, i)->phy.caps & SUPPORTED_IRQ) &&
2307                     adapter_info(adap)->gpio_intr[i])
2308                         gpi_intr |= 1 << adapter_info(adap)->gpio_intr[i];
2309         return gpi_intr;
2310 }
2311
2312 /**
2313  *      t3_intr_enable - enable interrupts
2314  *      @adapter: the adapter whose interrupts should be enabled
2315  *
2316  *      Enable interrupts by setting the interrupt enable registers of the
2317  *      various HW modules and then enabling the top-level interrupt
2318  *      concentrator.
2319  */
2320 void t3_intr_enable(adapter_t *adapter)
2321 {
2322         static struct addr_val_pair intr_en_avp[] = {
2323                 { A_MC7_INT_ENABLE, MC7_INTR_MASK },
2324                 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
2325                         MC7_INTR_MASK },
2326                 { A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
2327                         MC7_INTR_MASK },
2328                 { A_MC5_DB_INT_ENABLE, MC5_INTR_MASK },
2329                 { A_ULPRX_INT_ENABLE, ULPRX_INTR_MASK },
2330                 { A_PM1_TX_INT_ENABLE, PMTX_INTR_MASK },
2331                 { A_PM1_RX_INT_ENABLE, PMRX_INTR_MASK },
2332                 { A_CIM_HOST_INT_ENABLE, CIM_INTR_MASK },
2333                 { A_MPS_INT_ENABLE, MPS_INTR_MASK },
2334         };
2335
2336         adapter->slow_intr_mask = PL_INTR_MASK;
2337
2338         t3_write_regs(adapter, intr_en_avp, ARRAY_SIZE(intr_en_avp), 0);
2339         t3_write_reg(adapter, A_TP_INT_ENABLE,
2340                      adapter->params.rev >= T3_REV_C ? 0x2bfffff : 0x3bfffff);
2341         t3_write_reg(adapter, A_SG_INT_ENABLE, SGE_INTR_MASK);
2342
2343         if (adapter->params.rev > 0) {
2344                 t3_write_reg(adapter, A_CPL_INTR_ENABLE,
2345                              CPLSW_INTR_MASK | F_CIM_OVFL_ERROR);
2346                 t3_write_reg(adapter, A_ULPTX_INT_ENABLE,
2347                              ULPTX_INTR_MASK | F_PBL_BOUND_ERR_CH0 |
2348                              F_PBL_BOUND_ERR_CH1);
2349         } else {
2350                 t3_write_reg(adapter, A_CPL_INTR_ENABLE, CPLSW_INTR_MASK);
2351                 t3_write_reg(adapter, A_ULPTX_INT_ENABLE, ULPTX_INTR_MASK);
2352         }
2353
2354         t3_write_reg(adapter, A_T3DBG_INT_ENABLE, calc_gpio_intr(adapter));
2355
2356         if (is_pcie(adapter))
2357                 t3_write_reg(adapter, A_PCIE_INT_ENABLE, PCIE_INTR_MASK);
2358         else
2359                 t3_write_reg(adapter, A_PCIX_INT_ENABLE, PCIX_INTR_MASK);
2360         t3_write_reg(adapter, A_PL_INT_ENABLE0, adapter->slow_intr_mask);
2361         (void) t3_read_reg(adapter, A_PL_INT_ENABLE0);          /* flush */
2362 }
2363
2364 /**
2365  *      t3_intr_disable - disable a card's interrupts
2366  *      @adapter: the adapter whose interrupts should be disabled
2367  *
2368  *      Disable interrupts.  We only disable the top-level interrupt
2369  *      concentrator and the SGE data interrupts.
2370  */
2371 void t3_intr_disable(adapter_t *adapter)
2372 {
2373         t3_write_reg(adapter, A_PL_INT_ENABLE0, 0);
2374         (void) t3_read_reg(adapter, A_PL_INT_ENABLE0);  /* flush */
2375         adapter->slow_intr_mask = 0;
2376 }
2377
2378 /**
2379  *      t3_intr_clear - clear all interrupts
2380  *      @adapter: the adapter whose interrupts should be cleared
2381  *
2382  *      Clears all interrupts.
2383  */
2384 void t3_intr_clear(adapter_t *adapter)
2385 {
2386         static const unsigned int cause_reg_addr[] = {
2387                 A_SG_INT_CAUSE,
2388                 A_SG_RSPQ_FL_STATUS,
2389                 A_PCIX_INT_CAUSE,
2390                 A_MC7_INT_CAUSE,
2391                 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
2392                 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
2393                 A_CIM_HOST_INT_CAUSE,
2394                 A_TP_INT_CAUSE,
2395                 A_MC5_DB_INT_CAUSE,
2396                 A_ULPRX_INT_CAUSE,
2397                 A_ULPTX_INT_CAUSE,
2398                 A_CPL_INTR_CAUSE,
2399                 A_PM1_TX_INT_CAUSE,
2400                 A_PM1_RX_INT_CAUSE,
2401                 A_MPS_INT_CAUSE,
2402                 A_T3DBG_INT_CAUSE,
2403         };
2404         unsigned int i;
2405
2406         /* Clear PHY and MAC interrupts for each port. */
2407         for_each_port(adapter, i)
2408                 t3_port_intr_clear(adapter, i);
2409
2410         for (i = 0; i < ARRAY_SIZE(cause_reg_addr); ++i)
2411                 t3_write_reg(adapter, cause_reg_addr[i], 0xffffffff);
2412
2413         if (is_pcie(adapter))
2414                 t3_write_reg(adapter, A_PCIE_PEX_ERR, 0xffffffff);
2415         t3_write_reg(adapter, A_PL_INT_CAUSE0, 0xffffffff);
2416         (void) t3_read_reg(adapter, A_PL_INT_CAUSE0);          /* flush */
2417 }
2418
2419 void t3_xgm_intr_enable(adapter_t *adapter, int idx)
2420 {
2421         struct port_info *pi = adap2pinfo(adapter, idx);
2422
2423         t3_write_reg(adapter, A_XGM_XGM_INT_ENABLE + pi->mac.offset,
2424                      XGM_EXTRA_INTR_MASK);
2425 }
2426
2427 void t3_xgm_intr_disable(adapter_t *adapter, int idx)
2428 {
2429         struct port_info *pi = adap2pinfo(adapter, idx);
2430
2431         t3_write_reg(adapter, A_XGM_XGM_INT_DISABLE + pi->mac.offset,
2432                      0x7ff);
2433 }
2434
2435 /**
2436  *      t3_port_intr_enable - enable port-specific interrupts
2437  *      @adapter: associated adapter
2438  *      @idx: index of port whose interrupts should be enabled
2439  *
2440  *      Enable port-specific (i.e., MAC and PHY) interrupts for the given
2441  *      adapter port.
2442  */
2443 void t3_port_intr_enable(adapter_t *adapter, int idx)
2444 {
2445         struct port_info *pi = adap2pinfo(adapter, idx);
2446
2447         t3_write_reg(adapter, A_XGM_INT_ENABLE + pi->mac.offset, XGM_INTR_MASK);
2448         pi->phy.ops->intr_enable(&pi->phy);
2449 }
2450
2451 /**
2452  *      t3_port_intr_disable - disable port-specific interrupts
2453  *      @adapter: associated adapter
2454  *      @idx: index of port whose interrupts should be disabled
2455  *
2456  *      Disable port-specific (i.e., MAC and PHY) interrupts for the given
2457  *      adapter port.
2458  */
2459 void t3_port_intr_disable(adapter_t *adapter, int idx)
2460 {
2461         struct port_info *pi = adap2pinfo(adapter, idx);
2462
2463         t3_write_reg(adapter, A_XGM_INT_ENABLE + pi->mac.offset, 0);
2464         pi->phy.ops->intr_disable(&pi->phy);
2465 }
2466
2467 /**
2468  *      t3_port_intr_clear - clear port-specific interrupts
2469  *      @adapter: associated adapter
2470  *      @idx: index of port whose interrupts to clear
2471  *
2472  *      Clear port-specific (i.e., MAC and PHY) interrupts for the given
2473  *      adapter port.
2474  */
2475 void t3_port_intr_clear(adapter_t *adapter, int idx)
2476 {
2477         struct port_info *pi = adap2pinfo(adapter, idx);
2478
2479         t3_write_reg(adapter, A_XGM_INT_CAUSE + pi->mac.offset, 0xffffffff);
2480         pi->phy.ops->intr_clear(&pi->phy);
2481 }
2482
2483 #define SG_CONTEXT_CMD_ATTEMPTS 100
2484
2485 /**
2486  *      t3_sge_write_context - write an SGE context
2487  *      @adapter: the adapter
2488  *      @id: the context id
2489  *      @type: the context type
2490  *
2491  *      Program an SGE context with the values already loaded in the
2492  *      CONTEXT_DATA? registers.
2493  */
2494 static int t3_sge_write_context(adapter_t *adapter, unsigned int id,
2495                                 unsigned int type)
2496 {
2497         if (type == F_RESPONSEQ) {
2498                 /*
2499                  * Can't write the Response Queue Context bits for
2500                  * Interrupt Armed or the Reserve bits after the chip
2501                  * has been initialized out of reset.  Writing to these
2502                  * bits can confuse the hardware.
2503                  */
2504                 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
2505                 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
2506                 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0x17ffffff);
2507                 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
2508         } else {
2509                 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
2510                 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
2511                 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff);
2512                 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
2513         }
2514         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2515                      V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
2516         return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2517                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2518 }
2519
2520 /**
2521  *      clear_sge_ctxt - completely clear an SGE context
2522  *      @adapter: the adapter
2523  *      @id: the context id
2524  *      @type: the context type
2525  *
2526  *      Completely clear an SGE context.  Used predominantly at post-reset
2527  *      initialization.  Note in particular that we don't skip writing to any
2528  *      "sensitive bits" in the contexts the way that t3_sge_write_context()
2529  *      does ...
2530  */
2531 static int clear_sge_ctxt(adapter_t *adap, unsigned int id, unsigned int type)
2532 {
2533         t3_write_reg(adap, A_SG_CONTEXT_DATA0, 0);
2534         t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0);
2535         t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0);
2536         t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0);
2537         t3_write_reg(adap, A_SG_CONTEXT_MASK0, 0xffffffff);
2538         t3_write_reg(adap, A_SG_CONTEXT_MASK1, 0xffffffff);
2539         t3_write_reg(adap, A_SG_CONTEXT_MASK2, 0xffffffff);
2540         t3_write_reg(adap, A_SG_CONTEXT_MASK3, 0xffffffff);
2541         t3_write_reg(adap, A_SG_CONTEXT_CMD,
2542                      V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
2543         return t3_wait_op_done(adap, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2544                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2545 }
2546
2547 /**
2548  *      t3_sge_init_ecntxt - initialize an SGE egress context
2549  *      @adapter: the adapter to configure
2550  *      @id: the context id
2551  *      @gts_enable: whether to enable GTS for the context
2552  *      @type: the egress context type
2553  *      @respq: associated response queue
2554  *      @base_addr: base address of queue
2555  *      @size: number of queue entries
2556  *      @token: uP token
2557  *      @gen: initial generation value for the context
2558  *      @cidx: consumer pointer
2559  *
2560  *      Initialize an SGE egress context and make it ready for use.  If the
2561  *      platform allows concurrent context operations, the caller is
2562  *      responsible for appropriate locking.
2563  */
2564 int t3_sge_init_ecntxt(adapter_t *adapter, unsigned int id, int gts_enable,
2565                        enum sge_context_type type, int respq, u64 base_addr,
2566                        unsigned int size, unsigned int token, int gen,
2567                        unsigned int cidx)
2568 {
2569         unsigned int credits = type == SGE_CNTXT_OFLD ? 0 : FW_WR_NUM;
2570
2571         if (base_addr & 0xfff)     /* must be 4K aligned */
2572                 return -EINVAL;
2573         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2574                 return -EBUSY;
2575
2576         base_addr >>= 12;
2577         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_EC_INDEX(cidx) |
2578                      V_EC_CREDITS(credits) | V_EC_GTS(gts_enable));
2579         t3_write_reg(adapter, A_SG_CONTEXT_DATA1, V_EC_SIZE(size) |
2580                      V_EC_BASE_LO((u32)base_addr & 0xffff));
2581         base_addr >>= 16;
2582         t3_write_reg(adapter, A_SG_CONTEXT_DATA2, (u32)base_addr);
2583         base_addr >>= 32;
2584         t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
2585                      V_EC_BASE_HI((u32)base_addr & 0xf) | V_EC_RESPQ(respq) |
2586                      V_EC_TYPE(type) | V_EC_GEN(gen) | V_EC_UP_TOKEN(token) |
2587                      F_EC_VALID);
2588         return t3_sge_write_context(adapter, id, F_EGRESS);
2589 }
2590
2591 /**
2592  *      t3_sge_init_flcntxt - initialize an SGE free-buffer list context
2593  *      @adapter: the adapter to configure
2594  *      @id: the context id
2595  *      @gts_enable: whether to enable GTS for the context
2596  *      @base_addr: base address of queue
2597  *      @size: number of queue entries
2598  *      @bsize: size of each buffer for this queue
2599  *      @cong_thres: threshold to signal congestion to upstream producers
2600  *      @gen: initial generation value for the context
2601  *      @cidx: consumer pointer
2602  *
2603  *      Initialize an SGE free list context and make it ready for use.  The
2604  *      caller is responsible for ensuring only one context operation occurs
2605  *      at a time.
2606  */
2607 int t3_sge_init_flcntxt(adapter_t *adapter, unsigned int id, int gts_enable,
2608                         u64 base_addr, unsigned int size, unsigned int bsize,
2609                         unsigned int cong_thres, int gen, unsigned int cidx)
2610 {
2611         if (base_addr & 0xfff)     /* must be 4K aligned */
2612                 return -EINVAL;
2613         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2614                 return -EBUSY;
2615
2616         base_addr >>= 12;
2617         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, (u32)base_addr);
2618         base_addr >>= 32;
2619         t3_write_reg(adapter, A_SG_CONTEXT_DATA1,
2620                      V_FL_BASE_HI((u32)base_addr) |
2621                      V_FL_INDEX_LO(cidx & M_FL_INDEX_LO));
2622         t3_write_reg(adapter, A_SG_CONTEXT_DATA2, V_FL_SIZE(size) |
2623                      V_FL_GEN(gen) | V_FL_INDEX_HI(cidx >> 12) |
2624                      V_FL_ENTRY_SIZE_LO(bsize & M_FL_ENTRY_SIZE_LO));
2625         t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
2626                      V_FL_ENTRY_SIZE_HI(bsize >> (32 - S_FL_ENTRY_SIZE_LO)) |
2627                      V_FL_CONG_THRES(cong_thres) | V_FL_GTS(gts_enable));
2628         return t3_sge_write_context(adapter, id, F_FREELIST);
2629 }
2630
2631 /**
2632  *      t3_sge_init_rspcntxt - initialize an SGE response queue context
2633  *      @adapter: the adapter to configure
2634  *      @id: the context id
2635  *      @irq_vec_idx: MSI-X interrupt vector index, 0 if no MSI-X, -1 if no IRQ
2636  *      @base_addr: base address of queue
2637  *      @size: number of queue entries
2638  *      @fl_thres: threshold for selecting the normal or jumbo free list
2639  *      @gen: initial generation value for the context
2640  *      @cidx: consumer pointer
2641  *
2642  *      Initialize an SGE response queue context and make it ready for use.
2643  *      The caller is responsible for ensuring only one context operation
2644  *      occurs at a time.
2645  */
2646 int t3_sge_init_rspcntxt(adapter_t *adapter, unsigned int id, int irq_vec_idx,
2647                          u64 base_addr, unsigned int size,
2648                          unsigned int fl_thres, int gen, unsigned int cidx)
2649 {
2650         unsigned int ctrl, intr = 0;
2651
2652         if (base_addr & 0xfff)     /* must be 4K aligned */
2653                 return -EINVAL;
2654         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2655                 return -EBUSY;
2656
2657         base_addr >>= 12;
2658         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size) |
2659                      V_CQ_INDEX(cidx));
2660         t3_write_reg(adapter, A_SG_CONTEXT_DATA1, (u32)base_addr);
2661         base_addr >>= 32;
2662         ctrl = t3_read_reg(adapter, A_SG_CONTROL);
2663         if ((irq_vec_idx > 0) ||
2664                 ((irq_vec_idx == 0) && !(ctrl & F_ONEINTMULTQ)))
2665                         intr = F_RQ_INTR_EN;
2666         if (irq_vec_idx >= 0)
2667                 intr |= V_RQ_MSI_VEC(irq_vec_idx);
2668         t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
2669                      V_CQ_BASE_HI((u32)base_addr) | intr | V_RQ_GEN(gen));
2670         t3_write_reg(adapter, A_SG_CONTEXT_DATA3, fl_thres);
2671         return t3_sge_write_context(adapter, id, F_RESPONSEQ);
2672 }
2673
2674 /**
2675  *      t3_sge_init_cqcntxt - initialize an SGE completion queue context
2676  *      @adapter: the adapter to configure
2677  *      @id: the context id
2678  *      @base_addr: base address of queue
2679  *      @size: number of queue entries
2680  *      @rspq: response queue for async notifications
2681  *      @ovfl_mode: CQ overflow mode
2682  *      @credits: completion queue credits
2683  *      @credit_thres: the credit threshold
2684  *
2685  *      Initialize an SGE completion queue context and make it ready for use.
2686  *      The caller is responsible for ensuring only one context operation
2687  *      occurs at a time.
2688  */
2689 int t3_sge_init_cqcntxt(adapter_t *adapter, unsigned int id, u64 base_addr,
2690                         unsigned int size, int rspq, int ovfl_mode,
2691                         unsigned int credits, unsigned int credit_thres)
2692 {
2693         if (base_addr & 0xfff)     /* must be 4K aligned */
2694                 return -EINVAL;
2695         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2696                 return -EBUSY;
2697
2698         base_addr >>= 12;
2699         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size));
2700         t3_write_reg(adapter, A_SG_CONTEXT_DATA1, (u32)base_addr);
2701         base_addr >>= 32;
2702         t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
2703                      V_CQ_BASE_HI((u32)base_addr) | V_CQ_RSPQ(rspq) |
2704                      V_CQ_GEN(1) | V_CQ_OVERFLOW_MODE(ovfl_mode) |
2705                      V_CQ_ERR(ovfl_mode));
2706         t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_CQ_CREDITS(credits) |
2707                      V_CQ_CREDIT_THRES(credit_thres));
2708         return t3_sge_write_context(adapter, id, F_CQ);
2709 }
2710
2711 /**
2712  *      t3_sge_enable_ecntxt - enable/disable an SGE egress context
2713  *      @adapter: the adapter
2714  *      @id: the egress context id
2715  *      @enable: enable (1) or disable (0) the context
2716  *
2717  *      Enable or disable an SGE egress context.  The caller is responsible for
2718  *      ensuring only one context operation occurs at a time.
2719  */
2720 int t3_sge_enable_ecntxt(adapter_t *adapter, unsigned int id, int enable)
2721 {
2722         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2723                 return -EBUSY;
2724
2725         t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
2726         t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2727         t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2728         t3_write_reg(adapter, A_SG_CONTEXT_MASK3, F_EC_VALID);
2729         t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_EC_VALID(enable));
2730         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2731                      V_CONTEXT_CMD_OPCODE(1) | F_EGRESS | V_CONTEXT(id));
2732         return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2733                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2734 }
2735
2736 /**
2737  *      t3_sge_disable_fl - disable an SGE free-buffer list
2738  *      @adapter: the adapter
2739  *      @id: the free list context id
2740  *
2741  *      Disable an SGE free-buffer list.  The caller is responsible for
2742  *      ensuring only one context operation occurs at a time.
2743  */
2744 int t3_sge_disable_fl(adapter_t *adapter, unsigned int id)
2745 {
2746         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2747                 return -EBUSY;
2748
2749         t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
2750         t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2751         t3_write_reg(adapter, A_SG_CONTEXT_MASK2, V_FL_SIZE(M_FL_SIZE));
2752         t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2753         t3_write_reg(adapter, A_SG_CONTEXT_DATA2, 0);
2754         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2755                      V_CONTEXT_CMD_OPCODE(1) | F_FREELIST | V_CONTEXT(id));
2756         return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2757                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2758 }
2759
2760 /**
2761  *      t3_sge_disable_rspcntxt - disable an SGE response queue
2762  *      @adapter: the adapter
2763  *      @id: the response queue context id
2764  *
2765  *      Disable an SGE response queue.  The caller is responsible for
2766  *      ensuring only one context operation occurs at a time.
2767  */
2768 int t3_sge_disable_rspcntxt(adapter_t *adapter, unsigned int id)
2769 {
2770         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2771                 return -EBUSY;
2772
2773         t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2774         t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2775         t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2776         t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2777         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2778         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2779                      V_CONTEXT_CMD_OPCODE(1) | F_RESPONSEQ | V_CONTEXT(id));
2780         return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2781                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2782 }
2783
2784 /**
2785  *      t3_sge_disable_cqcntxt - disable an SGE completion queue
2786  *      @adapter: the adapter
2787  *      @id: the completion queue context id
2788  *
2789  *      Disable an SGE completion queue.  The caller is responsible for
2790  *      ensuring only one context operation occurs at a time.
2791  */
2792 int t3_sge_disable_cqcntxt(adapter_t *adapter, unsigned int id)
2793 {
2794         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2795                 return -EBUSY;
2796
2797         t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2798         t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2799         t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2800         t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2801         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2802         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2803                      V_CONTEXT_CMD_OPCODE(1) | F_CQ | V_CONTEXT(id));
2804         return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2805                                0, SG_CONTEXT_CMD_ATTEMPTS, 1);
2806 }
2807
2808 /**
2809  *      t3_sge_cqcntxt_op - perform an operation on a completion queue context
2810  *      @adapter: the adapter
2811  *      @id: the context id
2812  *      @op: the operation to perform
2813  *      @credits: credits to return to the CQ
2814  *
2815  *      Perform the selected operation on an SGE completion queue context.
2816  *      The caller is responsible for ensuring only one context operation
2817  *      occurs at a time.
2818  *
2819  *      For most operations the function returns the current HW position in
2820  *      the completion queue.
2821  */
2822 int t3_sge_cqcntxt_op(adapter_t *adapter, unsigned int id, unsigned int op,
2823                       unsigned int credits)
2824 {
2825         u32 val;
2826
2827         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2828                 return -EBUSY;
2829
2830         t3_write_reg(adapter, A_SG_CONTEXT_DATA0, credits << 16);
2831         t3_write_reg(adapter, A_SG_CONTEXT_CMD, V_CONTEXT_CMD_OPCODE(op) |
2832                      V_CONTEXT(id) | F_CQ);
2833         if (t3_wait_op_done_val(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2834                                 0, SG_CONTEXT_CMD_ATTEMPTS, 1, &val))
2835                 return -EIO;
2836
2837         if (op >= 2 && op < 7) {
2838                 if (adapter->params.rev > 0)
2839                         return G_CQ_INDEX(val);
2840
2841                 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2842                              V_CONTEXT_CMD_OPCODE(0) | F_CQ | V_CONTEXT(id));
2843                 if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD,
2844                                     F_CONTEXT_CMD_BUSY, 0,
2845                                     SG_CONTEXT_CMD_ATTEMPTS, 1))
2846                         return -EIO;
2847                 return G_CQ_INDEX(t3_read_reg(adapter, A_SG_CONTEXT_DATA0));
2848         }
2849         return 0;
2850 }
2851
2852 /**
2853  *      t3_sge_read_context - read an SGE context
2854  *      @type: the context type
2855  *      @adapter: the adapter
2856  *      @id: the context id
2857  *      @data: holds the retrieved context
2858  *
2859  *      Read an SGE egress context.  The caller is responsible for ensuring
2860  *      only one context operation occurs at a time.
2861  */
2862 static int t3_sge_read_context(unsigned int type, adapter_t *adapter,
2863                                unsigned int id, u32 data[4])
2864 {
2865         if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2866                 return -EBUSY;
2867
2868         t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2869                      V_CONTEXT_CMD_OPCODE(0) | type | V_CONTEXT(id));
2870         if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 0,
2871                             SG_CONTEXT_CMD_ATTEMPTS, 1))
2872                 return -EIO;
2873         data[0] = t3_read_reg(adapter, A_SG_CONTEXT_DATA0);
2874         data[1] = t3_read_reg(adapter, A_SG_CONTEXT_DATA1);
2875         data[2] = t3_read_reg(adapter, A_SG_CONTEXT_DATA2);
2876         data[3] = t3_read_reg(adapter, A_SG_CONTEXT_DATA3);
2877         return 0;
2878 }
2879
2880 /**
2881  *      t3_sge_read_ecntxt - read an SGE egress context
2882  *      @adapter: the adapter
2883  *      @id: the context id
2884  *      @data: holds the retrieved context
2885  *
2886  *      Read an SGE egress context.  The caller is responsible for ensuring
2887  *      only one context operation occurs at a time.
2888  */
2889 int t3_sge_read_ecntxt(adapter_t *adapter, unsigned int id, u32 data[4])
2890 {
2891         if (id >= 65536)
2892                 return -EINVAL;
2893         return t3_sge_read_context(F_EGRESS, adapter, id, data);
2894 }
2895
2896 /**
2897  *      t3_sge_read_cq - read an SGE CQ context
2898  *      @adapter: the adapter
2899  *      @id: the context id
2900  *      @data: holds the retrieved context
2901  *
2902  *      Read an SGE CQ context.  The caller is responsible for ensuring
2903  *      only one context operation occurs at a time.
2904  */
2905 int t3_sge_read_cq(adapter_t *adapter, unsigned int id, u32 data[4])
2906 {
2907         if (id >= 65536)
2908                 return -EINVAL;
2909         return t3_sge_read_context(F_CQ, adapter, id, data);
2910 }
2911
2912 /**
2913  *      t3_sge_read_fl - read an SGE free-list context
2914  *      @adapter: the adapter
2915  *      @id: the context id
2916  *      @data: holds the retrieved context
2917  *
2918  *      Read an SGE free-list context.  The caller is responsible for ensuring
2919  *      only one context operation occurs at a time.
2920  */
2921 int t3_sge_read_fl(adapter_t *adapter, unsigned int id, u32 data[4])
2922 {
2923         if (id >= SGE_QSETS * 2)
2924                 return -EINVAL;
2925         return t3_sge_read_context(F_FREELIST, adapter, id, data);
2926 }
2927
2928 /**
2929  *      t3_sge_read_rspq - read an SGE response queue context
2930  *      @adapter: the adapter
2931  *      @id: the context id
2932  *      @data: holds the retrieved context
2933  *
2934  *      Read an SGE response queue context.  The caller is responsible for
2935  *      ensuring only one context operation occurs at a time.
2936  */
2937 int t3_sge_read_rspq(adapter_t *adapter, unsigned int id, u32 data[4])
2938 {
2939         if (id >= SGE_QSETS)
2940                 return -EINVAL;
2941         return t3_sge_read_context(F_RESPONSEQ, adapter, id, data);
2942 }
2943
2944 /**
2945  *      t3_config_rss - configure Rx packet steering
2946  *      @adapter: the adapter
2947  *      @rss_config: RSS settings (written to TP_RSS_CONFIG)
2948  *      @cpus: values for the CPU lookup table (0xff terminated)
2949  *      @rspq: values for the response queue lookup table (0xffff terminated)
2950  *
2951  *      Programs the receive packet steering logic.  @cpus and @rspq provide
2952  *      the values for the CPU and response queue lookup tables.  If they
2953  *      provide fewer values than the size of the tables the supplied values
2954  *      are used repeatedly until the tables are fully populated.
2955  */
2956 void t3_config_rss(adapter_t *adapter, unsigned int rss_config, const u8 *cpus,
2957                    const u16 *rspq)
2958 {
2959         int i, j, cpu_idx = 0, q_idx = 0;
2960
2961         if (cpus)
2962                 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2963                         u32 val = i << 16;
2964
2965                         for (j = 0; j < 2; ++j) {
2966                                 val |= (cpus[cpu_idx++] & 0x3f) << (8 * j);
2967                                 if (cpus[cpu_idx] == 0xff)
2968                                         cpu_idx = 0;
2969                         }
2970                         t3_write_reg(adapter, A_TP_RSS_LKP_TABLE, val);
2971                 }
2972
2973         if (rspq)
2974                 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2975                         t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
2976                                      (i << 16) | rspq[q_idx++]);
2977                         if (rspq[q_idx] == 0xffff)
2978                                 q_idx = 0;
2979                 }
2980
2981         t3_write_reg(adapter, A_TP_RSS_CONFIG, rss_config);
2982 }
2983
2984 /**
2985  *      t3_read_rss - read the contents of the RSS tables
2986  *      @adapter: the adapter
2987  *      @lkup: holds the contents of the RSS lookup table
2988  *      @map: holds the contents of the RSS map table
2989  *
2990  *      Reads the contents of the receive packet steering tables.
2991  */
2992 int t3_read_rss(adapter_t *adapter, u8 *lkup, u16 *map)
2993 {
2994         int i;
2995         u32 val;
2996
2997         if (lkup)
2998                 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2999                         t3_write_reg(adapter, A_TP_RSS_LKP_TABLE,
3000                                      0xffff0000 | i);
3001                         val = t3_read_reg(adapter, A_TP_RSS_LKP_TABLE);
3002                         if (!(val & 0x80000000))
3003                                 return -EAGAIN;
3004                         *lkup++ = (u8)val;
3005                         *lkup++ = (u8)(val >> 8);
3006                 }
3007
3008         if (map)
3009                 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
3010                         t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
3011                                      0xffff0000 | i);
3012                         val = t3_read_reg(adapter, A_TP_RSS_MAP_TABLE);
3013                         if (!(val & 0x80000000))
3014                                 return -EAGAIN;
3015                         *map++ = (u16)val;
3016                 }
3017         return 0;
3018 }
3019
3020 /**
3021  *      t3_tp_set_offload_mode - put TP in NIC/offload mode
3022  *      @adap: the adapter
3023  *      @enable: 1 to select offload mode, 0 for regular NIC
3024  *
3025  *      Switches TP to NIC/offload mode.
3026  */
3027 void t3_tp_set_offload_mode(adapter_t *adap, int enable)
3028 {
3029         if (is_offload(adap) || !enable)
3030                 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_NICMODE,
3031                                  V_NICMODE(!enable));
3032 }
3033
3034 /**
3035  *      tp_wr_bits_indirect - set/clear bits in an indirect TP register
3036  *      @adap: the adapter
3037  *      @addr: the indirect TP register address
3038  *      @mask: specifies the field within the register to modify
3039  *      @val: new value for the field
3040  *
3041  *      Sets a field of an indirect TP register to the given value.
3042  */
3043 static void tp_wr_bits_indirect(adapter_t *adap, unsigned int addr,
3044                                 unsigned int mask, unsigned int val)
3045 {
3046         t3_write_reg(adap, A_TP_PIO_ADDR, addr);
3047         val |= t3_read_reg(adap, A_TP_PIO_DATA) & ~mask;
3048         t3_write_reg(adap, A_TP_PIO_DATA, val);
3049 }
3050
3051 /**
3052  *      t3_enable_filters - enable the HW filters
3053  *      @adap: the adapter
3054  *
3055  *      Enables the HW filters for NIC traffic.
3056  */
3057 void t3_enable_filters(adapter_t *adap)
3058 {
3059         t3_set_reg_field(adap, A_TP_IN_CONFIG, F_NICMODE, 0);
3060         t3_set_reg_field(adap, A_MC5_DB_CONFIG, 0, F_FILTEREN);
3061         t3_set_reg_field(adap, A_TP_GLOBAL_CONFIG, 0, V_FIVETUPLELOOKUP(3));
3062         tp_wr_bits_indirect(adap, A_TP_INGRESS_CONFIG, 0, F_LOOKUPEVERYPKT);
3063 }
3064
3065 /**
3066  *      t3_disable_filters - disable the HW filters
3067  *      @adap: the adapter
3068  *
3069  *      Disables the HW filters for NIC traffic.
3070  */
3071 void t3_disable_filters(adapter_t *adap)
3072 {
3073         /* note that we don't want to revert to NIC-only mode */
3074         t3_set_reg_field(adap, A_MC5_DB_CONFIG, F_FILTEREN, 0);
3075         t3_set_reg_field(adap, A_TP_GLOBAL_CONFIG,
3076                          V_FIVETUPLELOOKUP(M_FIVETUPLELOOKUP), 0);
3077         tp_wr_bits_indirect(adap, A_TP_INGRESS_CONFIG, F_LOOKUPEVERYPKT, 0);
3078 }
3079
3080 /**
3081  *      pm_num_pages - calculate the number of pages of the payload memory
3082  *      @mem_size: the size of the payload memory
3083  *      @pg_size: the size of each payload memory page
3084  *
3085  *      Calculate the number of pages, each of the given size, that fit in a
3086  *      memory of the specified size, respecting the HW requirement that the
3087  *      number of pages must be a multiple of 24.
3088  */
3089 static inline unsigned int pm_num_pages(unsigned int mem_size,
3090                                         unsigned int pg_size)
3091 {
3092         unsigned int n = mem_size / pg_size;
3093
3094         return n - n % 24;
3095 }
3096
3097 #define mem_region(adap, start, size, reg) \
3098         t3_write_reg((adap), A_ ## reg, (start)); \
3099         start += size
3100
3101 /**
3102  *      partition_mem - partition memory and configure TP memory settings
3103  *      @adap: the adapter
3104  *      @p: the TP parameters
3105  *
3106  *      Partitions context and payload memory and configures TP's memory
3107  *      registers.
3108  */
3109 static void partition_mem(adapter_t *adap, const struct tp_params *p)
3110 {
3111         unsigned int m, pstructs, tids = t3_mc5_size(&adap->mc5);
3112         unsigned int timers = 0, timers_shift = 22;
3113
3114         if (adap->params.rev > 0) {
3115                 if (tids <= 16 * 1024) {
3116                         timers = 1;
3117                         timers_shift = 16;
3118                 } else if (tids <= 64 * 1024) {
3119                         timers = 2;
3120                         timers_shift = 18;
3121                 } else if (tids <= 256 * 1024) {
3122                         timers = 3;
3123                         timers_shift = 20;
3124                 }
3125         }
3126
3127         t3_write_reg(adap, A_TP_PMM_SIZE,
3128                      p->chan_rx_size | (p->chan_tx_size >> 16));
3129
3130         t3_write_reg(adap, A_TP_PMM_TX_BASE, 0);
3131         t3_write_reg(adap, A_TP_PMM_TX_PAGE_SIZE, p->tx_pg_size);
3132         t3_write_reg(adap, A_TP_PMM_TX_MAX_PAGE, p->tx_num_pgs);
3133         t3_set_reg_field(adap, A_TP_PARA_REG3, V_TXDATAACKIDX(M_TXDATAACKIDX),
3134                          V_TXDATAACKIDX(fls(p->tx_pg_size) - 12));
3135
3136         t3_write_reg(adap, A_TP_PMM_RX_BASE, 0);
3137         t3_write_reg(adap, A_TP_PMM_RX_PAGE_SIZE, p->rx_pg_size);
3138         t3_write_reg(adap, A_TP_PMM_RX_MAX_PAGE, p->rx_num_pgs);
3139
3140         pstructs = p->rx_num_pgs + p->tx_num_pgs;
3141         /* Add a bit of headroom and make multiple of 24 */
3142         pstructs += 48;
3143         pstructs -= pstructs % 24;
3144         t3_write_reg(adap, A_TP_CMM_MM_MAX_PSTRUCT, pstructs);
3145
3146         m = tids * TCB_SIZE;
3147         mem_region(adap, m, (64 << 10) * 64, SG_EGR_CNTX_BADDR);
3148         mem_region(adap, m, (64 << 10) * 64, SG_CQ_CONTEXT_BADDR);
3149         t3_write_reg(adap, A_TP_CMM_TIMER_BASE, V_CMTIMERMAXNUM(timers) | m);
3150         m += ((p->ntimer_qs - 1) << timers_shift) + (1 << 22);
3151         mem_region(adap, m, pstructs * 64, TP_CMM_MM_BASE);
3152         mem_region(adap, m, 64 * (pstructs / 24), TP_CMM_MM_PS_FLST_BASE);
3153         mem_region(adap, m, 64 * (p->rx_num_pgs / 24), TP_CMM_MM_RX_FLST_BASE);
3154         mem_region(adap, m, 64 * (p->tx_num_pgs / 24), TP_CMM_MM_TX_FLST_BASE);
3155
3156         m = (m + 4095) & ~0xfff;
3157         t3_write_reg(adap, A_CIM_SDRAM_BASE_ADDR, m);
3158         t3_write_reg(adap, A_CIM_SDRAM_ADDR_SIZE, p->cm_size - m);
3159
3160         tids = (p->cm_size - m - (3 << 20)) / 3072 - 32;
3161         m = t3_mc5_size(&adap->mc5) - adap->params.mc5.nservers -
3162             adap->params.mc5.nfilters - adap->params.mc5.nroutes;
3163         if (tids < m)
3164                 adap->params.mc5.nservers += m - tids;
3165 }
3166
3167 static inline void tp_wr_indirect(adapter_t *adap, unsigned int addr, u32 val)
3168 {
3169         t3_write_reg(adap, A_TP_PIO_ADDR, addr);
3170         t3_write_reg(adap, A_TP_PIO_DATA, val);
3171 }
3172
3173 static inline u32 tp_rd_indirect(adapter_t *adap, unsigned int addr)
3174 {
3175         t3_write_reg(adap, A_TP_PIO_ADDR, addr);
3176         return t3_read_reg(adap, A_TP_PIO_DATA);
3177 }
3178
3179 static void tp_config(adapter_t *adap, const struct tp_params *p)
3180 {
3181         t3_write_reg(adap, A_TP_GLOBAL_CONFIG, F_TXPACINGENABLE | F_PATHMTU |
3182                      F_IPCHECKSUMOFFLOAD | F_UDPCHECKSUMOFFLOAD |
3183                      F_TCPCHECKSUMOFFLOAD | V_IPTTL(64));
3184         t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) |
3185                      F_MTUENABLE | V_WINDOWSCALEMODE(1) |
3186                      V_TIMESTAMPSMODE(1) | V_SACKMODE(1) | V_SACKRX(1));
3187         t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) |
3188                      V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
3189                      V_BYTETHRESHOLD(26880) | V_MSSTHRESHOLD(2) |
3190                      F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1));
3191         t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO,
3192                          F_IPV6ENABLE | F_NICMODE);
3193         t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814);
3194         t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105);
3195         t3_set_reg_field(adap, A_TP_PARA_REG6, 0,
3196                          adap->params.rev > 0 ? F_ENABLEESND :
3197                                                 F_T3A_ENABLEESND);
3198         t3_set_reg_field(adap, A_TP_PC_CONFIG,
3199                          F_ENABLEEPCMDAFULL,
3200                          F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK |
3201                          F_TXCONGESTIONMODE | F_RXCONGESTIONMODE);
3202         t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL,
3203                          F_ENABLEIPV6RSS | F_ENABLENONOFDTNLSYN |
3204                          F_ENABLEARPMISS | F_DISBLEDAPARBIT0);
3205         t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080);
3206         t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000);
3207
3208         if (adap->params.rev > 0) {
3209                 tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE);
3210                 t3_set_reg_field(adap, A_TP_PARA_REG3, 0,
3211                                  F_TXPACEAUTO | F_TXPACEAUTOSTRICT);
3212                 t3_set_reg_field(adap, A_TP_PC_CONFIG, F_LOCKTID, F_LOCKTID);
3213                 tp_wr_indirect(adap, A_TP_VLAN_PRI_MAP, 0xfa50);
3214                 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP0, 0xfac688);
3215                 tp_wr_indirect(adap, A_TP_MAC_MATCH_MAP1, 0xfac688);
3216         } else
3217                 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEFIXED);
3218
3219         if (adap->params.rev == T3_REV_C)
3220                 t3_set_reg_field(adap, A_TP_PC_CONFIG,
3221                                  V_TABLELATENCYDELTA(M_TABLELATENCYDELTA),
3222                                  V_TABLELATENCYDELTA(4));
3223
3224         t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0);
3225         t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0);
3226         t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0);
3227         t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0xf2200000);
3228
3229         if (adap->params.nports > 2) {
3230                 t3_set_reg_field(adap, A_TP_PC_CONFIG2, 0,
3231                                  F_ENABLETXPORTFROMDA2 | F_ENABLETXPORTFROMDA |
3232                                  F_ENABLERXPORTFROMADDR);
3233                 tp_wr_bits_indirect(adap, A_TP_QOS_RX_MAP_MODE,
3234                                     V_RXMAPMODE(M_RXMAPMODE), 0);
3235                 tp_wr_indirect(adap, A_TP_INGRESS_CONFIG, V_BITPOS0(48) |
3236                                V_BITPOS1(49) | V_BITPOS2(50) | V_BITPOS3(51) |
3237                                F_ENABLEEXTRACT | F_ENABLEEXTRACTIONSFD |
3238                                F_ENABLEINSERTION | F_ENABLEINSERTIONSFD);
3239                 tp_wr_indirect(adap, A_TP_PREAMBLE_MSB, 0xfb000000);
3240                 tp_wr_indirect(adap, A_TP_PREAMBLE_LSB, 0xd5);
3241                 tp_wr_indirect(adap, A_TP_INTF_FROM_TX_PKT, F_INTFFROMTXPKT);
3242         }
3243 }
3244
3245 /* TCP timer values in ms */
3246 #define TP_DACK_TIMER 50
3247 #define TP_RTO_MIN    250
3248
3249 /**
3250  *      tp_set_timers - set TP timing parameters
3251  *      @adap: the adapter to set
3252  *      @core_clk: the core clock frequency in Hz
3253  *
3254  *      Set TP's timing parameters, such as the various timer resolutions and
3255  *      the TCP timer values.
3256  */
3257 static void tp_set_timers(adapter_t *adap, unsigned int core_clk)
3258 {
3259         unsigned int tre = adap->params.tp.tre;
3260         unsigned int dack_re = adap->params.tp.dack_re;
3261         unsigned int tstamp_re = fls(core_clk / 1000);     /* 1ms, at least */
3262         unsigned int tps = core_clk >> tre;
3263
3264         t3_write_reg(adap, A_TP_TIMER_RESOLUTION, V_TIMERRESOLUTION(tre) |
3265                      V_DELAYEDACKRESOLUTION(dack_re) |
3266                      V_TIMESTAMPRESOLUTION(tstamp_re));
3267         t3_write_reg(adap, A_TP_DACK_TIMER,
3268                      (core_clk >> dack_re) / (1000 / TP_DACK_TIMER));
3269         t3_write_reg(adap, A_TP_TCP_BACKOFF_REG0, 0x3020100);
3270         t3_write_reg(adap, A_TP_TCP_BACKOFF_REG1, 0x7060504);
3271         t3_write_reg(adap, A_TP_TCP_BACKOFF_REG2, 0xb0a0908);
3272         t3_write_reg(adap, A_TP_TCP_BACKOFF_REG3, 0xf0e0d0c);
3273         t3_write_reg(adap, A_TP_SHIFT_CNT, V_SYNSHIFTMAX(6) |
3274                      V_RXTSHIFTMAXR1(4) | V_RXTSHIFTMAXR2(15) |
3275                      V_PERSHIFTBACKOFFMAX(8) | V_PERSHIFTMAX(8) |
3276                      V_KEEPALIVEMAX(9));
3277
3278 #define SECONDS * tps
3279
3280         t3_write_reg(adap, A_TP_MSL,
3281                      adap->params.rev > 0 ? 0 : 2 SECONDS);
3282         t3_write_reg(adap, A_TP_RXT_MIN, tps / (1000 / TP_RTO_MIN));
3283         t3_write_reg(adap, A_TP_RXT_MAX, 64 SECONDS);
3284         t3_write_reg(adap, A_TP_PERS_MIN, 5 SECONDS);
3285         t3_write_reg(adap, A_TP_PERS_MAX, 64 SECONDS);
3286         t3_write_reg(adap, A_TP_KEEP_IDLE, 7200 SECONDS);
3287         t3_write_reg(adap, A_TP_KEEP_INTVL, 75 SECONDS);
3288         t3_write_reg(adap, A_TP_INIT_SRTT, 3 SECONDS);
3289         t3_write_reg(adap, A_TP_FINWAIT2_TIMER, 600 SECONDS);
3290
3291 #undef SECONDS
3292 }
3293
3294 /**
3295  *      t3_tp_set_coalescing_size - set receive coalescing size
3296  *      @adap: the adapter
3297  *      @size: the receive coalescing size
3298  *      @psh: whether a set PSH bit should deliver coalesced data
3299  *
3300  *      Set the receive coalescing size and PSH bit handling.
3301  */
3302 int t3_tp_set_coalescing_size(adapter_t *adap, unsigned int size, int psh)
3303 {
3304         u32 val;
3305
3306         if (size > MAX_RX_COALESCING_LEN)
3307                 return -EINVAL;
3308
3309         val = t3_read_reg(adap, A_TP_PARA_REG3);
3310         val &= ~(F_RXCOALESCEENABLE | F_RXCOALESCEPSHEN);
3311
3312         if (size) {
3313                 val |= F_RXCOALESCEENABLE;
3314                 if (psh)
3315                         val |= F_RXCOALESCEPSHEN;
3316                 size = min(MAX_RX_COALESCING_LEN, size);
3317                 t3_write_reg(adap, A_TP_PARA_REG2, V_RXCOALESCESIZE(size) |
3318                              V_MAXRXDATA(MAX_RX_COALESCING_LEN));
3319         }
3320         t3_write_reg(adap, A_TP_PARA_REG3, val);
3321         return 0;
3322 }
3323
3324 /**
3325  *      t3_tp_set_max_rxsize - set the max receive size
3326  *      @adap: the adapter
3327  *      @size: the max receive size
3328  *
3329  *      Set TP's max receive size.  This is the limit that applies when
3330  *      receive coalescing is disabled.
3331  */
3332 void t3_tp_set_max_rxsize(adapter_t *adap, unsigned int size)
3333 {
3334         t3_write_reg(adap, A_TP_PARA_REG7,
3335                      V_PMMAXXFERLEN0(size) | V_PMMAXXFERLEN1(size));
3336 }
3337
3338 static void __devinit init_mtus(unsigned short mtus[])
3339 {
3340         /*
3341          * See draft-mathis-plpmtud-00.txt for the values.  The min is 88 so
3342          * it can accommodate max size TCP/IP headers when SACK and timestamps
3343          * are enabled and still have at least 8 bytes of payload.
3344          */
3345         mtus[0] = 88;
3346         mtus[1] = 88;
3347         mtus[2] = 256;
3348         mtus[3] = 512;
3349         mtus[4] = 576;
3350         mtus[5] = 1024;
3351         mtus[6] = 1280;
3352         mtus[7] = 1492;
3353         mtus[8] = 1500;
3354         mtus[9] = 2002;
3355         mtus[10] = 2048;
3356         mtus[11] = 4096;
3357         mtus[12] = 4352;
3358         mtus[13] = 8192;
3359         mtus[14] = 9000;
3360         mtus[15] = 9600;
3361 }
3362
3363 /**
3364  *      init_cong_ctrl - initialize congestion control parameters
3365  *      @a: the alpha values for congestion control
3366  *      @b: the beta values for congestion control
3367  *
3368  *      Initialize the congestion control parameters.
3369  */
3370 static void __devinit init_cong_ctrl(unsigned short *a, unsigned short *b)
3371 {
3372         a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
3373         a[9] = 2;
3374         a[10] = 3;
3375         a[11] = 4;
3376         a[12] = 5;
3377         a[13] = 6;
3378         a[14] = 7;
3379         a[15] = 8;
3380         a[16] = 9;
3381         a[17] = 10;
3382         a[18] = 14;
3383         a[19] = 17;
3384         a[20] = 21;
3385         a[21] = 25;
3386         a[22] = 30;
3387         a[23] = 35;
3388         a[24] = 45;
3389         a[25] = 60;
3390         a[26] = 80;
3391         a[27] = 100;
3392         a[28] = 200;
3393         a[29] = 300;
3394         a[30] = 400;
3395         a[31] = 500;
3396
3397         b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
3398         b[9] = b[10] = 1;
3399         b[11] = b[12] = 2;
3400         b[13] = b[14] = b[15] = b[16] = 3;
3401         b[17] = b[18] = b[19] = b[20] = b[21] = 4;
3402         b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
3403         b[28] = b[29] = 6;
3404         b[30] = b[31] = 7;
3405 }
3406
3407 /* The minimum additive increment value for the congestion control table */
3408 #define CC_MIN_INCR 2U
3409
3410 /**
3411  *      t3_load_mtus - write the MTU and congestion control HW tables
3412  *      @adap: the adapter
3413  *      @mtus: the unrestricted values for the MTU table
3414  *      @alpha: the values for the congestion control alpha parameter
3415  *      @beta: the values for the congestion control beta parameter
3416  *      @mtu_cap: the maximum permitted effective MTU
3417  *
3418  *      Write the MTU table with the supplied MTUs capping each at &mtu_cap.
3419  *      Update the high-speed congestion control table with the supplied alpha,
3420  *      beta, and MTUs.
3421  */
3422 void t3_load_mtus(adapter_t *adap, unsigned short mtus[NMTUS],
3423                   unsigned short alpha[NCCTRL_WIN],
3424                   unsigned short beta[NCCTRL_WIN], unsigned short mtu_cap)
3425 {
3426         static const unsigned int avg_pkts[NCCTRL_WIN] = {
3427                 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
3428                 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
3429                 28672, 40960, 57344, 81920, 114688, 163840, 229376 };
3430
3431         unsigned int i, w;
3432
3433         for (i = 0; i < NMTUS; ++i) {
3434                 unsigned int mtu = min(mtus[i], mtu_cap);
3435                 unsigned int log2 = fls(mtu);
3436
3437                 if (!(mtu & ((1 << log2) >> 2)))     /* round */
3438                         log2--;
3439                 t3_write_reg(adap, A_TP_MTU_TABLE,
3440                              (i << 24) | (log2 << 16) | mtu);
3441
3442                 for (w = 0; w < NCCTRL_WIN; ++w) {
3443                         unsigned int inc;
3444
3445                         inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
3446                                   CC_MIN_INCR);
3447
3448                         t3_write_reg(adap, A_TP_CCTRL_TABLE, (i << 21) |
3449                                      (w << 16) | (beta[w] << 13) | inc);
3450                 }
3451         }
3452 }
3453
3454 /**
3455  *      t3_read_hw_mtus - returns the values in the HW MTU table
3456  *      @adap: the adapter
3457  *      @mtus: where to store the HW MTU values
3458  *
3459  *      Reads the HW MTU table.
3460  */
3461 void t3_read_hw_mtus(adapter_t *adap, unsigned short mtus[NMTUS])
3462 {
3463         int i;
3464
3465         for (i = 0; i < NMTUS; ++i) {
3466                 unsigned int val;
3467
3468                 t3_write_reg(adap, A_TP_MTU_TABLE, 0xff000000 | i);
3469                 val = t3_read_reg(adap, A_TP_MTU_TABLE);
3470                 mtus[i] = val & 0x3fff;
3471         }
3472 }
3473
3474 /**
3475  *      t3_get_cong_cntl_tab - reads the congestion control table
3476  *      @adap: the adapter
3477  *      @incr: where to store the alpha values
3478  *
3479  *      Reads the additive increments programmed into the HW congestion
3480  *      control table.
3481  */
3482 void t3_get_cong_cntl_tab(adapter_t *adap,
3483                           unsigned short incr[NMTUS][NCCTRL_WIN])
3484 {
3485         unsigned int mtu, w;
3486
3487         for (mtu = 0; mtu < NMTUS; ++mtu)
3488                 for (w = 0; w < NCCTRL_WIN; ++w) {
3489                         t3_write_reg(adap, A_TP_CCTRL_TABLE,
3490                                      0xffff0000 | (mtu << 5) | w);
3491                         incr[mtu][w] = (unsigned short)t3_read_reg(adap,
3492                                         A_TP_CCTRL_TABLE) & 0x1fff;
3493                 }
3494 }
3495
3496 /**
3497  *      t3_tp_get_mib_stats - read TP's MIB counters
3498  *      @adap: the adapter
3499  *      @tps: holds the returned counter values
3500  *
3501  *      Returns the values of TP's MIB counters.
3502  */
3503 void t3_tp_get_mib_stats(adapter_t *adap, struct tp_mib_stats *tps)
3504 {
3505         t3_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_RDATA, (u32 *)tps,
3506                          sizeof(*tps) / sizeof(u32), 0);
3507 }
3508
3509 /**
3510  *      t3_read_pace_tbl - read the pace table
3511  *      @adap: the adapter
3512  *      @pace_vals: holds the returned values
3513  *
3514  *      Returns the values of TP's pace table in nanoseconds.
3515  */
3516 void t3_read_pace_tbl(adapter_t *adap, unsigned int pace_vals[NTX_SCHED])
3517 {
3518         unsigned int i, tick_ns = dack_ticks_to_usec(adap, 1000);
3519
3520         for (i = 0; i < NTX_SCHED; i++) {
3521                 t3_write_reg(adap, A_TP_PACE_TABLE, 0xffff0000 + i);
3522                 pace_vals[i] = t3_read_reg(adap, A_TP_PACE_TABLE) * tick_ns;
3523         }
3524 }
3525
3526 /**
3527  *      t3_set_pace_tbl - set the pace table
3528  *      @adap: the adapter
3529  *      @pace_vals: the pace values in nanoseconds
3530  *      @start: index of the first entry in the HW pace table to set
3531  *      @n: how many entries to set
3532  *
3533  *      Sets (a subset of the) HW pace table.
3534  */
3535 void t3_set_pace_tbl(adapter_t *adap, unsigned int *pace_vals,
3536                      unsigned int start, unsigned int n)
3537 {
3538         unsigned int tick_ns = dack_ticks_to_usec(adap, 1000);
3539
3540         for ( ; n; n--, start++, pace_vals++)
3541                 t3_write_reg(adap, A_TP_PACE_TABLE, (start << 16) |
3542                              ((*pace_vals + tick_ns / 2) / tick_ns));
3543 }
3544
3545 #define ulp_region(adap, name, start, len) \
3546         t3_write_reg((adap), A_ULPRX_ ## name ## _LLIMIT, (start)); \
3547         t3_write_reg((adap), A_ULPRX_ ## name ## _ULIMIT, \
3548                      (start) + (len) - 1); \
3549         start += len
3550
3551 #define ulptx_region(adap, name, start, len) \
3552         t3_write_reg((adap), A_ULPTX_ ## name ## _LLIMIT, (start)); \
3553         t3_write_reg((adap), A_ULPTX_ ## name ## _ULIMIT, \
3554                      (start) + (len) - 1)
3555
3556 static void ulp_config(adapter_t *adap, const struct tp_params *p)
3557 {
3558         unsigned int m = p->chan_rx_size;
3559
3560         ulp_region(adap, ISCSI, m, p->chan_rx_size / 8);
3561         ulp_region(adap, TDDP, m, p->chan_rx_size / 8);
3562         ulptx_region(adap, TPT, m, p->chan_rx_size / 4);
3563         ulp_region(adap, STAG, m, p->chan_rx_size / 4);
3564         ulp_region(adap, RQ, m, p->chan_rx_size / 4);
3565         ulptx_region(adap, PBL, m, p->chan_rx_size / 4);
3566         ulp_region(adap, PBL, m, p->chan_rx_size / 4);
3567         t3_write_reg(adap, A_ULPRX_TDDP_TAGMASK, 0xffffffff);
3568 }
3569
3570
3571 /**
3572  *      t3_set_proto_sram - set the contents of the protocol sram
3573  *      @adapter: the adapter
3574  *      @data: the protocol image
3575  *
3576  *      Write the contents of the protocol SRAM.
3577  */
3578 int t3_set_proto_sram(adapter_t *adap, const u8 *data)
3579 {
3580         int i;
3581         const u32 *buf = (const u32 *)data;
3582
3583         for (i = 0; i < PROTO_SRAM_LINES; i++) {
3584                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD5, cpu_to_be32(*buf++));
3585                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD4, cpu_to_be32(*buf++));
3586                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD3, cpu_to_be32(*buf++));
3587                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD2, cpu_to_be32(*buf++));
3588                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD1, cpu_to_be32(*buf++));
3589
3590                 t3_write_reg(adap, A_TP_EMBED_OP_FIELD0, i << 1 | 1 << 31);
3591                 if (t3_wait_op_done(adap, A_TP_EMBED_OP_FIELD0, 1, 1, 5, 1))
3592                         return -EIO;
3593         }
3594         return 0;
3595 }
3596
3597 /**
3598  *      t3_config_trace_filter - configure one of the tracing filters
3599  *      @adapter: the adapter
3600  *      @tp: the desired trace filter parameters
3601  *      @filter_index: which filter to configure
3602  *      @invert: if set non-matching packets are traced instead of matching ones
3603  *      @enable: whether to enable or disable the filter
3604  *
3605  *      Configures one of the tracing filters available in HW.
3606  */
3607 void t3_config_trace_filter(adapter_t *adapter, const struct trace_params *tp,
3608                             int filter_index, int invert, int enable)
3609 {
3610         u32 addr, key[4], mask[4];
3611
3612         key[0] = tp->sport | (tp->sip << 16);
3613         key[1] = (tp->sip >> 16) | (tp->dport << 16);
3614         key[2] = tp->dip;
3615         key[3] = tp->proto | (tp->vlan << 8) | (tp->intf << 20);
3616
3617         mask[0] = tp->sport_mask | (tp->sip_mask << 16);
3618         mask[1] = (tp->sip_mask >> 16) | (tp->dport_mask << 16);
3619         mask[2] = tp->dip_mask;
3620         mask[3] = tp->proto_mask | (tp->vlan_mask << 8) | (tp->intf_mask << 20);
3621
3622         if (invert)
3623                 key[3] |= (1 << 29);
3624         if (enable)
3625                 key[3] |= (1 << 28);
3626
3627         addr = filter_index ? A_TP_RX_TRC_KEY0 : A_TP_TX_TRC_KEY0;
3628         tp_wr_indirect(adapter, addr++, key[0]);
3629         tp_wr_indirect(adapter, addr++, mask[0]);
3630         tp_wr_indirect(adapter, addr++, key[1]);
3631         tp_wr_indirect(adapter, addr++, mask[1]);
3632         tp_wr_indirect(adapter, addr++, key[2]);
3633         tp_wr_indirect(adapter, addr++, mask[2]);
3634         tp_wr_indirect(adapter, addr++, key[3]);
3635         tp_wr_indirect(adapter, addr,   mask[3]);
3636         (void) t3_read_reg(adapter, A_TP_PIO_DATA);
3637 }
3638
3639 /**
3640  *      t3_query_trace_filter - query a tracing filter
3641  *      @adapter: the adapter
3642  *      @tp: the current trace filter parameters
3643  *      @filter_index: which filter to query
3644  *      @inverted: non-zero if the filter is inverted
3645  *      @enabled: non-zero if the filter is enabled
3646  *
3647  *      Returns the current settings of the specified HW tracing filter.
3648  */
3649 void t3_query_trace_filter(adapter_t *adapter, struct trace_params *tp,
3650                            int filter_index, int *inverted, int *enabled)
3651 {
3652         u32 addr, key[4], mask[4];
3653
3654         addr = filter_index ? A_TP_RX_TRC_KEY0 : A_TP_TX_TRC_KEY0;
3655         key[0]  = tp_rd_indirect(adapter, addr++);
3656         mask[0] = tp_rd_indirect(adapter, addr++);
3657         key[1]  = tp_rd_indirect(adapter, addr++);
3658         mask[1] = tp_rd_indirect(adapter, addr++);
3659         key[2]  = tp_rd_indirect(adapter, addr++);
3660         mask[2] = tp_rd_indirect(adapter, addr++);
3661         key[3]  = tp_rd_indirect(adapter, addr++);
3662         mask[3] = tp_rd_indirect(adapter, addr);
3663
3664         tp->sport = key[0] & 0xffff;
3665         tp->sip   = (key[0] >> 16) | ((key[1] & 0xffff) << 16);
3666         tp->dport = key[1] >> 16;
3667         tp->dip   = key[2];
3668         tp->proto = key[3] & 0xff;
3669         tp->vlan  = key[3] >> 8;
3670         tp->intf  = key[3] >> 20;
3671
3672         tp->sport_mask = mask[0] & 0xffff;
3673         tp->sip_mask   = (mask[0] >> 16) | ((mask[1] & 0xffff) << 16);
3674         tp->dport_mask = mask[1] >> 16;
3675         tp->dip_mask   = mask[2];
3676         tp->proto_mask = mask[3] & 0xff;
3677         tp->vlan_mask  = mask[3] >> 8;
3678         tp->intf_mask  = mask[3] >> 20;
3679
3680         *inverted = key[3] & (1 << 29);
3681         *enabled  = key[3] & (1 << 28);
3682 }
3683
3684 /**
3685  *      t3_config_sched - configure a HW traffic scheduler
3686  *      @adap: the adapter
3687  *      @kbps: target rate in Kbps
3688  *      @sched: the scheduler index
3689  *
3690  *      Configure a Tx HW scheduler for the target rate.
3691  */
3692 int t3_config_sched(adapter_t *adap, unsigned int kbps, int sched)
3693 {
3694         unsigned int v, tps, cpt, bpt, delta, mindelta = ~0;
3695         unsigned int clk = adap->params.vpd.cclk * 1000;
3696         unsigned int selected_cpt = 0, selected_bpt = 0;
3697
3698         if (kbps > 0) {
3699                 kbps *= 125;     /* -> bytes */
3700                 for (cpt = 1; cpt <= 255; cpt++) {
3701                         tps = clk / cpt;
3702                         bpt = (kbps + tps / 2) / tps;
3703                         if (bpt > 0 && bpt <= 255) {
3704                                 v = bpt * tps;
3705                                 delta = v >= kbps ? v - kbps : kbps - v;
3706                                 if (delta < mindelta) {
3707                                         mindelta = delta;
3708                                         selected_cpt = cpt;
3709                                         selected_bpt = bpt;
3710                                 }
3711                         } else if (selected_cpt)
3712                                 break;
3713                 }
3714                 if (!selected_cpt)
3715                         return -EINVAL;
3716         }
3717         t3_write_reg(adap, A_TP_TM_PIO_ADDR,
3718                      A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2);
3719         v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
3720         if (sched & 1)
3721                 v = (v & 0xffff) | (selected_cpt << 16) | (selected_bpt << 24);
3722         else
3723                 v = (v & 0xffff0000) | selected_cpt | (selected_bpt << 8);
3724         t3_write_reg(adap, A_TP_TM_PIO_DATA, v);
3725         return 0;
3726 }
3727
3728 /**
3729  *      t3_set_sched_ipg - set the IPG for a Tx HW packet rate scheduler
3730  *      @adap: the adapter
3731  *      @sched: the scheduler index
3732  *      @ipg: the interpacket delay in tenths of nanoseconds
3733  *
3734  *      Set the interpacket delay for a HW packet rate scheduler.
3735  */
3736 int t3_set_sched_ipg(adapter_t *adap, int sched, unsigned int ipg)
3737 {
3738         unsigned int v, addr = A_TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR - sched / 2;
3739
3740         /* convert ipg to nearest number of core clocks */
3741         ipg *= core_ticks_per_usec(adap);
3742         ipg = (ipg + 5000) / 10000;
3743         if (ipg > 0xffff)
3744                 return -EINVAL;
3745
3746         t3_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3747         v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
3748         if (sched & 1)
3749                 v = (v & 0xffff) | (ipg << 16);
3750         else
3751                 v = (v & 0xffff0000) | ipg;
3752         t3_write_reg(adap, A_TP_TM_PIO_DATA, v);
3753         t3_read_reg(adap, A_TP_TM_PIO_DATA);
3754         return 0;
3755 }
3756
3757 /**
3758  *      t3_get_tx_sched - get the configuration of a Tx HW traffic scheduler
3759  *      @adap: the adapter
3760  *      @sched: the scheduler index
3761  *      @kbps: the byte rate in Kbps
3762  *      @ipg: the interpacket delay in tenths of nanoseconds
3763  *
3764  *      Return the current configuration of a HW Tx scheduler.
3765  */
3766 void t3_get_tx_sched(adapter_t *adap, unsigned int sched, unsigned int *kbps,
3767                      unsigned int *ipg)
3768 {
3769         unsigned int v, addr, bpt, cpt;
3770
3771         if (kbps) {
3772                 addr = A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2;
3773                 t3_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3774                 v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
3775                 if (sched & 1)
3776                         v >>= 16;
3777                 bpt = (v >> 8) & 0xff;
3778                 cpt = v & 0xff;
3779                 if (!cpt)
3780                         *kbps = 0;        /* scheduler disabled */
3781                 else {
3782                         v = (adap->params.vpd.cclk * 1000) / cpt;
3783                         *kbps = (v * bpt) / 125;
3784                 }
3785         }
3786         if (ipg) {
3787                 addr = A_TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR - sched / 2;
3788                 t3_write_reg(adap, A_TP_TM_PIO_ADDR, addr);
3789                 v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
3790                 if (sched & 1)
3791                         v >>= 16;
3792                 v &= 0xffff;
3793                 *ipg = (10000 * v) / core_ticks_per_usec(adap);
3794         }
3795 }
3796
3797 /**
3798  *      tp_init - configure TP
3799  *      @adap: the adapter
3800  *      @p: TP configuration parameters
3801  *
3802  *      Initializes the TP HW module.
3803  */
3804 static int tp_init(adapter_t *adap, const struct tp_params *p)
3805 {
3806         int busy = 0;
3807
3808         tp_config(adap, p);
3809         t3_set_vlan_accel(adap, 3, 0);
3810
3811         if (is_offload(adap)) {
3812                 tp_set_timers(adap, adap->params.vpd.cclk * 1000);
3813                 t3_write_reg(adap, A_TP_RESET, F_FLSTINITENABLE);
3814                 busy = t3_wait_op_done(adap, A_TP_RESET, F_FLSTINITENABLE,
3815                                        0, 1000, 5);
3816                 if (busy)
3817                         CH_ERR(adap, "TP initialization timed out\n");
3818         }
3819
3820         if (!busy)
3821                 t3_write_reg(adap, A_TP_RESET, F_TPRESET);
3822         return busy;
3823 }
3824
3825 /**
3826  *      t3_mps_set_active_ports - configure port failover
3827  *      @adap: the adapter
3828  *      @port_mask: bitmap of active ports
3829  *
3830  *      Sets the active ports according to the supplied bitmap.
3831  */
3832 int t3_mps_set_active_ports(adapter_t *adap, unsigned int port_mask)
3833 {
3834         if (port_mask & ~((1 << adap->params.nports) - 1))
3835                 return -EINVAL;
3836         t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE | F_PORT0ACTIVE,
3837                          port_mask << S_PORT0ACTIVE);
3838         return 0;
3839 }
3840
3841 /**
3842  *      chan_init_hw - channel-dependent HW initialization
3843  *      @adap: the adapter
3844  *      @chan_map: bitmap of Tx channels being used
3845  *
3846  *      Perform the bits of HW initialization that are dependent on the Tx
3847  *      channels being used.
3848  */
3849 static void chan_init_hw(adapter_t *adap, unsigned int chan_map)
3850 {
3851         int i;
3852
3853         if (chan_map != 3) {                                 /* one channel */
3854                 t3_set_reg_field(adap, A_ULPRX_CTL, F_ROUND_ROBIN, 0);
3855                 t3_set_reg_field(adap, A_ULPTX_CONFIG, F_CFG_RR_ARB, 0);
3856                 t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_ENFORCEPKT |
3857                              (chan_map == 1 ? F_TPTXPORT0EN | F_PORT0ACTIVE :
3858                                               F_TPTXPORT1EN | F_PORT1ACTIVE));
3859                 t3_write_reg(adap, A_PM1_TX_CFG,
3860                              chan_map == 1 ? 0xffffffff : 0);
3861                 if (chan_map == 2)
3862                         t3_write_reg(adap, A_TP_TX_MOD_QUEUE_REQ_MAP,
3863                                      V_TX_MOD_QUEUE_REQ_MAP(0xff));
3864                 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE, (12 << 16) | 0xd9c8);
3865                 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE, (13 << 16) | 0xfbea);
3866         } else {                                             /* two channels */
3867                 t3_set_reg_field(adap, A_ULPRX_CTL, 0, F_ROUND_ROBIN);
3868                 t3_set_reg_field(adap, A_ULPTX_CONFIG, 0, F_CFG_RR_ARB);
3869                 t3_write_reg(adap, A_ULPTX_DMA_WEIGHT,
3870                              V_D1_WEIGHT(16) | V_D0_WEIGHT(16));
3871                 t3_write_reg(adap, A_MPS_CFG, F_TPTXPORT0EN | F_TPTXPORT1EN |
3872                              F_TPRXPORTEN | F_PORT0ACTIVE | F_PORT1ACTIVE |
3873                              F_ENFORCEPKT);
3874                 t3_write_reg(adap, A_PM1_TX_CFG, 0x80008000);
3875                 t3_set_reg_field(adap, A_TP_PC_CONFIG, 0, F_TXTOSQUEUEMAPMODE);
3876                 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_REQ_MAP,
3877                              V_TX_MOD_QUEUE_REQ_MAP(0xaa));
3878                 for (i = 0; i < 16; i++)
3879                         t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE,
3880                                      (i << 16) | 0x1010);
3881                 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE, (12 << 16) | 0xba98);
3882                 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE, (13 << 16) | 0xfedc);
3883         }
3884 }
3885
3886 static int calibrate_xgm(adapter_t *adapter)
3887 {
3888         if (uses_xaui(adapter)) {
3889                 unsigned int v, i;
3890
3891                 for (i = 0; i < 5; ++i) {
3892                         t3_write_reg(adapter, A_XGM_XAUI_IMP, 0);
3893                         (void) t3_read_reg(adapter, A_XGM_XAUI_IMP);
3894                         msleep(1);
3895                         v = t3_read_reg(adapter, A_XGM_XAUI_IMP);
3896                         if (!(v & (F_XGM_CALFAULT | F_CALBUSY))) {
3897                                 t3_write_reg(adapter, A_XGM_XAUI_IMP,
3898                                              V_XAUIIMP(G_CALIMP(v) >> 2));
3899                                 return 0;
3900                         }
3901                 }
3902                 CH_ERR(adapter, "MAC calibration failed\n");
3903                 return -1;
3904         } else {
3905                 t3_write_reg(adapter, A_XGM_RGMII_IMP,
3906                              V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
3907                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
3908                                  F_XGM_IMPSETUPDATE);
3909         }
3910         return 0;
3911 }
3912
3913 static void calibrate_xgm_t3b(adapter_t *adapter)
3914 {
3915         if (!uses_xaui(adapter)) {
3916                 t3_write_reg(adapter, A_XGM_RGMII_IMP, F_CALRESET |
3917                              F_CALUPDATE | V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
3918                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALRESET, 0);
3919                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0,
3920                                  F_XGM_IMPSETUPDATE);
3921                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
3922                                  0);
3923                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALUPDATE, 0);
3924                 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0, F_CALUPDATE);
3925         }
3926 }
3927
3928 struct mc7_timing_params {
3929         unsigned char ActToPreDly;
3930         unsigned char ActToRdWrDly;
3931         unsigned char PreCyc;
3932         unsigned char RefCyc[5];
3933         unsigned char BkCyc;
3934         unsigned char WrToRdDly;
3935         unsigned char RdToWrDly;
3936 };
3937
3938 /*
3939  * Write a value to a register and check that the write completed.  These
3940  * writes normally complete in a cycle or two, so one read should suffice.
3941  * The very first read exists to flush the posted write to the device.
3942  */
3943 static int wrreg_wait(adapter_t *adapter, unsigned int addr, u32 val)
3944 {
3945         t3_write_reg(adapter,   addr, val);
3946         (void) t3_read_reg(adapter, addr);                   /* flush */
3947         if (!(t3_read_reg(adapter, addr) & F_BUSY))
3948                 return 0;
3949         CH_ERR(adapter, "write to MC7 register 0x%x timed out\n", addr);
3950         return -EIO;
3951 }
3952
3953 static int mc7_init(struct mc7 *mc7, unsigned int mc7_clock, int mem_type)
3954 {
3955         static const unsigned int mc7_mode[] = {
3956                 0x632, 0x642, 0x652, 0x432, 0x442
3957         };
3958         static const struct mc7_timing_params mc7_timings[] = {
3959                 { 12, 3, 4, { 20, 28, 34, 52, 0 }, 15, 6, 4 },
3960                 { 12, 4, 5, { 20, 28, 34, 52, 0 }, 16, 7, 4 },
3961                 { 12, 5, 6, { 20, 28, 34, 52, 0 }, 17, 8, 4 },
3962                 { 9,  3, 4, { 15, 21, 26, 39, 0 }, 12, 6, 4 },
3963                 { 9,  4, 5, { 15, 21, 26, 39, 0 }, 13, 7, 4 }
3964         };
3965
3966         u32 val;
3967         unsigned int width, density, slow, attempts;
3968         adapter_t *adapter = mc7->adapter;
3969         const struct mc7_timing_params *p = &mc7_timings[mem_type];
3970
3971         if (!mc7->size)
3972                 return 0;
3973
3974         val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
3975         slow = val & F_SLOW;
3976         width = G_WIDTH(val);
3977         density = G_DEN(val);
3978
3979         t3_write_reg(adapter, mc7->offset + A_MC7_CFG, val | F_IFEN);
3980         val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);  /* flush */
3981         msleep(1);
3982
3983         if (!slow) {
3984                 t3_write_reg(adapter, mc7->offset + A_MC7_CAL, F_SGL_CAL_EN);
3985                 (void) t3_read_reg(adapter, mc7->offset + A_MC7_CAL);
3986                 msleep(1);
3987                 if (t3_read_reg(adapter, mc7->offset + A_MC7_CAL) &
3988                     (F_BUSY | F_SGL_CAL_EN | F_CAL_FAULT)) {
3989                         CH_ERR(adapter, "%s MC7 calibration timed out\n",
3990                                mc7->name);
3991                         goto out_fail;
3992                 }
3993         }
3994
3995         t3_write_reg(adapter, mc7->offset + A_MC7_PARM,
3996                      V_ACTTOPREDLY(p->ActToPreDly) |
3997                      V_ACTTORDWRDLY(p->ActToRdWrDly) | V_PRECYC(p->PreCyc) |
3998                      V_REFCYC(p->RefCyc[density]) | V_BKCYC(p->BkCyc) |
3999                      V_WRTORDDLY(p->WrToRdDly) | V_RDTOWRDLY(p->RdToWrDly));
4000
4001         t3_write_reg(adapter, mc7->offset + A_MC7_CFG,
4002                      val | F_CLKEN | F_TERM150);
4003         (void) t3_read_reg(adapter, mc7->offset + A_MC7_CFG); /* flush */
4004
4005         if (!slow)
4006                 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL, F_DLLENB,
4007                                  F_DLLENB);
4008         udelay(1);
4009
4010         val = slow ? 3 : 6;
4011         if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
4012             wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE2, 0) ||
4013             wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE3, 0) ||
4014             wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
4015                 goto out_fail;
4016
4017         if (!slow) {
4018                 t3_write_reg(adapter, mc7->offset + A_MC7_MODE, 0x100);
4019                 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL,
4020                                  F_DLLRST, 0);
4021                 udelay(5);
4022         }
4023
4024         if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
4025             wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
4026             wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
4027             wrreg_wait(adapter, mc7->offset + A_MC7_MODE,
4028                        mc7_mode[mem_type]) ||
4029             wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val | 0x380) ||
4030             wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
4031                 goto out_fail;
4032
4033         /* clock value is in KHz */
4034         mc7_clock = mc7_clock * 7812 + mc7_clock / 2;  /* ns */
4035         mc7_clock /= 1000000;                          /* KHz->MHz, ns->us */
4036
4037         t3_write_reg(adapter, mc7->offset + A_MC7_REF,
4038                      F_PERREFEN | V_PREREFDIV(mc7_clock));
4039         (void) t3_read_reg(adapter, mc7->offset + A_MC7_REF); /* flush */
4040
4041         t3_write_reg(adapter, mc7->offset + A_MC7_ECC,
4042                      F_ECCGENEN | F_ECCCHKEN);
4043         t3_write_reg(adapter, mc7->offset + A_MC7_BIST_DATA, 0);
4044         t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_BEG, 0);
4045         t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_END,
4046                      (mc7->size << width) - 1);
4047         t3_write_reg(adapter, mc7->offset + A_MC7_BIST_OP, V_OP(1));
4048         (void) t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP); /* flush */
4049
4050         attempts = 50;
4051         do {
4052                 msleep(250);
4053                 val = t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP);
4054         } while ((val & F_BUSY) && --attempts);
4055         if (val & F_BUSY) {
4056                 CH_ERR(adapter, "%s MC7 BIST timed out\n", mc7->name);
4057                 goto out_fail;
4058         }
4059
4060         /* Enable normal memory accesses. */
4061         t3_set_reg_field(adapter, mc7->offset + A_MC7_CFG, 0, F_RDY);
4062         return 0;
4063
4064  out_fail:
4065         return -1;
4066 }
4067
4068 static void config_pcie(adapter_t *adap)
4069 {
4070         static const u16 ack_lat[4][6] = {
4071                 { 237, 416, 559, 1071, 2095, 4143 },
4072                 { 128, 217, 289, 545, 1057, 2081 },
4073                 { 73, 118, 154, 282, 538, 1050 },
4074                 { 67, 107, 86, 150, 278, 534 }
4075         };
4076         static const u16 rpl_tmr[4][6] = {
4077                 { 711, 1248, 1677, 3213, 6285, 12429 },
4078                 { 384, 651, 867, 1635, 3171, 6243 },
4079                 { 219, 354, 462, 846, 1614, 3150 },
4080                 { 201, 321, 258, 450, 834, 1602 }
4081         };
4082
4083         u16 val, devid;
4084         unsigned int log2_width, pldsize;
4085         unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt;
4086
4087         t3_os_pci_read_config_2(adap,
4088                                 adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
4089                                 &val);
4090         pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
4091
4092         /*
4093          * Gen2 adapter pcie bridge compatibility requires minimum
4094          * Max_Read_Request_size
4095          */
4096         t3_os_pci_read_config_2(adap, 0x2, &devid);
4097         if (devid == 0x37) {
4098                 t3_os_pci_write_config_2(adap,
4099                     adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
4100                     val & ~PCI_EXP_DEVCTL_READRQ & ~PCI_EXP_DEVCTL_PAYLOAD);
4101                 pldsize = 0;
4102         }
4103
4104         t3_os_pci_read_config_2(adap,
4105                                 adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL,
4106                                 &val);
4107
4108         fst_trn_tx = G_NUMFSTTRNSEQ(t3_read_reg(adap, A_PCIE_PEX_CTRL0));
4109         fst_trn_rx = adap->params.rev == 0 ? fst_trn_tx :
4110                         G_NUMFSTTRNSEQRX(t3_read_reg(adap, A_PCIE_MODE));
4111         log2_width = fls(adap->params.pci.width) - 1;
4112         acklat = ack_lat[log2_width][pldsize];
4113         if (val & 1)                            /* check LOsEnable */
4114                 acklat += fst_trn_tx * 4;
4115         rpllmt = rpl_tmr[log2_width][pldsize] + fst_trn_rx * 4;
4116
4117         if (adap->params.rev == 0)
4118                 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1,
4119                                  V_T3A_ACKLAT(M_T3A_ACKLAT),
4120                                  V_T3A_ACKLAT(acklat));
4121         else
4122                 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1, V_ACKLAT(M_ACKLAT),
4123                                  V_ACKLAT(acklat));
4124
4125         t3_set_reg_field(adap, A_PCIE_PEX_CTRL0, V_REPLAYLMT(M_REPLAYLMT),
4126                          V_REPLAYLMT(rpllmt));
4127
4128         t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff);
4129         t3_set_reg_field(adap, A_PCIE_CFG, 0,
4130                          F_ENABLELINKDWNDRST | F_ENABLELINKDOWNRST |
4131                          F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN);
4132 }
4133
4134 /**
4135  *      t3_init_hw - initialize and configure T3 HW modules
4136  *      @adapter: the adapter
4137  *      @fw_params: initial parameters to pass to firmware (optional)
4138  *
4139  *      Initialize and configure T3 HW modules.  This performs the
4140  *      initialization steps that need to be done once after a card is reset.
4141  *      MAC and PHY initialization is handled separarely whenever a port is
4142  *      enabled.
4143  *
4144  *      @fw_params are passed to FW and their value is platform dependent.
4145  *      Only the top 8 bits are available for use, the rest must be 0.
4146  */
4147 int t3_init_hw(adapter_t *adapter, u32 fw_params)
4148 {
4149         int err = -EIO, attempts, i;
4150         const struct vpd_params *vpd = &adapter->params.vpd;
4151
4152         if (adapter->params.rev > 0)
4153                 calibrate_xgm_t3b(adapter);
4154         else if (calibrate_xgm(adapter))
4155                 goto out_err;
4156
4157         if (adapter->params.nports > 2)
4158                 t3_mac_init(&adap2pinfo(adapter, 0)->mac);
4159
4160         if (vpd->mclk) {
4161                 partition_mem(adapter, &adapter->params.tp);
4162
4163                 if (mc7_init(&adapter->pmrx, vpd->mclk, vpd->mem_timing) ||
4164                     mc7_init(&adapter->pmtx, vpd->mclk, vpd->mem_timing) ||
4165                     mc7_init(&adapter->cm, vpd->mclk, vpd->mem_timing) ||
4166                     t3_mc5_init(&adapter->mc5, adapter->params.mc5.nservers,
4167                                 adapter->params.mc5.nfilters,
4168                                 adapter->params.mc5.nroutes))
4169                         goto out_err;
4170
4171                 for (i = 0; i < 32; i++)
4172                         if (clear_sge_ctxt(adapter, i, F_CQ))
4173                                 goto out_err;
4174         }
4175
4176         if (tp_init(adapter, &adapter->params.tp))
4177                 goto out_err;
4178
4179         t3_tp_set_coalescing_size(adapter,
4180                                   min(adapter->params.sge.max_pkt_size,
4181                                       MAX_RX_COALESCING_LEN), 1);
4182         t3_tp_set_max_rxsize(adapter,
4183                              min(adapter->params.sge.max_pkt_size, 16384U));
4184         ulp_config(adapter, &adapter->params.tp);
4185         if (is_pcie(adapter))
4186                 config_pcie(adapter);
4187         else
4188                 t3_set_reg_field(adapter, A_PCIX_CFG, 0,
4189                                  F_DMASTOPEN | F_CLIDECEN);
4190
4191         if (adapter->params.rev == T3_REV_C)
4192                 t3_set_reg_field(adapter, A_ULPTX_CONFIG, 0,
4193                                  F_CFG_CQE_SOP_MASK);
4194
4195         t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff);
4196         t3_write_reg(adapter, A_PM1_RX_MODE, 0);
4197         t3_write_reg(adapter, A_PM1_TX_MODE, 0);
4198         chan_init_hw(adapter, adapter->params.chan_map);
4199         t3_sge_init(adapter, &adapter->params.sge);
4200         t3_set_reg_field(adapter, A_PL_RST, 0, F_FATALPERREN);
4201
4202         t3_write_reg(adapter, A_T3DBG_GPIO_ACT_LOW, calc_gpio_intr(adapter));
4203
4204         t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params);
4205         t3_write_reg(adapter, A_CIM_BOOT_CFG,
4206                      V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2));
4207         (void) t3_read_reg(adapter, A_CIM_BOOT_CFG);    /* flush */
4208
4209         attempts = 100;
4210         do {                          /* wait for uP to initialize */
4211                 msleep(20);
4212         } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts);
4213         if (!attempts) {
4214                 CH_ERR(adapter, "uP initialization timed out\n");
4215                 goto out_err;
4216         }
4217
4218         err = 0;
4219  out_err:
4220         return err;
4221 }
4222
4223 /**
4224  *      get_pci_mode - determine a card's PCI mode
4225  *      @adapter: the adapter
4226  *      @p: where to store the PCI settings
4227  *
4228  *      Determines a card's PCI mode and associated parameters, such as speed
4229  *      and width.
4230  */
4231 static void __devinit get_pci_mode(adapter_t *adapter, struct pci_params *p)
4232 {
4233         static unsigned short speed_map[] = { 33, 66, 100, 133 };
4234         u32 pci_mode, pcie_cap;
4235
4236         pcie_cap = t3_os_find_pci_capability(adapter, PCI_CAP_ID_EXP);
4237         if (pcie_cap) {
4238                 u16 val;
4239
4240                 p->variant = PCI_VARIANT_PCIE;
4241                 p->pcie_cap_addr = pcie_cap;
4242                 t3_os_pci_read_config_2(adapter, pcie_cap + PCI_EXP_LNKSTA,
4243                                         &val);
4244                 p->width = (val >> 4) & 0x3f;
4245                 return;
4246         }
4247
4248         pci_mode = t3_read_reg(adapter, A_PCIX_MODE);
4249         p->speed = speed_map[G_PCLKRANGE(pci_mode)];
4250         p->width = (pci_mode & F_64BIT) ? 64 : 32;
4251         pci_mode = G_PCIXINITPAT(pci_mode);
4252         if (pci_mode == 0)
4253                 p->variant = PCI_VARIANT_PCI;
4254         else if (pci_mode < 4)
4255                 p->variant = PCI_VARIANT_PCIX_MODE1_PARITY;
4256         else if (pci_mode < 8)
4257                 p->variant = PCI_VARIANT_PCIX_MODE1_ECC;
4258         else
4259                 p->variant = PCI_VARIANT_PCIX_266_MODE2;
4260 }
4261
4262 /**
4263  *      init_link_config - initialize a link's SW state
4264  *      @lc: structure holding the link state
4265  *      @caps: link capabilities
4266  *
4267  *      Initializes the SW state maintained for each link, including the link's
4268  *      capabilities and default speed/duplex/flow-control/autonegotiation
4269  *      settings.
4270  */
4271 static void __devinit init_link_config(struct link_config *lc,
4272                                        unsigned int caps)
4273 {
4274         lc->supported = caps;
4275         lc->requested_speed = lc->speed = SPEED_INVALID;
4276         lc->requested_duplex = lc->duplex = DUPLEX_INVALID;
4277         lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
4278         if (lc->supported & SUPPORTED_Autoneg) {
4279                 lc->advertising = lc->supported;
4280                 lc->autoneg = AUTONEG_ENABLE;
4281                 lc->requested_fc |= PAUSE_AUTONEG;
4282         } else {
4283                 lc->advertising = 0;
4284                 lc->autoneg = AUTONEG_DISABLE;
4285         }
4286 }
4287
4288 /**
4289  *      mc7_calc_size - calculate MC7 memory size
4290  *      @cfg: the MC7 configuration
4291  *
4292  *      Calculates the size of an MC7 memory in bytes from the value of its
4293  *      configuration register.
4294  */
4295 static unsigned int __devinit mc7_calc_size(u32 cfg)
4296 {
4297         unsigned int width = G_WIDTH(cfg);
4298         unsigned int banks = !!(cfg & F_BKS) + 1;
4299         unsigned int org = !!(cfg & F_ORG) + 1;
4300         unsigned int density = G_DEN(cfg);
4301         unsigned int MBs = ((256 << density) * banks) / (org << width);
4302
4303         return MBs << 20;
4304 }
4305
4306 static void __devinit mc7_prep(adapter_t *adapter, struct mc7 *mc7,
4307                                unsigned int base_addr, const char *name)
4308 {
4309         u32 cfg;
4310
4311         mc7->adapter = adapter;
4312         mc7->name = name;
4313         mc7->offset = base_addr - MC7_PMRX_BASE_ADDR;
4314         cfg = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
4315         mc7->size = G_DEN(cfg) == M_DEN ? 0 : mc7_calc_size(cfg);
4316         mc7->width = G_WIDTH(cfg);
4317 }
4318
4319 void mac_prep(struct cmac *mac, adapter_t *adapter, int index)
4320 {
4321         u16 devid;
4322
4323         mac->adapter = adapter;
4324         mac->multiport = adapter->params.nports > 2;
4325         if (mac->multiport) {
4326                 mac->ext_port = (unsigned char)index;
4327                 mac->nucast = 8;
4328         } else
4329                 mac->nucast = 1;
4330
4331         /* Gen2 adapter uses VPD xauicfg[] to notify driver which MAC
4332            is connected to each port, its suppose to be using xgmac0 for both ports
4333          */
4334         t3_os_pci_read_config_2(adapter, 0x2, &devid);
4335
4336         if (mac->multiport ||
4337                 (!adapter->params.vpd.xauicfg[1] && (devid==0x37)))
4338                         index  = 0;
4339
4340         mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
4341
4342         if (adapter->params.rev == 0 && uses_xaui(adapter)) {
4343                 t3_write_reg(adapter, A_XGM_SERDES_CTRL + mac->offset,
4344                              is_10G(adapter) ? 0x2901c04 : 0x2301c04);
4345                 t3_set_reg_field(adapter, A_XGM_PORT_CFG + mac->offset,
4346                                  F_ENRGMII, 0);
4347         }
4348 }
4349
4350 /**
4351  *      early_hw_init - HW initialization done at card detection time
4352  *      @adapter: the adapter
4353  *      @ai: contains information about the adapter type and properties
4354  *
4355  *      Perfoms the part of HW initialization that is done early on when the
4356  *      driver first detecs the card.  Most of the HW state is initialized
4357  *      lazily later on when a port or an offload function are first used.
4358  */
4359 void early_hw_init(adapter_t *adapter, const struct adapter_info *ai)
4360 {
4361         u32 val = V_PORTSPEED(is_10G(adapter) || adapter->params.nports > 2 ?
4362                               3 : 2);
4363         u32 gpio_out = ai->gpio_out;
4364
4365         mi1_init(adapter, ai);
4366         t3_write_reg(adapter, A_I2C_CFG,                  /* set for 80KHz */
4367                      V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1));
4368         t3_write_reg(adapter, A_T3DBG_GPIO_EN,
4369                      gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL);
4370         t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0);
4371         t3_write_reg(adapter, A_SG_OCO_BASE, V_BASE1(0xfff));
4372
4373         if (adapter->params.rev == 0 || !uses_xaui(adapter))
4374                 val |= F_ENRGMII;
4375
4376         /* Enable MAC clocks so we can access the registers */
4377         t3_write_reg(adapter, A_XGM_PORT_CFG, val);
4378         (void) t3_read_reg(adapter, A_XGM_PORT_CFG);
4379
4380         val |= F_CLKDIVRESET_;
4381         t3_write_reg(adapter, A_XGM_PORT_CFG, val);
4382         (void) t3_read_reg(adapter, A_XGM_PORT_CFG);
4383         t3_write_reg(adapter, XGM_REG(A_XGM_PORT_CFG, 1), val);
4384         (void) t3_read_reg(adapter, A_XGM_PORT_CFG);
4385 }
4386
4387 /**
4388  *      t3_reset_adapter - reset the adapter
4389  *      @adapter: the adapter
4390  *
4391  *      Reset the adapter.
4392  */
4393 int t3_reset_adapter(adapter_t *adapter)
4394 {
4395         int i, save_and_restore_pcie =
4396             adapter->params.rev < T3_REV_B2 && is_pcie(adapter);
4397         uint16_t devid = 0;
4398
4399         if (save_and_restore_pcie)
4400                 t3_os_pci_save_state(adapter);
4401         t3_write_reg(adapter, A_PL_RST, F_CRSTWRM | F_CRSTWRMMODE);
4402
4403         /*
4404          * Delay. Give Some time to device to reset fully.
4405          * XXX The delay time should be modified.
4406          */
4407         for (i = 0; i < 10; i++) {
4408                 msleep(50);
4409                 t3_os_pci_read_config_2(adapter, 0x00, &devid);
4410                 if (devid == 0x1425)
4411                         break;
4412         }
4413
4414         if (devid != 0x1425)
4415                 return -1;
4416
4417         if (save_and_restore_pcie)
4418                 t3_os_pci_restore_state(adapter);
4419         return 0;
4420 }
4421
4422 static int init_parity(adapter_t *adap)
4423 {
4424         int i, err, addr;
4425
4426         if (t3_read_reg(adap, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
4427                 return -EBUSY;
4428
4429         for (err = i = 0; !err && i < 16; i++)
4430                 err = clear_sge_ctxt(adap, i, F_EGRESS);
4431         for (i = 0xfff0; !err && i <= 0xffff; i++)
4432                 err = clear_sge_ctxt(adap, i, F_EGRESS);
4433         for (i = 0; !err && i < SGE_QSETS; i++)
4434                 err = clear_sge_ctxt(adap, i, F_RESPONSEQ);
4435         if (err)
4436                 return err;
4437
4438         t3_write_reg(adap, A_CIM_IBQ_DBG_DATA, 0);
4439         for (i = 0; i < 4; i++)
4440                 for (addr = 0; addr <= M_IBQDBGADDR; addr++) {
4441                         t3_write_reg(adap, A_CIM_IBQ_DBG_CFG, F_IBQDBGEN |
4442                                      F_IBQDBGWR | V_IBQDBGQID(i) |
4443                                      V_IBQDBGADDR(addr));
4444                         err = t3_wait_op_done(adap, A_CIM_IBQ_DBG_CFG,
4445                                               F_IBQDBGBUSY, 0, 2, 1);
4446                         if (err)
4447                                 return err;
4448                 }
4449         return 0;
4450 }
4451
4452 /**
4453  *      t3_prep_adapter - prepare SW and HW for operation
4454  *      @adapter: the adapter
4455  *      @ai: contains information about the adapter type and properties
4456  *
4457  *      Initialize adapter SW state for the various HW modules, set initial
4458  *      values for some adapter tunables, take PHYs out of reset, and
4459  *      initialize the MDIO interface.
4460  */
4461 int __devinit t3_prep_adapter(adapter_t *adapter,
4462                               const struct adapter_info *ai, int reset)
4463 {
4464         int ret;
4465         unsigned int i, j = 0;
4466
4467         get_pci_mode(adapter, &adapter->params.pci);
4468
4469         adapter->params.info = ai;
4470         adapter->params.nports = ai->nports0 + ai->nports1;
4471         adapter->params.chan_map = (!!ai->nports0) | (!!ai->nports1 << 1);
4472         adapter->params.rev = t3_read_reg(adapter, A_PL_REV);
4473
4474         /*
4475          * We used to only run the "adapter check task" once a second if
4476          * we had PHYs which didn't support interrupts (we would check
4477          * their link status once a second).  Now we check other conditions
4478          * in that routine which would [potentially] impose a very high
4479          * interrupt load on the system.  As such, we now always scan the
4480          * adapter state once a second ...
4481          */
4482         adapter->params.linkpoll_period = 10;
4483
4484         if (adapter->params.nports > 2)
4485                 adapter->params.stats_update_period = VSC_STATS_ACCUM_SECS;
4486         else
4487                 adapter->params.stats_update_period = is_10G(adapter) ?
4488                         MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS * 10);
4489         adapter->params.pci.vpd_cap_addr =
4490                 t3_os_find_pci_capability(adapter, PCI_CAP_ID_VPD);
4491
4492         ret = get_vpd_params(adapter, &adapter->params.vpd);
4493         if (ret < 0)
4494                 return ret;
4495
4496         if (reset && t3_reset_adapter(adapter))
4497                 return -1;
4498
4499         if (adapter->params.vpd.mclk) {
4500                 struct tp_params *p = &adapter->params.tp;
4501
4502                 mc7_prep(adapter, &adapter->pmrx, MC7_PMRX_BASE_ADDR, "PMRX");
4503                 mc7_prep(adapter, &adapter->pmtx, MC7_PMTX_BASE_ADDR, "PMTX");
4504                 mc7_prep(adapter, &adapter->cm, MC7_CM_BASE_ADDR, "CM");
4505
4506                 p->nchan = adapter->params.chan_map == 3 ? 2 : 1;
4507                 p->pmrx_size = t3_mc7_size(&adapter->pmrx);
4508                 p->pmtx_size = t3_mc7_size(&adapter->pmtx);
4509                 p->cm_size = t3_mc7_size(&adapter->cm);
4510                 p->chan_rx_size = p->pmrx_size / 2;     /* only 1 Rx channel */
4511                 p->chan_tx_size = p->pmtx_size / p->nchan;
4512                 p->rx_pg_size = 64 * 1024;
4513                 p->tx_pg_size = is_10G(adapter) ? 64 * 1024 : 16 * 1024;
4514                 p->rx_num_pgs = pm_num_pages(p->chan_rx_size, p->rx_pg_size);
4515                 p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size);
4516                 p->ntimer_qs = p->cm_size >= (128 << 20) ||
4517                                adapter->params.rev > 0 ? 12 : 6;
4518                 p->tre = fls(adapter->params.vpd.cclk / (1000 / TP_TMR_RES)) -
4519                          1;
4520                 p->dack_re = fls(adapter->params.vpd.cclk / 10) - 1; /* 100us */
4521         }
4522
4523         adapter->params.offload = t3_mc7_size(&adapter->pmrx) &&
4524                                   t3_mc7_size(&adapter->pmtx) &&
4525                                   t3_mc7_size(&adapter->cm);
4526
4527         t3_sge_prep(adapter, &adapter->params.sge);
4528
4529         if (is_offload(adapter)) {
4530                 adapter->params.mc5.nservers = DEFAULT_NSERVERS;
4531                 /* PR 6487. TOE and filtering are mutually exclusive */
4532                 adapter->params.mc5.nfilters = 0;
4533                 adapter->params.mc5.nroutes = 0;
4534                 t3_mc5_prep(adapter, &adapter->mc5, MC5_MODE_144_BIT);
4535
4536                 init_mtus(adapter->params.mtus);
4537                 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
4538         }
4539
4540         early_hw_init(adapter, ai);
4541         ret = init_parity(adapter);
4542         if (ret)
4543                 return ret;
4544
4545         if (adapter->params.nports > 2 &&
4546             (ret = t3_vsc7323_init(adapter, adapter->params.nports)))
4547                 return ret;
4548
4549         for_each_port(adapter, i) {
4550                 u8 hw_addr[6];
4551                 const struct port_type_info *pti;
4552                 struct port_info *p = adap2pinfo(adapter, i);
4553
4554                 for (;;) {
4555                         unsigned port_type = adapter->params.vpd.port_type[j];
4556                         if (port_type) {
4557                                 if (port_type < ARRAY_SIZE(port_types)) {
4558                                         pti = &port_types[port_type];
4559                                         break;
4560                                 } else
4561                                         return -EINVAL;
4562                         }
4563                         j++;
4564                         if (j >= ARRAY_SIZE(adapter->params.vpd.port_type))
4565                                 return -EINVAL;
4566                 }
4567                 ret = pti->phy_prep(p, ai->phy_base_addr + j,
4568                                     ai->mdio_ops);
4569                 if (ret)
4570                         return ret;
4571                 mac_prep(&p->mac, adapter, j);
4572                 ++j;
4573
4574                 /*
4575                  * The VPD EEPROM stores the base Ethernet address for the
4576                  * card.  A port's address is derived from the base by adding
4577                  * the port's index to the base's low octet.
4578                  */
4579                 memcpy(hw_addr, adapter->params.vpd.eth_base, 5);
4580                 hw_addr[5] = adapter->params.vpd.eth_base[5] + i;
4581
4582                 t3_os_set_hw_addr(adapter, i, hw_addr);
4583                 init_link_config(&p->link_config, p->phy.caps);
4584                 p->phy.ops->power_down(&p->phy, 1);
4585
4586                 /*
4587                  * If the PHY doesn't support interrupts for link status
4588                  * changes, schedule a scan of the adapter links at least
4589                  * once a second.
4590                  */
4591                 if (!(p->phy.caps & SUPPORTED_IRQ) &&
4592                     adapter->params.linkpoll_period > 10)
4593                         adapter->params.linkpoll_period = 10;
4594         }
4595
4596         return 0;
4597 }
4598
4599 /**
4600  *      t3_reinit_adapter - prepare HW for operation again
4601  *      @adapter: the adapter
4602  *
4603  *      Put HW in the same state as @t3_prep_adapter without any changes to
4604  *      SW state.  This is a cut down version of @t3_prep_adapter intended
4605  *      to be used after events that wipe out HW state but preserve SW state,
4606  *      e.g., EEH.  The device must be reset before calling this.
4607  */
4608 int t3_reinit_adapter(adapter_t *adap)
4609 {
4610         unsigned int i;
4611         int ret, j = 0;
4612
4613         early_hw_init(adap, adap->params.info);
4614         ret = init_parity(adap);
4615         if (ret)
4616                 return ret;
4617
4618         if (adap->params.nports > 2 &&
4619             (ret = t3_vsc7323_init(adap, adap->params.nports)))
4620                 return ret;
4621
4622         for_each_port(adap, i) {
4623                 const struct port_type_info *pti;
4624                 struct port_info *p = adap2pinfo(adap, i);
4625
4626                 for (;;) {
4627                         unsigned port_type = adap->params.vpd.port_type[j];
4628                         if (port_type) {
4629                                 if (port_type < ARRAY_SIZE(port_types)) {
4630                                         pti = &port_types[port_type];
4631                                         break;
4632                                 } else
4633                                         return -EINVAL;
4634                         }
4635                         j++;
4636                         if (j >= ARRAY_SIZE(adap->params.vpd.port_type))
4637                                 return -EINVAL;
4638                 }
4639                 ret = pti->phy_prep(p, p->phy.addr, NULL);
4640                 if (ret)
4641                         return ret;
4642                 p->phy.ops->power_down(&p->phy, 1);
4643         }
4644         return 0;
4645 }
4646
4647 void t3_led_ready(adapter_t *adapter)
4648 {
4649         t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL,
4650                          F_GPIO0_OUT_VAL);
4651 }
4652
4653 void t3_port_failover(adapter_t *adapter, int port)
4654 {
4655         u32 val;
4656
4657         val = port ? F_PORT1ACTIVE : F_PORT0ACTIVE;
4658         t3_set_reg_field(adapter, A_MPS_CFG, F_PORT0ACTIVE | F_PORT1ACTIVE,
4659                          val);
4660 }
4661
4662 void t3_failover_done(adapter_t *adapter, int port)
4663 {
4664         t3_set_reg_field(adapter, A_MPS_CFG, F_PORT0ACTIVE | F_PORT1ACTIVE,
4665                          F_PORT0ACTIVE | F_PORT1ACTIVE);
4666 }
4667
4668 void t3_failover_clear(adapter_t *adapter)
4669 {
4670         t3_set_reg_field(adapter, A_MPS_CFG, F_PORT0ACTIVE | F_PORT1ACTIVE,
4671                          F_PORT0ACTIVE | F_PORT1ACTIVE);
4672 }
4673
4674 static int t3_cim_hac_read(adapter_t *adapter, u32 addr, u32 *val)
4675 {
4676         u32 v;
4677
4678         t3_write_reg(adapter, A_CIM_HOST_ACC_CTRL, addr);
4679         if (t3_wait_op_done_val(adapter, A_CIM_HOST_ACC_CTRL,
4680                                 F_HOSTBUSY, 0, 10, 10, &v))
4681                 return -EIO;
4682
4683         *val = t3_read_reg(adapter, A_CIM_HOST_ACC_DATA);
4684
4685         return 0;
4686 }
4687
4688 static int t3_cim_hac_write(adapter_t *adapter, u32 addr, u32 val)
4689 {
4690         u32 v;
4691
4692         t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, val);
4693
4694         addr |= F_HOSTWRITE;
4695         t3_write_reg(adapter, A_CIM_HOST_ACC_CTRL, addr);
4696
4697         if (t3_wait_op_done_val(adapter, A_CIM_HOST_ACC_CTRL,
4698                                 F_HOSTBUSY, 0, 10, 5, &v))
4699                 return -EIO;
4700         return 0;
4701 }
4702
4703 int t3_get_up_la(adapter_t *adapter, u32 *stopped, u32 *index,
4704                  u32 *size, void *data)
4705 {
4706         u32 v, *buf = data;
4707         int i, cnt,  ret;
4708
4709         if (*size < LA_ENTRIES * 4)
4710                 return -EINVAL;
4711
4712         ret = t3_cim_hac_read(adapter, LA_CTRL, &v);
4713         if (ret)
4714                 goto out;
4715
4716         *stopped = !(v & 1);
4717
4718         /* Freeze LA */
4719         if (!*stopped) {
4720                 ret = t3_cim_hac_write(adapter, LA_CTRL, 0);
4721                 if (ret)
4722                         goto out;
4723         }
4724
4725         for (i = 0; i < LA_ENTRIES; i++) {
4726                 v = (i << 2) | (1 << 1);
4727                 ret = t3_cim_hac_write(adapter, LA_CTRL, v);
4728                 if (ret)
4729                         goto out;
4730
4731                 ret = t3_cim_hac_read(adapter, LA_CTRL, &v);
4732                 if (ret)
4733                         goto out;
4734
4735                 cnt = 20;
4736                 while ((v & (1 << 1)) && cnt) {
4737                         udelay(5);
4738                         --cnt;
4739                         ret = t3_cim_hac_read(adapter, LA_CTRL, &v);
4740                         if (ret)
4741                                 goto out;
4742                 }
4743
4744                 if (v & (1 << 1))
4745                         return -EIO;
4746
4747                 ret = t3_cim_hac_read(adapter, LA_DATA, &v);
4748                 if (ret)
4749                         goto out;
4750
4751                 *buf++ = v;
4752         }
4753
4754         ret = t3_cim_hac_read(adapter, LA_CTRL, &v);
4755         if (ret)
4756                 goto out;
4757
4758         *index = (v >> 16) + 4;
4759         *size = LA_ENTRIES * 4;
4760 out:
4761         /* Unfreeze LA */
4762         t3_cim_hac_write(adapter, LA_CTRL, 1);
4763         return ret;
4764 }
4765
4766 int t3_get_up_ioqs(adapter_t *adapter, u32 *size, void *data)
4767 {
4768         u32 v, *buf = data;
4769         int i, j, ret;
4770
4771         if (*size < IOQ_ENTRIES * sizeof(struct t3_ioq_entry))
4772                 return -EINVAL;
4773
4774         for (i = 0; i < 4; i++) {
4775                 ret = t3_cim_hac_read(adapter, (4 * i), &v);
4776                 if (ret)
4777                         goto out;
4778
4779                 *buf++ = v;
4780         }
4781
4782         for (i = 0; i < IOQ_ENTRIES; i++) {
4783                 u32 base_addr = 0x10 * (i + 1);         
4784
4785                 for (j = 0; j < 4; j++) {
4786                         ret = t3_cim_hac_read(adapter, base_addr + 4 * j, &v);
4787                         if (ret)
4788                                 goto out;
4789
4790                         *buf++ = v;
4791                 }
4792         }
4793         
4794         *size = IOQ_ENTRIES * sizeof(struct t3_ioq_entry);
4795
4796 out:
4797         return ret;
4798 }
4799