cxgb_t3_hw.c revision 1.9 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