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