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