blob: eaa7a2e89a30df876e3182bed3df133df21d65ee [file] [log] [blame]
Divy Le Ray4d22de32007-01-18 22:04:14 -05001/*
Divy Le Ray1d68e932007-01-30 19:44:35 -08002 * Copyright (c) 2003-2007 Chelsio, Inc. All rights reserved.
Divy Le Ray4d22de32007-01-18 22:04:14 -05003 *
Divy Le Ray1d68e932007-01-30 19:44:35 -08004 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
Divy Le Ray4d22de32007-01-18 22:04:14 -05009 *
Divy Le Ray1d68e932007-01-30 19:44:35 -080010 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
Divy Le Ray4d22de32007-01-18 22:04:14 -050031 */
Divy Le Ray4d22de32007-01-18 22:04:14 -050032#include "common.h"
33#include "regs.h"
34#include "sge_defs.h"
35#include "firmware_exports.h"
36
Divy Le Rayf2c68792007-01-30 19:44:13 -080037/**
38 * t3_wait_op_done_val - wait until an operation is completed
39 * @adapter: the adapter performing the operation
40 * @reg: the register to check for completion
41 * @mask: a single-bit field within @reg that indicates completion
42 * @polarity: the value of the field when the operation is completed
43 * @attempts: number of check iterations
44 * @delay: delay in usecs between iterations
45 * @valp: where to store the value of the register at completion time
46 *
47 * Wait until an operation is completed by checking a bit in a register
48 * up to @attempts times. If @valp is not NULL the value of the register
49 * at the time it indicated completion is stored there. Returns 0 if the
50 * operation completes and -EAGAIN otherwise.
51 */
Divy Le Ray4d22de32007-01-18 22:04:14 -050052
53int t3_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
54 int polarity, int attempts, int delay, u32 *valp)
55{
56 while (1) {
57 u32 val = t3_read_reg(adapter, reg);
58
59 if (!!(val & mask) == polarity) {
60 if (valp)
61 *valp = val;
62 return 0;
63 }
64 if (--attempts == 0)
65 return -EAGAIN;
66 if (delay)
67 udelay(delay);
68 }
69}
70
71/**
72 * t3_write_regs - write a bunch of registers
73 * @adapter: the adapter to program
74 * @p: an array of register address/register value pairs
75 * @n: the number of address/value pairs
76 * @offset: register address offset
77 *
78 * Takes an array of register address/register value pairs and writes each
79 * value to the corresponding register. Register addresses are adjusted
80 * by the supplied offset.
81 */
82void t3_write_regs(struct adapter *adapter, const struct addr_val_pair *p,
83 int n, unsigned int offset)
84{
85 while (n--) {
86 t3_write_reg(adapter, p->reg_addr + offset, p->val);
87 p++;
88 }
89}
90
91/**
92 * t3_set_reg_field - set a register field to a value
93 * @adapter: the adapter to program
94 * @addr: the register address
95 * @mask: specifies the portion of the register to modify
96 * @val: the new value for the register field
97 *
98 * Sets a register field specified by the supplied mask to the
99 * given value.
100 */
101void t3_set_reg_field(struct adapter *adapter, unsigned int addr, u32 mask,
102 u32 val)
103{
104 u32 v = t3_read_reg(adapter, addr) & ~mask;
105
106 t3_write_reg(adapter, addr, v | val);
107 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 */
122void t3_read_indirect(struct adapter *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 const int shift[] = { 0, 0, 16, 24 };
147 static const int step[] = { 0, 32, 16, 8 };
148
149 unsigned int size64 = mc7->size / 8; /* # of 64-bit words */
150 struct adapter *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, start);
165 t3_write_reg(adap, mc7->offset + A_MC7_BD_OP, 0);
166 val = t3_read_reg(adap, mc7->offset + A_MC7_BD_OP);
167 while ((val & F_BUSY) && attempts--)
168 val = t3_read_reg(adap,
169 mc7->offset + A_MC7_BD_OP);
170 if (val & F_BUSY)
171 return -EIO;
172
173 val = t3_read_reg(adap, mc7->offset + A_MC7_BD_DATA1);
174 if (mc7->width == 0) {
175 val64 = t3_read_reg(adap,
176 mc7->offset +
177 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 * Initialize MI1.
193 */
194static void mi1_init(struct adapter *adap, const struct adapter_info *ai)
195{
196 u32 clkdiv = adap->params.vpd.cclk / (2 * adap->params.vpd.mdc) - 1;
197 u32 val = F_PREEN | V_MDIINV(ai->mdiinv) | V_MDIEN(ai->mdien) |
198 V_CLKDIV(clkdiv);
199
200 if (!(ai->caps & SUPPORTED_10000baseT_Full))
201 val |= V_ST(1);
202 t3_write_reg(adap, A_MI1_CFG, val);
203}
204
205#define MDIO_ATTEMPTS 10
206
207/*
208 * MI1 read/write operations for direct-addressed PHYs.
209 */
210static int mi1_read(struct adapter *adapter, int phy_addr, int mmd_addr,
211 int reg_addr, unsigned int *valp)
212{
213 int ret;
214 u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
215
216 if (mmd_addr)
217 return -EINVAL;
218
219 mutex_lock(&adapter->mdio_lock);
220 t3_write_reg(adapter, A_MI1_ADDR, addr);
221 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(2));
222 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
223 if (!ret)
224 *valp = t3_read_reg(adapter, A_MI1_DATA);
225 mutex_unlock(&adapter->mdio_lock);
226 return ret;
227}
228
229static int mi1_write(struct adapter *adapter, int phy_addr, int mmd_addr,
230 int reg_addr, unsigned int val)
231{
232 int ret;
233 u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
234
235 if (mmd_addr)
236 return -EINVAL;
237
238 mutex_lock(&adapter->mdio_lock);
239 t3_write_reg(adapter, A_MI1_ADDR, addr);
240 t3_write_reg(adapter, A_MI1_DATA, val);
241 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
242 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
243 mutex_unlock(&adapter->mdio_lock);
244 return ret;
245}
246
247static const struct mdio_ops mi1_mdio_ops = {
248 mi1_read,
249 mi1_write
250};
251
252/*
253 * MI1 read/write operations for indirect-addressed PHYs.
254 */
255static int mi1_ext_read(struct adapter *adapter, int phy_addr, int mmd_addr,
256 int reg_addr, unsigned int *valp)
257{
258 int ret;
259 u32 addr = V_REGADDR(mmd_addr) | V_PHYADDR(phy_addr);
260
261 mutex_lock(&adapter->mdio_lock);
262 t3_write_reg(adapter, A_MI1_ADDR, addr);
263 t3_write_reg(adapter, A_MI1_DATA, reg_addr);
264 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
265 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
266 if (!ret) {
267 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(3));
268 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
269 MDIO_ATTEMPTS, 20);
270 if (!ret)
271 *valp = t3_read_reg(adapter, A_MI1_DATA);
272 }
273 mutex_unlock(&adapter->mdio_lock);
274 return ret;
275}
276
277static int mi1_ext_write(struct adapter *adapter, int phy_addr, int mmd_addr,
278 int reg_addr, unsigned int val)
279{
280 int ret;
281 u32 addr = V_REGADDR(mmd_addr) | V_PHYADDR(phy_addr);
282
283 mutex_lock(&adapter->mdio_lock);
284 t3_write_reg(adapter, A_MI1_ADDR, addr);
285 t3_write_reg(adapter, A_MI1_DATA, reg_addr);
286 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
287 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
288 if (!ret) {
289 t3_write_reg(adapter, A_MI1_DATA, val);
290 t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
291 ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
292 MDIO_ATTEMPTS, 20);
293 }
294 mutex_unlock(&adapter->mdio_lock);
295 return ret;
296}
297
298static const struct mdio_ops mi1_mdio_ext_ops = {
299 mi1_ext_read,
300 mi1_ext_write
301};
302
303/**
304 * t3_mdio_change_bits - modify the value of a PHY register
305 * @phy: the PHY to operate on
306 * @mmd: the device address
307 * @reg: the register address
308 * @clear: what part of the register value to mask off
309 * @set: what part of the register value to set
310 *
311 * Changes the value of a PHY register by applying a mask to its current
312 * value and ORing the result with a new value.
313 */
314int t3_mdio_change_bits(struct cphy *phy, int mmd, int reg, unsigned int clear,
315 unsigned int set)
316{
317 int ret;
318 unsigned int val;
319
320 ret = mdio_read(phy, mmd, reg, &val);
321 if (!ret) {
322 val &= ~clear;
323 ret = mdio_write(phy, mmd, reg, val | set);
324 }
325 return ret;
326}
327
328/**
329 * t3_phy_reset - reset a PHY block
330 * @phy: the PHY to operate on
331 * @mmd: the device address of the PHY block to reset
332 * @wait: how long to wait for the reset to complete in 1ms increments
333 *
334 * Resets a PHY block and optionally waits for the reset to complete.
335 * @mmd should be 0 for 10/100/1000 PHYs and the device address to reset
336 * for 10G PHYs.
337 */
338int t3_phy_reset(struct cphy *phy, int mmd, int wait)
339{
340 int err;
341 unsigned int ctl;
342
343 err = t3_mdio_change_bits(phy, mmd, MII_BMCR, BMCR_PDOWN, BMCR_RESET);
344 if (err || !wait)
345 return err;
346
347 do {
348 err = mdio_read(phy, mmd, MII_BMCR, &ctl);
349 if (err)
350 return err;
351 ctl &= BMCR_RESET;
352 if (ctl)
353 msleep(1);
354 } while (ctl && --wait);
355
356 return ctl ? -1 : 0;
357}
358
359/**
360 * t3_phy_advertise - set the PHY advertisement registers for autoneg
361 * @phy: the PHY to operate on
362 * @advert: bitmap of capabilities the PHY should advertise
363 *
364 * Sets a 10/100/1000 PHY's advertisement registers to advertise the
365 * requested capabilities.
366 */
367int t3_phy_advertise(struct cphy *phy, unsigned int advert)
368{
369 int err;
370 unsigned int val = 0;
371
372 err = mdio_read(phy, 0, MII_CTRL1000, &val);
373 if (err)
374 return err;
375
376 val &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
377 if (advert & ADVERTISED_1000baseT_Half)
378 val |= ADVERTISE_1000HALF;
379 if (advert & ADVERTISED_1000baseT_Full)
380 val |= ADVERTISE_1000FULL;
381
382 err = mdio_write(phy, 0, MII_CTRL1000, val);
383 if (err)
384 return err;
385
386 val = 1;
387 if (advert & ADVERTISED_10baseT_Half)
388 val |= ADVERTISE_10HALF;
389 if (advert & ADVERTISED_10baseT_Full)
390 val |= ADVERTISE_10FULL;
391 if (advert & ADVERTISED_100baseT_Half)
392 val |= ADVERTISE_100HALF;
393 if (advert & ADVERTISED_100baseT_Full)
394 val |= ADVERTISE_100FULL;
395 if (advert & ADVERTISED_Pause)
396 val |= ADVERTISE_PAUSE_CAP;
397 if (advert & ADVERTISED_Asym_Pause)
398 val |= ADVERTISE_PAUSE_ASYM;
399 return mdio_write(phy, 0, MII_ADVERTISE, val);
400}
401
402/**
403 * t3_set_phy_speed_duplex - force PHY speed and duplex
404 * @phy: the PHY to operate on
405 * @speed: requested PHY speed
406 * @duplex: requested PHY duplex
407 *
408 * Force a 10/100/1000 PHY's speed and duplex. This also disables
409 * auto-negotiation except for GigE, where auto-negotiation is mandatory.
410 */
411int t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex)
412{
413 int err;
414 unsigned int ctl;
415
416 err = mdio_read(phy, 0, MII_BMCR, &ctl);
417 if (err)
418 return err;
419
420 if (speed >= 0) {
421 ctl &= ~(BMCR_SPEED100 | BMCR_SPEED1000 | BMCR_ANENABLE);
422 if (speed == SPEED_100)
423 ctl |= BMCR_SPEED100;
424 else if (speed == SPEED_1000)
425 ctl |= BMCR_SPEED1000;
426 }
427 if (duplex >= 0) {
428 ctl &= ~(BMCR_FULLDPLX | BMCR_ANENABLE);
429 if (duplex == DUPLEX_FULL)
430 ctl |= BMCR_FULLDPLX;
431 }
432 if (ctl & BMCR_SPEED1000) /* auto-negotiation required for GigE */
433 ctl |= BMCR_ANENABLE;
434 return mdio_write(phy, 0, MII_BMCR, ctl);
435}
436
437static const struct adapter_info t3_adap_info[] = {
438 {2, 0, 0, 0,
439 F_GPIO2_OEN | F_GPIO4_OEN |
440 F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5,
441 SUPPORTED_OFFLOAD,
442 &mi1_mdio_ops, "Chelsio PE9000"},
443 {2, 0, 0, 0,
444 F_GPIO2_OEN | F_GPIO4_OEN |
445 F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5,
446 SUPPORTED_OFFLOAD,
447 &mi1_mdio_ops, "Chelsio T302"},
448 {1, 0, 0, 0,
449 F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN |
450 F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0,
451 SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_OFFLOAD,
452 &mi1_mdio_ext_ops, "Chelsio T310"},
453 {2, 0, 0, 0,
454 F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN |
455 F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL |
456 F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0,
457 SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_OFFLOAD,
458 &mi1_mdio_ext_ops, "Chelsio T320"},
459};
460
461/*
462 * Return the adapter_info structure with a given index. Out-of-range indices
463 * return NULL.
464 */
465const struct adapter_info *t3_get_adapter_info(unsigned int id)
466{
467 return id < ARRAY_SIZE(t3_adap_info) ? &t3_adap_info[id] : NULL;
468}
469
470#define CAPS_1G (SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | \
471 SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII)
472#define CAPS_10G (SUPPORTED_10000baseT_Full | SUPPORTED_AUI)
473
474static const struct port_type_info port_types[] = {
475 {NULL},
476 {t3_ael1002_phy_prep, CAPS_10G | SUPPORTED_FIBRE,
477 "10GBASE-XR"},
478 {t3_vsc8211_phy_prep, CAPS_1G | SUPPORTED_TP | SUPPORTED_IRQ,
479 "10/100/1000BASE-T"},
480 {NULL, CAPS_1G | SUPPORTED_TP | SUPPORTED_IRQ,
481 "10/100/1000BASE-T"},
482 {t3_xaui_direct_phy_prep, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4"},
483 {NULL, CAPS_10G, "10GBASE-KX4"},
484 {t3_qt2045_phy_prep, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4"},
485 {t3_ael1006_phy_prep, CAPS_10G | SUPPORTED_FIBRE,
486 "10GBASE-SR"},
487 {NULL, CAPS_10G | SUPPORTED_TP, "10GBASE-CX4"},
488};
489
490#undef CAPS_1G
491#undef CAPS_10G
492
493#define VPD_ENTRY(name, len) \
494 u8 name##_kword[2]; u8 name##_len; u8 name##_data[len]
495
496/*
497 * Partial EEPROM Vital Product Data structure. Includes only the ID and
498 * VPD-R sections.
499 */
500struct t3_vpd {
501 u8 id_tag;
502 u8 id_len[2];
503 u8 id_data[16];
504 u8 vpdr_tag;
505 u8 vpdr_len[2];
506 VPD_ENTRY(pn, 16); /* part number */
507 VPD_ENTRY(ec, 16); /* EC level */
508 VPD_ENTRY(sn, 16); /* serial number */
509 VPD_ENTRY(na, 12); /* MAC address base */
510 VPD_ENTRY(cclk, 6); /* core clock */
511 VPD_ENTRY(mclk, 6); /* mem clock */
512 VPD_ENTRY(uclk, 6); /* uP clk */
513 VPD_ENTRY(mdc, 6); /* MDIO clk */
514 VPD_ENTRY(mt, 2); /* mem timing */
515 VPD_ENTRY(xaui0cfg, 6); /* XAUI0 config */
516 VPD_ENTRY(xaui1cfg, 6); /* XAUI1 config */
517 VPD_ENTRY(port0, 2); /* PHY0 complex */
518 VPD_ENTRY(port1, 2); /* PHY1 complex */
519 VPD_ENTRY(port2, 2); /* PHY2 complex */
520 VPD_ENTRY(port3, 2); /* PHY3 complex */
521 VPD_ENTRY(rv, 1); /* csum */
522 u32 pad; /* for multiple-of-4 sizing and alignment */
523};
524
525#define EEPROM_MAX_POLL 4
526#define EEPROM_STAT_ADDR 0x4000
527#define VPD_BASE 0xc00
528
529/**
530 * t3_seeprom_read - read a VPD EEPROM location
531 * @adapter: adapter to read
532 * @addr: EEPROM address
533 * @data: where to store the read data
534 *
535 * Read a 32-bit word from a location in VPD EEPROM using the card's PCI
536 * VPD ROM capability. A zero is written to the flag bit when the
537 * addres is written to the control register. The hardware device will
538 * set the flag to 1 when 4 bytes have been read into the data register.
539 */
540int t3_seeprom_read(struct adapter *adapter, u32 addr, u32 *data)
541{
542 u16 val;
543 int attempts = EEPROM_MAX_POLL;
544 unsigned int base = adapter->params.pci.vpd_cap_addr;
545
546 if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3))
547 return -EINVAL;
548
549 pci_write_config_word(adapter->pdev, base + PCI_VPD_ADDR, addr);
550 do {
551 udelay(10);
552 pci_read_config_word(adapter->pdev, base + PCI_VPD_ADDR, &val);
553 } while (!(val & PCI_VPD_ADDR_F) && --attempts);
554
555 if (!(val & PCI_VPD_ADDR_F)) {
556 CH_ERR(adapter, "reading EEPROM address 0x%x failed\n", addr);
557 return -EIO;
558 }
559 pci_read_config_dword(adapter->pdev, base + PCI_VPD_DATA, data);
560 *data = le32_to_cpu(*data);
561 return 0;
562}
563
564/**
565 * t3_seeprom_write - write a VPD EEPROM location
566 * @adapter: adapter to write
567 * @addr: EEPROM address
568 * @data: value to write
569 *
570 * Write a 32-bit word to a location in VPD EEPROM using the card's PCI
571 * VPD ROM capability.
572 */
573int t3_seeprom_write(struct adapter *adapter, u32 addr, u32 data)
574{
575 u16 val;
576 int attempts = EEPROM_MAX_POLL;
577 unsigned int base = adapter->params.pci.vpd_cap_addr;
578
579 if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3))
580 return -EINVAL;
581
582 pci_write_config_dword(adapter->pdev, base + PCI_VPD_DATA,
583 cpu_to_le32(data));
584 pci_write_config_word(adapter->pdev,base + PCI_VPD_ADDR,
585 addr | PCI_VPD_ADDR_F);
586 do {
587 msleep(1);
588 pci_read_config_word(adapter->pdev, base + PCI_VPD_ADDR, &val);
589 } while ((val & PCI_VPD_ADDR_F) && --attempts);
590
591 if (val & PCI_VPD_ADDR_F) {
592 CH_ERR(adapter, "write to EEPROM address 0x%x failed\n", addr);
593 return -EIO;
594 }
595 return 0;
596}
597
598/**
599 * t3_seeprom_wp - enable/disable EEPROM write protection
600 * @adapter: the adapter
601 * @enable: 1 to enable write protection, 0 to disable it
602 *
603 * Enables or disables write protection on the serial EEPROM.
604 */
605int t3_seeprom_wp(struct adapter *adapter, int enable)
606{
607 return t3_seeprom_write(adapter, EEPROM_STAT_ADDR, enable ? 0xc : 0);
608}
609
610/*
611 * Convert a character holding a hex digit to a number.
612 */
613static unsigned int hex2int(unsigned char c)
614{
615 return isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
616}
617
618/**
619 * get_vpd_params - read VPD parameters from VPD EEPROM
620 * @adapter: adapter to read
621 * @p: where to store the parameters
622 *
623 * Reads card parameters stored in VPD EEPROM.
624 */
625static int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
626{
627 int i, addr, ret;
628 struct t3_vpd vpd;
629
630 /*
631 * Card information is normally at VPD_BASE but some early cards had
632 * it at 0.
633 */
634 ret = t3_seeprom_read(adapter, VPD_BASE, (u32 *)&vpd);
635 if (ret)
636 return ret;
637 addr = vpd.id_tag == 0x82 ? VPD_BASE : 0;
638
639 for (i = 0; i < sizeof(vpd); i += 4) {
640 ret = t3_seeprom_read(adapter, addr + i,
641 (u32 *)((u8 *)&vpd + i));
642 if (ret)
643 return ret;
644 }
645
646 p->cclk = simple_strtoul(vpd.cclk_data, NULL, 10);
647 p->mclk = simple_strtoul(vpd.mclk_data, NULL, 10);
648 p->uclk = simple_strtoul(vpd.uclk_data, NULL, 10);
649 p->mdc = simple_strtoul(vpd.mdc_data, NULL, 10);
650 p->mem_timing = simple_strtoul(vpd.mt_data, NULL, 10);
651
652 /* Old eeproms didn't have port information */
653 if (adapter->params.rev == 0 && !vpd.port0_data[0]) {
654 p->port_type[0] = uses_xaui(adapter) ? 1 : 2;
655 p->port_type[1] = uses_xaui(adapter) ? 6 : 2;
656 } else {
657 p->port_type[0] = hex2int(vpd.port0_data[0]);
658 p->port_type[1] = hex2int(vpd.port1_data[0]);
659 p->xauicfg[0] = simple_strtoul(vpd.xaui0cfg_data, NULL, 16);
660 p->xauicfg[1] = simple_strtoul(vpd.xaui1cfg_data, NULL, 16);
661 }
662
663 for (i = 0; i < 6; i++)
664 p->eth_base[i] = hex2int(vpd.na_data[2 * i]) * 16 +
665 hex2int(vpd.na_data[2 * i + 1]);
666 return 0;
667}
668
669/* serial flash and firmware constants */
670enum {
671 SF_ATTEMPTS = 5, /* max retries for SF1 operations */
672 SF_SEC_SIZE = 64 * 1024, /* serial flash sector size */
673 SF_SIZE = SF_SEC_SIZE * 8, /* serial flash size */
674
675 /* flash command opcodes */
676 SF_PROG_PAGE = 2, /* program page */
677 SF_WR_DISABLE = 4, /* disable writes */
678 SF_RD_STATUS = 5, /* read status register */
679 SF_WR_ENABLE = 6, /* enable writes */
680 SF_RD_DATA_FAST = 0xb, /* read flash */
681 SF_ERASE_SECTOR = 0xd8, /* erase sector */
682
683 FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */
684 FW_VERS_ADDR = 0x77ffc /* flash address holding FW version */
685};
686
687/**
688 * sf1_read - read data from the serial flash
689 * @adapter: the adapter
690 * @byte_cnt: number of bytes to read
691 * @cont: whether another operation will be chained
692 * @valp: where to store the read data
693 *
694 * Reads up to 4 bytes of data from the serial flash. The location of
695 * the read needs to be specified prior to calling this by issuing the
696 * appropriate commands to the serial flash.
697 */
698static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
699 u32 *valp)
700{
701 int ret;
702
703 if (!byte_cnt || byte_cnt > 4)
704 return -EINVAL;
705 if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
706 return -EBUSY;
707 t3_write_reg(adapter, A_SF_OP, V_CONT(cont) | V_BYTECNT(byte_cnt - 1));
708 ret = t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
709 if (!ret)
710 *valp = t3_read_reg(adapter, A_SF_DATA);
711 return ret;
712}
713
714/**
715 * sf1_write - write data to the serial flash
716 * @adapter: the adapter
717 * @byte_cnt: number of bytes to write
718 * @cont: whether another operation will be chained
719 * @val: value to write
720 *
721 * Writes up to 4 bytes of data to the serial flash. The location of
722 * the write needs to be specified prior to calling this by issuing the
723 * appropriate commands to the serial flash.
724 */
725static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
726 u32 val)
727{
728 if (!byte_cnt || byte_cnt > 4)
729 return -EINVAL;
730 if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
731 return -EBUSY;
732 t3_write_reg(adapter, A_SF_DATA, val);
733 t3_write_reg(adapter, A_SF_OP,
734 V_CONT(cont) | V_BYTECNT(byte_cnt - 1) | V_OP(1));
735 return t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
736}
737
738/**
739 * flash_wait_op - wait for a flash operation to complete
740 * @adapter: the adapter
741 * @attempts: max number of polls of the status register
742 * @delay: delay between polls in ms
743 *
744 * Wait for a flash operation to complete by polling the status register.
745 */
746static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
747{
748 int ret;
749 u32 status;
750
751 while (1) {
752 if ((ret = sf1_write(adapter, 1, 1, SF_RD_STATUS)) != 0 ||
753 (ret = sf1_read(adapter, 1, 0, &status)) != 0)
754 return ret;
755 if (!(status & 1))
756 return 0;
757 if (--attempts == 0)
758 return -EAGAIN;
759 if (delay)
760 msleep(delay);
761 }
762}
763
764/**
765 * t3_read_flash - read words from serial flash
766 * @adapter: the adapter
767 * @addr: the start address for the read
768 * @nwords: how many 32-bit words to read
769 * @data: where to store the read data
770 * @byte_oriented: whether to store data as bytes or as words
771 *
772 * Read the specified number of 32-bit words from the serial flash.
773 * If @byte_oriented is set the read data is stored as a byte array
774 * (i.e., big-endian), otherwise as 32-bit words in the platform's
775 * natural endianess.
776 */
777int t3_read_flash(struct adapter *adapter, unsigned int addr,
778 unsigned int nwords, u32 *data, int byte_oriented)
779{
780 int ret;
781
782 if (addr + nwords * sizeof(u32) > SF_SIZE || (addr & 3))
783 return -EINVAL;
784
785 addr = swab32(addr) | SF_RD_DATA_FAST;
786
787 if ((ret = sf1_write(adapter, 4, 1, addr)) != 0 ||
788 (ret = sf1_read(adapter, 1, 1, data)) != 0)
789 return ret;
790
791 for (; nwords; nwords--, data++) {
792 ret = sf1_read(adapter, 4, nwords > 1, data);
793 if (ret)
794 return ret;
795 if (byte_oriented)
796 *data = htonl(*data);
797 }
798 return 0;
799}
800
801/**
802 * t3_write_flash - write up to a page of data to the serial flash
803 * @adapter: the adapter
804 * @addr: the start address to write
805 * @n: length of data to write
806 * @data: the data to write
807 *
808 * Writes up to a page of data (256 bytes) to the serial flash starting
809 * at the given address.
810 */
811static int t3_write_flash(struct adapter *adapter, unsigned int addr,
812 unsigned int n, const u8 *data)
813{
814 int ret;
815 u32 buf[64];
816 unsigned int i, c, left, val, offset = addr & 0xff;
817
818 if (addr + n > SF_SIZE || offset + n > 256)
819 return -EINVAL;
820
821 val = swab32(addr) | SF_PROG_PAGE;
822
823 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
824 (ret = sf1_write(adapter, 4, 1, val)) != 0)
825 return ret;
826
827 for (left = n; left; left -= c) {
828 c = min(left, 4U);
829 for (val = 0, i = 0; i < c; ++i)
830 val = (val << 8) + *data++;
831
832 ret = sf1_write(adapter, c, c != left, val);
833 if (ret)
834 return ret;
835 }
836 if ((ret = flash_wait_op(adapter, 5, 1)) != 0)
837 return ret;
838
839 /* Read the page to verify the write succeeded */
840 ret = t3_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
841 if (ret)
842 return ret;
843
844 if (memcmp(data - n, (u8 *) buf + offset, n))
845 return -EIO;
846 return 0;
847}
848
Divy Le Ray4aac3892007-01-30 19:43:45 -0800849enum fw_version_type {
850 FW_VERSION_N3,
851 FW_VERSION_T3
852};
853
Divy Le Ray4d22de32007-01-18 22:04:14 -0500854/**
855 * t3_get_fw_version - read the firmware version
856 * @adapter: the adapter
857 * @vers: where to place the version
858 *
859 * Reads the FW version from flash.
860 */
861int t3_get_fw_version(struct adapter *adapter, u32 *vers)
862{
863 return t3_read_flash(adapter, FW_VERS_ADDR, 1, vers, 0);
864}
865
866/**
867 * t3_check_fw_version - check if the FW is compatible with this driver
868 * @adapter: the adapter
869 *
870 * Checks if an adapter's FW is compatible with the driver. Returns 0
871 * if the versions are compatible, a negative error otherwise.
872 */
873int t3_check_fw_version(struct adapter *adapter)
874{
875 int ret;
876 u32 vers;
Divy Le Ray4aac3892007-01-30 19:43:45 -0800877 unsigned int type, major, minor;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500878
879 ret = t3_get_fw_version(adapter, &vers);
880 if (ret)
881 return ret;
882
Divy Le Ray4aac3892007-01-30 19:43:45 -0800883 type = G_FW_VERSION_TYPE(vers);
884 major = G_FW_VERSION_MAJOR(vers);
885 minor = G_FW_VERSION_MINOR(vers);
886
Divy Le Ray75d86262007-02-25 16:32:37 -0800887 if (type == FW_VERSION_T3 && major == FW_VERSION_MAJOR &&
888 minor == FW_VERSION_MINOR)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500889 return 0;
890
Divy Le Ray4aac3892007-01-30 19:43:45 -0800891 CH_ERR(adapter, "found wrong FW version(%u.%u), "
Divy Le Ray75d86262007-02-25 16:32:37 -0800892 "driver needs version %u.%u\n", major, minor,
893 FW_VERSION_MAJOR, FW_VERSION_MINOR);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500894 return -EINVAL;
895}
896
897/**
898 * t3_flash_erase_sectors - erase a range of flash sectors
899 * @adapter: the adapter
900 * @start: the first sector to erase
901 * @end: the last sector to erase
902 *
903 * Erases the sectors in the given range.
904 */
905static int t3_flash_erase_sectors(struct adapter *adapter, int start, int end)
906{
907 while (start <= end) {
908 int ret;
909
910 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
911 (ret = sf1_write(adapter, 4, 0,
912 SF_ERASE_SECTOR | (start << 8))) != 0 ||
913 (ret = flash_wait_op(adapter, 5, 500)) != 0)
914 return ret;
915 start++;
916 }
917 return 0;
918}
919
920/*
921 * t3_load_fw - download firmware
922 * @adapter: the adapter
923 * @fw_data: the firrware image to write
924 * @size: image size
925 *
926 * Write the supplied firmware image to the card's serial flash.
927 * The FW image has the following sections: @size - 8 bytes of code and
928 * data, followed by 4 bytes of FW version, followed by the 32-bit
929 * 1's complement checksum of the whole image.
930 */
931int t3_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size)
932{
933 u32 csum;
934 unsigned int i;
935 const u32 *p = (const u32 *)fw_data;
936 int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16;
937
938 if (size & 3)
939 return -EINVAL;
940 if (size > FW_VERS_ADDR + 8 - FW_FLASH_BOOT_ADDR)
941 return -EFBIG;
942
943 for (csum = 0, i = 0; i < size / sizeof(csum); i++)
944 csum += ntohl(p[i]);
945 if (csum != 0xffffffff) {
946 CH_ERR(adapter, "corrupted firmware image, checksum %u\n",
947 csum);
948 return -EINVAL;
949 }
950
951 ret = t3_flash_erase_sectors(adapter, fw_sector, fw_sector);
952 if (ret)
953 goto out;
954
955 size -= 8; /* trim off version and checksum */
956 for (addr = FW_FLASH_BOOT_ADDR; size;) {
957 unsigned int chunk_size = min(size, 256U);
958
959 ret = t3_write_flash(adapter, addr, chunk_size, fw_data);
960 if (ret)
961 goto out;
962
963 addr += chunk_size;
964 fw_data += chunk_size;
965 size -= chunk_size;
966 }
967
968 ret = t3_write_flash(adapter, FW_VERS_ADDR, 4, fw_data);
969out:
970 if (ret)
971 CH_ERR(adapter, "firmware download failed, error %d\n", ret);
972 return ret;
973}
974
975#define CIM_CTL_BASE 0x2000
976
977/**
978 * t3_cim_ctl_blk_read - read a block from CIM control region
979 *
980 * @adap: the adapter
981 * @addr: the start address within the CIM control region
982 * @n: number of words to read
983 * @valp: where to store the result
984 *
985 * Reads a block of 4-byte words from the CIM control region.
986 */
987int t3_cim_ctl_blk_read(struct adapter *adap, unsigned int addr,
988 unsigned int n, unsigned int *valp)
989{
990 int ret = 0;
991
992 if (t3_read_reg(adap, A_CIM_HOST_ACC_CTRL) & F_HOSTBUSY)
993 return -EBUSY;
994
995 for ( ; !ret && n--; addr += 4) {
996 t3_write_reg(adap, A_CIM_HOST_ACC_CTRL, CIM_CTL_BASE + addr);
997 ret = t3_wait_op_done(adap, A_CIM_HOST_ACC_CTRL, F_HOSTBUSY,
998 0, 5, 2);
999 if (!ret)
1000 *valp++ = t3_read_reg(adap, A_CIM_HOST_ACC_DATA);
1001 }
1002 return ret;
1003}
1004
1005
1006/**
1007 * t3_link_changed - handle interface link changes
1008 * @adapter: the adapter
1009 * @port_id: the port index that changed link state
1010 *
1011 * Called when a port's link settings change to propagate the new values
1012 * to the associated PHY and MAC. After performing the common tasks it
1013 * invokes an OS-specific handler.
1014 */
1015void t3_link_changed(struct adapter *adapter, int port_id)
1016{
1017 int link_ok, speed, duplex, fc;
1018 struct port_info *pi = adap2pinfo(adapter, port_id);
1019 struct cphy *phy = &pi->phy;
1020 struct cmac *mac = &pi->mac;
1021 struct link_config *lc = &pi->link_config;
1022
1023 phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
1024
1025 if (link_ok != lc->link_ok && adapter->params.rev > 0 &&
1026 uses_xaui(adapter)) {
1027 if (link_ok)
1028 t3b_pcs_reset(mac);
1029 t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset,
1030 link_ok ? F_TXACTENABLE | F_RXEN : 0);
1031 }
1032 lc->link_ok = link_ok;
1033 lc->speed = speed < 0 ? SPEED_INVALID : speed;
1034 lc->duplex = duplex < 0 ? DUPLEX_INVALID : duplex;
1035 if (lc->requested_fc & PAUSE_AUTONEG)
1036 fc &= lc->requested_fc;
1037 else
1038 fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1039
1040 if (link_ok && speed >= 0 && lc->autoneg == AUTONEG_ENABLE) {
1041 /* Set MAC speed, duplex, and flow control to match PHY. */
1042 t3_mac_set_speed_duplex_fc(mac, speed, duplex, fc);
1043 lc->fc = fc;
1044 }
1045
1046 t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc);
1047}
1048
1049/**
1050 * t3_link_start - apply link configuration to MAC/PHY
1051 * @phy: the PHY to setup
1052 * @mac: the MAC to setup
1053 * @lc: the requested link configuration
1054 *
1055 * Set up a port's MAC and PHY according to a desired link configuration.
1056 * - If the PHY can auto-negotiate first decide what to advertise, then
1057 * enable/disable auto-negotiation as desired, and reset.
1058 * - If the PHY does not auto-negotiate just reset it.
1059 * - If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
1060 * otherwise do it later based on the outcome of auto-negotiation.
1061 */
1062int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc)
1063{
1064 unsigned int fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1065
1066 lc->link_ok = 0;
1067 if (lc->supported & SUPPORTED_Autoneg) {
1068 lc->advertising &= ~(ADVERTISED_Asym_Pause | ADVERTISED_Pause);
1069 if (fc) {
1070 lc->advertising |= ADVERTISED_Asym_Pause;
1071 if (fc & PAUSE_RX)
1072 lc->advertising |= ADVERTISED_Pause;
1073 }
1074 phy->ops->advertise(phy, lc->advertising);
1075
1076 if (lc->autoneg == AUTONEG_DISABLE) {
1077 lc->speed = lc->requested_speed;
1078 lc->duplex = lc->requested_duplex;
1079 lc->fc = (unsigned char)fc;
1080 t3_mac_set_speed_duplex_fc(mac, lc->speed, lc->duplex,
1081 fc);
1082 /* Also disables autoneg */
1083 phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex);
1084 phy->ops->reset(phy, 0);
1085 } else
1086 phy->ops->autoneg_enable(phy);
1087 } else {
1088 t3_mac_set_speed_duplex_fc(mac, -1, -1, fc);
1089 lc->fc = (unsigned char)fc;
1090 phy->ops->reset(phy, 0);
1091 }
1092 return 0;
1093}
1094
1095/**
1096 * t3_set_vlan_accel - control HW VLAN extraction
1097 * @adapter: the adapter
1098 * @ports: bitmap of adapter ports to operate on
1099 * @on: enable (1) or disable (0) HW VLAN extraction
1100 *
1101 * Enables or disables HW extraction of VLAN tags for the given port.
1102 */
1103void t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on)
1104{
1105 t3_set_reg_field(adapter, A_TP_OUT_CONFIG,
1106 ports << S_VLANEXTRACTIONENABLE,
1107 on ? (ports << S_VLANEXTRACTIONENABLE) : 0);
1108}
1109
1110struct intr_info {
1111 unsigned int mask; /* bits to check in interrupt status */
1112 const char *msg; /* message to print or NULL */
1113 short stat_idx; /* stat counter to increment or -1 */
1114 unsigned short fatal:1; /* whether the condition reported is fatal */
1115};
1116
1117/**
1118 * t3_handle_intr_status - table driven interrupt handler
1119 * @adapter: the adapter that generated the interrupt
1120 * @reg: the interrupt status register to process
1121 * @mask: a mask to apply to the interrupt status
1122 * @acts: table of interrupt actions
1123 * @stats: statistics counters tracking interrupt occurences
1124 *
1125 * A table driven interrupt handler that applies a set of masks to an
1126 * interrupt status word and performs the corresponding actions if the
1127 * interrupts described by the mask have occured. The actions include
1128 * optionally printing a warning or alert message, and optionally
1129 * incrementing a stat counter. The table is terminated by an entry
1130 * specifying mask 0. Returns the number of fatal interrupt conditions.
1131 */
1132static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg,
1133 unsigned int mask,
1134 const struct intr_info *acts,
1135 unsigned long *stats)
1136{
1137 int fatal = 0;
1138 unsigned int status = t3_read_reg(adapter, reg) & mask;
1139
1140 for (; acts->mask; ++acts) {
1141 if (!(status & acts->mask))
1142 continue;
1143 if (acts->fatal) {
1144 fatal++;
1145 CH_ALERT(adapter, "%s (0x%x)\n",
1146 acts->msg, status & acts->mask);
1147 } else if (acts->msg)
1148 CH_WARN(adapter, "%s (0x%x)\n",
1149 acts->msg, status & acts->mask);
1150 if (acts->stat_idx >= 0)
1151 stats[acts->stat_idx]++;
1152 }
1153 if (status) /* clear processed interrupts */
1154 t3_write_reg(adapter, reg, status);
1155 return fatal;
1156}
1157
1158#define SGE_INTR_MASK (F_RSPQDISABLED)
1159#define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \
1160 F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \
1161 F_NFASRCHFAIL)
1162#define MC7_INTR_MASK (F_AE | F_UE | F_CE | V_PE(M_PE))
1163#define XGM_INTR_MASK (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
1164 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR) | \
1165 F_TXFIFO_UNDERRUN | F_RXFIFO_OVERFLOW)
1166#define PCIX_INTR_MASK (F_MSTDETPARERR | F_SIGTARABT | F_RCVTARABT | \
1167 F_RCVMSTABT | F_SIGSYSERR | F_DETPARERR | \
1168 F_SPLCMPDIS | F_UNXSPLCMP | F_RCVSPLCMPERR | \
1169 F_DETCORECCERR | F_DETUNCECCERR | F_PIOPARERR | \
1170 V_WFPARERR(M_WFPARERR) | V_RFPARERR(M_RFPARERR) | \
1171 V_CFPARERR(M_CFPARERR) /* | V_MSIXPARERR(M_MSIXPARERR) */)
1172#define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\
1173 F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \
1174 /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \
1175 V_BISTERR(M_BISTERR) | F_PEXERR)
1176#define ULPRX_INTR_MASK F_PARERR
1177#define ULPTX_INTR_MASK 0
1178#define CPLSW_INTR_MASK (F_TP_FRAMING_ERROR | \
1179 F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \
1180 F_ZERO_SWITCH_ERROR)
1181#define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \
1182 F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \
1183 F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \
1184 F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT)
1185#define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \
1186 V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \
1187 V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR))
1188#define PMRX_INTR_MASK (F_ZERO_E_CMD_ERROR | IESPI_FRM_ERR | OCSPI_FRM_ERR | \
1189 V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR) | \
1190 V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR))
1191#define MPS_INTR_MASK (V_TX0TPPARERRENB(M_TX0TPPARERRENB) | \
1192 V_TX1TPPARERRENB(M_TX1TPPARERRENB) | \
1193 V_RXTPPARERRENB(M_RXTPPARERRENB) | \
1194 V_MCAPARERRENB(M_MCAPARERRENB))
1195#define PL_INTR_MASK (F_T3DBG | F_XGMAC0_0 | F_XGMAC0_1 | F_MC5A | F_PM1_TX | \
1196 F_PM1_RX | F_ULP2_TX | F_ULP2_RX | F_TP1 | F_CIM | \
1197 F_MC7_CM | F_MC7_PMTX | F_MC7_PMRX | F_SGE3 | F_PCIM0 | \
1198 F_MPS0 | F_CPL_SWITCH)
1199
1200/*
1201 * Interrupt handler for the PCIX1 module.
1202 */
1203static void pci_intr_handler(struct adapter *adapter)
1204{
1205 static const struct intr_info pcix1_intr_info[] = {
Divy Le Ray4d22de32007-01-18 22:04:14 -05001206 {F_MSTDETPARERR, "PCI master detected parity error", -1, 1},
1207 {F_SIGTARABT, "PCI signaled target abort", -1, 1},
1208 {F_RCVTARABT, "PCI received target abort", -1, 1},
1209 {F_RCVMSTABT, "PCI received master abort", -1, 1},
1210 {F_SIGSYSERR, "PCI signaled system error", -1, 1},
1211 {F_DETPARERR, "PCI detected parity error", -1, 1},
1212 {F_SPLCMPDIS, "PCI split completion discarded", -1, 1},
1213 {F_UNXSPLCMP, "PCI unexpected split completion error", -1, 1},
1214 {F_RCVSPLCMPERR, "PCI received split completion error", -1,
1215 1},
1216 {F_DETCORECCERR, "PCI correctable ECC error",
1217 STAT_PCI_CORR_ECC, 0},
1218 {F_DETUNCECCERR, "PCI uncorrectable ECC error", -1, 1},
1219 {F_PIOPARERR, "PCI PIO FIFO parity error", -1, 1},
1220 {V_WFPARERR(M_WFPARERR), "PCI write FIFO parity error", -1,
1221 1},
1222 {V_RFPARERR(M_RFPARERR), "PCI read FIFO parity error", -1,
1223 1},
1224 {V_CFPARERR(M_CFPARERR), "PCI command FIFO parity error", -1,
1225 1},
1226 {V_MSIXPARERR(M_MSIXPARERR), "PCI MSI-X table/PBA parity "
1227 "error", -1, 1},
1228 {0}
1229 };
1230
1231 if (t3_handle_intr_status(adapter, A_PCIX_INT_CAUSE, PCIX_INTR_MASK,
1232 pcix1_intr_info, adapter->irq_stats))
1233 t3_fatal_err(adapter);
1234}
1235
1236/*
1237 * Interrupt handler for the PCIE module.
1238 */
1239static void pcie_intr_handler(struct adapter *adapter)
1240{
1241 static const struct intr_info pcie_intr_info[] = {
Divy Le Rayb5a44bc2007-01-30 19:44:01 -08001242 {F_PEXERR, "PCI PEX error", -1, 1},
Divy Le Ray4d22de32007-01-18 22:04:14 -05001243 {F_UNXSPLCPLERRR,
1244 "PCI unexpected split completion DMA read error", -1, 1},
1245 {F_UNXSPLCPLERRC,
1246 "PCI unexpected split completion DMA command error", -1, 1},
1247 {F_PCIE_PIOPARERR, "PCI PIO FIFO parity error", -1, 1},
1248 {F_PCIE_WFPARERR, "PCI write FIFO parity error", -1, 1},
1249 {F_PCIE_RFPARERR, "PCI read FIFO parity error", -1, 1},
1250 {F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1},
1251 {V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR),
1252 "PCI MSI-X table/PBA parity error", -1, 1},
1253 {V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1},
1254 {0}
1255 };
1256
1257 if (t3_handle_intr_status(adapter, A_PCIE_INT_CAUSE, PCIE_INTR_MASK,
1258 pcie_intr_info, adapter->irq_stats))
1259 t3_fatal_err(adapter);
1260}
1261
1262/*
1263 * TP interrupt handler.
1264 */
1265static void tp_intr_handler(struct adapter *adapter)
1266{
1267 static const struct intr_info tp_intr_info[] = {
1268 {0xffffff, "TP parity error", -1, 1},
1269 {0x1000000, "TP out of Rx pages", -1, 1},
1270 {0x2000000, "TP out of Tx pages", -1, 1},
1271 {0}
1272 };
1273
1274 if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff,
1275 tp_intr_info, NULL))
1276 t3_fatal_err(adapter);
1277}
1278
1279/*
1280 * CIM interrupt handler.
1281 */
1282static void cim_intr_handler(struct adapter *adapter)
1283{
1284 static const struct intr_info cim_intr_info[] = {
1285 {F_RSVDSPACEINT, "CIM reserved space write", -1, 1},
1286 {F_SDRAMRANGEINT, "CIM SDRAM address out of range", -1, 1},
1287 {F_FLASHRANGEINT, "CIM flash address out of range", -1, 1},
1288 {F_BLKWRBOOTINT, "CIM block write to boot space", -1, 1},
1289 {F_WRBLKFLASHINT, "CIM write to cached flash space", -1, 1},
1290 {F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1},
1291 {F_BLKRDFLASHINT, "CIM block read from flash space", -1, 1},
1292 {F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1},
1293 {F_BLKRDCTLINT, "CIM block read from CTL space", -1, 1},
1294 {F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1},
1295 {F_BLKRDPLINT, "CIM block read from PL space", -1, 1},
1296 {F_BLKWRPLINT, "CIM block write to PL space", -1, 1},
1297 {0}
1298 };
1299
1300 if (t3_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE, 0xffffffff,
1301 cim_intr_info, NULL))
1302 t3_fatal_err(adapter);
1303}
1304
1305/*
1306 * ULP RX interrupt handler.
1307 */
1308static void ulprx_intr_handler(struct adapter *adapter)
1309{
1310 static const struct intr_info ulprx_intr_info[] = {
1311 {F_PARERR, "ULP RX parity error", -1, 1},
1312 {0}
1313 };
1314
1315 if (t3_handle_intr_status(adapter, A_ULPRX_INT_CAUSE, 0xffffffff,
1316 ulprx_intr_info, NULL))
1317 t3_fatal_err(adapter);
1318}
1319
1320/*
1321 * ULP TX interrupt handler.
1322 */
1323static void ulptx_intr_handler(struct adapter *adapter)
1324{
1325 static const struct intr_info ulptx_intr_info[] = {
1326 {F_PBL_BOUND_ERR_CH0, "ULP TX channel 0 PBL out of bounds",
1327 STAT_ULP_CH0_PBL_OOB, 0},
1328 {F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds",
1329 STAT_ULP_CH1_PBL_OOB, 0},
1330 {0}
1331 };
1332
1333 if (t3_handle_intr_status(adapter, A_ULPTX_INT_CAUSE, 0xffffffff,
1334 ulptx_intr_info, adapter->irq_stats))
1335 t3_fatal_err(adapter);
1336}
1337
1338#define ICSPI_FRM_ERR (F_ICSPI0_FIFO2X_RX_FRAMING_ERROR | \
1339 F_ICSPI1_FIFO2X_RX_FRAMING_ERROR | F_ICSPI0_RX_FRAMING_ERROR | \
1340 F_ICSPI1_RX_FRAMING_ERROR | F_ICSPI0_TX_FRAMING_ERROR | \
1341 F_ICSPI1_TX_FRAMING_ERROR)
1342#define OESPI_FRM_ERR (F_OESPI0_RX_FRAMING_ERROR | \
1343 F_OESPI1_RX_FRAMING_ERROR | F_OESPI0_TX_FRAMING_ERROR | \
1344 F_OESPI1_TX_FRAMING_ERROR | F_OESPI0_OFIFO2X_TX_FRAMING_ERROR | \
1345 F_OESPI1_OFIFO2X_TX_FRAMING_ERROR)
1346
1347/*
1348 * PM TX interrupt handler.
1349 */
1350static void pmtx_intr_handler(struct adapter *adapter)
1351{
1352 static const struct intr_info pmtx_intr_info[] = {
1353 {F_ZERO_C_CMD_ERROR, "PMTX 0-length pcmd", -1, 1},
1354 {ICSPI_FRM_ERR, "PMTX ispi framing error", -1, 1},
1355 {OESPI_FRM_ERR, "PMTX ospi framing error", -1, 1},
1356 {V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR),
1357 "PMTX ispi parity error", -1, 1},
1358 {V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR),
1359 "PMTX ospi parity error", -1, 1},
1360 {0}
1361 };
1362
1363 if (t3_handle_intr_status(adapter, A_PM1_TX_INT_CAUSE, 0xffffffff,
1364 pmtx_intr_info, NULL))
1365 t3_fatal_err(adapter);
1366}
1367
1368#define IESPI_FRM_ERR (F_IESPI0_FIFO2X_RX_FRAMING_ERROR | \
1369 F_IESPI1_FIFO2X_RX_FRAMING_ERROR | F_IESPI0_RX_FRAMING_ERROR | \
1370 F_IESPI1_RX_FRAMING_ERROR | F_IESPI0_TX_FRAMING_ERROR | \
1371 F_IESPI1_TX_FRAMING_ERROR)
1372#define OCSPI_FRM_ERR (F_OCSPI0_RX_FRAMING_ERROR | \
1373 F_OCSPI1_RX_FRAMING_ERROR | F_OCSPI0_TX_FRAMING_ERROR | \
1374 F_OCSPI1_TX_FRAMING_ERROR | F_OCSPI0_OFIFO2X_TX_FRAMING_ERROR | \
1375 F_OCSPI1_OFIFO2X_TX_FRAMING_ERROR)
1376
1377/*
1378 * PM RX interrupt handler.
1379 */
1380static void pmrx_intr_handler(struct adapter *adapter)
1381{
1382 static const struct intr_info pmrx_intr_info[] = {
1383 {F_ZERO_E_CMD_ERROR, "PMRX 0-length pcmd", -1, 1},
1384 {IESPI_FRM_ERR, "PMRX ispi framing error", -1, 1},
1385 {OCSPI_FRM_ERR, "PMRX ospi framing error", -1, 1},
1386 {V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR),
1387 "PMRX ispi parity error", -1, 1},
1388 {V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR),
1389 "PMRX ospi parity error", -1, 1},
1390 {0}
1391 };
1392
1393 if (t3_handle_intr_status(adapter, A_PM1_RX_INT_CAUSE, 0xffffffff,
1394 pmrx_intr_info, NULL))
1395 t3_fatal_err(adapter);
1396}
1397
1398/*
1399 * CPL switch interrupt handler.
1400 */
1401static void cplsw_intr_handler(struct adapter *adapter)
1402{
1403 static const struct intr_info cplsw_intr_info[] = {
1404/* { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, */
1405 {F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1},
1406 {F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1},
1407 {F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1},
1408 {F_ZERO_SWITCH_ERROR, "CPL switch no-switch error", -1, 1},
1409 {0}
1410 };
1411
1412 if (t3_handle_intr_status(adapter, A_CPL_INTR_CAUSE, 0xffffffff,
1413 cplsw_intr_info, NULL))
1414 t3_fatal_err(adapter);
1415}
1416
1417/*
1418 * MPS interrupt handler.
1419 */
1420static void mps_intr_handler(struct adapter *adapter)
1421{
1422 static const struct intr_info mps_intr_info[] = {
1423 {0x1ff, "MPS parity error", -1, 1},
1424 {0}
1425 };
1426
1427 if (t3_handle_intr_status(adapter, A_MPS_INT_CAUSE, 0xffffffff,
1428 mps_intr_info, NULL))
1429 t3_fatal_err(adapter);
1430}
1431
1432#define MC7_INTR_FATAL (F_UE | V_PE(M_PE) | F_AE)
1433
1434/*
1435 * MC7 interrupt handler.
1436 */
1437static void mc7_intr_handler(struct mc7 *mc7)
1438{
1439 struct adapter *adapter = mc7->adapter;
1440 u32 cause = t3_read_reg(adapter, mc7->offset + A_MC7_INT_CAUSE);
1441
1442 if (cause & F_CE) {
1443 mc7->stats.corr_err++;
1444 CH_WARN(adapter, "%s MC7 correctable error at addr 0x%x, "
1445 "data 0x%x 0x%x 0x%x\n", mc7->name,
1446 t3_read_reg(adapter, mc7->offset + A_MC7_CE_ADDR),
1447 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA0),
1448 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA1),
1449 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA2));
1450 }
1451
1452 if (cause & F_UE) {
1453 mc7->stats.uncorr_err++;
1454 CH_ALERT(adapter, "%s MC7 uncorrectable error at addr 0x%x, "
1455 "data 0x%x 0x%x 0x%x\n", mc7->name,
1456 t3_read_reg(adapter, mc7->offset + A_MC7_UE_ADDR),
1457 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA0),
1458 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA1),
1459 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA2));
1460 }
1461
1462 if (G_PE(cause)) {
1463 mc7->stats.parity_err++;
1464 CH_ALERT(adapter, "%s MC7 parity error 0x%x\n",
1465 mc7->name, G_PE(cause));
1466 }
1467
1468 if (cause & F_AE) {
1469 u32 addr = 0;
1470
1471 if (adapter->params.rev > 0)
1472 addr = t3_read_reg(adapter,
1473 mc7->offset + A_MC7_ERR_ADDR);
1474 mc7->stats.addr_err++;
1475 CH_ALERT(adapter, "%s MC7 address error: 0x%x\n",
1476 mc7->name, addr);
1477 }
1478
1479 if (cause & MC7_INTR_FATAL)
1480 t3_fatal_err(adapter);
1481
1482 t3_write_reg(adapter, mc7->offset + A_MC7_INT_CAUSE, cause);
1483}
1484
1485#define XGM_INTR_FATAL (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
1486 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR))
1487/*
1488 * XGMAC interrupt handler.
1489 */
1490static int mac_intr_handler(struct adapter *adap, unsigned int idx)
1491{
1492 struct cmac *mac = &adap2pinfo(adap, idx)->mac;
1493 u32 cause = t3_read_reg(adap, A_XGM_INT_CAUSE + mac->offset);
1494
1495 if (cause & V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR)) {
1496 mac->stats.tx_fifo_parity_err++;
1497 CH_ALERT(adap, "port%d: MAC TX FIFO parity error\n", idx);
1498 }
1499 if (cause & V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR)) {
1500 mac->stats.rx_fifo_parity_err++;
1501 CH_ALERT(adap, "port%d: MAC RX FIFO parity error\n", idx);
1502 }
1503 if (cause & F_TXFIFO_UNDERRUN)
1504 mac->stats.tx_fifo_urun++;
1505 if (cause & F_RXFIFO_OVERFLOW)
1506 mac->stats.rx_fifo_ovfl++;
1507 if (cause & V_SERDES_LOS(M_SERDES_LOS))
1508 mac->stats.serdes_signal_loss++;
1509 if (cause & F_XAUIPCSCTCERR)
1510 mac->stats.xaui_pcs_ctc_err++;
1511 if (cause & F_XAUIPCSALIGNCHANGE)
1512 mac->stats.xaui_pcs_align_change++;
1513
1514 t3_write_reg(adap, A_XGM_INT_CAUSE + mac->offset, cause);
1515 if (cause & XGM_INTR_FATAL)
1516 t3_fatal_err(adap);
1517 return cause != 0;
1518}
1519
1520/*
1521 * Interrupt handler for PHY events.
1522 */
1523int t3_phy_intr_handler(struct adapter *adapter)
1524{
1525 static const int intr_gpio_bits[] = { 8, 0x20 };
1526
1527 u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE);
1528
1529 for_each_port(adapter, i) {
1530 if (cause & intr_gpio_bits[i]) {
1531 struct cphy *phy = &adap2pinfo(adapter, i)->phy;
1532 int phy_cause = phy->ops->intr_handler(phy);
1533
1534 if (phy_cause & cphy_cause_link_change)
1535 t3_link_changed(adapter, i);
1536 if (phy_cause & cphy_cause_fifo_error)
1537 phy->fifo_errors++;
1538 }
1539 }
1540
1541 t3_write_reg(adapter, A_T3DBG_INT_CAUSE, cause);
1542 return 0;
1543}
1544
1545/*
1546 * T3 slow path (non-data) interrupt handler.
1547 */
1548int t3_slow_intr_handler(struct adapter *adapter)
1549{
1550 u32 cause = t3_read_reg(adapter, A_PL_INT_CAUSE0);
1551
1552 cause &= adapter->slow_intr_mask;
1553 if (!cause)
1554 return 0;
1555 if (cause & F_PCIM0) {
1556 if (is_pcie(adapter))
1557 pcie_intr_handler(adapter);
1558 else
1559 pci_intr_handler(adapter);
1560 }
1561 if (cause & F_SGE3)
1562 t3_sge_err_intr_handler(adapter);
1563 if (cause & F_MC7_PMRX)
1564 mc7_intr_handler(&adapter->pmrx);
1565 if (cause & F_MC7_PMTX)
1566 mc7_intr_handler(&adapter->pmtx);
1567 if (cause & F_MC7_CM)
1568 mc7_intr_handler(&adapter->cm);
1569 if (cause & F_CIM)
1570 cim_intr_handler(adapter);
1571 if (cause & F_TP1)
1572 tp_intr_handler(adapter);
1573 if (cause & F_ULP2_RX)
1574 ulprx_intr_handler(adapter);
1575 if (cause & F_ULP2_TX)
1576 ulptx_intr_handler(adapter);
1577 if (cause & F_PM1_RX)
1578 pmrx_intr_handler(adapter);
1579 if (cause & F_PM1_TX)
1580 pmtx_intr_handler(adapter);
1581 if (cause & F_CPL_SWITCH)
1582 cplsw_intr_handler(adapter);
1583 if (cause & F_MPS0)
1584 mps_intr_handler(adapter);
1585 if (cause & F_MC5A)
1586 t3_mc5_intr_handler(&adapter->mc5);
1587 if (cause & F_XGMAC0_0)
1588 mac_intr_handler(adapter, 0);
1589 if (cause & F_XGMAC0_1)
1590 mac_intr_handler(adapter, 1);
1591 if (cause & F_T3DBG)
1592 t3_os_ext_intr_handler(adapter);
1593
1594 /* Clear the interrupts just processed. */
1595 t3_write_reg(adapter, A_PL_INT_CAUSE0, cause);
1596 t3_read_reg(adapter, A_PL_INT_CAUSE0); /* flush */
1597 return 1;
1598}
1599
1600/**
1601 * t3_intr_enable - enable interrupts
1602 * @adapter: the adapter whose interrupts should be enabled
1603 *
1604 * Enable interrupts by setting the interrupt enable registers of the
1605 * various HW modules and then enabling the top-level interrupt
1606 * concentrator.
1607 */
1608void t3_intr_enable(struct adapter *adapter)
1609{
1610 static const struct addr_val_pair intr_en_avp[] = {
1611 {A_SG_INT_ENABLE, SGE_INTR_MASK},
1612 {A_MC7_INT_ENABLE, MC7_INTR_MASK},
1613 {A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
1614 MC7_INTR_MASK},
1615 {A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
1616 MC7_INTR_MASK},
1617 {A_MC5_DB_INT_ENABLE, MC5_INTR_MASK},
1618 {A_ULPRX_INT_ENABLE, ULPRX_INTR_MASK},
1619 {A_TP_INT_ENABLE, 0x3bfffff},
1620 {A_PM1_TX_INT_ENABLE, PMTX_INTR_MASK},
1621 {A_PM1_RX_INT_ENABLE, PMRX_INTR_MASK},
1622 {A_CIM_HOST_INT_ENABLE, CIM_INTR_MASK},
1623 {A_MPS_INT_ENABLE, MPS_INTR_MASK},
1624 };
1625
1626 adapter->slow_intr_mask = PL_INTR_MASK;
1627
1628 t3_write_regs(adapter, intr_en_avp, ARRAY_SIZE(intr_en_avp), 0);
1629
1630 if (adapter->params.rev > 0) {
1631 t3_write_reg(adapter, A_CPL_INTR_ENABLE,
1632 CPLSW_INTR_MASK | F_CIM_OVFL_ERROR);
1633 t3_write_reg(adapter, A_ULPTX_INT_ENABLE,
1634 ULPTX_INTR_MASK | F_PBL_BOUND_ERR_CH0 |
1635 F_PBL_BOUND_ERR_CH1);
1636 } else {
1637 t3_write_reg(adapter, A_CPL_INTR_ENABLE, CPLSW_INTR_MASK);
1638 t3_write_reg(adapter, A_ULPTX_INT_ENABLE, ULPTX_INTR_MASK);
1639 }
1640
1641 t3_write_reg(adapter, A_T3DBG_GPIO_ACT_LOW,
1642 adapter_info(adapter)->gpio_intr);
1643 t3_write_reg(adapter, A_T3DBG_INT_ENABLE,
1644 adapter_info(adapter)->gpio_intr);
1645 if (is_pcie(adapter))
1646 t3_write_reg(adapter, A_PCIE_INT_ENABLE, PCIE_INTR_MASK);
1647 else
1648 t3_write_reg(adapter, A_PCIX_INT_ENABLE, PCIX_INTR_MASK);
1649 t3_write_reg(adapter, A_PL_INT_ENABLE0, adapter->slow_intr_mask);
1650 t3_read_reg(adapter, A_PL_INT_ENABLE0); /* flush */
1651}
1652
1653/**
1654 * t3_intr_disable - disable a card's interrupts
1655 * @adapter: the adapter whose interrupts should be disabled
1656 *
1657 * Disable interrupts. We only disable the top-level interrupt
1658 * concentrator and the SGE data interrupts.
1659 */
1660void t3_intr_disable(struct adapter *adapter)
1661{
1662 t3_write_reg(adapter, A_PL_INT_ENABLE0, 0);
1663 t3_read_reg(adapter, A_PL_INT_ENABLE0); /* flush */
1664 adapter->slow_intr_mask = 0;
1665}
1666
1667/**
1668 * t3_intr_clear - clear all interrupts
1669 * @adapter: the adapter whose interrupts should be cleared
1670 *
1671 * Clears all interrupts.
1672 */
1673void t3_intr_clear(struct adapter *adapter)
1674{
1675 static const unsigned int cause_reg_addr[] = {
1676 A_SG_INT_CAUSE,
1677 A_SG_RSPQ_FL_STATUS,
1678 A_PCIX_INT_CAUSE,
1679 A_MC7_INT_CAUSE,
1680 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
1681 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
1682 A_CIM_HOST_INT_CAUSE,
1683 A_TP_INT_CAUSE,
1684 A_MC5_DB_INT_CAUSE,
1685 A_ULPRX_INT_CAUSE,
1686 A_ULPTX_INT_CAUSE,
1687 A_CPL_INTR_CAUSE,
1688 A_PM1_TX_INT_CAUSE,
1689 A_PM1_RX_INT_CAUSE,
1690 A_MPS_INT_CAUSE,
1691 A_T3DBG_INT_CAUSE,
1692 };
1693 unsigned int i;
1694
1695 /* Clear PHY and MAC interrupts for each port. */
1696 for_each_port(adapter, i)
1697 t3_port_intr_clear(adapter, i);
1698
1699 for (i = 0; i < ARRAY_SIZE(cause_reg_addr); ++i)
1700 t3_write_reg(adapter, cause_reg_addr[i], 0xffffffff);
1701
1702 t3_write_reg(adapter, A_PL_INT_CAUSE0, 0xffffffff);
1703 t3_read_reg(adapter, A_PL_INT_CAUSE0); /* flush */
1704}
1705
1706/**
1707 * t3_port_intr_enable - enable port-specific interrupts
1708 * @adapter: associated adapter
1709 * @idx: index of port whose interrupts should be enabled
1710 *
1711 * Enable port-specific (i.e., MAC and PHY) interrupts for the given
1712 * adapter port.
1713 */
1714void t3_port_intr_enable(struct adapter *adapter, int idx)
1715{
1716 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1717
1718 t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), XGM_INTR_MASK);
1719 t3_read_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx)); /* flush */
1720 phy->ops->intr_enable(phy);
1721}
1722
1723/**
1724 * t3_port_intr_disable - disable port-specific interrupts
1725 * @adapter: associated adapter
1726 * @idx: index of port whose interrupts should be disabled
1727 *
1728 * Disable port-specific (i.e., MAC and PHY) interrupts for the given
1729 * adapter port.
1730 */
1731void t3_port_intr_disable(struct adapter *adapter, int idx)
1732{
1733 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1734
1735 t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), 0);
1736 t3_read_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx)); /* flush */
1737 phy->ops->intr_disable(phy);
1738}
1739
1740/**
1741 * t3_port_intr_clear - clear port-specific interrupts
1742 * @adapter: associated adapter
1743 * @idx: index of port whose interrupts to clear
1744 *
1745 * Clear port-specific (i.e., MAC and PHY) interrupts for the given
1746 * adapter port.
1747 */
1748void t3_port_intr_clear(struct adapter *adapter, int idx)
1749{
1750 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1751
1752 t3_write_reg(adapter, XGM_REG(A_XGM_INT_CAUSE, idx), 0xffffffff);
1753 t3_read_reg(adapter, XGM_REG(A_XGM_INT_CAUSE, idx)); /* flush */
1754 phy->ops->intr_clear(phy);
1755}
1756
1757/**
1758 * t3_sge_write_context - write an SGE context
1759 * @adapter: the adapter
1760 * @id: the context id
1761 * @type: the context type
1762 *
1763 * Program an SGE context with the values already loaded in the
1764 * CONTEXT_DATA? registers.
1765 */
1766static int t3_sge_write_context(struct adapter *adapter, unsigned int id,
1767 unsigned int type)
1768{
1769 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
1770 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
1771 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff);
1772 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
1773 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
1774 V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
1775 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
1776 0, 5, 1);
1777}
1778
1779/**
1780 * t3_sge_init_ecntxt - initialize an SGE egress context
1781 * @adapter: the adapter to configure
1782 * @id: the context id
1783 * @gts_enable: whether to enable GTS for the context
1784 * @type: the egress context type
1785 * @respq: associated response queue
1786 * @base_addr: base address of queue
1787 * @size: number of queue entries
1788 * @token: uP token
1789 * @gen: initial generation value for the context
1790 * @cidx: consumer pointer
1791 *
1792 * Initialize an SGE egress context and make it ready for use. If the
1793 * platform allows concurrent context operations, the caller is
1794 * responsible for appropriate locking.
1795 */
1796int t3_sge_init_ecntxt(struct adapter *adapter, unsigned int id, int gts_enable,
1797 enum sge_context_type type, int respq, u64 base_addr,
1798 unsigned int size, unsigned int token, int gen,
1799 unsigned int cidx)
1800{
1801 unsigned int credits = type == SGE_CNTXT_OFLD ? 0 : FW_WR_NUM;
1802
1803 if (base_addr & 0xfff) /* must be 4K aligned */
1804 return -EINVAL;
1805 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1806 return -EBUSY;
1807
1808 base_addr >>= 12;
1809 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_EC_INDEX(cidx) |
1810 V_EC_CREDITS(credits) | V_EC_GTS(gts_enable));
1811 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, V_EC_SIZE(size) |
1812 V_EC_BASE_LO(base_addr & 0xffff));
1813 base_addr >>= 16;
1814 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, base_addr);
1815 base_addr >>= 32;
1816 t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
1817 V_EC_BASE_HI(base_addr & 0xf) | V_EC_RESPQ(respq) |
1818 V_EC_TYPE(type) | V_EC_GEN(gen) | V_EC_UP_TOKEN(token) |
1819 F_EC_VALID);
1820 return t3_sge_write_context(adapter, id, F_EGRESS);
1821}
1822
1823/**
1824 * t3_sge_init_flcntxt - initialize an SGE free-buffer list context
1825 * @adapter: the adapter to configure
1826 * @id: the context id
1827 * @gts_enable: whether to enable GTS for the context
1828 * @base_addr: base address of queue
1829 * @size: number of queue entries
1830 * @bsize: size of each buffer for this queue
1831 * @cong_thres: threshold to signal congestion to upstream producers
1832 * @gen: initial generation value for the context
1833 * @cidx: consumer pointer
1834 *
1835 * Initialize an SGE free list context and make it ready for use. The
1836 * caller is responsible for ensuring only one context operation occurs
1837 * at a time.
1838 */
1839int t3_sge_init_flcntxt(struct adapter *adapter, unsigned int id,
1840 int gts_enable, u64 base_addr, unsigned int size,
1841 unsigned int bsize, unsigned int cong_thres, int gen,
1842 unsigned int cidx)
1843{
1844 if (base_addr & 0xfff) /* must be 4K aligned */
1845 return -EINVAL;
1846 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1847 return -EBUSY;
1848
1849 base_addr >>= 12;
1850 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, base_addr);
1851 base_addr >>= 32;
1852 t3_write_reg(adapter, A_SG_CONTEXT_DATA1,
1853 V_FL_BASE_HI((u32) base_addr) |
1854 V_FL_INDEX_LO(cidx & M_FL_INDEX_LO));
1855 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, V_FL_SIZE(size) |
1856 V_FL_GEN(gen) | V_FL_INDEX_HI(cidx >> 12) |
1857 V_FL_ENTRY_SIZE_LO(bsize & M_FL_ENTRY_SIZE_LO));
1858 t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
1859 V_FL_ENTRY_SIZE_HI(bsize >> (32 - S_FL_ENTRY_SIZE_LO)) |
1860 V_FL_CONG_THRES(cong_thres) | V_FL_GTS(gts_enable));
1861 return t3_sge_write_context(adapter, id, F_FREELIST);
1862}
1863
1864/**
1865 * t3_sge_init_rspcntxt - initialize an SGE response queue context
1866 * @adapter: the adapter to configure
1867 * @id: the context id
1868 * @irq_vec_idx: MSI-X interrupt vector index, 0 if no MSI-X, -1 if no IRQ
1869 * @base_addr: base address of queue
1870 * @size: number of queue entries
1871 * @fl_thres: threshold for selecting the normal or jumbo free list
1872 * @gen: initial generation value for the context
1873 * @cidx: consumer pointer
1874 *
1875 * Initialize an SGE response queue context and make it ready for use.
1876 * The caller is responsible for ensuring only one context operation
1877 * occurs at a time.
1878 */
1879int t3_sge_init_rspcntxt(struct adapter *adapter, unsigned int id,
1880 int irq_vec_idx, u64 base_addr, unsigned int size,
1881 unsigned int fl_thres, int gen, unsigned int cidx)
1882{
1883 unsigned int intr = 0;
1884
1885 if (base_addr & 0xfff) /* must be 4K aligned */
1886 return -EINVAL;
1887 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1888 return -EBUSY;
1889
1890 base_addr >>= 12;
1891 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size) |
1892 V_CQ_INDEX(cidx));
1893 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, base_addr);
1894 base_addr >>= 32;
1895 if (irq_vec_idx >= 0)
1896 intr = V_RQ_MSI_VEC(irq_vec_idx) | F_RQ_INTR_EN;
1897 t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
1898 V_CQ_BASE_HI((u32) base_addr) | intr | V_RQ_GEN(gen));
1899 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, fl_thres);
1900 return t3_sge_write_context(adapter, id, F_RESPONSEQ);
1901}
1902
1903/**
1904 * t3_sge_init_cqcntxt - initialize an SGE completion queue context
1905 * @adapter: the adapter to configure
1906 * @id: the context id
1907 * @base_addr: base address of queue
1908 * @size: number of queue entries
1909 * @rspq: response queue for async notifications
1910 * @ovfl_mode: CQ overflow mode
1911 * @credits: completion queue credits
1912 * @credit_thres: the credit threshold
1913 *
1914 * Initialize an SGE completion queue context and make it ready for use.
1915 * The caller is responsible for ensuring only one context operation
1916 * occurs at a time.
1917 */
1918int t3_sge_init_cqcntxt(struct adapter *adapter, unsigned int id, u64 base_addr,
1919 unsigned int size, int rspq, int ovfl_mode,
1920 unsigned int credits, unsigned int credit_thres)
1921{
1922 if (base_addr & 0xfff) /* must be 4K aligned */
1923 return -EINVAL;
1924 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1925 return -EBUSY;
1926
1927 base_addr >>= 12;
1928 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size));
1929 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, base_addr);
1930 base_addr >>= 32;
1931 t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
1932 V_CQ_BASE_HI((u32) base_addr) | V_CQ_RSPQ(rspq) |
1933 V_CQ_GEN(1) | V_CQ_OVERFLOW_MODE(ovfl_mode));
1934 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_CQ_CREDITS(credits) |
1935 V_CQ_CREDIT_THRES(credit_thres));
1936 return t3_sge_write_context(adapter, id, F_CQ);
1937}
1938
1939/**
1940 * t3_sge_enable_ecntxt - enable/disable an SGE egress context
1941 * @adapter: the adapter
1942 * @id: the egress context id
1943 * @enable: enable (1) or disable (0) the context
1944 *
1945 * Enable or disable an SGE egress context. The caller is responsible for
1946 * ensuring only one context operation occurs at a time.
1947 */
1948int t3_sge_enable_ecntxt(struct adapter *adapter, unsigned int id, int enable)
1949{
1950 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1951 return -EBUSY;
1952
1953 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
1954 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
1955 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
1956 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, F_EC_VALID);
1957 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_EC_VALID(enable));
1958 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
1959 V_CONTEXT_CMD_OPCODE(1) | F_EGRESS | V_CONTEXT(id));
1960 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
1961 0, 5, 1);
1962}
1963
1964/**
1965 * t3_sge_disable_fl - disable an SGE free-buffer list
1966 * @adapter: the adapter
1967 * @id: the free list context id
1968 *
1969 * Disable an SGE free-buffer list. The caller is responsible for
1970 * ensuring only one context operation occurs at a time.
1971 */
1972int t3_sge_disable_fl(struct adapter *adapter, unsigned int id)
1973{
1974 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1975 return -EBUSY;
1976
1977 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
1978 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
1979 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, V_FL_SIZE(M_FL_SIZE));
1980 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
1981 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, 0);
1982 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
1983 V_CONTEXT_CMD_OPCODE(1) | F_FREELIST | V_CONTEXT(id));
1984 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
1985 0, 5, 1);
1986}
1987
1988/**
1989 * t3_sge_disable_rspcntxt - disable an SGE response queue
1990 * @adapter: the adapter
1991 * @id: the response queue context id
1992 *
1993 * Disable an SGE response queue. The caller is responsible for
1994 * ensuring only one context operation occurs at a time.
1995 */
1996int t3_sge_disable_rspcntxt(struct adapter *adapter, unsigned int id)
1997{
1998 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1999 return -EBUSY;
2000
2001 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2002 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2003 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2004 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2005 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2006 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2007 V_CONTEXT_CMD_OPCODE(1) | F_RESPONSEQ | V_CONTEXT(id));
2008 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2009 0, 5, 1);
2010}
2011
2012/**
2013 * t3_sge_disable_cqcntxt - disable an SGE completion queue
2014 * @adapter: the adapter
2015 * @id: the completion queue context id
2016 *
2017 * Disable an SGE completion queue. The caller is responsible for
2018 * ensuring only one context operation occurs at a time.
2019 */
2020int t3_sge_disable_cqcntxt(struct adapter *adapter, unsigned int id)
2021{
2022 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2023 return -EBUSY;
2024
2025 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2026 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2027 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2028 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2029 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2030 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2031 V_CONTEXT_CMD_OPCODE(1) | F_CQ | V_CONTEXT(id));
2032 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2033 0, 5, 1);
2034}
2035
2036/**
2037 * t3_sge_cqcntxt_op - perform an operation on a completion queue context
2038 * @adapter: the adapter
2039 * @id: the context id
2040 * @op: the operation to perform
2041 *
2042 * Perform the selected operation on an SGE completion queue context.
2043 * The caller is responsible for ensuring only one context operation
2044 * occurs at a time.
2045 */
2046int t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
2047 unsigned int credits)
2048{
2049 u32 val;
2050
2051 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2052 return -EBUSY;
2053
2054 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, credits << 16);
2055 t3_write_reg(adapter, A_SG_CONTEXT_CMD, V_CONTEXT_CMD_OPCODE(op) |
2056 V_CONTEXT(id) | F_CQ);
2057 if (t3_wait_op_done_val(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2058 0, 5, 1, &val))
2059 return -EIO;
2060
2061 if (op >= 2 && op < 7) {
2062 if (adapter->params.rev > 0)
2063 return G_CQ_INDEX(val);
2064
2065 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2066 V_CONTEXT_CMD_OPCODE(0) | F_CQ | V_CONTEXT(id));
2067 if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD,
2068 F_CONTEXT_CMD_BUSY, 0, 5, 1))
2069 return -EIO;
2070 return G_CQ_INDEX(t3_read_reg(adapter, A_SG_CONTEXT_DATA0));
2071 }
2072 return 0;
2073}
2074
2075/**
2076 * t3_sge_read_context - read an SGE context
2077 * @type: the context type
2078 * @adapter: the adapter
2079 * @id: the context id
2080 * @data: holds the retrieved context
2081 *
2082 * Read an SGE egress context. The caller is responsible for ensuring
2083 * only one context operation occurs at a time.
2084 */
2085static int t3_sge_read_context(unsigned int type, struct adapter *adapter,
2086 unsigned int id, u32 data[4])
2087{
2088 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2089 return -EBUSY;
2090
2091 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2092 V_CONTEXT_CMD_OPCODE(0) | type | V_CONTEXT(id));
2093 if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 0,
2094 5, 1))
2095 return -EIO;
2096 data[0] = t3_read_reg(adapter, A_SG_CONTEXT_DATA0);
2097 data[1] = t3_read_reg(adapter, A_SG_CONTEXT_DATA1);
2098 data[2] = t3_read_reg(adapter, A_SG_CONTEXT_DATA2);
2099 data[3] = t3_read_reg(adapter, A_SG_CONTEXT_DATA3);
2100 return 0;
2101}
2102
2103/**
2104 * t3_sge_read_ecntxt - read an SGE egress context
2105 * @adapter: the adapter
2106 * @id: the context id
2107 * @data: holds the retrieved context
2108 *
2109 * Read an SGE egress context. The caller is responsible for ensuring
2110 * only one context operation occurs at a time.
2111 */
2112int t3_sge_read_ecntxt(struct adapter *adapter, unsigned int id, u32 data[4])
2113{
2114 if (id >= 65536)
2115 return -EINVAL;
2116 return t3_sge_read_context(F_EGRESS, adapter, id, data);
2117}
2118
2119/**
2120 * t3_sge_read_cq - read an SGE CQ context
2121 * @adapter: the adapter
2122 * @id: the context id
2123 * @data: holds the retrieved context
2124 *
2125 * Read an SGE CQ context. The caller is responsible for ensuring
2126 * only one context operation occurs at a time.
2127 */
2128int t3_sge_read_cq(struct adapter *adapter, unsigned int id, u32 data[4])
2129{
2130 if (id >= 65536)
2131 return -EINVAL;
2132 return t3_sge_read_context(F_CQ, adapter, id, data);
2133}
2134
2135/**
2136 * t3_sge_read_fl - read an SGE free-list context
2137 * @adapter: the adapter
2138 * @id: the context id
2139 * @data: holds the retrieved context
2140 *
2141 * Read an SGE free-list context. The caller is responsible for ensuring
2142 * only one context operation occurs at a time.
2143 */
2144int t3_sge_read_fl(struct adapter *adapter, unsigned int id, u32 data[4])
2145{
2146 if (id >= SGE_QSETS * 2)
2147 return -EINVAL;
2148 return t3_sge_read_context(F_FREELIST, adapter, id, data);
2149}
2150
2151/**
2152 * t3_sge_read_rspq - read an SGE response queue context
2153 * @adapter: the adapter
2154 * @id: the context id
2155 * @data: holds the retrieved context
2156 *
2157 * Read an SGE response queue context. The caller is responsible for
2158 * ensuring only one context operation occurs at a time.
2159 */
2160int t3_sge_read_rspq(struct adapter *adapter, unsigned int id, u32 data[4])
2161{
2162 if (id >= SGE_QSETS)
2163 return -EINVAL;
2164 return t3_sge_read_context(F_RESPONSEQ, adapter, id, data);
2165}
2166
2167/**
2168 * t3_config_rss - configure Rx packet steering
2169 * @adapter: the adapter
2170 * @rss_config: RSS settings (written to TP_RSS_CONFIG)
2171 * @cpus: values for the CPU lookup table (0xff terminated)
2172 * @rspq: values for the response queue lookup table (0xffff terminated)
2173 *
2174 * Programs the receive packet steering logic. @cpus and @rspq provide
2175 * the values for the CPU and response queue lookup tables. If they
2176 * provide fewer values than the size of the tables the supplied values
2177 * are used repeatedly until the tables are fully populated.
2178 */
2179void t3_config_rss(struct adapter *adapter, unsigned int rss_config,
2180 const u8 * cpus, const u16 *rspq)
2181{
2182 int i, j, cpu_idx = 0, q_idx = 0;
2183
2184 if (cpus)
2185 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2186 u32 val = i << 16;
2187
2188 for (j = 0; j < 2; ++j) {
2189 val |= (cpus[cpu_idx++] & 0x3f) << (8 * j);
2190 if (cpus[cpu_idx] == 0xff)
2191 cpu_idx = 0;
2192 }
2193 t3_write_reg(adapter, A_TP_RSS_LKP_TABLE, val);
2194 }
2195
2196 if (rspq)
2197 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2198 t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
2199 (i << 16) | rspq[q_idx++]);
2200 if (rspq[q_idx] == 0xffff)
2201 q_idx = 0;
2202 }
2203
2204 t3_write_reg(adapter, A_TP_RSS_CONFIG, rss_config);
2205}
2206
2207/**
2208 * t3_read_rss - read the contents of the RSS tables
2209 * @adapter: the adapter
2210 * @lkup: holds the contents of the RSS lookup table
2211 * @map: holds the contents of the RSS map table
2212 *
2213 * Reads the contents of the receive packet steering tables.
2214 */
2215int t3_read_rss(struct adapter *adapter, u8 * lkup, u16 *map)
2216{
2217 int i;
2218 u32 val;
2219
2220 if (lkup)
2221 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2222 t3_write_reg(adapter, A_TP_RSS_LKP_TABLE,
2223 0xffff0000 | i);
2224 val = t3_read_reg(adapter, A_TP_RSS_LKP_TABLE);
2225 if (!(val & 0x80000000))
2226 return -EAGAIN;
2227 *lkup++ = val;
2228 *lkup++ = (val >> 8);
2229 }
2230
2231 if (map)
2232 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2233 t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
2234 0xffff0000 | i);
2235 val = t3_read_reg(adapter, A_TP_RSS_MAP_TABLE);
2236 if (!(val & 0x80000000))
2237 return -EAGAIN;
2238 *map++ = val;
2239 }
2240 return 0;
2241}
2242
2243/**
2244 * t3_tp_set_offload_mode - put TP in NIC/offload mode
2245 * @adap: the adapter
2246 * @enable: 1 to select offload mode, 0 for regular NIC
2247 *
2248 * Switches TP to NIC/offload mode.
2249 */
2250void t3_tp_set_offload_mode(struct adapter *adap, int enable)
2251{
2252 if (is_offload(adap) || !enable)
2253 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_NICMODE,
2254 V_NICMODE(!enable));
2255}
2256
2257/**
2258 * pm_num_pages - calculate the number of pages of the payload memory
2259 * @mem_size: the size of the payload memory
2260 * @pg_size: the size of each payload memory page
2261 *
2262 * Calculate the number of pages, each of the given size, that fit in a
2263 * memory of the specified size, respecting the HW requirement that the
2264 * number of pages must be a multiple of 24.
2265 */
2266static inline unsigned int pm_num_pages(unsigned int mem_size,
2267 unsigned int pg_size)
2268{
2269 unsigned int n = mem_size / pg_size;
2270
2271 return n - n % 24;
2272}
2273
2274#define mem_region(adap, start, size, reg) \
2275 t3_write_reg((adap), A_ ## reg, (start)); \
2276 start += size
2277
2278/*
2279 * partition_mem - partition memory and configure TP memory settings
2280 * @adap: the adapter
2281 * @p: the TP parameters
2282 *
2283 * Partitions context and payload memory and configures TP's memory
2284 * registers.
2285 */
2286static void partition_mem(struct adapter *adap, const struct tp_params *p)
2287{
2288 unsigned int m, pstructs, tids = t3_mc5_size(&adap->mc5);
2289 unsigned int timers = 0, timers_shift = 22;
2290
2291 if (adap->params.rev > 0) {
2292 if (tids <= 16 * 1024) {
2293 timers = 1;
2294 timers_shift = 16;
2295 } else if (tids <= 64 * 1024) {
2296 timers = 2;
2297 timers_shift = 18;
2298 } else if (tids <= 256 * 1024) {
2299 timers = 3;
2300 timers_shift = 20;
2301 }
2302 }
2303
2304 t3_write_reg(adap, A_TP_PMM_SIZE,
2305 p->chan_rx_size | (p->chan_tx_size >> 16));
2306
2307 t3_write_reg(adap, A_TP_PMM_TX_BASE, 0);
2308 t3_write_reg(adap, A_TP_PMM_TX_PAGE_SIZE, p->tx_pg_size);
2309 t3_write_reg(adap, A_TP_PMM_TX_MAX_PAGE, p->tx_num_pgs);
2310 t3_set_reg_field(adap, A_TP_PARA_REG3, V_TXDATAACKIDX(M_TXDATAACKIDX),
2311 V_TXDATAACKIDX(fls(p->tx_pg_size) - 12));
2312
2313 t3_write_reg(adap, A_TP_PMM_RX_BASE, 0);
2314 t3_write_reg(adap, A_TP_PMM_RX_PAGE_SIZE, p->rx_pg_size);
2315 t3_write_reg(adap, A_TP_PMM_RX_MAX_PAGE, p->rx_num_pgs);
2316
2317 pstructs = p->rx_num_pgs + p->tx_num_pgs;
2318 /* Add a bit of headroom and make multiple of 24 */
2319 pstructs += 48;
2320 pstructs -= pstructs % 24;
2321 t3_write_reg(adap, A_TP_CMM_MM_MAX_PSTRUCT, pstructs);
2322
2323 m = tids * TCB_SIZE;
2324 mem_region(adap, m, (64 << 10) * 64, SG_EGR_CNTX_BADDR);
2325 mem_region(adap, m, (64 << 10) * 64, SG_CQ_CONTEXT_BADDR);
2326 t3_write_reg(adap, A_TP_CMM_TIMER_BASE, V_CMTIMERMAXNUM(timers) | m);
2327 m += ((p->ntimer_qs - 1) << timers_shift) + (1 << 22);
2328 mem_region(adap, m, pstructs * 64, TP_CMM_MM_BASE);
2329 mem_region(adap, m, 64 * (pstructs / 24), TP_CMM_MM_PS_FLST_BASE);
2330 mem_region(adap, m, 64 * (p->rx_num_pgs / 24), TP_CMM_MM_RX_FLST_BASE);
2331 mem_region(adap, m, 64 * (p->tx_num_pgs / 24), TP_CMM_MM_TX_FLST_BASE);
2332
2333 m = (m + 4095) & ~0xfff;
2334 t3_write_reg(adap, A_CIM_SDRAM_BASE_ADDR, m);
2335 t3_write_reg(adap, A_CIM_SDRAM_ADDR_SIZE, p->cm_size - m);
2336
2337 tids = (p->cm_size - m - (3 << 20)) / 3072 - 32;
2338 m = t3_mc5_size(&adap->mc5) - adap->params.mc5.nservers -
2339 adap->params.mc5.nfilters - adap->params.mc5.nroutes;
2340 if (tids < m)
2341 adap->params.mc5.nservers += m - tids;
2342}
2343
2344static inline void tp_wr_indirect(struct adapter *adap, unsigned int addr,
2345 u32 val)
2346{
2347 t3_write_reg(adap, A_TP_PIO_ADDR, addr);
2348 t3_write_reg(adap, A_TP_PIO_DATA, val);
2349}
2350
2351static void tp_config(struct adapter *adap, const struct tp_params *p)
2352{
Divy Le Ray4d22de32007-01-18 22:04:14 -05002353 t3_write_reg(adap, A_TP_GLOBAL_CONFIG, F_TXPACINGENABLE | F_PATHMTU |
2354 F_IPCHECKSUMOFFLOAD | F_UDPCHECKSUMOFFLOAD |
2355 F_TCPCHECKSUMOFFLOAD | V_IPTTL(64));
2356 t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) |
2357 F_MTUENABLE | V_WINDOWSCALEMODE(1) |
2358 V_TIMESTAMPSMODE(1) | V_SACKMODE(1) | V_SACKRX(1));
2359 t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) |
2360 V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
2361 V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) |
2362 F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1));
2363 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_IPV6ENABLE | F_NICMODE,
2364 F_IPV6ENABLE | F_NICMODE);
2365 t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814);
2366 t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105);
2367 t3_set_reg_field(adap, A_TP_PARA_REG6,
2368 adap->params.rev > 0 ? F_ENABLEESND : F_T3A_ENABLEESND,
2369 0);
2370
Divy Le Ray3b1d3072007-01-30 19:44:07 -08002371 t3_set_reg_field(adap, A_TP_PC_CONFIG,
2372 F_ENABLEEPCMDAFULL | F_ENABLEOCSPIFULL,
2373 F_TXDEFERENABLE | F_HEARBEATDACK | F_TXCONGESTIONMODE |
2374 F_RXCONGESTIONMODE);
2375 t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002376
2377 if (adap->params.rev > 0) {
2378 tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE);
2379 t3_set_reg_field(adap, A_TP_PARA_REG3, F_TXPACEAUTO,
2380 F_TXPACEAUTO);
2381 t3_set_reg_field(adap, A_TP_PC_CONFIG, F_LOCKTID, F_LOCKTID);
2382 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEAUTOSTRICT);
2383 } else
2384 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEFIXED);
2385
2386 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0x12121212);
2387 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0x12121212);
2388 t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0x1212);
2389}
2390
2391/* Desired TP timer resolution in usec */
2392#define TP_TMR_RES 50
2393
2394/* TCP timer values in ms */
2395#define TP_DACK_TIMER 50
2396#define TP_RTO_MIN 250
2397
2398/**
2399 * tp_set_timers - set TP timing parameters
2400 * @adap: the adapter to set
2401 * @core_clk: the core clock frequency in Hz
2402 *
2403 * Set TP's timing parameters, such as the various timer resolutions and
2404 * the TCP timer values.
2405 */
2406static void tp_set_timers(struct adapter *adap, unsigned int core_clk)
2407{
2408 unsigned int tre = fls(core_clk / (1000000 / TP_TMR_RES)) - 1;
2409 unsigned int dack_re = fls(core_clk / 5000) - 1; /* 200us */
2410 unsigned int tstamp_re = fls(core_clk / 1000); /* 1ms, at least */
2411 unsigned int tps = core_clk >> tre;
2412
2413 t3_write_reg(adap, A_TP_TIMER_RESOLUTION, V_TIMERRESOLUTION(tre) |
2414 V_DELAYEDACKRESOLUTION(dack_re) |
2415 V_TIMESTAMPRESOLUTION(tstamp_re));
2416 t3_write_reg(adap, A_TP_DACK_TIMER,
2417 (core_clk >> dack_re) / (1000 / TP_DACK_TIMER));
2418 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG0, 0x3020100);
2419 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG1, 0x7060504);
2420 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG2, 0xb0a0908);
2421 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG3, 0xf0e0d0c);
2422 t3_write_reg(adap, A_TP_SHIFT_CNT, V_SYNSHIFTMAX(6) |
2423 V_RXTSHIFTMAXR1(4) | V_RXTSHIFTMAXR2(15) |
2424 V_PERSHIFTBACKOFFMAX(8) | V_PERSHIFTMAX(8) |
2425 V_KEEPALIVEMAX(9));
2426
2427#define SECONDS * tps
2428
2429 t3_write_reg(adap, A_TP_MSL, adap->params.rev > 0 ? 0 : 2 SECONDS);
2430 t3_write_reg(adap, A_TP_RXT_MIN, tps / (1000 / TP_RTO_MIN));
2431 t3_write_reg(adap, A_TP_RXT_MAX, 64 SECONDS);
2432 t3_write_reg(adap, A_TP_PERS_MIN, 5 SECONDS);
2433 t3_write_reg(adap, A_TP_PERS_MAX, 64 SECONDS);
2434 t3_write_reg(adap, A_TP_KEEP_IDLE, 7200 SECONDS);
2435 t3_write_reg(adap, A_TP_KEEP_INTVL, 75 SECONDS);
2436 t3_write_reg(adap, A_TP_INIT_SRTT, 3 SECONDS);
2437 t3_write_reg(adap, A_TP_FINWAIT2_TIMER, 600 SECONDS);
2438
2439#undef SECONDS
2440}
2441
2442/**
2443 * t3_tp_set_coalescing_size - set receive coalescing size
2444 * @adap: the adapter
2445 * @size: the receive coalescing size
2446 * @psh: whether a set PSH bit should deliver coalesced data
2447 *
2448 * Set the receive coalescing size and PSH bit handling.
2449 */
2450int t3_tp_set_coalescing_size(struct adapter *adap, unsigned int size, int psh)
2451{
2452 u32 val;
2453
2454 if (size > MAX_RX_COALESCING_LEN)
2455 return -EINVAL;
2456
2457 val = t3_read_reg(adap, A_TP_PARA_REG3);
2458 val &= ~(F_RXCOALESCEENABLE | F_RXCOALESCEPSHEN);
2459
2460 if (size) {
2461 val |= F_RXCOALESCEENABLE;
2462 if (psh)
2463 val |= F_RXCOALESCEPSHEN;
2464 t3_write_reg(adap, A_TP_PARA_REG2, V_RXCOALESCESIZE(size) |
2465 V_MAXRXDATA(MAX_RX_COALESCING_LEN));
2466 }
2467 t3_write_reg(adap, A_TP_PARA_REG3, val);
2468 return 0;
2469}
2470
2471/**
2472 * t3_tp_set_max_rxsize - set the max receive size
2473 * @adap: the adapter
2474 * @size: the max receive size
2475 *
2476 * Set TP's max receive size. This is the limit that applies when
2477 * receive coalescing is disabled.
2478 */
2479void t3_tp_set_max_rxsize(struct adapter *adap, unsigned int size)
2480{
2481 t3_write_reg(adap, A_TP_PARA_REG7,
2482 V_PMMAXXFERLEN0(size) | V_PMMAXXFERLEN1(size));
2483}
2484
2485static void __devinit init_mtus(unsigned short mtus[])
2486{
2487 /*
2488 * See draft-mathis-plpmtud-00.txt for the values. The min is 88 so
2489 * it can accomodate max size TCP/IP headers when SACK and timestamps
2490 * are enabled and still have at least 8 bytes of payload.
2491 */
2492 mtus[0] = 88;
2493 mtus[1] = 256;
2494 mtus[2] = 512;
2495 mtus[3] = 576;
2496 mtus[4] = 808;
2497 mtus[5] = 1024;
2498 mtus[6] = 1280;
2499 mtus[7] = 1492;
2500 mtus[8] = 1500;
2501 mtus[9] = 2002;
2502 mtus[10] = 2048;
2503 mtus[11] = 4096;
2504 mtus[12] = 4352;
2505 mtus[13] = 8192;
2506 mtus[14] = 9000;
2507 mtus[15] = 9600;
2508}
2509
2510/*
2511 * Initial congestion control parameters.
2512 */
2513static void __devinit init_cong_ctrl(unsigned short *a, unsigned short *b)
2514{
2515 a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
2516 a[9] = 2;
2517 a[10] = 3;
2518 a[11] = 4;
2519 a[12] = 5;
2520 a[13] = 6;
2521 a[14] = 7;
2522 a[15] = 8;
2523 a[16] = 9;
2524 a[17] = 10;
2525 a[18] = 14;
2526 a[19] = 17;
2527 a[20] = 21;
2528 a[21] = 25;
2529 a[22] = 30;
2530 a[23] = 35;
2531 a[24] = 45;
2532 a[25] = 60;
2533 a[26] = 80;
2534 a[27] = 100;
2535 a[28] = 200;
2536 a[29] = 300;
2537 a[30] = 400;
2538 a[31] = 500;
2539
2540 b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
2541 b[9] = b[10] = 1;
2542 b[11] = b[12] = 2;
2543 b[13] = b[14] = b[15] = b[16] = 3;
2544 b[17] = b[18] = b[19] = b[20] = b[21] = 4;
2545 b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
2546 b[28] = b[29] = 6;
2547 b[30] = b[31] = 7;
2548}
2549
2550/* The minimum additive increment value for the congestion control table */
2551#define CC_MIN_INCR 2U
2552
2553/**
2554 * t3_load_mtus - write the MTU and congestion control HW tables
2555 * @adap: the adapter
2556 * @mtus: the unrestricted values for the MTU table
2557 * @alphs: the values for the congestion control alpha parameter
2558 * @beta: the values for the congestion control beta parameter
2559 * @mtu_cap: the maximum permitted effective MTU
2560 *
2561 * Write the MTU table with the supplied MTUs capping each at &mtu_cap.
2562 * Update the high-speed congestion control table with the supplied alpha,
2563 * beta, and MTUs.
2564 */
2565void t3_load_mtus(struct adapter *adap, unsigned short mtus[NMTUS],
2566 unsigned short alpha[NCCTRL_WIN],
2567 unsigned short beta[NCCTRL_WIN], unsigned short mtu_cap)
2568{
2569 static const unsigned int avg_pkts[NCCTRL_WIN] = {
2570 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
2571 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
2572 28672, 40960, 57344, 81920, 114688, 163840, 229376
2573 };
2574
2575 unsigned int i, w;
2576
2577 for (i = 0; i < NMTUS; ++i) {
2578 unsigned int mtu = min(mtus[i], mtu_cap);
2579 unsigned int log2 = fls(mtu);
2580
2581 if (!(mtu & ((1 << log2) >> 2))) /* round */
2582 log2--;
2583 t3_write_reg(adap, A_TP_MTU_TABLE,
2584 (i << 24) | (log2 << 16) | mtu);
2585
2586 for (w = 0; w < NCCTRL_WIN; ++w) {
2587 unsigned int inc;
2588
2589 inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
2590 CC_MIN_INCR);
2591
2592 t3_write_reg(adap, A_TP_CCTRL_TABLE, (i << 21) |
2593 (w << 16) | (beta[w] << 13) | inc);
2594 }
2595 }
2596}
2597
2598/**
2599 * t3_read_hw_mtus - returns the values in the HW MTU table
2600 * @adap: the adapter
2601 * @mtus: where to store the HW MTU values
2602 *
2603 * Reads the HW MTU table.
2604 */
2605void t3_read_hw_mtus(struct adapter *adap, unsigned short mtus[NMTUS])
2606{
2607 int i;
2608
2609 for (i = 0; i < NMTUS; ++i) {
2610 unsigned int val;
2611
2612 t3_write_reg(adap, A_TP_MTU_TABLE, 0xff000000 | i);
2613 val = t3_read_reg(adap, A_TP_MTU_TABLE);
2614 mtus[i] = val & 0x3fff;
2615 }
2616}
2617
2618/**
2619 * t3_get_cong_cntl_tab - reads the congestion control table
2620 * @adap: the adapter
2621 * @incr: where to store the alpha values
2622 *
2623 * Reads the additive increments programmed into the HW congestion
2624 * control table.
2625 */
2626void t3_get_cong_cntl_tab(struct adapter *adap,
2627 unsigned short incr[NMTUS][NCCTRL_WIN])
2628{
2629 unsigned int mtu, w;
2630
2631 for (mtu = 0; mtu < NMTUS; ++mtu)
2632 for (w = 0; w < NCCTRL_WIN; ++w) {
2633 t3_write_reg(adap, A_TP_CCTRL_TABLE,
2634 0xffff0000 | (mtu << 5) | w);
2635 incr[mtu][w] = t3_read_reg(adap, A_TP_CCTRL_TABLE) &
2636 0x1fff;
2637 }
2638}
2639
2640/**
2641 * t3_tp_get_mib_stats - read TP's MIB counters
2642 * @adap: the adapter
2643 * @tps: holds the returned counter values
2644 *
2645 * Returns the values of TP's MIB counters.
2646 */
2647void t3_tp_get_mib_stats(struct adapter *adap, struct tp_mib_stats *tps)
2648{
2649 t3_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_RDATA, (u32 *) tps,
2650 sizeof(*tps) / sizeof(u32), 0);
2651}
2652
2653#define ulp_region(adap, name, start, len) \
2654 t3_write_reg((adap), A_ULPRX_ ## name ## _LLIMIT, (start)); \
2655 t3_write_reg((adap), A_ULPRX_ ## name ## _ULIMIT, \
2656 (start) + (len) - 1); \
2657 start += len
2658
2659#define ulptx_region(adap, name, start, len) \
2660 t3_write_reg((adap), A_ULPTX_ ## name ## _LLIMIT, (start)); \
2661 t3_write_reg((adap), A_ULPTX_ ## name ## _ULIMIT, \
2662 (start) + (len) - 1)
2663
2664static void ulp_config(struct adapter *adap, const struct tp_params *p)
2665{
2666 unsigned int m = p->chan_rx_size;
2667
2668 ulp_region(adap, ISCSI, m, p->chan_rx_size / 8);
2669 ulp_region(adap, TDDP, m, p->chan_rx_size / 8);
2670 ulptx_region(adap, TPT, m, p->chan_rx_size / 4);
2671 ulp_region(adap, STAG, m, p->chan_rx_size / 4);
2672 ulp_region(adap, RQ, m, p->chan_rx_size / 4);
2673 ulptx_region(adap, PBL, m, p->chan_rx_size / 4);
2674 ulp_region(adap, PBL, m, p->chan_rx_size / 4);
2675 t3_write_reg(adap, A_ULPRX_TDDP_TAGMASK, 0xffffffff);
2676}
2677
2678void t3_config_trace_filter(struct adapter *adapter,
2679 const struct trace_params *tp, int filter_index,
2680 int invert, int enable)
2681{
2682 u32 addr, key[4], mask[4];
2683
2684 key[0] = tp->sport | (tp->sip << 16);
2685 key[1] = (tp->sip >> 16) | (tp->dport << 16);
2686 key[2] = tp->dip;
2687 key[3] = tp->proto | (tp->vlan << 8) | (tp->intf << 20);
2688
2689 mask[0] = tp->sport_mask | (tp->sip_mask << 16);
2690 mask[1] = (tp->sip_mask >> 16) | (tp->dport_mask << 16);
2691 mask[2] = tp->dip_mask;
2692 mask[3] = tp->proto_mask | (tp->vlan_mask << 8) | (tp->intf_mask << 20);
2693
2694 if (invert)
2695 key[3] |= (1 << 29);
2696 if (enable)
2697 key[3] |= (1 << 28);
2698
2699 addr = filter_index ? A_TP_RX_TRC_KEY0 : A_TP_TX_TRC_KEY0;
2700 tp_wr_indirect(adapter, addr++, key[0]);
2701 tp_wr_indirect(adapter, addr++, mask[0]);
2702 tp_wr_indirect(adapter, addr++, key[1]);
2703 tp_wr_indirect(adapter, addr++, mask[1]);
2704 tp_wr_indirect(adapter, addr++, key[2]);
2705 tp_wr_indirect(adapter, addr++, mask[2]);
2706 tp_wr_indirect(adapter, addr++, key[3]);
2707 tp_wr_indirect(adapter, addr, mask[3]);
2708 t3_read_reg(adapter, A_TP_PIO_DATA);
2709}
2710
2711/**
2712 * t3_config_sched - configure a HW traffic scheduler
2713 * @adap: the adapter
2714 * @kbps: target rate in Kbps
2715 * @sched: the scheduler index
2716 *
2717 * Configure a HW scheduler for the target rate
2718 */
2719int t3_config_sched(struct adapter *adap, unsigned int kbps, int sched)
2720{
2721 unsigned int v, tps, cpt, bpt, delta, mindelta = ~0;
2722 unsigned int clk = adap->params.vpd.cclk * 1000;
2723 unsigned int selected_cpt = 0, selected_bpt = 0;
2724
2725 if (kbps > 0) {
2726 kbps *= 125; /* -> bytes */
2727 for (cpt = 1; cpt <= 255; cpt++) {
2728 tps = clk / cpt;
2729 bpt = (kbps + tps / 2) / tps;
2730 if (bpt > 0 && bpt <= 255) {
2731 v = bpt * tps;
2732 delta = v >= kbps ? v - kbps : kbps - v;
2733 if (delta <= mindelta) {
2734 mindelta = delta;
2735 selected_cpt = cpt;
2736 selected_bpt = bpt;
2737 }
2738 } else if (selected_cpt)
2739 break;
2740 }
2741 if (!selected_cpt)
2742 return -EINVAL;
2743 }
2744 t3_write_reg(adap, A_TP_TM_PIO_ADDR,
2745 A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2);
2746 v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
2747 if (sched & 1)
2748 v = (v & 0xffff) | (selected_cpt << 16) | (selected_bpt << 24);
2749 else
2750 v = (v & 0xffff0000) | selected_cpt | (selected_bpt << 8);
2751 t3_write_reg(adap, A_TP_TM_PIO_DATA, v);
2752 return 0;
2753}
2754
2755static int tp_init(struct adapter *adap, const struct tp_params *p)
2756{
2757 int busy = 0;
2758
2759 tp_config(adap, p);
2760 t3_set_vlan_accel(adap, 3, 0);
2761
2762 if (is_offload(adap)) {
2763 tp_set_timers(adap, adap->params.vpd.cclk * 1000);
2764 t3_write_reg(adap, A_TP_RESET, F_FLSTINITENABLE);
2765 busy = t3_wait_op_done(adap, A_TP_RESET, F_FLSTINITENABLE,
2766 0, 1000, 5);
2767 if (busy)
2768 CH_ERR(adap, "TP initialization timed out\n");
2769 }
2770
2771 if (!busy)
2772 t3_write_reg(adap, A_TP_RESET, F_TPRESET);
2773 return busy;
2774}
2775
2776int t3_mps_set_active_ports(struct adapter *adap, unsigned int port_mask)
2777{
2778 if (port_mask & ~((1 << adap->params.nports) - 1))
2779 return -EINVAL;
2780 t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE | F_PORT0ACTIVE,
2781 port_mask << S_PORT0ACTIVE);
2782 return 0;
2783}
2784
2785/*
2786 * Perform the bits of HW initialization that are dependent on the number
2787 * of available ports.
2788 */
2789static void init_hw_for_avail_ports(struct adapter *adap, int nports)
2790{
2791 int i;
2792
2793 if (nports == 1) {
2794 t3_set_reg_field(adap, A_ULPRX_CTL, F_ROUND_ROBIN, 0);
2795 t3_set_reg_field(adap, A_ULPTX_CONFIG, F_CFG_RR_ARB, 0);
2796 t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_TPTXPORT0EN |
2797 F_PORT0ACTIVE | F_ENFORCEPKT);
2798 t3_write_reg(adap, A_PM1_TX_CFG, 0xc000c000);
2799 } else {
2800 t3_set_reg_field(adap, A_ULPRX_CTL, 0, F_ROUND_ROBIN);
2801 t3_set_reg_field(adap, A_ULPTX_CONFIG, 0, F_CFG_RR_ARB);
2802 t3_write_reg(adap, A_ULPTX_DMA_WEIGHT,
2803 V_D1_WEIGHT(16) | V_D0_WEIGHT(16));
2804 t3_write_reg(adap, A_MPS_CFG, F_TPTXPORT0EN | F_TPTXPORT1EN |
2805 F_TPRXPORTEN | F_PORT0ACTIVE | F_PORT1ACTIVE |
2806 F_ENFORCEPKT);
2807 t3_write_reg(adap, A_PM1_TX_CFG, 0x80008000);
2808 t3_set_reg_field(adap, A_TP_PC_CONFIG, 0, F_TXTOSQUEUEMAPMODE);
2809 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_REQ_MAP,
2810 V_TX_MOD_QUEUE_REQ_MAP(0xaa));
2811 for (i = 0; i < 16; i++)
2812 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE,
2813 (i << 16) | 0x1010);
2814 }
2815}
2816
2817static int calibrate_xgm(struct adapter *adapter)
2818{
2819 if (uses_xaui(adapter)) {
2820 unsigned int v, i;
2821
2822 for (i = 0; i < 5; ++i) {
2823 t3_write_reg(adapter, A_XGM_XAUI_IMP, 0);
2824 t3_read_reg(adapter, A_XGM_XAUI_IMP);
2825 msleep(1);
2826 v = t3_read_reg(adapter, A_XGM_XAUI_IMP);
2827 if (!(v & (F_XGM_CALFAULT | F_CALBUSY))) {
2828 t3_write_reg(adapter, A_XGM_XAUI_IMP,
2829 V_XAUIIMP(G_CALIMP(v) >> 2));
2830 return 0;
2831 }
2832 }
2833 CH_ERR(adapter, "MAC calibration failed\n");
2834 return -1;
2835 } else {
2836 t3_write_reg(adapter, A_XGM_RGMII_IMP,
2837 V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
2838 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
2839 F_XGM_IMPSETUPDATE);
2840 }
2841 return 0;
2842}
2843
2844static void calibrate_xgm_t3b(struct adapter *adapter)
2845{
2846 if (!uses_xaui(adapter)) {
2847 t3_write_reg(adapter, A_XGM_RGMII_IMP, F_CALRESET |
2848 F_CALUPDATE | V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
2849 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALRESET, 0);
2850 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0,
2851 F_XGM_IMPSETUPDATE);
2852 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
2853 0);
2854 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALUPDATE, 0);
2855 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0, F_CALUPDATE);
2856 }
2857}
2858
2859struct mc7_timing_params {
2860 unsigned char ActToPreDly;
2861 unsigned char ActToRdWrDly;
2862 unsigned char PreCyc;
2863 unsigned char RefCyc[5];
2864 unsigned char BkCyc;
2865 unsigned char WrToRdDly;
2866 unsigned char RdToWrDly;
2867};
2868
2869/*
2870 * Write a value to a register and check that the write completed. These
2871 * writes normally complete in a cycle or two, so one read should suffice.
2872 * The very first read exists to flush the posted write to the device.
2873 */
2874static int wrreg_wait(struct adapter *adapter, unsigned int addr, u32 val)
2875{
2876 t3_write_reg(adapter, addr, val);
2877 t3_read_reg(adapter, addr); /* flush */
2878 if (!(t3_read_reg(adapter, addr) & F_BUSY))
2879 return 0;
2880 CH_ERR(adapter, "write to MC7 register 0x%x timed out\n", addr);
2881 return -EIO;
2882}
2883
2884static int mc7_init(struct mc7 *mc7, unsigned int mc7_clock, int mem_type)
2885{
2886 static const unsigned int mc7_mode[] = {
2887 0x632, 0x642, 0x652, 0x432, 0x442
2888 };
2889 static const struct mc7_timing_params mc7_timings[] = {
2890 {12, 3, 4, {20, 28, 34, 52, 0}, 15, 6, 4},
2891 {12, 4, 5, {20, 28, 34, 52, 0}, 16, 7, 4},
2892 {12, 5, 6, {20, 28, 34, 52, 0}, 17, 8, 4},
2893 {9, 3, 4, {15, 21, 26, 39, 0}, 12, 6, 4},
2894 {9, 4, 5, {15, 21, 26, 39, 0}, 13, 7, 4}
2895 };
2896
2897 u32 val;
2898 unsigned int width, density, slow, attempts;
2899 struct adapter *adapter = mc7->adapter;
2900 const struct mc7_timing_params *p = &mc7_timings[mem_type];
2901
2902 val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
2903 slow = val & F_SLOW;
2904 width = G_WIDTH(val);
2905 density = G_DEN(val);
2906
2907 t3_write_reg(adapter, mc7->offset + A_MC7_CFG, val | F_IFEN);
2908 val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); /* flush */
2909 msleep(1);
2910
2911 if (!slow) {
2912 t3_write_reg(adapter, mc7->offset + A_MC7_CAL, F_SGL_CAL_EN);
2913 t3_read_reg(adapter, mc7->offset + A_MC7_CAL);
2914 msleep(1);
2915 if (t3_read_reg(adapter, mc7->offset + A_MC7_CAL) &
2916 (F_BUSY | F_SGL_CAL_EN | F_CAL_FAULT)) {
2917 CH_ERR(adapter, "%s MC7 calibration timed out\n",
2918 mc7->name);
2919 goto out_fail;
2920 }
2921 }
2922
2923 t3_write_reg(adapter, mc7->offset + A_MC7_PARM,
2924 V_ACTTOPREDLY(p->ActToPreDly) |
2925 V_ACTTORDWRDLY(p->ActToRdWrDly) | V_PRECYC(p->PreCyc) |
2926 V_REFCYC(p->RefCyc[density]) | V_BKCYC(p->BkCyc) |
2927 V_WRTORDDLY(p->WrToRdDly) | V_RDTOWRDLY(p->RdToWrDly));
2928
2929 t3_write_reg(adapter, mc7->offset + A_MC7_CFG,
2930 val | F_CLKEN | F_TERM150);
2931 t3_read_reg(adapter, mc7->offset + A_MC7_CFG); /* flush */
2932
2933 if (!slow)
2934 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL, F_DLLENB,
2935 F_DLLENB);
2936 udelay(1);
2937
2938 val = slow ? 3 : 6;
2939 if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
2940 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE2, 0) ||
2941 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE3, 0) ||
2942 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
2943 goto out_fail;
2944
2945 if (!slow) {
2946 t3_write_reg(adapter, mc7->offset + A_MC7_MODE, 0x100);
2947 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL, F_DLLRST, 0);
2948 udelay(5);
2949 }
2950
2951 if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
2952 wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
2953 wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
2954 wrreg_wait(adapter, mc7->offset + A_MC7_MODE,
2955 mc7_mode[mem_type]) ||
2956 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val | 0x380) ||
2957 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
2958 goto out_fail;
2959
2960 /* clock value is in KHz */
2961 mc7_clock = mc7_clock * 7812 + mc7_clock / 2; /* ns */
2962 mc7_clock /= 1000000; /* KHz->MHz, ns->us */
2963
2964 t3_write_reg(adapter, mc7->offset + A_MC7_REF,
2965 F_PERREFEN | V_PREREFDIV(mc7_clock));
2966 t3_read_reg(adapter, mc7->offset + A_MC7_REF); /* flush */
2967
2968 t3_write_reg(adapter, mc7->offset + A_MC7_ECC, F_ECCGENEN | F_ECCCHKEN);
2969 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_DATA, 0);
2970 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_BEG, 0);
2971 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_END,
2972 (mc7->size << width) - 1);
2973 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_OP, V_OP(1));
2974 t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP); /* flush */
2975
2976 attempts = 50;
2977 do {
2978 msleep(250);
2979 val = t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP);
2980 } while ((val & F_BUSY) && --attempts);
2981 if (val & F_BUSY) {
2982 CH_ERR(adapter, "%s MC7 BIST timed out\n", mc7->name);
2983 goto out_fail;
2984 }
2985
2986 /* Enable normal memory accesses. */
2987 t3_set_reg_field(adapter, mc7->offset + A_MC7_CFG, 0, F_RDY);
2988 return 0;
2989
2990out_fail:
2991 return -1;
2992}
2993
2994static void config_pcie(struct adapter *adap)
2995{
2996 static const u16 ack_lat[4][6] = {
2997 {237, 416, 559, 1071, 2095, 4143},
2998 {128, 217, 289, 545, 1057, 2081},
2999 {73, 118, 154, 282, 538, 1050},
3000 {67, 107, 86, 150, 278, 534}
3001 };
3002 static const u16 rpl_tmr[4][6] = {
3003 {711, 1248, 1677, 3213, 6285, 12429},
3004 {384, 651, 867, 1635, 3171, 6243},
3005 {219, 354, 462, 846, 1614, 3150},
3006 {201, 321, 258, 450, 834, 1602}
3007 };
3008
3009 u16 val;
3010 unsigned int log2_width, pldsize;
3011 unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt;
3012
3013 pci_read_config_word(adap->pdev,
3014 adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
3015 &val);
3016 pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
3017 pci_read_config_word(adap->pdev,
3018 adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL,
3019 &val);
3020
3021 fst_trn_tx = G_NUMFSTTRNSEQ(t3_read_reg(adap, A_PCIE_PEX_CTRL0));
3022 fst_trn_rx = adap->params.rev == 0 ? fst_trn_tx :
3023 G_NUMFSTTRNSEQRX(t3_read_reg(adap, A_PCIE_MODE));
3024 log2_width = fls(adap->params.pci.width) - 1;
3025 acklat = ack_lat[log2_width][pldsize];
3026 if (val & 1) /* check LOsEnable */
3027 acklat += fst_trn_tx * 4;
3028 rpllmt = rpl_tmr[log2_width][pldsize] + fst_trn_rx * 4;
3029
3030 if (adap->params.rev == 0)
3031 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1,
3032 V_T3A_ACKLAT(M_T3A_ACKLAT),
3033 V_T3A_ACKLAT(acklat));
3034 else
3035 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1, V_ACKLAT(M_ACKLAT),
3036 V_ACKLAT(acklat));
3037
3038 t3_set_reg_field(adap, A_PCIE_PEX_CTRL0, V_REPLAYLMT(M_REPLAYLMT),
3039 V_REPLAYLMT(rpllmt));
3040
3041 t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff);
3042 t3_set_reg_field(adap, A_PCIE_CFG, F_PCIE_CLIDECEN, F_PCIE_CLIDECEN);
3043}
3044
3045/*
3046 * Initialize and configure T3 HW modules. This performs the
3047 * initialization steps that need to be done once after a card is reset.
3048 * MAC and PHY initialization is handled separarely whenever a port is enabled.
3049 *
3050 * fw_params are passed to FW and their value is platform dependent. Only the
3051 * top 8 bits are available for use, the rest must be 0.
3052 */
3053int t3_init_hw(struct adapter *adapter, u32 fw_params)
3054{
3055 int err = -EIO, attempts = 100;
3056 const struct vpd_params *vpd = &adapter->params.vpd;
3057
3058 if (adapter->params.rev > 0)
3059 calibrate_xgm_t3b(adapter);
3060 else if (calibrate_xgm(adapter))
3061 goto out_err;
3062
3063 if (vpd->mclk) {
3064 partition_mem(adapter, &adapter->params.tp);
3065
3066 if (mc7_init(&adapter->pmrx, vpd->mclk, vpd->mem_timing) ||
3067 mc7_init(&adapter->pmtx, vpd->mclk, vpd->mem_timing) ||
3068 mc7_init(&adapter->cm, vpd->mclk, vpd->mem_timing) ||
3069 t3_mc5_init(&adapter->mc5, adapter->params.mc5.nservers,
3070 adapter->params.mc5.nfilters,
3071 adapter->params.mc5.nroutes))
3072 goto out_err;
3073 }
3074
3075 if (tp_init(adapter, &adapter->params.tp))
3076 goto out_err;
3077
3078 t3_tp_set_coalescing_size(adapter,
3079 min(adapter->params.sge.max_pkt_size,
3080 MAX_RX_COALESCING_LEN), 1);
3081 t3_tp_set_max_rxsize(adapter,
3082 min(adapter->params.sge.max_pkt_size, 16384U));
3083 ulp_config(adapter, &adapter->params.tp);
3084
3085 if (is_pcie(adapter))
3086 config_pcie(adapter);
3087 else
3088 t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN);
3089
3090 t3_write_reg(adapter, A_PM1_RX_CFG, 0xf000f000);
3091 init_hw_for_avail_ports(adapter, adapter->params.nports);
3092 t3_sge_init(adapter, &adapter->params.sge);
3093
3094 t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params);
3095 t3_write_reg(adapter, A_CIM_BOOT_CFG,
3096 V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2));
3097 t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */
3098
3099 do { /* wait for uP to initialize */
3100 msleep(20);
3101 } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts);
3102 if (!attempts)
3103 goto out_err;
3104
3105 err = 0;
3106out_err:
3107 return err;
3108}
3109
3110/**
3111 * get_pci_mode - determine a card's PCI mode
3112 * @adapter: the adapter
3113 * @p: where to store the PCI settings
3114 *
3115 * Determines a card's PCI mode and associated parameters, such as speed
3116 * and width.
3117 */
3118static void __devinit get_pci_mode(struct adapter *adapter,
3119 struct pci_params *p)
3120{
3121 static unsigned short speed_map[] = { 33, 66, 100, 133 };
3122 u32 pci_mode, pcie_cap;
3123
3124 pcie_cap = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
3125 if (pcie_cap) {
3126 u16 val;
3127
3128 p->variant = PCI_VARIANT_PCIE;
3129 p->pcie_cap_addr = pcie_cap;
3130 pci_read_config_word(adapter->pdev, pcie_cap + PCI_EXP_LNKSTA,
3131 &val);
3132 p->width = (val >> 4) & 0x3f;
3133 return;
3134 }
3135
3136 pci_mode = t3_read_reg(adapter, A_PCIX_MODE);
3137 p->speed = speed_map[G_PCLKRANGE(pci_mode)];
3138 p->width = (pci_mode & F_64BIT) ? 64 : 32;
3139 pci_mode = G_PCIXINITPAT(pci_mode);
3140 if (pci_mode == 0)
3141 p->variant = PCI_VARIANT_PCI;
3142 else if (pci_mode < 4)
3143 p->variant = PCI_VARIANT_PCIX_MODE1_PARITY;
3144 else if (pci_mode < 8)
3145 p->variant = PCI_VARIANT_PCIX_MODE1_ECC;
3146 else
3147 p->variant = PCI_VARIANT_PCIX_266_MODE2;
3148}
3149
3150/**
3151 * init_link_config - initialize a link's SW state
3152 * @lc: structure holding the link state
3153 * @ai: information about the current card
3154 *
3155 * Initializes the SW state maintained for each link, including the link's
3156 * capabilities and default speed/duplex/flow-control/autonegotiation
3157 * settings.
3158 */
3159static void __devinit init_link_config(struct link_config *lc,
3160 unsigned int caps)
3161{
3162 lc->supported = caps;
3163 lc->requested_speed = lc->speed = SPEED_INVALID;
3164 lc->requested_duplex = lc->duplex = DUPLEX_INVALID;
3165 lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
3166 if (lc->supported & SUPPORTED_Autoneg) {
3167 lc->advertising = lc->supported;
3168 lc->autoneg = AUTONEG_ENABLE;
3169 lc->requested_fc |= PAUSE_AUTONEG;
3170 } else {
3171 lc->advertising = 0;
3172 lc->autoneg = AUTONEG_DISABLE;
3173 }
3174}
3175
3176/**
3177 * mc7_calc_size - calculate MC7 memory size
3178 * @cfg: the MC7 configuration
3179 *
3180 * Calculates the size of an MC7 memory in bytes from the value of its
3181 * configuration register.
3182 */
3183static unsigned int __devinit mc7_calc_size(u32 cfg)
3184{
3185 unsigned int width = G_WIDTH(cfg);
3186 unsigned int banks = !!(cfg & F_BKS) + 1;
3187 unsigned int org = !!(cfg & F_ORG) + 1;
3188 unsigned int density = G_DEN(cfg);
3189 unsigned int MBs = ((256 << density) * banks) / (org << width);
3190
3191 return MBs << 20;
3192}
3193
3194static void __devinit mc7_prep(struct adapter *adapter, struct mc7 *mc7,
3195 unsigned int base_addr, const char *name)
3196{
3197 u32 cfg;
3198
3199 mc7->adapter = adapter;
3200 mc7->name = name;
3201 mc7->offset = base_addr - MC7_PMRX_BASE_ADDR;
3202 cfg = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
3203 mc7->size = mc7_calc_size(cfg);
3204 mc7->width = G_WIDTH(cfg);
3205}
3206
3207void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
3208{
3209 mac->adapter = adapter;
3210 mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
3211 mac->nucast = 1;
3212
3213 if (adapter->params.rev == 0 && uses_xaui(adapter)) {
3214 t3_write_reg(adapter, A_XGM_SERDES_CTRL + mac->offset,
3215 is_10G(adapter) ? 0x2901c04 : 0x2301c04);
3216 t3_set_reg_field(adapter, A_XGM_PORT_CFG + mac->offset,
3217 F_ENRGMII, 0);
3218 }
3219}
3220
3221void early_hw_init(struct adapter *adapter, const struct adapter_info *ai)
3222{
3223 u32 val = V_PORTSPEED(is_10G(adapter) ? 3 : 2);
3224
3225 mi1_init(adapter, ai);
3226 t3_write_reg(adapter, A_I2C_CFG, /* set for 80KHz */
3227 V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1));
3228 t3_write_reg(adapter, A_T3DBG_GPIO_EN,
3229 ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL);
3230
3231 if (adapter->params.rev == 0 || !uses_xaui(adapter))
3232 val |= F_ENRGMII;
3233
3234 /* Enable MAC clocks so we can access the registers */
3235 t3_write_reg(adapter, A_XGM_PORT_CFG, val);
3236 t3_read_reg(adapter, A_XGM_PORT_CFG);
3237
3238 val |= F_CLKDIVRESET_;
3239 t3_write_reg(adapter, A_XGM_PORT_CFG, val);
3240 t3_read_reg(adapter, A_XGM_PORT_CFG);
3241 t3_write_reg(adapter, XGM_REG(A_XGM_PORT_CFG, 1), val);
3242 t3_read_reg(adapter, A_XGM_PORT_CFG);
3243}
3244
3245/*
3246 * Reset the adapter. PCIe cards lose their config space during reset, PCI-X
3247 * ones don't.
3248 */
3249int t3_reset_adapter(struct adapter *adapter)
3250{
3251 int i;
3252 uint16_t devid = 0;
3253
3254 if (is_pcie(adapter))
3255 pci_save_state(adapter->pdev);
3256 t3_write_reg(adapter, A_PL_RST, F_CRSTWRM | F_CRSTWRMMODE);
3257
3258 /*
3259 * Delay. Give Some time to device to reset fully.
3260 * XXX The delay time should be modified.
3261 */
3262 for (i = 0; i < 10; i++) {
3263 msleep(50);
3264 pci_read_config_word(adapter->pdev, 0x00, &devid);
3265 if (devid == 0x1425)
3266 break;
3267 }
3268
3269 if (devid != 0x1425)
3270 return -1;
3271
3272 if (is_pcie(adapter))
3273 pci_restore_state(adapter->pdev);
3274 return 0;
3275}
3276
3277/*
3278 * Initialize adapter SW state for the various HW modules, set initial values
3279 * for some adapter tunables, take PHYs out of reset, and initialize the MDIO
3280 * interface.
3281 */
3282int __devinit t3_prep_adapter(struct adapter *adapter,
3283 const struct adapter_info *ai, int reset)
3284{
3285 int ret;
3286 unsigned int i, j = 0;
3287
3288 get_pci_mode(adapter, &adapter->params.pci);
3289
3290 adapter->params.info = ai;
3291 adapter->params.nports = ai->nports;
3292 adapter->params.rev = t3_read_reg(adapter, A_PL_REV);
3293 adapter->params.linkpoll_period = 0;
3294 adapter->params.stats_update_period = is_10G(adapter) ?
3295 MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS * 10);
3296 adapter->params.pci.vpd_cap_addr =
3297 pci_find_capability(adapter->pdev, PCI_CAP_ID_VPD);
3298 ret = get_vpd_params(adapter, &adapter->params.vpd);
3299 if (ret < 0)
3300 return ret;
3301
3302 if (reset && t3_reset_adapter(adapter))
3303 return -1;
3304
3305 t3_sge_prep(adapter, &adapter->params.sge);
3306
3307 if (adapter->params.vpd.mclk) {
3308 struct tp_params *p = &adapter->params.tp;
3309
3310 mc7_prep(adapter, &adapter->pmrx, MC7_PMRX_BASE_ADDR, "PMRX");
3311 mc7_prep(adapter, &adapter->pmtx, MC7_PMTX_BASE_ADDR, "PMTX");
3312 mc7_prep(adapter, &adapter->cm, MC7_CM_BASE_ADDR, "CM");
3313
3314 p->nchan = ai->nports;
3315 p->pmrx_size = t3_mc7_size(&adapter->pmrx);
3316 p->pmtx_size = t3_mc7_size(&adapter->pmtx);
3317 p->cm_size = t3_mc7_size(&adapter->cm);
3318 p->chan_rx_size = p->pmrx_size / 2; /* only 1 Rx channel */
3319 p->chan_tx_size = p->pmtx_size / p->nchan;
3320 p->rx_pg_size = 64 * 1024;
3321 p->tx_pg_size = is_10G(adapter) ? 64 * 1024 : 16 * 1024;
3322 p->rx_num_pgs = pm_num_pages(p->chan_rx_size, p->rx_pg_size);
3323 p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size);
3324 p->ntimer_qs = p->cm_size >= (128 << 20) ||
3325 adapter->params.rev > 0 ? 12 : 6;
3326
3327 adapter->params.mc5.nservers = DEFAULT_NSERVERS;
3328 adapter->params.mc5.nfilters = adapter->params.rev > 0 ?
3329 DEFAULT_NFILTERS : 0;
3330 adapter->params.mc5.nroutes = 0;
3331 t3_mc5_prep(adapter, &adapter->mc5, MC5_MODE_144_BIT);
3332
3333 init_mtus(adapter->params.mtus);
3334 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
3335 }
3336
3337 early_hw_init(adapter, ai);
3338
3339 for_each_port(adapter, i) {
3340 u8 hw_addr[6];
3341 struct port_info *p = adap2pinfo(adapter, i);
3342
3343 while (!adapter->params.vpd.port_type[j])
3344 ++j;
3345
3346 p->port_type = &port_types[adapter->params.vpd.port_type[j]];
3347 p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
3348 ai->mdio_ops);
3349 mac_prep(&p->mac, adapter, j);
3350 ++j;
3351
3352 /*
3353 * The VPD EEPROM stores the base Ethernet address for the
3354 * card. A port's address is derived from the base by adding
3355 * the port's index to the base's low octet.
3356 */
3357 memcpy(hw_addr, adapter->params.vpd.eth_base, 5);
3358 hw_addr[5] = adapter->params.vpd.eth_base[5] + i;
3359
3360 memcpy(adapter->port[i]->dev_addr, hw_addr,
3361 ETH_ALEN);
3362 memcpy(adapter->port[i]->perm_addr, hw_addr,
3363 ETH_ALEN);
3364 init_link_config(&p->link_config, p->port_type->caps);
3365 p->phy.ops->power_down(&p->phy, 1);
3366 if (!(p->port_type->caps & SUPPORTED_IRQ))
3367 adapter->params.linkpoll_period = 10;
3368 }
3369
3370 return 0;
3371}
3372
3373void t3_led_ready(struct adapter *adapter)
3374{
3375 t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL,
3376 F_GPIO0_OUT_VAL);
3377}