1/**************************************************************************
2SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3
4Copyright (c) 2007-2009, Chelsio Inc.
5All rights reserved.
6
7Redistribution and use in source and binary forms, with or without
8modification, 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
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27POSSIBILITY 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 */
55int 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 */
84void 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 */
103void 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 */
123static 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 */
144int 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 */
208int 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 */
232int 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 */
251static 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 */
264int 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
284int 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
303static 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 */
311static 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
334static 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
356static 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 */
372int 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 */
396int 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 */
425int 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 */
468int 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 */
492int 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
518int t3_phy_lasi_intr_enable(struct cphy *phy)
519{
520	return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 1);
521}
522
523int t3_phy_lasi_intr_disable(struct cphy *phy)
524{
525	return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 0);
526}
527
528int 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
535int 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
545static 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 */
587const 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
592struct port_type_info {
593	int (*phy_prep)(pinfo_t *pinfo, int phy_addr,
594			const struct mdio_ops *ops);
595};
596
597static 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 */
618struct 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 */
658int 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 */
691int 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 */
723int 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 */
731static 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 */
744static 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 */
781static 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
808int 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
840int 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 */
862static 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 */
911typedef 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 */
920enum {
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 */
958static 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 */
985static 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 */
1006static 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 */
1037int 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 */
1075static 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 */
1124int 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 */
1145int 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 */
1184int 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
1202enum 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 */
1216int 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 */
1232int 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 */
1271static 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 */
1297int 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);
1345out:
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 */
1361int 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
1403out:
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 */
1420int 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
1438static 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
1462static 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
1475static 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
1498static 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 */
1522void 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 */
1674int 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 */
1718void 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
1725struct 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 */
1747static 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 */
1831static 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 */
1867static 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 */
1901static 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 */
1925static 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 */
1963static 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 */
1985static 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 */
2013static 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 */
2043static 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 */
2064static 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 */
2084static 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 */
2101static 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 */
2154static 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 */
2211static 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 */
2249int 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
2301static 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 */
2320void 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 */
2371void 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 */
2384void 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
2419void 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
2427void 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 */
2443void 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 */
2459void 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 */
2475void 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 */
2494static 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 */
2531static 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 */
2564int 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 */
2607int 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 */
2646int 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 */
2689int 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 */
2720int 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 */
2744int 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 */
2768int 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 */
2792int 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 */
2822int 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 */
2862static 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 */
2889int 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 */
2905int 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 */
2921int 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 */
2937int 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 */
2956void 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 */
2992int 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 */
3027void 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 */
3043static 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 */
3057void 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 */
3071void 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 */
3089static 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 */
3109static 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
3167static 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
3173static 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
3179static 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 */
3257static 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 */
3302int 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 */
3332void 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
3338static 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 */
3370static 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 */
3422void 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 */
3461void 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 */
3482void 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 */
3503void 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 */
3516void 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 */
3535void 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
3556static 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 */
3578int 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 */
3607void 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 */
3649void 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 */
3692int 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 */
3736int 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 */
3766void 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 */
3804static 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 */
3832int 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 */
3849static 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
3886static 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
3913static 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
3928struct 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 */
3943static 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
3953static 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
4068static 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 */
4147int 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 */
4231static 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 */
4271static 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 */
4295static 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
4306static 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
4319void 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 */
4359void 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 */
4393int 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
4422static 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 */
4461int __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 */
4608int 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
4647void 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
4653void 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
4662void 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
4668void 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
4674static 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
4688static 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
4703int 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;
4760out:
4761	/* Unfreeze LA */
4762	t3_cim_hac_write(adapter, LA_CTRL, 1);
4763	return ret;
4764}
4765
4766int 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
4796out:
4797	return ret;
4798}
4799
4800