blob: cdcfc132e37da8ca8f0ad746a5a533e6226b8e91 [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,
Divy Le Ray8ac3ba62007-03-31 00:23:19 -0700441 0,
Divy Le Ray4d22de32007-01-18 22:04:14 -0500442 &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,
Divy Le Ray8ac3ba62007-03-31 00:23:19 -0700446 0,
Divy Le Ray4d22de32007-01-18 22:04:14 -0500447 &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,
Divy Le Ray8ac3ba62007-03-31 00:23:19 -0700451 SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
Divy Le Ray4d22de32007-01-18 22:04:14 -0500452 &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,
Divy Le Ray8ac3ba62007-03-31 00:23:19 -0700457 SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
Divy Le Ray4d22de32007-01-18 22:04:14 -0500458 &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 */
Divy Le Ray167cdf52007-08-21 20:49:36 -0700508 VPD_ENTRY(sn, SERNUM_LEN); /* serial number */
Divy Le Ray4d22de32007-01-18 22:04:14 -0500509 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);
Divy Le Ray167cdf52007-08-21 20:49:36 -0700651 memcpy(p->sn, vpd.sn_data, SERNUM_LEN);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500652
653 /* Old eeproms didn't have port information */
654 if (adapter->params.rev == 0 && !vpd.port0_data[0]) {
655 p->port_type[0] = uses_xaui(adapter) ? 1 : 2;
656 p->port_type[1] = uses_xaui(adapter) ? 6 : 2;
657 } else {
658 p->port_type[0] = hex2int(vpd.port0_data[0]);
659 p->port_type[1] = hex2int(vpd.port1_data[0]);
660 p->xauicfg[0] = simple_strtoul(vpd.xaui0cfg_data, NULL, 16);
661 p->xauicfg[1] = simple_strtoul(vpd.xaui1cfg_data, NULL, 16);
662 }
663
664 for (i = 0; i < 6; i++)
665 p->eth_base[i] = hex2int(vpd.na_data[2 * i]) * 16 +
666 hex2int(vpd.na_data[2 * i + 1]);
667 return 0;
668}
669
670/* serial flash and firmware constants */
671enum {
672 SF_ATTEMPTS = 5, /* max retries for SF1 operations */
673 SF_SEC_SIZE = 64 * 1024, /* serial flash sector size */
674 SF_SIZE = SF_SEC_SIZE * 8, /* serial flash size */
675
676 /* flash command opcodes */
677 SF_PROG_PAGE = 2, /* program page */
678 SF_WR_DISABLE = 4, /* disable writes */
679 SF_RD_STATUS = 5, /* read status register */
680 SF_WR_ENABLE = 6, /* enable writes */
681 SF_RD_DATA_FAST = 0xb, /* read flash */
682 SF_ERASE_SECTOR = 0xd8, /* erase sector */
683
684 FW_FLASH_BOOT_ADDR = 0x70000, /* start address of FW in flash */
Divy Le Ray2e283962007-03-18 13:10:06 -0700685 FW_VERS_ADDR = 0x77ffc, /* flash address holding FW version */
686 FW_MIN_SIZE = 8 /* at least version and csum */
Divy Le Ray4d22de32007-01-18 22:04:14 -0500687};
688
689/**
690 * sf1_read - read data from the serial flash
691 * @adapter: the adapter
692 * @byte_cnt: number of bytes to read
693 * @cont: whether another operation will be chained
694 * @valp: where to store the read data
695 *
696 * Reads up to 4 bytes of data from the serial flash. The location of
697 * the read needs to be specified prior to calling this by issuing the
698 * appropriate commands to the serial flash.
699 */
700static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
701 u32 *valp)
702{
703 int ret;
704
705 if (!byte_cnt || byte_cnt > 4)
706 return -EINVAL;
707 if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
708 return -EBUSY;
709 t3_write_reg(adapter, A_SF_OP, V_CONT(cont) | V_BYTECNT(byte_cnt - 1));
710 ret = t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
711 if (!ret)
712 *valp = t3_read_reg(adapter, A_SF_DATA);
713 return ret;
714}
715
716/**
717 * sf1_write - write data to the serial flash
718 * @adapter: the adapter
719 * @byte_cnt: number of bytes to write
720 * @cont: whether another operation will be chained
721 * @val: value to write
722 *
723 * Writes up to 4 bytes of data to the serial flash. The location of
724 * the write needs to be specified prior to calling this by issuing the
725 * appropriate commands to the serial flash.
726 */
727static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
728 u32 val)
729{
730 if (!byte_cnt || byte_cnt > 4)
731 return -EINVAL;
732 if (t3_read_reg(adapter, A_SF_OP) & F_BUSY)
733 return -EBUSY;
734 t3_write_reg(adapter, A_SF_DATA, val);
735 t3_write_reg(adapter, A_SF_OP,
736 V_CONT(cont) | V_BYTECNT(byte_cnt - 1) | V_OP(1));
737 return t3_wait_op_done(adapter, A_SF_OP, F_BUSY, 0, SF_ATTEMPTS, 10);
738}
739
740/**
741 * flash_wait_op - wait for a flash operation to complete
742 * @adapter: the adapter
743 * @attempts: max number of polls of the status register
744 * @delay: delay between polls in ms
745 *
746 * Wait for a flash operation to complete by polling the status register.
747 */
748static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
749{
750 int ret;
751 u32 status;
752
753 while (1) {
754 if ((ret = sf1_write(adapter, 1, 1, SF_RD_STATUS)) != 0 ||
755 (ret = sf1_read(adapter, 1, 0, &status)) != 0)
756 return ret;
757 if (!(status & 1))
758 return 0;
759 if (--attempts == 0)
760 return -EAGAIN;
761 if (delay)
762 msleep(delay);
763 }
764}
765
766/**
767 * t3_read_flash - read words from serial flash
768 * @adapter: the adapter
769 * @addr: the start address for the read
770 * @nwords: how many 32-bit words to read
771 * @data: where to store the read data
772 * @byte_oriented: whether to store data as bytes or as words
773 *
774 * Read the specified number of 32-bit words from the serial flash.
775 * If @byte_oriented is set the read data is stored as a byte array
776 * (i.e., big-endian), otherwise as 32-bit words in the platform's
777 * natural endianess.
778 */
779int t3_read_flash(struct adapter *adapter, unsigned int addr,
780 unsigned int nwords, u32 *data, int byte_oriented)
781{
782 int ret;
783
784 if (addr + nwords * sizeof(u32) > SF_SIZE || (addr & 3))
785 return -EINVAL;
786
787 addr = swab32(addr) | SF_RD_DATA_FAST;
788
789 if ((ret = sf1_write(adapter, 4, 1, addr)) != 0 ||
790 (ret = sf1_read(adapter, 1, 1, data)) != 0)
791 return ret;
792
793 for (; nwords; nwords--, data++) {
794 ret = sf1_read(adapter, 4, nwords > 1, data);
795 if (ret)
796 return ret;
797 if (byte_oriented)
798 *data = htonl(*data);
799 }
800 return 0;
801}
802
803/**
804 * t3_write_flash - write up to a page of data to the serial flash
805 * @adapter: the adapter
806 * @addr: the start address to write
807 * @n: length of data to write
808 * @data: the data to write
809 *
810 * Writes up to a page of data (256 bytes) to the serial flash starting
811 * at the given address.
812 */
813static int t3_write_flash(struct adapter *adapter, unsigned int addr,
814 unsigned int n, const u8 *data)
815{
816 int ret;
817 u32 buf[64];
818 unsigned int i, c, left, val, offset = addr & 0xff;
819
820 if (addr + n > SF_SIZE || offset + n > 256)
821 return -EINVAL;
822
823 val = swab32(addr) | SF_PROG_PAGE;
824
825 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
826 (ret = sf1_write(adapter, 4, 1, val)) != 0)
827 return ret;
828
829 for (left = n; left; left -= c) {
830 c = min(left, 4U);
831 for (val = 0, i = 0; i < c; ++i)
832 val = (val << 8) + *data++;
833
834 ret = sf1_write(adapter, c, c != left, val);
835 if (ret)
836 return ret;
837 }
838 if ((ret = flash_wait_op(adapter, 5, 1)) != 0)
839 return ret;
840
841 /* Read the page to verify the write succeeded */
842 ret = t3_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
843 if (ret)
844 return ret;
845
846 if (memcmp(data - n, (u8 *) buf + offset, n))
847 return -EIO;
848 return 0;
849}
850
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700851/**
Divy Le Ray47330072007-08-29 19:15:52 -0700852 * t3_get_tp_version - read the tp sram version
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700853 * @adapter: the adapter
Divy Le Ray47330072007-08-29 19:15:52 -0700854 * @vers: where to place the version
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700855 *
Divy Le Ray47330072007-08-29 19:15:52 -0700856 * Reads the protocol sram version from sram.
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700857 */
Divy Le Ray47330072007-08-29 19:15:52 -0700858int t3_get_tp_version(struct adapter *adapter, u32 *vers)
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700859{
860 int ret;
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700861
862 /* Get version loaded in SRAM */
863 t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0);
864 ret = t3_wait_op_done(adapter, A_TP_EMBED_OP_FIELD0,
865 1, 1, 5, 1);
866 if (ret)
867 return ret;
868
Divy Le Ray47330072007-08-29 19:15:52 -0700869 *vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1);
870
871 return 0;
872}
873
874/**
875 * t3_check_tpsram_version - read the tp sram version
876 * @adapter: the adapter
877 * @must_load: set to 1 if loading a new microcode image is required
878 *
879 * Reads the protocol sram version from flash.
880 */
881int t3_check_tpsram_version(struct adapter *adapter, int *must_load)
882{
883 int ret;
884 u32 vers;
885 unsigned int major, minor;
886
887 if (adapter->params.rev == T3_REV_A)
888 return 0;
889
890 *must_load = 1;
891
892 ret = t3_get_tp_version(adapter, &vers);
893 if (ret)
894 return ret;
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700895
896 major = G_TP_VERSION_MAJOR(vers);
897 minor = G_TP_VERSION_MINOR(vers);
898
899 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR)
900 return 0;
901
Divy Le Ray47330072007-08-29 19:15:52 -0700902 if (major != TP_VERSION_MAJOR)
903 CH_ERR(adapter, "found wrong TP version (%u.%u), "
904 "driver needs version %d.%d\n", major, minor,
905 TP_VERSION_MAJOR, TP_VERSION_MINOR);
906 else {
907 *must_load = 0;
908 CH_ERR(adapter, "found wrong TP version (%u.%u), "
909 "driver compiled for version %d.%d\n", major, minor,
910 TP_VERSION_MAJOR, TP_VERSION_MINOR);
911 }
Divy Le Ray480fe1a2007-05-30 21:10:58 -0700912 return -EINVAL;
913}
914
915/**
916 * t3_check_tpsram - check if provided protocol SRAM
917 * is compatible with this driver
918 * @adapter: the adapter
919 * @tp_sram: the firmware image to write
920 * @size: image size
921 *
922 * Checks if an adapter's tp sram is compatible with the driver.
923 * Returns 0 if the versions are compatible, a negative error otherwise.
924 */
925int t3_check_tpsram(struct adapter *adapter, u8 *tp_sram, unsigned int size)
926{
927 u32 csum;
928 unsigned int i;
929 const u32 *p = (const u32 *)tp_sram;
930
931 /* Verify checksum */
932 for (csum = 0, i = 0; i < size / sizeof(csum); i++)
933 csum += ntohl(p[i]);
934 if (csum != 0xffffffff) {
935 CH_ERR(adapter, "corrupted protocol SRAM image, checksum %u\n",
936 csum);
937 return -EINVAL;
938 }
939
940 return 0;
941}
942
Divy Le Ray4aac3892007-01-30 19:43:45 -0800943enum fw_version_type {
944 FW_VERSION_N3,
945 FW_VERSION_T3
946};
947
Divy Le Ray4d22de32007-01-18 22:04:14 -0500948/**
949 * t3_get_fw_version - read the firmware version
950 * @adapter: the adapter
951 * @vers: where to place the version
952 *
953 * Reads the FW version from flash.
954 */
955int t3_get_fw_version(struct adapter *adapter, u32 *vers)
956{
957 return t3_read_flash(adapter, FW_VERS_ADDR, 1, vers, 0);
958}
959
960/**
961 * t3_check_fw_version - check if the FW is compatible with this driver
962 * @adapter: the adapter
Divy Le Raya5a3b462007-09-05 15:58:09 -0700963 * @must_load: set to 1 if loading a new FW image is required
964
Divy Le Ray4d22de32007-01-18 22:04:14 -0500965 * Checks if an adapter's FW is compatible with the driver. Returns 0
966 * if the versions are compatible, a negative error otherwise.
967 */
Divy Le Raya5a3b462007-09-05 15:58:09 -0700968int t3_check_fw_version(struct adapter *adapter, int *must_load)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500969{
970 int ret;
971 u32 vers;
Divy Le Ray4aac3892007-01-30 19:43:45 -0800972 unsigned int type, major, minor;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500973
Divy Le Raya5a3b462007-09-05 15:58:09 -0700974 *must_load = 1;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500975 ret = t3_get_fw_version(adapter, &vers);
976 if (ret)
977 return ret;
978
Divy Le Ray4aac3892007-01-30 19:43:45 -0800979 type = G_FW_VERSION_TYPE(vers);
980 major = G_FW_VERSION_MAJOR(vers);
981 minor = G_FW_VERSION_MINOR(vers);
982
Divy Le Ray75d86262007-02-25 16:32:37 -0800983 if (type == FW_VERSION_T3 && major == FW_VERSION_MAJOR &&
984 minor == FW_VERSION_MINOR)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500985 return 0;
986
Divy Le Raya5a3b462007-09-05 15:58:09 -0700987 if (major != FW_VERSION_MAJOR)
988 CH_ERR(adapter, "found wrong FW version(%u.%u), "
989 "driver needs version %u.%u\n", major, minor,
990 FW_VERSION_MAJOR, FW_VERSION_MINOR);
991 else {
992 *must_load = 0;
993 CH_WARN(adapter, "found wrong FW minor version(%u.%u), "
994 "driver compiled for version %u.%u\n", major, minor,
995 FW_VERSION_MAJOR, FW_VERSION_MINOR);
996 }
997
Divy Le Ray4d22de32007-01-18 22:04:14 -0500998 return -EINVAL;
999}
1000
1001/**
1002 * t3_flash_erase_sectors - erase a range of flash sectors
1003 * @adapter: the adapter
1004 * @start: the first sector to erase
1005 * @end: the last sector to erase
1006 *
1007 * Erases the sectors in the given range.
1008 */
1009static int t3_flash_erase_sectors(struct adapter *adapter, int start, int end)
1010{
1011 while (start <= end) {
1012 int ret;
1013
1014 if ((ret = sf1_write(adapter, 1, 0, SF_WR_ENABLE)) != 0 ||
1015 (ret = sf1_write(adapter, 4, 0,
1016 SF_ERASE_SECTOR | (start << 8))) != 0 ||
1017 (ret = flash_wait_op(adapter, 5, 500)) != 0)
1018 return ret;
1019 start++;
1020 }
1021 return 0;
1022}
1023
1024/*
1025 * t3_load_fw - download firmware
1026 * @adapter: the adapter
Divy Le Ray8a9fab22007-05-30 21:10:52 -07001027 * @fw_data: the firmware image to write
Divy Le Ray4d22de32007-01-18 22:04:14 -05001028 * @size: image size
1029 *
1030 * Write the supplied firmware image to the card's serial flash.
1031 * The FW image has the following sections: @size - 8 bytes of code and
1032 * data, followed by 4 bytes of FW version, followed by the 32-bit
1033 * 1's complement checksum of the whole image.
1034 */
1035int t3_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size)
1036{
1037 u32 csum;
1038 unsigned int i;
1039 const u32 *p = (const u32 *)fw_data;
1040 int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16;
1041
Divy Le Ray2e283962007-03-18 13:10:06 -07001042 if ((size & 3) || size < FW_MIN_SIZE)
Divy Le Ray4d22de32007-01-18 22:04:14 -05001043 return -EINVAL;
1044 if (size > FW_VERS_ADDR + 8 - FW_FLASH_BOOT_ADDR)
1045 return -EFBIG;
1046
1047 for (csum = 0, i = 0; i < size / sizeof(csum); i++)
1048 csum += ntohl(p[i]);
1049 if (csum != 0xffffffff) {
1050 CH_ERR(adapter, "corrupted firmware image, checksum %u\n",
1051 csum);
1052 return -EINVAL;
1053 }
1054
1055 ret = t3_flash_erase_sectors(adapter, fw_sector, fw_sector);
1056 if (ret)
1057 goto out;
1058
1059 size -= 8; /* trim off version and checksum */
1060 for (addr = FW_FLASH_BOOT_ADDR; size;) {
1061 unsigned int chunk_size = min(size, 256U);
1062
1063 ret = t3_write_flash(adapter, addr, chunk_size, fw_data);
1064 if (ret)
1065 goto out;
1066
1067 addr += chunk_size;
1068 fw_data += chunk_size;
1069 size -= chunk_size;
1070 }
1071
1072 ret = t3_write_flash(adapter, FW_VERS_ADDR, 4, fw_data);
1073out:
1074 if (ret)
1075 CH_ERR(adapter, "firmware download failed, error %d\n", ret);
1076 return ret;
1077}
1078
1079#define CIM_CTL_BASE 0x2000
1080
1081/**
1082 * t3_cim_ctl_blk_read - read a block from CIM control region
1083 *
1084 * @adap: the adapter
1085 * @addr: the start address within the CIM control region
1086 * @n: number of words to read
1087 * @valp: where to store the result
1088 *
1089 * Reads a block of 4-byte words from the CIM control region.
1090 */
1091int t3_cim_ctl_blk_read(struct adapter *adap, unsigned int addr,
1092 unsigned int n, unsigned int *valp)
1093{
1094 int ret = 0;
1095
1096 if (t3_read_reg(adap, A_CIM_HOST_ACC_CTRL) & F_HOSTBUSY)
1097 return -EBUSY;
1098
1099 for ( ; !ret && n--; addr += 4) {
1100 t3_write_reg(adap, A_CIM_HOST_ACC_CTRL, CIM_CTL_BASE + addr);
1101 ret = t3_wait_op_done(adap, A_CIM_HOST_ACC_CTRL, F_HOSTBUSY,
1102 0, 5, 2);
1103 if (!ret)
1104 *valp++ = t3_read_reg(adap, A_CIM_HOST_ACC_DATA);
1105 }
1106 return ret;
1107}
1108
1109
1110/**
1111 * t3_link_changed - handle interface link changes
1112 * @adapter: the adapter
1113 * @port_id: the port index that changed link state
1114 *
1115 * Called when a port's link settings change to propagate the new values
1116 * to the associated PHY and MAC. After performing the common tasks it
1117 * invokes an OS-specific handler.
1118 */
1119void t3_link_changed(struct adapter *adapter, int port_id)
1120{
1121 int link_ok, speed, duplex, fc;
1122 struct port_info *pi = adap2pinfo(adapter, port_id);
1123 struct cphy *phy = &pi->phy;
1124 struct cmac *mac = &pi->mac;
1125 struct link_config *lc = &pi->link_config;
1126
1127 phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
1128
1129 if (link_ok != lc->link_ok && adapter->params.rev > 0 &&
1130 uses_xaui(adapter)) {
1131 if (link_ok)
1132 t3b_pcs_reset(mac);
1133 t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset,
1134 link_ok ? F_TXACTENABLE | F_RXEN : 0);
1135 }
1136 lc->link_ok = link_ok;
1137 lc->speed = speed < 0 ? SPEED_INVALID : speed;
1138 lc->duplex = duplex < 0 ? DUPLEX_INVALID : duplex;
1139 if (lc->requested_fc & PAUSE_AUTONEG)
1140 fc &= lc->requested_fc;
1141 else
1142 fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1143
1144 if (link_ok && speed >= 0 && lc->autoneg == AUTONEG_ENABLE) {
1145 /* Set MAC speed, duplex, and flow control to match PHY. */
1146 t3_mac_set_speed_duplex_fc(mac, speed, duplex, fc);
1147 lc->fc = fc;
1148 }
1149
1150 t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc);
1151}
1152
1153/**
1154 * t3_link_start - apply link configuration to MAC/PHY
1155 * @phy: the PHY to setup
1156 * @mac: the MAC to setup
1157 * @lc: the requested link configuration
1158 *
1159 * Set up a port's MAC and PHY according to a desired link configuration.
1160 * - If the PHY can auto-negotiate first decide what to advertise, then
1161 * enable/disable auto-negotiation as desired, and reset.
1162 * - If the PHY does not auto-negotiate just reset it.
1163 * - If auto-negotiation is off set the MAC to the proper speed/duplex/FC,
1164 * otherwise do it later based on the outcome of auto-negotiation.
1165 */
1166int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc)
1167{
1168 unsigned int fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
1169
1170 lc->link_ok = 0;
1171 if (lc->supported & SUPPORTED_Autoneg) {
1172 lc->advertising &= ~(ADVERTISED_Asym_Pause | ADVERTISED_Pause);
1173 if (fc) {
1174 lc->advertising |= ADVERTISED_Asym_Pause;
1175 if (fc & PAUSE_RX)
1176 lc->advertising |= ADVERTISED_Pause;
1177 }
1178 phy->ops->advertise(phy, lc->advertising);
1179
1180 if (lc->autoneg == AUTONEG_DISABLE) {
1181 lc->speed = lc->requested_speed;
1182 lc->duplex = lc->requested_duplex;
1183 lc->fc = (unsigned char)fc;
1184 t3_mac_set_speed_duplex_fc(mac, lc->speed, lc->duplex,
1185 fc);
1186 /* Also disables autoneg */
1187 phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex);
1188 phy->ops->reset(phy, 0);
1189 } else
1190 phy->ops->autoneg_enable(phy);
1191 } else {
1192 t3_mac_set_speed_duplex_fc(mac, -1, -1, fc);
1193 lc->fc = (unsigned char)fc;
1194 phy->ops->reset(phy, 0);
1195 }
1196 return 0;
1197}
1198
1199/**
1200 * t3_set_vlan_accel - control HW VLAN extraction
1201 * @adapter: the adapter
1202 * @ports: bitmap of adapter ports to operate on
1203 * @on: enable (1) or disable (0) HW VLAN extraction
1204 *
1205 * Enables or disables HW extraction of VLAN tags for the given port.
1206 */
1207void t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on)
1208{
1209 t3_set_reg_field(adapter, A_TP_OUT_CONFIG,
1210 ports << S_VLANEXTRACTIONENABLE,
1211 on ? (ports << S_VLANEXTRACTIONENABLE) : 0);
1212}
1213
1214struct intr_info {
1215 unsigned int mask; /* bits to check in interrupt status */
1216 const char *msg; /* message to print or NULL */
1217 short stat_idx; /* stat counter to increment or -1 */
1218 unsigned short fatal:1; /* whether the condition reported is fatal */
1219};
1220
1221/**
1222 * t3_handle_intr_status - table driven interrupt handler
1223 * @adapter: the adapter that generated the interrupt
1224 * @reg: the interrupt status register to process
1225 * @mask: a mask to apply to the interrupt status
1226 * @acts: table of interrupt actions
1227 * @stats: statistics counters tracking interrupt occurences
1228 *
1229 * A table driven interrupt handler that applies a set of masks to an
1230 * interrupt status word and performs the corresponding actions if the
1231 * interrupts described by the mask have occured. The actions include
1232 * optionally printing a warning or alert message, and optionally
1233 * incrementing a stat counter. The table is terminated by an entry
1234 * specifying mask 0. Returns the number of fatal interrupt conditions.
1235 */
1236static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg,
1237 unsigned int mask,
1238 const struct intr_info *acts,
1239 unsigned long *stats)
1240{
1241 int fatal = 0;
1242 unsigned int status = t3_read_reg(adapter, reg) & mask;
1243
1244 for (; acts->mask; ++acts) {
1245 if (!(status & acts->mask))
1246 continue;
1247 if (acts->fatal) {
1248 fatal++;
1249 CH_ALERT(adapter, "%s (0x%x)\n",
1250 acts->msg, status & acts->mask);
1251 } else if (acts->msg)
1252 CH_WARN(adapter, "%s (0x%x)\n",
1253 acts->msg, status & acts->mask);
1254 if (acts->stat_idx >= 0)
1255 stats[acts->stat_idx]++;
1256 }
1257 if (status) /* clear processed interrupts */
1258 t3_write_reg(adapter, reg, status);
1259 return fatal;
1260}
1261
1262#define SGE_INTR_MASK (F_RSPQDISABLED)
1263#define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \
1264 F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \
1265 F_NFASRCHFAIL)
1266#define MC7_INTR_MASK (F_AE | F_UE | F_CE | V_PE(M_PE))
1267#define XGM_INTR_MASK (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
1268 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR) | \
1269 F_TXFIFO_UNDERRUN | F_RXFIFO_OVERFLOW)
1270#define PCIX_INTR_MASK (F_MSTDETPARERR | F_SIGTARABT | F_RCVTARABT | \
1271 F_RCVMSTABT | F_SIGSYSERR | F_DETPARERR | \
1272 F_SPLCMPDIS | F_UNXSPLCMP | F_RCVSPLCMPERR | \
1273 F_DETCORECCERR | F_DETUNCECCERR | F_PIOPARERR | \
1274 V_WFPARERR(M_WFPARERR) | V_RFPARERR(M_RFPARERR) | \
1275 V_CFPARERR(M_CFPARERR) /* | V_MSIXPARERR(M_MSIXPARERR) */)
1276#define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\
1277 F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \
1278 /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \
1279 V_BISTERR(M_BISTERR) | F_PEXERR)
1280#define ULPRX_INTR_MASK F_PARERR
1281#define ULPTX_INTR_MASK 0
1282#define CPLSW_INTR_MASK (F_TP_FRAMING_ERROR | \
1283 F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \
1284 F_ZERO_SWITCH_ERROR)
1285#define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \
1286 F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \
1287 F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \
1288 F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT)
1289#define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \
1290 V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \
1291 V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR))
1292#define PMRX_INTR_MASK (F_ZERO_E_CMD_ERROR | IESPI_FRM_ERR | OCSPI_FRM_ERR | \
1293 V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR) | \
1294 V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR))
1295#define MPS_INTR_MASK (V_TX0TPPARERRENB(M_TX0TPPARERRENB) | \
1296 V_TX1TPPARERRENB(M_TX1TPPARERRENB) | \
1297 V_RXTPPARERRENB(M_RXTPPARERRENB) | \
1298 V_MCAPARERRENB(M_MCAPARERRENB))
1299#define PL_INTR_MASK (F_T3DBG | F_XGMAC0_0 | F_XGMAC0_1 | F_MC5A | F_PM1_TX | \
1300 F_PM1_RX | F_ULP2_TX | F_ULP2_RX | F_TP1 | F_CIM | \
1301 F_MC7_CM | F_MC7_PMTX | F_MC7_PMRX | F_SGE3 | F_PCIM0 | \
1302 F_MPS0 | F_CPL_SWITCH)
1303
1304/*
1305 * Interrupt handler for the PCIX1 module.
1306 */
1307static void pci_intr_handler(struct adapter *adapter)
1308{
1309 static const struct intr_info pcix1_intr_info[] = {
Divy Le Ray4d22de32007-01-18 22:04:14 -05001310 {F_MSTDETPARERR, "PCI master detected parity error", -1, 1},
1311 {F_SIGTARABT, "PCI signaled target abort", -1, 1},
1312 {F_RCVTARABT, "PCI received target abort", -1, 1},
1313 {F_RCVMSTABT, "PCI received master abort", -1, 1},
1314 {F_SIGSYSERR, "PCI signaled system error", -1, 1},
1315 {F_DETPARERR, "PCI detected parity error", -1, 1},
1316 {F_SPLCMPDIS, "PCI split completion discarded", -1, 1},
1317 {F_UNXSPLCMP, "PCI unexpected split completion error", -1, 1},
1318 {F_RCVSPLCMPERR, "PCI received split completion error", -1,
1319 1},
1320 {F_DETCORECCERR, "PCI correctable ECC error",
1321 STAT_PCI_CORR_ECC, 0},
1322 {F_DETUNCECCERR, "PCI uncorrectable ECC error", -1, 1},
1323 {F_PIOPARERR, "PCI PIO FIFO parity error", -1, 1},
1324 {V_WFPARERR(M_WFPARERR), "PCI write FIFO parity error", -1,
1325 1},
1326 {V_RFPARERR(M_RFPARERR), "PCI read FIFO parity error", -1,
1327 1},
1328 {V_CFPARERR(M_CFPARERR), "PCI command FIFO parity error", -1,
1329 1},
1330 {V_MSIXPARERR(M_MSIXPARERR), "PCI MSI-X table/PBA parity "
1331 "error", -1, 1},
1332 {0}
1333 };
1334
1335 if (t3_handle_intr_status(adapter, A_PCIX_INT_CAUSE, PCIX_INTR_MASK,
1336 pcix1_intr_info, adapter->irq_stats))
1337 t3_fatal_err(adapter);
1338}
1339
1340/*
1341 * Interrupt handler for the PCIE module.
1342 */
1343static void pcie_intr_handler(struct adapter *adapter)
1344{
1345 static const struct intr_info pcie_intr_info[] = {
Divy Le Rayb5a44bc2007-01-30 19:44:01 -08001346 {F_PEXERR, "PCI PEX error", -1, 1},
Divy Le Ray4d22de32007-01-18 22:04:14 -05001347 {F_UNXSPLCPLERRR,
1348 "PCI unexpected split completion DMA read error", -1, 1},
1349 {F_UNXSPLCPLERRC,
1350 "PCI unexpected split completion DMA command error", -1, 1},
1351 {F_PCIE_PIOPARERR, "PCI PIO FIFO parity error", -1, 1},
1352 {F_PCIE_WFPARERR, "PCI write FIFO parity error", -1, 1},
1353 {F_PCIE_RFPARERR, "PCI read FIFO parity error", -1, 1},
1354 {F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1},
1355 {V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR),
1356 "PCI MSI-X table/PBA parity error", -1, 1},
1357 {V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1},
1358 {0}
1359 };
1360
Divy Le Ray3eea3332007-09-05 15:58:15 -07001361 if (t3_read_reg(adapter, A_PCIE_INT_CAUSE) & F_PEXERR)
1362 CH_ALERT(adapter, "PEX error code 0x%x\n",
1363 t3_read_reg(adapter, A_PCIE_PEX_ERR));
1364
Divy Le Ray4d22de32007-01-18 22:04:14 -05001365 if (t3_handle_intr_status(adapter, A_PCIE_INT_CAUSE, PCIE_INTR_MASK,
1366 pcie_intr_info, adapter->irq_stats))
1367 t3_fatal_err(adapter);
1368}
1369
1370/*
1371 * TP interrupt handler.
1372 */
1373static void tp_intr_handler(struct adapter *adapter)
1374{
1375 static const struct intr_info tp_intr_info[] = {
1376 {0xffffff, "TP parity error", -1, 1},
1377 {0x1000000, "TP out of Rx pages", -1, 1},
1378 {0x2000000, "TP out of Tx pages", -1, 1},
1379 {0}
1380 };
1381
1382 if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff,
1383 tp_intr_info, NULL))
1384 t3_fatal_err(adapter);
1385}
1386
1387/*
1388 * CIM interrupt handler.
1389 */
1390static void cim_intr_handler(struct adapter *adapter)
1391{
1392 static const struct intr_info cim_intr_info[] = {
1393 {F_RSVDSPACEINT, "CIM reserved space write", -1, 1},
1394 {F_SDRAMRANGEINT, "CIM SDRAM address out of range", -1, 1},
1395 {F_FLASHRANGEINT, "CIM flash address out of range", -1, 1},
1396 {F_BLKWRBOOTINT, "CIM block write to boot space", -1, 1},
1397 {F_WRBLKFLASHINT, "CIM write to cached flash space", -1, 1},
1398 {F_SGLWRFLASHINT, "CIM single write to flash space", -1, 1},
1399 {F_BLKRDFLASHINT, "CIM block read from flash space", -1, 1},
1400 {F_BLKWRFLASHINT, "CIM block write to flash space", -1, 1},
1401 {F_BLKRDCTLINT, "CIM block read from CTL space", -1, 1},
1402 {F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1},
1403 {F_BLKRDPLINT, "CIM block read from PL space", -1, 1},
1404 {F_BLKWRPLINT, "CIM block write to PL space", -1, 1},
1405 {0}
1406 };
1407
1408 if (t3_handle_intr_status(adapter, A_CIM_HOST_INT_CAUSE, 0xffffffff,
1409 cim_intr_info, NULL))
1410 t3_fatal_err(adapter);
1411}
1412
1413/*
1414 * ULP RX interrupt handler.
1415 */
1416static void ulprx_intr_handler(struct adapter *adapter)
1417{
1418 static const struct intr_info ulprx_intr_info[] = {
1419 {F_PARERR, "ULP RX parity error", -1, 1},
1420 {0}
1421 };
1422
1423 if (t3_handle_intr_status(adapter, A_ULPRX_INT_CAUSE, 0xffffffff,
1424 ulprx_intr_info, NULL))
1425 t3_fatal_err(adapter);
1426}
1427
1428/*
1429 * ULP TX interrupt handler.
1430 */
1431static void ulptx_intr_handler(struct adapter *adapter)
1432{
1433 static const struct intr_info ulptx_intr_info[] = {
1434 {F_PBL_BOUND_ERR_CH0, "ULP TX channel 0 PBL out of bounds",
1435 STAT_ULP_CH0_PBL_OOB, 0},
1436 {F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds",
1437 STAT_ULP_CH1_PBL_OOB, 0},
1438 {0}
1439 };
1440
1441 if (t3_handle_intr_status(adapter, A_ULPTX_INT_CAUSE, 0xffffffff,
1442 ulptx_intr_info, adapter->irq_stats))
1443 t3_fatal_err(adapter);
1444}
1445
1446#define ICSPI_FRM_ERR (F_ICSPI0_FIFO2X_RX_FRAMING_ERROR | \
1447 F_ICSPI1_FIFO2X_RX_FRAMING_ERROR | F_ICSPI0_RX_FRAMING_ERROR | \
1448 F_ICSPI1_RX_FRAMING_ERROR | F_ICSPI0_TX_FRAMING_ERROR | \
1449 F_ICSPI1_TX_FRAMING_ERROR)
1450#define OESPI_FRM_ERR (F_OESPI0_RX_FRAMING_ERROR | \
1451 F_OESPI1_RX_FRAMING_ERROR | F_OESPI0_TX_FRAMING_ERROR | \
1452 F_OESPI1_TX_FRAMING_ERROR | F_OESPI0_OFIFO2X_TX_FRAMING_ERROR | \
1453 F_OESPI1_OFIFO2X_TX_FRAMING_ERROR)
1454
1455/*
1456 * PM TX interrupt handler.
1457 */
1458static void pmtx_intr_handler(struct adapter *adapter)
1459{
1460 static const struct intr_info pmtx_intr_info[] = {
1461 {F_ZERO_C_CMD_ERROR, "PMTX 0-length pcmd", -1, 1},
1462 {ICSPI_FRM_ERR, "PMTX ispi framing error", -1, 1},
1463 {OESPI_FRM_ERR, "PMTX ospi framing error", -1, 1},
1464 {V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR),
1465 "PMTX ispi parity error", -1, 1},
1466 {V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR),
1467 "PMTX ospi parity error", -1, 1},
1468 {0}
1469 };
1470
1471 if (t3_handle_intr_status(adapter, A_PM1_TX_INT_CAUSE, 0xffffffff,
1472 pmtx_intr_info, NULL))
1473 t3_fatal_err(adapter);
1474}
1475
1476#define IESPI_FRM_ERR (F_IESPI0_FIFO2X_RX_FRAMING_ERROR | \
1477 F_IESPI1_FIFO2X_RX_FRAMING_ERROR | F_IESPI0_RX_FRAMING_ERROR | \
1478 F_IESPI1_RX_FRAMING_ERROR | F_IESPI0_TX_FRAMING_ERROR | \
1479 F_IESPI1_TX_FRAMING_ERROR)
1480#define OCSPI_FRM_ERR (F_OCSPI0_RX_FRAMING_ERROR | \
1481 F_OCSPI1_RX_FRAMING_ERROR | F_OCSPI0_TX_FRAMING_ERROR | \
1482 F_OCSPI1_TX_FRAMING_ERROR | F_OCSPI0_OFIFO2X_TX_FRAMING_ERROR | \
1483 F_OCSPI1_OFIFO2X_TX_FRAMING_ERROR)
1484
1485/*
1486 * PM RX interrupt handler.
1487 */
1488static void pmrx_intr_handler(struct adapter *adapter)
1489{
1490 static const struct intr_info pmrx_intr_info[] = {
1491 {F_ZERO_E_CMD_ERROR, "PMRX 0-length pcmd", -1, 1},
1492 {IESPI_FRM_ERR, "PMRX ispi framing error", -1, 1},
1493 {OCSPI_FRM_ERR, "PMRX ospi framing error", -1, 1},
1494 {V_IESPI_PAR_ERROR(M_IESPI_PAR_ERROR),
1495 "PMRX ispi parity error", -1, 1},
1496 {V_OCSPI_PAR_ERROR(M_OCSPI_PAR_ERROR),
1497 "PMRX ospi parity error", -1, 1},
1498 {0}
1499 };
1500
1501 if (t3_handle_intr_status(adapter, A_PM1_RX_INT_CAUSE, 0xffffffff,
1502 pmrx_intr_info, NULL))
1503 t3_fatal_err(adapter);
1504}
1505
1506/*
1507 * CPL switch interrupt handler.
1508 */
1509static void cplsw_intr_handler(struct adapter *adapter)
1510{
1511 static const struct intr_info cplsw_intr_info[] = {
1512/* { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, */
1513 {F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1},
1514 {F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1},
1515 {F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1},
1516 {F_ZERO_SWITCH_ERROR, "CPL switch no-switch error", -1, 1},
1517 {0}
1518 };
1519
1520 if (t3_handle_intr_status(adapter, A_CPL_INTR_CAUSE, 0xffffffff,
1521 cplsw_intr_info, NULL))
1522 t3_fatal_err(adapter);
1523}
1524
1525/*
1526 * MPS interrupt handler.
1527 */
1528static void mps_intr_handler(struct adapter *adapter)
1529{
1530 static const struct intr_info mps_intr_info[] = {
1531 {0x1ff, "MPS parity error", -1, 1},
1532 {0}
1533 };
1534
1535 if (t3_handle_intr_status(adapter, A_MPS_INT_CAUSE, 0xffffffff,
1536 mps_intr_info, NULL))
1537 t3_fatal_err(adapter);
1538}
1539
1540#define MC7_INTR_FATAL (F_UE | V_PE(M_PE) | F_AE)
1541
1542/*
1543 * MC7 interrupt handler.
1544 */
1545static void mc7_intr_handler(struct mc7 *mc7)
1546{
1547 struct adapter *adapter = mc7->adapter;
1548 u32 cause = t3_read_reg(adapter, mc7->offset + A_MC7_INT_CAUSE);
1549
1550 if (cause & F_CE) {
1551 mc7->stats.corr_err++;
1552 CH_WARN(adapter, "%s MC7 correctable error at addr 0x%x, "
1553 "data 0x%x 0x%x 0x%x\n", mc7->name,
1554 t3_read_reg(adapter, mc7->offset + A_MC7_CE_ADDR),
1555 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA0),
1556 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA1),
1557 t3_read_reg(adapter, mc7->offset + A_MC7_CE_DATA2));
1558 }
1559
1560 if (cause & F_UE) {
1561 mc7->stats.uncorr_err++;
1562 CH_ALERT(adapter, "%s MC7 uncorrectable error at addr 0x%x, "
1563 "data 0x%x 0x%x 0x%x\n", mc7->name,
1564 t3_read_reg(adapter, mc7->offset + A_MC7_UE_ADDR),
1565 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA0),
1566 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA1),
1567 t3_read_reg(adapter, mc7->offset + A_MC7_UE_DATA2));
1568 }
1569
1570 if (G_PE(cause)) {
1571 mc7->stats.parity_err++;
1572 CH_ALERT(adapter, "%s MC7 parity error 0x%x\n",
1573 mc7->name, G_PE(cause));
1574 }
1575
1576 if (cause & F_AE) {
1577 u32 addr = 0;
1578
1579 if (adapter->params.rev > 0)
1580 addr = t3_read_reg(adapter,
1581 mc7->offset + A_MC7_ERR_ADDR);
1582 mc7->stats.addr_err++;
1583 CH_ALERT(adapter, "%s MC7 address error: 0x%x\n",
1584 mc7->name, addr);
1585 }
1586
1587 if (cause & MC7_INTR_FATAL)
1588 t3_fatal_err(adapter);
1589
1590 t3_write_reg(adapter, mc7->offset + A_MC7_INT_CAUSE, cause);
1591}
1592
1593#define XGM_INTR_FATAL (V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR) | \
1594 V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR))
1595/*
1596 * XGMAC interrupt handler.
1597 */
1598static int mac_intr_handler(struct adapter *adap, unsigned int idx)
1599{
1600 struct cmac *mac = &adap2pinfo(adap, idx)->mac;
1601 u32 cause = t3_read_reg(adap, A_XGM_INT_CAUSE + mac->offset);
1602
1603 if (cause & V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR)) {
1604 mac->stats.tx_fifo_parity_err++;
1605 CH_ALERT(adap, "port%d: MAC TX FIFO parity error\n", idx);
1606 }
1607 if (cause & V_RXFIFO_PRTY_ERR(M_RXFIFO_PRTY_ERR)) {
1608 mac->stats.rx_fifo_parity_err++;
1609 CH_ALERT(adap, "port%d: MAC RX FIFO parity error\n", idx);
1610 }
1611 if (cause & F_TXFIFO_UNDERRUN)
1612 mac->stats.tx_fifo_urun++;
1613 if (cause & F_RXFIFO_OVERFLOW)
1614 mac->stats.rx_fifo_ovfl++;
1615 if (cause & V_SERDES_LOS(M_SERDES_LOS))
1616 mac->stats.serdes_signal_loss++;
1617 if (cause & F_XAUIPCSCTCERR)
1618 mac->stats.xaui_pcs_ctc_err++;
1619 if (cause & F_XAUIPCSALIGNCHANGE)
1620 mac->stats.xaui_pcs_align_change++;
1621
1622 t3_write_reg(adap, A_XGM_INT_CAUSE + mac->offset, cause);
1623 if (cause & XGM_INTR_FATAL)
1624 t3_fatal_err(adap);
1625 return cause != 0;
1626}
1627
1628/*
1629 * Interrupt handler for PHY events.
1630 */
1631int t3_phy_intr_handler(struct adapter *adapter)
1632{
Divy Le Ray1ca03cb2007-04-17 11:06:36 -07001633 u32 mask, gpi = adapter_info(adapter)->gpio_intr;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001634 u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE);
1635
1636 for_each_port(adapter, i) {
Divy Le Ray1ca03cb2007-04-17 11:06:36 -07001637 struct port_info *p = adap2pinfo(adapter, i);
1638
1639 mask = gpi - (gpi & (gpi - 1));
1640 gpi -= mask;
1641
1642 if (!(p->port_type->caps & SUPPORTED_IRQ))
1643 continue;
1644
1645 if (cause & mask) {
1646 int phy_cause = p->phy.ops->intr_handler(&p->phy);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001647
1648 if (phy_cause & cphy_cause_link_change)
1649 t3_link_changed(adapter, i);
1650 if (phy_cause & cphy_cause_fifo_error)
Divy Le Ray1ca03cb2007-04-17 11:06:36 -07001651 p->phy.fifo_errors++;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001652 }
1653 }
1654
1655 t3_write_reg(adapter, A_T3DBG_INT_CAUSE, cause);
1656 return 0;
1657}
1658
1659/*
1660 * T3 slow path (non-data) interrupt handler.
1661 */
1662int t3_slow_intr_handler(struct adapter *adapter)
1663{
1664 u32 cause = t3_read_reg(adapter, A_PL_INT_CAUSE0);
1665
1666 cause &= adapter->slow_intr_mask;
1667 if (!cause)
1668 return 0;
1669 if (cause & F_PCIM0) {
1670 if (is_pcie(adapter))
1671 pcie_intr_handler(adapter);
1672 else
1673 pci_intr_handler(adapter);
1674 }
1675 if (cause & F_SGE3)
1676 t3_sge_err_intr_handler(adapter);
1677 if (cause & F_MC7_PMRX)
1678 mc7_intr_handler(&adapter->pmrx);
1679 if (cause & F_MC7_PMTX)
1680 mc7_intr_handler(&adapter->pmtx);
1681 if (cause & F_MC7_CM)
1682 mc7_intr_handler(&adapter->cm);
1683 if (cause & F_CIM)
1684 cim_intr_handler(adapter);
1685 if (cause & F_TP1)
1686 tp_intr_handler(adapter);
1687 if (cause & F_ULP2_RX)
1688 ulprx_intr_handler(adapter);
1689 if (cause & F_ULP2_TX)
1690 ulptx_intr_handler(adapter);
1691 if (cause & F_PM1_RX)
1692 pmrx_intr_handler(adapter);
1693 if (cause & F_PM1_TX)
1694 pmtx_intr_handler(adapter);
1695 if (cause & F_CPL_SWITCH)
1696 cplsw_intr_handler(adapter);
1697 if (cause & F_MPS0)
1698 mps_intr_handler(adapter);
1699 if (cause & F_MC5A)
1700 t3_mc5_intr_handler(&adapter->mc5);
1701 if (cause & F_XGMAC0_0)
1702 mac_intr_handler(adapter, 0);
1703 if (cause & F_XGMAC0_1)
1704 mac_intr_handler(adapter, 1);
1705 if (cause & F_T3DBG)
1706 t3_os_ext_intr_handler(adapter);
1707
1708 /* Clear the interrupts just processed. */
1709 t3_write_reg(adapter, A_PL_INT_CAUSE0, cause);
1710 t3_read_reg(adapter, A_PL_INT_CAUSE0); /* flush */
1711 return 1;
1712}
1713
1714/**
1715 * t3_intr_enable - enable interrupts
1716 * @adapter: the adapter whose interrupts should be enabled
1717 *
1718 * Enable interrupts by setting the interrupt enable registers of the
1719 * various HW modules and then enabling the top-level interrupt
1720 * concentrator.
1721 */
1722void t3_intr_enable(struct adapter *adapter)
1723{
1724 static const struct addr_val_pair intr_en_avp[] = {
1725 {A_SG_INT_ENABLE, SGE_INTR_MASK},
1726 {A_MC7_INT_ENABLE, MC7_INTR_MASK},
1727 {A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
1728 MC7_INTR_MASK},
1729 {A_MC7_INT_ENABLE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
1730 MC7_INTR_MASK},
1731 {A_MC5_DB_INT_ENABLE, MC5_INTR_MASK},
1732 {A_ULPRX_INT_ENABLE, ULPRX_INTR_MASK},
1733 {A_TP_INT_ENABLE, 0x3bfffff},
1734 {A_PM1_TX_INT_ENABLE, PMTX_INTR_MASK},
1735 {A_PM1_RX_INT_ENABLE, PMRX_INTR_MASK},
1736 {A_CIM_HOST_INT_ENABLE, CIM_INTR_MASK},
1737 {A_MPS_INT_ENABLE, MPS_INTR_MASK},
1738 };
1739
1740 adapter->slow_intr_mask = PL_INTR_MASK;
1741
1742 t3_write_regs(adapter, intr_en_avp, ARRAY_SIZE(intr_en_avp), 0);
1743
1744 if (adapter->params.rev > 0) {
1745 t3_write_reg(adapter, A_CPL_INTR_ENABLE,
1746 CPLSW_INTR_MASK | F_CIM_OVFL_ERROR);
1747 t3_write_reg(adapter, A_ULPTX_INT_ENABLE,
1748 ULPTX_INTR_MASK | F_PBL_BOUND_ERR_CH0 |
1749 F_PBL_BOUND_ERR_CH1);
1750 } else {
1751 t3_write_reg(adapter, A_CPL_INTR_ENABLE, CPLSW_INTR_MASK);
1752 t3_write_reg(adapter, A_ULPTX_INT_ENABLE, ULPTX_INTR_MASK);
1753 }
1754
1755 t3_write_reg(adapter, A_T3DBG_GPIO_ACT_LOW,
1756 adapter_info(adapter)->gpio_intr);
1757 t3_write_reg(adapter, A_T3DBG_INT_ENABLE,
1758 adapter_info(adapter)->gpio_intr);
1759 if (is_pcie(adapter))
1760 t3_write_reg(adapter, A_PCIE_INT_ENABLE, PCIE_INTR_MASK);
1761 else
1762 t3_write_reg(adapter, A_PCIX_INT_ENABLE, PCIX_INTR_MASK);
1763 t3_write_reg(adapter, A_PL_INT_ENABLE0, adapter->slow_intr_mask);
1764 t3_read_reg(adapter, A_PL_INT_ENABLE0); /* flush */
1765}
1766
1767/**
1768 * t3_intr_disable - disable a card's interrupts
1769 * @adapter: the adapter whose interrupts should be disabled
1770 *
1771 * Disable interrupts. We only disable the top-level interrupt
1772 * concentrator and the SGE data interrupts.
1773 */
1774void t3_intr_disable(struct adapter *adapter)
1775{
1776 t3_write_reg(adapter, A_PL_INT_ENABLE0, 0);
1777 t3_read_reg(adapter, A_PL_INT_ENABLE0); /* flush */
1778 adapter->slow_intr_mask = 0;
1779}
1780
1781/**
1782 * t3_intr_clear - clear all interrupts
1783 * @adapter: the adapter whose interrupts should be cleared
1784 *
1785 * Clears all interrupts.
1786 */
1787void t3_intr_clear(struct adapter *adapter)
1788{
1789 static const unsigned int cause_reg_addr[] = {
1790 A_SG_INT_CAUSE,
1791 A_SG_RSPQ_FL_STATUS,
1792 A_PCIX_INT_CAUSE,
1793 A_MC7_INT_CAUSE,
1794 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_PMTX_BASE_ADDR,
1795 A_MC7_INT_CAUSE - MC7_PMRX_BASE_ADDR + MC7_CM_BASE_ADDR,
1796 A_CIM_HOST_INT_CAUSE,
1797 A_TP_INT_CAUSE,
1798 A_MC5_DB_INT_CAUSE,
1799 A_ULPRX_INT_CAUSE,
1800 A_ULPTX_INT_CAUSE,
1801 A_CPL_INTR_CAUSE,
1802 A_PM1_TX_INT_CAUSE,
1803 A_PM1_RX_INT_CAUSE,
1804 A_MPS_INT_CAUSE,
1805 A_T3DBG_INT_CAUSE,
1806 };
1807 unsigned int i;
1808
1809 /* Clear PHY and MAC interrupts for each port. */
1810 for_each_port(adapter, i)
1811 t3_port_intr_clear(adapter, i);
1812
1813 for (i = 0; i < ARRAY_SIZE(cause_reg_addr); ++i)
1814 t3_write_reg(adapter, cause_reg_addr[i], 0xffffffff);
1815
Divy Le Ray3eea3332007-09-05 15:58:15 -07001816 if (is_pcie(adapter))
1817 t3_write_reg(adapter, A_PCIE_PEX_ERR, 0xffffffff);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001818 t3_write_reg(adapter, A_PL_INT_CAUSE0, 0xffffffff);
1819 t3_read_reg(adapter, A_PL_INT_CAUSE0); /* flush */
1820}
1821
1822/**
1823 * t3_port_intr_enable - enable port-specific interrupts
1824 * @adapter: associated adapter
1825 * @idx: index of port whose interrupts should be enabled
1826 *
1827 * Enable port-specific (i.e., MAC and PHY) interrupts for the given
1828 * adapter port.
1829 */
1830void t3_port_intr_enable(struct adapter *adapter, int idx)
1831{
1832 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1833
1834 t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), XGM_INTR_MASK);
1835 t3_read_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx)); /* flush */
1836 phy->ops->intr_enable(phy);
1837}
1838
1839/**
1840 * t3_port_intr_disable - disable port-specific interrupts
1841 * @adapter: associated adapter
1842 * @idx: index of port whose interrupts should be disabled
1843 *
1844 * Disable port-specific (i.e., MAC and PHY) interrupts for the given
1845 * adapter port.
1846 */
1847void t3_port_intr_disable(struct adapter *adapter, int idx)
1848{
1849 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1850
1851 t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), 0);
1852 t3_read_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx)); /* flush */
1853 phy->ops->intr_disable(phy);
1854}
1855
1856/**
1857 * t3_port_intr_clear - clear port-specific interrupts
1858 * @adapter: associated adapter
1859 * @idx: index of port whose interrupts to clear
1860 *
1861 * Clear port-specific (i.e., MAC and PHY) interrupts for the given
1862 * adapter port.
1863 */
1864void t3_port_intr_clear(struct adapter *adapter, int idx)
1865{
1866 struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
1867
1868 t3_write_reg(adapter, XGM_REG(A_XGM_INT_CAUSE, idx), 0xffffffff);
1869 t3_read_reg(adapter, XGM_REG(A_XGM_INT_CAUSE, idx)); /* flush */
1870 phy->ops->intr_clear(phy);
1871}
1872
1873/**
1874 * t3_sge_write_context - write an SGE context
1875 * @adapter: the adapter
1876 * @id: the context id
1877 * @type: the context type
1878 *
1879 * Program an SGE context with the values already loaded in the
1880 * CONTEXT_DATA? registers.
1881 */
1882static int t3_sge_write_context(struct adapter *adapter, unsigned int id,
1883 unsigned int type)
1884{
1885 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
1886 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
1887 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff);
1888 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
1889 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
1890 V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
1891 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
1892 0, 5, 1);
1893}
1894
1895/**
1896 * t3_sge_init_ecntxt - initialize an SGE egress context
1897 * @adapter: the adapter to configure
1898 * @id: the context id
1899 * @gts_enable: whether to enable GTS for the context
1900 * @type: the egress context type
1901 * @respq: associated response queue
1902 * @base_addr: base address of queue
1903 * @size: number of queue entries
1904 * @token: uP token
1905 * @gen: initial generation value for the context
1906 * @cidx: consumer pointer
1907 *
1908 * Initialize an SGE egress context and make it ready for use. If the
1909 * platform allows concurrent context operations, the caller is
1910 * responsible for appropriate locking.
1911 */
1912int t3_sge_init_ecntxt(struct adapter *adapter, unsigned int id, int gts_enable,
1913 enum sge_context_type type, int respq, u64 base_addr,
1914 unsigned int size, unsigned int token, int gen,
1915 unsigned int cidx)
1916{
1917 unsigned int credits = type == SGE_CNTXT_OFLD ? 0 : FW_WR_NUM;
1918
1919 if (base_addr & 0xfff) /* must be 4K aligned */
1920 return -EINVAL;
1921 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1922 return -EBUSY;
1923
1924 base_addr >>= 12;
1925 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_EC_INDEX(cidx) |
1926 V_EC_CREDITS(credits) | V_EC_GTS(gts_enable));
1927 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, V_EC_SIZE(size) |
1928 V_EC_BASE_LO(base_addr & 0xffff));
1929 base_addr >>= 16;
1930 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, base_addr);
1931 base_addr >>= 32;
1932 t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
1933 V_EC_BASE_HI(base_addr & 0xf) | V_EC_RESPQ(respq) |
1934 V_EC_TYPE(type) | V_EC_GEN(gen) | V_EC_UP_TOKEN(token) |
1935 F_EC_VALID);
1936 return t3_sge_write_context(adapter, id, F_EGRESS);
1937}
1938
1939/**
1940 * t3_sge_init_flcntxt - initialize an SGE free-buffer list context
1941 * @adapter: the adapter to configure
1942 * @id: the context id
1943 * @gts_enable: whether to enable GTS for the context
1944 * @base_addr: base address of queue
1945 * @size: number of queue entries
1946 * @bsize: size of each buffer for this queue
1947 * @cong_thres: threshold to signal congestion to upstream producers
1948 * @gen: initial generation value for the context
1949 * @cidx: consumer pointer
1950 *
1951 * Initialize an SGE free list context and make it ready for use. The
1952 * caller is responsible for ensuring only one context operation occurs
1953 * at a time.
1954 */
1955int t3_sge_init_flcntxt(struct adapter *adapter, unsigned int id,
1956 int gts_enable, u64 base_addr, unsigned int size,
1957 unsigned int bsize, unsigned int cong_thres, int gen,
1958 unsigned int cidx)
1959{
1960 if (base_addr & 0xfff) /* must be 4K aligned */
1961 return -EINVAL;
1962 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
1963 return -EBUSY;
1964
1965 base_addr >>= 12;
1966 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, base_addr);
1967 base_addr >>= 32;
1968 t3_write_reg(adapter, A_SG_CONTEXT_DATA1,
1969 V_FL_BASE_HI((u32) base_addr) |
1970 V_FL_INDEX_LO(cidx & M_FL_INDEX_LO));
1971 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, V_FL_SIZE(size) |
1972 V_FL_GEN(gen) | V_FL_INDEX_HI(cidx >> 12) |
1973 V_FL_ENTRY_SIZE_LO(bsize & M_FL_ENTRY_SIZE_LO));
1974 t3_write_reg(adapter, A_SG_CONTEXT_DATA3,
1975 V_FL_ENTRY_SIZE_HI(bsize >> (32 - S_FL_ENTRY_SIZE_LO)) |
1976 V_FL_CONG_THRES(cong_thres) | V_FL_GTS(gts_enable));
1977 return t3_sge_write_context(adapter, id, F_FREELIST);
1978}
1979
1980/**
1981 * t3_sge_init_rspcntxt - initialize an SGE response queue context
1982 * @adapter: the adapter to configure
1983 * @id: the context id
1984 * @irq_vec_idx: MSI-X interrupt vector index, 0 if no MSI-X, -1 if no IRQ
1985 * @base_addr: base address of queue
1986 * @size: number of queue entries
1987 * @fl_thres: threshold for selecting the normal or jumbo free list
1988 * @gen: initial generation value for the context
1989 * @cidx: consumer pointer
1990 *
1991 * Initialize an SGE response queue context and make it ready for use.
1992 * The caller is responsible for ensuring only one context operation
1993 * occurs at a time.
1994 */
1995int t3_sge_init_rspcntxt(struct adapter *adapter, unsigned int id,
1996 int irq_vec_idx, u64 base_addr, unsigned int size,
1997 unsigned int fl_thres, int gen, unsigned int cidx)
1998{
1999 unsigned int intr = 0;
2000
2001 if (base_addr & 0xfff) /* must be 4K aligned */
2002 return -EINVAL;
2003 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2004 return -EBUSY;
2005
2006 base_addr >>= 12;
2007 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size) |
2008 V_CQ_INDEX(cidx));
2009 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, base_addr);
2010 base_addr >>= 32;
2011 if (irq_vec_idx >= 0)
2012 intr = V_RQ_MSI_VEC(irq_vec_idx) | F_RQ_INTR_EN;
2013 t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
2014 V_CQ_BASE_HI((u32) base_addr) | intr | V_RQ_GEN(gen));
2015 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, fl_thres);
2016 return t3_sge_write_context(adapter, id, F_RESPONSEQ);
2017}
2018
2019/**
2020 * t3_sge_init_cqcntxt - initialize an SGE completion queue context
2021 * @adapter: the adapter to configure
2022 * @id: the context id
2023 * @base_addr: base address of queue
2024 * @size: number of queue entries
2025 * @rspq: response queue for async notifications
2026 * @ovfl_mode: CQ overflow mode
2027 * @credits: completion queue credits
2028 * @credit_thres: the credit threshold
2029 *
2030 * Initialize an SGE completion queue context and make it ready for use.
2031 * The caller is responsible for ensuring only one context operation
2032 * occurs at a time.
2033 */
2034int t3_sge_init_cqcntxt(struct adapter *adapter, unsigned int id, u64 base_addr,
2035 unsigned int size, int rspq, int ovfl_mode,
2036 unsigned int credits, unsigned int credit_thres)
2037{
2038 if (base_addr & 0xfff) /* must be 4K aligned */
2039 return -EINVAL;
2040 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2041 return -EBUSY;
2042
2043 base_addr >>= 12;
2044 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, V_CQ_SIZE(size));
2045 t3_write_reg(adapter, A_SG_CONTEXT_DATA1, base_addr);
2046 base_addr >>= 32;
2047 t3_write_reg(adapter, A_SG_CONTEXT_DATA2,
2048 V_CQ_BASE_HI((u32) base_addr) | V_CQ_RSPQ(rspq) |
2049 V_CQ_GEN(1) | V_CQ_OVERFLOW_MODE(ovfl_mode));
2050 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_CQ_CREDITS(credits) |
2051 V_CQ_CREDIT_THRES(credit_thres));
2052 return t3_sge_write_context(adapter, id, F_CQ);
2053}
2054
2055/**
2056 * t3_sge_enable_ecntxt - enable/disable an SGE egress context
2057 * @adapter: the adapter
2058 * @id: the egress context id
2059 * @enable: enable (1) or disable (0) the context
2060 *
2061 * Enable or disable an SGE egress context. The caller is responsible for
2062 * ensuring only one context operation occurs at a time.
2063 */
2064int t3_sge_enable_ecntxt(struct adapter *adapter, unsigned int id, int enable)
2065{
2066 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2067 return -EBUSY;
2068
2069 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
2070 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2071 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2072 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, F_EC_VALID);
2073 t3_write_reg(adapter, A_SG_CONTEXT_DATA3, V_EC_VALID(enable));
2074 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2075 V_CONTEXT_CMD_OPCODE(1) | F_EGRESS | V_CONTEXT(id));
2076 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2077 0, 5, 1);
2078}
2079
2080/**
2081 * t3_sge_disable_fl - disable an SGE free-buffer list
2082 * @adapter: the adapter
2083 * @id: the free list context id
2084 *
2085 * Disable an SGE free-buffer list. The caller is responsible for
2086 * ensuring only one context operation occurs at a time.
2087 */
2088int t3_sge_disable_fl(struct adapter *adapter, unsigned int id)
2089{
2090 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2091 return -EBUSY;
2092
2093 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0);
2094 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2095 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, V_FL_SIZE(M_FL_SIZE));
2096 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2097 t3_write_reg(adapter, A_SG_CONTEXT_DATA2, 0);
2098 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2099 V_CONTEXT_CMD_OPCODE(1) | F_FREELIST | V_CONTEXT(id));
2100 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2101 0, 5, 1);
2102}
2103
2104/**
2105 * t3_sge_disable_rspcntxt - disable an SGE response queue
2106 * @adapter: the adapter
2107 * @id: the response queue context id
2108 *
2109 * Disable an SGE response queue. The caller is responsible for
2110 * ensuring only one context operation occurs at a time.
2111 */
2112int t3_sge_disable_rspcntxt(struct adapter *adapter, unsigned int id)
2113{
2114 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2115 return -EBUSY;
2116
2117 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2118 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2119 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2120 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2121 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2122 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2123 V_CONTEXT_CMD_OPCODE(1) | F_RESPONSEQ | V_CONTEXT(id));
2124 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2125 0, 5, 1);
2126}
2127
2128/**
2129 * t3_sge_disable_cqcntxt - disable an SGE completion queue
2130 * @adapter: the adapter
2131 * @id: the completion queue context id
2132 *
2133 * Disable an SGE completion queue. The caller is responsible for
2134 * ensuring only one context operation occurs at a time.
2135 */
2136int t3_sge_disable_cqcntxt(struct adapter *adapter, unsigned int id)
2137{
2138 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2139 return -EBUSY;
2140
2141 t3_write_reg(adapter, A_SG_CONTEXT_MASK0, V_CQ_SIZE(M_CQ_SIZE));
2142 t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0);
2143 t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0);
2144 t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0);
2145 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, 0);
2146 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2147 V_CONTEXT_CMD_OPCODE(1) | F_CQ | V_CONTEXT(id));
2148 return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2149 0, 5, 1);
2150}
2151
2152/**
2153 * t3_sge_cqcntxt_op - perform an operation on a completion queue context
2154 * @adapter: the adapter
2155 * @id: the context id
2156 * @op: the operation to perform
2157 *
2158 * Perform the selected operation on an SGE completion queue context.
2159 * The caller is responsible for ensuring only one context operation
2160 * occurs at a time.
2161 */
2162int t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
2163 unsigned int credits)
2164{
2165 u32 val;
2166
2167 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2168 return -EBUSY;
2169
2170 t3_write_reg(adapter, A_SG_CONTEXT_DATA0, credits << 16);
2171 t3_write_reg(adapter, A_SG_CONTEXT_CMD, V_CONTEXT_CMD_OPCODE(op) |
2172 V_CONTEXT(id) | F_CQ);
2173 if (t3_wait_op_done_val(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
2174 0, 5, 1, &val))
2175 return -EIO;
2176
2177 if (op >= 2 && op < 7) {
2178 if (adapter->params.rev > 0)
2179 return G_CQ_INDEX(val);
2180
2181 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2182 V_CONTEXT_CMD_OPCODE(0) | F_CQ | V_CONTEXT(id));
2183 if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD,
2184 F_CONTEXT_CMD_BUSY, 0, 5, 1))
2185 return -EIO;
2186 return G_CQ_INDEX(t3_read_reg(adapter, A_SG_CONTEXT_DATA0));
2187 }
2188 return 0;
2189}
2190
2191/**
2192 * t3_sge_read_context - read an SGE context
2193 * @type: the context type
2194 * @adapter: the adapter
2195 * @id: the context id
2196 * @data: holds the retrieved context
2197 *
2198 * Read an SGE egress context. The caller is responsible for ensuring
2199 * only one context operation occurs at a time.
2200 */
2201static int t3_sge_read_context(unsigned int type, struct adapter *adapter,
2202 unsigned int id, u32 data[4])
2203{
2204 if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
2205 return -EBUSY;
2206
2207 t3_write_reg(adapter, A_SG_CONTEXT_CMD,
2208 V_CONTEXT_CMD_OPCODE(0) | type | V_CONTEXT(id));
2209 if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 0,
2210 5, 1))
2211 return -EIO;
2212 data[0] = t3_read_reg(adapter, A_SG_CONTEXT_DATA0);
2213 data[1] = t3_read_reg(adapter, A_SG_CONTEXT_DATA1);
2214 data[2] = t3_read_reg(adapter, A_SG_CONTEXT_DATA2);
2215 data[3] = t3_read_reg(adapter, A_SG_CONTEXT_DATA3);
2216 return 0;
2217}
2218
2219/**
2220 * t3_sge_read_ecntxt - read an SGE egress context
2221 * @adapter: the adapter
2222 * @id: the context id
2223 * @data: holds the retrieved context
2224 *
2225 * Read an SGE egress context. The caller is responsible for ensuring
2226 * only one context operation occurs at a time.
2227 */
2228int t3_sge_read_ecntxt(struct adapter *adapter, unsigned int id, u32 data[4])
2229{
2230 if (id >= 65536)
2231 return -EINVAL;
2232 return t3_sge_read_context(F_EGRESS, adapter, id, data);
2233}
2234
2235/**
2236 * t3_sge_read_cq - read an SGE CQ context
2237 * @adapter: the adapter
2238 * @id: the context id
2239 * @data: holds the retrieved context
2240 *
2241 * Read an SGE CQ context. The caller is responsible for ensuring
2242 * only one context operation occurs at a time.
2243 */
2244int t3_sge_read_cq(struct adapter *adapter, unsigned int id, u32 data[4])
2245{
2246 if (id >= 65536)
2247 return -EINVAL;
2248 return t3_sge_read_context(F_CQ, adapter, id, data);
2249}
2250
2251/**
2252 * t3_sge_read_fl - read an SGE free-list context
2253 * @adapter: the adapter
2254 * @id: the context id
2255 * @data: holds the retrieved context
2256 *
2257 * Read an SGE free-list context. The caller is responsible for ensuring
2258 * only one context operation occurs at a time.
2259 */
2260int t3_sge_read_fl(struct adapter *adapter, unsigned int id, u32 data[4])
2261{
2262 if (id >= SGE_QSETS * 2)
2263 return -EINVAL;
2264 return t3_sge_read_context(F_FREELIST, adapter, id, data);
2265}
2266
2267/**
2268 * t3_sge_read_rspq - read an SGE response queue context
2269 * @adapter: the adapter
2270 * @id: the context id
2271 * @data: holds the retrieved context
2272 *
2273 * Read an SGE response queue context. The caller is responsible for
2274 * ensuring only one context operation occurs at a time.
2275 */
2276int t3_sge_read_rspq(struct adapter *adapter, unsigned int id, u32 data[4])
2277{
2278 if (id >= SGE_QSETS)
2279 return -EINVAL;
2280 return t3_sge_read_context(F_RESPONSEQ, adapter, id, data);
2281}
2282
2283/**
2284 * t3_config_rss - configure Rx packet steering
2285 * @adapter: the adapter
2286 * @rss_config: RSS settings (written to TP_RSS_CONFIG)
2287 * @cpus: values for the CPU lookup table (0xff terminated)
2288 * @rspq: values for the response queue lookup table (0xffff terminated)
2289 *
2290 * Programs the receive packet steering logic. @cpus and @rspq provide
2291 * the values for the CPU and response queue lookup tables. If they
2292 * provide fewer values than the size of the tables the supplied values
2293 * are used repeatedly until the tables are fully populated.
2294 */
2295void t3_config_rss(struct adapter *adapter, unsigned int rss_config,
2296 const u8 * cpus, const u16 *rspq)
2297{
2298 int i, j, cpu_idx = 0, q_idx = 0;
2299
2300 if (cpus)
2301 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2302 u32 val = i << 16;
2303
2304 for (j = 0; j < 2; ++j) {
2305 val |= (cpus[cpu_idx++] & 0x3f) << (8 * j);
2306 if (cpus[cpu_idx] == 0xff)
2307 cpu_idx = 0;
2308 }
2309 t3_write_reg(adapter, A_TP_RSS_LKP_TABLE, val);
2310 }
2311
2312 if (rspq)
2313 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2314 t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
2315 (i << 16) | rspq[q_idx++]);
2316 if (rspq[q_idx] == 0xffff)
2317 q_idx = 0;
2318 }
2319
2320 t3_write_reg(adapter, A_TP_RSS_CONFIG, rss_config);
2321}
2322
2323/**
2324 * t3_read_rss - read the contents of the RSS tables
2325 * @adapter: the adapter
2326 * @lkup: holds the contents of the RSS lookup table
2327 * @map: holds the contents of the RSS map table
2328 *
2329 * Reads the contents of the receive packet steering tables.
2330 */
2331int t3_read_rss(struct adapter *adapter, u8 * lkup, u16 *map)
2332{
2333 int i;
2334 u32 val;
2335
2336 if (lkup)
2337 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2338 t3_write_reg(adapter, A_TP_RSS_LKP_TABLE,
2339 0xffff0000 | i);
2340 val = t3_read_reg(adapter, A_TP_RSS_LKP_TABLE);
2341 if (!(val & 0x80000000))
2342 return -EAGAIN;
2343 *lkup++ = val;
2344 *lkup++ = (val >> 8);
2345 }
2346
2347 if (map)
2348 for (i = 0; i < RSS_TABLE_SIZE; ++i) {
2349 t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
2350 0xffff0000 | i);
2351 val = t3_read_reg(adapter, A_TP_RSS_MAP_TABLE);
2352 if (!(val & 0x80000000))
2353 return -EAGAIN;
2354 *map++ = val;
2355 }
2356 return 0;
2357}
2358
2359/**
2360 * t3_tp_set_offload_mode - put TP in NIC/offload mode
2361 * @adap: the adapter
2362 * @enable: 1 to select offload mode, 0 for regular NIC
2363 *
2364 * Switches TP to NIC/offload mode.
2365 */
2366void t3_tp_set_offload_mode(struct adapter *adap, int enable)
2367{
2368 if (is_offload(adap) || !enable)
2369 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_NICMODE,
2370 V_NICMODE(!enable));
2371}
2372
2373/**
2374 * pm_num_pages - calculate the number of pages of the payload memory
2375 * @mem_size: the size of the payload memory
2376 * @pg_size: the size of each payload memory page
2377 *
2378 * Calculate the number of pages, each of the given size, that fit in a
2379 * memory of the specified size, respecting the HW requirement that the
2380 * number of pages must be a multiple of 24.
2381 */
2382static inline unsigned int pm_num_pages(unsigned int mem_size,
2383 unsigned int pg_size)
2384{
2385 unsigned int n = mem_size / pg_size;
2386
2387 return n - n % 24;
2388}
2389
2390#define mem_region(adap, start, size, reg) \
2391 t3_write_reg((adap), A_ ## reg, (start)); \
2392 start += size
2393
2394/*
2395 * partition_mem - partition memory and configure TP memory settings
2396 * @adap: the adapter
2397 * @p: the TP parameters
2398 *
2399 * Partitions context and payload memory and configures TP's memory
2400 * registers.
2401 */
2402static void partition_mem(struct adapter *adap, const struct tp_params *p)
2403{
2404 unsigned int m, pstructs, tids = t3_mc5_size(&adap->mc5);
2405 unsigned int timers = 0, timers_shift = 22;
2406
2407 if (adap->params.rev > 0) {
2408 if (tids <= 16 * 1024) {
2409 timers = 1;
2410 timers_shift = 16;
2411 } else if (tids <= 64 * 1024) {
2412 timers = 2;
2413 timers_shift = 18;
2414 } else if (tids <= 256 * 1024) {
2415 timers = 3;
2416 timers_shift = 20;
2417 }
2418 }
2419
2420 t3_write_reg(adap, A_TP_PMM_SIZE,
2421 p->chan_rx_size | (p->chan_tx_size >> 16));
2422
2423 t3_write_reg(adap, A_TP_PMM_TX_BASE, 0);
2424 t3_write_reg(adap, A_TP_PMM_TX_PAGE_SIZE, p->tx_pg_size);
2425 t3_write_reg(adap, A_TP_PMM_TX_MAX_PAGE, p->tx_num_pgs);
2426 t3_set_reg_field(adap, A_TP_PARA_REG3, V_TXDATAACKIDX(M_TXDATAACKIDX),
2427 V_TXDATAACKIDX(fls(p->tx_pg_size) - 12));
2428
2429 t3_write_reg(adap, A_TP_PMM_RX_BASE, 0);
2430 t3_write_reg(adap, A_TP_PMM_RX_PAGE_SIZE, p->rx_pg_size);
2431 t3_write_reg(adap, A_TP_PMM_RX_MAX_PAGE, p->rx_num_pgs);
2432
2433 pstructs = p->rx_num_pgs + p->tx_num_pgs;
2434 /* Add a bit of headroom and make multiple of 24 */
2435 pstructs += 48;
2436 pstructs -= pstructs % 24;
2437 t3_write_reg(adap, A_TP_CMM_MM_MAX_PSTRUCT, pstructs);
2438
2439 m = tids * TCB_SIZE;
2440 mem_region(adap, m, (64 << 10) * 64, SG_EGR_CNTX_BADDR);
2441 mem_region(adap, m, (64 << 10) * 64, SG_CQ_CONTEXT_BADDR);
2442 t3_write_reg(adap, A_TP_CMM_TIMER_BASE, V_CMTIMERMAXNUM(timers) | m);
2443 m += ((p->ntimer_qs - 1) << timers_shift) + (1 << 22);
2444 mem_region(adap, m, pstructs * 64, TP_CMM_MM_BASE);
2445 mem_region(adap, m, 64 * (pstructs / 24), TP_CMM_MM_PS_FLST_BASE);
2446 mem_region(adap, m, 64 * (p->rx_num_pgs / 24), TP_CMM_MM_RX_FLST_BASE);
2447 mem_region(adap, m, 64 * (p->tx_num_pgs / 24), TP_CMM_MM_TX_FLST_BASE);
2448
2449 m = (m + 4095) & ~0xfff;
2450 t3_write_reg(adap, A_CIM_SDRAM_BASE_ADDR, m);
2451 t3_write_reg(adap, A_CIM_SDRAM_ADDR_SIZE, p->cm_size - m);
2452
2453 tids = (p->cm_size - m - (3 << 20)) / 3072 - 32;
2454 m = t3_mc5_size(&adap->mc5) - adap->params.mc5.nservers -
2455 adap->params.mc5.nfilters - adap->params.mc5.nroutes;
2456 if (tids < m)
2457 adap->params.mc5.nservers += m - tids;
2458}
2459
2460static inline void tp_wr_indirect(struct adapter *adap, unsigned int addr,
2461 u32 val)
2462{
2463 t3_write_reg(adap, A_TP_PIO_ADDR, addr);
2464 t3_write_reg(adap, A_TP_PIO_DATA, val);
2465}
2466
2467static void tp_config(struct adapter *adap, const struct tp_params *p)
2468{
Divy Le Ray4d22de32007-01-18 22:04:14 -05002469 t3_write_reg(adap, A_TP_GLOBAL_CONFIG, F_TXPACINGENABLE | F_PATHMTU |
2470 F_IPCHECKSUMOFFLOAD | F_UDPCHECKSUMOFFLOAD |
2471 F_TCPCHECKSUMOFFLOAD | V_IPTTL(64));
2472 t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) |
2473 F_MTUENABLE | V_WINDOWSCALEMODE(1) |
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002474 V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1));
Divy Le Ray4d22de32007-01-18 22:04:14 -05002475 t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) |
2476 V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
2477 V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) |
2478 F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1));
2479 t3_set_reg_field(adap, A_TP_IN_CONFIG, F_IPV6ENABLE | F_NICMODE,
2480 F_IPV6ENABLE | F_NICMODE);
2481 t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814);
2482 t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105);
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002483 t3_set_reg_field(adap, A_TP_PARA_REG6, 0,
2484 adap->params.rev > 0 ? F_ENABLEESND :
2485 F_T3A_ENABLEESND);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002486
Divy Le Ray3b1d3072007-01-30 19:44:07 -08002487 t3_set_reg_field(adap, A_TP_PC_CONFIG,
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002488 F_ENABLEEPCMDAFULL,
2489 F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK |
2490 F_TXCONGESTIONMODE | F_RXCONGESTIONMODE);
Divy Le Ray3b1d3072007-01-30 19:44:07 -08002491 t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0);
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002492 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080);
2493 t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000);
2494
Divy Le Ray4d22de32007-01-18 22:04:14 -05002495 if (adap->params.rev > 0) {
2496 tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE);
2497 t3_set_reg_field(adap, A_TP_PARA_REG3, F_TXPACEAUTO,
2498 F_TXPACEAUTO);
2499 t3_set_reg_field(adap, A_TP_PC_CONFIG, F_LOCKTID, F_LOCKTID);
2500 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEAUTOSTRICT);
2501 } else
2502 t3_set_reg_field(adap, A_TP_PARA_REG3, 0, F_TXPACEFIXED);
2503
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002504 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0);
2505 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0);
2506 t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0);
2507 t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0xf2200000);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002508}
2509
2510/* Desired TP timer resolution in usec */
2511#define TP_TMR_RES 50
2512
2513/* TCP timer values in ms */
2514#define TP_DACK_TIMER 50
2515#define TP_RTO_MIN 250
2516
2517/**
2518 * tp_set_timers - set TP timing parameters
2519 * @adap: the adapter to set
2520 * @core_clk: the core clock frequency in Hz
2521 *
2522 * Set TP's timing parameters, such as the various timer resolutions and
2523 * the TCP timer values.
2524 */
2525static void tp_set_timers(struct adapter *adap, unsigned int core_clk)
2526{
2527 unsigned int tre = fls(core_clk / (1000000 / TP_TMR_RES)) - 1;
2528 unsigned int dack_re = fls(core_clk / 5000) - 1; /* 200us */
2529 unsigned int tstamp_re = fls(core_clk / 1000); /* 1ms, at least */
2530 unsigned int tps = core_clk >> tre;
2531
2532 t3_write_reg(adap, A_TP_TIMER_RESOLUTION, V_TIMERRESOLUTION(tre) |
2533 V_DELAYEDACKRESOLUTION(dack_re) |
2534 V_TIMESTAMPRESOLUTION(tstamp_re));
2535 t3_write_reg(adap, A_TP_DACK_TIMER,
2536 (core_clk >> dack_re) / (1000 / TP_DACK_TIMER));
2537 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG0, 0x3020100);
2538 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG1, 0x7060504);
2539 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG2, 0xb0a0908);
2540 t3_write_reg(adap, A_TP_TCP_BACKOFF_REG3, 0xf0e0d0c);
2541 t3_write_reg(adap, A_TP_SHIFT_CNT, V_SYNSHIFTMAX(6) |
2542 V_RXTSHIFTMAXR1(4) | V_RXTSHIFTMAXR2(15) |
2543 V_PERSHIFTBACKOFFMAX(8) | V_PERSHIFTMAX(8) |
2544 V_KEEPALIVEMAX(9));
2545
2546#define SECONDS * tps
2547
2548 t3_write_reg(adap, A_TP_MSL, adap->params.rev > 0 ? 0 : 2 SECONDS);
2549 t3_write_reg(adap, A_TP_RXT_MIN, tps / (1000 / TP_RTO_MIN));
2550 t3_write_reg(adap, A_TP_RXT_MAX, 64 SECONDS);
2551 t3_write_reg(adap, A_TP_PERS_MIN, 5 SECONDS);
2552 t3_write_reg(adap, A_TP_PERS_MAX, 64 SECONDS);
2553 t3_write_reg(adap, A_TP_KEEP_IDLE, 7200 SECONDS);
2554 t3_write_reg(adap, A_TP_KEEP_INTVL, 75 SECONDS);
2555 t3_write_reg(adap, A_TP_INIT_SRTT, 3 SECONDS);
2556 t3_write_reg(adap, A_TP_FINWAIT2_TIMER, 600 SECONDS);
2557
2558#undef SECONDS
2559}
2560
2561/**
2562 * t3_tp_set_coalescing_size - set receive coalescing size
2563 * @adap: the adapter
2564 * @size: the receive coalescing size
2565 * @psh: whether a set PSH bit should deliver coalesced data
2566 *
2567 * Set the receive coalescing size and PSH bit handling.
2568 */
2569int t3_tp_set_coalescing_size(struct adapter *adap, unsigned int size, int psh)
2570{
2571 u32 val;
2572
2573 if (size > MAX_RX_COALESCING_LEN)
2574 return -EINVAL;
2575
2576 val = t3_read_reg(adap, A_TP_PARA_REG3);
2577 val &= ~(F_RXCOALESCEENABLE | F_RXCOALESCEPSHEN);
2578
2579 if (size) {
2580 val |= F_RXCOALESCEENABLE;
2581 if (psh)
2582 val |= F_RXCOALESCEPSHEN;
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002583 size = min(MAX_RX_COALESCING_LEN, size);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002584 t3_write_reg(adap, A_TP_PARA_REG2, V_RXCOALESCESIZE(size) |
2585 V_MAXRXDATA(MAX_RX_COALESCING_LEN));
2586 }
2587 t3_write_reg(adap, A_TP_PARA_REG3, val);
2588 return 0;
2589}
2590
2591/**
2592 * t3_tp_set_max_rxsize - set the max receive size
2593 * @adap: the adapter
2594 * @size: the max receive size
2595 *
2596 * Set TP's max receive size. This is the limit that applies when
2597 * receive coalescing is disabled.
2598 */
2599void t3_tp_set_max_rxsize(struct adapter *adap, unsigned int size)
2600{
2601 t3_write_reg(adap, A_TP_PARA_REG7,
2602 V_PMMAXXFERLEN0(size) | V_PMMAXXFERLEN1(size));
2603}
2604
2605static void __devinit init_mtus(unsigned short mtus[])
2606{
2607 /*
2608 * See draft-mathis-plpmtud-00.txt for the values. The min is 88 so
2609 * it can accomodate max size TCP/IP headers when SACK and timestamps
2610 * are enabled and still have at least 8 bytes of payload.
2611 */
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002612 mtus[1] = 88;
2613 mtus[1] = 88;
2614 mtus[2] = 256;
2615 mtus[3] = 512;
2616 mtus[4] = 576;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002617 mtus[5] = 1024;
2618 mtus[6] = 1280;
2619 mtus[7] = 1492;
2620 mtus[8] = 1500;
2621 mtus[9] = 2002;
2622 mtus[10] = 2048;
2623 mtus[11] = 4096;
2624 mtus[12] = 4352;
2625 mtus[13] = 8192;
2626 mtus[14] = 9000;
2627 mtus[15] = 9600;
2628}
2629
2630/*
2631 * Initial congestion control parameters.
2632 */
2633static void __devinit init_cong_ctrl(unsigned short *a, unsigned short *b)
2634{
2635 a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
2636 a[9] = 2;
2637 a[10] = 3;
2638 a[11] = 4;
2639 a[12] = 5;
2640 a[13] = 6;
2641 a[14] = 7;
2642 a[15] = 8;
2643 a[16] = 9;
2644 a[17] = 10;
2645 a[18] = 14;
2646 a[19] = 17;
2647 a[20] = 21;
2648 a[21] = 25;
2649 a[22] = 30;
2650 a[23] = 35;
2651 a[24] = 45;
2652 a[25] = 60;
2653 a[26] = 80;
2654 a[27] = 100;
2655 a[28] = 200;
2656 a[29] = 300;
2657 a[30] = 400;
2658 a[31] = 500;
2659
2660 b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
2661 b[9] = b[10] = 1;
2662 b[11] = b[12] = 2;
2663 b[13] = b[14] = b[15] = b[16] = 3;
2664 b[17] = b[18] = b[19] = b[20] = b[21] = 4;
2665 b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
2666 b[28] = b[29] = 6;
2667 b[30] = b[31] = 7;
2668}
2669
2670/* The minimum additive increment value for the congestion control table */
2671#define CC_MIN_INCR 2U
2672
2673/**
2674 * t3_load_mtus - write the MTU and congestion control HW tables
2675 * @adap: the adapter
2676 * @mtus: the unrestricted values for the MTU table
2677 * @alphs: the values for the congestion control alpha parameter
2678 * @beta: the values for the congestion control beta parameter
2679 * @mtu_cap: the maximum permitted effective MTU
2680 *
2681 * Write the MTU table with the supplied MTUs capping each at &mtu_cap.
2682 * Update the high-speed congestion control table with the supplied alpha,
2683 * beta, and MTUs.
2684 */
2685void t3_load_mtus(struct adapter *adap, unsigned short mtus[NMTUS],
2686 unsigned short alpha[NCCTRL_WIN],
2687 unsigned short beta[NCCTRL_WIN], unsigned short mtu_cap)
2688{
2689 static const unsigned int avg_pkts[NCCTRL_WIN] = {
2690 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
2691 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
2692 28672, 40960, 57344, 81920, 114688, 163840, 229376
2693 };
2694
2695 unsigned int i, w;
2696
2697 for (i = 0; i < NMTUS; ++i) {
2698 unsigned int mtu = min(mtus[i], mtu_cap);
2699 unsigned int log2 = fls(mtu);
2700
2701 if (!(mtu & ((1 << log2) >> 2))) /* round */
2702 log2--;
2703 t3_write_reg(adap, A_TP_MTU_TABLE,
2704 (i << 24) | (log2 << 16) | mtu);
2705
2706 for (w = 0; w < NCCTRL_WIN; ++w) {
2707 unsigned int inc;
2708
2709 inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
2710 CC_MIN_INCR);
2711
2712 t3_write_reg(adap, A_TP_CCTRL_TABLE, (i << 21) |
2713 (w << 16) | (beta[w] << 13) | inc);
2714 }
2715 }
2716}
2717
2718/**
2719 * t3_read_hw_mtus - returns the values in the HW MTU table
2720 * @adap: the adapter
2721 * @mtus: where to store the HW MTU values
2722 *
2723 * Reads the HW MTU table.
2724 */
2725void t3_read_hw_mtus(struct adapter *adap, unsigned short mtus[NMTUS])
2726{
2727 int i;
2728
2729 for (i = 0; i < NMTUS; ++i) {
2730 unsigned int val;
2731
2732 t3_write_reg(adap, A_TP_MTU_TABLE, 0xff000000 | i);
2733 val = t3_read_reg(adap, A_TP_MTU_TABLE);
2734 mtus[i] = val & 0x3fff;
2735 }
2736}
2737
2738/**
2739 * t3_get_cong_cntl_tab - reads the congestion control table
2740 * @adap: the adapter
2741 * @incr: where to store the alpha values
2742 *
2743 * Reads the additive increments programmed into the HW congestion
2744 * control table.
2745 */
2746void t3_get_cong_cntl_tab(struct adapter *adap,
2747 unsigned short incr[NMTUS][NCCTRL_WIN])
2748{
2749 unsigned int mtu, w;
2750
2751 for (mtu = 0; mtu < NMTUS; ++mtu)
2752 for (w = 0; w < NCCTRL_WIN; ++w) {
2753 t3_write_reg(adap, A_TP_CCTRL_TABLE,
2754 0xffff0000 | (mtu << 5) | w);
2755 incr[mtu][w] = t3_read_reg(adap, A_TP_CCTRL_TABLE) &
2756 0x1fff;
2757 }
2758}
2759
2760/**
2761 * t3_tp_get_mib_stats - read TP's MIB counters
2762 * @adap: the adapter
2763 * @tps: holds the returned counter values
2764 *
2765 * Returns the values of TP's MIB counters.
2766 */
2767void t3_tp_get_mib_stats(struct adapter *adap, struct tp_mib_stats *tps)
2768{
2769 t3_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_RDATA, (u32 *) tps,
2770 sizeof(*tps) / sizeof(u32), 0);
2771}
2772
2773#define ulp_region(adap, name, start, len) \
2774 t3_write_reg((adap), A_ULPRX_ ## name ## _LLIMIT, (start)); \
2775 t3_write_reg((adap), A_ULPRX_ ## name ## _ULIMIT, \
2776 (start) + (len) - 1); \
2777 start += len
2778
2779#define ulptx_region(adap, name, start, len) \
2780 t3_write_reg((adap), A_ULPTX_ ## name ## _LLIMIT, (start)); \
2781 t3_write_reg((adap), A_ULPTX_ ## name ## _ULIMIT, \
2782 (start) + (len) - 1)
2783
2784static void ulp_config(struct adapter *adap, const struct tp_params *p)
2785{
2786 unsigned int m = p->chan_rx_size;
2787
2788 ulp_region(adap, ISCSI, m, p->chan_rx_size / 8);
2789 ulp_region(adap, TDDP, m, p->chan_rx_size / 8);
2790 ulptx_region(adap, TPT, m, p->chan_rx_size / 4);
2791 ulp_region(adap, STAG, m, p->chan_rx_size / 4);
2792 ulp_region(adap, RQ, m, p->chan_rx_size / 4);
2793 ulptx_region(adap, PBL, m, p->chan_rx_size / 4);
2794 ulp_region(adap, PBL, m, p->chan_rx_size / 4);
2795 t3_write_reg(adap, A_ULPRX_TDDP_TAGMASK, 0xffffffff);
2796}
2797
Divy Le Ray480fe1a2007-05-30 21:10:58 -07002798/**
2799 * t3_set_proto_sram - set the contents of the protocol sram
2800 * @adapter: the adapter
2801 * @data: the protocol image
2802 *
2803 * Write the contents of the protocol SRAM.
2804 */
2805int t3_set_proto_sram(struct adapter *adap, u8 *data)
2806{
2807 int i;
2808 u32 *buf = (u32 *)data;
2809
2810 for (i = 0; i < PROTO_SRAM_LINES; i++) {
2811 t3_write_reg(adap, A_TP_EMBED_OP_FIELD5, cpu_to_be32(*buf++));
2812 t3_write_reg(adap, A_TP_EMBED_OP_FIELD4, cpu_to_be32(*buf++));
2813 t3_write_reg(adap, A_TP_EMBED_OP_FIELD3, cpu_to_be32(*buf++));
2814 t3_write_reg(adap, A_TP_EMBED_OP_FIELD2, cpu_to_be32(*buf++));
2815 t3_write_reg(adap, A_TP_EMBED_OP_FIELD1, cpu_to_be32(*buf++));
2816
2817 t3_write_reg(adap, A_TP_EMBED_OP_FIELD0, i << 1 | 1 << 31);
2818 if (t3_wait_op_done(adap, A_TP_EMBED_OP_FIELD0, 1, 1, 5, 1))
2819 return -EIO;
2820 }
2821 t3_write_reg(adap, A_TP_EMBED_OP_FIELD0, 0);
2822
2823 return 0;
2824}
2825
Divy Le Ray4d22de32007-01-18 22:04:14 -05002826void t3_config_trace_filter(struct adapter *adapter,
2827 const struct trace_params *tp, int filter_index,
2828 int invert, int enable)
2829{
2830 u32 addr, key[4], mask[4];
2831
2832 key[0] = tp->sport | (tp->sip << 16);
2833 key[1] = (tp->sip >> 16) | (tp->dport << 16);
2834 key[2] = tp->dip;
2835 key[3] = tp->proto | (tp->vlan << 8) | (tp->intf << 20);
2836
2837 mask[0] = tp->sport_mask | (tp->sip_mask << 16);
2838 mask[1] = (tp->sip_mask >> 16) | (tp->dport_mask << 16);
2839 mask[2] = tp->dip_mask;
2840 mask[3] = tp->proto_mask | (tp->vlan_mask << 8) | (tp->intf_mask << 20);
2841
2842 if (invert)
2843 key[3] |= (1 << 29);
2844 if (enable)
2845 key[3] |= (1 << 28);
2846
2847 addr = filter_index ? A_TP_RX_TRC_KEY0 : A_TP_TX_TRC_KEY0;
2848 tp_wr_indirect(adapter, addr++, key[0]);
2849 tp_wr_indirect(adapter, addr++, mask[0]);
2850 tp_wr_indirect(adapter, addr++, key[1]);
2851 tp_wr_indirect(adapter, addr++, mask[1]);
2852 tp_wr_indirect(adapter, addr++, key[2]);
2853 tp_wr_indirect(adapter, addr++, mask[2]);
2854 tp_wr_indirect(adapter, addr++, key[3]);
2855 tp_wr_indirect(adapter, addr, mask[3]);
2856 t3_read_reg(adapter, A_TP_PIO_DATA);
2857}
2858
2859/**
2860 * t3_config_sched - configure a HW traffic scheduler
2861 * @adap: the adapter
2862 * @kbps: target rate in Kbps
2863 * @sched: the scheduler index
2864 *
2865 * Configure a HW scheduler for the target rate
2866 */
2867int t3_config_sched(struct adapter *adap, unsigned int kbps, int sched)
2868{
2869 unsigned int v, tps, cpt, bpt, delta, mindelta = ~0;
2870 unsigned int clk = adap->params.vpd.cclk * 1000;
2871 unsigned int selected_cpt = 0, selected_bpt = 0;
2872
2873 if (kbps > 0) {
2874 kbps *= 125; /* -> bytes */
2875 for (cpt = 1; cpt <= 255; cpt++) {
2876 tps = clk / cpt;
2877 bpt = (kbps + tps / 2) / tps;
2878 if (bpt > 0 && bpt <= 255) {
2879 v = bpt * tps;
2880 delta = v >= kbps ? v - kbps : kbps - v;
2881 if (delta <= mindelta) {
2882 mindelta = delta;
2883 selected_cpt = cpt;
2884 selected_bpt = bpt;
2885 }
2886 } else if (selected_cpt)
2887 break;
2888 }
2889 if (!selected_cpt)
2890 return -EINVAL;
2891 }
2892 t3_write_reg(adap, A_TP_TM_PIO_ADDR,
2893 A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2);
2894 v = t3_read_reg(adap, A_TP_TM_PIO_DATA);
2895 if (sched & 1)
2896 v = (v & 0xffff) | (selected_cpt << 16) | (selected_bpt << 24);
2897 else
2898 v = (v & 0xffff0000) | selected_cpt | (selected_bpt << 8);
2899 t3_write_reg(adap, A_TP_TM_PIO_DATA, v);
2900 return 0;
2901}
2902
2903static int tp_init(struct adapter *adap, const struct tp_params *p)
2904{
2905 int busy = 0;
2906
2907 tp_config(adap, p);
2908 t3_set_vlan_accel(adap, 3, 0);
2909
2910 if (is_offload(adap)) {
2911 tp_set_timers(adap, adap->params.vpd.cclk * 1000);
2912 t3_write_reg(adap, A_TP_RESET, F_FLSTINITENABLE);
2913 busy = t3_wait_op_done(adap, A_TP_RESET, F_FLSTINITENABLE,
2914 0, 1000, 5);
2915 if (busy)
2916 CH_ERR(adap, "TP initialization timed out\n");
2917 }
2918
2919 if (!busy)
2920 t3_write_reg(adap, A_TP_RESET, F_TPRESET);
2921 return busy;
2922}
2923
2924int t3_mps_set_active_ports(struct adapter *adap, unsigned int port_mask)
2925{
2926 if (port_mask & ~((1 << adap->params.nports) - 1))
2927 return -EINVAL;
2928 t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE | F_PORT0ACTIVE,
2929 port_mask << S_PORT0ACTIVE);
2930 return 0;
2931}
2932
2933/*
2934 * Perform the bits of HW initialization that are dependent on the number
2935 * of available ports.
2936 */
2937static void init_hw_for_avail_ports(struct adapter *adap, int nports)
2938{
2939 int i;
2940
2941 if (nports == 1) {
2942 t3_set_reg_field(adap, A_ULPRX_CTL, F_ROUND_ROBIN, 0);
2943 t3_set_reg_field(adap, A_ULPTX_CONFIG, F_CFG_RR_ARB, 0);
2944 t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_TPTXPORT0EN |
2945 F_PORT0ACTIVE | F_ENFORCEPKT);
Divy Le Ray8a9fab22007-05-30 21:10:52 -07002946 t3_write_reg(adap, A_PM1_TX_CFG, 0xffffffff);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002947 } else {
2948 t3_set_reg_field(adap, A_ULPRX_CTL, 0, F_ROUND_ROBIN);
2949 t3_set_reg_field(adap, A_ULPTX_CONFIG, 0, F_CFG_RR_ARB);
2950 t3_write_reg(adap, A_ULPTX_DMA_WEIGHT,
2951 V_D1_WEIGHT(16) | V_D0_WEIGHT(16));
2952 t3_write_reg(adap, A_MPS_CFG, F_TPTXPORT0EN | F_TPTXPORT1EN |
2953 F_TPRXPORTEN | F_PORT0ACTIVE | F_PORT1ACTIVE |
2954 F_ENFORCEPKT);
2955 t3_write_reg(adap, A_PM1_TX_CFG, 0x80008000);
2956 t3_set_reg_field(adap, A_TP_PC_CONFIG, 0, F_TXTOSQUEUEMAPMODE);
2957 t3_write_reg(adap, A_TP_TX_MOD_QUEUE_REQ_MAP,
2958 V_TX_MOD_QUEUE_REQ_MAP(0xaa));
2959 for (i = 0; i < 16; i++)
2960 t3_write_reg(adap, A_TP_TX_MOD_QUE_TABLE,
2961 (i << 16) | 0x1010);
2962 }
2963}
2964
2965static int calibrate_xgm(struct adapter *adapter)
2966{
2967 if (uses_xaui(adapter)) {
2968 unsigned int v, i;
2969
2970 for (i = 0; i < 5; ++i) {
2971 t3_write_reg(adapter, A_XGM_XAUI_IMP, 0);
2972 t3_read_reg(adapter, A_XGM_XAUI_IMP);
2973 msleep(1);
2974 v = t3_read_reg(adapter, A_XGM_XAUI_IMP);
2975 if (!(v & (F_XGM_CALFAULT | F_CALBUSY))) {
2976 t3_write_reg(adapter, A_XGM_XAUI_IMP,
2977 V_XAUIIMP(G_CALIMP(v) >> 2));
2978 return 0;
2979 }
2980 }
2981 CH_ERR(adapter, "MAC calibration failed\n");
2982 return -1;
2983 } else {
2984 t3_write_reg(adapter, A_XGM_RGMII_IMP,
2985 V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
2986 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
2987 F_XGM_IMPSETUPDATE);
2988 }
2989 return 0;
2990}
2991
2992static void calibrate_xgm_t3b(struct adapter *adapter)
2993{
2994 if (!uses_xaui(adapter)) {
2995 t3_write_reg(adapter, A_XGM_RGMII_IMP, F_CALRESET |
2996 F_CALUPDATE | V_RGMIIIMPPD(2) | V_RGMIIIMPPU(3));
2997 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALRESET, 0);
2998 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0,
2999 F_XGM_IMPSETUPDATE);
3000 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_XGM_IMPSETUPDATE,
3001 0);
3002 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, F_CALUPDATE, 0);
3003 t3_set_reg_field(adapter, A_XGM_RGMII_IMP, 0, F_CALUPDATE);
3004 }
3005}
3006
3007struct mc7_timing_params {
3008 unsigned char ActToPreDly;
3009 unsigned char ActToRdWrDly;
3010 unsigned char PreCyc;
3011 unsigned char RefCyc[5];
3012 unsigned char BkCyc;
3013 unsigned char WrToRdDly;
3014 unsigned char RdToWrDly;
3015};
3016
3017/*
3018 * Write a value to a register and check that the write completed. These
3019 * writes normally complete in a cycle or two, so one read should suffice.
3020 * The very first read exists to flush the posted write to the device.
3021 */
3022static int wrreg_wait(struct adapter *adapter, unsigned int addr, u32 val)
3023{
3024 t3_write_reg(adapter, addr, val);
3025 t3_read_reg(adapter, addr); /* flush */
3026 if (!(t3_read_reg(adapter, addr) & F_BUSY))
3027 return 0;
3028 CH_ERR(adapter, "write to MC7 register 0x%x timed out\n", addr);
3029 return -EIO;
3030}
3031
3032static int mc7_init(struct mc7 *mc7, unsigned int mc7_clock, int mem_type)
3033{
3034 static const unsigned int mc7_mode[] = {
3035 0x632, 0x642, 0x652, 0x432, 0x442
3036 };
3037 static const struct mc7_timing_params mc7_timings[] = {
3038 {12, 3, 4, {20, 28, 34, 52, 0}, 15, 6, 4},
3039 {12, 4, 5, {20, 28, 34, 52, 0}, 16, 7, 4},
3040 {12, 5, 6, {20, 28, 34, 52, 0}, 17, 8, 4},
3041 {9, 3, 4, {15, 21, 26, 39, 0}, 12, 6, 4},
3042 {9, 4, 5, {15, 21, 26, 39, 0}, 13, 7, 4}
3043 };
3044
3045 u32 val;
3046 unsigned int width, density, slow, attempts;
3047 struct adapter *adapter = mc7->adapter;
3048 const struct mc7_timing_params *p = &mc7_timings[mem_type];
3049
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003050 if (!mc7->size)
3051 return 0;
3052
Divy Le Ray4d22de32007-01-18 22:04:14 -05003053 val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
3054 slow = val & F_SLOW;
3055 width = G_WIDTH(val);
3056 density = G_DEN(val);
3057
3058 t3_write_reg(adapter, mc7->offset + A_MC7_CFG, val | F_IFEN);
3059 val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); /* flush */
3060 msleep(1);
3061
3062 if (!slow) {
3063 t3_write_reg(adapter, mc7->offset + A_MC7_CAL, F_SGL_CAL_EN);
3064 t3_read_reg(adapter, mc7->offset + A_MC7_CAL);
3065 msleep(1);
3066 if (t3_read_reg(adapter, mc7->offset + A_MC7_CAL) &
3067 (F_BUSY | F_SGL_CAL_EN | F_CAL_FAULT)) {
3068 CH_ERR(adapter, "%s MC7 calibration timed out\n",
3069 mc7->name);
3070 goto out_fail;
3071 }
3072 }
3073
3074 t3_write_reg(adapter, mc7->offset + A_MC7_PARM,
3075 V_ACTTOPREDLY(p->ActToPreDly) |
3076 V_ACTTORDWRDLY(p->ActToRdWrDly) | V_PRECYC(p->PreCyc) |
3077 V_REFCYC(p->RefCyc[density]) | V_BKCYC(p->BkCyc) |
3078 V_WRTORDDLY(p->WrToRdDly) | V_RDTOWRDLY(p->RdToWrDly));
3079
3080 t3_write_reg(adapter, mc7->offset + A_MC7_CFG,
3081 val | F_CLKEN | F_TERM150);
3082 t3_read_reg(adapter, mc7->offset + A_MC7_CFG); /* flush */
3083
3084 if (!slow)
3085 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL, F_DLLENB,
3086 F_DLLENB);
3087 udelay(1);
3088
3089 val = slow ? 3 : 6;
3090 if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
3091 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE2, 0) ||
3092 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE3, 0) ||
3093 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
3094 goto out_fail;
3095
3096 if (!slow) {
3097 t3_write_reg(adapter, mc7->offset + A_MC7_MODE, 0x100);
3098 t3_set_reg_field(adapter, mc7->offset + A_MC7_DLL, F_DLLRST, 0);
3099 udelay(5);
3100 }
3101
3102 if (wrreg_wait(adapter, mc7->offset + A_MC7_PRE, 0) ||
3103 wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
3104 wrreg_wait(adapter, mc7->offset + A_MC7_REF, 0) ||
3105 wrreg_wait(adapter, mc7->offset + A_MC7_MODE,
3106 mc7_mode[mem_type]) ||
3107 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val | 0x380) ||
3108 wrreg_wait(adapter, mc7->offset + A_MC7_EXT_MODE1, val))
3109 goto out_fail;
3110
3111 /* clock value is in KHz */
3112 mc7_clock = mc7_clock * 7812 + mc7_clock / 2; /* ns */
3113 mc7_clock /= 1000000; /* KHz->MHz, ns->us */
3114
3115 t3_write_reg(adapter, mc7->offset + A_MC7_REF,
3116 F_PERREFEN | V_PREREFDIV(mc7_clock));
3117 t3_read_reg(adapter, mc7->offset + A_MC7_REF); /* flush */
3118
3119 t3_write_reg(adapter, mc7->offset + A_MC7_ECC, F_ECCGENEN | F_ECCCHKEN);
3120 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_DATA, 0);
3121 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_BEG, 0);
3122 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_ADDR_END,
3123 (mc7->size << width) - 1);
3124 t3_write_reg(adapter, mc7->offset + A_MC7_BIST_OP, V_OP(1));
3125 t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP); /* flush */
3126
3127 attempts = 50;
3128 do {
3129 msleep(250);
3130 val = t3_read_reg(adapter, mc7->offset + A_MC7_BIST_OP);
3131 } while ((val & F_BUSY) && --attempts);
3132 if (val & F_BUSY) {
3133 CH_ERR(adapter, "%s MC7 BIST timed out\n", mc7->name);
3134 goto out_fail;
3135 }
3136
3137 /* Enable normal memory accesses. */
3138 t3_set_reg_field(adapter, mc7->offset + A_MC7_CFG, 0, F_RDY);
3139 return 0;
3140
3141out_fail:
3142 return -1;
3143}
3144
3145static void config_pcie(struct adapter *adap)
3146{
3147 static const u16 ack_lat[4][6] = {
3148 {237, 416, 559, 1071, 2095, 4143},
3149 {128, 217, 289, 545, 1057, 2081},
3150 {73, 118, 154, 282, 538, 1050},
3151 {67, 107, 86, 150, 278, 534}
3152 };
3153 static const u16 rpl_tmr[4][6] = {
3154 {711, 1248, 1677, 3213, 6285, 12429},
3155 {384, 651, 867, 1635, 3171, 6243},
3156 {219, 354, 462, 846, 1614, 3150},
3157 {201, 321, 258, 450, 834, 1602}
3158 };
3159
3160 u16 val;
3161 unsigned int log2_width, pldsize;
3162 unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt;
3163
3164 pci_read_config_word(adap->pdev,
3165 adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
3166 &val);
3167 pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
3168 pci_read_config_word(adap->pdev,
3169 adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL,
3170 &val);
3171
3172 fst_trn_tx = G_NUMFSTTRNSEQ(t3_read_reg(adap, A_PCIE_PEX_CTRL0));
3173 fst_trn_rx = adap->params.rev == 0 ? fst_trn_tx :
3174 G_NUMFSTTRNSEQRX(t3_read_reg(adap, A_PCIE_MODE));
3175 log2_width = fls(adap->params.pci.width) - 1;
3176 acklat = ack_lat[log2_width][pldsize];
3177 if (val & 1) /* check LOsEnable */
3178 acklat += fst_trn_tx * 4;
3179 rpllmt = rpl_tmr[log2_width][pldsize] + fst_trn_rx * 4;
3180
3181 if (adap->params.rev == 0)
3182 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1,
3183 V_T3A_ACKLAT(M_T3A_ACKLAT),
3184 V_T3A_ACKLAT(acklat));
3185 else
3186 t3_set_reg_field(adap, A_PCIE_PEX_CTRL1, V_ACKLAT(M_ACKLAT),
3187 V_ACKLAT(acklat));
3188
3189 t3_set_reg_field(adap, A_PCIE_PEX_CTRL0, V_REPLAYLMT(M_REPLAYLMT),
3190 V_REPLAYLMT(rpllmt));
3191
3192 t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff);
3193 t3_set_reg_field(adap, A_PCIE_CFG, F_PCIE_CLIDECEN, F_PCIE_CLIDECEN);
3194}
3195
3196/*
3197 * Initialize and configure T3 HW modules. This performs the
3198 * initialization steps that need to be done once after a card is reset.
3199 * MAC and PHY initialization is handled separarely whenever a port is enabled.
3200 *
3201 * fw_params are passed to FW and their value is platform dependent. Only the
3202 * top 8 bits are available for use, the rest must be 0.
3203 */
3204int t3_init_hw(struct adapter *adapter, u32 fw_params)
3205{
3206 int err = -EIO, attempts = 100;
3207 const struct vpd_params *vpd = &adapter->params.vpd;
3208
3209 if (adapter->params.rev > 0)
3210 calibrate_xgm_t3b(adapter);
3211 else if (calibrate_xgm(adapter))
3212 goto out_err;
3213
3214 if (vpd->mclk) {
3215 partition_mem(adapter, &adapter->params.tp);
3216
3217 if (mc7_init(&adapter->pmrx, vpd->mclk, vpd->mem_timing) ||
3218 mc7_init(&adapter->pmtx, vpd->mclk, vpd->mem_timing) ||
3219 mc7_init(&adapter->cm, vpd->mclk, vpd->mem_timing) ||
3220 t3_mc5_init(&adapter->mc5, adapter->params.mc5.nservers,
3221 adapter->params.mc5.nfilters,
3222 adapter->params.mc5.nroutes))
3223 goto out_err;
3224 }
3225
3226 if (tp_init(adapter, &adapter->params.tp))
3227 goto out_err;
3228
3229 t3_tp_set_coalescing_size(adapter,
3230 min(adapter->params.sge.max_pkt_size,
3231 MAX_RX_COALESCING_LEN), 1);
3232 t3_tp_set_max_rxsize(adapter,
3233 min(adapter->params.sge.max_pkt_size, 16384U));
3234 ulp_config(adapter, &adapter->params.tp);
3235
3236 if (is_pcie(adapter))
3237 config_pcie(adapter);
3238 else
3239 t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN);
3240
Divy Le Ray8a9fab22007-05-30 21:10:52 -07003241 t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff);
Divy Le Ray3f61e422007-08-21 20:49:41 -07003242 t3_write_reg(adapter, A_PM1_RX_MODE, 0);
3243 t3_write_reg(adapter, A_PM1_TX_MODE, 0);
Divy Le Ray4d22de32007-01-18 22:04:14 -05003244 init_hw_for_avail_ports(adapter, adapter->params.nports);
3245 t3_sge_init(adapter, &adapter->params.sge);
3246
3247 t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params);
3248 t3_write_reg(adapter, A_CIM_BOOT_CFG,
3249 V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2));
3250 t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */
3251
3252 do { /* wait for uP to initialize */
3253 msleep(20);
3254 } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts);
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003255 if (!attempts) {
3256 CH_ERR(adapter, "uP initialization timed out\n");
Divy Le Ray4d22de32007-01-18 22:04:14 -05003257 goto out_err;
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003258 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05003259
3260 err = 0;
3261out_err:
3262 return err;
3263}
3264
3265/**
3266 * get_pci_mode - determine a card's PCI mode
3267 * @adapter: the adapter
3268 * @p: where to store the PCI settings
3269 *
3270 * Determines a card's PCI mode and associated parameters, such as speed
3271 * and width.
3272 */
3273static void __devinit get_pci_mode(struct adapter *adapter,
3274 struct pci_params *p)
3275{
3276 static unsigned short speed_map[] = { 33, 66, 100, 133 };
3277 u32 pci_mode, pcie_cap;
3278
3279 pcie_cap = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
3280 if (pcie_cap) {
3281 u16 val;
3282
3283 p->variant = PCI_VARIANT_PCIE;
3284 p->pcie_cap_addr = pcie_cap;
3285 pci_read_config_word(adapter->pdev, pcie_cap + PCI_EXP_LNKSTA,
3286 &val);
3287 p->width = (val >> 4) & 0x3f;
3288 return;
3289 }
3290
3291 pci_mode = t3_read_reg(adapter, A_PCIX_MODE);
3292 p->speed = speed_map[G_PCLKRANGE(pci_mode)];
3293 p->width = (pci_mode & F_64BIT) ? 64 : 32;
3294 pci_mode = G_PCIXINITPAT(pci_mode);
3295 if (pci_mode == 0)
3296 p->variant = PCI_VARIANT_PCI;
3297 else if (pci_mode < 4)
3298 p->variant = PCI_VARIANT_PCIX_MODE1_PARITY;
3299 else if (pci_mode < 8)
3300 p->variant = PCI_VARIANT_PCIX_MODE1_ECC;
3301 else
3302 p->variant = PCI_VARIANT_PCIX_266_MODE2;
3303}
3304
3305/**
3306 * init_link_config - initialize a link's SW state
3307 * @lc: structure holding the link state
3308 * @ai: information about the current card
3309 *
3310 * Initializes the SW state maintained for each link, including the link's
3311 * capabilities and default speed/duplex/flow-control/autonegotiation
3312 * settings.
3313 */
3314static void __devinit init_link_config(struct link_config *lc,
3315 unsigned int caps)
3316{
3317 lc->supported = caps;
3318 lc->requested_speed = lc->speed = SPEED_INVALID;
3319 lc->requested_duplex = lc->duplex = DUPLEX_INVALID;
3320 lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
3321 if (lc->supported & SUPPORTED_Autoneg) {
3322 lc->advertising = lc->supported;
3323 lc->autoneg = AUTONEG_ENABLE;
3324 lc->requested_fc |= PAUSE_AUTONEG;
3325 } else {
3326 lc->advertising = 0;
3327 lc->autoneg = AUTONEG_DISABLE;
3328 }
3329}
3330
3331/**
3332 * mc7_calc_size - calculate MC7 memory size
3333 * @cfg: the MC7 configuration
3334 *
3335 * Calculates the size of an MC7 memory in bytes from the value of its
3336 * configuration register.
3337 */
3338static unsigned int __devinit mc7_calc_size(u32 cfg)
3339{
3340 unsigned int width = G_WIDTH(cfg);
3341 unsigned int banks = !!(cfg & F_BKS) + 1;
3342 unsigned int org = !!(cfg & F_ORG) + 1;
3343 unsigned int density = G_DEN(cfg);
3344 unsigned int MBs = ((256 << density) * banks) / (org << width);
3345
3346 return MBs << 20;
3347}
3348
3349static void __devinit mc7_prep(struct adapter *adapter, struct mc7 *mc7,
3350 unsigned int base_addr, const char *name)
3351{
3352 u32 cfg;
3353
3354 mc7->adapter = adapter;
3355 mc7->name = name;
3356 mc7->offset = base_addr - MC7_PMRX_BASE_ADDR;
3357 cfg = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003358 mc7->size = mc7->size = G_DEN(cfg) == M_DEN ? 0 : mc7_calc_size(cfg);
Divy Le Ray4d22de32007-01-18 22:04:14 -05003359 mc7->width = G_WIDTH(cfg);
3360}
3361
3362void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
3363{
3364 mac->adapter = adapter;
3365 mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
3366 mac->nucast = 1;
3367
3368 if (adapter->params.rev == 0 && uses_xaui(adapter)) {
3369 t3_write_reg(adapter, A_XGM_SERDES_CTRL + mac->offset,
3370 is_10G(adapter) ? 0x2901c04 : 0x2301c04);
3371 t3_set_reg_field(adapter, A_XGM_PORT_CFG + mac->offset,
3372 F_ENRGMII, 0);
3373 }
3374}
3375
3376void early_hw_init(struct adapter *adapter, const struct adapter_info *ai)
3377{
3378 u32 val = V_PORTSPEED(is_10G(adapter) ? 3 : 2);
3379
3380 mi1_init(adapter, ai);
3381 t3_write_reg(adapter, A_I2C_CFG, /* set for 80KHz */
3382 V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1));
3383 t3_write_reg(adapter, A_T3DBG_GPIO_EN,
3384 ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL);
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003385 t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0);
Divy Le Ray4d22de32007-01-18 22:04:14 -05003386
3387 if (adapter->params.rev == 0 || !uses_xaui(adapter))
3388 val |= F_ENRGMII;
3389
3390 /* Enable MAC clocks so we can access the registers */
3391 t3_write_reg(adapter, A_XGM_PORT_CFG, val);
3392 t3_read_reg(adapter, A_XGM_PORT_CFG);
3393
3394 val |= F_CLKDIVRESET_;
3395 t3_write_reg(adapter, A_XGM_PORT_CFG, val);
3396 t3_read_reg(adapter, A_XGM_PORT_CFG);
3397 t3_write_reg(adapter, XGM_REG(A_XGM_PORT_CFG, 1), val);
3398 t3_read_reg(adapter, A_XGM_PORT_CFG);
3399}
3400
3401/*
Divy Le Raye4d08352007-03-18 13:10:17 -07003402 * Reset the adapter.
3403 * Older PCIe cards lose their config space during reset, PCI-X
Divy Le Ray4d22de32007-01-18 22:04:14 -05003404 * ones don't.
3405 */
3406int t3_reset_adapter(struct adapter *adapter)
3407{
Divy Le Raye4d08352007-03-18 13:10:17 -07003408 int i, save_and_restore_pcie =
3409 adapter->params.rev < T3_REV_B2 && is_pcie(adapter);
Divy Le Ray4d22de32007-01-18 22:04:14 -05003410 uint16_t devid = 0;
3411
Divy Le Raye4d08352007-03-18 13:10:17 -07003412 if (save_and_restore_pcie)
Divy Le Ray4d22de32007-01-18 22:04:14 -05003413 pci_save_state(adapter->pdev);
3414 t3_write_reg(adapter, A_PL_RST, F_CRSTWRM | F_CRSTWRMMODE);
3415
3416 /*
3417 * Delay. Give Some time to device to reset fully.
3418 * XXX The delay time should be modified.
3419 */
3420 for (i = 0; i < 10; i++) {
3421 msleep(50);
3422 pci_read_config_word(adapter->pdev, 0x00, &devid);
3423 if (devid == 0x1425)
3424 break;
3425 }
3426
3427 if (devid != 0x1425)
3428 return -1;
3429
Divy Le Raye4d08352007-03-18 13:10:17 -07003430 if (save_and_restore_pcie)
Divy Le Ray4d22de32007-01-18 22:04:14 -05003431 pci_restore_state(adapter->pdev);
3432 return 0;
3433}
3434
3435/*
3436 * Initialize adapter SW state for the various HW modules, set initial values
3437 * for some adapter tunables, take PHYs out of reset, and initialize the MDIO
3438 * interface.
3439 */
3440int __devinit t3_prep_adapter(struct adapter *adapter,
3441 const struct adapter_info *ai, int reset)
3442{
3443 int ret;
3444 unsigned int i, j = 0;
3445
3446 get_pci_mode(adapter, &adapter->params.pci);
3447
3448 adapter->params.info = ai;
3449 adapter->params.nports = ai->nports;
3450 adapter->params.rev = t3_read_reg(adapter, A_PL_REV);
3451 adapter->params.linkpoll_period = 0;
3452 adapter->params.stats_update_period = is_10G(adapter) ?
3453 MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS * 10);
3454 adapter->params.pci.vpd_cap_addr =
3455 pci_find_capability(adapter->pdev, PCI_CAP_ID_VPD);
3456 ret = get_vpd_params(adapter, &adapter->params.vpd);
3457 if (ret < 0)
3458 return ret;
3459
3460 if (reset && t3_reset_adapter(adapter))
3461 return -1;
3462
3463 t3_sge_prep(adapter, &adapter->params.sge);
3464
3465 if (adapter->params.vpd.mclk) {
3466 struct tp_params *p = &adapter->params.tp;
3467
3468 mc7_prep(adapter, &adapter->pmrx, MC7_PMRX_BASE_ADDR, "PMRX");
3469 mc7_prep(adapter, &adapter->pmtx, MC7_PMTX_BASE_ADDR, "PMTX");
3470 mc7_prep(adapter, &adapter->cm, MC7_CM_BASE_ADDR, "CM");
3471
3472 p->nchan = ai->nports;
3473 p->pmrx_size = t3_mc7_size(&adapter->pmrx);
3474 p->pmtx_size = t3_mc7_size(&adapter->pmtx);
3475 p->cm_size = t3_mc7_size(&adapter->cm);
3476 p->chan_rx_size = p->pmrx_size / 2; /* only 1 Rx channel */
3477 p->chan_tx_size = p->pmtx_size / p->nchan;
3478 p->rx_pg_size = 64 * 1024;
3479 p->tx_pg_size = is_10G(adapter) ? 64 * 1024 : 16 * 1024;
3480 p->rx_num_pgs = pm_num_pages(p->chan_rx_size, p->rx_pg_size);
3481 p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size);
3482 p->ntimer_qs = p->cm_size >= (128 << 20) ||
3483 adapter->params.rev > 0 ? 12 : 6;
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003484 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05003485
Divy Le Ray8ac3ba62007-03-31 00:23:19 -07003486 adapter->params.offload = t3_mc7_size(&adapter->pmrx) &&
3487 t3_mc7_size(&adapter->pmtx) &&
3488 t3_mc7_size(&adapter->cm);
3489
3490 if (is_offload(adapter)) {
Divy Le Ray4d22de32007-01-18 22:04:14 -05003491 adapter->params.mc5.nservers = DEFAULT_NSERVERS;
3492 adapter->params.mc5.nfilters = adapter->params.rev > 0 ?
3493 DEFAULT_NFILTERS : 0;
3494 adapter->params.mc5.nroutes = 0;
3495 t3_mc5_prep(adapter, &adapter->mc5, MC5_MODE_144_BIT);
3496
3497 init_mtus(adapter->params.mtus);
3498 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
3499 }
3500
3501 early_hw_init(adapter, ai);
3502
3503 for_each_port(adapter, i) {
3504 u8 hw_addr[6];
3505 struct port_info *p = adap2pinfo(adapter, i);
3506
3507 while (!adapter->params.vpd.port_type[j])
3508 ++j;
3509
3510 p->port_type = &port_types[adapter->params.vpd.port_type[j]];
3511 p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
3512 ai->mdio_ops);
3513 mac_prep(&p->mac, adapter, j);
3514 ++j;
3515
3516 /*
3517 * The VPD EEPROM stores the base Ethernet address for the
3518 * card. A port's address is derived from the base by adding
3519 * the port's index to the base's low octet.
3520 */
3521 memcpy(hw_addr, adapter->params.vpd.eth_base, 5);
3522 hw_addr[5] = adapter->params.vpd.eth_base[5] + i;
3523
3524 memcpy(adapter->port[i]->dev_addr, hw_addr,
3525 ETH_ALEN);
3526 memcpy(adapter->port[i]->perm_addr, hw_addr,
3527 ETH_ALEN);
3528 init_link_config(&p->link_config, p->port_type->caps);
3529 p->phy.ops->power_down(&p->phy, 1);
3530 if (!(p->port_type->caps & SUPPORTED_IRQ))
3531 adapter->params.linkpoll_period = 10;
3532 }
3533
3534 return 0;
3535}
3536
3537void t3_led_ready(struct adapter *adapter)
3538{
3539 t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL,
3540 F_GPIO0_OUT_VAL);
3541}