1 /* 2 * This file is part of the Chelsio T4 Ethernet driver for Linux. 3 * 4 * Copyright (c) 2003-2016 Chelsio Communications, Inc. All rights reserved. 5 * 6 * This software is available to you under a choice of one of two 7 * licenses. You may choose to be licensed under the terms of the GNU 8 * General Public License (GPL) Version 2, available from the file 9 * COPYING in the main directory of this source tree, or the 10 * OpenIB.org BSD license below: 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above 17 * copyright notice, this list of conditions and the following 18 * disclaimer. 19 * 20 * - Redistributions in binary form must reproduce the above 21 * copyright notice, this list of conditions and the following 22 * disclaimer in the documentation and/or other materials 23 * provided with the distribution. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 * SOFTWARE. 33 */ 34 35 #include <linux/delay.h> 36 #include "cxgb4.h" 37 #include "t4_regs.h" 38 #include "t4_values.h" 39 #include "t4fw_api.h" 40 #include "t4fw_version.h" 41 42 /** 43 * t4_wait_op_done_val - wait until an operation is completed 44 * @adapter: the adapter performing the operation 45 * @reg: the register to check for completion 46 * @mask: a single-bit field within @reg that indicates completion 47 * @polarity: the value of the field when the operation is completed 48 * @attempts: number of check iterations 49 * @delay: delay in usecs between iterations 50 * @valp: where to store the value of the register at completion time 51 * 52 * Wait until an operation is completed by checking a bit in a register 53 * up to @attempts times. If @valp is not NULL the value of the register 54 * at the time it indicated completion is stored there. Returns 0 if the 55 * operation completes and -EAGAIN otherwise. 56 */ 57 static int t4_wait_op_done_val(struct adapter *adapter, int reg, u32 mask, 58 int polarity, int attempts, int delay, u32 *valp) 59 { 60 while (1) { 61 u32 val = t4_read_reg(adapter, reg); 62 63 if (!!(val & mask) == polarity) { 64 if (valp) 65 *valp = val; 66 return 0; 67 } 68 if (--attempts == 0) 69 return -EAGAIN; 70 if (delay) 71 udelay(delay); 72 } 73 } 74 75 static inline int t4_wait_op_done(struct adapter *adapter, int reg, u32 mask, 76 int polarity, int attempts, int delay) 77 { 78 return t4_wait_op_done_val(adapter, reg, mask, polarity, attempts, 79 delay, NULL); 80 } 81 82 /** 83 * t4_set_reg_field - set a register field to a value 84 * @adapter: the adapter to program 85 * @addr: the register address 86 * @mask: specifies the portion of the register to modify 87 * @val: the new value for the register field 88 * 89 * Sets a register field specified by the supplied mask to the 90 * given value. 91 */ 92 void t4_set_reg_field(struct adapter *adapter, unsigned int addr, u32 mask, 93 u32 val) 94 { 95 u32 v = t4_read_reg(adapter, addr) & ~mask; 96 97 t4_write_reg(adapter, addr, v | val); 98 (void) t4_read_reg(adapter, addr); /* flush */ 99 } 100 101 /** 102 * t4_read_indirect - read indirectly addressed registers 103 * @adap: the adapter 104 * @addr_reg: register holding the indirect address 105 * @data_reg: register holding the value of the indirect register 106 * @vals: where the read register values are stored 107 * @nregs: how many indirect registers to read 108 * @start_idx: index of first indirect register to read 109 * 110 * Reads registers that are accessed indirectly through an address/data 111 * register pair. 112 */ 113 void t4_read_indirect(struct adapter *adap, unsigned int addr_reg, 114 unsigned int data_reg, u32 *vals, 115 unsigned int nregs, unsigned int start_idx) 116 { 117 while (nregs--) { 118 t4_write_reg(adap, addr_reg, start_idx); 119 *vals++ = t4_read_reg(adap, data_reg); 120 start_idx++; 121 } 122 } 123 124 /** 125 * t4_write_indirect - write indirectly addressed registers 126 * @adap: the adapter 127 * @addr_reg: register holding the indirect addresses 128 * @data_reg: register holding the value for the indirect registers 129 * @vals: values to write 130 * @nregs: how many indirect registers to write 131 * @start_idx: address of first indirect register to write 132 * 133 * Writes a sequential block of registers that are accessed indirectly 134 * through an address/data register pair. 135 */ 136 void t4_write_indirect(struct adapter *adap, unsigned int addr_reg, 137 unsigned int data_reg, const u32 *vals, 138 unsigned int nregs, unsigned int start_idx) 139 { 140 while (nregs--) { 141 t4_write_reg(adap, addr_reg, start_idx++); 142 t4_write_reg(adap, data_reg, *vals++); 143 } 144 } 145 146 /* 147 * Read a 32-bit PCI Configuration Space register via the PCI-E backdoor 148 * mechanism. This guarantees that we get the real value even if we're 149 * operating within a Virtual Machine and the Hypervisor is trapping our 150 * Configuration Space accesses. 151 */ 152 void t4_hw_pci_read_cfg4(struct adapter *adap, int reg, u32 *val) 153 { 154 u32 req = FUNCTION_V(adap->pf) | REGISTER_V(reg); 155 156 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5) 157 req |= ENABLE_F; 158 else 159 req |= T6_ENABLE_F; 160 161 if (is_t4(adap->params.chip)) 162 req |= LOCALCFG_F; 163 164 t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, req); 165 *val = t4_read_reg(adap, PCIE_CFG_SPACE_DATA_A); 166 167 /* Reset ENABLE to 0 so reads of PCIE_CFG_SPACE_DATA won't cause a 168 * Configuration Space read. (None of the other fields matter when 169 * ENABLE is 0 so a simple register write is easier than a 170 * read-modify-write via t4_set_reg_field().) 171 */ 172 t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, 0); 173 } 174 175 /* 176 * t4_report_fw_error - report firmware error 177 * @adap: the adapter 178 * 179 * The adapter firmware can indicate error conditions to the host. 180 * If the firmware has indicated an error, print out the reason for 181 * the firmware error. 182 */ 183 static void t4_report_fw_error(struct adapter *adap) 184 { 185 static const char *const reason[] = { 186 "Crash", /* PCIE_FW_EVAL_CRASH */ 187 "During Device Preparation", /* PCIE_FW_EVAL_PREP */ 188 "During Device Configuration", /* PCIE_FW_EVAL_CONF */ 189 "During Device Initialization", /* PCIE_FW_EVAL_INIT */ 190 "Unexpected Event", /* PCIE_FW_EVAL_UNEXPECTEDEVENT */ 191 "Insufficient Airflow", /* PCIE_FW_EVAL_OVERHEAT */ 192 "Device Shutdown", /* PCIE_FW_EVAL_DEVICESHUTDOWN */ 193 "Reserved", /* reserved */ 194 }; 195 u32 pcie_fw; 196 197 pcie_fw = t4_read_reg(adap, PCIE_FW_A); 198 if (pcie_fw & PCIE_FW_ERR_F) { 199 dev_err(adap->pdev_dev, "Firmware reports adapter error: %s\n", 200 reason[PCIE_FW_EVAL_G(pcie_fw)]); 201 adap->flags &= ~FW_OK; 202 } 203 } 204 205 /* 206 * Get the reply to a mailbox command and store it in @rpl in big-endian order. 207 */ 208 static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit, 209 u32 mbox_addr) 210 { 211 for ( ; nflit; nflit--, mbox_addr += 8) 212 *rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr)); 213 } 214 215 /* 216 * Handle a FW assertion reported in a mailbox. 217 */ 218 static void fw_asrt(struct adapter *adap, u32 mbox_addr) 219 { 220 struct fw_debug_cmd asrt; 221 222 get_mbox_rpl(adap, (__be64 *)&asrt, sizeof(asrt) / 8, mbox_addr); 223 dev_alert(adap->pdev_dev, 224 "FW assertion at %.16s:%u, val0 %#x, val1 %#x\n", 225 asrt.u.assert.filename_0_7, be32_to_cpu(asrt.u.assert.line), 226 be32_to_cpu(asrt.u.assert.x), be32_to_cpu(asrt.u.assert.y)); 227 } 228 229 /** 230 * t4_record_mbox - record a Firmware Mailbox Command/Reply in the log 231 * @adapter: the adapter 232 * @cmd: the Firmware Mailbox Command or Reply 233 * @size: command length in bytes 234 * @access: the time (ms) needed to access the Firmware Mailbox 235 * @execute: the time (ms) the command spent being executed 236 */ 237 static void t4_record_mbox(struct adapter *adapter, 238 const __be64 *cmd, unsigned int size, 239 int access, int execute) 240 { 241 struct mbox_cmd_log *log = adapter->mbox_log; 242 struct mbox_cmd *entry; 243 int i; 244 245 entry = mbox_cmd_log_entry(log, log->cursor++); 246 if (log->cursor == log->size) 247 log->cursor = 0; 248 249 for (i = 0; i < size / 8; i++) 250 entry->cmd[i] = be64_to_cpu(cmd[i]); 251 while (i < MBOX_LEN / 8) 252 entry->cmd[i++] = 0; 253 entry->timestamp = jiffies; 254 entry->seqno = log->seqno++; 255 entry->access = access; 256 entry->execute = execute; 257 } 258 259 /** 260 * t4_wr_mbox_meat_timeout - send a command to FW through the given mailbox 261 * @adap: the adapter 262 * @mbox: index of the mailbox to use 263 * @cmd: the command to write 264 * @size: command length in bytes 265 * @rpl: where to optionally store the reply 266 * @sleep_ok: if true we may sleep while awaiting command completion 267 * @timeout: time to wait for command to finish before timing out 268 * 269 * Sends the given command to FW through the selected mailbox and waits 270 * for the FW to execute the command. If @rpl is not %NULL it is used to 271 * store the FW's reply to the command. The command and its optional 272 * reply are of the same length. FW can take up to %FW_CMD_MAX_TIMEOUT ms 273 * to respond. @sleep_ok determines whether we may sleep while awaiting 274 * the response. If sleeping is allowed we use progressive backoff 275 * otherwise we spin. 276 * 277 * The return value is 0 on success or a negative errno on failure. A 278 * failure can happen either because we are not able to execute the 279 * command or FW executes it but signals an error. In the latter case 280 * the return value is the error code indicated by FW (negated). 281 */ 282 int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd, 283 int size, void *rpl, bool sleep_ok, int timeout) 284 { 285 static const int delay[] = { 286 1, 1, 3, 5, 10, 10, 20, 50, 100, 200 287 }; 288 289 struct mbox_list entry; 290 u16 access = 0; 291 u16 execute = 0; 292 u32 v; 293 u64 res; 294 int i, ms, delay_idx, ret; 295 const __be64 *p = cmd; 296 u32 data_reg = PF_REG(mbox, CIM_PF_MAILBOX_DATA_A); 297 u32 ctl_reg = PF_REG(mbox, CIM_PF_MAILBOX_CTRL_A); 298 __be64 cmd_rpl[MBOX_LEN / 8]; 299 u32 pcie_fw; 300 301 if ((size & 15) || size > MBOX_LEN) 302 return -EINVAL; 303 304 /* 305 * If the device is off-line, as in EEH, commands will time out. 306 * Fail them early so we don't waste time waiting. 307 */ 308 if (adap->pdev->error_state != pci_channel_io_normal) 309 return -EIO; 310 311 /* If we have a negative timeout, that implies that we can't sleep. */ 312 if (timeout < 0) { 313 sleep_ok = false; 314 timeout = -timeout; 315 } 316 317 /* Queue ourselves onto the mailbox access list. When our entry is at 318 * the front of the list, we have rights to access the mailbox. So we 319 * wait [for a while] till we're at the front [or bail out with an 320 * EBUSY] ... 321 */ 322 spin_lock_bh(&adap->mbox_lock); 323 list_add_tail(&entry.list, &adap->mlist.list); 324 spin_unlock_bh(&adap->mbox_lock); 325 326 delay_idx = 0; 327 ms = delay[0]; 328 329 for (i = 0; ; i += ms) { 330 /* If we've waited too long, return a busy indication. This 331 * really ought to be based on our initial position in the 332 * mailbox access list but this is a start. We very rearely 333 * contend on access to the mailbox ... 334 */ 335 pcie_fw = t4_read_reg(adap, PCIE_FW_A); 336 if (i > FW_CMD_MAX_TIMEOUT || (pcie_fw & PCIE_FW_ERR_F)) { 337 spin_lock_bh(&adap->mbox_lock); 338 list_del(&entry.list); 339 spin_unlock_bh(&adap->mbox_lock); 340 ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -EBUSY; 341 t4_record_mbox(adap, cmd, size, access, ret); 342 return ret; 343 } 344 345 /* If we're at the head, break out and start the mailbox 346 * protocol. 347 */ 348 if (list_first_entry(&adap->mlist.list, struct mbox_list, 349 list) == &entry) 350 break; 351 352 /* Delay for a bit before checking again ... */ 353 if (sleep_ok) { 354 ms = delay[delay_idx]; /* last element may repeat */ 355 if (delay_idx < ARRAY_SIZE(delay) - 1) 356 delay_idx++; 357 msleep(ms); 358 } else { 359 mdelay(ms); 360 } 361 } 362 363 /* Loop trying to get ownership of the mailbox. Return an error 364 * if we can't gain ownership. 365 */ 366 v = MBOWNER_G(t4_read_reg(adap, ctl_reg)); 367 for (i = 0; v == MBOX_OWNER_NONE && i < 3; i++) 368 v = MBOWNER_G(t4_read_reg(adap, ctl_reg)); 369 if (v != MBOX_OWNER_DRV) { 370 spin_lock_bh(&adap->mbox_lock); 371 list_del(&entry.list); 372 spin_unlock_bh(&adap->mbox_lock); 373 ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT; 374 t4_record_mbox(adap, cmd, size, access, ret); 375 return ret; 376 } 377 378 /* Copy in the new mailbox command and send it on its way ... */ 379 t4_record_mbox(adap, cmd, size, access, 0); 380 for (i = 0; i < size; i += 8) 381 t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++)); 382 383 t4_write_reg(adap, ctl_reg, MBMSGVALID_F | MBOWNER_V(MBOX_OWNER_FW)); 384 t4_read_reg(adap, ctl_reg); /* flush write */ 385 386 delay_idx = 0; 387 ms = delay[0]; 388 389 for (i = 0; 390 !((pcie_fw = t4_read_reg(adap, PCIE_FW_A)) & PCIE_FW_ERR_F) && 391 i < timeout; 392 i += ms) { 393 if (sleep_ok) { 394 ms = delay[delay_idx]; /* last element may repeat */ 395 if (delay_idx < ARRAY_SIZE(delay) - 1) 396 delay_idx++; 397 msleep(ms); 398 } else 399 mdelay(ms); 400 401 v = t4_read_reg(adap, ctl_reg); 402 if (MBOWNER_G(v) == MBOX_OWNER_DRV) { 403 if (!(v & MBMSGVALID_F)) { 404 t4_write_reg(adap, ctl_reg, 0); 405 continue; 406 } 407 408 get_mbox_rpl(adap, cmd_rpl, MBOX_LEN / 8, data_reg); 409 res = be64_to_cpu(cmd_rpl[0]); 410 411 if (FW_CMD_OP_G(res >> 32) == FW_DEBUG_CMD) { 412 fw_asrt(adap, data_reg); 413 res = FW_CMD_RETVAL_V(EIO); 414 } else if (rpl) { 415 memcpy(rpl, cmd_rpl, size); 416 } 417 418 t4_write_reg(adap, ctl_reg, 0); 419 420 execute = i + ms; 421 t4_record_mbox(adap, cmd_rpl, 422 MBOX_LEN, access, execute); 423 spin_lock_bh(&adap->mbox_lock); 424 list_del(&entry.list); 425 spin_unlock_bh(&adap->mbox_lock); 426 return -FW_CMD_RETVAL_G((int)res); 427 } 428 } 429 430 ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -ETIMEDOUT; 431 t4_record_mbox(adap, cmd, size, access, ret); 432 dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n", 433 *(const u8 *)cmd, mbox); 434 t4_report_fw_error(adap); 435 spin_lock_bh(&adap->mbox_lock); 436 list_del(&entry.list); 437 spin_unlock_bh(&adap->mbox_lock); 438 t4_fatal_err(adap); 439 return ret; 440 } 441 442 int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size, 443 void *rpl, bool sleep_ok) 444 { 445 return t4_wr_mbox_meat_timeout(adap, mbox, cmd, size, rpl, sleep_ok, 446 FW_CMD_MAX_TIMEOUT); 447 } 448 449 static int t4_edc_err_read(struct adapter *adap, int idx) 450 { 451 u32 edc_ecc_err_addr_reg; 452 u32 rdata_reg; 453 454 if (is_t4(adap->params.chip)) { 455 CH_WARN(adap, "%s: T4 NOT supported.\n", __func__); 456 return 0; 457 } 458 if (idx != 0 && idx != 1) { 459 CH_WARN(adap, "%s: idx %d NOT supported.\n", __func__, idx); 460 return 0; 461 } 462 463 edc_ecc_err_addr_reg = EDC_T5_REG(EDC_H_ECC_ERR_ADDR_A, idx); 464 rdata_reg = EDC_T5_REG(EDC_H_BIST_STATUS_RDATA_A, idx); 465 466 CH_WARN(adap, 467 "edc%d err addr 0x%x: 0x%x.\n", 468 idx, edc_ecc_err_addr_reg, 469 t4_read_reg(adap, edc_ecc_err_addr_reg)); 470 CH_WARN(adap, 471 "bist: 0x%x, status %llx %llx %llx %llx %llx %llx %llx %llx %llx.\n", 472 rdata_reg, 473 (unsigned long long)t4_read_reg64(adap, rdata_reg), 474 (unsigned long long)t4_read_reg64(adap, rdata_reg + 8), 475 (unsigned long long)t4_read_reg64(adap, rdata_reg + 16), 476 (unsigned long long)t4_read_reg64(adap, rdata_reg + 24), 477 (unsigned long long)t4_read_reg64(adap, rdata_reg + 32), 478 (unsigned long long)t4_read_reg64(adap, rdata_reg + 40), 479 (unsigned long long)t4_read_reg64(adap, rdata_reg + 48), 480 (unsigned long long)t4_read_reg64(adap, rdata_reg + 56), 481 (unsigned long long)t4_read_reg64(adap, rdata_reg + 64)); 482 483 return 0; 484 } 485 486 /** 487 * t4_memory_rw - read/write EDC 0, EDC 1 or MC via PCIE memory window 488 * @adap: the adapter 489 * @win: PCI-E Memory Window to use 490 * @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC 491 * @addr: address within indicated memory type 492 * @len: amount of memory to transfer 493 * @hbuf: host memory buffer 494 * @dir: direction of transfer T4_MEMORY_READ (1) or T4_MEMORY_WRITE (0) 495 * 496 * Reads/writes an [almost] arbitrary memory region in the firmware: the 497 * firmware memory address and host buffer must be aligned on 32-bit 498 * boudaries; the length may be arbitrary. The memory is transferred as 499 * a raw byte sequence from/to the firmware's memory. If this memory 500 * contains data structures which contain multi-byte integers, it's the 501 * caller's responsibility to perform appropriate byte order conversions. 502 */ 503 int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, 504 u32 len, void *hbuf, int dir) 505 { 506 u32 pos, offset, resid, memoffset; 507 u32 edc_size, mc_size, win_pf, mem_reg, mem_aperture, mem_base; 508 u32 *buf; 509 510 /* Argument sanity checks ... 511 */ 512 if (addr & 0x3 || (uintptr_t)hbuf & 0x3) 513 return -EINVAL; 514 buf = (u32 *)hbuf; 515 516 /* It's convenient to be able to handle lengths which aren't a 517 * multiple of 32-bits because we often end up transferring files to 518 * the firmware. So we'll handle that by normalizing the length here 519 * and then handling any residual transfer at the end. 520 */ 521 resid = len & 0x3; 522 len -= resid; 523 524 /* Offset into the region of memory which is being accessed 525 * MEM_EDC0 = 0 526 * MEM_EDC1 = 1 527 * MEM_MC = 2 -- MEM_MC for chips with only 1 memory controller 528 * MEM_MC1 = 3 -- for chips with 2 memory controllers (e.g. T5) 529 * MEM_HMA = 4 530 */ 531 edc_size = EDRAM0_SIZE_G(t4_read_reg(adap, MA_EDRAM0_BAR_A)); 532 if (mtype == MEM_HMA) { 533 memoffset = 2 * (edc_size * 1024 * 1024); 534 } else if (mtype != MEM_MC1) { 535 memoffset = (mtype * (edc_size * 1024 * 1024)); 536 } else { 537 mc_size = EXT_MEM0_SIZE_G(t4_read_reg(adap, 538 MA_EXT_MEMORY0_BAR_A)); 539 memoffset = (MEM_MC0 * edc_size + mc_size) * 1024 * 1024; 540 } 541 542 /* Determine the PCIE_MEM_ACCESS_OFFSET */ 543 addr = addr + memoffset; 544 545 /* Each PCI-E Memory Window is programmed with a window size -- or 546 * "aperture" -- which controls the granularity of its mapping onto 547 * adapter memory. We need to grab that aperture in order to know 548 * how to use the specified window. The window is also programmed 549 * with the base address of the Memory Window in BAR0's address 550 * space. For T4 this is an absolute PCI-E Bus Address. For T5 551 * the address is relative to BAR0. 552 */ 553 mem_reg = t4_read_reg(adap, 554 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, 555 win)); 556 mem_aperture = 1 << (WINDOW_G(mem_reg) + WINDOW_SHIFT_X); 557 mem_base = PCIEOFST_G(mem_reg) << PCIEOFST_SHIFT_X; 558 if (is_t4(adap->params.chip)) 559 mem_base -= adap->t4_bar0; 560 win_pf = is_t4(adap->params.chip) ? 0 : PFNUM_V(adap->pf); 561 562 /* Calculate our initial PCI-E Memory Window Position and Offset into 563 * that Window. 564 */ 565 pos = addr & ~(mem_aperture-1); 566 offset = addr - pos; 567 568 /* Set up initial PCI-E Memory Window to cover the start of our 569 * transfer. (Read it back to ensure that changes propagate before we 570 * attempt to use the new value.) 571 */ 572 t4_write_reg(adap, 573 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win), 574 pos | win_pf); 575 t4_read_reg(adap, 576 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win)); 577 578 /* Transfer data to/from the adapter as long as there's an integral 579 * number of 32-bit transfers to complete. 580 * 581 * A note on Endianness issues: 582 * 583 * The "register" reads and writes below from/to the PCI-E Memory 584 * Window invoke the standard adapter Big-Endian to PCI-E Link 585 * Little-Endian "swizzel." As a result, if we have the following 586 * data in adapter memory: 587 * 588 * Memory: ... | b0 | b1 | b2 | b3 | ... 589 * Address: i+0 i+1 i+2 i+3 590 * 591 * Then a read of the adapter memory via the PCI-E Memory Window 592 * will yield: 593 * 594 * x = readl(i) 595 * 31 0 596 * [ b3 | b2 | b1 | b0 ] 597 * 598 * If this value is stored into local memory on a Little-Endian system 599 * it will show up correctly in local memory as: 600 * 601 * ( ..., b0, b1, b2, b3, ... ) 602 * 603 * But on a Big-Endian system, the store will show up in memory 604 * incorrectly swizzled as: 605 * 606 * ( ..., b3, b2, b1, b0, ... ) 607 * 608 * So we need to account for this in the reads and writes to the 609 * PCI-E Memory Window below by undoing the register read/write 610 * swizzels. 611 */ 612 while (len > 0) { 613 if (dir == T4_MEMORY_READ) 614 *buf++ = le32_to_cpu((__force __le32)t4_read_reg(adap, 615 mem_base + offset)); 616 else 617 t4_write_reg(adap, mem_base + offset, 618 (__force u32)cpu_to_le32(*buf++)); 619 offset += sizeof(__be32); 620 len -= sizeof(__be32); 621 622 /* If we've reached the end of our current window aperture, 623 * move the PCI-E Memory Window on to the next. Note that 624 * doing this here after "len" may be 0 allows us to set up 625 * the PCI-E Memory Window for a possible final residual 626 * transfer below ... 627 */ 628 if (offset == mem_aperture) { 629 pos += mem_aperture; 630 offset = 0; 631 t4_write_reg(adap, 632 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, 633 win), pos | win_pf); 634 t4_read_reg(adap, 635 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, 636 win)); 637 } 638 } 639 640 /* If the original transfer had a length which wasn't a multiple of 641 * 32-bits, now's where we need to finish off the transfer of the 642 * residual amount. The PCI-E Memory Window has already been moved 643 * above (if necessary) to cover this final transfer. 644 */ 645 if (resid) { 646 union { 647 u32 word; 648 char byte[4]; 649 } last; 650 unsigned char *bp; 651 int i; 652 653 if (dir == T4_MEMORY_READ) { 654 last.word = le32_to_cpu( 655 (__force __le32)t4_read_reg(adap, 656 mem_base + offset)); 657 for (bp = (unsigned char *)buf, i = resid; i < 4; i++) 658 bp[i] = last.byte[i]; 659 } else { 660 last.word = *buf; 661 for (i = resid; i < 4; i++) 662 last.byte[i] = 0; 663 t4_write_reg(adap, mem_base + offset, 664 (__force u32)cpu_to_le32(last.word)); 665 } 666 } 667 668 return 0; 669 } 670 671 /* Return the specified PCI-E Configuration Space register from our Physical 672 * Function. We try first via a Firmware LDST Command since we prefer to let 673 * the firmware own all of these registers, but if that fails we go for it 674 * directly ourselves. 675 */ 676 u32 t4_read_pcie_cfg4(struct adapter *adap, int reg) 677 { 678 u32 val, ldst_addrspace; 679 680 /* If fw_attach != 0, construct and send the Firmware LDST Command to 681 * retrieve the specified PCI-E Configuration Space register. 682 */ 683 struct fw_ldst_cmd ldst_cmd; 684 int ret; 685 686 memset(&ldst_cmd, 0, sizeof(ldst_cmd)); 687 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FUNC_PCIE); 688 ldst_cmd.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 689 FW_CMD_REQUEST_F | 690 FW_CMD_READ_F | 691 ldst_addrspace); 692 ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd)); 693 ldst_cmd.u.pcie.select_naccess = FW_LDST_CMD_NACCESS_V(1); 694 ldst_cmd.u.pcie.ctrl_to_fn = 695 (FW_LDST_CMD_LC_F | FW_LDST_CMD_FN_V(adap->pf)); 696 ldst_cmd.u.pcie.r = reg; 697 698 /* If the LDST Command succeeds, return the result, otherwise 699 * fall through to reading it directly ourselves ... 700 */ 701 ret = t4_wr_mbox(adap, adap->mbox, &ldst_cmd, sizeof(ldst_cmd), 702 &ldst_cmd); 703 if (ret == 0) 704 val = be32_to_cpu(ldst_cmd.u.pcie.data[0]); 705 else 706 /* Read the desired Configuration Space register via the PCI-E 707 * Backdoor mechanism. 708 */ 709 t4_hw_pci_read_cfg4(adap, reg, &val); 710 return val; 711 } 712 713 /* Get the window based on base passed to it. 714 * Window aperture is currently unhandled, but there is no use case for it 715 * right now 716 */ 717 static u32 t4_get_window(struct adapter *adap, u32 pci_base, u64 pci_mask, 718 u32 memwin_base) 719 { 720 u32 ret; 721 722 if (is_t4(adap->params.chip)) { 723 u32 bar0; 724 725 /* Truncation intentional: we only read the bottom 32-bits of 726 * the 64-bit BAR0/BAR1 ... We use the hardware backdoor 727 * mechanism to read BAR0 instead of using 728 * pci_resource_start() because we could be operating from 729 * within a Virtual Machine which is trapping our accesses to 730 * our Configuration Space and we need to set up the PCI-E 731 * Memory Window decoders with the actual addresses which will 732 * be coming across the PCI-E link. 733 */ 734 bar0 = t4_read_pcie_cfg4(adap, pci_base); 735 bar0 &= pci_mask; 736 adap->t4_bar0 = bar0; 737 738 ret = bar0 + memwin_base; 739 } else { 740 /* For T5, only relative offset inside the PCIe BAR is passed */ 741 ret = memwin_base; 742 } 743 return ret; 744 } 745 746 /* Get the default utility window (win0) used by everyone */ 747 u32 t4_get_util_window(struct adapter *adap) 748 { 749 return t4_get_window(adap, PCI_BASE_ADDRESS_0, 750 PCI_BASE_ADDRESS_MEM_MASK, MEMWIN0_BASE); 751 } 752 753 /* Set up memory window for accessing adapter memory ranges. (Read 754 * back MA register to ensure that changes propagate before we attempt 755 * to use the new values.) 756 */ 757 void t4_setup_memwin(struct adapter *adap, u32 memwin_base, u32 window) 758 { 759 t4_write_reg(adap, 760 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window), 761 memwin_base | BIR_V(0) | 762 WINDOW_V(ilog2(MEMWIN0_APERTURE) - WINDOW_SHIFT_X)); 763 t4_read_reg(adap, 764 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window)); 765 } 766 767 /** 768 * t4_get_regs_len - return the size of the chips register set 769 * @adapter: the adapter 770 * 771 * Returns the size of the chip's BAR0 register space. 772 */ 773 unsigned int t4_get_regs_len(struct adapter *adapter) 774 { 775 unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip); 776 777 switch (chip_version) { 778 case CHELSIO_T4: 779 return T4_REGMAP_SIZE; 780 781 case CHELSIO_T5: 782 case CHELSIO_T6: 783 return T5_REGMAP_SIZE; 784 } 785 786 dev_err(adapter->pdev_dev, 787 "Unsupported chip version %d\n", chip_version); 788 return 0; 789 } 790 791 /** 792 * t4_get_regs - read chip registers into provided buffer 793 * @adap: the adapter 794 * @buf: register buffer 795 * @buf_size: size (in bytes) of register buffer 796 * 797 * If the provided register buffer isn't large enough for the chip's 798 * full register range, the register dump will be truncated to the 799 * register buffer's size. 800 */ 801 void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size) 802 { 803 static const unsigned int t4_reg_ranges[] = { 804 0x1008, 0x1108, 805 0x1180, 0x1184, 806 0x1190, 0x1194, 807 0x11a0, 0x11a4, 808 0x11b0, 0x11b4, 809 0x11fc, 0x123c, 810 0x1300, 0x173c, 811 0x1800, 0x18fc, 812 0x3000, 0x30d8, 813 0x30e0, 0x30e4, 814 0x30ec, 0x5910, 815 0x5920, 0x5924, 816 0x5960, 0x5960, 817 0x5968, 0x5968, 818 0x5970, 0x5970, 819 0x5978, 0x5978, 820 0x5980, 0x5980, 821 0x5988, 0x5988, 822 0x5990, 0x5990, 823 0x5998, 0x5998, 824 0x59a0, 0x59d4, 825 0x5a00, 0x5ae0, 826 0x5ae8, 0x5ae8, 827 0x5af0, 0x5af0, 828 0x5af8, 0x5af8, 829 0x6000, 0x6098, 830 0x6100, 0x6150, 831 0x6200, 0x6208, 832 0x6240, 0x6248, 833 0x6280, 0x62b0, 834 0x62c0, 0x6338, 835 0x6370, 0x638c, 836 0x6400, 0x643c, 837 0x6500, 0x6524, 838 0x6a00, 0x6a04, 839 0x6a14, 0x6a38, 840 0x6a60, 0x6a70, 841 0x6a78, 0x6a78, 842 0x6b00, 0x6b0c, 843 0x6b1c, 0x6b84, 844 0x6bf0, 0x6bf8, 845 0x6c00, 0x6c0c, 846 0x6c1c, 0x6c84, 847 0x6cf0, 0x6cf8, 848 0x6d00, 0x6d0c, 849 0x6d1c, 0x6d84, 850 0x6df0, 0x6df8, 851 0x6e00, 0x6e0c, 852 0x6e1c, 0x6e84, 853 0x6ef0, 0x6ef8, 854 0x6f00, 0x6f0c, 855 0x6f1c, 0x6f84, 856 0x6ff0, 0x6ff8, 857 0x7000, 0x700c, 858 0x701c, 0x7084, 859 0x70f0, 0x70f8, 860 0x7100, 0x710c, 861 0x711c, 0x7184, 862 0x71f0, 0x71f8, 863 0x7200, 0x720c, 864 0x721c, 0x7284, 865 0x72f0, 0x72f8, 866 0x7300, 0x730c, 867 0x731c, 0x7384, 868 0x73f0, 0x73f8, 869 0x7400, 0x7450, 870 0x7500, 0x7530, 871 0x7600, 0x760c, 872 0x7614, 0x761c, 873 0x7680, 0x76cc, 874 0x7700, 0x7798, 875 0x77c0, 0x77fc, 876 0x7900, 0x79fc, 877 0x7b00, 0x7b58, 878 0x7b60, 0x7b84, 879 0x7b8c, 0x7c38, 880 0x7d00, 0x7d38, 881 0x7d40, 0x7d80, 882 0x7d8c, 0x7ddc, 883 0x7de4, 0x7e04, 884 0x7e10, 0x7e1c, 885 0x7e24, 0x7e38, 886 0x7e40, 0x7e44, 887 0x7e4c, 0x7e78, 888 0x7e80, 0x7ea4, 889 0x7eac, 0x7edc, 890 0x7ee8, 0x7efc, 891 0x8dc0, 0x8e04, 892 0x8e10, 0x8e1c, 893 0x8e30, 0x8e78, 894 0x8ea0, 0x8eb8, 895 0x8ec0, 0x8f6c, 896 0x8fc0, 0x9008, 897 0x9010, 0x9058, 898 0x9060, 0x9060, 899 0x9068, 0x9074, 900 0x90fc, 0x90fc, 901 0x9400, 0x9408, 902 0x9410, 0x9458, 903 0x9600, 0x9600, 904 0x9608, 0x9638, 905 0x9640, 0x96bc, 906 0x9800, 0x9808, 907 0x9820, 0x983c, 908 0x9850, 0x9864, 909 0x9c00, 0x9c6c, 910 0x9c80, 0x9cec, 911 0x9d00, 0x9d6c, 912 0x9d80, 0x9dec, 913 0x9e00, 0x9e6c, 914 0x9e80, 0x9eec, 915 0x9f00, 0x9f6c, 916 0x9f80, 0x9fec, 917 0xd004, 0xd004, 918 0xd010, 0xd03c, 919 0xdfc0, 0xdfe0, 920 0xe000, 0xea7c, 921 0xf000, 0x11110, 922 0x11118, 0x11190, 923 0x19040, 0x1906c, 924 0x19078, 0x19080, 925 0x1908c, 0x190e4, 926 0x190f0, 0x190f8, 927 0x19100, 0x19110, 928 0x19120, 0x19124, 929 0x19150, 0x19194, 930 0x1919c, 0x191b0, 931 0x191d0, 0x191e8, 932 0x19238, 0x1924c, 933 0x193f8, 0x1943c, 934 0x1944c, 0x19474, 935 0x19490, 0x194e0, 936 0x194f0, 0x194f8, 937 0x19800, 0x19c08, 938 0x19c10, 0x19c90, 939 0x19ca0, 0x19ce4, 940 0x19cf0, 0x19d40, 941 0x19d50, 0x19d94, 942 0x19da0, 0x19de8, 943 0x19df0, 0x19e40, 944 0x19e50, 0x19e90, 945 0x19ea0, 0x19f4c, 946 0x1a000, 0x1a004, 947 0x1a010, 0x1a06c, 948 0x1a0b0, 0x1a0e4, 949 0x1a0ec, 0x1a0f4, 950 0x1a100, 0x1a108, 951 0x1a114, 0x1a120, 952 0x1a128, 0x1a130, 953 0x1a138, 0x1a138, 954 0x1a190, 0x1a1c4, 955 0x1a1fc, 0x1a1fc, 956 0x1e040, 0x1e04c, 957 0x1e284, 0x1e28c, 958 0x1e2c0, 0x1e2c0, 959 0x1e2e0, 0x1e2e0, 960 0x1e300, 0x1e384, 961 0x1e3c0, 0x1e3c8, 962 0x1e440, 0x1e44c, 963 0x1e684, 0x1e68c, 964 0x1e6c0, 0x1e6c0, 965 0x1e6e0, 0x1e6e0, 966 0x1e700, 0x1e784, 967 0x1e7c0, 0x1e7c8, 968 0x1e840, 0x1e84c, 969 0x1ea84, 0x1ea8c, 970 0x1eac0, 0x1eac0, 971 0x1eae0, 0x1eae0, 972 0x1eb00, 0x1eb84, 973 0x1ebc0, 0x1ebc8, 974 0x1ec40, 0x1ec4c, 975 0x1ee84, 0x1ee8c, 976 0x1eec0, 0x1eec0, 977 0x1eee0, 0x1eee0, 978 0x1ef00, 0x1ef84, 979 0x1efc0, 0x1efc8, 980 0x1f040, 0x1f04c, 981 0x1f284, 0x1f28c, 982 0x1f2c0, 0x1f2c0, 983 0x1f2e0, 0x1f2e0, 984 0x1f300, 0x1f384, 985 0x1f3c0, 0x1f3c8, 986 0x1f440, 0x1f44c, 987 0x1f684, 0x1f68c, 988 0x1f6c0, 0x1f6c0, 989 0x1f6e0, 0x1f6e0, 990 0x1f700, 0x1f784, 991 0x1f7c0, 0x1f7c8, 992 0x1f840, 0x1f84c, 993 0x1fa84, 0x1fa8c, 994 0x1fac0, 0x1fac0, 995 0x1fae0, 0x1fae0, 996 0x1fb00, 0x1fb84, 997 0x1fbc0, 0x1fbc8, 998 0x1fc40, 0x1fc4c, 999 0x1fe84, 0x1fe8c, 1000 0x1fec0, 0x1fec0, 1001 0x1fee0, 0x1fee0, 1002 0x1ff00, 0x1ff84, 1003 0x1ffc0, 0x1ffc8, 1004 0x20000, 0x2002c, 1005 0x20100, 0x2013c, 1006 0x20190, 0x201a0, 1007 0x201a8, 0x201b8, 1008 0x201c4, 0x201c8, 1009 0x20200, 0x20318, 1010 0x20400, 0x204b4, 1011 0x204c0, 0x20528, 1012 0x20540, 0x20614, 1013 0x21000, 0x21040, 1014 0x2104c, 0x21060, 1015 0x210c0, 0x210ec, 1016 0x21200, 0x21268, 1017 0x21270, 0x21284, 1018 0x212fc, 0x21388, 1019 0x21400, 0x21404, 1020 0x21500, 0x21500, 1021 0x21510, 0x21518, 1022 0x2152c, 0x21530, 1023 0x2153c, 0x2153c, 1024 0x21550, 0x21554, 1025 0x21600, 0x21600, 1026 0x21608, 0x2161c, 1027 0x21624, 0x21628, 1028 0x21630, 0x21634, 1029 0x2163c, 0x2163c, 1030 0x21700, 0x2171c, 1031 0x21780, 0x2178c, 1032 0x21800, 0x21818, 1033 0x21820, 0x21828, 1034 0x21830, 0x21848, 1035 0x21850, 0x21854, 1036 0x21860, 0x21868, 1037 0x21870, 0x21870, 1038 0x21878, 0x21898, 1039 0x218a0, 0x218a8, 1040 0x218b0, 0x218c8, 1041 0x218d0, 0x218d4, 1042 0x218e0, 0x218e8, 1043 0x218f0, 0x218f0, 1044 0x218f8, 0x21a18, 1045 0x21a20, 0x21a28, 1046 0x21a30, 0x21a48, 1047 0x21a50, 0x21a54, 1048 0x21a60, 0x21a68, 1049 0x21a70, 0x21a70, 1050 0x21a78, 0x21a98, 1051 0x21aa0, 0x21aa8, 1052 0x21ab0, 0x21ac8, 1053 0x21ad0, 0x21ad4, 1054 0x21ae0, 0x21ae8, 1055 0x21af0, 0x21af0, 1056 0x21af8, 0x21c18, 1057 0x21c20, 0x21c20, 1058 0x21c28, 0x21c30, 1059 0x21c38, 0x21c38, 1060 0x21c80, 0x21c98, 1061 0x21ca0, 0x21ca8, 1062 0x21cb0, 0x21cc8, 1063 0x21cd0, 0x21cd4, 1064 0x21ce0, 0x21ce8, 1065 0x21cf0, 0x21cf0, 1066 0x21cf8, 0x21d7c, 1067 0x21e00, 0x21e04, 1068 0x22000, 0x2202c, 1069 0x22100, 0x2213c, 1070 0x22190, 0x221a0, 1071 0x221a8, 0x221b8, 1072 0x221c4, 0x221c8, 1073 0x22200, 0x22318, 1074 0x22400, 0x224b4, 1075 0x224c0, 0x22528, 1076 0x22540, 0x22614, 1077 0x23000, 0x23040, 1078 0x2304c, 0x23060, 1079 0x230c0, 0x230ec, 1080 0x23200, 0x23268, 1081 0x23270, 0x23284, 1082 0x232fc, 0x23388, 1083 0x23400, 0x23404, 1084 0x23500, 0x23500, 1085 0x23510, 0x23518, 1086 0x2352c, 0x23530, 1087 0x2353c, 0x2353c, 1088 0x23550, 0x23554, 1089 0x23600, 0x23600, 1090 0x23608, 0x2361c, 1091 0x23624, 0x23628, 1092 0x23630, 0x23634, 1093 0x2363c, 0x2363c, 1094 0x23700, 0x2371c, 1095 0x23780, 0x2378c, 1096 0x23800, 0x23818, 1097 0x23820, 0x23828, 1098 0x23830, 0x23848, 1099 0x23850, 0x23854, 1100 0x23860, 0x23868, 1101 0x23870, 0x23870, 1102 0x23878, 0x23898, 1103 0x238a0, 0x238a8, 1104 0x238b0, 0x238c8, 1105 0x238d0, 0x238d4, 1106 0x238e0, 0x238e8, 1107 0x238f0, 0x238f0, 1108 0x238f8, 0x23a18, 1109 0x23a20, 0x23a28, 1110 0x23a30, 0x23a48, 1111 0x23a50, 0x23a54, 1112 0x23a60, 0x23a68, 1113 0x23a70, 0x23a70, 1114 0x23a78, 0x23a98, 1115 0x23aa0, 0x23aa8, 1116 0x23ab0, 0x23ac8, 1117 0x23ad0, 0x23ad4, 1118 0x23ae0, 0x23ae8, 1119 0x23af0, 0x23af0, 1120 0x23af8, 0x23c18, 1121 0x23c20, 0x23c20, 1122 0x23c28, 0x23c30, 1123 0x23c38, 0x23c38, 1124 0x23c80, 0x23c98, 1125 0x23ca0, 0x23ca8, 1126 0x23cb0, 0x23cc8, 1127 0x23cd0, 0x23cd4, 1128 0x23ce0, 0x23ce8, 1129 0x23cf0, 0x23cf0, 1130 0x23cf8, 0x23d7c, 1131 0x23e00, 0x23e04, 1132 0x24000, 0x2402c, 1133 0x24100, 0x2413c, 1134 0x24190, 0x241a0, 1135 0x241a8, 0x241b8, 1136 0x241c4, 0x241c8, 1137 0x24200, 0x24318, 1138 0x24400, 0x244b4, 1139 0x244c0, 0x24528, 1140 0x24540, 0x24614, 1141 0x25000, 0x25040, 1142 0x2504c, 0x25060, 1143 0x250c0, 0x250ec, 1144 0x25200, 0x25268, 1145 0x25270, 0x25284, 1146 0x252fc, 0x25388, 1147 0x25400, 0x25404, 1148 0x25500, 0x25500, 1149 0x25510, 0x25518, 1150 0x2552c, 0x25530, 1151 0x2553c, 0x2553c, 1152 0x25550, 0x25554, 1153 0x25600, 0x25600, 1154 0x25608, 0x2561c, 1155 0x25624, 0x25628, 1156 0x25630, 0x25634, 1157 0x2563c, 0x2563c, 1158 0x25700, 0x2571c, 1159 0x25780, 0x2578c, 1160 0x25800, 0x25818, 1161 0x25820, 0x25828, 1162 0x25830, 0x25848, 1163 0x25850, 0x25854, 1164 0x25860, 0x25868, 1165 0x25870, 0x25870, 1166 0x25878, 0x25898, 1167 0x258a0, 0x258a8, 1168 0x258b0, 0x258c8, 1169 0x258d0, 0x258d4, 1170 0x258e0, 0x258e8, 1171 0x258f0, 0x258f0, 1172 0x258f8, 0x25a18, 1173 0x25a20, 0x25a28, 1174 0x25a30, 0x25a48, 1175 0x25a50, 0x25a54, 1176 0x25a60, 0x25a68, 1177 0x25a70, 0x25a70, 1178 0x25a78, 0x25a98, 1179 0x25aa0, 0x25aa8, 1180 0x25ab0, 0x25ac8, 1181 0x25ad0, 0x25ad4, 1182 0x25ae0, 0x25ae8, 1183 0x25af0, 0x25af0, 1184 0x25af8, 0x25c18, 1185 0x25c20, 0x25c20, 1186 0x25c28, 0x25c30, 1187 0x25c38, 0x25c38, 1188 0x25c80, 0x25c98, 1189 0x25ca0, 0x25ca8, 1190 0x25cb0, 0x25cc8, 1191 0x25cd0, 0x25cd4, 1192 0x25ce0, 0x25ce8, 1193 0x25cf0, 0x25cf0, 1194 0x25cf8, 0x25d7c, 1195 0x25e00, 0x25e04, 1196 0x26000, 0x2602c, 1197 0x26100, 0x2613c, 1198 0x26190, 0x261a0, 1199 0x261a8, 0x261b8, 1200 0x261c4, 0x261c8, 1201 0x26200, 0x26318, 1202 0x26400, 0x264b4, 1203 0x264c0, 0x26528, 1204 0x26540, 0x26614, 1205 0x27000, 0x27040, 1206 0x2704c, 0x27060, 1207 0x270c0, 0x270ec, 1208 0x27200, 0x27268, 1209 0x27270, 0x27284, 1210 0x272fc, 0x27388, 1211 0x27400, 0x27404, 1212 0x27500, 0x27500, 1213 0x27510, 0x27518, 1214 0x2752c, 0x27530, 1215 0x2753c, 0x2753c, 1216 0x27550, 0x27554, 1217 0x27600, 0x27600, 1218 0x27608, 0x2761c, 1219 0x27624, 0x27628, 1220 0x27630, 0x27634, 1221 0x2763c, 0x2763c, 1222 0x27700, 0x2771c, 1223 0x27780, 0x2778c, 1224 0x27800, 0x27818, 1225 0x27820, 0x27828, 1226 0x27830, 0x27848, 1227 0x27850, 0x27854, 1228 0x27860, 0x27868, 1229 0x27870, 0x27870, 1230 0x27878, 0x27898, 1231 0x278a0, 0x278a8, 1232 0x278b0, 0x278c8, 1233 0x278d0, 0x278d4, 1234 0x278e0, 0x278e8, 1235 0x278f0, 0x278f0, 1236 0x278f8, 0x27a18, 1237 0x27a20, 0x27a28, 1238 0x27a30, 0x27a48, 1239 0x27a50, 0x27a54, 1240 0x27a60, 0x27a68, 1241 0x27a70, 0x27a70, 1242 0x27a78, 0x27a98, 1243 0x27aa0, 0x27aa8, 1244 0x27ab0, 0x27ac8, 1245 0x27ad0, 0x27ad4, 1246 0x27ae0, 0x27ae8, 1247 0x27af0, 0x27af0, 1248 0x27af8, 0x27c18, 1249 0x27c20, 0x27c20, 1250 0x27c28, 0x27c30, 1251 0x27c38, 0x27c38, 1252 0x27c80, 0x27c98, 1253 0x27ca0, 0x27ca8, 1254 0x27cb0, 0x27cc8, 1255 0x27cd0, 0x27cd4, 1256 0x27ce0, 0x27ce8, 1257 0x27cf0, 0x27cf0, 1258 0x27cf8, 0x27d7c, 1259 0x27e00, 0x27e04, 1260 }; 1261 1262 static const unsigned int t5_reg_ranges[] = { 1263 0x1008, 0x10c0, 1264 0x10cc, 0x10f8, 1265 0x1100, 0x1100, 1266 0x110c, 0x1148, 1267 0x1180, 0x1184, 1268 0x1190, 0x1194, 1269 0x11a0, 0x11a4, 1270 0x11b0, 0x11b4, 1271 0x11fc, 0x123c, 1272 0x1280, 0x173c, 1273 0x1800, 0x18fc, 1274 0x3000, 0x3028, 1275 0x3060, 0x30b0, 1276 0x30b8, 0x30d8, 1277 0x30e0, 0x30fc, 1278 0x3140, 0x357c, 1279 0x35a8, 0x35cc, 1280 0x35ec, 0x35ec, 1281 0x3600, 0x5624, 1282 0x56cc, 0x56ec, 1283 0x56f4, 0x5720, 1284 0x5728, 0x575c, 1285 0x580c, 0x5814, 1286 0x5890, 0x589c, 1287 0x58a4, 0x58ac, 1288 0x58b8, 0x58bc, 1289 0x5940, 0x59c8, 1290 0x59d0, 0x59dc, 1291 0x59fc, 0x5a18, 1292 0x5a60, 0x5a70, 1293 0x5a80, 0x5a9c, 1294 0x5b94, 0x5bfc, 1295 0x6000, 0x6020, 1296 0x6028, 0x6040, 1297 0x6058, 0x609c, 1298 0x60a8, 0x614c, 1299 0x7700, 0x7798, 1300 0x77c0, 0x78fc, 1301 0x7b00, 0x7b58, 1302 0x7b60, 0x7b84, 1303 0x7b8c, 0x7c54, 1304 0x7d00, 0x7d38, 1305 0x7d40, 0x7d80, 1306 0x7d8c, 0x7ddc, 1307 0x7de4, 0x7e04, 1308 0x7e10, 0x7e1c, 1309 0x7e24, 0x7e38, 1310 0x7e40, 0x7e44, 1311 0x7e4c, 0x7e78, 1312 0x7e80, 0x7edc, 1313 0x7ee8, 0x7efc, 1314 0x8dc0, 0x8de0, 1315 0x8df8, 0x8e04, 1316 0x8e10, 0x8e84, 1317 0x8ea0, 0x8f84, 1318 0x8fc0, 0x9058, 1319 0x9060, 0x9060, 1320 0x9068, 0x90f8, 1321 0x9400, 0x9408, 1322 0x9410, 0x9470, 1323 0x9600, 0x9600, 1324 0x9608, 0x9638, 1325 0x9640, 0x96f4, 1326 0x9800, 0x9808, 1327 0x9820, 0x983c, 1328 0x9850, 0x9864, 1329 0x9c00, 0x9c6c, 1330 0x9c80, 0x9cec, 1331 0x9d00, 0x9d6c, 1332 0x9d80, 0x9dec, 1333 0x9e00, 0x9e6c, 1334 0x9e80, 0x9eec, 1335 0x9f00, 0x9f6c, 1336 0x9f80, 0xa020, 1337 0xd004, 0xd004, 1338 0xd010, 0xd03c, 1339 0xdfc0, 0xdfe0, 1340 0xe000, 0x1106c, 1341 0x11074, 0x11088, 1342 0x1109c, 0x1117c, 1343 0x11190, 0x11204, 1344 0x19040, 0x1906c, 1345 0x19078, 0x19080, 1346 0x1908c, 0x190e8, 1347 0x190f0, 0x190f8, 1348 0x19100, 0x19110, 1349 0x19120, 0x19124, 1350 0x19150, 0x19194, 1351 0x1919c, 0x191b0, 1352 0x191d0, 0x191e8, 1353 0x19238, 0x19290, 1354 0x193f8, 0x19428, 1355 0x19430, 0x19444, 1356 0x1944c, 0x1946c, 1357 0x19474, 0x19474, 1358 0x19490, 0x194cc, 1359 0x194f0, 0x194f8, 1360 0x19c00, 0x19c08, 1361 0x19c10, 0x19c60, 1362 0x19c94, 0x19ce4, 1363 0x19cf0, 0x19d40, 1364 0x19d50, 0x19d94, 1365 0x19da0, 0x19de8, 1366 0x19df0, 0x19e10, 1367 0x19e50, 0x19e90, 1368 0x19ea0, 0x19f24, 1369 0x19f34, 0x19f34, 1370 0x19f40, 0x19f50, 1371 0x19f90, 0x19fb4, 1372 0x19fc4, 0x19fe4, 1373 0x1a000, 0x1a004, 1374 0x1a010, 0x1a06c, 1375 0x1a0b0, 0x1a0e4, 1376 0x1a0ec, 0x1a0f8, 1377 0x1a100, 0x1a108, 1378 0x1a114, 0x1a120, 1379 0x1a128, 0x1a130, 1380 0x1a138, 0x1a138, 1381 0x1a190, 0x1a1c4, 1382 0x1a1fc, 0x1a1fc, 1383 0x1e008, 0x1e00c, 1384 0x1e040, 0x1e044, 1385 0x1e04c, 0x1e04c, 1386 0x1e284, 0x1e290, 1387 0x1e2c0, 0x1e2c0, 1388 0x1e2e0, 0x1e2e0, 1389 0x1e300, 0x1e384, 1390 0x1e3c0, 0x1e3c8, 1391 0x1e408, 0x1e40c, 1392 0x1e440, 0x1e444, 1393 0x1e44c, 0x1e44c, 1394 0x1e684, 0x1e690, 1395 0x1e6c0, 0x1e6c0, 1396 0x1e6e0, 0x1e6e0, 1397 0x1e700, 0x1e784, 1398 0x1e7c0, 0x1e7c8, 1399 0x1e808, 0x1e80c, 1400 0x1e840, 0x1e844, 1401 0x1e84c, 0x1e84c, 1402 0x1ea84, 0x1ea90, 1403 0x1eac0, 0x1eac0, 1404 0x1eae0, 0x1eae0, 1405 0x1eb00, 0x1eb84, 1406 0x1ebc0, 0x1ebc8, 1407 0x1ec08, 0x1ec0c, 1408 0x1ec40, 0x1ec44, 1409 0x1ec4c, 0x1ec4c, 1410 0x1ee84, 0x1ee90, 1411 0x1eec0, 0x1eec0, 1412 0x1eee0, 0x1eee0, 1413 0x1ef00, 0x1ef84, 1414 0x1efc0, 0x1efc8, 1415 0x1f008, 0x1f00c, 1416 0x1f040, 0x1f044, 1417 0x1f04c, 0x1f04c, 1418 0x1f284, 0x1f290, 1419 0x1f2c0, 0x1f2c0, 1420 0x1f2e0, 0x1f2e0, 1421 0x1f300, 0x1f384, 1422 0x1f3c0, 0x1f3c8, 1423 0x1f408, 0x1f40c, 1424 0x1f440, 0x1f444, 1425 0x1f44c, 0x1f44c, 1426 0x1f684, 0x1f690, 1427 0x1f6c0, 0x1f6c0, 1428 0x1f6e0, 0x1f6e0, 1429 0x1f700, 0x1f784, 1430 0x1f7c0, 0x1f7c8, 1431 0x1f808, 0x1f80c, 1432 0x1f840, 0x1f844, 1433 0x1f84c, 0x1f84c, 1434 0x1fa84, 0x1fa90, 1435 0x1fac0, 0x1fac0, 1436 0x1fae0, 0x1fae0, 1437 0x1fb00, 0x1fb84, 1438 0x1fbc0, 0x1fbc8, 1439 0x1fc08, 0x1fc0c, 1440 0x1fc40, 0x1fc44, 1441 0x1fc4c, 0x1fc4c, 1442 0x1fe84, 0x1fe90, 1443 0x1fec0, 0x1fec0, 1444 0x1fee0, 0x1fee0, 1445 0x1ff00, 0x1ff84, 1446 0x1ffc0, 0x1ffc8, 1447 0x30000, 0x30030, 1448 0x30100, 0x30144, 1449 0x30190, 0x301a0, 1450 0x301a8, 0x301b8, 1451 0x301c4, 0x301c8, 1452 0x301d0, 0x301d0, 1453 0x30200, 0x30318, 1454 0x30400, 0x304b4, 1455 0x304c0, 0x3052c, 1456 0x30540, 0x3061c, 1457 0x30800, 0x30828, 1458 0x30834, 0x30834, 1459 0x308c0, 0x30908, 1460 0x30910, 0x309ac, 1461 0x30a00, 0x30a14, 1462 0x30a1c, 0x30a2c, 1463 0x30a44, 0x30a50, 1464 0x30a74, 0x30a74, 1465 0x30a7c, 0x30afc, 1466 0x30b08, 0x30c24, 1467 0x30d00, 0x30d00, 1468 0x30d08, 0x30d14, 1469 0x30d1c, 0x30d20, 1470 0x30d3c, 0x30d3c, 1471 0x30d48, 0x30d50, 1472 0x31200, 0x3120c, 1473 0x31220, 0x31220, 1474 0x31240, 0x31240, 1475 0x31600, 0x3160c, 1476 0x31a00, 0x31a1c, 1477 0x31e00, 0x31e20, 1478 0x31e38, 0x31e3c, 1479 0x31e80, 0x31e80, 1480 0x31e88, 0x31ea8, 1481 0x31eb0, 0x31eb4, 1482 0x31ec8, 0x31ed4, 1483 0x31fb8, 0x32004, 1484 0x32200, 0x32200, 1485 0x32208, 0x32240, 1486 0x32248, 0x32280, 1487 0x32288, 0x322c0, 1488 0x322c8, 0x322fc, 1489 0x32600, 0x32630, 1490 0x32a00, 0x32abc, 1491 0x32b00, 0x32b10, 1492 0x32b20, 0x32b30, 1493 0x32b40, 0x32b50, 1494 0x32b60, 0x32b70, 1495 0x33000, 0x33028, 1496 0x33030, 0x33048, 1497 0x33060, 0x33068, 1498 0x33070, 0x3309c, 1499 0x330f0, 0x33128, 1500 0x33130, 0x33148, 1501 0x33160, 0x33168, 1502 0x33170, 0x3319c, 1503 0x331f0, 0x33238, 1504 0x33240, 0x33240, 1505 0x33248, 0x33250, 1506 0x3325c, 0x33264, 1507 0x33270, 0x332b8, 1508 0x332c0, 0x332e4, 1509 0x332f8, 0x33338, 1510 0x33340, 0x33340, 1511 0x33348, 0x33350, 1512 0x3335c, 0x33364, 1513 0x33370, 0x333b8, 1514 0x333c0, 0x333e4, 1515 0x333f8, 0x33428, 1516 0x33430, 0x33448, 1517 0x33460, 0x33468, 1518 0x33470, 0x3349c, 1519 0x334f0, 0x33528, 1520 0x33530, 0x33548, 1521 0x33560, 0x33568, 1522 0x33570, 0x3359c, 1523 0x335f0, 0x33638, 1524 0x33640, 0x33640, 1525 0x33648, 0x33650, 1526 0x3365c, 0x33664, 1527 0x33670, 0x336b8, 1528 0x336c0, 0x336e4, 1529 0x336f8, 0x33738, 1530 0x33740, 0x33740, 1531 0x33748, 0x33750, 1532 0x3375c, 0x33764, 1533 0x33770, 0x337b8, 1534 0x337c0, 0x337e4, 1535 0x337f8, 0x337fc, 1536 0x33814, 0x33814, 1537 0x3382c, 0x3382c, 1538 0x33880, 0x3388c, 1539 0x338e8, 0x338ec, 1540 0x33900, 0x33928, 1541 0x33930, 0x33948, 1542 0x33960, 0x33968, 1543 0x33970, 0x3399c, 1544 0x339f0, 0x33a38, 1545 0x33a40, 0x33a40, 1546 0x33a48, 0x33a50, 1547 0x33a5c, 0x33a64, 1548 0x33a70, 0x33ab8, 1549 0x33ac0, 0x33ae4, 1550 0x33af8, 0x33b10, 1551 0x33b28, 0x33b28, 1552 0x33b3c, 0x33b50, 1553 0x33bf0, 0x33c10, 1554 0x33c28, 0x33c28, 1555 0x33c3c, 0x33c50, 1556 0x33cf0, 0x33cfc, 1557 0x34000, 0x34030, 1558 0x34100, 0x34144, 1559 0x34190, 0x341a0, 1560 0x341a8, 0x341b8, 1561 0x341c4, 0x341c8, 1562 0x341d0, 0x341d0, 1563 0x34200, 0x34318, 1564 0x34400, 0x344b4, 1565 0x344c0, 0x3452c, 1566 0x34540, 0x3461c, 1567 0x34800, 0x34828, 1568 0x34834, 0x34834, 1569 0x348c0, 0x34908, 1570 0x34910, 0x349ac, 1571 0x34a00, 0x34a14, 1572 0x34a1c, 0x34a2c, 1573 0x34a44, 0x34a50, 1574 0x34a74, 0x34a74, 1575 0x34a7c, 0x34afc, 1576 0x34b08, 0x34c24, 1577 0x34d00, 0x34d00, 1578 0x34d08, 0x34d14, 1579 0x34d1c, 0x34d20, 1580 0x34d3c, 0x34d3c, 1581 0x34d48, 0x34d50, 1582 0x35200, 0x3520c, 1583 0x35220, 0x35220, 1584 0x35240, 0x35240, 1585 0x35600, 0x3560c, 1586 0x35a00, 0x35a1c, 1587 0x35e00, 0x35e20, 1588 0x35e38, 0x35e3c, 1589 0x35e80, 0x35e80, 1590 0x35e88, 0x35ea8, 1591 0x35eb0, 0x35eb4, 1592 0x35ec8, 0x35ed4, 1593 0x35fb8, 0x36004, 1594 0x36200, 0x36200, 1595 0x36208, 0x36240, 1596 0x36248, 0x36280, 1597 0x36288, 0x362c0, 1598 0x362c8, 0x362fc, 1599 0x36600, 0x36630, 1600 0x36a00, 0x36abc, 1601 0x36b00, 0x36b10, 1602 0x36b20, 0x36b30, 1603 0x36b40, 0x36b50, 1604 0x36b60, 0x36b70, 1605 0x37000, 0x37028, 1606 0x37030, 0x37048, 1607 0x37060, 0x37068, 1608 0x37070, 0x3709c, 1609 0x370f0, 0x37128, 1610 0x37130, 0x37148, 1611 0x37160, 0x37168, 1612 0x37170, 0x3719c, 1613 0x371f0, 0x37238, 1614 0x37240, 0x37240, 1615 0x37248, 0x37250, 1616 0x3725c, 0x37264, 1617 0x37270, 0x372b8, 1618 0x372c0, 0x372e4, 1619 0x372f8, 0x37338, 1620 0x37340, 0x37340, 1621 0x37348, 0x37350, 1622 0x3735c, 0x37364, 1623 0x37370, 0x373b8, 1624 0x373c0, 0x373e4, 1625 0x373f8, 0x37428, 1626 0x37430, 0x37448, 1627 0x37460, 0x37468, 1628 0x37470, 0x3749c, 1629 0x374f0, 0x37528, 1630 0x37530, 0x37548, 1631 0x37560, 0x37568, 1632 0x37570, 0x3759c, 1633 0x375f0, 0x37638, 1634 0x37640, 0x37640, 1635 0x37648, 0x37650, 1636 0x3765c, 0x37664, 1637 0x37670, 0x376b8, 1638 0x376c0, 0x376e4, 1639 0x376f8, 0x37738, 1640 0x37740, 0x37740, 1641 0x37748, 0x37750, 1642 0x3775c, 0x37764, 1643 0x37770, 0x377b8, 1644 0x377c0, 0x377e4, 1645 0x377f8, 0x377fc, 1646 0x37814, 0x37814, 1647 0x3782c, 0x3782c, 1648 0x37880, 0x3788c, 1649 0x378e8, 0x378ec, 1650 0x37900, 0x37928, 1651 0x37930, 0x37948, 1652 0x37960, 0x37968, 1653 0x37970, 0x3799c, 1654 0x379f0, 0x37a38, 1655 0x37a40, 0x37a40, 1656 0x37a48, 0x37a50, 1657 0x37a5c, 0x37a64, 1658 0x37a70, 0x37ab8, 1659 0x37ac0, 0x37ae4, 1660 0x37af8, 0x37b10, 1661 0x37b28, 0x37b28, 1662 0x37b3c, 0x37b50, 1663 0x37bf0, 0x37c10, 1664 0x37c28, 0x37c28, 1665 0x37c3c, 0x37c50, 1666 0x37cf0, 0x37cfc, 1667 0x38000, 0x38030, 1668 0x38100, 0x38144, 1669 0x38190, 0x381a0, 1670 0x381a8, 0x381b8, 1671 0x381c4, 0x381c8, 1672 0x381d0, 0x381d0, 1673 0x38200, 0x38318, 1674 0x38400, 0x384b4, 1675 0x384c0, 0x3852c, 1676 0x38540, 0x3861c, 1677 0x38800, 0x38828, 1678 0x38834, 0x38834, 1679 0x388c0, 0x38908, 1680 0x38910, 0x389ac, 1681 0x38a00, 0x38a14, 1682 0x38a1c, 0x38a2c, 1683 0x38a44, 0x38a50, 1684 0x38a74, 0x38a74, 1685 0x38a7c, 0x38afc, 1686 0x38b08, 0x38c24, 1687 0x38d00, 0x38d00, 1688 0x38d08, 0x38d14, 1689 0x38d1c, 0x38d20, 1690 0x38d3c, 0x38d3c, 1691 0x38d48, 0x38d50, 1692 0x39200, 0x3920c, 1693 0x39220, 0x39220, 1694 0x39240, 0x39240, 1695 0x39600, 0x3960c, 1696 0x39a00, 0x39a1c, 1697 0x39e00, 0x39e20, 1698 0x39e38, 0x39e3c, 1699 0x39e80, 0x39e80, 1700 0x39e88, 0x39ea8, 1701 0x39eb0, 0x39eb4, 1702 0x39ec8, 0x39ed4, 1703 0x39fb8, 0x3a004, 1704 0x3a200, 0x3a200, 1705 0x3a208, 0x3a240, 1706 0x3a248, 0x3a280, 1707 0x3a288, 0x3a2c0, 1708 0x3a2c8, 0x3a2fc, 1709 0x3a600, 0x3a630, 1710 0x3aa00, 0x3aabc, 1711 0x3ab00, 0x3ab10, 1712 0x3ab20, 0x3ab30, 1713 0x3ab40, 0x3ab50, 1714 0x3ab60, 0x3ab70, 1715 0x3b000, 0x3b028, 1716 0x3b030, 0x3b048, 1717 0x3b060, 0x3b068, 1718 0x3b070, 0x3b09c, 1719 0x3b0f0, 0x3b128, 1720 0x3b130, 0x3b148, 1721 0x3b160, 0x3b168, 1722 0x3b170, 0x3b19c, 1723 0x3b1f0, 0x3b238, 1724 0x3b240, 0x3b240, 1725 0x3b248, 0x3b250, 1726 0x3b25c, 0x3b264, 1727 0x3b270, 0x3b2b8, 1728 0x3b2c0, 0x3b2e4, 1729 0x3b2f8, 0x3b338, 1730 0x3b340, 0x3b340, 1731 0x3b348, 0x3b350, 1732 0x3b35c, 0x3b364, 1733 0x3b370, 0x3b3b8, 1734 0x3b3c0, 0x3b3e4, 1735 0x3b3f8, 0x3b428, 1736 0x3b430, 0x3b448, 1737 0x3b460, 0x3b468, 1738 0x3b470, 0x3b49c, 1739 0x3b4f0, 0x3b528, 1740 0x3b530, 0x3b548, 1741 0x3b560, 0x3b568, 1742 0x3b570, 0x3b59c, 1743 0x3b5f0, 0x3b638, 1744 0x3b640, 0x3b640, 1745 0x3b648, 0x3b650, 1746 0x3b65c, 0x3b664, 1747 0x3b670, 0x3b6b8, 1748 0x3b6c0, 0x3b6e4, 1749 0x3b6f8, 0x3b738, 1750 0x3b740, 0x3b740, 1751 0x3b748, 0x3b750, 1752 0x3b75c, 0x3b764, 1753 0x3b770, 0x3b7b8, 1754 0x3b7c0, 0x3b7e4, 1755 0x3b7f8, 0x3b7fc, 1756 0x3b814, 0x3b814, 1757 0x3b82c, 0x3b82c, 1758 0x3b880, 0x3b88c, 1759 0x3b8e8, 0x3b8ec, 1760 0x3b900, 0x3b928, 1761 0x3b930, 0x3b948, 1762 0x3b960, 0x3b968, 1763 0x3b970, 0x3b99c, 1764 0x3b9f0, 0x3ba38, 1765 0x3ba40, 0x3ba40, 1766 0x3ba48, 0x3ba50, 1767 0x3ba5c, 0x3ba64, 1768 0x3ba70, 0x3bab8, 1769 0x3bac0, 0x3bae4, 1770 0x3baf8, 0x3bb10, 1771 0x3bb28, 0x3bb28, 1772 0x3bb3c, 0x3bb50, 1773 0x3bbf0, 0x3bc10, 1774 0x3bc28, 0x3bc28, 1775 0x3bc3c, 0x3bc50, 1776 0x3bcf0, 0x3bcfc, 1777 0x3c000, 0x3c030, 1778 0x3c100, 0x3c144, 1779 0x3c190, 0x3c1a0, 1780 0x3c1a8, 0x3c1b8, 1781 0x3c1c4, 0x3c1c8, 1782 0x3c1d0, 0x3c1d0, 1783 0x3c200, 0x3c318, 1784 0x3c400, 0x3c4b4, 1785 0x3c4c0, 0x3c52c, 1786 0x3c540, 0x3c61c, 1787 0x3c800, 0x3c828, 1788 0x3c834, 0x3c834, 1789 0x3c8c0, 0x3c908, 1790 0x3c910, 0x3c9ac, 1791 0x3ca00, 0x3ca14, 1792 0x3ca1c, 0x3ca2c, 1793 0x3ca44, 0x3ca50, 1794 0x3ca74, 0x3ca74, 1795 0x3ca7c, 0x3cafc, 1796 0x3cb08, 0x3cc24, 1797 0x3cd00, 0x3cd00, 1798 0x3cd08, 0x3cd14, 1799 0x3cd1c, 0x3cd20, 1800 0x3cd3c, 0x3cd3c, 1801 0x3cd48, 0x3cd50, 1802 0x3d200, 0x3d20c, 1803 0x3d220, 0x3d220, 1804 0x3d240, 0x3d240, 1805 0x3d600, 0x3d60c, 1806 0x3da00, 0x3da1c, 1807 0x3de00, 0x3de20, 1808 0x3de38, 0x3de3c, 1809 0x3de80, 0x3de80, 1810 0x3de88, 0x3dea8, 1811 0x3deb0, 0x3deb4, 1812 0x3dec8, 0x3ded4, 1813 0x3dfb8, 0x3e004, 1814 0x3e200, 0x3e200, 1815 0x3e208, 0x3e240, 1816 0x3e248, 0x3e280, 1817 0x3e288, 0x3e2c0, 1818 0x3e2c8, 0x3e2fc, 1819 0x3e600, 0x3e630, 1820 0x3ea00, 0x3eabc, 1821 0x3eb00, 0x3eb10, 1822 0x3eb20, 0x3eb30, 1823 0x3eb40, 0x3eb50, 1824 0x3eb60, 0x3eb70, 1825 0x3f000, 0x3f028, 1826 0x3f030, 0x3f048, 1827 0x3f060, 0x3f068, 1828 0x3f070, 0x3f09c, 1829 0x3f0f0, 0x3f128, 1830 0x3f130, 0x3f148, 1831 0x3f160, 0x3f168, 1832 0x3f170, 0x3f19c, 1833 0x3f1f0, 0x3f238, 1834 0x3f240, 0x3f240, 1835 0x3f248, 0x3f250, 1836 0x3f25c, 0x3f264, 1837 0x3f270, 0x3f2b8, 1838 0x3f2c0, 0x3f2e4, 1839 0x3f2f8, 0x3f338, 1840 0x3f340, 0x3f340, 1841 0x3f348, 0x3f350, 1842 0x3f35c, 0x3f364, 1843 0x3f370, 0x3f3b8, 1844 0x3f3c0, 0x3f3e4, 1845 0x3f3f8, 0x3f428, 1846 0x3f430, 0x3f448, 1847 0x3f460, 0x3f468, 1848 0x3f470, 0x3f49c, 1849 0x3f4f0, 0x3f528, 1850 0x3f530, 0x3f548, 1851 0x3f560, 0x3f568, 1852 0x3f570, 0x3f59c, 1853 0x3f5f0, 0x3f638, 1854 0x3f640, 0x3f640, 1855 0x3f648, 0x3f650, 1856 0x3f65c, 0x3f664, 1857 0x3f670, 0x3f6b8, 1858 0x3f6c0, 0x3f6e4, 1859 0x3f6f8, 0x3f738, 1860 0x3f740, 0x3f740, 1861 0x3f748, 0x3f750, 1862 0x3f75c, 0x3f764, 1863 0x3f770, 0x3f7b8, 1864 0x3f7c0, 0x3f7e4, 1865 0x3f7f8, 0x3f7fc, 1866 0x3f814, 0x3f814, 1867 0x3f82c, 0x3f82c, 1868 0x3f880, 0x3f88c, 1869 0x3f8e8, 0x3f8ec, 1870 0x3f900, 0x3f928, 1871 0x3f930, 0x3f948, 1872 0x3f960, 0x3f968, 1873 0x3f970, 0x3f99c, 1874 0x3f9f0, 0x3fa38, 1875 0x3fa40, 0x3fa40, 1876 0x3fa48, 0x3fa50, 1877 0x3fa5c, 0x3fa64, 1878 0x3fa70, 0x3fab8, 1879 0x3fac0, 0x3fae4, 1880 0x3faf8, 0x3fb10, 1881 0x3fb28, 0x3fb28, 1882 0x3fb3c, 0x3fb50, 1883 0x3fbf0, 0x3fc10, 1884 0x3fc28, 0x3fc28, 1885 0x3fc3c, 0x3fc50, 1886 0x3fcf0, 0x3fcfc, 1887 0x40000, 0x4000c, 1888 0x40040, 0x40050, 1889 0x40060, 0x40068, 1890 0x4007c, 0x4008c, 1891 0x40094, 0x400b0, 1892 0x400c0, 0x40144, 1893 0x40180, 0x4018c, 1894 0x40200, 0x40254, 1895 0x40260, 0x40264, 1896 0x40270, 0x40288, 1897 0x40290, 0x40298, 1898 0x402ac, 0x402c8, 1899 0x402d0, 0x402e0, 1900 0x402f0, 0x402f0, 1901 0x40300, 0x4033c, 1902 0x403f8, 0x403fc, 1903 0x41304, 0x413c4, 1904 0x41400, 0x4140c, 1905 0x41414, 0x4141c, 1906 0x41480, 0x414d0, 1907 0x44000, 0x44054, 1908 0x4405c, 0x44078, 1909 0x440c0, 0x44174, 1910 0x44180, 0x441ac, 1911 0x441b4, 0x441b8, 1912 0x441c0, 0x44254, 1913 0x4425c, 0x44278, 1914 0x442c0, 0x44374, 1915 0x44380, 0x443ac, 1916 0x443b4, 0x443b8, 1917 0x443c0, 0x44454, 1918 0x4445c, 0x44478, 1919 0x444c0, 0x44574, 1920 0x44580, 0x445ac, 1921 0x445b4, 0x445b8, 1922 0x445c0, 0x44654, 1923 0x4465c, 0x44678, 1924 0x446c0, 0x44774, 1925 0x44780, 0x447ac, 1926 0x447b4, 0x447b8, 1927 0x447c0, 0x44854, 1928 0x4485c, 0x44878, 1929 0x448c0, 0x44974, 1930 0x44980, 0x449ac, 1931 0x449b4, 0x449b8, 1932 0x449c0, 0x449fc, 1933 0x45000, 0x45004, 1934 0x45010, 0x45030, 1935 0x45040, 0x45060, 1936 0x45068, 0x45068, 1937 0x45080, 0x45084, 1938 0x450a0, 0x450b0, 1939 0x45200, 0x45204, 1940 0x45210, 0x45230, 1941 0x45240, 0x45260, 1942 0x45268, 0x45268, 1943 0x45280, 0x45284, 1944 0x452a0, 0x452b0, 1945 0x460c0, 0x460e4, 1946 0x47000, 0x4703c, 1947 0x47044, 0x4708c, 1948 0x47200, 0x47250, 1949 0x47400, 0x47408, 1950 0x47414, 0x47420, 1951 0x47600, 0x47618, 1952 0x47800, 0x47814, 1953 0x48000, 0x4800c, 1954 0x48040, 0x48050, 1955 0x48060, 0x48068, 1956 0x4807c, 0x4808c, 1957 0x48094, 0x480b0, 1958 0x480c0, 0x48144, 1959 0x48180, 0x4818c, 1960 0x48200, 0x48254, 1961 0x48260, 0x48264, 1962 0x48270, 0x48288, 1963 0x48290, 0x48298, 1964 0x482ac, 0x482c8, 1965 0x482d0, 0x482e0, 1966 0x482f0, 0x482f0, 1967 0x48300, 0x4833c, 1968 0x483f8, 0x483fc, 1969 0x49304, 0x493c4, 1970 0x49400, 0x4940c, 1971 0x49414, 0x4941c, 1972 0x49480, 0x494d0, 1973 0x4c000, 0x4c054, 1974 0x4c05c, 0x4c078, 1975 0x4c0c0, 0x4c174, 1976 0x4c180, 0x4c1ac, 1977 0x4c1b4, 0x4c1b8, 1978 0x4c1c0, 0x4c254, 1979 0x4c25c, 0x4c278, 1980 0x4c2c0, 0x4c374, 1981 0x4c380, 0x4c3ac, 1982 0x4c3b4, 0x4c3b8, 1983 0x4c3c0, 0x4c454, 1984 0x4c45c, 0x4c478, 1985 0x4c4c0, 0x4c574, 1986 0x4c580, 0x4c5ac, 1987 0x4c5b4, 0x4c5b8, 1988 0x4c5c0, 0x4c654, 1989 0x4c65c, 0x4c678, 1990 0x4c6c0, 0x4c774, 1991 0x4c780, 0x4c7ac, 1992 0x4c7b4, 0x4c7b8, 1993 0x4c7c0, 0x4c854, 1994 0x4c85c, 0x4c878, 1995 0x4c8c0, 0x4c974, 1996 0x4c980, 0x4c9ac, 1997 0x4c9b4, 0x4c9b8, 1998 0x4c9c0, 0x4c9fc, 1999 0x4d000, 0x4d004, 2000 0x4d010, 0x4d030, 2001 0x4d040, 0x4d060, 2002 0x4d068, 0x4d068, 2003 0x4d080, 0x4d084, 2004 0x4d0a0, 0x4d0b0, 2005 0x4d200, 0x4d204, 2006 0x4d210, 0x4d230, 2007 0x4d240, 0x4d260, 2008 0x4d268, 0x4d268, 2009 0x4d280, 0x4d284, 2010 0x4d2a0, 0x4d2b0, 2011 0x4e0c0, 0x4e0e4, 2012 0x4f000, 0x4f03c, 2013 0x4f044, 0x4f08c, 2014 0x4f200, 0x4f250, 2015 0x4f400, 0x4f408, 2016 0x4f414, 0x4f420, 2017 0x4f600, 0x4f618, 2018 0x4f800, 0x4f814, 2019 0x50000, 0x50084, 2020 0x50090, 0x500cc, 2021 0x50400, 0x50400, 2022 0x50800, 0x50884, 2023 0x50890, 0x508cc, 2024 0x50c00, 0x50c00, 2025 0x51000, 0x5101c, 2026 0x51300, 0x51308, 2027 }; 2028 2029 static const unsigned int t6_reg_ranges[] = { 2030 0x1008, 0x101c, 2031 0x1024, 0x10a8, 2032 0x10b4, 0x10f8, 2033 0x1100, 0x1114, 2034 0x111c, 0x112c, 2035 0x1138, 0x113c, 2036 0x1144, 0x114c, 2037 0x1180, 0x1184, 2038 0x1190, 0x1194, 2039 0x11a0, 0x11a4, 2040 0x11b0, 0x11b4, 2041 0x11fc, 0x1274, 2042 0x1280, 0x133c, 2043 0x1800, 0x18fc, 2044 0x3000, 0x302c, 2045 0x3060, 0x30b0, 2046 0x30b8, 0x30d8, 2047 0x30e0, 0x30fc, 2048 0x3140, 0x357c, 2049 0x35a8, 0x35cc, 2050 0x35ec, 0x35ec, 2051 0x3600, 0x5624, 2052 0x56cc, 0x56ec, 2053 0x56f4, 0x5720, 2054 0x5728, 0x575c, 2055 0x580c, 0x5814, 2056 0x5890, 0x589c, 2057 0x58a4, 0x58ac, 2058 0x58b8, 0x58bc, 2059 0x5940, 0x595c, 2060 0x5980, 0x598c, 2061 0x59b0, 0x59c8, 2062 0x59d0, 0x59dc, 2063 0x59fc, 0x5a18, 2064 0x5a60, 0x5a6c, 2065 0x5a80, 0x5a8c, 2066 0x5a94, 0x5a9c, 2067 0x5b94, 0x5bfc, 2068 0x5c10, 0x5e48, 2069 0x5e50, 0x5e94, 2070 0x5ea0, 0x5eb0, 2071 0x5ec0, 0x5ec0, 2072 0x5ec8, 0x5ed0, 2073 0x5ee0, 0x5ee0, 2074 0x5ef0, 0x5ef0, 2075 0x5f00, 0x5f00, 2076 0x6000, 0x6020, 2077 0x6028, 0x6040, 2078 0x6058, 0x609c, 2079 0x60a8, 0x619c, 2080 0x7700, 0x7798, 2081 0x77c0, 0x7880, 2082 0x78cc, 0x78fc, 2083 0x7b00, 0x7b58, 2084 0x7b60, 0x7b84, 2085 0x7b8c, 0x7c54, 2086 0x7d00, 0x7d38, 2087 0x7d40, 0x7d84, 2088 0x7d8c, 0x7ddc, 2089 0x7de4, 0x7e04, 2090 0x7e10, 0x7e1c, 2091 0x7e24, 0x7e38, 2092 0x7e40, 0x7e44, 2093 0x7e4c, 0x7e78, 2094 0x7e80, 0x7edc, 2095 0x7ee8, 0x7efc, 2096 0x8dc0, 0x8de4, 2097 0x8df8, 0x8e04, 2098 0x8e10, 0x8e84, 2099 0x8ea0, 0x8f88, 2100 0x8fb8, 0x9058, 2101 0x9060, 0x9060, 2102 0x9068, 0x90f8, 2103 0x9100, 0x9124, 2104 0x9400, 0x9470, 2105 0x9600, 0x9600, 2106 0x9608, 0x9638, 2107 0x9640, 0x9704, 2108 0x9710, 0x971c, 2109 0x9800, 0x9808, 2110 0x9820, 0x983c, 2111 0x9850, 0x9864, 2112 0x9c00, 0x9c6c, 2113 0x9c80, 0x9cec, 2114 0x9d00, 0x9d6c, 2115 0x9d80, 0x9dec, 2116 0x9e00, 0x9e6c, 2117 0x9e80, 0x9eec, 2118 0x9f00, 0x9f6c, 2119 0x9f80, 0xa020, 2120 0xd004, 0xd03c, 2121 0xd100, 0xd118, 2122 0xd200, 0xd214, 2123 0xd220, 0xd234, 2124 0xd240, 0xd254, 2125 0xd260, 0xd274, 2126 0xd280, 0xd294, 2127 0xd2a0, 0xd2b4, 2128 0xd2c0, 0xd2d4, 2129 0xd2e0, 0xd2f4, 2130 0xd300, 0xd31c, 2131 0xdfc0, 0xdfe0, 2132 0xe000, 0xf008, 2133 0xf010, 0xf018, 2134 0xf020, 0xf028, 2135 0x11000, 0x11014, 2136 0x11048, 0x1106c, 2137 0x11074, 0x11088, 2138 0x11098, 0x11120, 2139 0x1112c, 0x1117c, 2140 0x11190, 0x112e0, 2141 0x11300, 0x1130c, 2142 0x12000, 0x1206c, 2143 0x19040, 0x1906c, 2144 0x19078, 0x19080, 2145 0x1908c, 0x190e8, 2146 0x190f0, 0x190f8, 2147 0x19100, 0x19110, 2148 0x19120, 0x19124, 2149 0x19150, 0x19194, 2150 0x1919c, 0x191b0, 2151 0x191d0, 0x191e8, 2152 0x19238, 0x19290, 2153 0x192a4, 0x192b0, 2154 0x192bc, 0x192bc, 2155 0x19348, 0x1934c, 2156 0x193f8, 0x19418, 2157 0x19420, 0x19428, 2158 0x19430, 0x19444, 2159 0x1944c, 0x1946c, 2160 0x19474, 0x19474, 2161 0x19490, 0x194cc, 2162 0x194f0, 0x194f8, 2163 0x19c00, 0x19c48, 2164 0x19c50, 0x19c80, 2165 0x19c94, 0x19c98, 2166 0x19ca0, 0x19cbc, 2167 0x19ce4, 0x19ce4, 2168 0x19cf0, 0x19cf8, 2169 0x19d00, 0x19d28, 2170 0x19d50, 0x19d78, 2171 0x19d94, 0x19d98, 2172 0x19da0, 0x19dc8, 2173 0x19df0, 0x19e10, 2174 0x19e50, 0x19e6c, 2175 0x19ea0, 0x19ebc, 2176 0x19ec4, 0x19ef4, 2177 0x19f04, 0x19f2c, 2178 0x19f34, 0x19f34, 2179 0x19f40, 0x19f50, 2180 0x19f90, 0x19fac, 2181 0x19fc4, 0x19fc8, 2182 0x19fd0, 0x19fe4, 2183 0x1a000, 0x1a004, 2184 0x1a010, 0x1a06c, 2185 0x1a0b0, 0x1a0e4, 2186 0x1a0ec, 0x1a0f8, 2187 0x1a100, 0x1a108, 2188 0x1a114, 0x1a120, 2189 0x1a128, 0x1a130, 2190 0x1a138, 0x1a138, 2191 0x1a190, 0x1a1c4, 2192 0x1a1fc, 0x1a1fc, 2193 0x1e008, 0x1e00c, 2194 0x1e040, 0x1e044, 2195 0x1e04c, 0x1e04c, 2196 0x1e284, 0x1e290, 2197 0x1e2c0, 0x1e2c0, 2198 0x1e2e0, 0x1e2e0, 2199 0x1e300, 0x1e384, 2200 0x1e3c0, 0x1e3c8, 2201 0x1e408, 0x1e40c, 2202 0x1e440, 0x1e444, 2203 0x1e44c, 0x1e44c, 2204 0x1e684, 0x1e690, 2205 0x1e6c0, 0x1e6c0, 2206 0x1e6e0, 0x1e6e0, 2207 0x1e700, 0x1e784, 2208 0x1e7c0, 0x1e7c8, 2209 0x1e808, 0x1e80c, 2210 0x1e840, 0x1e844, 2211 0x1e84c, 0x1e84c, 2212 0x1ea84, 0x1ea90, 2213 0x1eac0, 0x1eac0, 2214 0x1eae0, 0x1eae0, 2215 0x1eb00, 0x1eb84, 2216 0x1ebc0, 0x1ebc8, 2217 0x1ec08, 0x1ec0c, 2218 0x1ec40, 0x1ec44, 2219 0x1ec4c, 0x1ec4c, 2220 0x1ee84, 0x1ee90, 2221 0x1eec0, 0x1eec0, 2222 0x1eee0, 0x1eee0, 2223 0x1ef00, 0x1ef84, 2224 0x1efc0, 0x1efc8, 2225 0x1f008, 0x1f00c, 2226 0x1f040, 0x1f044, 2227 0x1f04c, 0x1f04c, 2228 0x1f284, 0x1f290, 2229 0x1f2c0, 0x1f2c0, 2230 0x1f2e0, 0x1f2e0, 2231 0x1f300, 0x1f384, 2232 0x1f3c0, 0x1f3c8, 2233 0x1f408, 0x1f40c, 2234 0x1f440, 0x1f444, 2235 0x1f44c, 0x1f44c, 2236 0x1f684, 0x1f690, 2237 0x1f6c0, 0x1f6c0, 2238 0x1f6e0, 0x1f6e0, 2239 0x1f700, 0x1f784, 2240 0x1f7c0, 0x1f7c8, 2241 0x1f808, 0x1f80c, 2242 0x1f840, 0x1f844, 2243 0x1f84c, 0x1f84c, 2244 0x1fa84, 0x1fa90, 2245 0x1fac0, 0x1fac0, 2246 0x1fae0, 0x1fae0, 2247 0x1fb00, 0x1fb84, 2248 0x1fbc0, 0x1fbc8, 2249 0x1fc08, 0x1fc0c, 2250 0x1fc40, 0x1fc44, 2251 0x1fc4c, 0x1fc4c, 2252 0x1fe84, 0x1fe90, 2253 0x1fec0, 0x1fec0, 2254 0x1fee0, 0x1fee0, 2255 0x1ff00, 0x1ff84, 2256 0x1ffc0, 0x1ffc8, 2257 0x30000, 0x30030, 2258 0x30100, 0x30168, 2259 0x30190, 0x301a0, 2260 0x301a8, 0x301b8, 2261 0x301c4, 0x301c8, 2262 0x301d0, 0x301d0, 2263 0x30200, 0x30320, 2264 0x30400, 0x304b4, 2265 0x304c0, 0x3052c, 2266 0x30540, 0x3061c, 2267 0x30800, 0x308a0, 2268 0x308c0, 0x30908, 2269 0x30910, 0x309b8, 2270 0x30a00, 0x30a04, 2271 0x30a0c, 0x30a14, 2272 0x30a1c, 0x30a2c, 2273 0x30a44, 0x30a50, 2274 0x30a74, 0x30a74, 2275 0x30a7c, 0x30afc, 2276 0x30b08, 0x30c24, 2277 0x30d00, 0x30d14, 2278 0x30d1c, 0x30d3c, 2279 0x30d44, 0x30d4c, 2280 0x30d54, 0x30d74, 2281 0x30d7c, 0x30d7c, 2282 0x30de0, 0x30de0, 2283 0x30e00, 0x30ed4, 2284 0x30f00, 0x30fa4, 2285 0x30fc0, 0x30fc4, 2286 0x31000, 0x31004, 2287 0x31080, 0x310fc, 2288 0x31208, 0x31220, 2289 0x3123c, 0x31254, 2290 0x31300, 0x31300, 2291 0x31308, 0x3131c, 2292 0x31338, 0x3133c, 2293 0x31380, 0x31380, 2294 0x31388, 0x313a8, 2295 0x313b4, 0x313b4, 2296 0x31400, 0x31420, 2297 0x31438, 0x3143c, 2298 0x31480, 0x31480, 2299 0x314a8, 0x314a8, 2300 0x314b0, 0x314b4, 2301 0x314c8, 0x314d4, 2302 0x31a40, 0x31a4c, 2303 0x31af0, 0x31b20, 2304 0x31b38, 0x31b3c, 2305 0x31b80, 0x31b80, 2306 0x31ba8, 0x31ba8, 2307 0x31bb0, 0x31bb4, 2308 0x31bc8, 0x31bd4, 2309 0x32140, 0x3218c, 2310 0x321f0, 0x321f4, 2311 0x32200, 0x32200, 2312 0x32218, 0x32218, 2313 0x32400, 0x32400, 2314 0x32408, 0x3241c, 2315 0x32618, 0x32620, 2316 0x32664, 0x32664, 2317 0x326a8, 0x326a8, 2318 0x326ec, 0x326ec, 2319 0x32a00, 0x32abc, 2320 0x32b00, 0x32b18, 2321 0x32b20, 0x32b38, 2322 0x32b40, 0x32b58, 2323 0x32b60, 0x32b78, 2324 0x32c00, 0x32c00, 2325 0x32c08, 0x32c3c, 2326 0x33000, 0x3302c, 2327 0x33034, 0x33050, 2328 0x33058, 0x33058, 2329 0x33060, 0x3308c, 2330 0x3309c, 0x330ac, 2331 0x330c0, 0x330c0, 2332 0x330c8, 0x330d0, 2333 0x330d8, 0x330e0, 2334 0x330ec, 0x3312c, 2335 0x33134, 0x33150, 2336 0x33158, 0x33158, 2337 0x33160, 0x3318c, 2338 0x3319c, 0x331ac, 2339 0x331c0, 0x331c0, 2340 0x331c8, 0x331d0, 2341 0x331d8, 0x331e0, 2342 0x331ec, 0x33290, 2343 0x33298, 0x332c4, 2344 0x332e4, 0x33390, 2345 0x33398, 0x333c4, 2346 0x333e4, 0x3342c, 2347 0x33434, 0x33450, 2348 0x33458, 0x33458, 2349 0x33460, 0x3348c, 2350 0x3349c, 0x334ac, 2351 0x334c0, 0x334c0, 2352 0x334c8, 0x334d0, 2353 0x334d8, 0x334e0, 2354 0x334ec, 0x3352c, 2355 0x33534, 0x33550, 2356 0x33558, 0x33558, 2357 0x33560, 0x3358c, 2358 0x3359c, 0x335ac, 2359 0x335c0, 0x335c0, 2360 0x335c8, 0x335d0, 2361 0x335d8, 0x335e0, 2362 0x335ec, 0x33690, 2363 0x33698, 0x336c4, 2364 0x336e4, 0x33790, 2365 0x33798, 0x337c4, 2366 0x337e4, 0x337fc, 2367 0x33814, 0x33814, 2368 0x33854, 0x33868, 2369 0x33880, 0x3388c, 2370 0x338c0, 0x338d0, 2371 0x338e8, 0x338ec, 2372 0x33900, 0x3392c, 2373 0x33934, 0x33950, 2374 0x33958, 0x33958, 2375 0x33960, 0x3398c, 2376 0x3399c, 0x339ac, 2377 0x339c0, 0x339c0, 2378 0x339c8, 0x339d0, 2379 0x339d8, 0x339e0, 2380 0x339ec, 0x33a90, 2381 0x33a98, 0x33ac4, 2382 0x33ae4, 0x33b10, 2383 0x33b24, 0x33b28, 2384 0x33b38, 0x33b50, 2385 0x33bf0, 0x33c10, 2386 0x33c24, 0x33c28, 2387 0x33c38, 0x33c50, 2388 0x33cf0, 0x33cfc, 2389 0x34000, 0x34030, 2390 0x34100, 0x34168, 2391 0x34190, 0x341a0, 2392 0x341a8, 0x341b8, 2393 0x341c4, 0x341c8, 2394 0x341d0, 0x341d0, 2395 0x34200, 0x34320, 2396 0x34400, 0x344b4, 2397 0x344c0, 0x3452c, 2398 0x34540, 0x3461c, 2399 0x34800, 0x348a0, 2400 0x348c0, 0x34908, 2401 0x34910, 0x349b8, 2402 0x34a00, 0x34a04, 2403 0x34a0c, 0x34a14, 2404 0x34a1c, 0x34a2c, 2405 0x34a44, 0x34a50, 2406 0x34a74, 0x34a74, 2407 0x34a7c, 0x34afc, 2408 0x34b08, 0x34c24, 2409 0x34d00, 0x34d14, 2410 0x34d1c, 0x34d3c, 2411 0x34d44, 0x34d4c, 2412 0x34d54, 0x34d74, 2413 0x34d7c, 0x34d7c, 2414 0x34de0, 0x34de0, 2415 0x34e00, 0x34ed4, 2416 0x34f00, 0x34fa4, 2417 0x34fc0, 0x34fc4, 2418 0x35000, 0x35004, 2419 0x35080, 0x350fc, 2420 0x35208, 0x35220, 2421 0x3523c, 0x35254, 2422 0x35300, 0x35300, 2423 0x35308, 0x3531c, 2424 0x35338, 0x3533c, 2425 0x35380, 0x35380, 2426 0x35388, 0x353a8, 2427 0x353b4, 0x353b4, 2428 0x35400, 0x35420, 2429 0x35438, 0x3543c, 2430 0x35480, 0x35480, 2431 0x354a8, 0x354a8, 2432 0x354b0, 0x354b4, 2433 0x354c8, 0x354d4, 2434 0x35a40, 0x35a4c, 2435 0x35af0, 0x35b20, 2436 0x35b38, 0x35b3c, 2437 0x35b80, 0x35b80, 2438 0x35ba8, 0x35ba8, 2439 0x35bb0, 0x35bb4, 2440 0x35bc8, 0x35bd4, 2441 0x36140, 0x3618c, 2442 0x361f0, 0x361f4, 2443 0x36200, 0x36200, 2444 0x36218, 0x36218, 2445 0x36400, 0x36400, 2446 0x36408, 0x3641c, 2447 0x36618, 0x36620, 2448 0x36664, 0x36664, 2449 0x366a8, 0x366a8, 2450 0x366ec, 0x366ec, 2451 0x36a00, 0x36abc, 2452 0x36b00, 0x36b18, 2453 0x36b20, 0x36b38, 2454 0x36b40, 0x36b58, 2455 0x36b60, 0x36b78, 2456 0x36c00, 0x36c00, 2457 0x36c08, 0x36c3c, 2458 0x37000, 0x3702c, 2459 0x37034, 0x37050, 2460 0x37058, 0x37058, 2461 0x37060, 0x3708c, 2462 0x3709c, 0x370ac, 2463 0x370c0, 0x370c0, 2464 0x370c8, 0x370d0, 2465 0x370d8, 0x370e0, 2466 0x370ec, 0x3712c, 2467 0x37134, 0x37150, 2468 0x37158, 0x37158, 2469 0x37160, 0x3718c, 2470 0x3719c, 0x371ac, 2471 0x371c0, 0x371c0, 2472 0x371c8, 0x371d0, 2473 0x371d8, 0x371e0, 2474 0x371ec, 0x37290, 2475 0x37298, 0x372c4, 2476 0x372e4, 0x37390, 2477 0x37398, 0x373c4, 2478 0x373e4, 0x3742c, 2479 0x37434, 0x37450, 2480 0x37458, 0x37458, 2481 0x37460, 0x3748c, 2482 0x3749c, 0x374ac, 2483 0x374c0, 0x374c0, 2484 0x374c8, 0x374d0, 2485 0x374d8, 0x374e0, 2486 0x374ec, 0x3752c, 2487 0x37534, 0x37550, 2488 0x37558, 0x37558, 2489 0x37560, 0x3758c, 2490 0x3759c, 0x375ac, 2491 0x375c0, 0x375c0, 2492 0x375c8, 0x375d0, 2493 0x375d8, 0x375e0, 2494 0x375ec, 0x37690, 2495 0x37698, 0x376c4, 2496 0x376e4, 0x37790, 2497 0x37798, 0x377c4, 2498 0x377e4, 0x377fc, 2499 0x37814, 0x37814, 2500 0x37854, 0x37868, 2501 0x37880, 0x3788c, 2502 0x378c0, 0x378d0, 2503 0x378e8, 0x378ec, 2504 0x37900, 0x3792c, 2505 0x37934, 0x37950, 2506 0x37958, 0x37958, 2507 0x37960, 0x3798c, 2508 0x3799c, 0x379ac, 2509 0x379c0, 0x379c0, 2510 0x379c8, 0x379d0, 2511 0x379d8, 0x379e0, 2512 0x379ec, 0x37a90, 2513 0x37a98, 0x37ac4, 2514 0x37ae4, 0x37b10, 2515 0x37b24, 0x37b28, 2516 0x37b38, 0x37b50, 2517 0x37bf0, 0x37c10, 2518 0x37c24, 0x37c28, 2519 0x37c38, 0x37c50, 2520 0x37cf0, 0x37cfc, 2521 0x40040, 0x40040, 2522 0x40080, 0x40084, 2523 0x40100, 0x40100, 2524 0x40140, 0x401bc, 2525 0x40200, 0x40214, 2526 0x40228, 0x40228, 2527 0x40240, 0x40258, 2528 0x40280, 0x40280, 2529 0x40304, 0x40304, 2530 0x40330, 0x4033c, 2531 0x41304, 0x413c8, 2532 0x413d0, 0x413dc, 2533 0x413f0, 0x413f0, 2534 0x41400, 0x4140c, 2535 0x41414, 0x4141c, 2536 0x41480, 0x414d0, 2537 0x44000, 0x4407c, 2538 0x440c0, 0x441ac, 2539 0x441b4, 0x4427c, 2540 0x442c0, 0x443ac, 2541 0x443b4, 0x4447c, 2542 0x444c0, 0x445ac, 2543 0x445b4, 0x4467c, 2544 0x446c0, 0x447ac, 2545 0x447b4, 0x4487c, 2546 0x448c0, 0x449ac, 2547 0x449b4, 0x44a7c, 2548 0x44ac0, 0x44bac, 2549 0x44bb4, 0x44c7c, 2550 0x44cc0, 0x44dac, 2551 0x44db4, 0x44e7c, 2552 0x44ec0, 0x44fac, 2553 0x44fb4, 0x4507c, 2554 0x450c0, 0x451ac, 2555 0x451b4, 0x451fc, 2556 0x45800, 0x45804, 2557 0x45810, 0x45830, 2558 0x45840, 0x45860, 2559 0x45868, 0x45868, 2560 0x45880, 0x45884, 2561 0x458a0, 0x458b0, 2562 0x45a00, 0x45a04, 2563 0x45a10, 0x45a30, 2564 0x45a40, 0x45a60, 2565 0x45a68, 0x45a68, 2566 0x45a80, 0x45a84, 2567 0x45aa0, 0x45ab0, 2568 0x460c0, 0x460e4, 2569 0x47000, 0x4703c, 2570 0x47044, 0x4708c, 2571 0x47200, 0x47250, 2572 0x47400, 0x47408, 2573 0x47414, 0x47420, 2574 0x47600, 0x47618, 2575 0x47800, 0x47814, 2576 0x47820, 0x4782c, 2577 0x50000, 0x50084, 2578 0x50090, 0x500cc, 2579 0x50300, 0x50384, 2580 0x50400, 0x50400, 2581 0x50800, 0x50884, 2582 0x50890, 0x508cc, 2583 0x50b00, 0x50b84, 2584 0x50c00, 0x50c00, 2585 0x51000, 0x51020, 2586 0x51028, 0x510b0, 2587 0x51300, 0x51324, 2588 }; 2589 2590 u32 *buf_end = (u32 *)((char *)buf + buf_size); 2591 const unsigned int *reg_ranges; 2592 int reg_ranges_size, range; 2593 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip); 2594 2595 /* Select the right set of register ranges to dump depending on the 2596 * adapter chip type. 2597 */ 2598 switch (chip_version) { 2599 case CHELSIO_T4: 2600 reg_ranges = t4_reg_ranges; 2601 reg_ranges_size = ARRAY_SIZE(t4_reg_ranges); 2602 break; 2603 2604 case CHELSIO_T5: 2605 reg_ranges = t5_reg_ranges; 2606 reg_ranges_size = ARRAY_SIZE(t5_reg_ranges); 2607 break; 2608 2609 case CHELSIO_T6: 2610 reg_ranges = t6_reg_ranges; 2611 reg_ranges_size = ARRAY_SIZE(t6_reg_ranges); 2612 break; 2613 2614 default: 2615 dev_err(adap->pdev_dev, 2616 "Unsupported chip version %d\n", chip_version); 2617 return; 2618 } 2619 2620 /* Clear the register buffer and insert the appropriate register 2621 * values selected by the above register ranges. 2622 */ 2623 memset(buf, 0, buf_size); 2624 for (range = 0; range < reg_ranges_size; range += 2) { 2625 unsigned int reg = reg_ranges[range]; 2626 unsigned int last_reg = reg_ranges[range + 1]; 2627 u32 *bufp = (u32 *)((char *)buf + reg); 2628 2629 /* Iterate across the register range filling in the register 2630 * buffer but don't write past the end of the register buffer. 2631 */ 2632 while (reg <= last_reg && bufp < buf_end) { 2633 *bufp++ = t4_read_reg(adap, reg); 2634 reg += sizeof(u32); 2635 } 2636 } 2637 } 2638 2639 #define EEPROM_STAT_ADDR 0x7bfc 2640 #define VPD_BASE 0x400 2641 #define VPD_BASE_OLD 0 2642 #define VPD_LEN 1024 2643 #define CHELSIO_VPD_UNIQUE_ID 0x82 2644 2645 /** 2646 * t4_eeprom_ptov - translate a physical EEPROM address to virtual 2647 * @phys_addr: the physical EEPROM address 2648 * @fn: the PCI function number 2649 * @sz: size of function-specific area 2650 * 2651 * Translate a physical EEPROM address to virtual. The first 1K is 2652 * accessed through virtual addresses starting at 31K, the rest is 2653 * accessed through virtual addresses starting at 0. 2654 * 2655 * The mapping is as follows: 2656 * [0..1K) -> [31K..32K) 2657 * [1K..1K+A) -> [31K-A..31K) 2658 * [1K+A..ES) -> [0..ES-A-1K) 2659 * 2660 * where A = @fn * @sz, and ES = EEPROM size. 2661 */ 2662 int t4_eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz) 2663 { 2664 fn *= sz; 2665 if (phys_addr < 1024) 2666 return phys_addr + (31 << 10); 2667 if (phys_addr < 1024 + fn) 2668 return 31744 - fn + phys_addr - 1024; 2669 if (phys_addr < EEPROMSIZE) 2670 return phys_addr - 1024 - fn; 2671 return -EINVAL; 2672 } 2673 2674 /** 2675 * t4_seeprom_wp - enable/disable EEPROM write protection 2676 * @adapter: the adapter 2677 * @enable: whether to enable or disable write protection 2678 * 2679 * Enables or disables write protection on the serial EEPROM. 2680 */ 2681 int t4_seeprom_wp(struct adapter *adapter, bool enable) 2682 { 2683 unsigned int v = enable ? 0xc : 0; 2684 int ret = pci_write_vpd(adapter->pdev, EEPROM_STAT_ADDR, 4, &v); 2685 return ret < 0 ? ret : 0; 2686 } 2687 2688 /** 2689 * t4_get_raw_vpd_params - read VPD parameters from VPD EEPROM 2690 * @adapter: adapter to read 2691 * @p: where to store the parameters 2692 * 2693 * Reads card parameters stored in VPD EEPROM. 2694 */ 2695 int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p) 2696 { 2697 int i, ret = 0, addr; 2698 int ec, sn, pn, na; 2699 u8 *vpd, csum; 2700 unsigned int vpdr_len, kw_offset, id_len; 2701 2702 vpd = vmalloc(VPD_LEN); 2703 if (!vpd) 2704 return -ENOMEM; 2705 2706 /* Card information normally starts at VPD_BASE but early cards had 2707 * it at 0. 2708 */ 2709 ret = pci_read_vpd(adapter->pdev, VPD_BASE, sizeof(u32), vpd); 2710 if (ret < 0) 2711 goto out; 2712 2713 /* The VPD shall have a unique identifier specified by the PCI SIG. 2714 * For chelsio adapters, the identifier is 0x82. The first byte of a VPD 2715 * shall be CHELSIO_VPD_UNIQUE_ID (0x82). The VPD programming software 2716 * is expected to automatically put this entry at the 2717 * beginning of the VPD. 2718 */ 2719 addr = *vpd == CHELSIO_VPD_UNIQUE_ID ? VPD_BASE : VPD_BASE_OLD; 2720 2721 ret = pci_read_vpd(adapter->pdev, addr, VPD_LEN, vpd); 2722 if (ret < 0) 2723 goto out; 2724 2725 if (vpd[0] != PCI_VPD_LRDT_ID_STRING) { 2726 dev_err(adapter->pdev_dev, "missing VPD ID string\n"); 2727 ret = -EINVAL; 2728 goto out; 2729 } 2730 2731 id_len = pci_vpd_lrdt_size(vpd); 2732 if (id_len > ID_LEN) 2733 id_len = ID_LEN; 2734 2735 i = pci_vpd_find_tag(vpd, 0, VPD_LEN, PCI_VPD_LRDT_RO_DATA); 2736 if (i < 0) { 2737 dev_err(adapter->pdev_dev, "missing VPD-R section\n"); 2738 ret = -EINVAL; 2739 goto out; 2740 } 2741 2742 vpdr_len = pci_vpd_lrdt_size(&vpd[i]); 2743 kw_offset = i + PCI_VPD_LRDT_TAG_SIZE; 2744 if (vpdr_len + kw_offset > VPD_LEN) { 2745 dev_err(adapter->pdev_dev, "bad VPD-R length %u\n", vpdr_len); 2746 ret = -EINVAL; 2747 goto out; 2748 } 2749 2750 #define FIND_VPD_KW(var, name) do { \ 2751 var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \ 2752 if (var < 0) { \ 2753 dev_err(adapter->pdev_dev, "missing VPD keyword " name "\n"); \ 2754 ret = -EINVAL; \ 2755 goto out; \ 2756 } \ 2757 var += PCI_VPD_INFO_FLD_HDR_SIZE; \ 2758 } while (0) 2759 2760 FIND_VPD_KW(i, "RV"); 2761 for (csum = 0; i >= 0; i--) 2762 csum += vpd[i]; 2763 2764 if (csum) { 2765 dev_err(adapter->pdev_dev, 2766 "corrupted VPD EEPROM, actual csum %u\n", csum); 2767 ret = -EINVAL; 2768 goto out; 2769 } 2770 2771 FIND_VPD_KW(ec, "EC"); 2772 FIND_VPD_KW(sn, "SN"); 2773 FIND_VPD_KW(pn, "PN"); 2774 FIND_VPD_KW(na, "NA"); 2775 #undef FIND_VPD_KW 2776 2777 memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len); 2778 strim(p->id); 2779 memcpy(p->ec, vpd + ec, EC_LEN); 2780 strim(p->ec); 2781 i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE); 2782 memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN)); 2783 strim(p->sn); 2784 i = pci_vpd_info_field_size(vpd + pn - PCI_VPD_INFO_FLD_HDR_SIZE); 2785 memcpy(p->pn, vpd + pn, min(i, PN_LEN)); 2786 strim(p->pn); 2787 memcpy(p->na, vpd + na, min(i, MACADDR_LEN)); 2788 strim((char *)p->na); 2789 2790 out: 2791 vfree(vpd); 2792 return ret < 0 ? ret : 0; 2793 } 2794 2795 /** 2796 * t4_get_vpd_params - read VPD parameters & retrieve Core Clock 2797 * @adapter: adapter to read 2798 * @p: where to store the parameters 2799 * 2800 * Reads card parameters stored in VPD EEPROM and retrieves the Core 2801 * Clock. This can only be called after a connection to the firmware 2802 * is established. 2803 */ 2804 int t4_get_vpd_params(struct adapter *adapter, struct vpd_params *p) 2805 { 2806 u32 cclk_param, cclk_val; 2807 int ret; 2808 2809 /* Grab the raw VPD parameters. 2810 */ 2811 ret = t4_get_raw_vpd_params(adapter, p); 2812 if (ret) 2813 return ret; 2814 2815 /* Ask firmware for the Core Clock since it knows how to translate the 2816 * Reference Clock ('V2') VPD field into a Core Clock value ... 2817 */ 2818 cclk_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 2819 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_CCLK)); 2820 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0, 2821 1, &cclk_param, &cclk_val); 2822 2823 if (ret) 2824 return ret; 2825 p->cclk = cclk_val; 2826 2827 return 0; 2828 } 2829 2830 /* serial flash and firmware constants */ 2831 enum { 2832 SF_ATTEMPTS = 10, /* max retries for SF operations */ 2833 2834 /* flash command opcodes */ 2835 SF_PROG_PAGE = 2, /* program page */ 2836 SF_WR_DISABLE = 4, /* disable writes */ 2837 SF_RD_STATUS = 5, /* read status register */ 2838 SF_WR_ENABLE = 6, /* enable writes */ 2839 SF_RD_DATA_FAST = 0xb, /* read flash */ 2840 SF_RD_ID = 0x9f, /* read ID */ 2841 SF_ERASE_SECTOR = 0xd8, /* erase sector */ 2842 }; 2843 2844 /** 2845 * sf1_read - read data from the serial flash 2846 * @adapter: the adapter 2847 * @byte_cnt: number of bytes to read 2848 * @cont: whether another operation will be chained 2849 * @lock: whether to lock SF for PL access only 2850 * @valp: where to store the read data 2851 * 2852 * Reads up to 4 bytes of data from the serial flash. The location of 2853 * the read needs to be specified prior to calling this by issuing the 2854 * appropriate commands to the serial flash. 2855 */ 2856 static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont, 2857 int lock, u32 *valp) 2858 { 2859 int ret; 2860 2861 if (!byte_cnt || byte_cnt > 4) 2862 return -EINVAL; 2863 if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F) 2864 return -EBUSY; 2865 t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) | 2866 SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1)); 2867 ret = t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5); 2868 if (!ret) 2869 *valp = t4_read_reg(adapter, SF_DATA_A); 2870 return ret; 2871 } 2872 2873 /** 2874 * sf1_write - write data to the serial flash 2875 * @adapter: the adapter 2876 * @byte_cnt: number of bytes to write 2877 * @cont: whether another operation will be chained 2878 * @lock: whether to lock SF for PL access only 2879 * @val: value to write 2880 * 2881 * Writes up to 4 bytes of data to the serial flash. The location of 2882 * the write needs to be specified prior to calling this by issuing the 2883 * appropriate commands to the serial flash. 2884 */ 2885 static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont, 2886 int lock, u32 val) 2887 { 2888 if (!byte_cnt || byte_cnt > 4) 2889 return -EINVAL; 2890 if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F) 2891 return -EBUSY; 2892 t4_write_reg(adapter, SF_DATA_A, val); 2893 t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) | 2894 SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1) | OP_V(1)); 2895 return t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5); 2896 } 2897 2898 /** 2899 * flash_wait_op - wait for a flash operation to complete 2900 * @adapter: the adapter 2901 * @attempts: max number of polls of the status register 2902 * @delay: delay between polls in ms 2903 * 2904 * Wait for a flash operation to complete by polling the status register. 2905 */ 2906 static int flash_wait_op(struct adapter *adapter, int attempts, int delay) 2907 { 2908 int ret; 2909 u32 status; 2910 2911 while (1) { 2912 if ((ret = sf1_write(adapter, 1, 1, 1, SF_RD_STATUS)) != 0 || 2913 (ret = sf1_read(adapter, 1, 0, 1, &status)) != 0) 2914 return ret; 2915 if (!(status & 1)) 2916 return 0; 2917 if (--attempts == 0) 2918 return -EAGAIN; 2919 if (delay) 2920 msleep(delay); 2921 } 2922 } 2923 2924 /** 2925 * t4_read_flash - read words from serial flash 2926 * @adapter: the adapter 2927 * @addr: the start address for the read 2928 * @nwords: how many 32-bit words to read 2929 * @data: where to store the read data 2930 * @byte_oriented: whether to store data as bytes or as words 2931 * 2932 * Read the specified number of 32-bit words from the serial flash. 2933 * If @byte_oriented is set the read data is stored as a byte array 2934 * (i.e., big-endian), otherwise as 32-bit words in the platform's 2935 * natural endianness. 2936 */ 2937 int t4_read_flash(struct adapter *adapter, unsigned int addr, 2938 unsigned int nwords, u32 *data, int byte_oriented) 2939 { 2940 int ret; 2941 2942 if (addr + nwords * sizeof(u32) > adapter->params.sf_size || (addr & 3)) 2943 return -EINVAL; 2944 2945 addr = swab32(addr) | SF_RD_DATA_FAST; 2946 2947 if ((ret = sf1_write(adapter, 4, 1, 0, addr)) != 0 || 2948 (ret = sf1_read(adapter, 1, 1, 0, data)) != 0) 2949 return ret; 2950 2951 for ( ; nwords; nwords--, data++) { 2952 ret = sf1_read(adapter, 4, nwords > 1, nwords == 1, data); 2953 if (nwords == 1) 2954 t4_write_reg(adapter, SF_OP_A, 0); /* unlock SF */ 2955 if (ret) 2956 return ret; 2957 if (byte_oriented) 2958 *data = (__force __u32)(cpu_to_be32(*data)); 2959 } 2960 return 0; 2961 } 2962 2963 /** 2964 * t4_write_flash - write up to a page of data to the serial flash 2965 * @adapter: the adapter 2966 * @addr: the start address to write 2967 * @n: length of data to write in bytes 2968 * @data: the data to write 2969 * 2970 * Writes up to a page of data (256 bytes) to the serial flash starting 2971 * at the given address. All the data must be written to the same page. 2972 */ 2973 static int t4_write_flash(struct adapter *adapter, unsigned int addr, 2974 unsigned int n, const u8 *data) 2975 { 2976 int ret; 2977 u32 buf[64]; 2978 unsigned int i, c, left, val, offset = addr & 0xff; 2979 2980 if (addr >= adapter->params.sf_size || offset + n > SF_PAGE_SIZE) 2981 return -EINVAL; 2982 2983 val = swab32(addr) | SF_PROG_PAGE; 2984 2985 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 || 2986 (ret = sf1_write(adapter, 4, 1, 1, val)) != 0) 2987 goto unlock; 2988 2989 for (left = n; left; left -= c) { 2990 c = min(left, 4U); 2991 for (val = 0, i = 0; i < c; ++i) 2992 val = (val << 8) + *data++; 2993 2994 ret = sf1_write(adapter, c, c != left, 1, val); 2995 if (ret) 2996 goto unlock; 2997 } 2998 ret = flash_wait_op(adapter, 8, 1); 2999 if (ret) 3000 goto unlock; 3001 3002 t4_write_reg(adapter, SF_OP_A, 0); /* unlock SF */ 3003 3004 /* Read the page to verify the write succeeded */ 3005 ret = t4_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1); 3006 if (ret) 3007 return ret; 3008 3009 if (memcmp(data - n, (u8 *)buf + offset, n)) { 3010 dev_err(adapter->pdev_dev, 3011 "failed to correctly write the flash page at %#x\n", 3012 addr); 3013 return -EIO; 3014 } 3015 return 0; 3016 3017 unlock: 3018 t4_write_reg(adapter, SF_OP_A, 0); /* unlock SF */ 3019 return ret; 3020 } 3021 3022 /** 3023 * t4_get_fw_version - read the firmware version 3024 * @adapter: the adapter 3025 * @vers: where to place the version 3026 * 3027 * Reads the FW version from flash. 3028 */ 3029 int t4_get_fw_version(struct adapter *adapter, u32 *vers) 3030 { 3031 return t4_read_flash(adapter, FLASH_FW_START + 3032 offsetof(struct fw_hdr, fw_ver), 1, 3033 vers, 0); 3034 } 3035 3036 /** 3037 * t4_get_bs_version - read the firmware bootstrap version 3038 * @adapter: the adapter 3039 * @vers: where to place the version 3040 * 3041 * Reads the FW Bootstrap version from flash. 3042 */ 3043 int t4_get_bs_version(struct adapter *adapter, u32 *vers) 3044 { 3045 return t4_read_flash(adapter, FLASH_FWBOOTSTRAP_START + 3046 offsetof(struct fw_hdr, fw_ver), 1, 3047 vers, 0); 3048 } 3049 3050 /** 3051 * t4_get_tp_version - read the TP microcode version 3052 * @adapter: the adapter 3053 * @vers: where to place the version 3054 * 3055 * Reads the TP microcode version from flash. 3056 */ 3057 int t4_get_tp_version(struct adapter *adapter, u32 *vers) 3058 { 3059 return t4_read_flash(adapter, FLASH_FW_START + 3060 offsetof(struct fw_hdr, tp_microcode_ver), 3061 1, vers, 0); 3062 } 3063 3064 /** 3065 * t4_get_exprom_version - return the Expansion ROM version (if any) 3066 * @adapter: the adapter 3067 * @vers: where to place the version 3068 * 3069 * Reads the Expansion ROM header from FLASH and returns the version 3070 * number (if present) through the @vers return value pointer. We return 3071 * this in the Firmware Version Format since it's convenient. Return 3072 * 0 on success, -ENOENT if no Expansion ROM is present. 3073 */ 3074 int t4_get_exprom_version(struct adapter *adap, u32 *vers) 3075 { 3076 struct exprom_header { 3077 unsigned char hdr_arr[16]; /* must start with 0x55aa */ 3078 unsigned char hdr_ver[4]; /* Expansion ROM version */ 3079 } *hdr; 3080 u32 exprom_header_buf[DIV_ROUND_UP(sizeof(struct exprom_header), 3081 sizeof(u32))]; 3082 int ret; 3083 3084 ret = t4_read_flash(adap, FLASH_EXP_ROM_START, 3085 ARRAY_SIZE(exprom_header_buf), exprom_header_buf, 3086 0); 3087 if (ret) 3088 return ret; 3089 3090 hdr = (struct exprom_header *)exprom_header_buf; 3091 if (hdr->hdr_arr[0] != 0x55 || hdr->hdr_arr[1] != 0xaa) 3092 return -ENOENT; 3093 3094 *vers = (FW_HDR_FW_VER_MAJOR_V(hdr->hdr_ver[0]) | 3095 FW_HDR_FW_VER_MINOR_V(hdr->hdr_ver[1]) | 3096 FW_HDR_FW_VER_MICRO_V(hdr->hdr_ver[2]) | 3097 FW_HDR_FW_VER_BUILD_V(hdr->hdr_ver[3])); 3098 return 0; 3099 } 3100 3101 /** 3102 * t4_get_vpd_version - return the VPD version 3103 * @adapter: the adapter 3104 * @vers: where to place the version 3105 * 3106 * Reads the VPD via the Firmware interface (thus this can only be called 3107 * once we're ready to issue Firmware commands). The format of the 3108 * VPD version is adapter specific. Returns 0 on success, an error on 3109 * failure. 3110 * 3111 * Note that early versions of the Firmware didn't include the ability 3112 * to retrieve the VPD version, so we zero-out the return-value parameter 3113 * in that case to avoid leaving it with garbage in it. 3114 * 3115 * Also note that the Firmware will return its cached copy of the VPD 3116 * Revision ID, not the actual Revision ID as written in the Serial 3117 * EEPROM. This is only an issue if a new VPD has been written and the 3118 * Firmware/Chip haven't yet gone through a RESET sequence. So it's best 3119 * to defer calling this routine till after a FW_RESET_CMD has been issued 3120 * if the Host Driver will be performing a full adapter initialization. 3121 */ 3122 int t4_get_vpd_version(struct adapter *adapter, u32 *vers) 3123 { 3124 u32 vpdrev_param; 3125 int ret; 3126 3127 vpdrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3128 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_VPDREV)); 3129 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0, 3130 1, &vpdrev_param, vers); 3131 if (ret) 3132 *vers = 0; 3133 return ret; 3134 } 3135 3136 /** 3137 * t4_get_scfg_version - return the Serial Configuration version 3138 * @adapter: the adapter 3139 * @vers: where to place the version 3140 * 3141 * Reads the Serial Configuration Version via the Firmware interface 3142 * (thus this can only be called once we're ready to issue Firmware 3143 * commands). The format of the Serial Configuration version is 3144 * adapter specific. Returns 0 on success, an error on failure. 3145 * 3146 * Note that early versions of the Firmware didn't include the ability 3147 * to retrieve the Serial Configuration version, so we zero-out the 3148 * return-value parameter in that case to avoid leaving it with 3149 * garbage in it. 3150 * 3151 * Also note that the Firmware will return its cached copy of the Serial 3152 * Initialization Revision ID, not the actual Revision ID as written in 3153 * the Serial EEPROM. This is only an issue if a new VPD has been written 3154 * and the Firmware/Chip haven't yet gone through a RESET sequence. So 3155 * it's best to defer calling this routine till after a FW_RESET_CMD has 3156 * been issued if the Host Driver will be performing a full adapter 3157 * initialization. 3158 */ 3159 int t4_get_scfg_version(struct adapter *adapter, u32 *vers) 3160 { 3161 u32 scfgrev_param; 3162 int ret; 3163 3164 scfgrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3165 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_SCFGREV)); 3166 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0, 3167 1, &scfgrev_param, vers); 3168 if (ret) 3169 *vers = 0; 3170 return ret; 3171 } 3172 3173 /** 3174 * t4_get_version_info - extract various chip/firmware version information 3175 * @adapter: the adapter 3176 * 3177 * Reads various chip/firmware version numbers and stores them into the 3178 * adapter Adapter Parameters structure. If any of the efforts fails 3179 * the first failure will be returned, but all of the version numbers 3180 * will be read. 3181 */ 3182 int t4_get_version_info(struct adapter *adapter) 3183 { 3184 int ret = 0; 3185 3186 #define FIRST_RET(__getvinfo) \ 3187 do { \ 3188 int __ret = __getvinfo; \ 3189 if (__ret && !ret) \ 3190 ret = __ret; \ 3191 } while (0) 3192 3193 FIRST_RET(t4_get_fw_version(adapter, &adapter->params.fw_vers)); 3194 FIRST_RET(t4_get_bs_version(adapter, &adapter->params.bs_vers)); 3195 FIRST_RET(t4_get_tp_version(adapter, &adapter->params.tp_vers)); 3196 FIRST_RET(t4_get_exprom_version(adapter, &adapter->params.er_vers)); 3197 FIRST_RET(t4_get_scfg_version(adapter, &adapter->params.scfg_vers)); 3198 FIRST_RET(t4_get_vpd_version(adapter, &adapter->params.vpd_vers)); 3199 3200 #undef FIRST_RET 3201 return ret; 3202 } 3203 3204 /** 3205 * t4_dump_version_info - dump all of the adapter configuration IDs 3206 * @adapter: the adapter 3207 * 3208 * Dumps all of the various bits of adapter configuration version/revision 3209 * IDs information. This is typically called at some point after 3210 * t4_get_version_info() has been called. 3211 */ 3212 void t4_dump_version_info(struct adapter *adapter) 3213 { 3214 /* Device information */ 3215 dev_info(adapter->pdev_dev, "Chelsio %s rev %d\n", 3216 adapter->params.vpd.id, 3217 CHELSIO_CHIP_RELEASE(adapter->params.chip)); 3218 dev_info(adapter->pdev_dev, "S/N: %s, P/N: %s\n", 3219 adapter->params.vpd.sn, adapter->params.vpd.pn); 3220 3221 /* Firmware Version */ 3222 if (!adapter->params.fw_vers) 3223 dev_warn(adapter->pdev_dev, "No firmware loaded\n"); 3224 else 3225 dev_info(adapter->pdev_dev, "Firmware version: %u.%u.%u.%u\n", 3226 FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers), 3227 FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers), 3228 FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers), 3229 FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers)); 3230 3231 /* Bootstrap Firmware Version. (Some adapters don't have Bootstrap 3232 * Firmware, so dev_info() is more appropriate here.) 3233 */ 3234 if (!adapter->params.bs_vers) 3235 dev_info(adapter->pdev_dev, "No bootstrap loaded\n"); 3236 else 3237 dev_info(adapter->pdev_dev, "Bootstrap version: %u.%u.%u.%u\n", 3238 FW_HDR_FW_VER_MAJOR_G(adapter->params.bs_vers), 3239 FW_HDR_FW_VER_MINOR_G(adapter->params.bs_vers), 3240 FW_HDR_FW_VER_MICRO_G(adapter->params.bs_vers), 3241 FW_HDR_FW_VER_BUILD_G(adapter->params.bs_vers)); 3242 3243 /* TP Microcode Version */ 3244 if (!adapter->params.tp_vers) 3245 dev_warn(adapter->pdev_dev, "No TP Microcode loaded\n"); 3246 else 3247 dev_info(adapter->pdev_dev, 3248 "TP Microcode version: %u.%u.%u.%u\n", 3249 FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers), 3250 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers), 3251 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers), 3252 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers)); 3253 3254 /* Expansion ROM version */ 3255 if (!adapter->params.er_vers) 3256 dev_info(adapter->pdev_dev, "No Expansion ROM loaded\n"); 3257 else 3258 dev_info(adapter->pdev_dev, 3259 "Expansion ROM version: %u.%u.%u.%u\n", 3260 FW_HDR_FW_VER_MAJOR_G(adapter->params.er_vers), 3261 FW_HDR_FW_VER_MINOR_G(adapter->params.er_vers), 3262 FW_HDR_FW_VER_MICRO_G(adapter->params.er_vers), 3263 FW_HDR_FW_VER_BUILD_G(adapter->params.er_vers)); 3264 3265 /* Serial Configuration version */ 3266 dev_info(adapter->pdev_dev, "Serial Configuration version: %#x\n", 3267 adapter->params.scfg_vers); 3268 3269 /* VPD Version */ 3270 dev_info(adapter->pdev_dev, "VPD version: %#x\n", 3271 adapter->params.vpd_vers); 3272 } 3273 3274 /** 3275 * t4_check_fw_version - check if the FW is supported with this driver 3276 * @adap: the adapter 3277 * 3278 * Checks if an adapter's FW is compatible with the driver. Returns 0 3279 * if there's exact match, a negative error if the version could not be 3280 * read or there's a major version mismatch 3281 */ 3282 int t4_check_fw_version(struct adapter *adap) 3283 { 3284 int i, ret, major, minor, micro; 3285 int exp_major, exp_minor, exp_micro; 3286 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip); 3287 3288 ret = t4_get_fw_version(adap, &adap->params.fw_vers); 3289 /* Try multiple times before returning error */ 3290 for (i = 0; (ret == -EBUSY || ret == -EAGAIN) && i < 3; i++) 3291 ret = t4_get_fw_version(adap, &adap->params.fw_vers); 3292 3293 if (ret) 3294 return ret; 3295 3296 major = FW_HDR_FW_VER_MAJOR_G(adap->params.fw_vers); 3297 minor = FW_HDR_FW_VER_MINOR_G(adap->params.fw_vers); 3298 micro = FW_HDR_FW_VER_MICRO_G(adap->params.fw_vers); 3299 3300 switch (chip_version) { 3301 case CHELSIO_T4: 3302 exp_major = T4FW_MIN_VERSION_MAJOR; 3303 exp_minor = T4FW_MIN_VERSION_MINOR; 3304 exp_micro = T4FW_MIN_VERSION_MICRO; 3305 break; 3306 case CHELSIO_T5: 3307 exp_major = T5FW_MIN_VERSION_MAJOR; 3308 exp_minor = T5FW_MIN_VERSION_MINOR; 3309 exp_micro = T5FW_MIN_VERSION_MICRO; 3310 break; 3311 case CHELSIO_T6: 3312 exp_major = T6FW_MIN_VERSION_MAJOR; 3313 exp_minor = T6FW_MIN_VERSION_MINOR; 3314 exp_micro = T6FW_MIN_VERSION_MICRO; 3315 break; 3316 default: 3317 dev_err(adap->pdev_dev, "Unsupported chip type, %x\n", 3318 adap->chip); 3319 return -EINVAL; 3320 } 3321 3322 if (major < exp_major || (major == exp_major && minor < exp_minor) || 3323 (major == exp_major && minor == exp_minor && micro < exp_micro)) { 3324 dev_err(adap->pdev_dev, 3325 "Card has firmware version %u.%u.%u, minimum " 3326 "supported firmware is %u.%u.%u.\n", major, minor, 3327 micro, exp_major, exp_minor, exp_micro); 3328 return -EFAULT; 3329 } 3330 return 0; 3331 } 3332 3333 /* Is the given firmware API compatible with the one the driver was compiled 3334 * with? 3335 */ 3336 static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2) 3337 { 3338 3339 /* short circuit if it's the exact same firmware version */ 3340 if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver) 3341 return 1; 3342 3343 #define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x) 3344 if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) && 3345 SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe)) 3346 return 1; 3347 #undef SAME_INTF 3348 3349 return 0; 3350 } 3351 3352 /* The firmware in the filesystem is usable, but should it be installed? 3353 * This routine explains itself in detail if it indicates the filesystem 3354 * firmware should be installed. 3355 */ 3356 static int should_install_fs_fw(struct adapter *adap, int card_fw_usable, 3357 int k, int c) 3358 { 3359 const char *reason; 3360 3361 if (!card_fw_usable) { 3362 reason = "incompatible or unusable"; 3363 goto install; 3364 } 3365 3366 if (k > c) { 3367 reason = "older than the version supported with this driver"; 3368 goto install; 3369 } 3370 3371 return 0; 3372 3373 install: 3374 dev_err(adap->pdev_dev, "firmware on card (%u.%u.%u.%u) is %s, " 3375 "installing firmware %u.%u.%u.%u on card.\n", 3376 FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c), 3377 FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), reason, 3378 FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k), 3379 FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k)); 3380 3381 return 1; 3382 } 3383 3384 int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info, 3385 const u8 *fw_data, unsigned int fw_size, 3386 struct fw_hdr *card_fw, enum dev_state state, 3387 int *reset) 3388 { 3389 int ret, card_fw_usable, fs_fw_usable; 3390 const struct fw_hdr *fs_fw; 3391 const struct fw_hdr *drv_fw; 3392 3393 drv_fw = &fw_info->fw_hdr; 3394 3395 /* Read the header of the firmware on the card */ 3396 ret = -t4_read_flash(adap, FLASH_FW_START, 3397 sizeof(*card_fw) / sizeof(uint32_t), 3398 (uint32_t *)card_fw, 1); 3399 if (ret == 0) { 3400 card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw); 3401 } else { 3402 dev_err(adap->pdev_dev, 3403 "Unable to read card's firmware header: %d\n", ret); 3404 card_fw_usable = 0; 3405 } 3406 3407 if (fw_data != NULL) { 3408 fs_fw = (const void *)fw_data; 3409 fs_fw_usable = fw_compatible(drv_fw, fs_fw); 3410 } else { 3411 fs_fw = NULL; 3412 fs_fw_usable = 0; 3413 } 3414 3415 if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver && 3416 (!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) { 3417 /* Common case: the firmware on the card is an exact match and 3418 * the filesystem one is an exact match too, or the filesystem 3419 * one is absent/incompatible. 3420 */ 3421 } else if (fs_fw_usable && state == DEV_STATE_UNINIT && 3422 should_install_fs_fw(adap, card_fw_usable, 3423 be32_to_cpu(fs_fw->fw_ver), 3424 be32_to_cpu(card_fw->fw_ver))) { 3425 ret = -t4_fw_upgrade(adap, adap->mbox, fw_data, 3426 fw_size, 0); 3427 if (ret != 0) { 3428 dev_err(adap->pdev_dev, 3429 "failed to install firmware: %d\n", ret); 3430 goto bye; 3431 } 3432 3433 /* Installed successfully, update the cached header too. */ 3434 *card_fw = *fs_fw; 3435 card_fw_usable = 1; 3436 *reset = 0; /* already reset as part of load_fw */ 3437 } 3438 3439 if (!card_fw_usable) { 3440 uint32_t d, c, k; 3441 3442 d = be32_to_cpu(drv_fw->fw_ver); 3443 c = be32_to_cpu(card_fw->fw_ver); 3444 k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0; 3445 3446 dev_err(adap->pdev_dev, "Cannot find a usable firmware: " 3447 "chip state %d, " 3448 "driver compiled with %d.%d.%d.%d, " 3449 "card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n", 3450 state, 3451 FW_HDR_FW_VER_MAJOR_G(d), FW_HDR_FW_VER_MINOR_G(d), 3452 FW_HDR_FW_VER_MICRO_G(d), FW_HDR_FW_VER_BUILD_G(d), 3453 FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c), 3454 FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), 3455 FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k), 3456 FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k)); 3457 ret = EINVAL; 3458 goto bye; 3459 } 3460 3461 /* We're using whatever's on the card and it's known to be good. */ 3462 adap->params.fw_vers = be32_to_cpu(card_fw->fw_ver); 3463 adap->params.tp_vers = be32_to_cpu(card_fw->tp_microcode_ver); 3464 3465 bye: 3466 return ret; 3467 } 3468 3469 /** 3470 * t4_flash_erase_sectors - erase a range of flash sectors 3471 * @adapter: the adapter 3472 * @start: the first sector to erase 3473 * @end: the last sector to erase 3474 * 3475 * Erases the sectors in the given inclusive range. 3476 */ 3477 static int t4_flash_erase_sectors(struct adapter *adapter, int start, int end) 3478 { 3479 int ret = 0; 3480 3481 if (end >= adapter->params.sf_nsec) 3482 return -EINVAL; 3483 3484 while (start <= end) { 3485 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 || 3486 (ret = sf1_write(adapter, 4, 0, 1, 3487 SF_ERASE_SECTOR | (start << 8))) != 0 || 3488 (ret = flash_wait_op(adapter, 14, 500)) != 0) { 3489 dev_err(adapter->pdev_dev, 3490 "erase of flash sector %d failed, error %d\n", 3491 start, ret); 3492 break; 3493 } 3494 start++; 3495 } 3496 t4_write_reg(adapter, SF_OP_A, 0); /* unlock SF */ 3497 return ret; 3498 } 3499 3500 /** 3501 * t4_flash_cfg_addr - return the address of the flash configuration file 3502 * @adapter: the adapter 3503 * 3504 * Return the address within the flash where the Firmware Configuration 3505 * File is stored. 3506 */ 3507 unsigned int t4_flash_cfg_addr(struct adapter *adapter) 3508 { 3509 if (adapter->params.sf_size == 0x100000) 3510 return FLASH_FPGA_CFG_START; 3511 else 3512 return FLASH_CFG_START; 3513 } 3514 3515 /* Return TRUE if the specified firmware matches the adapter. I.e. T4 3516 * firmware for T4 adapters, T5 firmware for T5 adapters, etc. We go ahead 3517 * and emit an error message for mismatched firmware to save our caller the 3518 * effort ... 3519 */ 3520 static bool t4_fw_matches_chip(const struct adapter *adap, 3521 const struct fw_hdr *hdr) 3522 { 3523 /* The expression below will return FALSE for any unsupported adapter 3524 * which will keep us "honest" in the future ... 3525 */ 3526 if ((is_t4(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T4) || 3527 (is_t5(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T5) || 3528 (is_t6(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T6)) 3529 return true; 3530 3531 dev_err(adap->pdev_dev, 3532 "FW image (%d) is not suitable for this adapter (%d)\n", 3533 hdr->chip, CHELSIO_CHIP_VERSION(adap->params.chip)); 3534 return false; 3535 } 3536 3537 /** 3538 * t4_load_fw - download firmware 3539 * @adap: the adapter 3540 * @fw_data: the firmware image to write 3541 * @size: image size 3542 * 3543 * Write the supplied firmware image to the card's serial flash. 3544 */ 3545 int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size) 3546 { 3547 u32 csum; 3548 int ret, addr; 3549 unsigned int i; 3550 u8 first_page[SF_PAGE_SIZE]; 3551 const __be32 *p = (const __be32 *)fw_data; 3552 const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data; 3553 unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec; 3554 unsigned int fw_start_sec = FLASH_FW_START_SEC; 3555 unsigned int fw_size = FLASH_FW_MAX_SIZE; 3556 unsigned int fw_start = FLASH_FW_START; 3557 3558 if (!size) { 3559 dev_err(adap->pdev_dev, "FW image has no data\n"); 3560 return -EINVAL; 3561 } 3562 if (size & 511) { 3563 dev_err(adap->pdev_dev, 3564 "FW image size not multiple of 512 bytes\n"); 3565 return -EINVAL; 3566 } 3567 if ((unsigned int)be16_to_cpu(hdr->len512) * 512 != size) { 3568 dev_err(adap->pdev_dev, 3569 "FW image size differs from size in FW header\n"); 3570 return -EINVAL; 3571 } 3572 if (size > fw_size) { 3573 dev_err(adap->pdev_dev, "FW image too large, max is %u bytes\n", 3574 fw_size); 3575 return -EFBIG; 3576 } 3577 if (!t4_fw_matches_chip(adap, hdr)) 3578 return -EINVAL; 3579 3580 for (csum = 0, i = 0; i < size / sizeof(csum); i++) 3581 csum += be32_to_cpu(p[i]); 3582 3583 if (csum != 0xffffffff) { 3584 dev_err(adap->pdev_dev, 3585 "corrupted firmware image, checksum %#x\n", csum); 3586 return -EINVAL; 3587 } 3588 3589 i = DIV_ROUND_UP(size, sf_sec_size); /* # of sectors spanned */ 3590 ret = t4_flash_erase_sectors(adap, fw_start_sec, fw_start_sec + i - 1); 3591 if (ret) 3592 goto out; 3593 3594 /* 3595 * We write the correct version at the end so the driver can see a bad 3596 * version if the FW write fails. Start by writing a copy of the 3597 * first page with a bad version. 3598 */ 3599 memcpy(first_page, fw_data, SF_PAGE_SIZE); 3600 ((struct fw_hdr *)first_page)->fw_ver = cpu_to_be32(0xffffffff); 3601 ret = t4_write_flash(adap, fw_start, SF_PAGE_SIZE, first_page); 3602 if (ret) 3603 goto out; 3604 3605 addr = fw_start; 3606 for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) { 3607 addr += SF_PAGE_SIZE; 3608 fw_data += SF_PAGE_SIZE; 3609 ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, fw_data); 3610 if (ret) 3611 goto out; 3612 } 3613 3614 ret = t4_write_flash(adap, 3615 fw_start + offsetof(struct fw_hdr, fw_ver), 3616 sizeof(hdr->fw_ver), (const u8 *)&hdr->fw_ver); 3617 out: 3618 if (ret) 3619 dev_err(adap->pdev_dev, "firmware download failed, error %d\n", 3620 ret); 3621 else 3622 ret = t4_get_fw_version(adap, &adap->params.fw_vers); 3623 return ret; 3624 } 3625 3626 /** 3627 * t4_phy_fw_ver - return current PHY firmware version 3628 * @adap: the adapter 3629 * @phy_fw_ver: return value buffer for PHY firmware version 3630 * 3631 * Returns the current version of external PHY firmware on the 3632 * adapter. 3633 */ 3634 int t4_phy_fw_ver(struct adapter *adap, int *phy_fw_ver) 3635 { 3636 u32 param, val; 3637 int ret; 3638 3639 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3640 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) | 3641 FW_PARAMS_PARAM_Y_V(adap->params.portvec) | 3642 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_VERSION)); 3643 ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 1, 3644 ¶m, &val); 3645 if (ret < 0) 3646 return ret; 3647 *phy_fw_ver = val; 3648 return 0; 3649 } 3650 3651 /** 3652 * t4_load_phy_fw - download port PHY firmware 3653 * @adap: the adapter 3654 * @win: the PCI-E Memory Window index to use for t4_memory_rw() 3655 * @win_lock: the lock to use to guard the memory copy 3656 * @phy_fw_version: function to check PHY firmware versions 3657 * @phy_fw_data: the PHY firmware image to write 3658 * @phy_fw_size: image size 3659 * 3660 * Transfer the specified PHY firmware to the adapter. If a non-NULL 3661 * @phy_fw_version is supplied, then it will be used to determine if 3662 * it's necessary to perform the transfer by comparing the version 3663 * of any existing adapter PHY firmware with that of the passed in 3664 * PHY firmware image. If @win_lock is non-NULL then it will be used 3665 * around the call to t4_memory_rw() which transfers the PHY firmware 3666 * to the adapter. 3667 * 3668 * A negative error number will be returned if an error occurs. If 3669 * version number support is available and there's no need to upgrade 3670 * the firmware, 0 will be returned. If firmware is successfully 3671 * transferred to the adapter, 1 will be retured. 3672 * 3673 * NOTE: some adapters only have local RAM to store the PHY firmware. As 3674 * a result, a RESET of the adapter would cause that RAM to lose its 3675 * contents. Thus, loading PHY firmware on such adapters must happen 3676 * after any FW_RESET_CMDs ... 3677 */ 3678 int t4_load_phy_fw(struct adapter *adap, 3679 int win, spinlock_t *win_lock, 3680 int (*phy_fw_version)(const u8 *, size_t), 3681 const u8 *phy_fw_data, size_t phy_fw_size) 3682 { 3683 unsigned long mtype = 0, maddr = 0; 3684 u32 param, val; 3685 int cur_phy_fw_ver = 0, new_phy_fw_vers = 0; 3686 int ret; 3687 3688 /* If we have version number support, then check to see if the adapter 3689 * already has up-to-date PHY firmware loaded. 3690 */ 3691 if (phy_fw_version) { 3692 new_phy_fw_vers = phy_fw_version(phy_fw_data, phy_fw_size); 3693 ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver); 3694 if (ret < 0) 3695 return ret; 3696 3697 if (cur_phy_fw_ver >= new_phy_fw_vers) { 3698 CH_WARN(adap, "PHY Firmware already up-to-date, " 3699 "version %#x\n", cur_phy_fw_ver); 3700 return 0; 3701 } 3702 } 3703 3704 /* Ask the firmware where it wants us to copy the PHY firmware image. 3705 * The size of the file requires a special version of the READ coommand 3706 * which will pass the file size via the values field in PARAMS_CMD and 3707 * retrieve the return value from firmware and place it in the same 3708 * buffer values 3709 */ 3710 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3711 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) | 3712 FW_PARAMS_PARAM_Y_V(adap->params.portvec) | 3713 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD)); 3714 val = phy_fw_size; 3715 ret = t4_query_params_rw(adap, adap->mbox, adap->pf, 0, 1, 3716 ¶m, &val, 1, true); 3717 if (ret < 0) 3718 return ret; 3719 mtype = val >> 8; 3720 maddr = (val & 0xff) << 16; 3721 3722 /* Copy the supplied PHY Firmware image to the adapter memory location 3723 * allocated by the adapter firmware. 3724 */ 3725 if (win_lock) 3726 spin_lock_bh(win_lock); 3727 ret = t4_memory_rw(adap, win, mtype, maddr, 3728 phy_fw_size, (__be32 *)phy_fw_data, 3729 T4_MEMORY_WRITE); 3730 if (win_lock) 3731 spin_unlock_bh(win_lock); 3732 if (ret) 3733 return ret; 3734 3735 /* Tell the firmware that the PHY firmware image has been written to 3736 * RAM and it can now start copying it over to the PHYs. The chip 3737 * firmware will RESET the affected PHYs as part of this operation 3738 * leaving them running the new PHY firmware image. 3739 */ 3740 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3741 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) | 3742 FW_PARAMS_PARAM_Y_V(adap->params.portvec) | 3743 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD)); 3744 ret = t4_set_params_timeout(adap, adap->mbox, adap->pf, 0, 1, 3745 ¶m, &val, 30000); 3746 3747 /* If we have version number support, then check to see that the new 3748 * firmware got loaded properly. 3749 */ 3750 if (phy_fw_version) { 3751 ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver); 3752 if (ret < 0) 3753 return ret; 3754 3755 if (cur_phy_fw_ver != new_phy_fw_vers) { 3756 CH_WARN(adap, "PHY Firmware did not update: " 3757 "version on adapter %#x, " 3758 "version flashed %#x\n", 3759 cur_phy_fw_ver, new_phy_fw_vers); 3760 return -ENXIO; 3761 } 3762 } 3763 3764 return 1; 3765 } 3766 3767 /** 3768 * t4_fwcache - firmware cache operation 3769 * @adap: the adapter 3770 * @op : the operation (flush or flush and invalidate) 3771 */ 3772 int t4_fwcache(struct adapter *adap, enum fw_params_param_dev_fwcache op) 3773 { 3774 struct fw_params_cmd c; 3775 3776 memset(&c, 0, sizeof(c)); 3777 c.op_to_vfn = 3778 cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) | 3779 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 3780 FW_PARAMS_CMD_PFN_V(adap->pf) | 3781 FW_PARAMS_CMD_VFN_V(0)); 3782 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 3783 c.param[0].mnem = 3784 cpu_to_be32(FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 3785 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_FWCACHE)); 3786 c.param[0].val = (__force __be32)op; 3787 3788 return t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), NULL); 3789 } 3790 3791 void t4_cim_read_pif_la(struct adapter *adap, u32 *pif_req, u32 *pif_rsp, 3792 unsigned int *pif_req_wrptr, 3793 unsigned int *pif_rsp_wrptr) 3794 { 3795 int i, j; 3796 u32 cfg, val, req, rsp; 3797 3798 cfg = t4_read_reg(adap, CIM_DEBUGCFG_A); 3799 if (cfg & LADBGEN_F) 3800 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F); 3801 3802 val = t4_read_reg(adap, CIM_DEBUGSTS_A); 3803 req = POLADBGWRPTR_G(val); 3804 rsp = PILADBGWRPTR_G(val); 3805 if (pif_req_wrptr) 3806 *pif_req_wrptr = req; 3807 if (pif_rsp_wrptr) 3808 *pif_rsp_wrptr = rsp; 3809 3810 for (i = 0; i < CIM_PIFLA_SIZE; i++) { 3811 for (j = 0; j < 6; j++) { 3812 t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(req) | 3813 PILADBGRDPTR_V(rsp)); 3814 *pif_req++ = t4_read_reg(adap, CIM_PO_LA_DEBUGDATA_A); 3815 *pif_rsp++ = t4_read_reg(adap, CIM_PI_LA_DEBUGDATA_A); 3816 req++; 3817 rsp++; 3818 } 3819 req = (req + 2) & POLADBGRDPTR_M; 3820 rsp = (rsp + 2) & PILADBGRDPTR_M; 3821 } 3822 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg); 3823 } 3824 3825 void t4_cim_read_ma_la(struct adapter *adap, u32 *ma_req, u32 *ma_rsp) 3826 { 3827 u32 cfg; 3828 int i, j, idx; 3829 3830 cfg = t4_read_reg(adap, CIM_DEBUGCFG_A); 3831 if (cfg & LADBGEN_F) 3832 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F); 3833 3834 for (i = 0; i < CIM_MALA_SIZE; i++) { 3835 for (j = 0; j < 5; j++) { 3836 idx = 8 * i + j; 3837 t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(idx) | 3838 PILADBGRDPTR_V(idx)); 3839 *ma_req++ = t4_read_reg(adap, CIM_PO_LA_MADEBUGDATA_A); 3840 *ma_rsp++ = t4_read_reg(adap, CIM_PI_LA_MADEBUGDATA_A); 3841 } 3842 } 3843 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg); 3844 } 3845 3846 void t4_ulprx_read_la(struct adapter *adap, u32 *la_buf) 3847 { 3848 unsigned int i, j; 3849 3850 for (i = 0; i < 8; i++) { 3851 u32 *p = la_buf + i; 3852 3853 t4_write_reg(adap, ULP_RX_LA_CTL_A, i); 3854 j = t4_read_reg(adap, ULP_RX_LA_WRPTR_A); 3855 t4_write_reg(adap, ULP_RX_LA_RDPTR_A, j); 3856 for (j = 0; j < ULPRX_LA_SIZE; j++, p += 8) 3857 *p = t4_read_reg(adap, ULP_RX_LA_RDDATA_A); 3858 } 3859 } 3860 3861 #define ADVERT_MASK (FW_PORT_CAP32_SPEED_V(FW_PORT_CAP32_SPEED_M) | \ 3862 FW_PORT_CAP32_ANEG) 3863 3864 /** 3865 * fwcaps16_to_caps32 - convert 16-bit Port Capabilities to 32-bits 3866 * @caps16: a 16-bit Port Capabilities value 3867 * 3868 * Returns the equivalent 32-bit Port Capabilities value. 3869 */ 3870 static fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16) 3871 { 3872 fw_port_cap32_t caps32 = 0; 3873 3874 #define CAP16_TO_CAP32(__cap) \ 3875 do { \ 3876 if (caps16 & FW_PORT_CAP_##__cap) \ 3877 caps32 |= FW_PORT_CAP32_##__cap; \ 3878 } while (0) 3879 3880 CAP16_TO_CAP32(SPEED_100M); 3881 CAP16_TO_CAP32(SPEED_1G); 3882 CAP16_TO_CAP32(SPEED_25G); 3883 CAP16_TO_CAP32(SPEED_10G); 3884 CAP16_TO_CAP32(SPEED_40G); 3885 CAP16_TO_CAP32(SPEED_100G); 3886 CAP16_TO_CAP32(FC_RX); 3887 CAP16_TO_CAP32(FC_TX); 3888 CAP16_TO_CAP32(ANEG); 3889 CAP16_TO_CAP32(MDIX); 3890 CAP16_TO_CAP32(MDIAUTO); 3891 CAP16_TO_CAP32(FEC_RS); 3892 CAP16_TO_CAP32(FEC_BASER_RS); 3893 CAP16_TO_CAP32(802_3_PAUSE); 3894 CAP16_TO_CAP32(802_3_ASM_DIR); 3895 3896 #undef CAP16_TO_CAP32 3897 3898 return caps32; 3899 } 3900 3901 /** 3902 * fwcaps32_to_caps16 - convert 32-bit Port Capabilities to 16-bits 3903 * @caps32: a 32-bit Port Capabilities value 3904 * 3905 * Returns the equivalent 16-bit Port Capabilities value. Note that 3906 * not all 32-bit Port Capabilities can be represented in the 16-bit 3907 * Port Capabilities and some fields/values may not make it. 3908 */ 3909 static fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32) 3910 { 3911 fw_port_cap16_t caps16 = 0; 3912 3913 #define CAP32_TO_CAP16(__cap) \ 3914 do { \ 3915 if (caps32 & FW_PORT_CAP32_##__cap) \ 3916 caps16 |= FW_PORT_CAP_##__cap; \ 3917 } while (0) 3918 3919 CAP32_TO_CAP16(SPEED_100M); 3920 CAP32_TO_CAP16(SPEED_1G); 3921 CAP32_TO_CAP16(SPEED_10G); 3922 CAP32_TO_CAP16(SPEED_25G); 3923 CAP32_TO_CAP16(SPEED_40G); 3924 CAP32_TO_CAP16(SPEED_100G); 3925 CAP32_TO_CAP16(FC_RX); 3926 CAP32_TO_CAP16(FC_TX); 3927 CAP32_TO_CAP16(802_3_PAUSE); 3928 CAP32_TO_CAP16(802_3_ASM_DIR); 3929 CAP32_TO_CAP16(ANEG); 3930 CAP32_TO_CAP16(MDIX); 3931 CAP32_TO_CAP16(MDIAUTO); 3932 CAP32_TO_CAP16(FEC_RS); 3933 CAP32_TO_CAP16(FEC_BASER_RS); 3934 3935 #undef CAP32_TO_CAP16 3936 3937 return caps16; 3938 } 3939 3940 /* Translate Firmware Port Capabilities Pause specification to Common Code */ 3941 static inline enum cc_pause fwcap_to_cc_pause(fw_port_cap32_t fw_pause) 3942 { 3943 enum cc_pause cc_pause = 0; 3944 3945 if (fw_pause & FW_PORT_CAP32_FC_RX) 3946 cc_pause |= PAUSE_RX; 3947 if (fw_pause & FW_PORT_CAP32_FC_TX) 3948 cc_pause |= PAUSE_TX; 3949 3950 return cc_pause; 3951 } 3952 3953 /* Translate Common Code Pause specification into Firmware Port Capabilities */ 3954 static inline fw_port_cap32_t cc_to_fwcap_pause(enum cc_pause cc_pause) 3955 { 3956 fw_port_cap32_t fw_pause = 0; 3957 3958 if (cc_pause & PAUSE_RX) 3959 fw_pause |= FW_PORT_CAP32_FC_RX; 3960 if (cc_pause & PAUSE_TX) 3961 fw_pause |= FW_PORT_CAP32_FC_TX; 3962 3963 return fw_pause; 3964 } 3965 3966 /* Translate Firmware Forward Error Correction specification to Common Code */ 3967 static inline enum cc_fec fwcap_to_cc_fec(fw_port_cap32_t fw_fec) 3968 { 3969 enum cc_fec cc_fec = 0; 3970 3971 if (fw_fec & FW_PORT_CAP32_FEC_RS) 3972 cc_fec |= FEC_RS; 3973 if (fw_fec & FW_PORT_CAP32_FEC_BASER_RS) 3974 cc_fec |= FEC_BASER_RS; 3975 3976 return cc_fec; 3977 } 3978 3979 /* Translate Common Code Forward Error Correction specification to Firmware */ 3980 static inline fw_port_cap32_t cc_to_fwcap_fec(enum cc_fec cc_fec) 3981 { 3982 fw_port_cap32_t fw_fec = 0; 3983 3984 if (cc_fec & FEC_RS) 3985 fw_fec |= FW_PORT_CAP32_FEC_RS; 3986 if (cc_fec & FEC_BASER_RS) 3987 fw_fec |= FW_PORT_CAP32_FEC_BASER_RS; 3988 3989 return fw_fec; 3990 } 3991 3992 /** 3993 * t4_link_l1cfg - apply link configuration to MAC/PHY 3994 * @adapter: the adapter 3995 * @mbox: the Firmware Mailbox to use 3996 * @port: the Port ID 3997 * @lc: the Port's Link Configuration 3998 * 3999 * Set up a port's MAC and PHY according to a desired link configuration. 4000 * - If the PHY can auto-negotiate first decide what to advertise, then 4001 * enable/disable auto-negotiation as desired, and reset. 4002 * - If the PHY does not auto-negotiate just reset it. 4003 * - If auto-negotiation is off set the MAC to the proper speed/duplex/FC, 4004 * otherwise do it later based on the outcome of auto-negotiation. 4005 */ 4006 int t4_link_l1cfg(struct adapter *adapter, unsigned int mbox, 4007 unsigned int port, struct link_config *lc) 4008 { 4009 unsigned int fw_caps = adapter->params.fw_caps_support; 4010 struct fw_port_cmd cmd; 4011 unsigned int fw_mdi = FW_PORT_CAP32_MDI_V(FW_PORT_CAP32_MDI_AUTO); 4012 fw_port_cap32_t fw_fc, cc_fec, fw_fec, rcap; 4013 4014 lc->link_ok = 0; 4015 4016 /* Convert driver coding of Pause Frame Flow Control settings into the 4017 * Firmware's API. 4018 */ 4019 fw_fc = cc_to_fwcap_pause(lc->requested_fc); 4020 4021 /* Convert Common Code Forward Error Control settings into the 4022 * Firmware's API. If the current Requested FEC has "Automatic" 4023 * (IEEE 802.3) specified, then we use whatever the Firmware 4024 * sent us as part of it's IEEE 802.3-based interpratation of 4025 * the Transceiver Module EPROM FEC parameters. Otherwise we 4026 * use whatever is in the current Requested FEC settings. 4027 */ 4028 if (lc->requested_fec & FEC_AUTO) 4029 cc_fec = fwcap_to_cc_fec(lc->def_acaps); 4030 else 4031 cc_fec = lc->requested_fec; 4032 fw_fec = cc_to_fwcap_fec(cc_fec); 4033 4034 /* Figure out what our Requested Port Capabilities are going to be. 4035 */ 4036 if (!(lc->pcaps & FW_PORT_CAP32_ANEG)) { 4037 rcap = (lc->pcaps & ADVERT_MASK) | fw_fc | fw_fec; 4038 lc->fc = lc->requested_fc & ~PAUSE_AUTONEG; 4039 lc->fec = cc_fec; 4040 } else if (lc->autoneg == AUTONEG_DISABLE) { 4041 rcap = lc->speed_caps | fw_fc | fw_fec | fw_mdi; 4042 lc->fc = lc->requested_fc & ~PAUSE_AUTONEG; 4043 lc->fec = cc_fec; 4044 } else { 4045 rcap = lc->acaps | fw_fc | fw_fec | fw_mdi; 4046 } 4047 4048 /* And send that on to the Firmware ... 4049 */ 4050 memset(&cmd, 0, sizeof(cmd)); 4051 cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | 4052 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 4053 FW_PORT_CMD_PORTID_V(port)); 4054 cmd.action_to_len16 = 4055 cpu_to_be32(FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16 4056 ? FW_PORT_ACTION_L1_CFG 4057 : FW_PORT_ACTION_L1_CFG32) | 4058 FW_LEN16(cmd)); 4059 if (fw_caps == FW_CAPS16) 4060 cmd.u.l1cfg.rcap = cpu_to_be32(fwcaps32_to_caps16(rcap)); 4061 else 4062 cmd.u.l1cfg32.rcap32 = cpu_to_be32(rcap); 4063 return t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL); 4064 } 4065 4066 /** 4067 * t4_restart_aneg - restart autonegotiation 4068 * @adap: the adapter 4069 * @mbox: mbox to use for the FW command 4070 * @port: the port id 4071 * 4072 * Restarts autonegotiation for the selected port. 4073 */ 4074 int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port) 4075 { 4076 struct fw_port_cmd c; 4077 4078 memset(&c, 0, sizeof(c)); 4079 c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | 4080 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 4081 FW_PORT_CMD_PORTID_V(port)); 4082 c.action_to_len16 = 4083 cpu_to_be32(FW_PORT_CMD_ACTION_V(FW_PORT_ACTION_L1_CFG) | 4084 FW_LEN16(c)); 4085 c.u.l1cfg.rcap = cpu_to_be32(FW_PORT_CAP32_ANEG); 4086 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 4087 } 4088 4089 typedef void (*int_handler_t)(struct adapter *adap); 4090 4091 struct intr_info { 4092 unsigned int mask; /* bits to check in interrupt status */ 4093 const char *msg; /* message to print or NULL */ 4094 short stat_idx; /* stat counter to increment or -1 */ 4095 unsigned short fatal; /* whether the condition reported is fatal */ 4096 int_handler_t int_handler; /* platform-specific int handler */ 4097 }; 4098 4099 /** 4100 * t4_handle_intr_status - table driven interrupt handler 4101 * @adapter: the adapter that generated the interrupt 4102 * @reg: the interrupt status register to process 4103 * @acts: table of interrupt actions 4104 * 4105 * A table driven interrupt handler that applies a set of masks to an 4106 * interrupt status word and performs the corresponding actions if the 4107 * interrupts described by the mask have occurred. The actions include 4108 * optionally emitting a warning or alert message. The table is terminated 4109 * by an entry specifying mask 0. Returns the number of fatal interrupt 4110 * conditions. 4111 */ 4112 static int t4_handle_intr_status(struct adapter *adapter, unsigned int reg, 4113 const struct intr_info *acts) 4114 { 4115 int fatal = 0; 4116 unsigned int mask = 0; 4117 unsigned int status = t4_read_reg(adapter, reg); 4118 4119 for ( ; acts->mask; ++acts) { 4120 if (!(status & acts->mask)) 4121 continue; 4122 if (acts->fatal) { 4123 fatal++; 4124 dev_alert(adapter->pdev_dev, "%s (0x%x)\n", acts->msg, 4125 status & acts->mask); 4126 } else if (acts->msg && printk_ratelimit()) 4127 dev_warn(adapter->pdev_dev, "%s (0x%x)\n", acts->msg, 4128 status & acts->mask); 4129 if (acts->int_handler) 4130 acts->int_handler(adapter); 4131 mask |= acts->mask; 4132 } 4133 status &= mask; 4134 if (status) /* clear processed interrupts */ 4135 t4_write_reg(adapter, reg, status); 4136 return fatal; 4137 } 4138 4139 /* 4140 * Interrupt handler for the PCIE module. 4141 */ 4142 static void pcie_intr_handler(struct adapter *adapter) 4143 { 4144 static const struct intr_info sysbus_intr_info[] = { 4145 { RNPP_F, "RXNP array parity error", -1, 1 }, 4146 { RPCP_F, "RXPC array parity error", -1, 1 }, 4147 { RCIP_F, "RXCIF array parity error", -1, 1 }, 4148 { RCCP_F, "Rx completions control array parity error", -1, 1 }, 4149 { RFTP_F, "RXFT array parity error", -1, 1 }, 4150 { 0 } 4151 }; 4152 static const struct intr_info pcie_port_intr_info[] = { 4153 { TPCP_F, "TXPC array parity error", -1, 1 }, 4154 { TNPP_F, "TXNP array parity error", -1, 1 }, 4155 { TFTP_F, "TXFT array parity error", -1, 1 }, 4156 { TCAP_F, "TXCA array parity error", -1, 1 }, 4157 { TCIP_F, "TXCIF array parity error", -1, 1 }, 4158 { RCAP_F, "RXCA array parity error", -1, 1 }, 4159 { OTDD_F, "outbound request TLP discarded", -1, 1 }, 4160 { RDPE_F, "Rx data parity error", -1, 1 }, 4161 { TDUE_F, "Tx uncorrectable data error", -1, 1 }, 4162 { 0 } 4163 }; 4164 static const struct intr_info pcie_intr_info[] = { 4165 { MSIADDRLPERR_F, "MSI AddrL parity error", -1, 1 }, 4166 { MSIADDRHPERR_F, "MSI AddrH parity error", -1, 1 }, 4167 { MSIDATAPERR_F, "MSI data parity error", -1, 1 }, 4168 { MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 }, 4169 { MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 }, 4170 { MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 }, 4171 { MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 }, 4172 { PIOCPLPERR_F, "PCI PIO completion FIFO parity error", -1, 1 }, 4173 { PIOREQPERR_F, "PCI PIO request FIFO parity error", -1, 1 }, 4174 { TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 }, 4175 { CCNTPERR_F, "PCI CMD channel count parity error", -1, 1 }, 4176 { CREQPERR_F, "PCI CMD channel request parity error", -1, 1 }, 4177 { CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 }, 4178 { DCNTPERR_F, "PCI DMA channel count parity error", -1, 1 }, 4179 { DREQPERR_F, "PCI DMA channel request parity error", -1, 1 }, 4180 { DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 }, 4181 { HCNTPERR_F, "PCI HMA channel count parity error", -1, 1 }, 4182 { HREQPERR_F, "PCI HMA channel request parity error", -1, 1 }, 4183 { HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 }, 4184 { CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 }, 4185 { FIDPERR_F, "PCI FID parity error", -1, 1 }, 4186 { INTXCLRPERR_F, "PCI INTx clear parity error", -1, 1 }, 4187 { MATAGPERR_F, "PCI MA tag parity error", -1, 1 }, 4188 { PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 }, 4189 { RXCPLPERR_F, "PCI Rx completion parity error", -1, 1 }, 4190 { RXWRPERR_F, "PCI Rx write parity error", -1, 1 }, 4191 { RPLPERR_F, "PCI replay buffer parity error", -1, 1 }, 4192 { PCIESINT_F, "PCI core secondary fault", -1, 1 }, 4193 { PCIEPINT_F, "PCI core primary fault", -1, 1 }, 4194 { UNXSPLCPLERR_F, "PCI unexpected split completion error", 4195 -1, 0 }, 4196 { 0 } 4197 }; 4198 4199 static struct intr_info t5_pcie_intr_info[] = { 4200 { MSTGRPPERR_F, "Master Response Read Queue parity error", 4201 -1, 1 }, 4202 { MSTTIMEOUTPERR_F, "Master Timeout FIFO parity error", -1, 1 }, 4203 { MSIXSTIPERR_F, "MSI-X STI SRAM parity error", -1, 1 }, 4204 { MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 }, 4205 { MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 }, 4206 { MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 }, 4207 { MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 }, 4208 { PIOCPLGRPPERR_F, "PCI PIO completion Group FIFO parity error", 4209 -1, 1 }, 4210 { PIOREQGRPPERR_F, "PCI PIO request Group FIFO parity error", 4211 -1, 1 }, 4212 { TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 }, 4213 { MSTTAGQPERR_F, "PCI master tag queue parity error", -1, 1 }, 4214 { CREQPERR_F, "PCI CMD channel request parity error", -1, 1 }, 4215 { CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 }, 4216 { DREQWRPERR_F, "PCI DMA channel write request parity error", 4217 -1, 1 }, 4218 { DREQPERR_F, "PCI DMA channel request parity error", -1, 1 }, 4219 { DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 }, 4220 { HREQWRPERR_F, "PCI HMA channel count parity error", -1, 1 }, 4221 { HREQPERR_F, "PCI HMA channel request parity error", -1, 1 }, 4222 { HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 }, 4223 { CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 }, 4224 { FIDPERR_F, "PCI FID parity error", -1, 1 }, 4225 { VFIDPERR_F, "PCI INTx clear parity error", -1, 1 }, 4226 { MAGRPPERR_F, "PCI MA group FIFO parity error", -1, 1 }, 4227 { PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 }, 4228 { IPRXHDRGRPPERR_F, "PCI IP Rx header group parity error", 4229 -1, 1 }, 4230 { IPRXDATAGRPPERR_F, "PCI IP Rx data group parity error", 4231 -1, 1 }, 4232 { RPLPERR_F, "PCI IP replay buffer parity error", -1, 1 }, 4233 { IPSOTPERR_F, "PCI IP SOT buffer parity error", -1, 1 }, 4234 { TRGT1GRPPERR_F, "PCI TRGT1 group FIFOs parity error", -1, 1 }, 4235 { READRSPERR_F, "Outbound read error", -1, 0 }, 4236 { 0 } 4237 }; 4238 4239 int fat; 4240 4241 if (is_t4(adapter->params.chip)) 4242 fat = t4_handle_intr_status(adapter, 4243 PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS_A, 4244 sysbus_intr_info) + 4245 t4_handle_intr_status(adapter, 4246 PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS_A, 4247 pcie_port_intr_info) + 4248 t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A, 4249 pcie_intr_info); 4250 else 4251 fat = t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A, 4252 t5_pcie_intr_info); 4253 4254 if (fat) 4255 t4_fatal_err(adapter); 4256 } 4257 4258 /* 4259 * TP interrupt handler. 4260 */ 4261 static void tp_intr_handler(struct adapter *adapter) 4262 { 4263 static const struct intr_info tp_intr_info[] = { 4264 { 0x3fffffff, "TP parity error", -1, 1 }, 4265 { FLMTXFLSTEMPTY_F, "TP out of Tx pages", -1, 1 }, 4266 { 0 } 4267 }; 4268 4269 if (t4_handle_intr_status(adapter, TP_INT_CAUSE_A, tp_intr_info)) 4270 t4_fatal_err(adapter); 4271 } 4272 4273 /* 4274 * SGE interrupt handler. 4275 */ 4276 static void sge_intr_handler(struct adapter *adapter) 4277 { 4278 u64 v; 4279 u32 err; 4280 4281 static const struct intr_info sge_intr_info[] = { 4282 { ERR_CPL_EXCEED_IQE_SIZE_F, 4283 "SGE received CPL exceeding IQE size", -1, 1 }, 4284 { ERR_INVALID_CIDX_INC_F, 4285 "SGE GTS CIDX increment too large", -1, 0 }, 4286 { ERR_CPL_OPCODE_0_F, "SGE received 0-length CPL", -1, 0 }, 4287 { DBFIFO_LP_INT_F, NULL, -1, 0, t4_db_full }, 4288 { ERR_DATA_CPL_ON_HIGH_QID1_F | ERR_DATA_CPL_ON_HIGH_QID0_F, 4289 "SGE IQID > 1023 received CPL for FL", -1, 0 }, 4290 { ERR_BAD_DB_PIDX3_F, "SGE DBP 3 pidx increment too large", -1, 4291 0 }, 4292 { ERR_BAD_DB_PIDX2_F, "SGE DBP 2 pidx increment too large", -1, 4293 0 }, 4294 { ERR_BAD_DB_PIDX1_F, "SGE DBP 1 pidx increment too large", -1, 4295 0 }, 4296 { ERR_BAD_DB_PIDX0_F, "SGE DBP 0 pidx increment too large", -1, 4297 0 }, 4298 { ERR_ING_CTXT_PRIO_F, 4299 "SGE too many priority ingress contexts", -1, 0 }, 4300 { INGRESS_SIZE_ERR_F, "SGE illegal ingress QID", -1, 0 }, 4301 { EGRESS_SIZE_ERR_F, "SGE illegal egress QID", -1, 0 }, 4302 { 0 } 4303 }; 4304 4305 static struct intr_info t4t5_sge_intr_info[] = { 4306 { ERR_DROPPED_DB_F, NULL, -1, 0, t4_db_dropped }, 4307 { DBFIFO_HP_INT_F, NULL, -1, 0, t4_db_full }, 4308 { ERR_EGR_CTXT_PRIO_F, 4309 "SGE too many priority egress contexts", -1, 0 }, 4310 { 0 } 4311 }; 4312 4313 v = (u64)t4_read_reg(adapter, SGE_INT_CAUSE1_A) | 4314 ((u64)t4_read_reg(adapter, SGE_INT_CAUSE2_A) << 32); 4315 if (v) { 4316 dev_alert(adapter->pdev_dev, "SGE parity error (%#llx)\n", 4317 (unsigned long long)v); 4318 t4_write_reg(adapter, SGE_INT_CAUSE1_A, v); 4319 t4_write_reg(adapter, SGE_INT_CAUSE2_A, v >> 32); 4320 } 4321 4322 v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A, sge_intr_info); 4323 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) 4324 v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A, 4325 t4t5_sge_intr_info); 4326 4327 err = t4_read_reg(adapter, SGE_ERROR_STATS_A); 4328 if (err & ERROR_QID_VALID_F) { 4329 dev_err(adapter->pdev_dev, "SGE error for queue %u\n", 4330 ERROR_QID_G(err)); 4331 if (err & UNCAPTURED_ERROR_F) 4332 dev_err(adapter->pdev_dev, 4333 "SGE UNCAPTURED_ERROR set (clearing)\n"); 4334 t4_write_reg(adapter, SGE_ERROR_STATS_A, ERROR_QID_VALID_F | 4335 UNCAPTURED_ERROR_F); 4336 } 4337 4338 if (v != 0) 4339 t4_fatal_err(adapter); 4340 } 4341 4342 #define CIM_OBQ_INTR (OBQULP0PARERR_F | OBQULP1PARERR_F | OBQULP2PARERR_F |\ 4343 OBQULP3PARERR_F | OBQSGEPARERR_F | OBQNCSIPARERR_F) 4344 #define CIM_IBQ_INTR (IBQTP0PARERR_F | IBQTP1PARERR_F | IBQULPPARERR_F |\ 4345 IBQSGEHIPARERR_F | IBQSGELOPARERR_F | IBQNCSIPARERR_F) 4346 4347 /* 4348 * CIM interrupt handler. 4349 */ 4350 static void cim_intr_handler(struct adapter *adapter) 4351 { 4352 static const struct intr_info cim_intr_info[] = { 4353 { PREFDROPINT_F, "CIM control register prefetch drop", -1, 1 }, 4354 { CIM_OBQ_INTR, "CIM OBQ parity error", -1, 1 }, 4355 { CIM_IBQ_INTR, "CIM IBQ parity error", -1, 1 }, 4356 { MBUPPARERR_F, "CIM mailbox uP parity error", -1, 1 }, 4357 { MBHOSTPARERR_F, "CIM mailbox host parity error", -1, 1 }, 4358 { TIEQINPARERRINT_F, "CIM TIEQ outgoing parity error", -1, 1 }, 4359 { TIEQOUTPARERRINT_F, "CIM TIEQ incoming parity error", -1, 1 }, 4360 { TIMER0INT_F, "CIM TIMER0 interrupt", -1, 1 }, 4361 { 0 } 4362 }; 4363 static const struct intr_info cim_upintr_info[] = { 4364 { RSVDSPACEINT_F, "CIM reserved space access", -1, 1 }, 4365 { ILLTRANSINT_F, "CIM illegal transaction", -1, 1 }, 4366 { ILLWRINT_F, "CIM illegal write", -1, 1 }, 4367 { ILLRDINT_F, "CIM illegal read", -1, 1 }, 4368 { ILLRDBEINT_F, "CIM illegal read BE", -1, 1 }, 4369 { ILLWRBEINT_F, "CIM illegal write BE", -1, 1 }, 4370 { SGLRDBOOTINT_F, "CIM single read from boot space", -1, 1 }, 4371 { SGLWRBOOTINT_F, "CIM single write to boot space", -1, 1 }, 4372 { BLKWRBOOTINT_F, "CIM block write to boot space", -1, 1 }, 4373 { SGLRDFLASHINT_F, "CIM single read from flash space", -1, 1 }, 4374 { SGLWRFLASHINT_F, "CIM single write to flash space", -1, 1 }, 4375 { BLKWRFLASHINT_F, "CIM block write to flash space", -1, 1 }, 4376 { SGLRDEEPROMINT_F, "CIM single EEPROM read", -1, 1 }, 4377 { SGLWREEPROMINT_F, "CIM single EEPROM write", -1, 1 }, 4378 { BLKRDEEPROMINT_F, "CIM block EEPROM read", -1, 1 }, 4379 { BLKWREEPROMINT_F, "CIM block EEPROM write", -1, 1 }, 4380 { SGLRDCTLINT_F, "CIM single read from CTL space", -1, 1 }, 4381 { SGLWRCTLINT_F, "CIM single write to CTL space", -1, 1 }, 4382 { BLKRDCTLINT_F, "CIM block read from CTL space", -1, 1 }, 4383 { BLKWRCTLINT_F, "CIM block write to CTL space", -1, 1 }, 4384 { SGLRDPLINT_F, "CIM single read from PL space", -1, 1 }, 4385 { SGLWRPLINT_F, "CIM single write to PL space", -1, 1 }, 4386 { BLKRDPLINT_F, "CIM block read from PL space", -1, 1 }, 4387 { BLKWRPLINT_F, "CIM block write to PL space", -1, 1 }, 4388 { REQOVRLOOKUPINT_F, "CIM request FIFO overwrite", -1, 1 }, 4389 { RSPOVRLOOKUPINT_F, "CIM response FIFO overwrite", -1, 1 }, 4390 { TIMEOUTINT_F, "CIM PIF timeout", -1, 1 }, 4391 { TIMEOUTMAINT_F, "CIM PIF MA timeout", -1, 1 }, 4392 { 0 } 4393 }; 4394 4395 u32 val, fw_err; 4396 int fat; 4397 4398 fw_err = t4_read_reg(adapter, PCIE_FW_A); 4399 if (fw_err & PCIE_FW_ERR_F) 4400 t4_report_fw_error(adapter); 4401 4402 /* When the Firmware detects an internal error which normally 4403 * wouldn't raise a Host Interrupt, it forces a CIM Timer0 interrupt 4404 * in order to make sure the Host sees the Firmware Crash. So 4405 * if we have a Timer0 interrupt and don't see a Firmware Crash, 4406 * ignore the Timer0 interrupt. 4407 */ 4408 4409 val = t4_read_reg(adapter, CIM_HOST_INT_CAUSE_A); 4410 if (val & TIMER0INT_F) 4411 if (!(fw_err & PCIE_FW_ERR_F) || 4412 (PCIE_FW_EVAL_G(fw_err) != PCIE_FW_EVAL_CRASH)) 4413 t4_write_reg(adapter, CIM_HOST_INT_CAUSE_A, 4414 TIMER0INT_F); 4415 4416 fat = t4_handle_intr_status(adapter, CIM_HOST_INT_CAUSE_A, 4417 cim_intr_info) + 4418 t4_handle_intr_status(adapter, CIM_HOST_UPACC_INT_CAUSE_A, 4419 cim_upintr_info); 4420 if (fat) 4421 t4_fatal_err(adapter); 4422 } 4423 4424 /* 4425 * ULP RX interrupt handler. 4426 */ 4427 static void ulprx_intr_handler(struct adapter *adapter) 4428 { 4429 static const struct intr_info ulprx_intr_info[] = { 4430 { 0x1800000, "ULPRX context error", -1, 1 }, 4431 { 0x7fffff, "ULPRX parity error", -1, 1 }, 4432 { 0 } 4433 }; 4434 4435 if (t4_handle_intr_status(adapter, ULP_RX_INT_CAUSE_A, ulprx_intr_info)) 4436 t4_fatal_err(adapter); 4437 } 4438 4439 /* 4440 * ULP TX interrupt handler. 4441 */ 4442 static void ulptx_intr_handler(struct adapter *adapter) 4443 { 4444 static const struct intr_info ulptx_intr_info[] = { 4445 { PBL_BOUND_ERR_CH3_F, "ULPTX channel 3 PBL out of bounds", -1, 4446 0 }, 4447 { PBL_BOUND_ERR_CH2_F, "ULPTX channel 2 PBL out of bounds", -1, 4448 0 }, 4449 { PBL_BOUND_ERR_CH1_F, "ULPTX channel 1 PBL out of bounds", -1, 4450 0 }, 4451 { PBL_BOUND_ERR_CH0_F, "ULPTX channel 0 PBL out of bounds", -1, 4452 0 }, 4453 { 0xfffffff, "ULPTX parity error", -1, 1 }, 4454 { 0 } 4455 }; 4456 4457 if (t4_handle_intr_status(adapter, ULP_TX_INT_CAUSE_A, ulptx_intr_info)) 4458 t4_fatal_err(adapter); 4459 } 4460 4461 /* 4462 * PM TX interrupt handler. 4463 */ 4464 static void pmtx_intr_handler(struct adapter *adapter) 4465 { 4466 static const struct intr_info pmtx_intr_info[] = { 4467 { PCMD_LEN_OVFL0_F, "PMTX channel 0 pcmd too large", -1, 1 }, 4468 { PCMD_LEN_OVFL1_F, "PMTX channel 1 pcmd too large", -1, 1 }, 4469 { PCMD_LEN_OVFL2_F, "PMTX channel 2 pcmd too large", -1, 1 }, 4470 { ZERO_C_CMD_ERROR_F, "PMTX 0-length pcmd", -1, 1 }, 4471 { PMTX_FRAMING_ERROR_F, "PMTX framing error", -1, 1 }, 4472 { OESPI_PAR_ERROR_F, "PMTX oespi parity error", -1, 1 }, 4473 { DB_OPTIONS_PAR_ERROR_F, "PMTX db_options parity error", 4474 -1, 1 }, 4475 { ICSPI_PAR_ERROR_F, "PMTX icspi parity error", -1, 1 }, 4476 { PMTX_C_PCMD_PAR_ERROR_F, "PMTX c_pcmd parity error", -1, 1}, 4477 { 0 } 4478 }; 4479 4480 if (t4_handle_intr_status(adapter, PM_TX_INT_CAUSE_A, pmtx_intr_info)) 4481 t4_fatal_err(adapter); 4482 } 4483 4484 /* 4485 * PM RX interrupt handler. 4486 */ 4487 static void pmrx_intr_handler(struct adapter *adapter) 4488 { 4489 static const struct intr_info pmrx_intr_info[] = { 4490 { ZERO_E_CMD_ERROR_F, "PMRX 0-length pcmd", -1, 1 }, 4491 { PMRX_FRAMING_ERROR_F, "PMRX framing error", -1, 1 }, 4492 { OCSPI_PAR_ERROR_F, "PMRX ocspi parity error", -1, 1 }, 4493 { DB_OPTIONS_PAR_ERROR_F, "PMRX db_options parity error", 4494 -1, 1 }, 4495 { IESPI_PAR_ERROR_F, "PMRX iespi parity error", -1, 1 }, 4496 { PMRX_E_PCMD_PAR_ERROR_F, "PMRX e_pcmd parity error", -1, 1}, 4497 { 0 } 4498 }; 4499 4500 if (t4_handle_intr_status(adapter, PM_RX_INT_CAUSE_A, pmrx_intr_info)) 4501 t4_fatal_err(adapter); 4502 } 4503 4504 /* 4505 * CPL switch interrupt handler. 4506 */ 4507 static void cplsw_intr_handler(struct adapter *adapter) 4508 { 4509 static const struct intr_info cplsw_intr_info[] = { 4510 { CIM_OP_MAP_PERR_F, "CPLSW CIM op_map parity error", -1, 1 }, 4511 { CIM_OVFL_ERROR_F, "CPLSW CIM overflow", -1, 1 }, 4512 { TP_FRAMING_ERROR_F, "CPLSW TP framing error", -1, 1 }, 4513 { SGE_FRAMING_ERROR_F, "CPLSW SGE framing error", -1, 1 }, 4514 { CIM_FRAMING_ERROR_F, "CPLSW CIM framing error", -1, 1 }, 4515 { ZERO_SWITCH_ERROR_F, "CPLSW no-switch error", -1, 1 }, 4516 { 0 } 4517 }; 4518 4519 if (t4_handle_intr_status(adapter, CPL_INTR_CAUSE_A, cplsw_intr_info)) 4520 t4_fatal_err(adapter); 4521 } 4522 4523 /* 4524 * LE interrupt handler. 4525 */ 4526 static void le_intr_handler(struct adapter *adap) 4527 { 4528 enum chip_type chip = CHELSIO_CHIP_VERSION(adap->params.chip); 4529 static const struct intr_info le_intr_info[] = { 4530 { LIPMISS_F, "LE LIP miss", -1, 0 }, 4531 { LIP0_F, "LE 0 LIP error", -1, 0 }, 4532 { PARITYERR_F, "LE parity error", -1, 1 }, 4533 { UNKNOWNCMD_F, "LE unknown command", -1, 1 }, 4534 { REQQPARERR_F, "LE request queue parity error", -1, 1 }, 4535 { 0 } 4536 }; 4537 4538 static struct intr_info t6_le_intr_info[] = { 4539 { T6_LIPMISS_F, "LE LIP miss", -1, 0 }, 4540 { T6_LIP0_F, "LE 0 LIP error", -1, 0 }, 4541 { TCAMINTPERR_F, "LE parity error", -1, 1 }, 4542 { T6_UNKNOWNCMD_F, "LE unknown command", -1, 1 }, 4543 { SSRAMINTPERR_F, "LE request queue parity error", -1, 1 }, 4544 { 0 } 4545 }; 4546 4547 if (t4_handle_intr_status(adap, LE_DB_INT_CAUSE_A, 4548 (chip <= CHELSIO_T5) ? 4549 le_intr_info : t6_le_intr_info)) 4550 t4_fatal_err(adap); 4551 } 4552 4553 /* 4554 * MPS interrupt handler. 4555 */ 4556 static void mps_intr_handler(struct adapter *adapter) 4557 { 4558 static const struct intr_info mps_rx_intr_info[] = { 4559 { 0xffffff, "MPS Rx parity error", -1, 1 }, 4560 { 0 } 4561 }; 4562 static const struct intr_info mps_tx_intr_info[] = { 4563 { TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 }, 4564 { NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 }, 4565 { TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error", 4566 -1, 1 }, 4567 { TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error", 4568 -1, 1 }, 4569 { BUBBLE_F, "MPS Tx underflow", -1, 1 }, 4570 { SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 }, 4571 { FRMERR_F, "MPS Tx framing error", -1, 1 }, 4572 { 0 } 4573 }; 4574 static const struct intr_info t6_mps_tx_intr_info[] = { 4575 { TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 }, 4576 { NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 }, 4577 { TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error", 4578 -1, 1 }, 4579 { TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error", 4580 -1, 1 }, 4581 /* MPS Tx Bubble is normal for T6 */ 4582 { SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 }, 4583 { FRMERR_F, "MPS Tx framing error", -1, 1 }, 4584 { 0 } 4585 }; 4586 static const struct intr_info mps_trc_intr_info[] = { 4587 { FILTMEM_V(FILTMEM_M), "MPS TRC filter parity error", -1, 1 }, 4588 { PKTFIFO_V(PKTFIFO_M), "MPS TRC packet FIFO parity error", 4589 -1, 1 }, 4590 { MISCPERR_F, "MPS TRC misc parity error", -1, 1 }, 4591 { 0 } 4592 }; 4593 static const struct intr_info mps_stat_sram_intr_info[] = { 4594 { 0x1fffff, "MPS statistics SRAM parity error", -1, 1 }, 4595 { 0 } 4596 }; 4597 static const struct intr_info mps_stat_tx_intr_info[] = { 4598 { 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 }, 4599 { 0 } 4600 }; 4601 static const struct intr_info mps_stat_rx_intr_info[] = { 4602 { 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 }, 4603 { 0 } 4604 }; 4605 static const struct intr_info mps_cls_intr_info[] = { 4606 { MATCHSRAM_F, "MPS match SRAM parity error", -1, 1 }, 4607 { MATCHTCAM_F, "MPS match TCAM parity error", -1, 1 }, 4608 { HASHSRAM_F, "MPS hash SRAM parity error", -1, 1 }, 4609 { 0 } 4610 }; 4611 4612 int fat; 4613 4614 fat = t4_handle_intr_status(adapter, MPS_RX_PERR_INT_CAUSE_A, 4615 mps_rx_intr_info) + 4616 t4_handle_intr_status(adapter, MPS_TX_INT_CAUSE_A, 4617 is_t6(adapter->params.chip) 4618 ? t6_mps_tx_intr_info 4619 : mps_tx_intr_info) + 4620 t4_handle_intr_status(adapter, MPS_TRC_INT_CAUSE_A, 4621 mps_trc_intr_info) + 4622 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_SRAM_A, 4623 mps_stat_sram_intr_info) + 4624 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_TX_FIFO_A, 4625 mps_stat_tx_intr_info) + 4626 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_RX_FIFO_A, 4627 mps_stat_rx_intr_info) + 4628 t4_handle_intr_status(adapter, MPS_CLS_INT_CAUSE_A, 4629 mps_cls_intr_info); 4630 4631 t4_write_reg(adapter, MPS_INT_CAUSE_A, 0); 4632 t4_read_reg(adapter, MPS_INT_CAUSE_A); /* flush */ 4633 if (fat) 4634 t4_fatal_err(adapter); 4635 } 4636 4637 #define MEM_INT_MASK (PERR_INT_CAUSE_F | ECC_CE_INT_CAUSE_F | \ 4638 ECC_UE_INT_CAUSE_F) 4639 4640 /* 4641 * EDC/MC interrupt handler. 4642 */ 4643 static void mem_intr_handler(struct adapter *adapter, int idx) 4644 { 4645 static const char name[4][7] = { "EDC0", "EDC1", "MC/MC0", "MC1" }; 4646 4647 unsigned int addr, cnt_addr, v; 4648 4649 if (idx <= MEM_EDC1) { 4650 addr = EDC_REG(EDC_INT_CAUSE_A, idx); 4651 cnt_addr = EDC_REG(EDC_ECC_STATUS_A, idx); 4652 } else if (idx == MEM_MC) { 4653 if (is_t4(adapter->params.chip)) { 4654 addr = MC_INT_CAUSE_A; 4655 cnt_addr = MC_ECC_STATUS_A; 4656 } else { 4657 addr = MC_P_INT_CAUSE_A; 4658 cnt_addr = MC_P_ECC_STATUS_A; 4659 } 4660 } else { 4661 addr = MC_REG(MC_P_INT_CAUSE_A, 1); 4662 cnt_addr = MC_REG(MC_P_ECC_STATUS_A, 1); 4663 } 4664 4665 v = t4_read_reg(adapter, addr) & MEM_INT_MASK; 4666 if (v & PERR_INT_CAUSE_F) 4667 dev_alert(adapter->pdev_dev, "%s FIFO parity error\n", 4668 name[idx]); 4669 if (v & ECC_CE_INT_CAUSE_F) { 4670 u32 cnt = ECC_CECNT_G(t4_read_reg(adapter, cnt_addr)); 4671 4672 t4_edc_err_read(adapter, idx); 4673 4674 t4_write_reg(adapter, cnt_addr, ECC_CECNT_V(ECC_CECNT_M)); 4675 if (printk_ratelimit()) 4676 dev_warn(adapter->pdev_dev, 4677 "%u %s correctable ECC data error%s\n", 4678 cnt, name[idx], cnt > 1 ? "s" : ""); 4679 } 4680 if (v & ECC_UE_INT_CAUSE_F) 4681 dev_alert(adapter->pdev_dev, 4682 "%s uncorrectable ECC data error\n", name[idx]); 4683 4684 t4_write_reg(adapter, addr, v); 4685 if (v & (PERR_INT_CAUSE_F | ECC_UE_INT_CAUSE_F)) 4686 t4_fatal_err(adapter); 4687 } 4688 4689 /* 4690 * MA interrupt handler. 4691 */ 4692 static void ma_intr_handler(struct adapter *adap) 4693 { 4694 u32 v, status = t4_read_reg(adap, MA_INT_CAUSE_A); 4695 4696 if (status & MEM_PERR_INT_CAUSE_F) { 4697 dev_alert(adap->pdev_dev, 4698 "MA parity error, parity status %#x\n", 4699 t4_read_reg(adap, MA_PARITY_ERROR_STATUS1_A)); 4700 if (is_t5(adap->params.chip)) 4701 dev_alert(adap->pdev_dev, 4702 "MA parity error, parity status %#x\n", 4703 t4_read_reg(adap, 4704 MA_PARITY_ERROR_STATUS2_A)); 4705 } 4706 if (status & MEM_WRAP_INT_CAUSE_F) { 4707 v = t4_read_reg(adap, MA_INT_WRAP_STATUS_A); 4708 dev_alert(adap->pdev_dev, "MA address wrap-around error by " 4709 "client %u to address %#x\n", 4710 MEM_WRAP_CLIENT_NUM_G(v), 4711 MEM_WRAP_ADDRESS_G(v) << 4); 4712 } 4713 t4_write_reg(adap, MA_INT_CAUSE_A, status); 4714 t4_fatal_err(adap); 4715 } 4716 4717 /* 4718 * SMB interrupt handler. 4719 */ 4720 static void smb_intr_handler(struct adapter *adap) 4721 { 4722 static const struct intr_info smb_intr_info[] = { 4723 { MSTTXFIFOPARINT_F, "SMB master Tx FIFO parity error", -1, 1 }, 4724 { MSTRXFIFOPARINT_F, "SMB master Rx FIFO parity error", -1, 1 }, 4725 { SLVFIFOPARINT_F, "SMB slave FIFO parity error", -1, 1 }, 4726 { 0 } 4727 }; 4728 4729 if (t4_handle_intr_status(adap, SMB_INT_CAUSE_A, smb_intr_info)) 4730 t4_fatal_err(adap); 4731 } 4732 4733 /* 4734 * NC-SI interrupt handler. 4735 */ 4736 static void ncsi_intr_handler(struct adapter *adap) 4737 { 4738 static const struct intr_info ncsi_intr_info[] = { 4739 { CIM_DM_PRTY_ERR_F, "NC-SI CIM parity error", -1, 1 }, 4740 { MPS_DM_PRTY_ERR_F, "NC-SI MPS parity error", -1, 1 }, 4741 { TXFIFO_PRTY_ERR_F, "NC-SI Tx FIFO parity error", -1, 1 }, 4742 { RXFIFO_PRTY_ERR_F, "NC-SI Rx FIFO parity error", -1, 1 }, 4743 { 0 } 4744 }; 4745 4746 if (t4_handle_intr_status(adap, NCSI_INT_CAUSE_A, ncsi_intr_info)) 4747 t4_fatal_err(adap); 4748 } 4749 4750 /* 4751 * XGMAC interrupt handler. 4752 */ 4753 static void xgmac_intr_handler(struct adapter *adap, int port) 4754 { 4755 u32 v, int_cause_reg; 4756 4757 if (is_t4(adap->params.chip)) 4758 int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE_A); 4759 else 4760 int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE_A); 4761 4762 v = t4_read_reg(adap, int_cause_reg); 4763 4764 v &= TXFIFO_PRTY_ERR_F | RXFIFO_PRTY_ERR_F; 4765 if (!v) 4766 return; 4767 4768 if (v & TXFIFO_PRTY_ERR_F) 4769 dev_alert(adap->pdev_dev, "XGMAC %d Tx FIFO parity error\n", 4770 port); 4771 if (v & RXFIFO_PRTY_ERR_F) 4772 dev_alert(adap->pdev_dev, "XGMAC %d Rx FIFO parity error\n", 4773 port); 4774 t4_write_reg(adap, PORT_REG(port, XGMAC_PORT_INT_CAUSE_A), v); 4775 t4_fatal_err(adap); 4776 } 4777 4778 /* 4779 * PL interrupt handler. 4780 */ 4781 static void pl_intr_handler(struct adapter *adap) 4782 { 4783 static const struct intr_info pl_intr_info[] = { 4784 { FATALPERR_F, "T4 fatal parity error", -1, 1 }, 4785 { PERRVFID_F, "PL VFID_MAP parity error", -1, 1 }, 4786 { 0 } 4787 }; 4788 4789 if (t4_handle_intr_status(adap, PL_PL_INT_CAUSE_A, pl_intr_info)) 4790 t4_fatal_err(adap); 4791 } 4792 4793 #define PF_INTR_MASK (PFSW_F) 4794 #define GLBL_INTR_MASK (CIM_F | MPS_F | PL_F | PCIE_F | MC_F | EDC0_F | \ 4795 EDC1_F | LE_F | TP_F | MA_F | PM_TX_F | PM_RX_F | ULP_RX_F | \ 4796 CPL_SWITCH_F | SGE_F | ULP_TX_F | SF_F) 4797 4798 /** 4799 * t4_slow_intr_handler - control path interrupt handler 4800 * @adapter: the adapter 4801 * 4802 * T4 interrupt handler for non-data global interrupt events, e.g., errors. 4803 * The designation 'slow' is because it involves register reads, while 4804 * data interrupts typically don't involve any MMIOs. 4805 */ 4806 int t4_slow_intr_handler(struct adapter *adapter) 4807 { 4808 u32 cause = t4_read_reg(adapter, PL_INT_CAUSE_A); 4809 4810 if (!(cause & GLBL_INTR_MASK)) 4811 return 0; 4812 if (cause & CIM_F) 4813 cim_intr_handler(adapter); 4814 if (cause & MPS_F) 4815 mps_intr_handler(adapter); 4816 if (cause & NCSI_F) 4817 ncsi_intr_handler(adapter); 4818 if (cause & PL_F) 4819 pl_intr_handler(adapter); 4820 if (cause & SMB_F) 4821 smb_intr_handler(adapter); 4822 if (cause & XGMAC0_F) 4823 xgmac_intr_handler(adapter, 0); 4824 if (cause & XGMAC1_F) 4825 xgmac_intr_handler(adapter, 1); 4826 if (cause & XGMAC_KR0_F) 4827 xgmac_intr_handler(adapter, 2); 4828 if (cause & XGMAC_KR1_F) 4829 xgmac_intr_handler(adapter, 3); 4830 if (cause & PCIE_F) 4831 pcie_intr_handler(adapter); 4832 if (cause & MC_F) 4833 mem_intr_handler(adapter, MEM_MC); 4834 if (is_t5(adapter->params.chip) && (cause & MC1_F)) 4835 mem_intr_handler(adapter, MEM_MC1); 4836 if (cause & EDC0_F) 4837 mem_intr_handler(adapter, MEM_EDC0); 4838 if (cause & EDC1_F) 4839 mem_intr_handler(adapter, MEM_EDC1); 4840 if (cause & LE_F) 4841 le_intr_handler(adapter); 4842 if (cause & TP_F) 4843 tp_intr_handler(adapter); 4844 if (cause & MA_F) 4845 ma_intr_handler(adapter); 4846 if (cause & PM_TX_F) 4847 pmtx_intr_handler(adapter); 4848 if (cause & PM_RX_F) 4849 pmrx_intr_handler(adapter); 4850 if (cause & ULP_RX_F) 4851 ulprx_intr_handler(adapter); 4852 if (cause & CPL_SWITCH_F) 4853 cplsw_intr_handler(adapter); 4854 if (cause & SGE_F) 4855 sge_intr_handler(adapter); 4856 if (cause & ULP_TX_F) 4857 ulptx_intr_handler(adapter); 4858 4859 /* Clear the interrupts just processed for which we are the master. */ 4860 t4_write_reg(adapter, PL_INT_CAUSE_A, cause & GLBL_INTR_MASK); 4861 (void)t4_read_reg(adapter, PL_INT_CAUSE_A); /* flush */ 4862 return 1; 4863 } 4864 4865 /** 4866 * t4_intr_enable - enable interrupts 4867 * @adapter: the adapter whose interrupts should be enabled 4868 * 4869 * Enable PF-specific interrupts for the calling function and the top-level 4870 * interrupt concentrator for global interrupts. Interrupts are already 4871 * enabled at each module, here we just enable the roots of the interrupt 4872 * hierarchies. 4873 * 4874 * Note: this function should be called only when the driver manages 4875 * non PF-specific interrupts from the various HW modules. Only one PCI 4876 * function at a time should be doing this. 4877 */ 4878 void t4_intr_enable(struct adapter *adapter) 4879 { 4880 u32 val = 0; 4881 u32 whoami = t4_read_reg(adapter, PL_WHOAMI_A); 4882 u32 pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ? 4883 SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami); 4884 4885 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) 4886 val = ERR_DROPPED_DB_F | ERR_EGR_CTXT_PRIO_F | DBFIFO_HP_INT_F; 4887 t4_write_reg(adapter, SGE_INT_ENABLE3_A, ERR_CPL_EXCEED_IQE_SIZE_F | 4888 ERR_INVALID_CIDX_INC_F | ERR_CPL_OPCODE_0_F | 4889 ERR_DATA_CPL_ON_HIGH_QID1_F | INGRESS_SIZE_ERR_F | 4890 ERR_DATA_CPL_ON_HIGH_QID0_F | ERR_BAD_DB_PIDX3_F | 4891 ERR_BAD_DB_PIDX2_F | ERR_BAD_DB_PIDX1_F | 4892 ERR_BAD_DB_PIDX0_F | ERR_ING_CTXT_PRIO_F | 4893 DBFIFO_LP_INT_F | EGRESS_SIZE_ERR_F | val); 4894 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), PF_INTR_MASK); 4895 t4_set_reg_field(adapter, PL_INT_MAP0_A, 0, 1 << pf); 4896 } 4897 4898 /** 4899 * t4_intr_disable - disable interrupts 4900 * @adapter: the adapter whose interrupts should be disabled 4901 * 4902 * Disable interrupts. We only disable the top-level interrupt 4903 * concentrators. The caller must be a PCI function managing global 4904 * interrupts. 4905 */ 4906 void t4_intr_disable(struct adapter *adapter) 4907 { 4908 u32 whoami, pf; 4909 4910 if (pci_channel_offline(adapter->pdev)) 4911 return; 4912 4913 whoami = t4_read_reg(adapter, PL_WHOAMI_A); 4914 pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ? 4915 SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami); 4916 4917 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), 0); 4918 t4_set_reg_field(adapter, PL_INT_MAP0_A, 1 << pf, 0); 4919 } 4920 4921 unsigned int t4_chip_rss_size(struct adapter *adap) 4922 { 4923 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5) 4924 return RSS_NENTRIES; 4925 else 4926 return T6_RSS_NENTRIES; 4927 } 4928 4929 /** 4930 * t4_config_rss_range - configure a portion of the RSS mapping table 4931 * @adapter: the adapter 4932 * @mbox: mbox to use for the FW command 4933 * @viid: virtual interface whose RSS subtable is to be written 4934 * @start: start entry in the table to write 4935 * @n: how many table entries to write 4936 * @rspq: values for the response queue lookup table 4937 * @nrspq: number of values in @rspq 4938 * 4939 * Programs the selected part of the VI's RSS mapping table with the 4940 * provided values. If @nrspq < @n the supplied values are used repeatedly 4941 * until the full table range is populated. 4942 * 4943 * The caller must ensure the values in @rspq are in the range allowed for 4944 * @viid. 4945 */ 4946 int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid, 4947 int start, int n, const u16 *rspq, unsigned int nrspq) 4948 { 4949 int ret; 4950 const u16 *rsp = rspq; 4951 const u16 *rsp_end = rspq + nrspq; 4952 struct fw_rss_ind_tbl_cmd cmd; 4953 4954 memset(&cmd, 0, sizeof(cmd)); 4955 cmd.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_IND_TBL_CMD) | 4956 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 4957 FW_RSS_IND_TBL_CMD_VIID_V(viid)); 4958 cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd)); 4959 4960 /* each fw_rss_ind_tbl_cmd takes up to 32 entries */ 4961 while (n > 0) { 4962 int nq = min(n, 32); 4963 __be32 *qp = &cmd.iq0_to_iq2; 4964 4965 cmd.niqid = cpu_to_be16(nq); 4966 cmd.startidx = cpu_to_be16(start); 4967 4968 start += nq; 4969 n -= nq; 4970 4971 while (nq > 0) { 4972 unsigned int v; 4973 4974 v = FW_RSS_IND_TBL_CMD_IQ0_V(*rsp); 4975 if (++rsp >= rsp_end) 4976 rsp = rspq; 4977 v |= FW_RSS_IND_TBL_CMD_IQ1_V(*rsp); 4978 if (++rsp >= rsp_end) 4979 rsp = rspq; 4980 v |= FW_RSS_IND_TBL_CMD_IQ2_V(*rsp); 4981 if (++rsp >= rsp_end) 4982 rsp = rspq; 4983 4984 *qp++ = cpu_to_be32(v); 4985 nq -= 3; 4986 } 4987 4988 ret = t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL); 4989 if (ret) 4990 return ret; 4991 } 4992 return 0; 4993 } 4994 4995 /** 4996 * t4_config_glbl_rss - configure the global RSS mode 4997 * @adapter: the adapter 4998 * @mbox: mbox to use for the FW command 4999 * @mode: global RSS mode 5000 * @flags: mode-specific flags 5001 * 5002 * Sets the global RSS mode. 5003 */ 5004 int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode, 5005 unsigned int flags) 5006 { 5007 struct fw_rss_glb_config_cmd c; 5008 5009 memset(&c, 0, sizeof(c)); 5010 c.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_RSS_GLB_CONFIG_CMD) | 5011 FW_CMD_REQUEST_F | FW_CMD_WRITE_F); 5012 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 5013 if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_MANUAL) { 5014 c.u.manual.mode_pkd = 5015 cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode)); 5016 } else if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) { 5017 c.u.basicvirtual.mode_pkd = 5018 cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode)); 5019 c.u.basicvirtual.synmapen_to_hashtoeplitz = cpu_to_be32(flags); 5020 } else 5021 return -EINVAL; 5022 return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL); 5023 } 5024 5025 /** 5026 * t4_config_vi_rss - configure per VI RSS settings 5027 * @adapter: the adapter 5028 * @mbox: mbox to use for the FW command 5029 * @viid: the VI id 5030 * @flags: RSS flags 5031 * @defq: id of the default RSS queue for the VI. 5032 * 5033 * Configures VI-specific RSS properties. 5034 */ 5035 int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid, 5036 unsigned int flags, unsigned int defq) 5037 { 5038 struct fw_rss_vi_config_cmd c; 5039 5040 memset(&c, 0, sizeof(c)); 5041 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) | 5042 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 5043 FW_RSS_VI_CONFIG_CMD_VIID_V(viid)); 5044 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 5045 c.u.basicvirtual.defaultq_to_udpen = cpu_to_be32(flags | 5046 FW_RSS_VI_CONFIG_CMD_DEFAULTQ_V(defq)); 5047 return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL); 5048 } 5049 5050 /* Read an RSS table row */ 5051 static int rd_rss_row(struct adapter *adap, int row, u32 *val) 5052 { 5053 t4_write_reg(adap, TP_RSS_LKP_TABLE_A, 0xfff00000 | row); 5054 return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE_A, LKPTBLROWVLD_F, 1, 5055 5, 0, val); 5056 } 5057 5058 /** 5059 * t4_read_rss - read the contents of the RSS mapping table 5060 * @adapter: the adapter 5061 * @map: holds the contents of the RSS mapping table 5062 * 5063 * Reads the contents of the RSS hash->queue mapping table. 5064 */ 5065 int t4_read_rss(struct adapter *adapter, u16 *map) 5066 { 5067 int i, ret, nentries; 5068 u32 val; 5069 5070 nentries = t4_chip_rss_size(adapter); 5071 for (i = 0; i < nentries / 2; ++i) { 5072 ret = rd_rss_row(adapter, i, &val); 5073 if (ret) 5074 return ret; 5075 *map++ = LKPTBLQUEUE0_G(val); 5076 *map++ = LKPTBLQUEUE1_G(val); 5077 } 5078 return 0; 5079 } 5080 5081 static unsigned int t4_use_ldst(struct adapter *adap) 5082 { 5083 return (adap->flags & FW_OK) && !adap->use_bd; 5084 } 5085 5086 /** 5087 * t4_tp_fw_ldst_rw - Access TP indirect register through LDST 5088 * @adap: the adapter 5089 * @cmd: TP fw ldst address space type 5090 * @vals: where the indirect register values are stored/written 5091 * @nregs: how many indirect registers to read/write 5092 * @start_idx: index of first indirect register to read/write 5093 * @rw: Read (1) or Write (0) 5094 * @sleep_ok: if true we may sleep while awaiting command completion 5095 * 5096 * Access TP indirect registers through LDST 5097 */ 5098 static int t4_tp_fw_ldst_rw(struct adapter *adap, int cmd, u32 *vals, 5099 unsigned int nregs, unsigned int start_index, 5100 unsigned int rw, bool sleep_ok) 5101 { 5102 int ret = 0; 5103 unsigned int i; 5104 struct fw_ldst_cmd c; 5105 5106 for (i = 0; i < nregs; i++) { 5107 memset(&c, 0, sizeof(c)); 5108 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 5109 FW_CMD_REQUEST_F | 5110 (rw ? FW_CMD_READ_F : 5111 FW_CMD_WRITE_F) | 5112 FW_LDST_CMD_ADDRSPACE_V(cmd)); 5113 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 5114 5115 c.u.addrval.addr = cpu_to_be32(start_index + i); 5116 c.u.addrval.val = rw ? 0 : cpu_to_be32(vals[i]); 5117 ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, 5118 sleep_ok); 5119 if (ret) 5120 return ret; 5121 5122 if (rw) 5123 vals[i] = be32_to_cpu(c.u.addrval.val); 5124 } 5125 return 0; 5126 } 5127 5128 /** 5129 * t4_tp_indirect_rw - Read/Write TP indirect register through LDST or backdoor 5130 * @adap: the adapter 5131 * @reg_addr: Address Register 5132 * @reg_data: Data register 5133 * @buff: where the indirect register values are stored/written 5134 * @nregs: how many indirect registers to read/write 5135 * @start_index: index of first indirect register to read/write 5136 * @rw: READ(1) or WRITE(0) 5137 * @sleep_ok: if true we may sleep while awaiting command completion 5138 * 5139 * Read/Write TP indirect registers through LDST if possible. 5140 * Else, use backdoor access 5141 **/ 5142 static void t4_tp_indirect_rw(struct adapter *adap, u32 reg_addr, u32 reg_data, 5143 u32 *buff, u32 nregs, u32 start_index, int rw, 5144 bool sleep_ok) 5145 { 5146 int rc = -EINVAL; 5147 int cmd; 5148 5149 switch (reg_addr) { 5150 case TP_PIO_ADDR_A: 5151 cmd = FW_LDST_ADDRSPC_TP_PIO; 5152 break; 5153 case TP_TM_PIO_ADDR_A: 5154 cmd = FW_LDST_ADDRSPC_TP_TM_PIO; 5155 break; 5156 case TP_MIB_INDEX_A: 5157 cmd = FW_LDST_ADDRSPC_TP_MIB; 5158 break; 5159 default: 5160 goto indirect_access; 5161 } 5162 5163 if (t4_use_ldst(adap)) 5164 rc = t4_tp_fw_ldst_rw(adap, cmd, buff, nregs, start_index, rw, 5165 sleep_ok); 5166 5167 indirect_access: 5168 5169 if (rc) { 5170 if (rw) 5171 t4_read_indirect(adap, reg_addr, reg_data, buff, nregs, 5172 start_index); 5173 else 5174 t4_write_indirect(adap, reg_addr, reg_data, buff, nregs, 5175 start_index); 5176 } 5177 } 5178 5179 /** 5180 * t4_tp_pio_read - Read TP PIO registers 5181 * @adap: the adapter 5182 * @buff: where the indirect register values are written 5183 * @nregs: how many indirect registers to read 5184 * @start_index: index of first indirect register to read 5185 * @sleep_ok: if true we may sleep while awaiting command completion 5186 * 5187 * Read TP PIO Registers 5188 **/ 5189 void t4_tp_pio_read(struct adapter *adap, u32 *buff, u32 nregs, 5190 u32 start_index, bool sleep_ok) 5191 { 5192 t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs, 5193 start_index, 1, sleep_ok); 5194 } 5195 5196 /** 5197 * t4_tp_pio_write - Write TP PIO registers 5198 * @adap: the adapter 5199 * @buff: where the indirect register values are stored 5200 * @nregs: how many indirect registers to write 5201 * @start_index: index of first indirect register to write 5202 * @sleep_ok: if true we may sleep while awaiting command completion 5203 * 5204 * Write TP PIO Registers 5205 **/ 5206 static void t4_tp_pio_write(struct adapter *adap, u32 *buff, u32 nregs, 5207 u32 start_index, bool sleep_ok) 5208 { 5209 t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs, 5210 start_index, 0, sleep_ok); 5211 } 5212 5213 /** 5214 * t4_tp_tm_pio_read - Read TP TM PIO registers 5215 * @adap: the adapter 5216 * @buff: where the indirect register values are written 5217 * @nregs: how many indirect registers to read 5218 * @start_index: index of first indirect register to read 5219 * @sleep_ok: if true we may sleep while awaiting command completion 5220 * 5221 * Read TP TM PIO Registers 5222 **/ 5223 void t4_tp_tm_pio_read(struct adapter *adap, u32 *buff, u32 nregs, 5224 u32 start_index, bool sleep_ok) 5225 { 5226 t4_tp_indirect_rw(adap, TP_TM_PIO_ADDR_A, TP_TM_PIO_DATA_A, buff, 5227 nregs, start_index, 1, sleep_ok); 5228 } 5229 5230 /** 5231 * t4_tp_mib_read - Read TP MIB registers 5232 * @adap: the adapter 5233 * @buff: where the indirect register values are written 5234 * @nregs: how many indirect registers to read 5235 * @start_index: index of first indirect register to read 5236 * @sleep_ok: if true we may sleep while awaiting command completion 5237 * 5238 * Read TP MIB Registers 5239 **/ 5240 void t4_tp_mib_read(struct adapter *adap, u32 *buff, u32 nregs, u32 start_index, 5241 bool sleep_ok) 5242 { 5243 t4_tp_indirect_rw(adap, TP_MIB_INDEX_A, TP_MIB_DATA_A, buff, nregs, 5244 start_index, 1, sleep_ok); 5245 } 5246 5247 /** 5248 * t4_read_rss_key - read the global RSS key 5249 * @adap: the adapter 5250 * @key: 10-entry array holding the 320-bit RSS key 5251 * @sleep_ok: if true we may sleep while awaiting command completion 5252 * 5253 * Reads the global 320-bit RSS key. 5254 */ 5255 void t4_read_rss_key(struct adapter *adap, u32 *key, bool sleep_ok) 5256 { 5257 t4_tp_pio_read(adap, key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok); 5258 } 5259 5260 /** 5261 * t4_write_rss_key - program one of the RSS keys 5262 * @adap: the adapter 5263 * @key: 10-entry array holding the 320-bit RSS key 5264 * @idx: which RSS key to write 5265 * @sleep_ok: if true we may sleep while awaiting command completion 5266 * 5267 * Writes one of the RSS keys with the given 320-bit value. If @idx is 5268 * 0..15 the corresponding entry in the RSS key table is written, 5269 * otherwise the global RSS key is written. 5270 */ 5271 void t4_write_rss_key(struct adapter *adap, const u32 *key, int idx, 5272 bool sleep_ok) 5273 { 5274 u8 rss_key_addr_cnt = 16; 5275 u32 vrt = t4_read_reg(adap, TP_RSS_CONFIG_VRT_A); 5276 5277 /* T6 and later: for KeyMode 3 (per-vf and per-vf scramble), 5278 * allows access to key addresses 16-63 by using KeyWrAddrX 5279 * as index[5:4](upper 2) into key table 5280 */ 5281 if ((CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) && 5282 (vrt & KEYEXTEND_F) && (KEYMODE_G(vrt) == 3)) 5283 rss_key_addr_cnt = 32; 5284 5285 t4_tp_pio_write(adap, (void *)key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok); 5286 5287 if (idx >= 0 && idx < rss_key_addr_cnt) { 5288 if (rss_key_addr_cnt > 16) 5289 t4_write_reg(adap, TP_RSS_CONFIG_VRT_A, 5290 KEYWRADDRX_V(idx >> 4) | 5291 T6_VFWRADDR_V(idx) | KEYWREN_F); 5292 else 5293 t4_write_reg(adap, TP_RSS_CONFIG_VRT_A, 5294 KEYWRADDR_V(idx) | KEYWREN_F); 5295 } 5296 } 5297 5298 /** 5299 * t4_read_rss_pf_config - read PF RSS Configuration Table 5300 * @adapter: the adapter 5301 * @index: the entry in the PF RSS table to read 5302 * @valp: where to store the returned value 5303 * @sleep_ok: if true we may sleep while awaiting command completion 5304 * 5305 * Reads the PF RSS Configuration Table at the specified index and returns 5306 * the value found there. 5307 */ 5308 void t4_read_rss_pf_config(struct adapter *adapter, unsigned int index, 5309 u32 *valp, bool sleep_ok) 5310 { 5311 t4_tp_pio_read(adapter, valp, 1, TP_RSS_PF0_CONFIG_A + index, sleep_ok); 5312 } 5313 5314 /** 5315 * t4_read_rss_vf_config - read VF RSS Configuration Table 5316 * @adapter: the adapter 5317 * @index: the entry in the VF RSS table to read 5318 * @vfl: where to store the returned VFL 5319 * @vfh: where to store the returned VFH 5320 * @sleep_ok: if true we may sleep while awaiting command completion 5321 * 5322 * Reads the VF RSS Configuration Table at the specified index and returns 5323 * the (VFL, VFH) values found there. 5324 */ 5325 void t4_read_rss_vf_config(struct adapter *adapter, unsigned int index, 5326 u32 *vfl, u32 *vfh, bool sleep_ok) 5327 { 5328 u32 vrt, mask, data; 5329 5330 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) { 5331 mask = VFWRADDR_V(VFWRADDR_M); 5332 data = VFWRADDR_V(index); 5333 } else { 5334 mask = T6_VFWRADDR_V(T6_VFWRADDR_M); 5335 data = T6_VFWRADDR_V(index); 5336 } 5337 5338 /* Request that the index'th VF Table values be read into VFL/VFH. 5339 */ 5340 vrt = t4_read_reg(adapter, TP_RSS_CONFIG_VRT_A); 5341 vrt &= ~(VFRDRG_F | VFWREN_F | KEYWREN_F | mask); 5342 vrt |= data | VFRDEN_F; 5343 t4_write_reg(adapter, TP_RSS_CONFIG_VRT_A, vrt); 5344 5345 /* Grab the VFL/VFH values ... 5346 */ 5347 t4_tp_pio_read(adapter, vfl, 1, TP_RSS_VFL_CONFIG_A, sleep_ok); 5348 t4_tp_pio_read(adapter, vfh, 1, TP_RSS_VFH_CONFIG_A, sleep_ok); 5349 } 5350 5351 /** 5352 * t4_read_rss_pf_map - read PF RSS Map 5353 * @adapter: the adapter 5354 * @sleep_ok: if true we may sleep while awaiting command completion 5355 * 5356 * Reads the PF RSS Map register and returns its value. 5357 */ 5358 u32 t4_read_rss_pf_map(struct adapter *adapter, bool sleep_ok) 5359 { 5360 u32 pfmap; 5361 5362 t4_tp_pio_read(adapter, &pfmap, 1, TP_RSS_PF_MAP_A, sleep_ok); 5363 return pfmap; 5364 } 5365 5366 /** 5367 * t4_read_rss_pf_mask - read PF RSS Mask 5368 * @adapter: the adapter 5369 * @sleep_ok: if true we may sleep while awaiting command completion 5370 * 5371 * Reads the PF RSS Mask register and returns its value. 5372 */ 5373 u32 t4_read_rss_pf_mask(struct adapter *adapter, bool sleep_ok) 5374 { 5375 u32 pfmask; 5376 5377 t4_tp_pio_read(adapter, &pfmask, 1, TP_RSS_PF_MSK_A, sleep_ok); 5378 return pfmask; 5379 } 5380 5381 /** 5382 * t4_tp_get_tcp_stats - read TP's TCP MIB counters 5383 * @adap: the adapter 5384 * @v4: holds the TCP/IP counter values 5385 * @v6: holds the TCP/IPv6 counter values 5386 * @sleep_ok: if true we may sleep while awaiting command completion 5387 * 5388 * Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters. 5389 * Either @v4 or @v6 may be %NULL to skip the corresponding stats. 5390 */ 5391 void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4, 5392 struct tp_tcp_stats *v6, bool sleep_ok) 5393 { 5394 u32 val[TP_MIB_TCP_RXT_SEG_LO_A - TP_MIB_TCP_OUT_RST_A + 1]; 5395 5396 #define STAT_IDX(x) ((TP_MIB_TCP_##x##_A) - TP_MIB_TCP_OUT_RST_A) 5397 #define STAT(x) val[STAT_IDX(x)] 5398 #define STAT64(x) (((u64)STAT(x##_HI) << 32) | STAT(x##_LO)) 5399 5400 if (v4) { 5401 t4_tp_mib_read(adap, val, ARRAY_SIZE(val), 5402 TP_MIB_TCP_OUT_RST_A, sleep_ok); 5403 v4->tcp_out_rsts = STAT(OUT_RST); 5404 v4->tcp_in_segs = STAT64(IN_SEG); 5405 v4->tcp_out_segs = STAT64(OUT_SEG); 5406 v4->tcp_retrans_segs = STAT64(RXT_SEG); 5407 } 5408 if (v6) { 5409 t4_tp_mib_read(adap, val, ARRAY_SIZE(val), 5410 TP_MIB_TCP_V6OUT_RST_A, sleep_ok); 5411 v6->tcp_out_rsts = STAT(OUT_RST); 5412 v6->tcp_in_segs = STAT64(IN_SEG); 5413 v6->tcp_out_segs = STAT64(OUT_SEG); 5414 v6->tcp_retrans_segs = STAT64(RXT_SEG); 5415 } 5416 #undef STAT64 5417 #undef STAT 5418 #undef STAT_IDX 5419 } 5420 5421 /** 5422 * t4_tp_get_err_stats - read TP's error MIB counters 5423 * @adap: the adapter 5424 * @st: holds the counter values 5425 * @sleep_ok: if true we may sleep while awaiting command completion 5426 * 5427 * Returns the values of TP's error counters. 5428 */ 5429 void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st, 5430 bool sleep_ok) 5431 { 5432 int nchan = adap->params.arch.nchan; 5433 5434 t4_tp_mib_read(adap, st->mac_in_errs, nchan, TP_MIB_MAC_IN_ERR_0_A, 5435 sleep_ok); 5436 t4_tp_mib_read(adap, st->hdr_in_errs, nchan, TP_MIB_HDR_IN_ERR_0_A, 5437 sleep_ok); 5438 t4_tp_mib_read(adap, st->tcp_in_errs, nchan, TP_MIB_TCP_IN_ERR_0_A, 5439 sleep_ok); 5440 t4_tp_mib_read(adap, st->tnl_cong_drops, nchan, 5441 TP_MIB_TNL_CNG_DROP_0_A, sleep_ok); 5442 t4_tp_mib_read(adap, st->ofld_chan_drops, nchan, 5443 TP_MIB_OFD_CHN_DROP_0_A, sleep_ok); 5444 t4_tp_mib_read(adap, st->tnl_tx_drops, nchan, TP_MIB_TNL_DROP_0_A, 5445 sleep_ok); 5446 t4_tp_mib_read(adap, st->ofld_vlan_drops, nchan, 5447 TP_MIB_OFD_VLN_DROP_0_A, sleep_ok); 5448 t4_tp_mib_read(adap, st->tcp6_in_errs, nchan, 5449 TP_MIB_TCP_V6IN_ERR_0_A, sleep_ok); 5450 t4_tp_mib_read(adap, &st->ofld_no_neigh, 2, TP_MIB_OFD_ARP_DROP_A, 5451 sleep_ok); 5452 } 5453 5454 /** 5455 * t4_tp_get_cpl_stats - read TP's CPL MIB counters 5456 * @adap: the adapter 5457 * @st: holds the counter values 5458 * @sleep_ok: if true we may sleep while awaiting command completion 5459 * 5460 * Returns the values of TP's CPL counters. 5461 */ 5462 void t4_tp_get_cpl_stats(struct adapter *adap, struct tp_cpl_stats *st, 5463 bool sleep_ok) 5464 { 5465 int nchan = adap->params.arch.nchan; 5466 5467 t4_tp_mib_read(adap, st->req, nchan, TP_MIB_CPL_IN_REQ_0_A, sleep_ok); 5468 5469 t4_tp_mib_read(adap, st->rsp, nchan, TP_MIB_CPL_OUT_RSP_0_A, sleep_ok); 5470 } 5471 5472 /** 5473 * t4_tp_get_rdma_stats - read TP's RDMA MIB counters 5474 * @adap: the adapter 5475 * @st: holds the counter values 5476 * @sleep_ok: if true we may sleep while awaiting command completion 5477 * 5478 * Returns the values of TP's RDMA counters. 5479 */ 5480 void t4_tp_get_rdma_stats(struct adapter *adap, struct tp_rdma_stats *st, 5481 bool sleep_ok) 5482 { 5483 t4_tp_mib_read(adap, &st->rqe_dfr_pkt, 2, TP_MIB_RQE_DFR_PKT_A, 5484 sleep_ok); 5485 } 5486 5487 /** 5488 * t4_get_fcoe_stats - read TP's FCoE MIB counters for a port 5489 * @adap: the adapter 5490 * @idx: the port index 5491 * @st: holds the counter values 5492 * @sleep_ok: if true we may sleep while awaiting command completion 5493 * 5494 * Returns the values of TP's FCoE counters for the selected port. 5495 */ 5496 void t4_get_fcoe_stats(struct adapter *adap, unsigned int idx, 5497 struct tp_fcoe_stats *st, bool sleep_ok) 5498 { 5499 u32 val[2]; 5500 5501 t4_tp_mib_read(adap, &st->frames_ddp, 1, TP_MIB_FCOE_DDP_0_A + idx, 5502 sleep_ok); 5503 5504 t4_tp_mib_read(adap, &st->frames_drop, 1, 5505 TP_MIB_FCOE_DROP_0_A + idx, sleep_ok); 5506 5507 t4_tp_mib_read(adap, val, 2, TP_MIB_FCOE_BYTE_0_HI_A + 2 * idx, 5508 sleep_ok); 5509 5510 st->octets_ddp = ((u64)val[0] << 32) | val[1]; 5511 } 5512 5513 /** 5514 * t4_get_usm_stats - read TP's non-TCP DDP MIB counters 5515 * @adap: the adapter 5516 * @st: holds the counter values 5517 * @sleep_ok: if true we may sleep while awaiting command completion 5518 * 5519 * Returns the values of TP's counters for non-TCP directly-placed packets. 5520 */ 5521 void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st, 5522 bool sleep_ok) 5523 { 5524 u32 val[4]; 5525 5526 t4_tp_mib_read(adap, val, 4, TP_MIB_USM_PKTS_A, sleep_ok); 5527 st->frames = val[0]; 5528 st->drops = val[1]; 5529 st->octets = ((u64)val[2] << 32) | val[3]; 5530 } 5531 5532 /** 5533 * t4_read_mtu_tbl - returns the values in the HW path MTU table 5534 * @adap: the adapter 5535 * @mtus: where to store the MTU values 5536 * @mtu_log: where to store the MTU base-2 log (may be %NULL) 5537 * 5538 * Reads the HW path MTU table. 5539 */ 5540 void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log) 5541 { 5542 u32 v; 5543 int i; 5544 5545 for (i = 0; i < NMTUS; ++i) { 5546 t4_write_reg(adap, TP_MTU_TABLE_A, 5547 MTUINDEX_V(0xff) | MTUVALUE_V(i)); 5548 v = t4_read_reg(adap, TP_MTU_TABLE_A); 5549 mtus[i] = MTUVALUE_G(v); 5550 if (mtu_log) 5551 mtu_log[i] = MTUWIDTH_G(v); 5552 } 5553 } 5554 5555 /** 5556 * t4_read_cong_tbl - reads the congestion control table 5557 * @adap: the adapter 5558 * @incr: where to store the alpha values 5559 * 5560 * Reads the additive increments programmed into the HW congestion 5561 * control table. 5562 */ 5563 void t4_read_cong_tbl(struct adapter *adap, u16 incr[NMTUS][NCCTRL_WIN]) 5564 { 5565 unsigned int mtu, w; 5566 5567 for (mtu = 0; mtu < NMTUS; ++mtu) 5568 for (w = 0; w < NCCTRL_WIN; ++w) { 5569 t4_write_reg(adap, TP_CCTRL_TABLE_A, 5570 ROWINDEX_V(0xffff) | (mtu << 5) | w); 5571 incr[mtu][w] = (u16)t4_read_reg(adap, 5572 TP_CCTRL_TABLE_A) & 0x1fff; 5573 } 5574 } 5575 5576 /** 5577 * t4_tp_wr_bits_indirect - set/clear bits in an indirect TP register 5578 * @adap: the adapter 5579 * @addr: the indirect TP register address 5580 * @mask: specifies the field within the register to modify 5581 * @val: new value for the field 5582 * 5583 * Sets a field of an indirect TP register to the given value. 5584 */ 5585 void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr, 5586 unsigned int mask, unsigned int val) 5587 { 5588 t4_write_reg(adap, TP_PIO_ADDR_A, addr); 5589 val |= t4_read_reg(adap, TP_PIO_DATA_A) & ~mask; 5590 t4_write_reg(adap, TP_PIO_DATA_A, val); 5591 } 5592 5593 /** 5594 * init_cong_ctrl - initialize congestion control parameters 5595 * @a: the alpha values for congestion control 5596 * @b: the beta values for congestion control 5597 * 5598 * Initialize the congestion control parameters. 5599 */ 5600 static void init_cong_ctrl(unsigned short *a, unsigned short *b) 5601 { 5602 a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1; 5603 a[9] = 2; 5604 a[10] = 3; 5605 a[11] = 4; 5606 a[12] = 5; 5607 a[13] = 6; 5608 a[14] = 7; 5609 a[15] = 8; 5610 a[16] = 9; 5611 a[17] = 10; 5612 a[18] = 14; 5613 a[19] = 17; 5614 a[20] = 21; 5615 a[21] = 25; 5616 a[22] = 30; 5617 a[23] = 35; 5618 a[24] = 45; 5619 a[25] = 60; 5620 a[26] = 80; 5621 a[27] = 100; 5622 a[28] = 200; 5623 a[29] = 300; 5624 a[30] = 400; 5625 a[31] = 500; 5626 5627 b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0; 5628 b[9] = b[10] = 1; 5629 b[11] = b[12] = 2; 5630 b[13] = b[14] = b[15] = b[16] = 3; 5631 b[17] = b[18] = b[19] = b[20] = b[21] = 4; 5632 b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5; 5633 b[28] = b[29] = 6; 5634 b[30] = b[31] = 7; 5635 } 5636 5637 /* The minimum additive increment value for the congestion control table */ 5638 #define CC_MIN_INCR 2U 5639 5640 /** 5641 * t4_load_mtus - write the MTU and congestion control HW tables 5642 * @adap: the adapter 5643 * @mtus: the values for the MTU table 5644 * @alpha: the values for the congestion control alpha parameter 5645 * @beta: the values for the congestion control beta parameter 5646 * 5647 * Write the HW MTU table with the supplied MTUs and the high-speed 5648 * congestion control table with the supplied alpha, beta, and MTUs. 5649 * We write the two tables together because the additive increments 5650 * depend on the MTUs. 5651 */ 5652 void t4_load_mtus(struct adapter *adap, const unsigned short *mtus, 5653 const unsigned short *alpha, const unsigned short *beta) 5654 { 5655 static const unsigned int avg_pkts[NCCTRL_WIN] = { 5656 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640, 5657 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480, 5658 28672, 40960, 57344, 81920, 114688, 163840, 229376 5659 }; 5660 5661 unsigned int i, w; 5662 5663 for (i = 0; i < NMTUS; ++i) { 5664 unsigned int mtu = mtus[i]; 5665 unsigned int log2 = fls(mtu); 5666 5667 if (!(mtu & ((1 << log2) >> 2))) /* round */ 5668 log2--; 5669 t4_write_reg(adap, TP_MTU_TABLE_A, MTUINDEX_V(i) | 5670 MTUWIDTH_V(log2) | MTUVALUE_V(mtu)); 5671 5672 for (w = 0; w < NCCTRL_WIN; ++w) { 5673 unsigned int inc; 5674 5675 inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w], 5676 CC_MIN_INCR); 5677 5678 t4_write_reg(adap, TP_CCTRL_TABLE_A, (i << 21) | 5679 (w << 16) | (beta[w] << 13) | inc); 5680 } 5681 } 5682 } 5683 5684 /* Calculates a rate in bytes/s given the number of 256-byte units per 4K core 5685 * clocks. The formula is 5686 * 5687 * bytes/s = bytes256 * 256 * ClkFreq / 4096 5688 * 5689 * which is equivalent to 5690 * 5691 * bytes/s = 62.5 * bytes256 * ClkFreq_ms 5692 */ 5693 static u64 chan_rate(struct adapter *adap, unsigned int bytes256) 5694 { 5695 u64 v = bytes256 * adap->params.vpd.cclk; 5696 5697 return v * 62 + v / 2; 5698 } 5699 5700 /** 5701 * t4_get_chan_txrate - get the current per channel Tx rates 5702 * @adap: the adapter 5703 * @nic_rate: rates for NIC traffic 5704 * @ofld_rate: rates for offloaded traffic 5705 * 5706 * Return the current Tx rates in bytes/s for NIC and offloaded traffic 5707 * for each channel. 5708 */ 5709 void t4_get_chan_txrate(struct adapter *adap, u64 *nic_rate, u64 *ofld_rate) 5710 { 5711 u32 v; 5712 5713 v = t4_read_reg(adap, TP_TX_TRATE_A); 5714 nic_rate[0] = chan_rate(adap, TNLRATE0_G(v)); 5715 nic_rate[1] = chan_rate(adap, TNLRATE1_G(v)); 5716 if (adap->params.arch.nchan == NCHAN) { 5717 nic_rate[2] = chan_rate(adap, TNLRATE2_G(v)); 5718 nic_rate[3] = chan_rate(adap, TNLRATE3_G(v)); 5719 } 5720 5721 v = t4_read_reg(adap, TP_TX_ORATE_A); 5722 ofld_rate[0] = chan_rate(adap, OFDRATE0_G(v)); 5723 ofld_rate[1] = chan_rate(adap, OFDRATE1_G(v)); 5724 if (adap->params.arch.nchan == NCHAN) { 5725 ofld_rate[2] = chan_rate(adap, OFDRATE2_G(v)); 5726 ofld_rate[3] = chan_rate(adap, OFDRATE3_G(v)); 5727 } 5728 } 5729 5730 /** 5731 * t4_set_trace_filter - configure one of the tracing filters 5732 * @adap: the adapter 5733 * @tp: the desired trace filter parameters 5734 * @idx: which filter to configure 5735 * @enable: whether to enable or disable the filter 5736 * 5737 * Configures one of the tracing filters available in HW. If @enable is 5738 * %0 @tp is not examined and may be %NULL. The user is responsible to 5739 * set the single/multiple trace mode by writing to MPS_TRC_CFG_A register 5740 */ 5741 int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, 5742 int idx, int enable) 5743 { 5744 int i, ofst = idx * 4; 5745 u32 data_reg, mask_reg, cfg; 5746 u32 multitrc = TRCMULTIFILTER_F; 5747 5748 if (!enable) { 5749 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0); 5750 return 0; 5751 } 5752 5753 cfg = t4_read_reg(adap, MPS_TRC_CFG_A); 5754 if (cfg & TRCMULTIFILTER_F) { 5755 /* If multiple tracers are enabled, then maximum 5756 * capture size is 2.5KB (FIFO size of a single channel) 5757 * minus 2 flits for CPL_TRACE_PKT header. 5758 */ 5759 if (tp->snap_len > ((10 * 1024 / 4) - (2 * 8))) 5760 return -EINVAL; 5761 } else { 5762 /* If multiple tracers are disabled, to avoid deadlocks 5763 * maximum packet capture size of 9600 bytes is recommended. 5764 * Also in this mode, only trace0 can be enabled and running. 5765 */ 5766 multitrc = 0; 5767 if (tp->snap_len > 9600 || idx) 5768 return -EINVAL; 5769 } 5770 5771 if (tp->port > (is_t4(adap->params.chip) ? 11 : 19) || tp->invert > 1 || 5772 tp->skip_len > TFLENGTH_M || tp->skip_ofst > TFOFFSET_M || 5773 tp->min_len > TFMINPKTSIZE_M) 5774 return -EINVAL; 5775 5776 /* stop the tracer we'll be changing */ 5777 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0); 5778 5779 idx *= (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A); 5780 data_reg = MPS_TRC_FILTER0_MATCH_A + idx; 5781 mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + idx; 5782 5783 for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) { 5784 t4_write_reg(adap, data_reg, tp->data[i]); 5785 t4_write_reg(adap, mask_reg, ~tp->mask[i]); 5786 } 5787 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst, 5788 TFCAPTUREMAX_V(tp->snap_len) | 5789 TFMINPKTSIZE_V(tp->min_len)); 5790 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 5791 TFOFFSET_V(tp->skip_ofst) | TFLENGTH_V(tp->skip_len) | 5792 (is_t4(adap->params.chip) ? 5793 TFPORT_V(tp->port) | TFEN_F | TFINVERTMATCH_V(tp->invert) : 5794 T5_TFPORT_V(tp->port) | T5_TFEN_F | 5795 T5_TFINVERTMATCH_V(tp->invert))); 5796 5797 return 0; 5798 } 5799 5800 /** 5801 * t4_get_trace_filter - query one of the tracing filters 5802 * @adap: the adapter 5803 * @tp: the current trace filter parameters 5804 * @idx: which trace filter to query 5805 * @enabled: non-zero if the filter is enabled 5806 * 5807 * Returns the current settings of one of the HW tracing filters. 5808 */ 5809 void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx, 5810 int *enabled) 5811 { 5812 u32 ctla, ctlb; 5813 int i, ofst = idx * 4; 5814 u32 data_reg, mask_reg; 5815 5816 ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst); 5817 ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst); 5818 5819 if (is_t4(adap->params.chip)) { 5820 *enabled = !!(ctla & TFEN_F); 5821 tp->port = TFPORT_G(ctla); 5822 tp->invert = !!(ctla & TFINVERTMATCH_F); 5823 } else { 5824 *enabled = !!(ctla & T5_TFEN_F); 5825 tp->port = T5_TFPORT_G(ctla); 5826 tp->invert = !!(ctla & T5_TFINVERTMATCH_F); 5827 } 5828 tp->snap_len = TFCAPTUREMAX_G(ctlb); 5829 tp->min_len = TFMINPKTSIZE_G(ctlb); 5830 tp->skip_ofst = TFOFFSET_G(ctla); 5831 tp->skip_len = TFLENGTH_G(ctla); 5832 5833 ofst = (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A) * idx; 5834 data_reg = MPS_TRC_FILTER0_MATCH_A + ofst; 5835 mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + ofst; 5836 5837 for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) { 5838 tp->mask[i] = ~t4_read_reg(adap, mask_reg); 5839 tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i]; 5840 } 5841 } 5842 5843 /** 5844 * t4_pmtx_get_stats - returns the HW stats from PMTX 5845 * @adap: the adapter 5846 * @cnt: where to store the count statistics 5847 * @cycles: where to store the cycle statistics 5848 * 5849 * Returns performance statistics from PMTX. 5850 */ 5851 void t4_pmtx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[]) 5852 { 5853 int i; 5854 u32 data[2]; 5855 5856 for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) { 5857 t4_write_reg(adap, PM_TX_STAT_CONFIG_A, i + 1); 5858 cnt[i] = t4_read_reg(adap, PM_TX_STAT_COUNT_A); 5859 if (is_t4(adap->params.chip)) { 5860 cycles[i] = t4_read_reg64(adap, PM_TX_STAT_LSB_A); 5861 } else { 5862 t4_read_indirect(adap, PM_TX_DBG_CTRL_A, 5863 PM_TX_DBG_DATA_A, data, 2, 5864 PM_TX_DBG_STAT_MSB_A); 5865 cycles[i] = (((u64)data[0] << 32) | data[1]); 5866 } 5867 } 5868 } 5869 5870 /** 5871 * t4_pmrx_get_stats - returns the HW stats from PMRX 5872 * @adap: the adapter 5873 * @cnt: where to store the count statistics 5874 * @cycles: where to store the cycle statistics 5875 * 5876 * Returns performance statistics from PMRX. 5877 */ 5878 void t4_pmrx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[]) 5879 { 5880 int i; 5881 u32 data[2]; 5882 5883 for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) { 5884 t4_write_reg(adap, PM_RX_STAT_CONFIG_A, i + 1); 5885 cnt[i] = t4_read_reg(adap, PM_RX_STAT_COUNT_A); 5886 if (is_t4(adap->params.chip)) { 5887 cycles[i] = t4_read_reg64(adap, PM_RX_STAT_LSB_A); 5888 } else { 5889 t4_read_indirect(adap, PM_RX_DBG_CTRL_A, 5890 PM_RX_DBG_DATA_A, data, 2, 5891 PM_RX_DBG_STAT_MSB_A); 5892 cycles[i] = (((u64)data[0] << 32) | data[1]); 5893 } 5894 } 5895 } 5896 5897 /** 5898 * compute_mps_bg_map - compute the MPS Buffer Group Map for a Port 5899 * @adap: the adapter 5900 * @pidx: the port index 5901 * 5902 * Computes and returns a bitmap indicating which MPS buffer groups are 5903 * associated with the given Port. Bit i is set if buffer group i is 5904 * used by the Port. 5905 */ 5906 static inline unsigned int compute_mps_bg_map(struct adapter *adapter, 5907 int pidx) 5908 { 5909 unsigned int chip_version, nports; 5910 5911 chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip); 5912 nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A)); 5913 5914 switch (chip_version) { 5915 case CHELSIO_T4: 5916 case CHELSIO_T5: 5917 switch (nports) { 5918 case 1: return 0xf; 5919 case 2: return 3 << (2 * pidx); 5920 case 4: return 1 << pidx; 5921 } 5922 break; 5923 5924 case CHELSIO_T6: 5925 switch (nports) { 5926 case 2: return 1 << (2 * pidx); 5927 } 5928 break; 5929 } 5930 5931 dev_err(adapter->pdev_dev, "Need MPS Buffer Group Map for Chip %0x, Nports %d\n", 5932 chip_version, nports); 5933 5934 return 0; 5935 } 5936 5937 /** 5938 * t4_get_mps_bg_map - return the buffer groups associated with a port 5939 * @adapter: the adapter 5940 * @pidx: the port index 5941 * 5942 * Returns a bitmap indicating which MPS buffer groups are associated 5943 * with the given Port. Bit i is set if buffer group i is used by the 5944 * Port. 5945 */ 5946 unsigned int t4_get_mps_bg_map(struct adapter *adapter, int pidx) 5947 { 5948 u8 *mps_bg_map; 5949 unsigned int nports; 5950 5951 nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A)); 5952 if (pidx >= nports) { 5953 CH_WARN(adapter, "MPS Port Index %d >= Nports %d\n", 5954 pidx, nports); 5955 return 0; 5956 } 5957 5958 /* If we've already retrieved/computed this, just return the result. 5959 */ 5960 mps_bg_map = adapter->params.mps_bg_map; 5961 if (mps_bg_map[pidx]) 5962 return mps_bg_map[pidx]; 5963 5964 /* Newer Firmware can tell us what the MPS Buffer Group Map is. 5965 * If we're talking to such Firmware, let it tell us. If the new 5966 * API isn't supported, revert back to old hardcoded way. The value 5967 * obtained from Firmware is encoded in below format: 5968 * 5969 * val = (( MPSBGMAP[Port 3] << 24 ) | 5970 * ( MPSBGMAP[Port 2] << 16 ) | 5971 * ( MPSBGMAP[Port 1] << 8 ) | 5972 * ( MPSBGMAP[Port 0] << 0 )) 5973 */ 5974 if (adapter->flags & FW_OK) { 5975 u32 param, val; 5976 int ret; 5977 5978 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | 5979 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_MPSBGMAP)); 5980 ret = t4_query_params_ns(adapter, adapter->mbox, adapter->pf, 5981 0, 1, ¶m, &val); 5982 if (!ret) { 5983 int p; 5984 5985 /* Store the BG Map for all of the Ports in order to 5986 * avoid more calls to the Firmware in the future. 5987 */ 5988 for (p = 0; p < MAX_NPORTS; p++, val >>= 8) 5989 mps_bg_map[p] = val & 0xff; 5990 5991 return mps_bg_map[pidx]; 5992 } 5993 } 5994 5995 /* Either we're not talking to the Firmware or we're dealing with 5996 * older Firmware which doesn't support the new API to get the MPS 5997 * Buffer Group Map. Fall back to computing it ourselves. 5998 */ 5999 mps_bg_map[pidx] = compute_mps_bg_map(adapter, pidx); 6000 return mps_bg_map[pidx]; 6001 } 6002 6003 /** 6004 * t4_get_tp_ch_map - return TP ingress channels associated with a port 6005 * @adapter: the adapter 6006 * @pidx: the port index 6007 * 6008 * Returns a bitmap indicating which TP Ingress Channels are associated 6009 * with a given Port. Bit i is set if TP Ingress Channel i is used by 6010 * the Port. 6011 */ 6012 unsigned int t4_get_tp_ch_map(struct adapter *adap, int pidx) 6013 { 6014 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip); 6015 unsigned int nports = 1 << NUMPORTS_G(t4_read_reg(adap, MPS_CMN_CTL_A)); 6016 6017 if (pidx >= nports) { 6018 dev_warn(adap->pdev_dev, "TP Port Index %d >= Nports %d\n", 6019 pidx, nports); 6020 return 0; 6021 } 6022 6023 switch (chip_version) { 6024 case CHELSIO_T4: 6025 case CHELSIO_T5: 6026 /* Note that this happens to be the same values as the MPS 6027 * Buffer Group Map for these Chips. But we replicate the code 6028 * here because they're really separate concepts. 6029 */ 6030 switch (nports) { 6031 case 1: return 0xf; 6032 case 2: return 3 << (2 * pidx); 6033 case 4: return 1 << pidx; 6034 } 6035 break; 6036 6037 case CHELSIO_T6: 6038 switch (nports) { 6039 case 2: return 1 << pidx; 6040 } 6041 break; 6042 } 6043 6044 dev_err(adap->pdev_dev, "Need TP Channel Map for Chip %0x, Nports %d\n", 6045 chip_version, nports); 6046 return 0; 6047 } 6048 6049 /** 6050 * t4_get_port_type_description - return Port Type string description 6051 * @port_type: firmware Port Type enumeration 6052 */ 6053 const char *t4_get_port_type_description(enum fw_port_type port_type) 6054 { 6055 static const char *const port_type_description[] = { 6056 "Fiber_XFI", 6057 "Fiber_XAUI", 6058 "BT_SGMII", 6059 "BT_XFI", 6060 "BT_XAUI", 6061 "KX4", 6062 "CX4", 6063 "KX", 6064 "KR", 6065 "SFP", 6066 "BP_AP", 6067 "BP4_AP", 6068 "QSFP_10G", 6069 "QSA", 6070 "QSFP", 6071 "BP40_BA", 6072 "KR4_100G", 6073 "CR4_QSFP", 6074 "CR_QSFP", 6075 "CR2_QSFP", 6076 "SFP28", 6077 "KR_SFP28", 6078 "KR_XLAUI" 6079 }; 6080 6081 if (port_type < ARRAY_SIZE(port_type_description)) 6082 return port_type_description[port_type]; 6083 return "UNKNOWN"; 6084 } 6085 6086 /** 6087 * t4_get_port_stats_offset - collect port stats relative to a previous 6088 * snapshot 6089 * @adap: The adapter 6090 * @idx: The port 6091 * @stats: Current stats to fill 6092 * @offset: Previous stats snapshot 6093 */ 6094 void t4_get_port_stats_offset(struct adapter *adap, int idx, 6095 struct port_stats *stats, 6096 struct port_stats *offset) 6097 { 6098 u64 *s, *o; 6099 int i; 6100 6101 t4_get_port_stats(adap, idx, stats); 6102 for (i = 0, s = (u64 *)stats, o = (u64 *)offset; 6103 i < (sizeof(struct port_stats) / sizeof(u64)); 6104 i++, s++, o++) 6105 *s -= *o; 6106 } 6107 6108 /** 6109 * t4_get_port_stats - collect port statistics 6110 * @adap: the adapter 6111 * @idx: the port index 6112 * @p: the stats structure to fill 6113 * 6114 * Collect statistics related to the given port from HW. 6115 */ 6116 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p) 6117 { 6118 u32 bgmap = t4_get_mps_bg_map(adap, idx); 6119 u32 stat_ctl = t4_read_reg(adap, MPS_STAT_CTL_A); 6120 6121 #define GET_STAT(name) \ 6122 t4_read_reg64(adap, \ 6123 (is_t4(adap->params.chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \ 6124 T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L))) 6125 #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L) 6126 6127 p->tx_octets = GET_STAT(TX_PORT_BYTES); 6128 p->tx_frames = GET_STAT(TX_PORT_FRAMES); 6129 p->tx_bcast_frames = GET_STAT(TX_PORT_BCAST); 6130 p->tx_mcast_frames = GET_STAT(TX_PORT_MCAST); 6131 p->tx_ucast_frames = GET_STAT(TX_PORT_UCAST); 6132 p->tx_error_frames = GET_STAT(TX_PORT_ERROR); 6133 p->tx_frames_64 = GET_STAT(TX_PORT_64B); 6134 p->tx_frames_65_127 = GET_STAT(TX_PORT_65B_127B); 6135 p->tx_frames_128_255 = GET_STAT(TX_PORT_128B_255B); 6136 p->tx_frames_256_511 = GET_STAT(TX_PORT_256B_511B); 6137 p->tx_frames_512_1023 = GET_STAT(TX_PORT_512B_1023B); 6138 p->tx_frames_1024_1518 = GET_STAT(TX_PORT_1024B_1518B); 6139 p->tx_frames_1519_max = GET_STAT(TX_PORT_1519B_MAX); 6140 p->tx_drop = GET_STAT(TX_PORT_DROP); 6141 p->tx_pause = GET_STAT(TX_PORT_PAUSE); 6142 p->tx_ppp0 = GET_STAT(TX_PORT_PPP0); 6143 p->tx_ppp1 = GET_STAT(TX_PORT_PPP1); 6144 p->tx_ppp2 = GET_STAT(TX_PORT_PPP2); 6145 p->tx_ppp3 = GET_STAT(TX_PORT_PPP3); 6146 p->tx_ppp4 = GET_STAT(TX_PORT_PPP4); 6147 p->tx_ppp5 = GET_STAT(TX_PORT_PPP5); 6148 p->tx_ppp6 = GET_STAT(TX_PORT_PPP6); 6149 p->tx_ppp7 = GET_STAT(TX_PORT_PPP7); 6150 6151 if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) { 6152 if (stat_ctl & COUNTPAUSESTATTX_F) 6153 p->tx_frames_64 -= p->tx_pause; 6154 if (stat_ctl & COUNTPAUSEMCTX_F) 6155 p->tx_mcast_frames -= p->tx_pause; 6156 } 6157 p->rx_octets = GET_STAT(RX_PORT_BYTES); 6158 p->rx_frames = GET_STAT(RX_PORT_FRAMES); 6159 p->rx_bcast_frames = GET_STAT(RX_PORT_BCAST); 6160 p->rx_mcast_frames = GET_STAT(RX_PORT_MCAST); 6161 p->rx_ucast_frames = GET_STAT(RX_PORT_UCAST); 6162 p->rx_too_long = GET_STAT(RX_PORT_MTU_ERROR); 6163 p->rx_jabber = GET_STAT(RX_PORT_MTU_CRC_ERROR); 6164 p->rx_fcs_err = GET_STAT(RX_PORT_CRC_ERROR); 6165 p->rx_len_err = GET_STAT(RX_PORT_LEN_ERROR); 6166 p->rx_symbol_err = GET_STAT(RX_PORT_SYM_ERROR); 6167 p->rx_runt = GET_STAT(RX_PORT_LESS_64B); 6168 p->rx_frames_64 = GET_STAT(RX_PORT_64B); 6169 p->rx_frames_65_127 = GET_STAT(RX_PORT_65B_127B); 6170 p->rx_frames_128_255 = GET_STAT(RX_PORT_128B_255B); 6171 p->rx_frames_256_511 = GET_STAT(RX_PORT_256B_511B); 6172 p->rx_frames_512_1023 = GET_STAT(RX_PORT_512B_1023B); 6173 p->rx_frames_1024_1518 = GET_STAT(RX_PORT_1024B_1518B); 6174 p->rx_frames_1519_max = GET_STAT(RX_PORT_1519B_MAX); 6175 p->rx_pause = GET_STAT(RX_PORT_PAUSE); 6176 p->rx_ppp0 = GET_STAT(RX_PORT_PPP0); 6177 p->rx_ppp1 = GET_STAT(RX_PORT_PPP1); 6178 p->rx_ppp2 = GET_STAT(RX_PORT_PPP2); 6179 p->rx_ppp3 = GET_STAT(RX_PORT_PPP3); 6180 p->rx_ppp4 = GET_STAT(RX_PORT_PPP4); 6181 p->rx_ppp5 = GET_STAT(RX_PORT_PPP5); 6182 p->rx_ppp6 = GET_STAT(RX_PORT_PPP6); 6183 p->rx_ppp7 = GET_STAT(RX_PORT_PPP7); 6184 6185 if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) { 6186 if (stat_ctl & COUNTPAUSESTATRX_F) 6187 p->rx_frames_64 -= p->rx_pause; 6188 if (stat_ctl & COUNTPAUSEMCRX_F) 6189 p->rx_mcast_frames -= p->rx_pause; 6190 } 6191 6192 p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0; 6193 p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0; 6194 p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0; 6195 p->rx_ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_DROP_FRAME) : 0; 6196 p->rx_trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_TRUNC_FRAME) : 0; 6197 p->rx_trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_TRUNC_FRAME) : 0; 6198 p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0; 6199 p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0; 6200 6201 #undef GET_STAT 6202 #undef GET_STAT_COM 6203 } 6204 6205 /** 6206 * t4_get_lb_stats - collect loopback port statistics 6207 * @adap: the adapter 6208 * @idx: the loopback port index 6209 * @p: the stats structure to fill 6210 * 6211 * Return HW statistics for the given loopback port. 6212 */ 6213 void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p) 6214 { 6215 u32 bgmap = t4_get_mps_bg_map(adap, idx); 6216 6217 #define GET_STAT(name) \ 6218 t4_read_reg64(adap, \ 6219 (is_t4(adap->params.chip) ? \ 6220 PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L) : \ 6221 T5_PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L))) 6222 #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L) 6223 6224 p->octets = GET_STAT(BYTES); 6225 p->frames = GET_STAT(FRAMES); 6226 p->bcast_frames = GET_STAT(BCAST); 6227 p->mcast_frames = GET_STAT(MCAST); 6228 p->ucast_frames = GET_STAT(UCAST); 6229 p->error_frames = GET_STAT(ERROR); 6230 6231 p->frames_64 = GET_STAT(64B); 6232 p->frames_65_127 = GET_STAT(65B_127B); 6233 p->frames_128_255 = GET_STAT(128B_255B); 6234 p->frames_256_511 = GET_STAT(256B_511B); 6235 p->frames_512_1023 = GET_STAT(512B_1023B); 6236 p->frames_1024_1518 = GET_STAT(1024B_1518B); 6237 p->frames_1519_max = GET_STAT(1519B_MAX); 6238 p->drop = GET_STAT(DROP_FRAMES); 6239 6240 p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0; 6241 p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0; 6242 p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0; 6243 p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0; 6244 p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0; 6245 p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0; 6246 p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0; 6247 p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0; 6248 6249 #undef GET_STAT 6250 #undef GET_STAT_COM 6251 } 6252 6253 /* t4_mk_filtdelwr - create a delete filter WR 6254 * @ftid: the filter ID 6255 * @wr: the filter work request to populate 6256 * @qid: ingress queue to receive the delete notification 6257 * 6258 * Creates a filter work request to delete the supplied filter. If @qid is 6259 * negative the delete notification is suppressed. 6260 */ 6261 void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid) 6262 { 6263 memset(wr, 0, sizeof(*wr)); 6264 wr->op_pkd = cpu_to_be32(FW_WR_OP_V(FW_FILTER_WR)); 6265 wr->len16_pkd = cpu_to_be32(FW_WR_LEN16_V(sizeof(*wr) / 16)); 6266 wr->tid_to_iq = cpu_to_be32(FW_FILTER_WR_TID_V(ftid) | 6267 FW_FILTER_WR_NOREPLY_V(qid < 0)); 6268 wr->del_filter_to_l2tix = cpu_to_be32(FW_FILTER_WR_DEL_FILTER_F); 6269 if (qid >= 0) 6270 wr->rx_chan_rx_rpl_iq = 6271 cpu_to_be16(FW_FILTER_WR_RX_RPL_IQ_V(qid)); 6272 } 6273 6274 #define INIT_CMD(var, cmd, rd_wr) do { \ 6275 (var).op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_##cmd##_CMD) | \ 6276 FW_CMD_REQUEST_F | \ 6277 FW_CMD_##rd_wr##_F); \ 6278 (var).retval_len16 = cpu_to_be32(FW_LEN16(var)); \ 6279 } while (0) 6280 6281 int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox, 6282 u32 addr, u32 val) 6283 { 6284 u32 ldst_addrspace; 6285 struct fw_ldst_cmd c; 6286 6287 memset(&c, 0, sizeof(c)); 6288 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FIRMWARE); 6289 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 6290 FW_CMD_REQUEST_F | 6291 FW_CMD_WRITE_F | 6292 ldst_addrspace); 6293 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 6294 c.u.addrval.addr = cpu_to_be32(addr); 6295 c.u.addrval.val = cpu_to_be32(val); 6296 6297 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6298 } 6299 6300 /** 6301 * t4_mdio_rd - read a PHY register through MDIO 6302 * @adap: the adapter 6303 * @mbox: mailbox to use for the FW command 6304 * @phy_addr: the PHY address 6305 * @mmd: the PHY MMD to access (0 for clause 22 PHYs) 6306 * @reg: the register to read 6307 * @valp: where to store the value 6308 * 6309 * Issues a FW command through the given mailbox to read a PHY register. 6310 */ 6311 int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, 6312 unsigned int mmd, unsigned int reg, u16 *valp) 6313 { 6314 int ret; 6315 u32 ldst_addrspace; 6316 struct fw_ldst_cmd c; 6317 6318 memset(&c, 0, sizeof(c)); 6319 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO); 6320 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 6321 FW_CMD_REQUEST_F | FW_CMD_READ_F | 6322 ldst_addrspace); 6323 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 6324 c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) | 6325 FW_LDST_CMD_MMD_V(mmd)); 6326 c.u.mdio.raddr = cpu_to_be16(reg); 6327 6328 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 6329 if (ret == 0) 6330 *valp = be16_to_cpu(c.u.mdio.rval); 6331 return ret; 6332 } 6333 6334 /** 6335 * t4_mdio_wr - write a PHY register through MDIO 6336 * @adap: the adapter 6337 * @mbox: mailbox to use for the FW command 6338 * @phy_addr: the PHY address 6339 * @mmd: the PHY MMD to access (0 for clause 22 PHYs) 6340 * @reg: the register to write 6341 * @valp: value to write 6342 * 6343 * Issues a FW command through the given mailbox to write a PHY register. 6344 */ 6345 int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, 6346 unsigned int mmd, unsigned int reg, u16 val) 6347 { 6348 u32 ldst_addrspace; 6349 struct fw_ldst_cmd c; 6350 6351 memset(&c, 0, sizeof(c)); 6352 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO); 6353 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 6354 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 6355 ldst_addrspace); 6356 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 6357 c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) | 6358 FW_LDST_CMD_MMD_V(mmd)); 6359 c.u.mdio.raddr = cpu_to_be16(reg); 6360 c.u.mdio.rval = cpu_to_be16(val); 6361 6362 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6363 } 6364 6365 /** 6366 * t4_sge_decode_idma_state - decode the idma state 6367 * @adap: the adapter 6368 * @state: the state idma is stuck in 6369 */ 6370 void t4_sge_decode_idma_state(struct adapter *adapter, int state) 6371 { 6372 static const char * const t4_decode[] = { 6373 "IDMA_IDLE", 6374 "IDMA_PUSH_MORE_CPL_FIFO", 6375 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO", 6376 "Not used", 6377 "IDMA_PHYSADDR_SEND_PCIEHDR", 6378 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST", 6379 "IDMA_PHYSADDR_SEND_PAYLOAD", 6380 "IDMA_SEND_FIFO_TO_IMSG", 6381 "IDMA_FL_REQ_DATA_FL_PREP", 6382 "IDMA_FL_REQ_DATA_FL", 6383 "IDMA_FL_DROP", 6384 "IDMA_FL_H_REQ_HEADER_FL", 6385 "IDMA_FL_H_SEND_PCIEHDR", 6386 "IDMA_FL_H_PUSH_CPL_FIFO", 6387 "IDMA_FL_H_SEND_CPL", 6388 "IDMA_FL_H_SEND_IP_HDR_FIRST", 6389 "IDMA_FL_H_SEND_IP_HDR", 6390 "IDMA_FL_H_REQ_NEXT_HEADER_FL", 6391 "IDMA_FL_H_SEND_NEXT_PCIEHDR", 6392 "IDMA_FL_H_SEND_IP_HDR_PADDING", 6393 "IDMA_FL_D_SEND_PCIEHDR", 6394 "IDMA_FL_D_SEND_CPL_AND_IP_HDR", 6395 "IDMA_FL_D_REQ_NEXT_DATA_FL", 6396 "IDMA_FL_SEND_PCIEHDR", 6397 "IDMA_FL_PUSH_CPL_FIFO", 6398 "IDMA_FL_SEND_CPL", 6399 "IDMA_FL_SEND_PAYLOAD_FIRST", 6400 "IDMA_FL_SEND_PAYLOAD", 6401 "IDMA_FL_REQ_NEXT_DATA_FL", 6402 "IDMA_FL_SEND_NEXT_PCIEHDR", 6403 "IDMA_FL_SEND_PADDING", 6404 "IDMA_FL_SEND_COMPLETION_TO_IMSG", 6405 "IDMA_FL_SEND_FIFO_TO_IMSG", 6406 "IDMA_FL_REQ_DATAFL_DONE", 6407 "IDMA_FL_REQ_HEADERFL_DONE", 6408 }; 6409 static const char * const t5_decode[] = { 6410 "IDMA_IDLE", 6411 "IDMA_ALMOST_IDLE", 6412 "IDMA_PUSH_MORE_CPL_FIFO", 6413 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO", 6414 "IDMA_SGEFLRFLUSH_SEND_PCIEHDR", 6415 "IDMA_PHYSADDR_SEND_PCIEHDR", 6416 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST", 6417 "IDMA_PHYSADDR_SEND_PAYLOAD", 6418 "IDMA_SEND_FIFO_TO_IMSG", 6419 "IDMA_FL_REQ_DATA_FL", 6420 "IDMA_FL_DROP", 6421 "IDMA_FL_DROP_SEND_INC", 6422 "IDMA_FL_H_REQ_HEADER_FL", 6423 "IDMA_FL_H_SEND_PCIEHDR", 6424 "IDMA_FL_H_PUSH_CPL_FIFO", 6425 "IDMA_FL_H_SEND_CPL", 6426 "IDMA_FL_H_SEND_IP_HDR_FIRST", 6427 "IDMA_FL_H_SEND_IP_HDR", 6428 "IDMA_FL_H_REQ_NEXT_HEADER_FL", 6429 "IDMA_FL_H_SEND_NEXT_PCIEHDR", 6430 "IDMA_FL_H_SEND_IP_HDR_PADDING", 6431 "IDMA_FL_D_SEND_PCIEHDR", 6432 "IDMA_FL_D_SEND_CPL_AND_IP_HDR", 6433 "IDMA_FL_D_REQ_NEXT_DATA_FL", 6434 "IDMA_FL_SEND_PCIEHDR", 6435 "IDMA_FL_PUSH_CPL_FIFO", 6436 "IDMA_FL_SEND_CPL", 6437 "IDMA_FL_SEND_PAYLOAD_FIRST", 6438 "IDMA_FL_SEND_PAYLOAD", 6439 "IDMA_FL_REQ_NEXT_DATA_FL", 6440 "IDMA_FL_SEND_NEXT_PCIEHDR", 6441 "IDMA_FL_SEND_PADDING", 6442 "IDMA_FL_SEND_COMPLETION_TO_IMSG", 6443 }; 6444 static const char * const t6_decode[] = { 6445 "IDMA_IDLE", 6446 "IDMA_PUSH_MORE_CPL_FIFO", 6447 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO", 6448 "IDMA_SGEFLRFLUSH_SEND_PCIEHDR", 6449 "IDMA_PHYSADDR_SEND_PCIEHDR", 6450 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST", 6451 "IDMA_PHYSADDR_SEND_PAYLOAD", 6452 "IDMA_FL_REQ_DATA_FL", 6453 "IDMA_FL_DROP", 6454 "IDMA_FL_DROP_SEND_INC", 6455 "IDMA_FL_H_REQ_HEADER_FL", 6456 "IDMA_FL_H_SEND_PCIEHDR", 6457 "IDMA_FL_H_PUSH_CPL_FIFO", 6458 "IDMA_FL_H_SEND_CPL", 6459 "IDMA_FL_H_SEND_IP_HDR_FIRST", 6460 "IDMA_FL_H_SEND_IP_HDR", 6461 "IDMA_FL_H_REQ_NEXT_HEADER_FL", 6462 "IDMA_FL_H_SEND_NEXT_PCIEHDR", 6463 "IDMA_FL_H_SEND_IP_HDR_PADDING", 6464 "IDMA_FL_D_SEND_PCIEHDR", 6465 "IDMA_FL_D_SEND_CPL_AND_IP_HDR", 6466 "IDMA_FL_D_REQ_NEXT_DATA_FL", 6467 "IDMA_FL_SEND_PCIEHDR", 6468 "IDMA_FL_PUSH_CPL_FIFO", 6469 "IDMA_FL_SEND_CPL", 6470 "IDMA_FL_SEND_PAYLOAD_FIRST", 6471 "IDMA_FL_SEND_PAYLOAD", 6472 "IDMA_FL_REQ_NEXT_DATA_FL", 6473 "IDMA_FL_SEND_NEXT_PCIEHDR", 6474 "IDMA_FL_SEND_PADDING", 6475 "IDMA_FL_SEND_COMPLETION_TO_IMSG", 6476 }; 6477 static const u32 sge_regs[] = { 6478 SGE_DEBUG_DATA_LOW_INDEX_2_A, 6479 SGE_DEBUG_DATA_LOW_INDEX_3_A, 6480 SGE_DEBUG_DATA_HIGH_INDEX_10_A, 6481 }; 6482 const char **sge_idma_decode; 6483 int sge_idma_decode_nstates; 6484 int i; 6485 unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip); 6486 6487 /* Select the right set of decode strings to dump depending on the 6488 * adapter chip type. 6489 */ 6490 switch (chip_version) { 6491 case CHELSIO_T4: 6492 sge_idma_decode = (const char **)t4_decode; 6493 sge_idma_decode_nstates = ARRAY_SIZE(t4_decode); 6494 break; 6495 6496 case CHELSIO_T5: 6497 sge_idma_decode = (const char **)t5_decode; 6498 sge_idma_decode_nstates = ARRAY_SIZE(t5_decode); 6499 break; 6500 6501 case CHELSIO_T6: 6502 sge_idma_decode = (const char **)t6_decode; 6503 sge_idma_decode_nstates = ARRAY_SIZE(t6_decode); 6504 break; 6505 6506 default: 6507 dev_err(adapter->pdev_dev, 6508 "Unsupported chip version %d\n", chip_version); 6509 return; 6510 } 6511 6512 if (is_t4(adapter->params.chip)) { 6513 sge_idma_decode = (const char **)t4_decode; 6514 sge_idma_decode_nstates = ARRAY_SIZE(t4_decode); 6515 } else { 6516 sge_idma_decode = (const char **)t5_decode; 6517 sge_idma_decode_nstates = ARRAY_SIZE(t5_decode); 6518 } 6519 6520 if (state < sge_idma_decode_nstates) 6521 CH_WARN(adapter, "idma state %s\n", sge_idma_decode[state]); 6522 else 6523 CH_WARN(adapter, "idma state %d unknown\n", state); 6524 6525 for (i = 0; i < ARRAY_SIZE(sge_regs); i++) 6526 CH_WARN(adapter, "SGE register %#x value %#x\n", 6527 sge_regs[i], t4_read_reg(adapter, sge_regs[i])); 6528 } 6529 6530 /** 6531 * t4_sge_ctxt_flush - flush the SGE context cache 6532 * @adap: the adapter 6533 * @mbox: mailbox to use for the FW command 6534 * @ctx_type: Egress or Ingress 6535 * 6536 * Issues a FW command through the given mailbox to flush the 6537 * SGE context cache. 6538 */ 6539 int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox, int ctxt_type) 6540 { 6541 int ret; 6542 u32 ldst_addrspace; 6543 struct fw_ldst_cmd c; 6544 6545 memset(&c, 0, sizeof(c)); 6546 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(ctxt_type == CTXT_EGRESS ? 6547 FW_LDST_ADDRSPC_SGE_EGRC : 6548 FW_LDST_ADDRSPC_SGE_INGC); 6549 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 6550 FW_CMD_REQUEST_F | FW_CMD_READ_F | 6551 ldst_addrspace); 6552 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 6553 c.u.idctxt.msg_ctxtflush = cpu_to_be32(FW_LDST_CMD_CTXTFLUSH_F); 6554 6555 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 6556 return ret; 6557 } 6558 6559 /** 6560 * t4_fw_hello - establish communication with FW 6561 * @adap: the adapter 6562 * @mbox: mailbox to use for the FW command 6563 * @evt_mbox: mailbox to receive async FW events 6564 * @master: specifies the caller's willingness to be the device master 6565 * @state: returns the current device state (if non-NULL) 6566 * 6567 * Issues a command to establish communication with FW. Returns either 6568 * an error (negative integer) or the mailbox of the Master PF. 6569 */ 6570 int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox, 6571 enum dev_master master, enum dev_state *state) 6572 { 6573 int ret; 6574 struct fw_hello_cmd c; 6575 u32 v; 6576 unsigned int master_mbox; 6577 int retries = FW_CMD_HELLO_RETRIES; 6578 6579 retry: 6580 memset(&c, 0, sizeof(c)); 6581 INIT_CMD(c, HELLO, WRITE); 6582 c.err_to_clearinit = cpu_to_be32( 6583 FW_HELLO_CMD_MASTERDIS_V(master == MASTER_CANT) | 6584 FW_HELLO_CMD_MASTERFORCE_V(master == MASTER_MUST) | 6585 FW_HELLO_CMD_MBMASTER_V(master == MASTER_MUST ? 6586 mbox : FW_HELLO_CMD_MBMASTER_M) | 6587 FW_HELLO_CMD_MBASYNCNOT_V(evt_mbox) | 6588 FW_HELLO_CMD_STAGE_V(fw_hello_cmd_stage_os) | 6589 FW_HELLO_CMD_CLEARINIT_F); 6590 6591 /* 6592 * Issue the HELLO command to the firmware. If it's not successful 6593 * but indicates that we got a "busy" or "timeout" condition, retry 6594 * the HELLO until we exhaust our retry limit. If we do exceed our 6595 * retry limit, check to see if the firmware left us any error 6596 * information and report that if so. 6597 */ 6598 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 6599 if (ret < 0) { 6600 if ((ret == -EBUSY || ret == -ETIMEDOUT) && retries-- > 0) 6601 goto retry; 6602 if (t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_ERR_F) 6603 t4_report_fw_error(adap); 6604 return ret; 6605 } 6606 6607 v = be32_to_cpu(c.err_to_clearinit); 6608 master_mbox = FW_HELLO_CMD_MBMASTER_G(v); 6609 if (state) { 6610 if (v & FW_HELLO_CMD_ERR_F) 6611 *state = DEV_STATE_ERR; 6612 else if (v & FW_HELLO_CMD_INIT_F) 6613 *state = DEV_STATE_INIT; 6614 else 6615 *state = DEV_STATE_UNINIT; 6616 } 6617 6618 /* 6619 * If we're not the Master PF then we need to wait around for the 6620 * Master PF Driver to finish setting up the adapter. 6621 * 6622 * Note that we also do this wait if we're a non-Master-capable PF and 6623 * there is no current Master PF; a Master PF may show up momentarily 6624 * and we wouldn't want to fail pointlessly. (This can happen when an 6625 * OS loads lots of different drivers rapidly at the same time). In 6626 * this case, the Master PF returned by the firmware will be 6627 * PCIE_FW_MASTER_M so the test below will work ... 6628 */ 6629 if ((v & (FW_HELLO_CMD_ERR_F|FW_HELLO_CMD_INIT_F)) == 0 && 6630 master_mbox != mbox) { 6631 int waiting = FW_CMD_HELLO_TIMEOUT; 6632 6633 /* 6634 * Wait for the firmware to either indicate an error or 6635 * initialized state. If we see either of these we bail out 6636 * and report the issue to the caller. If we exhaust the 6637 * "hello timeout" and we haven't exhausted our retries, try 6638 * again. Otherwise bail with a timeout error. 6639 */ 6640 for (;;) { 6641 u32 pcie_fw; 6642 6643 msleep(50); 6644 waiting -= 50; 6645 6646 /* 6647 * If neither Error nor Initialialized are indicated 6648 * by the firmware keep waiting till we exaust our 6649 * timeout ... and then retry if we haven't exhausted 6650 * our retries ... 6651 */ 6652 pcie_fw = t4_read_reg(adap, PCIE_FW_A); 6653 if (!(pcie_fw & (PCIE_FW_ERR_F|PCIE_FW_INIT_F))) { 6654 if (waiting <= 0) { 6655 if (retries-- > 0) 6656 goto retry; 6657 6658 return -ETIMEDOUT; 6659 } 6660 continue; 6661 } 6662 6663 /* 6664 * We either have an Error or Initialized condition 6665 * report errors preferentially. 6666 */ 6667 if (state) { 6668 if (pcie_fw & PCIE_FW_ERR_F) 6669 *state = DEV_STATE_ERR; 6670 else if (pcie_fw & PCIE_FW_INIT_F) 6671 *state = DEV_STATE_INIT; 6672 } 6673 6674 /* 6675 * If we arrived before a Master PF was selected and 6676 * there's not a valid Master PF, grab its identity 6677 * for our caller. 6678 */ 6679 if (master_mbox == PCIE_FW_MASTER_M && 6680 (pcie_fw & PCIE_FW_MASTER_VLD_F)) 6681 master_mbox = PCIE_FW_MASTER_G(pcie_fw); 6682 break; 6683 } 6684 } 6685 6686 return master_mbox; 6687 } 6688 6689 /** 6690 * t4_fw_bye - end communication with FW 6691 * @adap: the adapter 6692 * @mbox: mailbox to use for the FW command 6693 * 6694 * Issues a command to terminate communication with FW. 6695 */ 6696 int t4_fw_bye(struct adapter *adap, unsigned int mbox) 6697 { 6698 struct fw_bye_cmd c; 6699 6700 memset(&c, 0, sizeof(c)); 6701 INIT_CMD(c, BYE, WRITE); 6702 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6703 } 6704 6705 /** 6706 * t4_init_cmd - ask FW to initialize the device 6707 * @adap: the adapter 6708 * @mbox: mailbox to use for the FW command 6709 * 6710 * Issues a command to FW to partially initialize the device. This 6711 * performs initialization that generally doesn't depend on user input. 6712 */ 6713 int t4_early_init(struct adapter *adap, unsigned int mbox) 6714 { 6715 struct fw_initialize_cmd c; 6716 6717 memset(&c, 0, sizeof(c)); 6718 INIT_CMD(c, INITIALIZE, WRITE); 6719 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6720 } 6721 6722 /** 6723 * t4_fw_reset - issue a reset to FW 6724 * @adap: the adapter 6725 * @mbox: mailbox to use for the FW command 6726 * @reset: specifies the type of reset to perform 6727 * 6728 * Issues a reset command of the specified type to FW. 6729 */ 6730 int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset) 6731 { 6732 struct fw_reset_cmd c; 6733 6734 memset(&c, 0, sizeof(c)); 6735 INIT_CMD(c, RESET, WRITE); 6736 c.val = cpu_to_be32(reset); 6737 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6738 } 6739 6740 /** 6741 * t4_fw_halt - issue a reset/halt to FW and put uP into RESET 6742 * @adap: the adapter 6743 * @mbox: mailbox to use for the FW RESET command (if desired) 6744 * @force: force uP into RESET even if FW RESET command fails 6745 * 6746 * Issues a RESET command to firmware (if desired) with a HALT indication 6747 * and then puts the microprocessor into RESET state. The RESET command 6748 * will only be issued if a legitimate mailbox is provided (mbox <= 6749 * PCIE_FW_MASTER_M). 6750 * 6751 * This is generally used in order for the host to safely manipulate the 6752 * adapter without fear of conflicting with whatever the firmware might 6753 * be doing. The only way out of this state is to RESTART the firmware 6754 * ... 6755 */ 6756 static int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force) 6757 { 6758 int ret = 0; 6759 6760 /* 6761 * If a legitimate mailbox is provided, issue a RESET command 6762 * with a HALT indication. 6763 */ 6764 if (mbox <= PCIE_FW_MASTER_M) { 6765 struct fw_reset_cmd c; 6766 6767 memset(&c, 0, sizeof(c)); 6768 INIT_CMD(c, RESET, WRITE); 6769 c.val = cpu_to_be32(PIORST_F | PIORSTMODE_F); 6770 c.halt_pkd = cpu_to_be32(FW_RESET_CMD_HALT_F); 6771 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 6772 } 6773 6774 /* 6775 * Normally we won't complete the operation if the firmware RESET 6776 * command fails but if our caller insists we'll go ahead and put the 6777 * uP into RESET. This can be useful if the firmware is hung or even 6778 * missing ... We'll have to take the risk of putting the uP into 6779 * RESET without the cooperation of firmware in that case. 6780 * 6781 * We also force the firmware's HALT flag to be on in case we bypassed 6782 * the firmware RESET command above or we're dealing with old firmware 6783 * which doesn't have the HALT capability. This will serve as a flag 6784 * for the incoming firmware to know that it's coming out of a HALT 6785 * rather than a RESET ... if it's new enough to understand that ... 6786 */ 6787 if (ret == 0 || force) { 6788 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, UPCRST_F); 6789 t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F, 6790 PCIE_FW_HALT_F); 6791 } 6792 6793 /* 6794 * And we always return the result of the firmware RESET command 6795 * even when we force the uP into RESET ... 6796 */ 6797 return ret; 6798 } 6799 6800 /** 6801 * t4_fw_restart - restart the firmware by taking the uP out of RESET 6802 * @adap: the adapter 6803 * @reset: if we want to do a RESET to restart things 6804 * 6805 * Restart firmware previously halted by t4_fw_halt(). On successful 6806 * return the previous PF Master remains as the new PF Master and there 6807 * is no need to issue a new HELLO command, etc. 6808 * 6809 * We do this in two ways: 6810 * 6811 * 1. If we're dealing with newer firmware we'll simply want to take 6812 * the chip's microprocessor out of RESET. This will cause the 6813 * firmware to start up from its start vector. And then we'll loop 6814 * until the firmware indicates it's started again (PCIE_FW.HALT 6815 * reset to 0) or we timeout. 6816 * 6817 * 2. If we're dealing with older firmware then we'll need to RESET 6818 * the chip since older firmware won't recognize the PCIE_FW.HALT 6819 * flag and automatically RESET itself on startup. 6820 */ 6821 static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset) 6822 { 6823 if (reset) { 6824 /* 6825 * Since we're directing the RESET instead of the firmware 6826 * doing it automatically, we need to clear the PCIE_FW.HALT 6827 * bit. 6828 */ 6829 t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F, 0); 6830 6831 /* 6832 * If we've been given a valid mailbox, first try to get the 6833 * firmware to do the RESET. If that works, great and we can 6834 * return success. Otherwise, if we haven't been given a 6835 * valid mailbox or the RESET command failed, fall back to 6836 * hitting the chip with a hammer. 6837 */ 6838 if (mbox <= PCIE_FW_MASTER_M) { 6839 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0); 6840 msleep(100); 6841 if (t4_fw_reset(adap, mbox, 6842 PIORST_F | PIORSTMODE_F) == 0) 6843 return 0; 6844 } 6845 6846 t4_write_reg(adap, PL_RST_A, PIORST_F | PIORSTMODE_F); 6847 msleep(2000); 6848 } else { 6849 int ms; 6850 6851 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0); 6852 for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) { 6853 if (!(t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_HALT_F)) 6854 return 0; 6855 msleep(100); 6856 ms += 100; 6857 } 6858 return -ETIMEDOUT; 6859 } 6860 return 0; 6861 } 6862 6863 /** 6864 * t4_fw_upgrade - perform all of the steps necessary to upgrade FW 6865 * @adap: the adapter 6866 * @mbox: mailbox to use for the FW RESET command (if desired) 6867 * @fw_data: the firmware image to write 6868 * @size: image size 6869 * @force: force upgrade even if firmware doesn't cooperate 6870 * 6871 * Perform all of the steps necessary for upgrading an adapter's 6872 * firmware image. Normally this requires the cooperation of the 6873 * existing firmware in order to halt all existing activities 6874 * but if an invalid mailbox token is passed in we skip that step 6875 * (though we'll still put the adapter microprocessor into RESET in 6876 * that case). 6877 * 6878 * On successful return the new firmware will have been loaded and 6879 * the adapter will have been fully RESET losing all previous setup 6880 * state. On unsuccessful return the adapter may be completely hosed ... 6881 * positive errno indicates that the adapter is ~probably~ intact, a 6882 * negative errno indicates that things are looking bad ... 6883 */ 6884 int t4_fw_upgrade(struct adapter *adap, unsigned int mbox, 6885 const u8 *fw_data, unsigned int size, int force) 6886 { 6887 const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data; 6888 int reset, ret; 6889 6890 if (!t4_fw_matches_chip(adap, fw_hdr)) 6891 return -EINVAL; 6892 6893 /* Disable FW_OK flag so that mbox commands with FW_OK flag set 6894 * wont be sent when we are flashing FW. 6895 */ 6896 adap->flags &= ~FW_OK; 6897 6898 ret = t4_fw_halt(adap, mbox, force); 6899 if (ret < 0 && !force) 6900 goto out; 6901 6902 ret = t4_load_fw(adap, fw_data, size); 6903 if (ret < 0) 6904 goto out; 6905 6906 /* 6907 * If there was a Firmware Configuration File stored in FLASH, 6908 * there's a good chance that it won't be compatible with the new 6909 * Firmware. In order to prevent difficult to diagnose adapter 6910 * initialization issues, we clear out the Firmware Configuration File 6911 * portion of the FLASH . The user will need to re-FLASH a new 6912 * Firmware Configuration File which is compatible with the new 6913 * Firmware if that's desired. 6914 */ 6915 (void)t4_load_cfg(adap, NULL, 0); 6916 6917 /* 6918 * Older versions of the firmware don't understand the new 6919 * PCIE_FW.HALT flag and so won't know to perform a RESET when they 6920 * restart. So for newly loaded older firmware we'll have to do the 6921 * RESET for it so it starts up on a clean slate. We can tell if 6922 * the newly loaded firmware will handle this right by checking 6923 * its header flags to see if it advertises the capability. 6924 */ 6925 reset = ((be32_to_cpu(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0); 6926 ret = t4_fw_restart(adap, mbox, reset); 6927 6928 /* Grab potentially new Firmware Device Log parameters so we can see 6929 * how healthy the new Firmware is. It's okay to contact the new 6930 * Firmware for these parameters even though, as far as it's 6931 * concerned, we've never said "HELLO" to it ... 6932 */ 6933 (void)t4_init_devlog_params(adap); 6934 out: 6935 adap->flags |= FW_OK; 6936 return ret; 6937 } 6938 6939 /** 6940 * t4_fl_pkt_align - return the fl packet alignment 6941 * @adap: the adapter 6942 * 6943 * T4 has a single field to specify the packing and padding boundary. 6944 * T5 onwards has separate fields for this and hence the alignment for 6945 * next packet offset is maximum of these two. 6946 * 6947 */ 6948 int t4_fl_pkt_align(struct adapter *adap) 6949 { 6950 u32 sge_control, sge_control2; 6951 unsigned int ingpadboundary, ingpackboundary, fl_align, ingpad_shift; 6952 6953 sge_control = t4_read_reg(adap, SGE_CONTROL_A); 6954 6955 /* T4 uses a single control field to specify both the PCIe Padding and 6956 * Packing Boundary. T5 introduced the ability to specify these 6957 * separately. The actual Ingress Packet Data alignment boundary 6958 * within Packed Buffer Mode is the maximum of these two 6959 * specifications. (Note that it makes no real practical sense to 6960 * have the Pading Boudary be larger than the Packing Boundary but you 6961 * could set the chip up that way and, in fact, legacy T4 code would 6962 * end doing this because it would initialize the Padding Boundary and 6963 * leave the Packing Boundary initialized to 0 (16 bytes).) 6964 * Padding Boundary values in T6 starts from 8B, 6965 * where as it is 32B for T4 and T5. 6966 */ 6967 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5) 6968 ingpad_shift = INGPADBOUNDARY_SHIFT_X; 6969 else 6970 ingpad_shift = T6_INGPADBOUNDARY_SHIFT_X; 6971 6972 ingpadboundary = 1 << (INGPADBOUNDARY_G(sge_control) + ingpad_shift); 6973 6974 fl_align = ingpadboundary; 6975 if (!is_t4(adap->params.chip)) { 6976 /* T5 has a weird interpretation of one of the PCIe Packing 6977 * Boundary values. No idea why ... 6978 */ 6979 sge_control2 = t4_read_reg(adap, SGE_CONTROL2_A); 6980 ingpackboundary = INGPACKBOUNDARY_G(sge_control2); 6981 if (ingpackboundary == INGPACKBOUNDARY_16B_X) 6982 ingpackboundary = 16; 6983 else 6984 ingpackboundary = 1 << (ingpackboundary + 6985 INGPACKBOUNDARY_SHIFT_X); 6986 6987 fl_align = max(ingpadboundary, ingpackboundary); 6988 } 6989 return fl_align; 6990 } 6991 6992 /** 6993 * t4_fixup_host_params - fix up host-dependent parameters 6994 * @adap: the adapter 6995 * @page_size: the host's Base Page Size 6996 * @cache_line_size: the host's Cache Line Size 6997 * 6998 * Various registers in T4 contain values which are dependent on the 6999 * host's Base Page and Cache Line Sizes. This function will fix all of 7000 * those registers with the appropriate values as passed in ... 7001 */ 7002 int t4_fixup_host_params(struct adapter *adap, unsigned int page_size, 7003 unsigned int cache_line_size) 7004 { 7005 unsigned int page_shift = fls(page_size) - 1; 7006 unsigned int sge_hps = page_shift - 10; 7007 unsigned int stat_len = cache_line_size > 64 ? 128 : 64; 7008 unsigned int fl_align = cache_line_size < 32 ? 32 : cache_line_size; 7009 unsigned int fl_align_log = fls(fl_align) - 1; 7010 7011 t4_write_reg(adap, SGE_HOST_PAGE_SIZE_A, 7012 HOSTPAGESIZEPF0_V(sge_hps) | 7013 HOSTPAGESIZEPF1_V(sge_hps) | 7014 HOSTPAGESIZEPF2_V(sge_hps) | 7015 HOSTPAGESIZEPF3_V(sge_hps) | 7016 HOSTPAGESIZEPF4_V(sge_hps) | 7017 HOSTPAGESIZEPF5_V(sge_hps) | 7018 HOSTPAGESIZEPF6_V(sge_hps) | 7019 HOSTPAGESIZEPF7_V(sge_hps)); 7020 7021 if (is_t4(adap->params.chip)) { 7022 t4_set_reg_field(adap, SGE_CONTROL_A, 7023 INGPADBOUNDARY_V(INGPADBOUNDARY_M) | 7024 EGRSTATUSPAGESIZE_F, 7025 INGPADBOUNDARY_V(fl_align_log - 7026 INGPADBOUNDARY_SHIFT_X) | 7027 EGRSTATUSPAGESIZE_V(stat_len != 64)); 7028 } else { 7029 unsigned int pack_align; 7030 unsigned int ingpad, ingpack; 7031 unsigned int pcie_cap; 7032 7033 /* T5 introduced the separation of the Free List Padding and 7034 * Packing Boundaries. Thus, we can select a smaller Padding 7035 * Boundary to avoid uselessly chewing up PCIe Link and Memory 7036 * Bandwidth, and use a Packing Boundary which is large enough 7037 * to avoid false sharing between CPUs, etc. 7038 * 7039 * For the PCI Link, the smaller the Padding Boundary the 7040 * better. For the Memory Controller, a smaller Padding 7041 * Boundary is better until we cross under the Memory Line 7042 * Size (the minimum unit of transfer to/from Memory). If we 7043 * have a Padding Boundary which is smaller than the Memory 7044 * Line Size, that'll involve a Read-Modify-Write cycle on the 7045 * Memory Controller which is never good. 7046 */ 7047 7048 /* We want the Packing Boundary to be based on the Cache Line 7049 * Size in order to help avoid False Sharing performance 7050 * issues between CPUs, etc. We also want the Packing 7051 * Boundary to incorporate the PCI-E Maximum Payload Size. We 7052 * get best performance when the Packing Boundary is a 7053 * multiple of the Maximum Payload Size. 7054 */ 7055 pack_align = fl_align; 7056 pcie_cap = pci_find_capability(adap->pdev, PCI_CAP_ID_EXP); 7057 if (pcie_cap) { 7058 unsigned int mps, mps_log; 7059 u16 devctl; 7060 7061 /* The PCIe Device Control Maximum Payload Size field 7062 * [bits 7:5] encodes sizes as powers of 2 starting at 7063 * 128 bytes. 7064 */ 7065 pci_read_config_word(adap->pdev, 7066 pcie_cap + PCI_EXP_DEVCTL, 7067 &devctl); 7068 mps_log = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5) + 7; 7069 mps = 1 << mps_log; 7070 if (mps > pack_align) 7071 pack_align = mps; 7072 } 7073 7074 /* N.B. T5/T6 have a crazy special interpretation of the "0" 7075 * value for the Packing Boundary. This corresponds to 16 7076 * bytes instead of the expected 32 bytes. So if we want 32 7077 * bytes, the best we can really do is 64 bytes ... 7078 */ 7079 if (pack_align <= 16) { 7080 ingpack = INGPACKBOUNDARY_16B_X; 7081 fl_align = 16; 7082 } else if (pack_align == 32) { 7083 ingpack = INGPACKBOUNDARY_64B_X; 7084 fl_align = 64; 7085 } else { 7086 unsigned int pack_align_log = fls(pack_align) - 1; 7087 7088 ingpack = pack_align_log - INGPACKBOUNDARY_SHIFT_X; 7089 fl_align = pack_align; 7090 } 7091 7092 /* Use the smallest Ingress Padding which isn't smaller than 7093 * the Memory Controller Read/Write Size. We'll take that as 7094 * being 8 bytes since we don't know of any system with a 7095 * wider Memory Controller Bus Width. 7096 */ 7097 if (is_t5(adap->params.chip)) 7098 ingpad = INGPADBOUNDARY_32B_X; 7099 else 7100 ingpad = T6_INGPADBOUNDARY_8B_X; 7101 7102 t4_set_reg_field(adap, SGE_CONTROL_A, 7103 INGPADBOUNDARY_V(INGPADBOUNDARY_M) | 7104 EGRSTATUSPAGESIZE_F, 7105 INGPADBOUNDARY_V(ingpad) | 7106 EGRSTATUSPAGESIZE_V(stat_len != 64)); 7107 t4_set_reg_field(adap, SGE_CONTROL2_A, 7108 INGPACKBOUNDARY_V(INGPACKBOUNDARY_M), 7109 INGPACKBOUNDARY_V(ingpack)); 7110 } 7111 /* 7112 * Adjust various SGE Free List Host Buffer Sizes. 7113 * 7114 * This is something of a crock since we're using fixed indices into 7115 * the array which are also known by the sge.c code and the T4 7116 * Firmware Configuration File. We need to come up with a much better 7117 * approach to managing this array. For now, the first four entries 7118 * are: 7119 * 7120 * 0: Host Page Size 7121 * 1: 64KB 7122 * 2: Buffer size corresponding to 1500 byte MTU (unpacked mode) 7123 * 3: Buffer size corresponding to 9000 byte MTU (unpacked mode) 7124 * 7125 * For the single-MTU buffers in unpacked mode we need to include 7126 * space for the SGE Control Packet Shift, 14 byte Ethernet header, 7127 * possible 4 byte VLAN tag, all rounded up to the next Ingress Packet 7128 * Padding boundary. All of these are accommodated in the Factory 7129 * Default Firmware Configuration File but we need to adjust it for 7130 * this host's cache line size. 7131 */ 7132 t4_write_reg(adap, SGE_FL_BUFFER_SIZE0_A, page_size); 7133 t4_write_reg(adap, SGE_FL_BUFFER_SIZE2_A, 7134 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE2_A) + fl_align-1) 7135 & ~(fl_align-1)); 7136 t4_write_reg(adap, SGE_FL_BUFFER_SIZE3_A, 7137 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE3_A) + fl_align-1) 7138 & ~(fl_align-1)); 7139 7140 t4_write_reg(adap, ULP_RX_TDDP_PSZ_A, HPZ0_V(page_shift - 12)); 7141 7142 return 0; 7143 } 7144 7145 /** 7146 * t4_fw_initialize - ask FW to initialize the device 7147 * @adap: the adapter 7148 * @mbox: mailbox to use for the FW command 7149 * 7150 * Issues a command to FW to partially initialize the device. This 7151 * performs initialization that generally doesn't depend on user input. 7152 */ 7153 int t4_fw_initialize(struct adapter *adap, unsigned int mbox) 7154 { 7155 struct fw_initialize_cmd c; 7156 7157 memset(&c, 0, sizeof(c)); 7158 INIT_CMD(c, INITIALIZE, WRITE); 7159 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7160 } 7161 7162 /** 7163 * t4_query_params_rw - query FW or device parameters 7164 * @adap: the adapter 7165 * @mbox: mailbox to use for the FW command 7166 * @pf: the PF 7167 * @vf: the VF 7168 * @nparams: the number of parameters 7169 * @params: the parameter names 7170 * @val: the parameter values 7171 * @rw: Write and read flag 7172 * @sleep_ok: if true, we may sleep awaiting mbox cmd completion 7173 * 7174 * Reads the value of FW or device parameters. Up to 7 parameters can be 7175 * queried at once. 7176 */ 7177 int t4_query_params_rw(struct adapter *adap, unsigned int mbox, unsigned int pf, 7178 unsigned int vf, unsigned int nparams, const u32 *params, 7179 u32 *val, int rw, bool sleep_ok) 7180 { 7181 int i, ret; 7182 struct fw_params_cmd c; 7183 __be32 *p = &c.param[0].mnem; 7184 7185 if (nparams > 7) 7186 return -EINVAL; 7187 7188 memset(&c, 0, sizeof(c)); 7189 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) | 7190 FW_CMD_REQUEST_F | FW_CMD_READ_F | 7191 FW_PARAMS_CMD_PFN_V(pf) | 7192 FW_PARAMS_CMD_VFN_V(vf)); 7193 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 7194 7195 for (i = 0; i < nparams; i++) { 7196 *p++ = cpu_to_be32(*params++); 7197 if (rw) 7198 *p = cpu_to_be32(*(val + i)); 7199 p++; 7200 } 7201 7202 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok); 7203 if (ret == 0) 7204 for (i = 0, p = &c.param[0].val; i < nparams; i++, p += 2) 7205 *val++ = be32_to_cpu(*p); 7206 return ret; 7207 } 7208 7209 int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf, 7210 unsigned int vf, unsigned int nparams, const u32 *params, 7211 u32 *val) 7212 { 7213 return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0, 7214 true); 7215 } 7216 7217 int t4_query_params_ns(struct adapter *adap, unsigned int mbox, unsigned int pf, 7218 unsigned int vf, unsigned int nparams, const u32 *params, 7219 u32 *val) 7220 { 7221 return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0, 7222 false); 7223 } 7224 7225 /** 7226 * t4_set_params_timeout - sets FW or device parameters 7227 * @adap: the adapter 7228 * @mbox: mailbox to use for the FW command 7229 * @pf: the PF 7230 * @vf: the VF 7231 * @nparams: the number of parameters 7232 * @params: the parameter names 7233 * @val: the parameter values 7234 * @timeout: the timeout time 7235 * 7236 * Sets the value of FW or device parameters. Up to 7 parameters can be 7237 * specified at once. 7238 */ 7239 int t4_set_params_timeout(struct adapter *adap, unsigned int mbox, 7240 unsigned int pf, unsigned int vf, 7241 unsigned int nparams, const u32 *params, 7242 const u32 *val, int timeout) 7243 { 7244 struct fw_params_cmd c; 7245 __be32 *p = &c.param[0].mnem; 7246 7247 if (nparams > 7) 7248 return -EINVAL; 7249 7250 memset(&c, 0, sizeof(c)); 7251 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) | 7252 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7253 FW_PARAMS_CMD_PFN_V(pf) | 7254 FW_PARAMS_CMD_VFN_V(vf)); 7255 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 7256 7257 while (nparams--) { 7258 *p++ = cpu_to_be32(*params++); 7259 *p++ = cpu_to_be32(*val++); 7260 } 7261 7262 return t4_wr_mbox_timeout(adap, mbox, &c, sizeof(c), NULL, timeout); 7263 } 7264 7265 /** 7266 * t4_set_params - sets FW or device parameters 7267 * @adap: the adapter 7268 * @mbox: mailbox to use for the FW command 7269 * @pf: the PF 7270 * @vf: the VF 7271 * @nparams: the number of parameters 7272 * @params: the parameter names 7273 * @val: the parameter values 7274 * 7275 * Sets the value of FW or device parameters. Up to 7 parameters can be 7276 * specified at once. 7277 */ 7278 int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf, 7279 unsigned int vf, unsigned int nparams, const u32 *params, 7280 const u32 *val) 7281 { 7282 return t4_set_params_timeout(adap, mbox, pf, vf, nparams, params, val, 7283 FW_CMD_MAX_TIMEOUT); 7284 } 7285 7286 /** 7287 * t4_cfg_pfvf - configure PF/VF resource limits 7288 * @adap: the adapter 7289 * @mbox: mailbox to use for the FW command 7290 * @pf: the PF being configured 7291 * @vf: the VF being configured 7292 * @txq: the max number of egress queues 7293 * @txq_eth_ctrl: the max number of egress Ethernet or control queues 7294 * @rxqi: the max number of interrupt-capable ingress queues 7295 * @rxq: the max number of interruptless ingress queues 7296 * @tc: the PCI traffic class 7297 * @vi: the max number of virtual interfaces 7298 * @cmask: the channel access rights mask for the PF/VF 7299 * @pmask: the port access rights mask for the PF/VF 7300 * @nexact: the maximum number of exact MPS filters 7301 * @rcaps: read capabilities 7302 * @wxcaps: write/execute capabilities 7303 * 7304 * Configures resource limits and capabilities for a physical or virtual 7305 * function. 7306 */ 7307 int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, 7308 unsigned int vf, unsigned int txq, unsigned int txq_eth_ctrl, 7309 unsigned int rxqi, unsigned int rxq, unsigned int tc, 7310 unsigned int vi, unsigned int cmask, unsigned int pmask, 7311 unsigned int nexact, unsigned int rcaps, unsigned int wxcaps) 7312 { 7313 struct fw_pfvf_cmd c; 7314 7315 memset(&c, 0, sizeof(c)); 7316 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PFVF_CMD) | FW_CMD_REQUEST_F | 7317 FW_CMD_WRITE_F | FW_PFVF_CMD_PFN_V(pf) | 7318 FW_PFVF_CMD_VFN_V(vf)); 7319 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 7320 c.niqflint_niq = cpu_to_be32(FW_PFVF_CMD_NIQFLINT_V(rxqi) | 7321 FW_PFVF_CMD_NIQ_V(rxq)); 7322 c.type_to_neq = cpu_to_be32(FW_PFVF_CMD_CMASK_V(cmask) | 7323 FW_PFVF_CMD_PMASK_V(pmask) | 7324 FW_PFVF_CMD_NEQ_V(txq)); 7325 c.tc_to_nexactf = cpu_to_be32(FW_PFVF_CMD_TC_V(tc) | 7326 FW_PFVF_CMD_NVI_V(vi) | 7327 FW_PFVF_CMD_NEXACTF_V(nexact)); 7328 c.r_caps_to_nethctrl = cpu_to_be32(FW_PFVF_CMD_R_CAPS_V(rcaps) | 7329 FW_PFVF_CMD_WX_CAPS_V(wxcaps) | 7330 FW_PFVF_CMD_NETHCTRL_V(txq_eth_ctrl)); 7331 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7332 } 7333 7334 /** 7335 * t4_alloc_vi - allocate a virtual interface 7336 * @adap: the adapter 7337 * @mbox: mailbox to use for the FW command 7338 * @port: physical port associated with the VI 7339 * @pf: the PF owning the VI 7340 * @vf: the VF owning the VI 7341 * @nmac: number of MAC addresses needed (1 to 5) 7342 * @mac: the MAC addresses of the VI 7343 * @rss_size: size of RSS table slice associated with this VI 7344 * 7345 * Allocates a virtual interface for the given physical port. If @mac is 7346 * not %NULL it contains the MAC addresses of the VI as assigned by FW. 7347 * @mac should be large enough to hold @nmac Ethernet addresses, they are 7348 * stored consecutively so the space needed is @nmac * 6 bytes. 7349 * Returns a negative error number or the non-negative VI id. 7350 */ 7351 int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, 7352 unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, 7353 unsigned int *rss_size) 7354 { 7355 int ret; 7356 struct fw_vi_cmd c; 7357 7358 memset(&c, 0, sizeof(c)); 7359 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) | FW_CMD_REQUEST_F | 7360 FW_CMD_WRITE_F | FW_CMD_EXEC_F | 7361 FW_VI_CMD_PFN_V(pf) | FW_VI_CMD_VFN_V(vf)); 7362 c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_ALLOC_F | FW_LEN16(c)); 7363 c.portid_pkd = FW_VI_CMD_PORTID_V(port); 7364 c.nmac = nmac - 1; 7365 7366 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 7367 if (ret) 7368 return ret; 7369 7370 if (mac) { 7371 memcpy(mac, c.mac, sizeof(c.mac)); 7372 switch (nmac) { 7373 case 5: 7374 memcpy(mac + 24, c.nmac3, sizeof(c.nmac3)); 7375 case 4: 7376 memcpy(mac + 18, c.nmac2, sizeof(c.nmac2)); 7377 case 3: 7378 memcpy(mac + 12, c.nmac1, sizeof(c.nmac1)); 7379 case 2: 7380 memcpy(mac + 6, c.nmac0, sizeof(c.nmac0)); 7381 } 7382 } 7383 if (rss_size) 7384 *rss_size = FW_VI_CMD_RSSSIZE_G(be16_to_cpu(c.rsssize_pkd)); 7385 return FW_VI_CMD_VIID_G(be16_to_cpu(c.type_viid)); 7386 } 7387 7388 /** 7389 * t4_free_vi - free a virtual interface 7390 * @adap: the adapter 7391 * @mbox: mailbox to use for the FW command 7392 * @pf: the PF owning the VI 7393 * @vf: the VF owning the VI 7394 * @viid: virtual interface identifiler 7395 * 7396 * Free a previously allocated virtual interface. 7397 */ 7398 int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf, 7399 unsigned int vf, unsigned int viid) 7400 { 7401 struct fw_vi_cmd c; 7402 7403 memset(&c, 0, sizeof(c)); 7404 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) | 7405 FW_CMD_REQUEST_F | 7406 FW_CMD_EXEC_F | 7407 FW_VI_CMD_PFN_V(pf) | 7408 FW_VI_CMD_VFN_V(vf)); 7409 c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_FREE_F | FW_LEN16(c)); 7410 c.type_viid = cpu_to_be16(FW_VI_CMD_VIID_V(viid)); 7411 7412 return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 7413 } 7414 7415 /** 7416 * t4_set_rxmode - set Rx properties of a virtual interface 7417 * @adap: the adapter 7418 * @mbox: mailbox to use for the FW command 7419 * @viid: the VI id 7420 * @mtu: the new MTU or -1 7421 * @promisc: 1 to enable promiscuous mode, 0 to disable it, -1 no change 7422 * @all_multi: 1 to enable all-multi mode, 0 to disable it, -1 no change 7423 * @bcast: 1 to enable broadcast Rx, 0 to disable it, -1 no change 7424 * @vlanex: 1 to enable HW VLAN extraction, 0 to disable it, -1 no change 7425 * @sleep_ok: if true we may sleep while awaiting command completion 7426 * 7427 * Sets Rx properties of a virtual interface. 7428 */ 7429 int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid, 7430 int mtu, int promisc, int all_multi, int bcast, int vlanex, 7431 bool sleep_ok) 7432 { 7433 struct fw_vi_rxmode_cmd c; 7434 7435 /* convert to FW values */ 7436 if (mtu < 0) 7437 mtu = FW_RXMODE_MTU_NO_CHG; 7438 if (promisc < 0) 7439 promisc = FW_VI_RXMODE_CMD_PROMISCEN_M; 7440 if (all_multi < 0) 7441 all_multi = FW_VI_RXMODE_CMD_ALLMULTIEN_M; 7442 if (bcast < 0) 7443 bcast = FW_VI_RXMODE_CMD_BROADCASTEN_M; 7444 if (vlanex < 0) 7445 vlanex = FW_VI_RXMODE_CMD_VLANEXEN_M; 7446 7447 memset(&c, 0, sizeof(c)); 7448 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_RXMODE_CMD) | 7449 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7450 FW_VI_RXMODE_CMD_VIID_V(viid)); 7451 c.retval_len16 = cpu_to_be32(FW_LEN16(c)); 7452 c.mtu_to_vlanexen = 7453 cpu_to_be32(FW_VI_RXMODE_CMD_MTU_V(mtu) | 7454 FW_VI_RXMODE_CMD_PROMISCEN_V(promisc) | 7455 FW_VI_RXMODE_CMD_ALLMULTIEN_V(all_multi) | 7456 FW_VI_RXMODE_CMD_BROADCASTEN_V(bcast) | 7457 FW_VI_RXMODE_CMD_VLANEXEN_V(vlanex)); 7458 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok); 7459 } 7460 7461 /** 7462 * t4_free_raw_mac_filt - Frees a raw mac entry in mps tcam 7463 * @adap: the adapter 7464 * @viid: the VI id 7465 * @addr: the MAC address 7466 * @mask: the mask 7467 * @idx: index of the entry in mps tcam 7468 * @lookup_type: MAC address for inner (1) or outer (0) header 7469 * @port_id: the port index 7470 * @sleep_ok: call is allowed to sleep 7471 * 7472 * Removes the mac entry at the specified index using raw mac interface. 7473 * 7474 * Returns a negative error number on failure. 7475 */ 7476 int t4_free_raw_mac_filt(struct adapter *adap, unsigned int viid, 7477 const u8 *addr, const u8 *mask, unsigned int idx, 7478 u8 lookup_type, u8 port_id, bool sleep_ok) 7479 { 7480 struct fw_vi_mac_cmd c; 7481 struct fw_vi_mac_raw *p = &c.u.raw; 7482 u32 val; 7483 7484 memset(&c, 0, sizeof(c)); 7485 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7486 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7487 FW_CMD_EXEC_V(0) | 7488 FW_VI_MAC_CMD_VIID_V(viid)); 7489 val = FW_CMD_LEN16_V(1) | 7490 FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW); 7491 c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) | 7492 FW_CMD_LEN16_V(val)); 7493 7494 p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx) | 7495 FW_VI_MAC_ID_BASED_FREE); 7496 7497 /* Lookup Type. Outer header: 0, Inner header: 1 */ 7498 p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) | 7499 DATAPORTNUM_V(port_id)); 7500 /* Lookup mask and port mask */ 7501 p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) | 7502 DATAPORTNUM_V(DATAPORTNUM_M)); 7503 7504 /* Copy the address and the mask */ 7505 memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN); 7506 memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN); 7507 7508 return t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok); 7509 } 7510 7511 /** 7512 * t4_alloc_raw_mac_filt - Adds a mac entry in mps tcam 7513 * @adap: the adapter 7514 * @viid: the VI id 7515 * @mac: the MAC address 7516 * @mask: the mask 7517 * @idx: index at which to add this entry 7518 * @port_id: the port index 7519 * @lookup_type: MAC address for inner (1) or outer (0) header 7520 * @sleep_ok: call is allowed to sleep 7521 * 7522 * Adds the mac entry at the specified index using raw mac interface. 7523 * 7524 * Returns a negative error number or the allocated index for this mac. 7525 */ 7526 int t4_alloc_raw_mac_filt(struct adapter *adap, unsigned int viid, 7527 const u8 *addr, const u8 *mask, unsigned int idx, 7528 u8 lookup_type, u8 port_id, bool sleep_ok) 7529 { 7530 int ret = 0; 7531 struct fw_vi_mac_cmd c; 7532 struct fw_vi_mac_raw *p = &c.u.raw; 7533 u32 val; 7534 7535 memset(&c, 0, sizeof(c)); 7536 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7537 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7538 FW_VI_MAC_CMD_VIID_V(viid)); 7539 val = FW_CMD_LEN16_V(1) | 7540 FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW); 7541 c.freemacs_to_len16 = cpu_to_be32(val); 7542 7543 /* Specify that this is an inner mac address */ 7544 p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx)); 7545 7546 /* Lookup Type. Outer header: 0, Inner header: 1 */ 7547 p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) | 7548 DATAPORTNUM_V(port_id)); 7549 /* Lookup mask and port mask */ 7550 p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) | 7551 DATAPORTNUM_V(DATAPORTNUM_M)); 7552 7553 /* Copy the address and the mask */ 7554 memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN); 7555 memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN); 7556 7557 ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok); 7558 if (ret == 0) { 7559 ret = FW_VI_MAC_CMD_RAW_IDX_G(be32_to_cpu(p->raw_idx_pkd)); 7560 if (ret != idx) 7561 ret = -ENOMEM; 7562 } 7563 7564 return ret; 7565 } 7566 7567 /** 7568 * t4_alloc_mac_filt - allocates exact-match filters for MAC addresses 7569 * @adap: the adapter 7570 * @mbox: mailbox to use for the FW command 7571 * @viid: the VI id 7572 * @free: if true any existing filters for this VI id are first removed 7573 * @naddr: the number of MAC addresses to allocate filters for (up to 7) 7574 * @addr: the MAC address(es) 7575 * @idx: where to store the index of each allocated filter 7576 * @hash: pointer to hash address filter bitmap 7577 * @sleep_ok: call is allowed to sleep 7578 * 7579 * Allocates an exact-match filter for each of the supplied addresses and 7580 * sets it to the corresponding address. If @idx is not %NULL it should 7581 * have at least @naddr entries, each of which will be set to the index of 7582 * the filter allocated for the corresponding MAC address. If a filter 7583 * could not be allocated for an address its index is set to 0xffff. 7584 * If @hash is not %NULL addresses that fail to allocate an exact filter 7585 * are hashed and update the hash filter bitmap pointed at by @hash. 7586 * 7587 * Returns a negative error number or the number of filters allocated. 7588 */ 7589 int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox, 7590 unsigned int viid, bool free, unsigned int naddr, 7591 const u8 **addr, u16 *idx, u64 *hash, bool sleep_ok) 7592 { 7593 int offset, ret = 0; 7594 struct fw_vi_mac_cmd c; 7595 unsigned int nfilters = 0; 7596 unsigned int max_naddr = adap->params.arch.mps_tcam_size; 7597 unsigned int rem = naddr; 7598 7599 if (naddr > max_naddr) 7600 return -EINVAL; 7601 7602 for (offset = 0; offset < naddr ; /**/) { 7603 unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact) ? 7604 rem : ARRAY_SIZE(c.u.exact)); 7605 size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd, 7606 u.exact[fw_naddr]), 16); 7607 struct fw_vi_mac_exact *p; 7608 int i; 7609 7610 memset(&c, 0, sizeof(c)); 7611 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7612 FW_CMD_REQUEST_F | 7613 FW_CMD_WRITE_F | 7614 FW_CMD_EXEC_V(free) | 7615 FW_VI_MAC_CMD_VIID_V(viid)); 7616 c.freemacs_to_len16 = 7617 cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(free) | 7618 FW_CMD_LEN16_V(len16)); 7619 7620 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) { 7621 p->valid_to_idx = 7622 cpu_to_be16(FW_VI_MAC_CMD_VALID_F | 7623 FW_VI_MAC_CMD_IDX_V( 7624 FW_VI_MAC_ADD_MAC)); 7625 memcpy(p->macaddr, addr[offset + i], 7626 sizeof(p->macaddr)); 7627 } 7628 7629 /* It's okay if we run out of space in our MAC address arena. 7630 * Some of the addresses we submit may get stored so we need 7631 * to run through the reply to see what the results were ... 7632 */ 7633 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok); 7634 if (ret && ret != -FW_ENOMEM) 7635 break; 7636 7637 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) { 7638 u16 index = FW_VI_MAC_CMD_IDX_G( 7639 be16_to_cpu(p->valid_to_idx)); 7640 7641 if (idx) 7642 idx[offset + i] = (index >= max_naddr ? 7643 0xffff : index); 7644 if (index < max_naddr) 7645 nfilters++; 7646 else if (hash) 7647 *hash |= (1ULL << 7648 hash_mac_addr(addr[offset + i])); 7649 } 7650 7651 free = false; 7652 offset += fw_naddr; 7653 rem -= fw_naddr; 7654 } 7655 7656 if (ret == 0 || ret == -FW_ENOMEM) 7657 ret = nfilters; 7658 return ret; 7659 } 7660 7661 /** 7662 * t4_free_mac_filt - frees exact-match filters of given MAC addresses 7663 * @adap: the adapter 7664 * @mbox: mailbox to use for the FW command 7665 * @viid: the VI id 7666 * @naddr: the number of MAC addresses to allocate filters for (up to 7) 7667 * @addr: the MAC address(es) 7668 * @sleep_ok: call is allowed to sleep 7669 * 7670 * Frees the exact-match filter for each of the supplied addresses 7671 * 7672 * Returns a negative error number or the number of filters freed. 7673 */ 7674 int t4_free_mac_filt(struct adapter *adap, unsigned int mbox, 7675 unsigned int viid, unsigned int naddr, 7676 const u8 **addr, bool sleep_ok) 7677 { 7678 int offset, ret = 0; 7679 struct fw_vi_mac_cmd c; 7680 unsigned int nfilters = 0; 7681 unsigned int max_naddr = is_t4(adap->params.chip) ? 7682 NUM_MPS_CLS_SRAM_L_INSTANCES : 7683 NUM_MPS_T5_CLS_SRAM_L_INSTANCES; 7684 unsigned int rem = naddr; 7685 7686 if (naddr > max_naddr) 7687 return -EINVAL; 7688 7689 for (offset = 0; offset < (int)naddr ; /**/) { 7690 unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact) 7691 ? rem 7692 : ARRAY_SIZE(c.u.exact)); 7693 size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd, 7694 u.exact[fw_naddr]), 16); 7695 struct fw_vi_mac_exact *p; 7696 int i; 7697 7698 memset(&c, 0, sizeof(c)); 7699 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7700 FW_CMD_REQUEST_F | 7701 FW_CMD_WRITE_F | 7702 FW_CMD_EXEC_V(0) | 7703 FW_VI_MAC_CMD_VIID_V(viid)); 7704 c.freemacs_to_len16 = 7705 cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) | 7706 FW_CMD_LEN16_V(len16)); 7707 7708 for (i = 0, p = c.u.exact; i < (int)fw_naddr; i++, p++) { 7709 p->valid_to_idx = cpu_to_be16( 7710 FW_VI_MAC_CMD_VALID_F | 7711 FW_VI_MAC_CMD_IDX_V(FW_VI_MAC_MAC_BASED_FREE)); 7712 memcpy(p->macaddr, addr[offset+i], sizeof(p->macaddr)); 7713 } 7714 7715 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok); 7716 if (ret) 7717 break; 7718 7719 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) { 7720 u16 index = FW_VI_MAC_CMD_IDX_G( 7721 be16_to_cpu(p->valid_to_idx)); 7722 7723 if (index < max_naddr) 7724 nfilters++; 7725 } 7726 7727 offset += fw_naddr; 7728 rem -= fw_naddr; 7729 } 7730 7731 if (ret == 0) 7732 ret = nfilters; 7733 return ret; 7734 } 7735 7736 /** 7737 * t4_change_mac - modifies the exact-match filter for a MAC address 7738 * @adap: the adapter 7739 * @mbox: mailbox to use for the FW command 7740 * @viid: the VI id 7741 * @idx: index of existing filter for old value of MAC address, or -1 7742 * @addr: the new MAC address value 7743 * @persist: whether a new MAC allocation should be persistent 7744 * @add_smt: if true also add the address to the HW SMT 7745 * 7746 * Modifies an exact-match filter and sets it to the new MAC address. 7747 * Note that in general it is not possible to modify the value of a given 7748 * filter so the generic way to modify an address filter is to free the one 7749 * being used by the old address value and allocate a new filter for the 7750 * new address value. @idx can be -1 if the address is a new addition. 7751 * 7752 * Returns a negative error number or the index of the filter with the new 7753 * MAC value. 7754 */ 7755 int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid, 7756 int idx, const u8 *addr, bool persist, bool add_smt) 7757 { 7758 int ret, mode; 7759 struct fw_vi_mac_cmd c; 7760 struct fw_vi_mac_exact *p = c.u.exact; 7761 unsigned int max_mac_addr = adap->params.arch.mps_tcam_size; 7762 7763 if (idx < 0) /* new allocation */ 7764 idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC; 7765 mode = add_smt ? FW_VI_MAC_SMT_AND_MPSTCAM : FW_VI_MAC_MPS_TCAM_ENTRY; 7766 7767 memset(&c, 0, sizeof(c)); 7768 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7769 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7770 FW_VI_MAC_CMD_VIID_V(viid)); 7771 c.freemacs_to_len16 = cpu_to_be32(FW_CMD_LEN16_V(1)); 7772 p->valid_to_idx = cpu_to_be16(FW_VI_MAC_CMD_VALID_F | 7773 FW_VI_MAC_CMD_SMAC_RESULT_V(mode) | 7774 FW_VI_MAC_CMD_IDX_V(idx)); 7775 memcpy(p->macaddr, addr, sizeof(p->macaddr)); 7776 7777 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 7778 if (ret == 0) { 7779 ret = FW_VI_MAC_CMD_IDX_G(be16_to_cpu(p->valid_to_idx)); 7780 if (ret >= max_mac_addr) 7781 ret = -ENOMEM; 7782 } 7783 return ret; 7784 } 7785 7786 /** 7787 * t4_set_addr_hash - program the MAC inexact-match hash filter 7788 * @adap: the adapter 7789 * @mbox: mailbox to use for the FW command 7790 * @viid: the VI id 7791 * @ucast: whether the hash filter should also match unicast addresses 7792 * @vec: the value to be written to the hash filter 7793 * @sleep_ok: call is allowed to sleep 7794 * 7795 * Sets the 64-bit inexact-match hash filter for a virtual interface. 7796 */ 7797 int t4_set_addr_hash(struct adapter *adap, unsigned int mbox, unsigned int viid, 7798 bool ucast, u64 vec, bool sleep_ok) 7799 { 7800 struct fw_vi_mac_cmd c; 7801 7802 memset(&c, 0, sizeof(c)); 7803 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) | 7804 FW_CMD_REQUEST_F | FW_CMD_WRITE_F | 7805 FW_VI_ENABLE_CMD_VIID_V(viid)); 7806 c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_HASHVECEN_F | 7807 FW_VI_MAC_CMD_HASHUNIEN_V(ucast) | 7808 FW_CMD_LEN16_V(1)); 7809 c.u.hash.hashvec = cpu_to_be64(vec); 7810 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok); 7811 } 7812 7813 /** 7814 * t4_enable_vi_params - enable/disable a virtual interface 7815 * @adap: the adapter 7816 * @mbox: mailbox to use for the FW command 7817 * @viid: the VI id 7818 * @rx_en: 1=enable Rx, 0=disable Rx 7819 * @tx_en: 1=enable Tx, 0=disable Tx 7820 * @dcb_en: 1=enable delivery of Data Center Bridging messages. 7821 * 7822 * Enables/disables a virtual interface. Note that setting DCB Enable 7823 * only makes sense when enabling a Virtual Interface ... 7824 */ 7825 int t4_enable_vi_params(struct adapter *adap, unsigned int mbox, 7826 unsigned int viid, bool rx_en, bool tx_en, bool dcb_en) 7827 { 7828 struct fw_vi_enable_cmd c; 7829 7830 memset(&c, 0, sizeof(c)); 7831 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) | 7832 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 7833 FW_VI_ENABLE_CMD_VIID_V(viid)); 7834 c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_IEN_V(rx_en) | 7835 FW_VI_ENABLE_CMD_EEN_V(tx_en) | 7836 FW_VI_ENABLE_CMD_DCB_INFO_V(dcb_en) | 7837 FW_LEN16(c)); 7838 return t4_wr_mbox_ns(adap, mbox, &c, sizeof(c), NULL); 7839 } 7840 7841 /** 7842 * t4_enable_vi - enable/disable a virtual interface 7843 * @adap: the adapter 7844 * @mbox: mailbox to use for the FW command 7845 * @viid: the VI id 7846 * @rx_en: 1=enable Rx, 0=disable Rx 7847 * @tx_en: 1=enable Tx, 0=disable Tx 7848 * 7849 * Enables/disables a virtual interface. 7850 */ 7851 int t4_enable_vi(struct adapter *adap, unsigned int mbox, unsigned int viid, 7852 bool rx_en, bool tx_en) 7853 { 7854 return t4_enable_vi_params(adap, mbox, viid, rx_en, tx_en, 0); 7855 } 7856 7857 /** 7858 * t4_identify_port - identify a VI's port by blinking its LED 7859 * @adap: the adapter 7860 * @mbox: mailbox to use for the FW command 7861 * @viid: the VI id 7862 * @nblinks: how many times to blink LED at 2.5 Hz 7863 * 7864 * Identifies a VI's port by blinking its LED. 7865 */ 7866 int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid, 7867 unsigned int nblinks) 7868 { 7869 struct fw_vi_enable_cmd c; 7870 7871 memset(&c, 0, sizeof(c)); 7872 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) | 7873 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 7874 FW_VI_ENABLE_CMD_VIID_V(viid)); 7875 c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_LED_F | FW_LEN16(c)); 7876 c.blinkdur = cpu_to_be16(nblinks); 7877 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7878 } 7879 7880 /** 7881 * t4_iq_stop - stop an ingress queue and its FLs 7882 * @adap: the adapter 7883 * @mbox: mailbox to use for the FW command 7884 * @pf: the PF owning the queues 7885 * @vf: the VF owning the queues 7886 * @iqtype: the ingress queue type (FW_IQ_TYPE_FL_INT_CAP, etc.) 7887 * @iqid: ingress queue id 7888 * @fl0id: FL0 queue id or 0xffff if no attached FL0 7889 * @fl1id: FL1 queue id or 0xffff if no attached FL1 7890 * 7891 * Stops an ingress queue and its associated FLs, if any. This causes 7892 * any current or future data/messages destined for these queues to be 7893 * tossed. 7894 */ 7895 int t4_iq_stop(struct adapter *adap, unsigned int mbox, unsigned int pf, 7896 unsigned int vf, unsigned int iqtype, unsigned int iqid, 7897 unsigned int fl0id, unsigned int fl1id) 7898 { 7899 struct fw_iq_cmd c; 7900 7901 memset(&c, 0, sizeof(c)); 7902 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F | 7903 FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) | 7904 FW_IQ_CMD_VFN_V(vf)); 7905 c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_IQSTOP_F | FW_LEN16(c)); 7906 c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype)); 7907 c.iqid = cpu_to_be16(iqid); 7908 c.fl0id = cpu_to_be16(fl0id); 7909 c.fl1id = cpu_to_be16(fl1id); 7910 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7911 } 7912 7913 /** 7914 * t4_iq_free - free an ingress queue and its FLs 7915 * @adap: the adapter 7916 * @mbox: mailbox to use for the FW command 7917 * @pf: the PF owning the queues 7918 * @vf: the VF owning the queues 7919 * @iqtype: the ingress queue type 7920 * @iqid: ingress queue id 7921 * @fl0id: FL0 queue id or 0xffff if no attached FL0 7922 * @fl1id: FL1 queue id or 0xffff if no attached FL1 7923 * 7924 * Frees an ingress queue and its associated FLs, if any. 7925 */ 7926 int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, 7927 unsigned int vf, unsigned int iqtype, unsigned int iqid, 7928 unsigned int fl0id, unsigned int fl1id) 7929 { 7930 struct fw_iq_cmd c; 7931 7932 memset(&c, 0, sizeof(c)); 7933 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F | 7934 FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) | 7935 FW_IQ_CMD_VFN_V(vf)); 7936 c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_FREE_F | FW_LEN16(c)); 7937 c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype)); 7938 c.iqid = cpu_to_be16(iqid); 7939 c.fl0id = cpu_to_be16(fl0id); 7940 c.fl1id = cpu_to_be16(fl1id); 7941 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7942 } 7943 7944 /** 7945 * t4_eth_eq_free - free an Ethernet egress queue 7946 * @adap: the adapter 7947 * @mbox: mailbox to use for the FW command 7948 * @pf: the PF owning the queue 7949 * @vf: the VF owning the queue 7950 * @eqid: egress queue id 7951 * 7952 * Frees an Ethernet egress queue. 7953 */ 7954 int t4_eth_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, 7955 unsigned int vf, unsigned int eqid) 7956 { 7957 struct fw_eq_eth_cmd c; 7958 7959 memset(&c, 0, sizeof(c)); 7960 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_ETH_CMD) | 7961 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 7962 FW_EQ_ETH_CMD_PFN_V(pf) | 7963 FW_EQ_ETH_CMD_VFN_V(vf)); 7964 c.alloc_to_len16 = cpu_to_be32(FW_EQ_ETH_CMD_FREE_F | FW_LEN16(c)); 7965 c.eqid_pkd = cpu_to_be32(FW_EQ_ETH_CMD_EQID_V(eqid)); 7966 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7967 } 7968 7969 /** 7970 * t4_ctrl_eq_free - free a control egress queue 7971 * @adap: the adapter 7972 * @mbox: mailbox to use for the FW command 7973 * @pf: the PF owning the queue 7974 * @vf: the VF owning the queue 7975 * @eqid: egress queue id 7976 * 7977 * Frees a control egress queue. 7978 */ 7979 int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, 7980 unsigned int vf, unsigned int eqid) 7981 { 7982 struct fw_eq_ctrl_cmd c; 7983 7984 memset(&c, 0, sizeof(c)); 7985 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_CTRL_CMD) | 7986 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 7987 FW_EQ_CTRL_CMD_PFN_V(pf) | 7988 FW_EQ_CTRL_CMD_VFN_V(vf)); 7989 c.alloc_to_len16 = cpu_to_be32(FW_EQ_CTRL_CMD_FREE_F | FW_LEN16(c)); 7990 c.cmpliqid_eqid = cpu_to_be32(FW_EQ_CTRL_CMD_EQID_V(eqid)); 7991 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 7992 } 7993 7994 /** 7995 * t4_ofld_eq_free - free an offload egress queue 7996 * @adap: the adapter 7997 * @mbox: mailbox to use for the FW command 7998 * @pf: the PF owning the queue 7999 * @vf: the VF owning the queue 8000 * @eqid: egress queue id 8001 * 8002 * Frees a control egress queue. 8003 */ 8004 int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, 8005 unsigned int vf, unsigned int eqid) 8006 { 8007 struct fw_eq_ofld_cmd c; 8008 8009 memset(&c, 0, sizeof(c)); 8010 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_OFLD_CMD) | 8011 FW_CMD_REQUEST_F | FW_CMD_EXEC_F | 8012 FW_EQ_OFLD_CMD_PFN_V(pf) | 8013 FW_EQ_OFLD_CMD_VFN_V(vf)); 8014 c.alloc_to_len16 = cpu_to_be32(FW_EQ_OFLD_CMD_FREE_F | FW_LEN16(c)); 8015 c.eqid_pkd = cpu_to_be32(FW_EQ_OFLD_CMD_EQID_V(eqid)); 8016 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); 8017 } 8018 8019 /** 8020 * t4_link_down_rc_str - return a string for a Link Down Reason Code 8021 * @adap: the adapter 8022 * @link_down_rc: Link Down Reason Code 8023 * 8024 * Returns a string representation of the Link Down Reason Code. 8025 */ 8026 static const char *t4_link_down_rc_str(unsigned char link_down_rc) 8027 { 8028 static const char * const reason[] = { 8029 "Link Down", 8030 "Remote Fault", 8031 "Auto-negotiation Failure", 8032 "Reserved", 8033 "Insufficient Airflow", 8034 "Unable To Determine Reason", 8035 "No RX Signal Detected", 8036 "Reserved", 8037 }; 8038 8039 if (link_down_rc >= ARRAY_SIZE(reason)) 8040 return "Bad Reason Code"; 8041 8042 return reason[link_down_rc]; 8043 } 8044 8045 /** 8046 * Return the highest speed set in the port capabilities, in Mb/s. 8047 */ 8048 static unsigned int fwcap_to_speed(fw_port_cap32_t caps) 8049 { 8050 #define TEST_SPEED_RETURN(__caps_speed, __speed) \ 8051 do { \ 8052 if (caps & FW_PORT_CAP32_SPEED_##__caps_speed) \ 8053 return __speed; \ 8054 } while (0) 8055 8056 TEST_SPEED_RETURN(400G, 400000); 8057 TEST_SPEED_RETURN(200G, 200000); 8058 TEST_SPEED_RETURN(100G, 100000); 8059 TEST_SPEED_RETURN(50G, 50000); 8060 TEST_SPEED_RETURN(40G, 40000); 8061 TEST_SPEED_RETURN(25G, 25000); 8062 TEST_SPEED_RETURN(10G, 10000); 8063 TEST_SPEED_RETURN(1G, 1000); 8064 TEST_SPEED_RETURN(100M, 100); 8065 8066 #undef TEST_SPEED_RETURN 8067 8068 return 0; 8069 } 8070 8071 /** 8072 * fwcap_to_fwspeed - return highest speed in Port Capabilities 8073 * @acaps: advertised Port Capabilities 8074 * 8075 * Get the highest speed for the port from the advertised Port 8076 * Capabilities. It will be either the highest speed from the list of 8077 * speeds or whatever user has set using ethtool. 8078 */ 8079 static fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps) 8080 { 8081 #define TEST_SPEED_RETURN(__caps_speed) \ 8082 do { \ 8083 if (acaps & FW_PORT_CAP32_SPEED_##__caps_speed) \ 8084 return FW_PORT_CAP32_SPEED_##__caps_speed; \ 8085 } while (0) 8086 8087 TEST_SPEED_RETURN(400G); 8088 TEST_SPEED_RETURN(200G); 8089 TEST_SPEED_RETURN(100G); 8090 TEST_SPEED_RETURN(50G); 8091 TEST_SPEED_RETURN(40G); 8092 TEST_SPEED_RETURN(25G); 8093 TEST_SPEED_RETURN(10G); 8094 TEST_SPEED_RETURN(1G); 8095 TEST_SPEED_RETURN(100M); 8096 8097 #undef TEST_SPEED_RETURN 8098 8099 return 0; 8100 } 8101 8102 /** 8103 * lstatus_to_fwcap - translate old lstatus to 32-bit Port Capabilities 8104 * @lstatus: old FW_PORT_ACTION_GET_PORT_INFO lstatus value 8105 * 8106 * Translates old FW_PORT_ACTION_GET_PORT_INFO lstatus field into new 8107 * 32-bit Port Capabilities value. 8108 */ 8109 static fw_port_cap32_t lstatus_to_fwcap(u32 lstatus) 8110 { 8111 fw_port_cap32_t linkattr = 0; 8112 8113 /* Unfortunately the format of the Link Status in the old 8114 * 16-bit Port Information message isn't the same as the 8115 * 16-bit Port Capabilities bitfield used everywhere else ... 8116 */ 8117 if (lstatus & FW_PORT_CMD_RXPAUSE_F) 8118 linkattr |= FW_PORT_CAP32_FC_RX; 8119 if (lstatus & FW_PORT_CMD_TXPAUSE_F) 8120 linkattr |= FW_PORT_CAP32_FC_TX; 8121 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100M)) 8122 linkattr |= FW_PORT_CAP32_SPEED_100M; 8123 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_1G)) 8124 linkattr |= FW_PORT_CAP32_SPEED_1G; 8125 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G)) 8126 linkattr |= FW_PORT_CAP32_SPEED_10G; 8127 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_25G)) 8128 linkattr |= FW_PORT_CAP32_SPEED_25G; 8129 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G)) 8130 linkattr |= FW_PORT_CAP32_SPEED_40G; 8131 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100G)) 8132 linkattr |= FW_PORT_CAP32_SPEED_100G; 8133 8134 return linkattr; 8135 } 8136 8137 /** 8138 * t4_handle_get_port_info - process a FW reply message 8139 * @pi: the port info 8140 * @rpl: start of the FW message 8141 * 8142 * Processes a GET_PORT_INFO FW reply message. 8143 */ 8144 void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl) 8145 { 8146 const struct fw_port_cmd *cmd = (const void *)rpl; 8147 int action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16)); 8148 struct adapter *adapter = pi->adapter; 8149 struct link_config *lc = &pi->link_cfg; 8150 int link_ok, linkdnrc; 8151 enum fw_port_type port_type; 8152 enum fw_port_module_type mod_type; 8153 unsigned int speed, fc, fec; 8154 fw_port_cap32_t pcaps, acaps, lpacaps, linkattr; 8155 8156 /* Extract the various fields from the Port Information message. 8157 */ 8158 switch (action) { 8159 case FW_PORT_ACTION_GET_PORT_INFO: { 8160 u32 lstatus = be32_to_cpu(cmd->u.info.lstatus_to_modtype); 8161 8162 link_ok = (lstatus & FW_PORT_CMD_LSTATUS_F) != 0; 8163 linkdnrc = FW_PORT_CMD_LINKDNRC_G(lstatus); 8164 port_type = FW_PORT_CMD_PTYPE_G(lstatus); 8165 mod_type = FW_PORT_CMD_MODTYPE_G(lstatus); 8166 pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.pcap)); 8167 acaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.acap)); 8168 lpacaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.lpacap)); 8169 linkattr = lstatus_to_fwcap(lstatus); 8170 break; 8171 } 8172 8173 case FW_PORT_ACTION_GET_PORT_INFO32: { 8174 u32 lstatus32; 8175 8176 lstatus32 = be32_to_cpu(cmd->u.info32.lstatus32_to_cbllen32); 8177 link_ok = (lstatus32 & FW_PORT_CMD_LSTATUS32_F) != 0; 8178 linkdnrc = FW_PORT_CMD_LINKDNRC32_G(lstatus32); 8179 port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32); 8180 mod_type = FW_PORT_CMD_MODTYPE32_G(lstatus32); 8181 pcaps = be32_to_cpu(cmd->u.info32.pcaps32); 8182 acaps = be32_to_cpu(cmd->u.info32.acaps32); 8183 lpacaps = be32_to_cpu(cmd->u.info32.lpacaps32); 8184 linkattr = be32_to_cpu(cmd->u.info32.linkattr32); 8185 break; 8186 } 8187 8188 default: 8189 dev_err(adapter->pdev_dev, "Handle Port Information: Bad Command/Action %#x\n", 8190 be32_to_cpu(cmd->action_to_len16)); 8191 return; 8192 } 8193 8194 fec = fwcap_to_cc_fec(acaps); 8195 fc = fwcap_to_cc_pause(linkattr); 8196 speed = fwcap_to_speed(linkattr); 8197 8198 if (mod_type != pi->mod_type) { 8199 /* With the newer SFP28 and QSFP28 Transceiver Module Types, 8200 * various fundamental Port Capabilities which used to be 8201 * immutable can now change radically. We can now have 8202 * Speeds, Auto-Negotiation, Forward Error Correction, etc. 8203 * all change based on what Transceiver Module is inserted. 8204 * So we need to record the Physical "Port" Capabilities on 8205 * every Transceiver Module change. 8206 */ 8207 lc->pcaps = pcaps; 8208 8209 /* When a new Transceiver Module is inserted, the Firmware 8210 * will examine its i2c EPROM to determine its type and 8211 * general operating parameters including things like Forward 8212 * Error Control, etc. Various IEEE 802.3 standards dictate 8213 * how to interpret these i2c values to determine default 8214 * "sutomatic" settings. We record these for future use when 8215 * the user explicitly requests these standards-based values. 8216 */ 8217 lc->def_acaps = acaps; 8218 8219 /* Some versions of the early T6 Firmware "cheated" when 8220 * handling different Transceiver Modules by changing the 8221 * underlaying Port Type reported to the Host Drivers. As 8222 * such we need to capture whatever Port Type the Firmware 8223 * sends us and record it in case it's different from what we 8224 * were told earlier. Unfortunately, since Firmware is 8225 * forever, we'll need to keep this code here forever, but in 8226 * later T6 Firmware it should just be an assignment of the 8227 * same value already recorded. 8228 */ 8229 pi->port_type = port_type; 8230 8231 pi->mod_type = mod_type; 8232 t4_os_portmod_changed(adapter, pi->port_id); 8233 } 8234 8235 if (link_ok != lc->link_ok || speed != lc->speed || 8236 fc != lc->fc || fec != lc->fec) { /* something changed */ 8237 if (!link_ok && lc->link_ok) { 8238 lc->link_down_rc = linkdnrc; 8239 dev_warn(adapter->pdev_dev, "Port %d link down, reason: %s\n", 8240 pi->tx_chan, t4_link_down_rc_str(linkdnrc)); 8241 } 8242 lc->link_ok = link_ok; 8243 lc->speed = speed; 8244 lc->fc = fc; 8245 lc->fec = fec; 8246 8247 lc->lpacaps = lpacaps; 8248 lc->acaps = acaps & ADVERT_MASK; 8249 8250 if (lc->acaps & FW_PORT_CAP32_ANEG) { 8251 lc->autoneg = AUTONEG_ENABLE; 8252 } else { 8253 /* When Autoneg is disabled, user needs to set 8254 * single speed. 8255 * Similar to cxgb4_ethtool.c: set_link_ksettings 8256 */ 8257 lc->acaps = 0; 8258 lc->speed_caps = fwcap_to_fwspeed(acaps); 8259 lc->autoneg = AUTONEG_DISABLE; 8260 } 8261 8262 t4_os_link_changed(adapter, pi->port_id, link_ok); 8263 } 8264 } 8265 8266 /** 8267 * t4_update_port_info - retrieve and update port information if changed 8268 * @pi: the port_info 8269 * 8270 * We issue a Get Port Information Command to the Firmware and, if 8271 * successful, we check to see if anything is different from what we 8272 * last recorded and update things accordingly. 8273 */ 8274 int t4_update_port_info(struct port_info *pi) 8275 { 8276 unsigned int fw_caps = pi->adapter->params.fw_caps_support; 8277 struct fw_port_cmd port_cmd; 8278 int ret; 8279 8280 memset(&port_cmd, 0, sizeof(port_cmd)); 8281 port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | 8282 FW_CMD_REQUEST_F | FW_CMD_READ_F | 8283 FW_PORT_CMD_PORTID_V(pi->tx_chan)); 8284 port_cmd.action_to_len16 = cpu_to_be32( 8285 FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16 8286 ? FW_PORT_ACTION_GET_PORT_INFO 8287 : FW_PORT_ACTION_GET_PORT_INFO32) | 8288 FW_LEN16(port_cmd)); 8289 ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox, 8290 &port_cmd, sizeof(port_cmd), &port_cmd); 8291 if (ret) 8292 return ret; 8293 8294 t4_handle_get_port_info(pi, (__be64 *)&port_cmd); 8295 return 0; 8296 } 8297 8298 /** 8299 * t4_get_link_params - retrieve basic link parameters for given port 8300 * @pi: the port 8301 * @link_okp: value return pointer for link up/down 8302 * @speedp: value return pointer for speed (Mb/s) 8303 * @mtup: value return pointer for mtu 8304 * 8305 * Retrieves basic link parameters for a port: link up/down, speed (Mb/s), 8306 * and MTU for a specified port. A negative error is returned on 8307 * failure; 0 on success. 8308 */ 8309 int t4_get_link_params(struct port_info *pi, unsigned int *link_okp, 8310 unsigned int *speedp, unsigned int *mtup) 8311 { 8312 unsigned int fw_caps = pi->adapter->params.fw_caps_support; 8313 struct fw_port_cmd port_cmd; 8314 unsigned int action, link_ok, speed, mtu; 8315 fw_port_cap32_t linkattr; 8316 int ret; 8317 8318 memset(&port_cmd, 0, sizeof(port_cmd)); 8319 port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | 8320 FW_CMD_REQUEST_F | FW_CMD_READ_F | 8321 FW_PORT_CMD_PORTID_V(pi->tx_chan)); 8322 action = (fw_caps == FW_CAPS16 8323 ? FW_PORT_ACTION_GET_PORT_INFO 8324 : FW_PORT_ACTION_GET_PORT_INFO32); 8325 port_cmd.action_to_len16 = cpu_to_be32( 8326 FW_PORT_CMD_ACTION_V(action) | 8327 FW_LEN16(port_cmd)); 8328 ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox, 8329 &port_cmd, sizeof(port_cmd), &port_cmd); 8330 if (ret) 8331 return ret; 8332 8333 if (action == FW_PORT_ACTION_GET_PORT_INFO) { 8334 u32 lstatus = be32_to_cpu(port_cmd.u.info.lstatus_to_modtype); 8335 8336 link_ok = !!(lstatus & FW_PORT_CMD_LSTATUS_F); 8337 linkattr = lstatus_to_fwcap(lstatus); 8338 mtu = be16_to_cpu(port_cmd.u.info.mtu); 8339 } else { 8340 u32 lstatus32 = 8341 be32_to_cpu(port_cmd.u.info32.lstatus32_to_cbllen32); 8342 8343 link_ok = !!(lstatus32 & FW_PORT_CMD_LSTATUS32_F); 8344 linkattr = be32_to_cpu(port_cmd.u.info32.linkattr32); 8345 mtu = FW_PORT_CMD_MTU32_G( 8346 be32_to_cpu(port_cmd.u.info32.auxlinfo32_mtu32)); 8347 } 8348 speed = fwcap_to_speed(linkattr); 8349 8350 *link_okp = link_ok; 8351 *speedp = fwcap_to_speed(linkattr); 8352 *mtup = mtu; 8353 8354 return 0; 8355 } 8356 8357 /** 8358 * t4_handle_fw_rpl - process a FW reply message 8359 * @adap: the adapter 8360 * @rpl: start of the FW message 8361 * 8362 * Processes a FW message, such as link state change messages. 8363 */ 8364 int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl) 8365 { 8366 u8 opcode = *(const u8 *)rpl; 8367 8368 /* This might be a port command ... this simplifies the following 8369 * conditionals ... We can get away with pre-dereferencing 8370 * action_to_len16 because it's in the first 16 bytes and all messages 8371 * will be at least that long. 8372 */ 8373 const struct fw_port_cmd *p = (const void *)rpl; 8374 unsigned int action = 8375 FW_PORT_CMD_ACTION_G(be32_to_cpu(p->action_to_len16)); 8376 8377 if (opcode == FW_PORT_CMD && 8378 (action == FW_PORT_ACTION_GET_PORT_INFO || 8379 action == FW_PORT_ACTION_GET_PORT_INFO32)) { 8380 int i; 8381 int chan = FW_PORT_CMD_PORTID_G(be32_to_cpu(p->op_to_portid)); 8382 struct port_info *pi = NULL; 8383 8384 for_each_port(adap, i) { 8385 pi = adap2pinfo(adap, i); 8386 if (pi->tx_chan == chan) 8387 break; 8388 } 8389 8390 t4_handle_get_port_info(pi, rpl); 8391 } else { 8392 dev_warn(adap->pdev_dev, "Unknown firmware reply %d\n", 8393 opcode); 8394 return -EINVAL; 8395 } 8396 return 0; 8397 } 8398 8399 static void get_pci_mode(struct adapter *adapter, struct pci_params *p) 8400 { 8401 u16 val; 8402 8403 if (pci_is_pcie(adapter->pdev)) { 8404 pcie_capability_read_word(adapter->pdev, PCI_EXP_LNKSTA, &val); 8405 p->speed = val & PCI_EXP_LNKSTA_CLS; 8406 p->width = (val & PCI_EXP_LNKSTA_NLW) >> 4; 8407 } 8408 } 8409 8410 /** 8411 * init_link_config - initialize a link's SW state 8412 * @lc: pointer to structure holding the link state 8413 * @pcaps: link Port Capabilities 8414 * @acaps: link current Advertised Port Capabilities 8415 * 8416 * Initializes the SW state maintained for each link, including the link's 8417 * capabilities and default speed/flow-control/autonegotiation settings. 8418 */ 8419 static void init_link_config(struct link_config *lc, fw_port_cap32_t pcaps, 8420 fw_port_cap32_t acaps) 8421 { 8422 lc->pcaps = pcaps; 8423 lc->def_acaps = acaps; 8424 lc->lpacaps = 0; 8425 lc->speed_caps = 0; 8426 lc->speed = 0; 8427 lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX; 8428 8429 /* For Forward Error Control, we default to whatever the Firmware 8430 * tells us the Link is currently advertising. 8431 */ 8432 lc->requested_fec = FEC_AUTO; 8433 lc->fec = fwcap_to_cc_fec(lc->def_acaps); 8434 8435 if (lc->pcaps & FW_PORT_CAP32_ANEG) { 8436 lc->acaps = lc->pcaps & ADVERT_MASK; 8437 lc->autoneg = AUTONEG_ENABLE; 8438 lc->requested_fc |= PAUSE_AUTONEG; 8439 } else { 8440 lc->acaps = 0; 8441 lc->autoneg = AUTONEG_DISABLE; 8442 } 8443 } 8444 8445 #define CIM_PF_NOACCESS 0xeeeeeeee 8446 8447 int t4_wait_dev_ready(void __iomem *regs) 8448 { 8449 u32 whoami; 8450 8451 whoami = readl(regs + PL_WHOAMI_A); 8452 if (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS) 8453 return 0; 8454 8455 msleep(500); 8456 whoami = readl(regs + PL_WHOAMI_A); 8457 return (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS ? 0 : -EIO); 8458 } 8459 8460 struct flash_desc { 8461 u32 vendor_and_model_id; 8462 u32 size_mb; 8463 }; 8464 8465 static int t4_get_flash_params(struct adapter *adap) 8466 { 8467 /* Table for non-Numonix supported flash parts. Numonix parts are left 8468 * to the preexisting code. All flash parts have 64KB sectors. 8469 */ 8470 static struct flash_desc supported_flash[] = { 8471 { 0x150201, 4 << 20 }, /* Spansion 4MB S25FL032P */ 8472 }; 8473 8474 unsigned int part, manufacturer; 8475 unsigned int density, size; 8476 u32 flashid = 0; 8477 int ret; 8478 8479 /* Issue a Read ID Command to the Flash part. We decode supported 8480 * Flash parts and their sizes from this. There's a newer Query 8481 * Command which can retrieve detailed geometry information but many 8482 * Flash parts don't support it. 8483 */ 8484 8485 ret = sf1_write(adap, 1, 1, 0, SF_RD_ID); 8486 if (!ret) 8487 ret = sf1_read(adap, 3, 0, 1, &flashid); 8488 t4_write_reg(adap, SF_OP_A, 0); /* unlock SF */ 8489 if (ret) 8490 return ret; 8491 8492 /* Check to see if it's one of our non-standard supported Flash parts. 8493 */ 8494 for (part = 0; part < ARRAY_SIZE(supported_flash); part++) 8495 if (supported_flash[part].vendor_and_model_id == flashid) { 8496 adap->params.sf_size = supported_flash[part].size_mb; 8497 adap->params.sf_nsec = 8498 adap->params.sf_size / SF_SEC_SIZE; 8499 goto found; 8500 } 8501 8502 /* Decode Flash part size. The code below looks repetative with 8503 * common encodings, but that's not guaranteed in the JEDEC 8504 * specification for the Read JADEC ID command. The only thing that 8505 * we're guaranteed by the JADEC specification is where the 8506 * Manufacturer ID is in the returned result. After that each 8507 * Manufacturer ~could~ encode things completely differently. 8508 * Note, all Flash parts must have 64KB sectors. 8509 */ 8510 manufacturer = flashid & 0xff; 8511 switch (manufacturer) { 8512 case 0x20: { /* Micron/Numonix */ 8513 /* This Density -> Size decoding table is taken from Micron 8514 * Data Sheets. 8515 */ 8516 density = (flashid >> 16) & 0xff; 8517 switch (density) { 8518 case 0x14: /* 1MB */ 8519 size = 1 << 20; 8520 break; 8521 case 0x15: /* 2MB */ 8522 size = 1 << 21; 8523 break; 8524 case 0x16: /* 4MB */ 8525 size = 1 << 22; 8526 break; 8527 case 0x17: /* 8MB */ 8528 size = 1 << 23; 8529 break; 8530 case 0x18: /* 16MB */ 8531 size = 1 << 24; 8532 break; 8533 case 0x19: /* 32MB */ 8534 size = 1 << 25; 8535 break; 8536 case 0x20: /* 64MB */ 8537 size = 1 << 26; 8538 break; 8539 case 0x21: /* 128MB */ 8540 size = 1 << 27; 8541 break; 8542 case 0x22: /* 256MB */ 8543 size = 1 << 28; 8544 break; 8545 8546 default: 8547 dev_err(adap->pdev_dev, "Micron Flash Part has bad size, ID = %#x, Density code = %#x\n", 8548 flashid, density); 8549 return -EINVAL; 8550 } 8551 break; 8552 } 8553 case 0xc2: { /* Macronix */ 8554 /* This Density -> Size decoding table is taken from Macronix 8555 * Data Sheets. 8556 */ 8557 density = (flashid >> 16) & 0xff; 8558 switch (density) { 8559 case 0x17: /* 8MB */ 8560 size = 1 << 23; 8561 break; 8562 case 0x18: /* 16MB */ 8563 size = 1 << 24; 8564 break; 8565 default: 8566 dev_err(adap->pdev_dev, "Macronix Flash Part has bad size, ID = %#x, Density code = %#x\n", 8567 flashid, density); 8568 return -EINVAL; 8569 } 8570 break; 8571 } 8572 case 0xef: { /* Winbond */ 8573 /* This Density -> Size decoding table is taken from Winbond 8574 * Data Sheets. 8575 */ 8576 density = (flashid >> 16) & 0xff; 8577 switch (density) { 8578 case 0x17: /* 8MB */ 8579 size = 1 << 23; 8580 break; 8581 case 0x18: /* 16MB */ 8582 size = 1 << 24; 8583 break; 8584 default: 8585 dev_err(adap->pdev_dev, "Winbond Flash Part has bad size, ID = %#x, Density code = %#x\n", 8586 flashid, density); 8587 return -EINVAL; 8588 } 8589 break; 8590 } 8591 default: 8592 dev_err(adap->pdev_dev, "Unsupported Flash Part, ID = %#x\n", 8593 flashid); 8594 return -EINVAL; 8595 } 8596 8597 /* Store decoded Flash size and fall through into vetting code. */ 8598 adap->params.sf_size = size; 8599 adap->params.sf_nsec = size / SF_SEC_SIZE; 8600 8601 found: 8602 if (adap->params.sf_size < FLASH_MIN_SIZE) 8603 dev_warn(adap->pdev_dev, "WARNING: Flash Part ID %#x, size %#x < %#x\n", 8604 flashid, adap->params.sf_size, FLASH_MIN_SIZE); 8605 return 0; 8606 } 8607 8608 /** 8609 * t4_prep_adapter - prepare SW and HW for operation 8610 * @adapter: the adapter 8611 * @reset: if true perform a HW reset 8612 * 8613 * Initialize adapter SW state for the various HW modules, set initial 8614 * values for some adapter tunables, take PHYs out of reset, and 8615 * initialize the MDIO interface. 8616 */ 8617 int t4_prep_adapter(struct adapter *adapter) 8618 { 8619 int ret, ver; 8620 uint16_t device_id; 8621 u32 pl_rev; 8622 8623 get_pci_mode(adapter, &adapter->params.pci); 8624 pl_rev = REV_G(t4_read_reg(adapter, PL_REV_A)); 8625 8626 ret = t4_get_flash_params(adapter); 8627 if (ret < 0) { 8628 dev_err(adapter->pdev_dev, "error %d identifying flash\n", ret); 8629 return ret; 8630 } 8631 8632 /* Retrieve adapter's device ID 8633 */ 8634 pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id); 8635 ver = device_id >> 12; 8636 adapter->params.chip = 0; 8637 switch (ver) { 8638 case CHELSIO_T4: 8639 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev); 8640 adapter->params.arch.sge_fl_db = DBPRIO_F; 8641 adapter->params.arch.mps_tcam_size = 8642 NUM_MPS_CLS_SRAM_L_INSTANCES; 8643 adapter->params.arch.mps_rplc_size = 128; 8644 adapter->params.arch.nchan = NCHAN; 8645 adapter->params.arch.pm_stats_cnt = PM_NSTATS; 8646 adapter->params.arch.vfcount = 128; 8647 /* Congestion map is for 4 channels so that 8648 * MPS can have 4 priority per port. 8649 */ 8650 adapter->params.arch.cng_ch_bits_log = 2; 8651 break; 8652 case CHELSIO_T5: 8653 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev); 8654 adapter->params.arch.sge_fl_db = DBPRIO_F | DBTYPE_F; 8655 adapter->params.arch.mps_tcam_size = 8656 NUM_MPS_T5_CLS_SRAM_L_INSTANCES; 8657 adapter->params.arch.mps_rplc_size = 128; 8658 adapter->params.arch.nchan = NCHAN; 8659 adapter->params.arch.pm_stats_cnt = PM_NSTATS; 8660 adapter->params.arch.vfcount = 128; 8661 adapter->params.arch.cng_ch_bits_log = 2; 8662 break; 8663 case CHELSIO_T6: 8664 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T6, pl_rev); 8665 adapter->params.arch.sge_fl_db = 0; 8666 adapter->params.arch.mps_tcam_size = 8667 NUM_MPS_T5_CLS_SRAM_L_INSTANCES; 8668 adapter->params.arch.mps_rplc_size = 256; 8669 adapter->params.arch.nchan = 2; 8670 adapter->params.arch.pm_stats_cnt = T6_PM_NSTATS; 8671 adapter->params.arch.vfcount = 256; 8672 /* Congestion map will be for 2 channels so that 8673 * MPS can have 8 priority per port. 8674 */ 8675 adapter->params.arch.cng_ch_bits_log = 3; 8676 break; 8677 default: 8678 dev_err(adapter->pdev_dev, "Device %d is not supported\n", 8679 device_id); 8680 return -EINVAL; 8681 } 8682 8683 adapter->params.cim_la_size = CIMLA_SIZE; 8684 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd); 8685 8686 /* 8687 * Default port for debugging in case we can't reach FW. 8688 */ 8689 adapter->params.nports = 1; 8690 adapter->params.portvec = 1; 8691 adapter->params.vpd.cclk = 50000; 8692 8693 /* Set PCIe completion timeout to 4 seconds. */ 8694 pcie_capability_clear_and_set_word(adapter->pdev, PCI_EXP_DEVCTL2, 8695 PCI_EXP_DEVCTL2_COMP_TIMEOUT, 0xd); 8696 return 0; 8697 } 8698 8699 /** 8700 * t4_shutdown_adapter - shut down adapter, host & wire 8701 * @adapter: the adapter 8702 * 8703 * Perform an emergency shutdown of the adapter and stop it from 8704 * continuing any further communication on the ports or DMA to the 8705 * host. This is typically used when the adapter and/or firmware 8706 * have crashed and we want to prevent any further accidental 8707 * communication with the rest of the world. This will also force 8708 * the port Link Status to go down -- if register writes work -- 8709 * which should help our peers figure out that we're down. 8710 */ 8711 int t4_shutdown_adapter(struct adapter *adapter) 8712 { 8713 int port; 8714 8715 t4_intr_disable(adapter); 8716 t4_write_reg(adapter, DBG_GPIO_EN_A, 0); 8717 for_each_port(adapter, port) { 8718 u32 a_port_cfg = is_t4(adapter->params.chip) ? 8719 PORT_REG(port, XGMAC_PORT_CFG_A) : 8720 T5_PORT_REG(port, MAC_PORT_CFG_A); 8721 8722 t4_write_reg(adapter, a_port_cfg, 8723 t4_read_reg(adapter, a_port_cfg) 8724 & ~SIGNAL_DET_V(1)); 8725 } 8726 t4_set_reg_field(adapter, SGE_CONTROL_A, GLOBALENABLE_F, 0); 8727 8728 return 0; 8729 } 8730 8731 /** 8732 * t4_bar2_sge_qregs - return BAR2 SGE Queue register information 8733 * @adapter: the adapter 8734 * @qid: the Queue ID 8735 * @qtype: the Ingress or Egress type for @qid 8736 * @user: true if this request is for a user mode queue 8737 * @pbar2_qoffset: BAR2 Queue Offset 8738 * @pbar2_qid: BAR2 Queue ID or 0 for Queue ID inferred SGE Queues 8739 * 8740 * Returns the BAR2 SGE Queue Registers information associated with the 8741 * indicated Absolute Queue ID. These are passed back in return value 8742 * pointers. @qtype should be T4_BAR2_QTYPE_EGRESS for Egress Queue 8743 * and T4_BAR2_QTYPE_INGRESS for Ingress Queues. 8744 * 8745 * This may return an error which indicates that BAR2 SGE Queue 8746 * registers aren't available. If an error is not returned, then the 8747 * following values are returned: 8748 * 8749 * *@pbar2_qoffset: the BAR2 Offset of the @qid Registers 8750 * *@pbar2_qid: the BAR2 SGE Queue ID or 0 of @qid 8751 * 8752 * If the returned BAR2 Queue ID is 0, then BAR2 SGE registers which 8753 * require the "Inferred Queue ID" ability may be used. E.g. the 8754 * Write Combining Doorbell Buffer. If the BAR2 Queue ID is not 0, 8755 * then these "Inferred Queue ID" register may not be used. 8756 */ 8757 int t4_bar2_sge_qregs(struct adapter *adapter, 8758 unsigned int qid, 8759 enum t4_bar2_qtype qtype, 8760 int user, 8761 u64 *pbar2_qoffset, 8762 unsigned int *pbar2_qid) 8763 { 8764 unsigned int page_shift, page_size, qpp_shift, qpp_mask; 8765 u64 bar2_page_offset, bar2_qoffset; 8766 unsigned int bar2_qid, bar2_qid_offset, bar2_qinferred; 8767 8768 /* T4 doesn't support BAR2 SGE Queue registers for kernel mode queues */ 8769 if (!user && is_t4(adapter->params.chip)) 8770 return -EINVAL; 8771 8772 /* Get our SGE Page Size parameters. 8773 */ 8774 page_shift = adapter->params.sge.hps + 10; 8775 page_size = 1 << page_shift; 8776 8777 /* Get the right Queues per Page parameters for our Queue. 8778 */ 8779 qpp_shift = (qtype == T4_BAR2_QTYPE_EGRESS 8780 ? adapter->params.sge.eq_qpp 8781 : adapter->params.sge.iq_qpp); 8782 qpp_mask = (1 << qpp_shift) - 1; 8783 8784 /* Calculate the basics of the BAR2 SGE Queue register area: 8785 * o The BAR2 page the Queue registers will be in. 8786 * o The BAR2 Queue ID. 8787 * o The BAR2 Queue ID Offset into the BAR2 page. 8788 */ 8789 bar2_page_offset = ((u64)(qid >> qpp_shift) << page_shift); 8790 bar2_qid = qid & qpp_mask; 8791 bar2_qid_offset = bar2_qid * SGE_UDB_SIZE; 8792 8793 /* If the BAR2 Queue ID Offset is less than the Page Size, then the 8794 * hardware will infer the Absolute Queue ID simply from the writes to 8795 * the BAR2 Queue ID Offset within the BAR2 Page (and we need to use a 8796 * BAR2 Queue ID of 0 for those writes). Otherwise, we'll simply 8797 * write to the first BAR2 SGE Queue Area within the BAR2 Page with 8798 * the BAR2 Queue ID and the hardware will infer the Absolute Queue ID 8799 * from the BAR2 Page and BAR2 Queue ID. 8800 * 8801 * One important censequence of this is that some BAR2 SGE registers 8802 * have a "Queue ID" field and we can write the BAR2 SGE Queue ID 8803 * there. But other registers synthesize the SGE Queue ID purely 8804 * from the writes to the registers -- the Write Combined Doorbell 8805 * Buffer is a good example. These BAR2 SGE Registers are only 8806 * available for those BAR2 SGE Register areas where the SGE Absolute 8807 * Queue ID can be inferred from simple writes. 8808 */ 8809 bar2_qoffset = bar2_page_offset; 8810 bar2_qinferred = (bar2_qid_offset < page_size); 8811 if (bar2_qinferred) { 8812 bar2_qoffset += bar2_qid_offset; 8813 bar2_qid = 0; 8814 } 8815 8816 *pbar2_qoffset = bar2_qoffset; 8817 *pbar2_qid = bar2_qid; 8818 return 0; 8819 } 8820 8821 /** 8822 * t4_init_devlog_params - initialize adapter->params.devlog 8823 * @adap: the adapter 8824 * 8825 * Initialize various fields of the adapter's Firmware Device Log 8826 * Parameters structure. 8827 */ 8828 int t4_init_devlog_params(struct adapter *adap) 8829 { 8830 struct devlog_params *dparams = &adap->params.devlog; 8831 u32 pf_dparams; 8832 unsigned int devlog_meminfo; 8833 struct fw_devlog_cmd devlog_cmd; 8834 int ret; 8835 8836 /* If we're dealing with newer firmware, the Device Log Paramerters 8837 * are stored in a designated register which allows us to access the 8838 * Device Log even if we can't talk to the firmware. 8839 */ 8840 pf_dparams = 8841 t4_read_reg(adap, PCIE_FW_REG(PCIE_FW_PF_A, PCIE_FW_PF_DEVLOG)); 8842 if (pf_dparams) { 8843 unsigned int nentries, nentries128; 8844 8845 dparams->memtype = PCIE_FW_PF_DEVLOG_MEMTYPE_G(pf_dparams); 8846 dparams->start = PCIE_FW_PF_DEVLOG_ADDR16_G(pf_dparams) << 4; 8847 8848 nentries128 = PCIE_FW_PF_DEVLOG_NENTRIES128_G(pf_dparams); 8849 nentries = (nentries128 + 1) * 128; 8850 dparams->size = nentries * sizeof(struct fw_devlog_e); 8851 8852 return 0; 8853 } 8854 8855 /* Otherwise, ask the firmware for it's Device Log Parameters. 8856 */ 8857 memset(&devlog_cmd, 0, sizeof(devlog_cmd)); 8858 devlog_cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_DEVLOG_CMD) | 8859 FW_CMD_REQUEST_F | FW_CMD_READ_F); 8860 devlog_cmd.retval_len16 = cpu_to_be32(FW_LEN16(devlog_cmd)); 8861 ret = t4_wr_mbox(adap, adap->mbox, &devlog_cmd, sizeof(devlog_cmd), 8862 &devlog_cmd); 8863 if (ret) 8864 return ret; 8865 8866 devlog_meminfo = 8867 be32_to_cpu(devlog_cmd.memtype_devlog_memaddr16_devlog); 8868 dparams->memtype = FW_DEVLOG_CMD_MEMTYPE_DEVLOG_G(devlog_meminfo); 8869 dparams->start = FW_DEVLOG_CMD_MEMADDR16_DEVLOG_G(devlog_meminfo) << 4; 8870 dparams->size = be32_to_cpu(devlog_cmd.memsize_devlog); 8871 8872 return 0; 8873 } 8874 8875 /** 8876 * t4_init_sge_params - initialize adap->params.sge 8877 * @adapter: the adapter 8878 * 8879 * Initialize various fields of the adapter's SGE Parameters structure. 8880 */ 8881 int t4_init_sge_params(struct adapter *adapter) 8882 { 8883 struct sge_params *sge_params = &adapter->params.sge; 8884 u32 hps, qpp; 8885 unsigned int s_hps, s_qpp; 8886 8887 /* Extract the SGE Page Size for our PF. 8888 */ 8889 hps = t4_read_reg(adapter, SGE_HOST_PAGE_SIZE_A); 8890 s_hps = (HOSTPAGESIZEPF0_S + 8891 (HOSTPAGESIZEPF1_S - HOSTPAGESIZEPF0_S) * adapter->pf); 8892 sge_params->hps = ((hps >> s_hps) & HOSTPAGESIZEPF0_M); 8893 8894 /* Extract the SGE Egress and Ingess Queues Per Page for our PF. 8895 */ 8896 s_qpp = (QUEUESPERPAGEPF0_S + 8897 (QUEUESPERPAGEPF1_S - QUEUESPERPAGEPF0_S) * adapter->pf); 8898 qpp = t4_read_reg(adapter, SGE_EGRESS_QUEUES_PER_PAGE_PF_A); 8899 sge_params->eq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M); 8900 qpp = t4_read_reg(adapter, SGE_INGRESS_QUEUES_PER_PAGE_PF_A); 8901 sge_params->iq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M); 8902 8903 return 0; 8904 } 8905 8906 /** 8907 * t4_init_tp_params - initialize adap->params.tp 8908 * @adap: the adapter 8909 * @sleep_ok: if true we may sleep while awaiting command completion 8910 * 8911 * Initialize various fields of the adapter's TP Parameters structure. 8912 */ 8913 int t4_init_tp_params(struct adapter *adap, bool sleep_ok) 8914 { 8915 int chan; 8916 u32 v; 8917 8918 v = t4_read_reg(adap, TP_TIMER_RESOLUTION_A); 8919 adap->params.tp.tre = TIMERRESOLUTION_G(v); 8920 adap->params.tp.dack_re = DELAYEDACKRESOLUTION_G(v); 8921 8922 /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */ 8923 for (chan = 0; chan < NCHAN; chan++) 8924 adap->params.tp.tx_modq[chan] = chan; 8925 8926 /* Cache the adapter's Compressed Filter Mode and global Incress 8927 * Configuration. 8928 */ 8929 t4_tp_pio_read(adap, &adap->params.tp.vlan_pri_map, 1, 8930 TP_VLAN_PRI_MAP_A, sleep_ok); 8931 t4_tp_pio_read(adap, &adap->params.tp.ingress_config, 1, 8932 TP_INGRESS_CONFIG_A, sleep_ok); 8933 8934 /* For T6, cache the adapter's compressed error vector 8935 * and passing outer header info for encapsulated packets. 8936 */ 8937 if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) { 8938 v = t4_read_reg(adap, TP_OUT_CONFIG_A); 8939 adap->params.tp.rx_pkt_encap = (v & CRXPKTENC_F) ? 1 : 0; 8940 } 8941 8942 /* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field 8943 * shift positions of several elements of the Compressed Filter Tuple 8944 * for this adapter which we need frequently ... 8945 */ 8946 adap->params.tp.fcoe_shift = t4_filter_field_shift(adap, FCOE_F); 8947 adap->params.tp.port_shift = t4_filter_field_shift(adap, PORT_F); 8948 adap->params.tp.vnic_shift = t4_filter_field_shift(adap, VNIC_ID_F); 8949 adap->params.tp.vlan_shift = t4_filter_field_shift(adap, VLAN_F); 8950 adap->params.tp.tos_shift = t4_filter_field_shift(adap, TOS_F); 8951 adap->params.tp.protocol_shift = t4_filter_field_shift(adap, 8952 PROTOCOL_F); 8953 adap->params.tp.ethertype_shift = t4_filter_field_shift(adap, 8954 ETHERTYPE_F); 8955 adap->params.tp.macmatch_shift = t4_filter_field_shift(adap, 8956 MACMATCH_F); 8957 adap->params.tp.matchtype_shift = t4_filter_field_shift(adap, 8958 MPSHITTYPE_F); 8959 adap->params.tp.frag_shift = t4_filter_field_shift(adap, 8960 FRAGMENTATION_F); 8961 8962 /* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID 8963 * represents the presence of an Outer VLAN instead of a VNIC ID. 8964 */ 8965 if ((adap->params.tp.ingress_config & VNIC_F) == 0) 8966 adap->params.tp.vnic_shift = -1; 8967 8968 v = t4_read_reg(adap, LE_3_DB_HASH_MASK_GEN_IPV4_T6_A); 8969 adap->params.tp.hash_filter_mask = v; 8970 v = t4_read_reg(adap, LE_4_DB_HASH_MASK_GEN_IPV4_T6_A); 8971 adap->params.tp.hash_filter_mask |= ((u64)v << 32); 8972 return 0; 8973 } 8974 8975 /** 8976 * t4_filter_field_shift - calculate filter field shift 8977 * @adap: the adapter 8978 * @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits) 8979 * 8980 * Return the shift position of a filter field within the Compressed 8981 * Filter Tuple. The filter field is specified via its selection bit 8982 * within TP_VLAN_PRI_MAL (filter mode). E.g. F_VLAN. 8983 */ 8984 int t4_filter_field_shift(const struct adapter *adap, int filter_sel) 8985 { 8986 unsigned int filter_mode = adap->params.tp.vlan_pri_map; 8987 unsigned int sel; 8988 int field_shift; 8989 8990 if ((filter_mode & filter_sel) == 0) 8991 return -1; 8992 8993 for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) { 8994 switch (filter_mode & sel) { 8995 case FCOE_F: 8996 field_shift += FT_FCOE_W; 8997 break; 8998 case PORT_F: 8999 field_shift += FT_PORT_W; 9000 break; 9001 case VNIC_ID_F: 9002 field_shift += FT_VNIC_ID_W; 9003 break; 9004 case VLAN_F: 9005 field_shift += FT_VLAN_W; 9006 break; 9007 case TOS_F: 9008 field_shift += FT_TOS_W; 9009 break; 9010 case PROTOCOL_F: 9011 field_shift += FT_PROTOCOL_W; 9012 break; 9013 case ETHERTYPE_F: 9014 field_shift += FT_ETHERTYPE_W; 9015 break; 9016 case MACMATCH_F: 9017 field_shift += FT_MACMATCH_W; 9018 break; 9019 case MPSHITTYPE_F: 9020 field_shift += FT_MPSHITTYPE_W; 9021 break; 9022 case FRAGMENTATION_F: 9023 field_shift += FT_FRAGMENTATION_W; 9024 break; 9025 } 9026 } 9027 return field_shift; 9028 } 9029 9030 int t4_init_rss_mode(struct adapter *adap, int mbox) 9031 { 9032 int i, ret; 9033 struct fw_rss_vi_config_cmd rvc; 9034 9035 memset(&rvc, 0, sizeof(rvc)); 9036 9037 for_each_port(adap, i) { 9038 struct port_info *p = adap2pinfo(adap, i); 9039 9040 rvc.op_to_viid = 9041 cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) | 9042 FW_CMD_REQUEST_F | FW_CMD_READ_F | 9043 FW_RSS_VI_CONFIG_CMD_VIID_V(p->viid)); 9044 rvc.retval_len16 = cpu_to_be32(FW_LEN16(rvc)); 9045 ret = t4_wr_mbox(adap, mbox, &rvc, sizeof(rvc), &rvc); 9046 if (ret) 9047 return ret; 9048 p->rss_mode = be32_to_cpu(rvc.u.basicvirtual.defaultq_to_udpen); 9049 } 9050 return 0; 9051 } 9052 9053 /** 9054 * t4_init_portinfo - allocate a virtual interface and initialize port_info 9055 * @pi: the port_info 9056 * @mbox: mailbox to use for the FW command 9057 * @port: physical port associated with the VI 9058 * @pf: the PF owning the VI 9059 * @vf: the VF owning the VI 9060 * @mac: the MAC address of the VI 9061 * 9062 * Allocates a virtual interface for the given physical port. If @mac is 9063 * not %NULL it contains the MAC address of the VI as assigned by FW. 9064 * @mac should be large enough to hold an Ethernet address. 9065 * Returns < 0 on error. 9066 */ 9067 int t4_init_portinfo(struct port_info *pi, int mbox, 9068 int port, int pf, int vf, u8 mac[]) 9069 { 9070 struct adapter *adapter = pi->adapter; 9071 unsigned int fw_caps = adapter->params.fw_caps_support; 9072 struct fw_port_cmd cmd; 9073 unsigned int rss_size; 9074 enum fw_port_type port_type; 9075 int mdio_addr; 9076 fw_port_cap32_t pcaps, acaps; 9077 int ret; 9078 9079 /* If we haven't yet determined whether we're talking to Firmware 9080 * which knows the new 32-bit Port Capabilities, it's time to find 9081 * out now. This will also tell new Firmware to send us Port Status 9082 * Updates using the new 32-bit Port Capabilities version of the 9083 * Port Information message. 9084 */ 9085 if (fw_caps == FW_CAPS_UNKNOWN) { 9086 u32 param, val; 9087 9088 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) | 9089 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_PORT_CAPS32)); 9090 val = 1; 9091 ret = t4_set_params(adapter, mbox, pf, vf, 1, ¶m, &val); 9092 fw_caps = (ret == 0 ? FW_CAPS32 : FW_CAPS16); 9093 adapter->params.fw_caps_support = fw_caps; 9094 } 9095 9096 memset(&cmd, 0, sizeof(cmd)); 9097 cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | 9098 FW_CMD_REQUEST_F | FW_CMD_READ_F | 9099 FW_PORT_CMD_PORTID_V(port)); 9100 cmd.action_to_len16 = cpu_to_be32( 9101 FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16 9102 ? FW_PORT_ACTION_GET_PORT_INFO 9103 : FW_PORT_ACTION_GET_PORT_INFO32) | 9104 FW_LEN16(cmd)); 9105 ret = t4_wr_mbox(pi->adapter, mbox, &cmd, sizeof(cmd), &cmd); 9106 if (ret) 9107 return ret; 9108 9109 /* Extract the various fields from the Port Information message. 9110 */ 9111 if (fw_caps == FW_CAPS16) { 9112 u32 lstatus = be32_to_cpu(cmd.u.info.lstatus_to_modtype); 9113 9114 port_type = FW_PORT_CMD_PTYPE_G(lstatus); 9115 mdio_addr = ((lstatus & FW_PORT_CMD_MDIOCAP_F) 9116 ? FW_PORT_CMD_MDIOADDR_G(lstatus) 9117 : -1); 9118 pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.pcap)); 9119 acaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.acap)); 9120 } else { 9121 u32 lstatus32 = be32_to_cpu(cmd.u.info32.lstatus32_to_cbllen32); 9122 9123 port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32); 9124 mdio_addr = ((lstatus32 & FW_PORT_CMD_MDIOCAP32_F) 9125 ? FW_PORT_CMD_MDIOADDR32_G(lstatus32) 9126 : -1); 9127 pcaps = be32_to_cpu(cmd.u.info32.pcaps32); 9128 acaps = be32_to_cpu(cmd.u.info32.acaps32); 9129 } 9130 9131 ret = t4_alloc_vi(pi->adapter, mbox, port, pf, vf, 1, mac, &rss_size); 9132 if (ret < 0) 9133 return ret; 9134 9135 pi->viid = ret; 9136 pi->tx_chan = port; 9137 pi->lport = port; 9138 pi->rss_size = rss_size; 9139 9140 pi->port_type = port_type; 9141 pi->mdio_addr = mdio_addr; 9142 pi->mod_type = FW_PORT_MOD_TYPE_NA; 9143 9144 init_link_config(&pi->link_cfg, pcaps, acaps); 9145 return 0; 9146 } 9147 9148 int t4_port_init(struct adapter *adap, int mbox, int pf, int vf) 9149 { 9150 u8 addr[6]; 9151 int ret, i, j = 0; 9152 9153 for_each_port(adap, i) { 9154 struct port_info *pi = adap2pinfo(adap, i); 9155 9156 while ((adap->params.portvec & (1 << j)) == 0) 9157 j++; 9158 9159 ret = t4_init_portinfo(pi, mbox, j, pf, vf, addr); 9160 if (ret) 9161 return ret; 9162 9163 memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN); 9164 j++; 9165 } 9166 return 0; 9167 } 9168 9169 /** 9170 * t4_read_cimq_cfg - read CIM queue configuration 9171 * @adap: the adapter 9172 * @base: holds the queue base addresses in bytes 9173 * @size: holds the queue sizes in bytes 9174 * @thres: holds the queue full thresholds in bytes 9175 * 9176 * Returns the current configuration of the CIM queues, starting with 9177 * the IBQs, then the OBQs. 9178 */ 9179 void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres) 9180 { 9181 unsigned int i, v; 9182 int cim_num_obq = is_t4(adap->params.chip) ? 9183 CIM_NUM_OBQ : CIM_NUM_OBQ_T5; 9184 9185 for (i = 0; i < CIM_NUM_IBQ; i++) { 9186 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, IBQSELECT_F | 9187 QUENUMSELECT_V(i)); 9188 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A); 9189 /* value is in 256-byte units */ 9190 *base++ = CIMQBASE_G(v) * 256; 9191 *size++ = CIMQSIZE_G(v) * 256; 9192 *thres++ = QUEFULLTHRSH_G(v) * 8; /* 8-byte unit */ 9193 } 9194 for (i = 0; i < cim_num_obq; i++) { 9195 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F | 9196 QUENUMSELECT_V(i)); 9197 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A); 9198 /* value is in 256-byte units */ 9199 *base++ = CIMQBASE_G(v) * 256; 9200 *size++ = CIMQSIZE_G(v) * 256; 9201 } 9202 } 9203 9204 /** 9205 * t4_read_cim_ibq - read the contents of a CIM inbound queue 9206 * @adap: the adapter 9207 * @qid: the queue index 9208 * @data: where to store the queue contents 9209 * @n: capacity of @data in 32-bit words 9210 * 9211 * Reads the contents of the selected CIM queue starting at address 0 up 9212 * to the capacity of @data. @n must be a multiple of 4. Returns < 0 on 9213 * error and the number of 32-bit words actually read on success. 9214 */ 9215 int t4_read_cim_ibq(struct adapter *adap, unsigned int qid, u32 *data, size_t n) 9216 { 9217 int i, err, attempts; 9218 unsigned int addr; 9219 const unsigned int nwords = CIM_IBQ_SIZE * 4; 9220 9221 if (qid > 5 || (n & 3)) 9222 return -EINVAL; 9223 9224 addr = qid * nwords; 9225 if (n > nwords) 9226 n = nwords; 9227 9228 /* It might take 3-10ms before the IBQ debug read access is allowed. 9229 * Wait for 1 Sec with a delay of 1 usec. 9230 */ 9231 attempts = 1000000; 9232 9233 for (i = 0; i < n; i++, addr++) { 9234 t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, IBQDBGADDR_V(addr) | 9235 IBQDBGEN_F); 9236 err = t4_wait_op_done(adap, CIM_IBQ_DBG_CFG_A, IBQDBGBUSY_F, 0, 9237 attempts, 1); 9238 if (err) 9239 return err; 9240 *data++ = t4_read_reg(adap, CIM_IBQ_DBG_DATA_A); 9241 } 9242 t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, 0); 9243 return i; 9244 } 9245 9246 /** 9247 * t4_read_cim_obq - read the contents of a CIM outbound queue 9248 * @adap: the adapter 9249 * @qid: the queue index 9250 * @data: where to store the queue contents 9251 * @n: capacity of @data in 32-bit words 9252 * 9253 * Reads the contents of the selected CIM queue starting at address 0 up 9254 * to the capacity of @data. @n must be a multiple of 4. Returns < 0 on 9255 * error and the number of 32-bit words actually read on success. 9256 */ 9257 int t4_read_cim_obq(struct adapter *adap, unsigned int qid, u32 *data, size_t n) 9258 { 9259 int i, err; 9260 unsigned int addr, v, nwords; 9261 int cim_num_obq = is_t4(adap->params.chip) ? 9262 CIM_NUM_OBQ : CIM_NUM_OBQ_T5; 9263 9264 if ((qid > (cim_num_obq - 1)) || (n & 3)) 9265 return -EINVAL; 9266 9267 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F | 9268 QUENUMSELECT_V(qid)); 9269 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A); 9270 9271 addr = CIMQBASE_G(v) * 64; /* muliple of 256 -> muliple of 4 */ 9272 nwords = CIMQSIZE_G(v) * 64; /* same */ 9273 if (n > nwords) 9274 n = nwords; 9275 9276 for (i = 0; i < n; i++, addr++) { 9277 t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, OBQDBGADDR_V(addr) | 9278 OBQDBGEN_F); 9279 err = t4_wait_op_done(adap, CIM_OBQ_DBG_CFG_A, OBQDBGBUSY_F, 0, 9280 2, 1); 9281 if (err) 9282 return err; 9283 *data++ = t4_read_reg(adap, CIM_OBQ_DBG_DATA_A); 9284 } 9285 t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, 0); 9286 return i; 9287 } 9288 9289 /** 9290 * t4_cim_read - read a block from CIM internal address space 9291 * @adap: the adapter 9292 * @addr: the start address within the CIM address space 9293 * @n: number of words to read 9294 * @valp: where to store the result 9295 * 9296 * Reads a block of 4-byte words from the CIM intenal address space. 9297 */ 9298 int t4_cim_read(struct adapter *adap, unsigned int addr, unsigned int n, 9299 unsigned int *valp) 9300 { 9301 int ret = 0; 9302 9303 if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F) 9304 return -EBUSY; 9305 9306 for ( ; !ret && n--; addr += 4) { 9307 t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr); 9308 ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F, 9309 0, 5, 2); 9310 if (!ret) 9311 *valp++ = t4_read_reg(adap, CIM_HOST_ACC_DATA_A); 9312 } 9313 return ret; 9314 } 9315 9316 /** 9317 * t4_cim_write - write a block into CIM internal address space 9318 * @adap: the adapter 9319 * @addr: the start address within the CIM address space 9320 * @n: number of words to write 9321 * @valp: set of values to write 9322 * 9323 * Writes a block of 4-byte words into the CIM intenal address space. 9324 */ 9325 int t4_cim_write(struct adapter *adap, unsigned int addr, unsigned int n, 9326 const unsigned int *valp) 9327 { 9328 int ret = 0; 9329 9330 if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F) 9331 return -EBUSY; 9332 9333 for ( ; !ret && n--; addr += 4) { 9334 t4_write_reg(adap, CIM_HOST_ACC_DATA_A, *valp++); 9335 t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr | HOSTWRITE_F); 9336 ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F, 9337 0, 5, 2); 9338 } 9339 return ret; 9340 } 9341 9342 static int t4_cim_write1(struct adapter *adap, unsigned int addr, 9343 unsigned int val) 9344 { 9345 return t4_cim_write(adap, addr, 1, &val); 9346 } 9347 9348 /** 9349 * t4_cim_read_la - read CIM LA capture buffer 9350 * @adap: the adapter 9351 * @la_buf: where to store the LA data 9352 * @wrptr: the HW write pointer within the capture buffer 9353 * 9354 * Reads the contents of the CIM LA buffer with the most recent entry at 9355 * the end of the returned data and with the entry at @wrptr first. 9356 * We try to leave the LA in the running state we find it in. 9357 */ 9358 int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr) 9359 { 9360 int i, ret; 9361 unsigned int cfg, val, idx; 9362 9363 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &cfg); 9364 if (ret) 9365 return ret; 9366 9367 if (cfg & UPDBGLAEN_F) { /* LA is running, freeze it */ 9368 ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A, 0); 9369 if (ret) 9370 return ret; 9371 } 9372 9373 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val); 9374 if (ret) 9375 goto restart; 9376 9377 idx = UPDBGLAWRPTR_G(val); 9378 if (wrptr) 9379 *wrptr = idx; 9380 9381 for (i = 0; i < adap->params.cim_la_size; i++) { 9382 ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A, 9383 UPDBGLARDPTR_V(idx) | UPDBGLARDEN_F); 9384 if (ret) 9385 break; 9386 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val); 9387 if (ret) 9388 break; 9389 if (val & UPDBGLARDEN_F) { 9390 ret = -ETIMEDOUT; 9391 break; 9392 } 9393 ret = t4_cim_read(adap, UP_UP_DBG_LA_DATA_A, 1, &la_buf[i]); 9394 if (ret) 9395 break; 9396 9397 /* Bits 0-3 of UpDbgLaRdPtr can be between 0000 to 1001 to 9398 * identify the 32-bit portion of the full 312-bit data 9399 */ 9400 if (is_t6(adap->params.chip) && (idx & 0xf) >= 9) 9401 idx = (idx & 0xff0) + 0x10; 9402 else 9403 idx++; 9404 /* address can't exceed 0xfff */ 9405 idx &= UPDBGLARDPTR_M; 9406 } 9407 restart: 9408 if (cfg & UPDBGLAEN_F) { 9409 int r = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A, 9410 cfg & ~UPDBGLARDEN_F); 9411 if (!ret) 9412 ret = r; 9413 } 9414 return ret; 9415 } 9416 9417 /** 9418 * t4_tp_read_la - read TP LA capture buffer 9419 * @adap: the adapter 9420 * @la_buf: where to store the LA data 9421 * @wrptr: the HW write pointer within the capture buffer 9422 * 9423 * Reads the contents of the TP LA buffer with the most recent entry at 9424 * the end of the returned data and with the entry at @wrptr first. 9425 * We leave the LA in the running state we find it in. 9426 */ 9427 void t4_tp_read_la(struct adapter *adap, u64 *la_buf, unsigned int *wrptr) 9428 { 9429 bool last_incomplete; 9430 unsigned int i, cfg, val, idx; 9431 9432 cfg = t4_read_reg(adap, TP_DBG_LA_CONFIG_A) & 0xffff; 9433 if (cfg & DBGLAENABLE_F) /* freeze LA */ 9434 t4_write_reg(adap, TP_DBG_LA_CONFIG_A, 9435 adap->params.tp.la_mask | (cfg ^ DBGLAENABLE_F)); 9436 9437 val = t4_read_reg(adap, TP_DBG_LA_CONFIG_A); 9438 idx = DBGLAWPTR_G(val); 9439 last_incomplete = DBGLAMODE_G(val) >= 2 && (val & DBGLAWHLF_F) == 0; 9440 if (last_incomplete) 9441 idx = (idx + 1) & DBGLARPTR_M; 9442 if (wrptr) 9443 *wrptr = idx; 9444 9445 val &= 0xffff; 9446 val &= ~DBGLARPTR_V(DBGLARPTR_M); 9447 val |= adap->params.tp.la_mask; 9448 9449 for (i = 0; i < TPLA_SIZE; i++) { 9450 t4_write_reg(adap, TP_DBG_LA_CONFIG_A, DBGLARPTR_V(idx) | val); 9451 la_buf[i] = t4_read_reg64(adap, TP_DBG_LA_DATAL_A); 9452 idx = (idx + 1) & DBGLARPTR_M; 9453 } 9454 9455 /* Wipe out last entry if it isn't valid */ 9456 if (last_incomplete) 9457 la_buf[TPLA_SIZE - 1] = ~0ULL; 9458 9459 if (cfg & DBGLAENABLE_F) /* restore running state */ 9460 t4_write_reg(adap, TP_DBG_LA_CONFIG_A, 9461 cfg | adap->params.tp.la_mask); 9462 } 9463 9464 /* SGE Hung Ingress DMA Warning Threshold time and Warning Repeat Rate (in 9465 * seconds). If we find one of the SGE Ingress DMA State Machines in the same 9466 * state for more than the Warning Threshold then we'll issue a warning about 9467 * a potential hang. We'll repeat the warning as the SGE Ingress DMA Channel 9468 * appears to be hung every Warning Repeat second till the situation clears. 9469 * If the situation clears, we'll note that as well. 9470 */ 9471 #define SGE_IDMA_WARN_THRESH 1 9472 #define SGE_IDMA_WARN_REPEAT 300 9473 9474 /** 9475 * t4_idma_monitor_init - initialize SGE Ingress DMA Monitor 9476 * @adapter: the adapter 9477 * @idma: the adapter IDMA Monitor state 9478 * 9479 * Initialize the state of an SGE Ingress DMA Monitor. 9480 */ 9481 void t4_idma_monitor_init(struct adapter *adapter, 9482 struct sge_idma_monitor_state *idma) 9483 { 9484 /* Initialize the state variables for detecting an SGE Ingress DMA 9485 * hang. The SGE has internal counters which count up on each clock 9486 * tick whenever the SGE finds its Ingress DMA State Engines in the 9487 * same state they were on the previous clock tick. The clock used is 9488 * the Core Clock so we have a limit on the maximum "time" they can 9489 * record; typically a very small number of seconds. For instance, 9490 * with a 600MHz Core Clock, we can only count up to a bit more than 9491 * 7s. So we'll synthesize a larger counter in order to not run the 9492 * risk of having the "timers" overflow and give us the flexibility to 9493 * maintain a Hung SGE State Machine of our own which operates across 9494 * a longer time frame. 9495 */ 9496 idma->idma_1s_thresh = core_ticks_per_usec(adapter) * 1000000; /* 1s */ 9497 idma->idma_stalled[0] = 0; 9498 idma->idma_stalled[1] = 0; 9499 } 9500 9501 /** 9502 * t4_idma_monitor - monitor SGE Ingress DMA state 9503 * @adapter: the adapter 9504 * @idma: the adapter IDMA Monitor state 9505 * @hz: number of ticks/second 9506 * @ticks: number of ticks since the last IDMA Monitor call 9507 */ 9508 void t4_idma_monitor(struct adapter *adapter, 9509 struct sge_idma_monitor_state *idma, 9510 int hz, int ticks) 9511 { 9512 int i, idma_same_state_cnt[2]; 9513 9514 /* Read the SGE Debug Ingress DMA Same State Count registers. These 9515 * are counters inside the SGE which count up on each clock when the 9516 * SGE finds its Ingress DMA State Engines in the same states they 9517 * were in the previous clock. The counters will peg out at 9518 * 0xffffffff without wrapping around so once they pass the 1s 9519 * threshold they'll stay above that till the IDMA state changes. 9520 */ 9521 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 13); 9522 idma_same_state_cnt[0] = t4_read_reg(adapter, SGE_DEBUG_DATA_HIGH_A); 9523 idma_same_state_cnt[1] = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A); 9524 9525 for (i = 0; i < 2; i++) { 9526 u32 debug0, debug11; 9527 9528 /* If the Ingress DMA Same State Counter ("timer") is less 9529 * than 1s, then we can reset our synthesized Stall Timer and 9530 * continue. If we have previously emitted warnings about a 9531 * potential stalled Ingress Queue, issue a note indicating 9532 * that the Ingress Queue has resumed forward progress. 9533 */ 9534 if (idma_same_state_cnt[i] < idma->idma_1s_thresh) { 9535 if (idma->idma_stalled[i] >= SGE_IDMA_WARN_THRESH * hz) 9536 dev_warn(adapter->pdev_dev, "SGE idma%d, queue %u, " 9537 "resumed after %d seconds\n", 9538 i, idma->idma_qid[i], 9539 idma->idma_stalled[i] / hz); 9540 idma->idma_stalled[i] = 0; 9541 continue; 9542 } 9543 9544 /* Synthesize an SGE Ingress DMA Same State Timer in the Hz 9545 * domain. The first time we get here it'll be because we 9546 * passed the 1s Threshold; each additional time it'll be 9547 * because the RX Timer Callback is being fired on its regular 9548 * schedule. 9549 * 9550 * If the stall is below our Potential Hung Ingress Queue 9551 * Warning Threshold, continue. 9552 */ 9553 if (idma->idma_stalled[i] == 0) { 9554 idma->idma_stalled[i] = hz; 9555 idma->idma_warn[i] = 0; 9556 } else { 9557 idma->idma_stalled[i] += ticks; 9558 idma->idma_warn[i] -= ticks; 9559 } 9560 9561 if (idma->idma_stalled[i] < SGE_IDMA_WARN_THRESH * hz) 9562 continue; 9563 9564 /* We'll issue a warning every SGE_IDMA_WARN_REPEAT seconds. 9565 */ 9566 if (idma->idma_warn[i] > 0) 9567 continue; 9568 idma->idma_warn[i] = SGE_IDMA_WARN_REPEAT * hz; 9569 9570 /* Read and save the SGE IDMA State and Queue ID information. 9571 * We do this every time in case it changes across time ... 9572 * can't be too careful ... 9573 */ 9574 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 0); 9575 debug0 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A); 9576 idma->idma_state[i] = (debug0 >> (i * 9)) & 0x3f; 9577 9578 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 11); 9579 debug11 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A); 9580 idma->idma_qid[i] = (debug11 >> (i * 16)) & 0xffff; 9581 9582 dev_warn(adapter->pdev_dev, "SGE idma%u, queue %u, potentially stuck in " 9583 "state %u for %d seconds (debug0=%#x, debug11=%#x)\n", 9584 i, idma->idma_qid[i], idma->idma_state[i], 9585 idma->idma_stalled[i] / hz, 9586 debug0, debug11); 9587 t4_sge_decode_idma_state(adapter, idma->idma_state[i]); 9588 } 9589 } 9590 9591 /** 9592 * t4_load_cfg - download config file 9593 * @adap: the adapter 9594 * @cfg_data: the cfg text file to write 9595 * @size: text file size 9596 * 9597 * Write the supplied config text file to the card's serial flash. 9598 */ 9599 int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size) 9600 { 9601 int ret, i, n, cfg_addr; 9602 unsigned int addr; 9603 unsigned int flash_cfg_start_sec; 9604 unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec; 9605 9606 cfg_addr = t4_flash_cfg_addr(adap); 9607 if (cfg_addr < 0) 9608 return cfg_addr; 9609 9610 addr = cfg_addr; 9611 flash_cfg_start_sec = addr / SF_SEC_SIZE; 9612 9613 if (size > FLASH_CFG_MAX_SIZE) { 9614 dev_err(adap->pdev_dev, "cfg file too large, max is %u bytes\n", 9615 FLASH_CFG_MAX_SIZE); 9616 return -EFBIG; 9617 } 9618 9619 i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE, /* # of sectors spanned */ 9620 sf_sec_size); 9621 ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec, 9622 flash_cfg_start_sec + i - 1); 9623 /* If size == 0 then we're simply erasing the FLASH sectors associated 9624 * with the on-adapter Firmware Configuration File. 9625 */ 9626 if (ret || size == 0) 9627 goto out; 9628 9629 /* this will write to the flash up to SF_PAGE_SIZE at a time */ 9630 for (i = 0; i < size; i += SF_PAGE_SIZE) { 9631 if ((size - i) < SF_PAGE_SIZE) 9632 n = size - i; 9633 else 9634 n = SF_PAGE_SIZE; 9635 ret = t4_write_flash(adap, addr, n, cfg_data); 9636 if (ret) 9637 goto out; 9638 9639 addr += SF_PAGE_SIZE; 9640 cfg_data += SF_PAGE_SIZE; 9641 } 9642 9643 out: 9644 if (ret) 9645 dev_err(adap->pdev_dev, "config file %s failed %d\n", 9646 (size == 0 ? "clear" : "download"), ret); 9647 return ret; 9648 } 9649 9650 /** 9651 * t4_set_vf_mac - Set MAC address for the specified VF 9652 * @adapter: The adapter 9653 * @vf: one of the VFs instantiated by the specified PF 9654 * @naddr: the number of MAC addresses 9655 * @addr: the MAC address(es) to be set to the specified VF 9656 */ 9657 int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf, 9658 unsigned int naddr, u8 *addr) 9659 { 9660 struct fw_acl_mac_cmd cmd; 9661 9662 memset(&cmd, 0, sizeof(cmd)); 9663 cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_MAC_CMD) | 9664 FW_CMD_REQUEST_F | 9665 FW_CMD_WRITE_F | 9666 FW_ACL_MAC_CMD_PFN_V(adapter->pf) | 9667 FW_ACL_MAC_CMD_VFN_V(vf)); 9668 9669 /* Note: Do not enable the ACL */ 9670 cmd.en_to_len16 = cpu_to_be32((unsigned int)FW_LEN16(cmd)); 9671 cmd.nmac = naddr; 9672 9673 switch (adapter->pf) { 9674 case 3: 9675 memcpy(cmd.macaddr3, addr, sizeof(cmd.macaddr3)); 9676 break; 9677 case 2: 9678 memcpy(cmd.macaddr2, addr, sizeof(cmd.macaddr2)); 9679 break; 9680 case 1: 9681 memcpy(cmd.macaddr1, addr, sizeof(cmd.macaddr1)); 9682 break; 9683 case 0: 9684 memcpy(cmd.macaddr0, addr, sizeof(cmd.macaddr0)); 9685 break; 9686 } 9687 9688 return t4_wr_mbox(adapter, adapter->mbox, &cmd, sizeof(cmd), &cmd); 9689 } 9690 9691 /** 9692 * t4_read_pace_tbl - read the pace table 9693 * @adap: the adapter 9694 * @pace_vals: holds the returned values 9695 * 9696 * Returns the values of TP's pace table in microseconds. 9697 */ 9698 void t4_read_pace_tbl(struct adapter *adap, unsigned int pace_vals[NTX_SCHED]) 9699 { 9700 unsigned int i, v; 9701 9702 for (i = 0; i < NTX_SCHED; i++) { 9703 t4_write_reg(adap, TP_PACE_TABLE_A, 0xffff0000 + i); 9704 v = t4_read_reg(adap, TP_PACE_TABLE_A); 9705 pace_vals[i] = dack_ticks_to_usec(adap, v); 9706 } 9707 } 9708 9709 /** 9710 * t4_get_tx_sched - get the configuration of a Tx HW traffic scheduler 9711 * @adap: the adapter 9712 * @sched: the scheduler index 9713 * @kbps: the byte rate in Kbps 9714 * @ipg: the interpacket delay in tenths of nanoseconds 9715 * @sleep_ok: if true we may sleep while awaiting command completion 9716 * 9717 * Return the current configuration of a HW Tx scheduler. 9718 */ 9719 void t4_get_tx_sched(struct adapter *adap, unsigned int sched, 9720 unsigned int *kbps, unsigned int *ipg, bool sleep_ok) 9721 { 9722 unsigned int v, addr, bpt, cpt; 9723 9724 if (kbps) { 9725 addr = TP_TX_MOD_Q1_Q0_RATE_LIMIT_A - sched / 2; 9726 t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok); 9727 if (sched & 1) 9728 v >>= 16; 9729 bpt = (v >> 8) & 0xff; 9730 cpt = v & 0xff; 9731 if (!cpt) { 9732 *kbps = 0; /* scheduler disabled */ 9733 } else { 9734 v = (adap->params.vpd.cclk * 1000) / cpt; /* ticks/s */ 9735 *kbps = (v * bpt) / 125; 9736 } 9737 } 9738 if (ipg) { 9739 addr = TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR_A - sched / 2; 9740 t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok); 9741 if (sched & 1) 9742 v >>= 16; 9743 v &= 0xffff; 9744 *ipg = (10000 * v) / core_ticks_per_usec(adap); 9745 } 9746 } 9747 9748 /* t4_sge_ctxt_rd - read an SGE context through FW 9749 * @adap: the adapter 9750 * @mbox: mailbox to use for the FW command 9751 * @cid: the context id 9752 * @ctype: the context type 9753 * @data: where to store the context data 9754 * 9755 * Issues a FW command through the given mailbox to read an SGE context. 9756 */ 9757 int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid, 9758 enum ctxt_type ctype, u32 *data) 9759 { 9760 struct fw_ldst_cmd c; 9761 int ret; 9762 9763 if (ctype == CTXT_FLM) 9764 ret = FW_LDST_ADDRSPC_SGE_FLMC; 9765 else 9766 ret = FW_LDST_ADDRSPC_SGE_CONMC; 9767 9768 memset(&c, 0, sizeof(c)); 9769 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 9770 FW_CMD_REQUEST_F | FW_CMD_READ_F | 9771 FW_LDST_CMD_ADDRSPACE_V(ret)); 9772 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c)); 9773 c.u.idctxt.physid = cpu_to_be32(cid); 9774 9775 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); 9776 if (ret == 0) { 9777 data[0] = be32_to_cpu(c.u.idctxt.ctxt_data0); 9778 data[1] = be32_to_cpu(c.u.idctxt.ctxt_data1); 9779 data[2] = be32_to_cpu(c.u.idctxt.ctxt_data2); 9780 data[3] = be32_to_cpu(c.u.idctxt.ctxt_data3); 9781 data[4] = be32_to_cpu(c.u.idctxt.ctxt_data4); 9782 data[5] = be32_to_cpu(c.u.idctxt.ctxt_data5); 9783 } 9784 return ret; 9785 } 9786 9787 /** 9788 * t4_sge_ctxt_rd_bd - read an SGE context bypassing FW 9789 * @adap: the adapter 9790 * @cid: the context id 9791 * @ctype: the context type 9792 * @data: where to store the context data 9793 * 9794 * Reads an SGE context directly, bypassing FW. This is only for 9795 * debugging when FW is unavailable. 9796 */ 9797 int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, 9798 enum ctxt_type ctype, u32 *data) 9799 { 9800 int i, ret; 9801 9802 t4_write_reg(adap, SGE_CTXT_CMD_A, CTXTQID_V(cid) | CTXTTYPE_V(ctype)); 9803 ret = t4_wait_op_done(adap, SGE_CTXT_CMD_A, BUSY_F, 0, 3, 1); 9804 if (!ret) 9805 for (i = SGE_CTXT_DATA0_A; i <= SGE_CTXT_DATA5_A; i += 4) 9806 *data++ = t4_read_reg(adap, i); 9807 return ret; 9808 } 9809 9810 int t4_sched_params(struct adapter *adapter, int type, int level, int mode, 9811 int rateunit, int ratemode, int channel, int class, 9812 int minrate, int maxrate, int weight, int pktsize) 9813 { 9814 struct fw_sched_cmd cmd; 9815 9816 memset(&cmd, 0, sizeof(cmd)); 9817 cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_SCHED_CMD) | 9818 FW_CMD_REQUEST_F | 9819 FW_CMD_WRITE_F); 9820 cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd)); 9821 9822 cmd.u.params.sc = FW_SCHED_SC_PARAMS; 9823 cmd.u.params.type = type; 9824 cmd.u.params.level = level; 9825 cmd.u.params.mode = mode; 9826 cmd.u.params.ch = channel; 9827 cmd.u.params.cl = class; 9828 cmd.u.params.unit = rateunit; 9829 cmd.u.params.rate = ratemode; 9830 cmd.u.params.min = cpu_to_be32(minrate); 9831 cmd.u.params.max = cpu_to_be32(maxrate); 9832 cmd.u.params.weight = cpu_to_be16(weight); 9833 cmd.u.params.pktsize = cpu_to_be16(pktsize); 9834 9835 return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd), 9836 NULL, 1); 9837 } 9838 9839 /** 9840 * t4_i2c_rd - read I2C data from adapter 9841 * @adap: the adapter 9842 * @port: Port number if per-port device; <0 if not 9843 * @devid: per-port device ID or absolute device ID 9844 * @offset: byte offset into device I2C space 9845 * @len: byte length of I2C space data 9846 * @buf: buffer in which to return I2C data 9847 * 9848 * Reads the I2C data from the indicated device and location. 9849 */ 9850 int t4_i2c_rd(struct adapter *adap, unsigned int mbox, int port, 9851 unsigned int devid, unsigned int offset, 9852 unsigned int len, u8 *buf) 9853 { 9854 struct fw_ldst_cmd ldst_cmd, ldst_rpl; 9855 unsigned int i2c_max = sizeof(ldst_cmd.u.i2c.data); 9856 int ret = 0; 9857 9858 if (len > I2C_PAGE_SIZE) 9859 return -EINVAL; 9860 9861 /* Dont allow reads that spans multiple pages */ 9862 if (offset < I2C_PAGE_SIZE && offset + len > I2C_PAGE_SIZE) 9863 return -EINVAL; 9864 9865 memset(&ldst_cmd, 0, sizeof(ldst_cmd)); 9866 ldst_cmd.op_to_addrspace = 9867 cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) | 9868 FW_CMD_REQUEST_F | 9869 FW_CMD_READ_F | 9870 FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_I2C)); 9871 ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd)); 9872 ldst_cmd.u.i2c.pid = (port < 0 ? 0xff : port); 9873 ldst_cmd.u.i2c.did = devid; 9874 9875 while (len > 0) { 9876 unsigned int i2c_len = (len < i2c_max) ? len : i2c_max; 9877 9878 ldst_cmd.u.i2c.boffset = offset; 9879 ldst_cmd.u.i2c.blen = i2c_len; 9880 9881 ret = t4_wr_mbox(adap, mbox, &ldst_cmd, sizeof(ldst_cmd), 9882 &ldst_rpl); 9883 if (ret) 9884 break; 9885 9886 memcpy(buf, ldst_rpl.u.i2c.data, i2c_len); 9887 offset += i2c_len; 9888 buf += i2c_len; 9889 len -= i2c_len; 9890 } 9891 9892 return ret; 9893 } 9894 9895 /** 9896 * t4_set_vlan_acl - Set a VLAN id for the specified VF 9897 * @adapter: the adapter 9898 * @mbox: mailbox to use for the FW command 9899 * @vf: one of the VFs instantiated by the specified PF 9900 * @vlan: The vlanid to be set 9901 */ 9902 int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf, 9903 u16 vlan) 9904 { 9905 struct fw_acl_vlan_cmd vlan_cmd; 9906 unsigned int enable; 9907 9908 enable = (vlan ? FW_ACL_VLAN_CMD_EN_F : 0); 9909 memset(&vlan_cmd, 0, sizeof(vlan_cmd)); 9910 vlan_cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_VLAN_CMD) | 9911 FW_CMD_REQUEST_F | 9912 FW_CMD_WRITE_F | 9913 FW_CMD_EXEC_F | 9914 FW_ACL_VLAN_CMD_PFN_V(adap->pf) | 9915 FW_ACL_VLAN_CMD_VFN_V(vf)); 9916 vlan_cmd.en_to_len16 = cpu_to_be32(enable | FW_LEN16(vlan_cmd)); 9917 /* Drop all packets that donot match vlan id */ 9918 vlan_cmd.dropnovlan_fm = FW_ACL_VLAN_CMD_FM_F; 9919 if (enable != 0) { 9920 vlan_cmd.nvlan = 1; 9921 vlan_cmd.vlanid[0] = cpu_to_be16(vlan); 9922 } 9923 9924 return t4_wr_mbox(adap, adap->mbox, &vlan_cmd, sizeof(vlan_cmd), NULL); 9925 } 9926