root/drivers/net/ethernet/chelsio/cxgb3/t3_hw.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. t3_wait_op_done_val
  2. t3_write_regs
  3. t3_set_reg_field
  4. t3_read_indirect
  5. t3_mc7_bd_read
  6. mi1_init
  7. t3_mi1_read
  8. t3_mi1_write
  9. mi1_wr_addr
  10. mi1_ext_read
  11. mi1_ext_write
  12. t3_mdio_change_bits
  13. t3_phy_reset
  14. t3_phy_advertise
  15. t3_phy_advertise_fiber
  16. t3_set_phy_speed_duplex
  17. t3_phy_lasi_intr_enable
  18. t3_phy_lasi_intr_disable
  19. t3_phy_lasi_intr_clear
  20. t3_phy_lasi_intr_handler
  21. t3_get_adapter_info
  22. t3_seeprom_read
  23. t3_seeprom_write
  24. t3_seeprom_wp
  25. vpdstrtouint
  26. vpdstrtou16
  27. get_vpd_params
  28. sf1_read
  29. sf1_write
  30. flash_wait_op
  31. t3_read_flash
  32. t3_write_flash
  33. t3_get_tp_version
  34. t3_check_tpsram_version
  35. t3_check_tpsram
  36. t3_get_fw_version
  37. t3_check_fw_version
  38. t3_flash_erase_sectors
  39. t3_load_fw
  40. t3_cim_ctl_blk_read
  41. t3_gate_rx_traffic
  42. t3_open_rx_traffic
  43. t3_link_changed
  44. t3_link_fault
  45. t3_link_start
  46. t3_set_vlan_accel
  47. t3_handle_intr_status
  48. pci_intr_handler
  49. pcie_intr_handler
  50. tp_intr_handler
  51. cim_intr_handler
  52. ulprx_intr_handler
  53. ulptx_intr_handler
  54. pmtx_intr_handler
  55. pmrx_intr_handler
  56. cplsw_intr_handler
  57. mps_intr_handler
  58. mc7_intr_handler
  59. mac_intr_handler
  60. t3_phy_intr_handler
  61. t3_slow_intr_handler
  62. calc_gpio_intr
  63. t3_intr_enable
  64. t3_intr_disable
  65. t3_intr_clear
  66. t3_xgm_intr_enable
  67. t3_xgm_intr_disable
  68. t3_port_intr_enable
  69. t3_port_intr_disable
  70. t3_port_intr_clear
  71. t3_sge_write_context
  72. clear_sge_ctxt
  73. t3_sge_init_ecntxt
  74. t3_sge_init_flcntxt
  75. t3_sge_init_rspcntxt
  76. t3_sge_init_cqcntxt
  77. t3_sge_enable_ecntxt
  78. t3_sge_disable_fl
  79. t3_sge_disable_rspcntxt
  80. t3_sge_disable_cqcntxt
  81. t3_sge_cqcntxt_op
  82. t3_config_rss
  83. t3_tp_set_offload_mode
  84. pm_num_pages
  85. partition_mem
  86. tp_wr_indirect
  87. tp_config
  88. tp_set_timers
  89. t3_tp_set_coalescing_size
  90. t3_tp_set_max_rxsize
  91. init_mtus
  92. init_cong_ctrl
  93. t3_load_mtus
  94. t3_tp_get_mib_stats
  95. ulp_config
  96. t3_set_proto_sram
  97. t3_config_trace_filter
  98. t3_config_sched
  99. tp_init
  100. chan_init_hw
  101. calibrate_xgm
  102. calibrate_xgm_t3b
  103. wrreg_wait
  104. mc7_init
  105. config_pcie
  106. t3_init_hw
  107. get_pci_mode
  108. init_link_config
  109. mc7_calc_size
  110. mc7_prep
  111. mac_prep
  112. early_hw_init
  113. t3_reset_adapter
  114. init_parity
  115. t3_prep_adapter
  116. t3_led_ready
  117. t3_replay_prep_adapter

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

/* [<][>][^][v][top][bottom][index][help] */