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