cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

csio_hw.c (114924B)


      1/*
      2 * This file is part of the Chelsio FCoE driver for Linux.
      3 *
      4 * Copyright (c) 2008-2012 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/pci.h>
     36#include <linux/pci_regs.h>
     37#include <linux/firmware.h>
     38#include <linux/stddef.h>
     39#include <linux/delay.h>
     40#include <linux/string.h>
     41#include <linux/compiler.h>
     42#include <linux/jiffies.h>
     43#include <linux/kernel.h>
     44#include <linux/log2.h>
     45
     46#include "csio_hw.h"
     47#include "csio_lnode.h"
     48#include "csio_rnode.h"
     49
     50int csio_dbg_level = 0xFEFF;
     51unsigned int csio_port_mask = 0xf;
     52
     53/* Default FW event queue entries. */
     54static uint32_t csio_evtq_sz = CSIO_EVTQ_SIZE;
     55
     56/* Default MSI param level */
     57int csio_msi = 2;
     58
     59/* FCoE function instances */
     60static int dev_num;
     61
     62/* FCoE Adapter types & its description */
     63static const struct csio_adap_desc csio_t5_fcoe_adapters[] = {
     64	{"T580-Dbg 10G", "Chelsio T580-Dbg 10G [FCoE]"},
     65	{"T520-CR 10G", "Chelsio T520-CR 10G [FCoE]"},
     66	{"T522-CR 10G/1G", "Chelsio T522-CR 10G/1G [FCoE]"},
     67	{"T540-CR 10G", "Chelsio T540-CR 10G [FCoE]"},
     68	{"T520-BCH 10G", "Chelsio T520-BCH 10G [FCoE]"},
     69	{"T540-BCH 10G", "Chelsio T540-BCH 10G [FCoE]"},
     70	{"T540-CH 10G", "Chelsio T540-CH 10G [FCoE]"},
     71	{"T520-SO 10G", "Chelsio T520-SO 10G [FCoE]"},
     72	{"T520-CX4 10G", "Chelsio T520-CX4 10G [FCoE]"},
     73	{"T520-BT 10G", "Chelsio T520-BT 10G [FCoE]"},
     74	{"T504-BT 1G", "Chelsio T504-BT 1G [FCoE]"},
     75	{"B520-SR 10G", "Chelsio B520-SR 10G [FCoE]"},
     76	{"B504-BT 1G", "Chelsio B504-BT 1G [FCoE]"},
     77	{"T580-CR 10G", "Chelsio T580-CR 10G [FCoE]"},
     78	{"T540-LP-CR 10G", "Chelsio T540-LP-CR 10G [FCoE]"},
     79	{"AMSTERDAM 10G", "Chelsio AMSTERDAM 10G [FCoE]"},
     80	{"T580-LP-CR 40G", "Chelsio T580-LP-CR 40G [FCoE]"},
     81	{"T520-LL-CR 10G", "Chelsio T520-LL-CR 10G [FCoE]"},
     82	{"T560-CR 40G", "Chelsio T560-CR 40G [FCoE]"},
     83	{"T580-CR 40G", "Chelsio T580-CR 40G [FCoE]"},
     84	{"T580-SO 40G", "Chelsio T580-SO 40G [FCoE]"},
     85	{"T502-BT 1G", "Chelsio T502-BT 1G [FCoE]"}
     86};
     87
     88static void csio_mgmtm_cleanup(struct csio_mgmtm *);
     89static void csio_hw_mbm_cleanup(struct csio_hw *);
     90
     91/* State machine forward declarations */
     92static void csio_hws_uninit(struct csio_hw *, enum csio_hw_ev);
     93static void csio_hws_configuring(struct csio_hw *, enum csio_hw_ev);
     94static void csio_hws_initializing(struct csio_hw *, enum csio_hw_ev);
     95static void csio_hws_ready(struct csio_hw *, enum csio_hw_ev);
     96static void csio_hws_quiescing(struct csio_hw *, enum csio_hw_ev);
     97static void csio_hws_quiesced(struct csio_hw *, enum csio_hw_ev);
     98static void csio_hws_resetting(struct csio_hw *, enum csio_hw_ev);
     99static void csio_hws_removing(struct csio_hw *, enum csio_hw_ev);
    100static void csio_hws_pcierr(struct csio_hw *, enum csio_hw_ev);
    101
    102static void csio_hw_initialize(struct csio_hw *hw);
    103static void csio_evtq_stop(struct csio_hw *hw);
    104static void csio_evtq_start(struct csio_hw *hw);
    105
    106int csio_is_hw_ready(struct csio_hw *hw)
    107{
    108	return csio_match_state(hw, csio_hws_ready);
    109}
    110
    111int csio_is_hw_removing(struct csio_hw *hw)
    112{
    113	return csio_match_state(hw, csio_hws_removing);
    114}
    115
    116
    117/*
    118 *	csio_hw_wait_op_done_val - wait until an operation is completed
    119 *	@hw: the HW module
    120 *	@reg: the register to check for completion
    121 *	@mask: a single-bit field within @reg that indicates completion
    122 *	@polarity: the value of the field when the operation is completed
    123 *	@attempts: number of check iterations
    124 *	@delay: delay in usecs between iterations
    125 *	@valp: where to store the value of the register at completion time
    126 *
    127 *	Wait until an operation is completed by checking a bit in a register
    128 *	up to @attempts times.  If @valp is not NULL the value of the register
    129 *	at the time it indicated completion is stored there.  Returns 0 if the
    130 *	operation completes and	-EAGAIN	otherwise.
    131 */
    132int
    133csio_hw_wait_op_done_val(struct csio_hw *hw, int reg, uint32_t mask,
    134			 int polarity, int attempts, int delay, uint32_t *valp)
    135{
    136	uint32_t val;
    137	while (1) {
    138		val = csio_rd_reg32(hw, reg);
    139
    140		if (!!(val & mask) == polarity) {
    141			if (valp)
    142				*valp = val;
    143			return 0;
    144		}
    145
    146		if (--attempts == 0)
    147			return -EAGAIN;
    148		if (delay)
    149			udelay(delay);
    150	}
    151}
    152
    153/*
    154 *	csio_hw_tp_wr_bits_indirect - set/clear bits in an indirect TP register
    155 *	@hw: the adapter
    156 *	@addr: the indirect TP register address
    157 *	@mask: specifies the field within the register to modify
    158 *	@val: new value for the field
    159 *
    160 *	Sets a field of an indirect TP register to the given value.
    161 */
    162void
    163csio_hw_tp_wr_bits_indirect(struct csio_hw *hw, unsigned int addr,
    164			unsigned int mask, unsigned int val)
    165{
    166	csio_wr_reg32(hw, addr, TP_PIO_ADDR_A);
    167	val |= csio_rd_reg32(hw, TP_PIO_DATA_A) & ~mask;
    168	csio_wr_reg32(hw, val, TP_PIO_DATA_A);
    169}
    170
    171void
    172csio_set_reg_field(struct csio_hw *hw, uint32_t reg, uint32_t mask,
    173		   uint32_t value)
    174{
    175	uint32_t val = csio_rd_reg32(hw, reg) & ~mask;
    176
    177	csio_wr_reg32(hw, val | value, reg);
    178	/* Flush */
    179	csio_rd_reg32(hw, reg);
    180
    181}
    182
    183static int
    184csio_memory_write(struct csio_hw *hw, int mtype, u32 addr, u32 len, u32 *buf)
    185{
    186	return hw->chip_ops->chip_memory_rw(hw, MEMWIN_CSIOSTOR, mtype,
    187					    addr, len, buf, 0);
    188}
    189
    190/*
    191 * EEPROM reads take a few tens of us while writes can take a bit over 5 ms.
    192 */
    193#define EEPROM_MAX_RD_POLL	40
    194#define EEPROM_MAX_WR_POLL	6
    195#define EEPROM_STAT_ADDR	0x7bfc
    196#define VPD_BASE		0x400
    197#define VPD_BASE_OLD		0
    198#define VPD_LEN			1024
    199#define VPD_INFO_FLD_HDR_SIZE	3
    200
    201/*
    202 *	csio_hw_seeprom_read - read a serial EEPROM location
    203 *	@hw: hw to read
    204 *	@addr: EEPROM virtual address
    205 *	@data: where to store the read data
    206 *
    207 *	Read a 32-bit word from a location in serial EEPROM using the card's PCI
    208 *	VPD capability.  Note that this function must be called with a virtual
    209 *	address.
    210 */
    211static int
    212csio_hw_seeprom_read(struct csio_hw *hw, uint32_t addr, uint32_t *data)
    213{
    214	uint16_t val = 0;
    215	int attempts = EEPROM_MAX_RD_POLL;
    216	uint32_t base = hw->params.pci.vpd_cap_addr;
    217
    218	if (addr >= EEPROMVSIZE || (addr & 3))
    219		return -EINVAL;
    220
    221	pci_write_config_word(hw->pdev, base + PCI_VPD_ADDR, (uint16_t)addr);
    222
    223	do {
    224		udelay(10);
    225		pci_read_config_word(hw->pdev, base + PCI_VPD_ADDR, &val);
    226	} while (!(val & PCI_VPD_ADDR_F) && --attempts);
    227
    228	if (!(val & PCI_VPD_ADDR_F)) {
    229		csio_err(hw, "reading EEPROM address 0x%x failed\n", addr);
    230		return -EINVAL;
    231	}
    232
    233	pci_read_config_dword(hw->pdev, base + PCI_VPD_DATA, data);
    234	*data = le32_to_cpu(*(__le32 *)data);
    235
    236	return 0;
    237}
    238
    239/*
    240 * Partial EEPROM Vital Product Data structure.  Includes only the ID and
    241 * VPD-R sections.
    242 */
    243struct t4_vpd_hdr {
    244	u8  id_tag;
    245	u8  id_len[2];
    246	u8  id_data[ID_LEN];
    247	u8  vpdr_tag;
    248	u8  vpdr_len[2];
    249};
    250
    251/*
    252 *	csio_hw_get_vpd_keyword_val - Locates an information field keyword in
    253 *				      the VPD
    254 *	@v: Pointer to buffered vpd data structure
    255 *	@kw: The keyword to search for
    256 *
    257 *	Returns the value of the information field keyword or
    258 *	-EINVAL otherwise.
    259 */
    260static int
    261csio_hw_get_vpd_keyword_val(const struct t4_vpd_hdr *v, const char *kw)
    262{
    263	int32_t i;
    264	int32_t offset , len;
    265	const uint8_t *buf = &v->id_tag;
    266	const uint8_t *vpdr_len = &v->vpdr_tag;
    267	offset = sizeof(struct t4_vpd_hdr);
    268	len =  (uint16_t)vpdr_len[1] + ((uint16_t)vpdr_len[2] << 8);
    269
    270	if (len + sizeof(struct t4_vpd_hdr) > VPD_LEN)
    271		return -EINVAL;
    272
    273	for (i = offset; (i + VPD_INFO_FLD_HDR_SIZE) <= (offset + len);) {
    274		if (memcmp(buf + i , kw, 2) == 0) {
    275			i += VPD_INFO_FLD_HDR_SIZE;
    276			return i;
    277		}
    278
    279		i += VPD_INFO_FLD_HDR_SIZE + buf[i+2];
    280	}
    281
    282	return -EINVAL;
    283}
    284
    285static int
    286csio_pci_capability(struct pci_dev *pdev, int cap, int *pos)
    287{
    288	*pos = pci_find_capability(pdev, cap);
    289	if (*pos)
    290		return 0;
    291
    292	return -1;
    293}
    294
    295/*
    296 *	csio_hw_get_vpd_params - read VPD parameters from VPD EEPROM
    297 *	@hw: HW module
    298 *	@p: where to store the parameters
    299 *
    300 *	Reads card parameters stored in VPD EEPROM.
    301 */
    302static int
    303csio_hw_get_vpd_params(struct csio_hw *hw, struct csio_vpd *p)
    304{
    305	int i, ret, ec, sn, addr;
    306	uint8_t *vpd, csum;
    307	const struct t4_vpd_hdr *v;
    308	/* To get around compilation warning from strstrip */
    309	char __always_unused *s;
    310
    311	if (csio_is_valid_vpd(hw))
    312		return 0;
    313
    314	ret = csio_pci_capability(hw->pdev, PCI_CAP_ID_VPD,
    315				  &hw->params.pci.vpd_cap_addr);
    316	if (ret)
    317		return -EINVAL;
    318
    319	vpd = kzalloc(VPD_LEN, GFP_ATOMIC);
    320	if (vpd == NULL)
    321		return -ENOMEM;
    322
    323	/*
    324	 * Card information normally starts at VPD_BASE but early cards had
    325	 * it at 0.
    326	 */
    327	ret = csio_hw_seeprom_read(hw, VPD_BASE, (uint32_t *)(vpd));
    328	addr = *vpd == 0x82 ? VPD_BASE : VPD_BASE_OLD;
    329
    330	for (i = 0; i < VPD_LEN; i += 4) {
    331		ret = csio_hw_seeprom_read(hw, addr + i, (uint32_t *)(vpd + i));
    332		if (ret) {
    333			kfree(vpd);
    334			return ret;
    335		}
    336	}
    337
    338	/* Reset the VPD flag! */
    339	hw->flags &= (~CSIO_HWF_VPD_VALID);
    340
    341	v = (const struct t4_vpd_hdr *)vpd;
    342
    343#define FIND_VPD_KW(var, name) do { \
    344	var = csio_hw_get_vpd_keyword_val(v, name); \
    345	if (var < 0) { \
    346		csio_err(hw, "missing VPD keyword " name "\n"); \
    347		kfree(vpd); \
    348		return -EINVAL; \
    349	} \
    350} while (0)
    351
    352	FIND_VPD_KW(i, "RV");
    353	for (csum = 0; i >= 0; i--)
    354		csum += vpd[i];
    355
    356	if (csum) {
    357		csio_err(hw, "corrupted VPD EEPROM, actual csum %u\n", csum);
    358		kfree(vpd);
    359		return -EINVAL;
    360	}
    361	FIND_VPD_KW(ec, "EC");
    362	FIND_VPD_KW(sn, "SN");
    363#undef FIND_VPD_KW
    364
    365	memcpy(p->id, v->id_data, ID_LEN);
    366	s = strstrip(p->id);
    367	memcpy(p->ec, vpd + ec, EC_LEN);
    368	s = strstrip(p->ec);
    369	i = vpd[sn - VPD_INFO_FLD_HDR_SIZE + 2];
    370	memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
    371	s = strstrip(p->sn);
    372
    373	csio_valid_vpd_copied(hw);
    374
    375	kfree(vpd);
    376	return 0;
    377}
    378
    379/*
    380 *	csio_hw_sf1_read - read data from the serial flash
    381 *	@hw: the HW module
    382 *	@byte_cnt: number of bytes to read
    383 *	@cont: whether another operation will be chained
    384 *      @lock: whether to lock SF for PL access only
    385 *	@valp: where to store the read data
    386 *
    387 *	Reads up to 4 bytes of data from the serial flash.  The location of
    388 *	the read needs to be specified prior to calling this by issuing the
    389 *	appropriate commands to the serial flash.
    390 */
    391static int
    392csio_hw_sf1_read(struct csio_hw *hw, uint32_t byte_cnt, int32_t cont,
    393		 int32_t lock, uint32_t *valp)
    394{
    395	int ret;
    396
    397	if (!byte_cnt || byte_cnt > 4)
    398		return -EINVAL;
    399	if (csio_rd_reg32(hw, SF_OP_A) & SF_BUSY_F)
    400		return -EBUSY;
    401
    402	csio_wr_reg32(hw,  SF_LOCK_V(lock) | SF_CONT_V(cont) |
    403		      BYTECNT_V(byte_cnt - 1), SF_OP_A);
    404	ret = csio_hw_wait_op_done_val(hw, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS,
    405				       10, NULL);
    406	if (!ret)
    407		*valp = csio_rd_reg32(hw, SF_DATA_A);
    408	return ret;
    409}
    410
    411/*
    412 *	csio_hw_sf1_write - write data to the serial flash
    413 *	@hw: the HW module
    414 *	@byte_cnt: number of bytes to write
    415 *	@cont: whether another operation will be chained
    416 *      @lock: whether to lock SF for PL access only
    417 *	@val: value to write
    418 *
    419 *	Writes up to 4 bytes of data to the serial flash.  The location of
    420 *	the write needs to be specified prior to calling this by issuing the
    421 *	appropriate commands to the serial flash.
    422 */
    423static int
    424csio_hw_sf1_write(struct csio_hw *hw, uint32_t byte_cnt, uint32_t cont,
    425		  int32_t lock, uint32_t val)
    426{
    427	if (!byte_cnt || byte_cnt > 4)
    428		return -EINVAL;
    429	if (csio_rd_reg32(hw, SF_OP_A) & SF_BUSY_F)
    430		return -EBUSY;
    431
    432	csio_wr_reg32(hw, val, SF_DATA_A);
    433	csio_wr_reg32(hw, SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1) |
    434		      OP_V(1) | SF_LOCK_V(lock), SF_OP_A);
    435
    436	return csio_hw_wait_op_done_val(hw, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS,
    437					10, NULL);
    438}
    439
    440/*
    441 *	csio_hw_flash_wait_op - wait for a flash operation to complete
    442 *	@hw: the HW module
    443 *	@attempts: max number of polls of the status register
    444 *	@delay: delay between polls in ms
    445 *
    446 *	Wait for a flash operation to complete by polling the status register.
    447 */
    448static int
    449csio_hw_flash_wait_op(struct csio_hw *hw, int32_t attempts, int32_t delay)
    450{
    451	int ret;
    452	uint32_t status;
    453
    454	while (1) {
    455		ret = csio_hw_sf1_write(hw, 1, 1, 1, SF_RD_STATUS);
    456		if (ret != 0)
    457			return ret;
    458
    459		ret = csio_hw_sf1_read(hw, 1, 0, 1, &status);
    460		if (ret != 0)
    461			return ret;
    462
    463		if (!(status & 1))
    464			return 0;
    465		if (--attempts == 0)
    466			return -EAGAIN;
    467		if (delay)
    468			msleep(delay);
    469	}
    470}
    471
    472/*
    473 *	csio_hw_read_flash - read words from serial flash
    474 *	@hw: the HW module
    475 *	@addr: the start address for the read
    476 *	@nwords: how many 32-bit words to read
    477 *	@data: where to store the read data
    478 *	@byte_oriented: whether to store data as bytes or as words
    479 *
    480 *	Read the specified number of 32-bit words from the serial flash.
    481 *	If @byte_oriented is set the read data is stored as a byte array
    482 *	(i.e., big-endian), otherwise as 32-bit words in the platform's
    483 *	natural endianess.
    484 */
    485static int
    486csio_hw_read_flash(struct csio_hw *hw, uint32_t addr, uint32_t nwords,
    487		  uint32_t *data, int32_t byte_oriented)
    488{
    489	int ret;
    490
    491	if (addr + nwords * sizeof(uint32_t) > hw->params.sf_size || (addr & 3))
    492		return -EINVAL;
    493
    494	addr = swab32(addr) | SF_RD_DATA_FAST;
    495
    496	ret = csio_hw_sf1_write(hw, 4, 1, 0, addr);
    497	if (ret != 0)
    498		return ret;
    499
    500	ret = csio_hw_sf1_read(hw, 1, 1, 0, data);
    501	if (ret != 0)
    502		return ret;
    503
    504	for ( ; nwords; nwords--, data++) {
    505		ret = csio_hw_sf1_read(hw, 4, nwords > 1, nwords == 1, data);
    506		if (nwords == 1)
    507			csio_wr_reg32(hw, 0, SF_OP_A);    /* unlock SF */
    508		if (ret)
    509			return ret;
    510		if (byte_oriented)
    511			*data = (__force __u32) htonl(*data);
    512	}
    513	return 0;
    514}
    515
    516/*
    517 *	csio_hw_write_flash - write up to a page of data to the serial flash
    518 *	@hw: the hw
    519 *	@addr: the start address to write
    520 *	@n: length of data to write in bytes
    521 *	@data: the data to write
    522 *
    523 *	Writes up to a page of data (256 bytes) to the serial flash starting
    524 *	at the given address.  All the data must be written to the same page.
    525 */
    526static int
    527csio_hw_write_flash(struct csio_hw *hw, uint32_t addr,
    528		    uint32_t n, const uint8_t *data)
    529{
    530	int ret = -EINVAL;
    531	uint32_t buf[64];
    532	uint32_t i, c, left, val, offset = addr & 0xff;
    533
    534	if (addr >= hw->params.sf_size || offset + n > SF_PAGE_SIZE)
    535		return -EINVAL;
    536
    537	val = swab32(addr) | SF_PROG_PAGE;
    538
    539	ret = csio_hw_sf1_write(hw, 1, 0, 1, SF_WR_ENABLE);
    540	if (ret != 0)
    541		goto unlock;
    542
    543	ret = csio_hw_sf1_write(hw, 4, 1, 1, val);
    544	if (ret != 0)
    545		goto unlock;
    546
    547	for (left = n; left; left -= c) {
    548		c = min(left, 4U);
    549		for (val = 0, i = 0; i < c; ++i)
    550			val = (val << 8) + *data++;
    551
    552		ret = csio_hw_sf1_write(hw, c, c != left, 1, val);
    553		if (ret)
    554			goto unlock;
    555	}
    556	ret = csio_hw_flash_wait_op(hw, 8, 1);
    557	if (ret)
    558		goto unlock;
    559
    560	csio_wr_reg32(hw, 0, SF_OP_A);    /* unlock SF */
    561
    562	/* Read the page to verify the write succeeded */
    563	ret = csio_hw_read_flash(hw, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
    564	if (ret)
    565		return ret;
    566
    567	if (memcmp(data - n, (uint8_t *)buf + offset, n)) {
    568		csio_err(hw,
    569			 "failed to correctly write the flash page at %#x\n",
    570			 addr);
    571		return -EINVAL;
    572	}
    573
    574	return 0;
    575
    576unlock:
    577	csio_wr_reg32(hw, 0, SF_OP_A);    /* unlock SF */
    578	return ret;
    579}
    580
    581/*
    582 *	csio_hw_flash_erase_sectors - erase a range of flash sectors
    583 *	@hw: the HW module
    584 *	@start: the first sector to erase
    585 *	@end: the last sector to erase
    586 *
    587 *	Erases the sectors in the given inclusive range.
    588 */
    589static int
    590csio_hw_flash_erase_sectors(struct csio_hw *hw, int32_t start, int32_t end)
    591{
    592	int ret = 0;
    593
    594	while (start <= end) {
    595
    596		ret = csio_hw_sf1_write(hw, 1, 0, 1, SF_WR_ENABLE);
    597		if (ret != 0)
    598			goto out;
    599
    600		ret = csio_hw_sf1_write(hw, 4, 0, 1,
    601					SF_ERASE_SECTOR | (start << 8));
    602		if (ret != 0)
    603			goto out;
    604
    605		ret = csio_hw_flash_wait_op(hw, 14, 500);
    606		if (ret != 0)
    607			goto out;
    608
    609		start++;
    610	}
    611out:
    612	if (ret)
    613		csio_err(hw, "erase of flash sector %d failed, error %d\n",
    614			 start, ret);
    615	csio_wr_reg32(hw, 0, SF_OP_A);    /* unlock SF */
    616	return 0;
    617}
    618
    619static void
    620csio_hw_print_fw_version(struct csio_hw *hw, char *str)
    621{
    622	csio_info(hw, "%s: %u.%u.%u.%u\n", str,
    623		    FW_HDR_FW_VER_MAJOR_G(hw->fwrev),
    624		    FW_HDR_FW_VER_MINOR_G(hw->fwrev),
    625		    FW_HDR_FW_VER_MICRO_G(hw->fwrev),
    626		    FW_HDR_FW_VER_BUILD_G(hw->fwrev));
    627}
    628
    629/*
    630 * csio_hw_get_fw_version - read the firmware version
    631 * @hw: HW module
    632 * @vers: where to place the version
    633 *
    634 * Reads the FW version from flash.
    635 */
    636static int
    637csio_hw_get_fw_version(struct csio_hw *hw, uint32_t *vers)
    638{
    639	return csio_hw_read_flash(hw, FLASH_FW_START +
    640				  offsetof(struct fw_hdr, fw_ver), 1,
    641				  vers, 0);
    642}
    643
    644/*
    645 *	csio_hw_get_tp_version - read the TP microcode version
    646 *	@hw: HW module
    647 *	@vers: where to place the version
    648 *
    649 *	Reads the TP microcode version from flash.
    650 */
    651static int
    652csio_hw_get_tp_version(struct csio_hw *hw, u32 *vers)
    653{
    654	return csio_hw_read_flash(hw, FLASH_FW_START +
    655			offsetof(struct fw_hdr, tp_microcode_ver), 1,
    656			vers, 0);
    657}
    658
    659/*
    660 * csio_hw_fw_dload - download firmware.
    661 * @hw: HW module
    662 * @fw_data: firmware image to write.
    663 * @size: image size
    664 *
    665 * Write the supplied firmware image to the card's serial flash.
    666 */
    667static int
    668csio_hw_fw_dload(struct csio_hw *hw, uint8_t *fw_data, uint32_t size)
    669{
    670	uint32_t csum;
    671	int32_t addr;
    672	int ret;
    673	uint32_t i;
    674	uint8_t first_page[SF_PAGE_SIZE];
    675	const __be32 *p = (const __be32 *)fw_data;
    676	struct fw_hdr *hdr = (struct fw_hdr *)fw_data;
    677	uint32_t sf_sec_size;
    678
    679	if ((!hw->params.sf_size) || (!hw->params.sf_nsec)) {
    680		csio_err(hw, "Serial Flash data invalid\n");
    681		return -EINVAL;
    682	}
    683
    684	if (!size) {
    685		csio_err(hw, "FW image has no data\n");
    686		return -EINVAL;
    687	}
    688
    689	if (size & 511) {
    690		csio_err(hw, "FW image size not multiple of 512 bytes\n");
    691		return -EINVAL;
    692	}
    693
    694	if (ntohs(hdr->len512) * 512 != size) {
    695		csio_err(hw, "FW image size differs from size in FW header\n");
    696		return -EINVAL;
    697	}
    698
    699	if (size > FLASH_FW_MAX_SIZE) {
    700		csio_err(hw, "FW image too large, max is %u bytes\n",
    701			    FLASH_FW_MAX_SIZE);
    702		return -EINVAL;
    703	}
    704
    705	for (csum = 0, i = 0; i < size / sizeof(csum); i++)
    706		csum += ntohl(p[i]);
    707
    708	if (csum != 0xffffffff) {
    709		csio_err(hw, "corrupted firmware image, checksum %#x\n", csum);
    710		return -EINVAL;
    711	}
    712
    713	sf_sec_size = hw->params.sf_size / hw->params.sf_nsec;
    714	i = DIV_ROUND_UP(size, sf_sec_size);        /* # of sectors spanned */
    715
    716	csio_dbg(hw, "Erasing sectors... start:%d end:%d\n",
    717			  FLASH_FW_START_SEC, FLASH_FW_START_SEC + i - 1);
    718
    719	ret = csio_hw_flash_erase_sectors(hw, FLASH_FW_START_SEC,
    720					  FLASH_FW_START_SEC + i - 1);
    721	if (ret) {
    722		csio_err(hw, "Flash Erase failed\n");
    723		goto out;
    724	}
    725
    726	/*
    727	 * We write the correct version at the end so the driver can see a bad
    728	 * version if the FW write fails.  Start by writing a copy of the
    729	 * first page with a bad version.
    730	 */
    731	memcpy(first_page, fw_data, SF_PAGE_SIZE);
    732	((struct fw_hdr *)first_page)->fw_ver = htonl(0xffffffff);
    733	ret = csio_hw_write_flash(hw, FLASH_FW_START, SF_PAGE_SIZE, first_page);
    734	if (ret)
    735		goto out;
    736
    737	csio_dbg(hw, "Writing Flash .. start:%d end:%d\n",
    738		    FW_IMG_START, FW_IMG_START + size);
    739
    740	addr = FLASH_FW_START;
    741	for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
    742		addr += SF_PAGE_SIZE;
    743		fw_data += SF_PAGE_SIZE;
    744		ret = csio_hw_write_flash(hw, addr, SF_PAGE_SIZE, fw_data);
    745		if (ret)
    746			goto out;
    747	}
    748
    749	ret = csio_hw_write_flash(hw,
    750				  FLASH_FW_START +
    751					offsetof(struct fw_hdr, fw_ver),
    752				  sizeof(hdr->fw_ver),
    753				  (const uint8_t *)&hdr->fw_ver);
    754
    755out:
    756	if (ret)
    757		csio_err(hw, "firmware download failed, error %d\n", ret);
    758	return ret;
    759}
    760
    761static int
    762csio_hw_get_flash_params(struct csio_hw *hw)
    763{
    764	/* Table for non-Numonix supported flash parts.  Numonix parts are left
    765	 * to the preexisting code.  All flash parts have 64KB sectors.
    766	 */
    767	static struct flash_desc {
    768		u32 vendor_and_model_id;
    769		u32 size_mb;
    770	} supported_flash[] = {
    771		{ 0x150201, 4 << 20 },       /* Spansion 4MB S25FL032P */
    772	};
    773
    774	u32 part, manufacturer;
    775	u32 density, size = 0;
    776	u32 flashid = 0;
    777	int ret;
    778
    779	ret = csio_hw_sf1_write(hw, 1, 1, 0, SF_RD_ID);
    780	if (!ret)
    781		ret = csio_hw_sf1_read(hw, 3, 0, 1, &flashid);
    782	csio_wr_reg32(hw, 0, SF_OP_A);    /* unlock SF */
    783	if (ret)
    784		return ret;
    785
    786	/* Check to see if it's one of our non-standard supported Flash parts.
    787	 */
    788	for (part = 0; part < ARRAY_SIZE(supported_flash); part++)
    789		if (supported_flash[part].vendor_and_model_id == flashid) {
    790			hw->params.sf_size = supported_flash[part].size_mb;
    791			hw->params.sf_nsec =
    792				hw->params.sf_size / SF_SEC_SIZE;
    793			goto found;
    794		}
    795
    796	/* Decode Flash part size.  The code below looks repetitive with
    797	 * common encodings, but that's not guaranteed in the JEDEC
    798	 * specification for the Read JEDEC ID command.  The only thing that
    799	 * we're guaranteed by the JEDEC specification is where the
    800	 * Manufacturer ID is in the returned result.  After that each
    801	 * Manufacturer ~could~ encode things completely differently.
    802	 * Note, all Flash parts must have 64KB sectors.
    803	 */
    804	manufacturer = flashid & 0xff;
    805	switch (manufacturer) {
    806	case 0x20: { /* Micron/Numonix */
    807		/* This Density -> Size decoding table is taken from Micron
    808		 * Data Sheets.
    809		 */
    810		density = (flashid >> 16) & 0xff;
    811		switch (density) {
    812		case 0x14 ... 0x19: /* 1MB - 32MB */
    813			size = 1 << density;
    814			break;
    815		case 0x20: /* 64MB */
    816			size = 1 << 26;
    817			break;
    818		case 0x21: /* 128MB */
    819			size = 1 << 27;
    820			break;
    821		case 0x22: /* 256MB */
    822			size = 1 << 28;
    823		}
    824		break;
    825	}
    826	case 0x9d: { /* ISSI -- Integrated Silicon Solution, Inc. */
    827		/* This Density -> Size decoding table is taken from ISSI
    828		 * Data Sheets.
    829		 */
    830		density = (flashid >> 16) & 0xff;
    831		switch (density) {
    832		case 0x16: /* 32 MB */
    833			size = 1 << 25;
    834			break;
    835		case 0x17: /* 64MB */
    836			size = 1 << 26;
    837		}
    838		break;
    839	}
    840	case 0xc2: /* Macronix */
    841	case 0xef: /* Winbond */ {
    842		/* This Density -> Size decoding table is taken from
    843		 * Macronix and Winbond Data Sheets.
    844		 */
    845		density = (flashid >> 16) & 0xff;
    846		switch (density) {
    847		case 0x17: /* 8MB */
    848		case 0x18: /* 16MB */
    849			size = 1 << density;
    850		}
    851	}
    852	}
    853
    854	/* If we didn't recognize the FLASH part, that's no real issue: the
    855	 * Hardware/Software contract says that Hardware will _*ALWAYS*_
    856	 * use a FLASH part which is at least 4MB in size and has 64KB
    857	 * sectors.  The unrecognized FLASH part is likely to be much larger
    858	 * than 4MB, but that's all we really need.
    859	 */
    860	if (size == 0) {
    861		csio_warn(hw, "Unknown Flash Part, ID = %#x, assuming 4MB\n",
    862			  flashid);
    863		size = 1 << 22;
    864	}
    865
    866	/* Store decoded Flash size */
    867	hw->params.sf_size = size;
    868	hw->params.sf_nsec = size / SF_SEC_SIZE;
    869
    870found:
    871	if (hw->params.sf_size < FLASH_MIN_SIZE)
    872		csio_warn(hw, "WARNING: Flash Part ID %#x, size %#x < %#x\n",
    873			  flashid, hw->params.sf_size, FLASH_MIN_SIZE);
    874	return 0;
    875}
    876
    877/*****************************************************************************/
    878/* HW State machine assists                                                  */
    879/*****************************************************************************/
    880
    881static int
    882csio_hw_dev_ready(struct csio_hw *hw)
    883{
    884	uint32_t reg;
    885	int cnt = 6;
    886	int src_pf;
    887
    888	while (((reg = csio_rd_reg32(hw, PL_WHOAMI_A)) == 0xFFFFFFFF) &&
    889	       (--cnt != 0))
    890		mdelay(100);
    891
    892	if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK))
    893		src_pf = SOURCEPF_G(reg);
    894	else
    895		src_pf = T6_SOURCEPF_G(reg);
    896
    897	if ((cnt == 0) && (((int32_t)(src_pf) < 0) ||
    898			   (src_pf >= CSIO_MAX_PFN))) {
    899		csio_err(hw, "PL_WHOAMI returned 0x%x, cnt:%d\n", reg, cnt);
    900		return -EIO;
    901	}
    902
    903	hw->pfn = src_pf;
    904
    905	return 0;
    906}
    907
    908/*
    909 * csio_do_hello - Perform the HELLO FW Mailbox command and process response.
    910 * @hw: HW module
    911 * @state: Device state
    912 *
    913 * FW_HELLO_CMD has to be polled for completion.
    914 */
    915static int
    916csio_do_hello(struct csio_hw *hw, enum csio_dev_state *state)
    917{
    918	struct csio_mb	*mbp;
    919	int	rv = 0;
    920	enum fw_retval retval;
    921	uint8_t mpfn;
    922	char state_str[16];
    923	int retries = FW_CMD_HELLO_RETRIES;
    924
    925	memset(state_str, 0, sizeof(state_str));
    926
    927	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
    928	if (!mbp) {
    929		rv = -ENOMEM;
    930		CSIO_INC_STATS(hw, n_err_nomem);
    931		goto out;
    932	}
    933
    934retry:
    935	csio_mb_hello(hw, mbp, CSIO_MB_DEFAULT_TMO, hw->pfn,
    936		      hw->pfn, CSIO_MASTER_MAY, NULL);
    937
    938	rv = csio_mb_issue(hw, mbp);
    939	if (rv) {
    940		csio_err(hw, "failed to issue HELLO cmd. ret:%d.\n", rv);
    941		goto out_free_mb;
    942	}
    943
    944	csio_mb_process_hello_rsp(hw, mbp, &retval, state, &mpfn);
    945	if (retval != FW_SUCCESS) {
    946		csio_err(hw, "HELLO cmd failed with ret: %d\n", retval);
    947		rv = -EINVAL;
    948		goto out_free_mb;
    949	}
    950
    951	/* Firmware has designated us to be master */
    952	if (hw->pfn == mpfn) {
    953		hw->flags |= CSIO_HWF_MASTER;
    954	} else if (*state == CSIO_DEV_STATE_UNINIT) {
    955		/*
    956		 * If we're not the Master PF then we need to wait around for
    957		 * the Master PF Driver to finish setting up the adapter.
    958		 *
    959		 * Note that we also do this wait if we're a non-Master-capable
    960		 * PF and there is no current Master PF; a Master PF may show up
    961		 * momentarily and we wouldn't want to fail pointlessly.  (This
    962		 * can happen when an OS loads lots of different drivers rapidly
    963		 * at the same time). In this case, the Master PF returned by
    964		 * the firmware will be PCIE_FW_MASTER_MASK so the test below
    965		 * will work ...
    966		 */
    967
    968		int waiting = FW_CMD_HELLO_TIMEOUT;
    969
    970		/*
    971		 * Wait for the firmware to either indicate an error or
    972		 * initialized state.  If we see either of these we bail out
    973		 * and report the issue to the caller.  If we exhaust the
    974		 * "hello timeout" and we haven't exhausted our retries, try
    975		 * again.  Otherwise bail with a timeout error.
    976		 */
    977		for (;;) {
    978			uint32_t pcie_fw;
    979
    980			spin_unlock_irq(&hw->lock);
    981			msleep(50);
    982			spin_lock_irq(&hw->lock);
    983			waiting -= 50;
    984
    985			/*
    986			 * If neither Error nor Initialized are indicated
    987			 * by the firmware keep waiting till we exhaust our
    988			 * timeout ... and then retry if we haven't exhausted
    989			 * our retries ...
    990			 */
    991			pcie_fw = csio_rd_reg32(hw, PCIE_FW_A);
    992			if (!(pcie_fw & (PCIE_FW_ERR_F|PCIE_FW_INIT_F))) {
    993				if (waiting <= 0) {
    994					if (retries-- > 0)
    995						goto retry;
    996
    997					rv = -ETIMEDOUT;
    998					break;
    999				}
   1000				continue;
   1001			}
   1002
   1003			/*
   1004			 * We either have an Error or Initialized condition
   1005			 * report errors preferentially.
   1006			 */
   1007			if (state) {
   1008				if (pcie_fw & PCIE_FW_ERR_F) {
   1009					*state = CSIO_DEV_STATE_ERR;
   1010					rv = -ETIMEDOUT;
   1011				} else if (pcie_fw & PCIE_FW_INIT_F)
   1012					*state = CSIO_DEV_STATE_INIT;
   1013			}
   1014
   1015			/*
   1016			 * If we arrived before a Master PF was selected and
   1017			 * there's not a valid Master PF, grab its identity
   1018			 * for our caller.
   1019			 */
   1020			if (mpfn == PCIE_FW_MASTER_M &&
   1021			    (pcie_fw & PCIE_FW_MASTER_VLD_F))
   1022				mpfn = PCIE_FW_MASTER_G(pcie_fw);
   1023			break;
   1024		}
   1025		hw->flags &= ~CSIO_HWF_MASTER;
   1026	}
   1027
   1028	switch (*state) {
   1029	case CSIO_DEV_STATE_UNINIT:
   1030		strcpy(state_str, "Initializing");
   1031		break;
   1032	case CSIO_DEV_STATE_INIT:
   1033		strcpy(state_str, "Initialized");
   1034		break;
   1035	case CSIO_DEV_STATE_ERR:
   1036		strcpy(state_str, "Error");
   1037		break;
   1038	default:
   1039		strcpy(state_str, "Unknown");
   1040		break;
   1041	}
   1042
   1043	if (hw->pfn == mpfn)
   1044		csio_info(hw, "PF: %d, Coming up as MASTER, HW state: %s\n",
   1045			hw->pfn, state_str);
   1046	else
   1047		csio_info(hw,
   1048		    "PF: %d, Coming up as SLAVE, Master PF: %d, HW state: %s\n",
   1049		    hw->pfn, mpfn, state_str);
   1050
   1051out_free_mb:
   1052	mempool_free(mbp, hw->mb_mempool);
   1053out:
   1054	return rv;
   1055}
   1056
   1057/*
   1058 * csio_do_bye - Perform the BYE FW Mailbox command and process response.
   1059 * @hw: HW module
   1060 *
   1061 */
   1062static int
   1063csio_do_bye(struct csio_hw *hw)
   1064{
   1065	struct csio_mb	*mbp;
   1066	enum fw_retval retval;
   1067
   1068	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1069	if (!mbp) {
   1070		CSIO_INC_STATS(hw, n_err_nomem);
   1071		return -ENOMEM;
   1072	}
   1073
   1074	csio_mb_bye(hw, mbp, CSIO_MB_DEFAULT_TMO, NULL);
   1075
   1076	if (csio_mb_issue(hw, mbp)) {
   1077		csio_err(hw, "Issue of BYE command failed\n");
   1078		mempool_free(mbp, hw->mb_mempool);
   1079		return -EINVAL;
   1080	}
   1081
   1082	retval = csio_mb_fw_retval(mbp);
   1083	if (retval != FW_SUCCESS) {
   1084		mempool_free(mbp, hw->mb_mempool);
   1085		return -EINVAL;
   1086	}
   1087
   1088	mempool_free(mbp, hw->mb_mempool);
   1089
   1090	return 0;
   1091}
   1092
   1093/*
   1094 * csio_do_reset- Perform the device reset.
   1095 * @hw: HW module
   1096 * @fw_rst: FW reset
   1097 *
   1098 * If fw_rst is set, issues FW reset mbox cmd otherwise
   1099 * does PIO reset.
   1100 * Performs reset of the function.
   1101 */
   1102static int
   1103csio_do_reset(struct csio_hw *hw, bool fw_rst)
   1104{
   1105	struct csio_mb	*mbp;
   1106	enum fw_retval retval;
   1107
   1108	if (!fw_rst) {
   1109		/* PIO reset */
   1110		csio_wr_reg32(hw, PIORSTMODE_F | PIORST_F, PL_RST_A);
   1111		mdelay(2000);
   1112		return 0;
   1113	}
   1114
   1115	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1116	if (!mbp) {
   1117		CSIO_INC_STATS(hw, n_err_nomem);
   1118		return -ENOMEM;
   1119	}
   1120
   1121	csio_mb_reset(hw, mbp, CSIO_MB_DEFAULT_TMO,
   1122		      PIORSTMODE_F | PIORST_F, 0, NULL);
   1123
   1124	if (csio_mb_issue(hw, mbp)) {
   1125		csio_err(hw, "Issue of RESET command failed.n");
   1126		mempool_free(mbp, hw->mb_mempool);
   1127		return -EINVAL;
   1128	}
   1129
   1130	retval = csio_mb_fw_retval(mbp);
   1131	if (retval != FW_SUCCESS) {
   1132		csio_err(hw, "RESET cmd failed with ret:0x%x.\n", retval);
   1133		mempool_free(mbp, hw->mb_mempool);
   1134		return -EINVAL;
   1135	}
   1136
   1137	mempool_free(mbp, hw->mb_mempool);
   1138
   1139	return 0;
   1140}
   1141
   1142static int
   1143csio_hw_validate_caps(struct csio_hw *hw, struct csio_mb *mbp)
   1144{
   1145	struct fw_caps_config_cmd *rsp = (struct fw_caps_config_cmd *)mbp->mb;
   1146	uint16_t caps;
   1147
   1148	caps = ntohs(rsp->fcoecaps);
   1149
   1150	if (!(caps & FW_CAPS_CONFIG_FCOE_INITIATOR)) {
   1151		csio_err(hw, "No FCoE Initiator capability in the firmware.\n");
   1152		return -EINVAL;
   1153	}
   1154
   1155	if (!(caps & FW_CAPS_CONFIG_FCOE_CTRL_OFLD)) {
   1156		csio_err(hw, "No FCoE Control Offload capability\n");
   1157		return -EINVAL;
   1158	}
   1159
   1160	return 0;
   1161}
   1162
   1163/*
   1164 *	csio_hw_fw_halt - issue a reset/halt to FW and put uP into RESET
   1165 *	@hw: the HW module
   1166 *	@mbox: mailbox to use for the FW RESET command (if desired)
   1167 *	@force: force uP into RESET even if FW RESET command fails
   1168 *
   1169 *	Issues a RESET command to firmware (if desired) with a HALT indication
   1170 *	and then puts the microprocessor into RESET state.  The RESET command
   1171 *	will only be issued if a legitimate mailbox is provided (mbox <=
   1172 *	PCIE_FW_MASTER_MASK).
   1173 *
   1174 *	This is generally used in order for the host to safely manipulate the
   1175 *	adapter without fear of conflicting with whatever the firmware might
   1176 *	be doing.  The only way out of this state is to RESTART the firmware
   1177 *	...
   1178 */
   1179static int
   1180csio_hw_fw_halt(struct csio_hw *hw, uint32_t mbox, int32_t force)
   1181{
   1182	enum fw_retval retval = 0;
   1183
   1184	/*
   1185	 * If a legitimate mailbox is provided, issue a RESET command
   1186	 * with a HALT indication.
   1187	 */
   1188	if (mbox <= PCIE_FW_MASTER_M) {
   1189		struct csio_mb	*mbp;
   1190
   1191		mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1192		if (!mbp) {
   1193			CSIO_INC_STATS(hw, n_err_nomem);
   1194			return -ENOMEM;
   1195		}
   1196
   1197		csio_mb_reset(hw, mbp, CSIO_MB_DEFAULT_TMO,
   1198			      PIORSTMODE_F | PIORST_F, FW_RESET_CMD_HALT_F,
   1199			      NULL);
   1200
   1201		if (csio_mb_issue(hw, mbp)) {
   1202			csio_err(hw, "Issue of RESET command failed!\n");
   1203			mempool_free(mbp, hw->mb_mempool);
   1204			return -EINVAL;
   1205		}
   1206
   1207		retval = csio_mb_fw_retval(mbp);
   1208		mempool_free(mbp, hw->mb_mempool);
   1209	}
   1210
   1211	/*
   1212	 * Normally we won't complete the operation if the firmware RESET
   1213	 * command fails but if our caller insists we'll go ahead and put the
   1214	 * uP into RESET.  This can be useful if the firmware is hung or even
   1215	 * missing ...  We'll have to take the risk of putting the uP into
   1216	 * RESET without the cooperation of firmware in that case.
   1217	 *
   1218	 * We also force the firmware's HALT flag to be on in case we bypassed
   1219	 * the firmware RESET command above or we're dealing with old firmware
   1220	 * which doesn't have the HALT capability.  This will serve as a flag
   1221	 * for the incoming firmware to know that it's coming out of a HALT
   1222	 * rather than a RESET ... if it's new enough to understand that ...
   1223	 */
   1224	if (retval == 0 || force) {
   1225		csio_set_reg_field(hw, CIM_BOOT_CFG_A, UPCRST_F, UPCRST_F);
   1226		csio_set_reg_field(hw, PCIE_FW_A, PCIE_FW_HALT_F,
   1227				   PCIE_FW_HALT_F);
   1228	}
   1229
   1230	/*
   1231	 * And we always return the result of the firmware RESET command
   1232	 * even when we force the uP into RESET ...
   1233	 */
   1234	return retval ? -EINVAL : 0;
   1235}
   1236
   1237/*
   1238 *	csio_hw_fw_restart - restart the firmware by taking the uP out of RESET
   1239 *	@hw: the HW module
   1240 *	@reset: if we want to do a RESET to restart things
   1241 *
   1242 *	Restart firmware previously halted by csio_hw_fw_halt().  On successful
   1243 *	return the previous PF Master remains as the new PF Master and there
   1244 *	is no need to issue a new HELLO command, etc.
   1245 *
   1246 *	We do this in two ways:
   1247 *
   1248 *	 1. If we're dealing with newer firmware we'll simply want to take
   1249 *	    the chip's microprocessor out of RESET.  This will cause the
   1250 *	    firmware to start up from its start vector.  And then we'll loop
   1251 *	    until the firmware indicates it's started again (PCIE_FW.HALT
   1252 *	    reset to 0) or we timeout.
   1253 *
   1254 *	 2. If we're dealing with older firmware then we'll need to RESET
   1255 *	    the chip since older firmware won't recognize the PCIE_FW.HALT
   1256 *	    flag and automatically RESET itself on startup.
   1257 */
   1258static int
   1259csio_hw_fw_restart(struct csio_hw *hw, uint32_t mbox, int32_t reset)
   1260{
   1261	if (reset) {
   1262		/*
   1263		 * Since we're directing the RESET instead of the firmware
   1264		 * doing it automatically, we need to clear the PCIE_FW.HALT
   1265		 * bit.
   1266		 */
   1267		csio_set_reg_field(hw, PCIE_FW_A, PCIE_FW_HALT_F, 0);
   1268
   1269		/*
   1270		 * If we've been given a valid mailbox, first try to get the
   1271		 * firmware to do the RESET.  If that works, great and we can
   1272		 * return success.  Otherwise, if we haven't been given a
   1273		 * valid mailbox or the RESET command failed, fall back to
   1274		 * hitting the chip with a hammer.
   1275		 */
   1276		if (mbox <= PCIE_FW_MASTER_M) {
   1277			csio_set_reg_field(hw, CIM_BOOT_CFG_A, UPCRST_F, 0);
   1278			msleep(100);
   1279			if (csio_do_reset(hw, true) == 0)
   1280				return 0;
   1281		}
   1282
   1283		csio_wr_reg32(hw, PIORSTMODE_F | PIORST_F, PL_RST_A);
   1284		msleep(2000);
   1285	} else {
   1286		int ms;
   1287
   1288		csio_set_reg_field(hw, CIM_BOOT_CFG_A, UPCRST_F, 0);
   1289		for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) {
   1290			if (!(csio_rd_reg32(hw, PCIE_FW_A) & PCIE_FW_HALT_F))
   1291				return 0;
   1292			msleep(100);
   1293			ms += 100;
   1294		}
   1295		return -ETIMEDOUT;
   1296	}
   1297	return 0;
   1298}
   1299
   1300/*
   1301 *	csio_hw_fw_upgrade - perform all of the steps necessary to upgrade FW
   1302 *	@hw: the HW module
   1303 *	@mbox: mailbox to use for the FW RESET command (if desired)
   1304 *	@fw_data: the firmware image to write
   1305 *	@size: image size
   1306 *	@force: force upgrade even if firmware doesn't cooperate
   1307 *
   1308 *	Perform all of the steps necessary for upgrading an adapter's
   1309 *	firmware image.  Normally this requires the cooperation of the
   1310 *	existing firmware in order to halt all existing activities
   1311 *	but if an invalid mailbox token is passed in we skip that step
   1312 *	(though we'll still put the adapter microprocessor into RESET in
   1313 *	that case).
   1314 *
   1315 *	On successful return the new firmware will have been loaded and
   1316 *	the adapter will have been fully RESET losing all previous setup
   1317 *	state.  On unsuccessful return the adapter may be completely hosed ...
   1318 *	positive errno indicates that the adapter is ~probably~ intact, a
   1319 *	negative errno indicates that things are looking bad ...
   1320 */
   1321static int
   1322csio_hw_fw_upgrade(struct csio_hw *hw, uint32_t mbox,
   1323		  const u8 *fw_data, uint32_t size, int32_t force)
   1324{
   1325	const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
   1326	int reset, ret;
   1327
   1328	ret = csio_hw_fw_halt(hw, mbox, force);
   1329	if (ret != 0 && !force)
   1330		return ret;
   1331
   1332	ret = csio_hw_fw_dload(hw, (uint8_t *) fw_data, size);
   1333	if (ret != 0)
   1334		return ret;
   1335
   1336	/*
   1337	 * Older versions of the firmware don't understand the new
   1338	 * PCIE_FW.HALT flag and so won't know to perform a RESET when they
   1339	 * restart.  So for newly loaded older firmware we'll have to do the
   1340	 * RESET for it so it starts up on a clean slate.  We can tell if
   1341	 * the newly loaded firmware will handle this right by checking
   1342	 * its header flags to see if it advertises the capability.
   1343	 */
   1344	reset = ((ntohl(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0);
   1345	return csio_hw_fw_restart(hw, mbox, reset);
   1346}
   1347
   1348/*
   1349 * csio_get_device_params - Get device parameters.
   1350 * @hw: HW module
   1351 *
   1352 */
   1353static int
   1354csio_get_device_params(struct csio_hw *hw)
   1355{
   1356	struct csio_wrm *wrm	= csio_hw_to_wrm(hw);
   1357	struct csio_mb	*mbp;
   1358	enum fw_retval retval;
   1359	u32 param[6];
   1360	int i, j = 0;
   1361
   1362	/* Initialize portids to -1 */
   1363	for (i = 0; i < CSIO_MAX_PPORTS; i++)
   1364		hw->pport[i].portid = -1;
   1365
   1366	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1367	if (!mbp) {
   1368		CSIO_INC_STATS(hw, n_err_nomem);
   1369		return -ENOMEM;
   1370	}
   1371
   1372	/* Get port vec information. */
   1373	param[0] = FW_PARAM_DEV(PORTVEC);
   1374
   1375	/* Get Core clock. */
   1376	param[1] = FW_PARAM_DEV(CCLK);
   1377
   1378	/* Get EQ id start and end. */
   1379	param[2] = FW_PARAM_PFVF(EQ_START);
   1380	param[3] = FW_PARAM_PFVF(EQ_END);
   1381
   1382	/* Get IQ id start and end. */
   1383	param[4] = FW_PARAM_PFVF(IQFLINT_START);
   1384	param[5] = FW_PARAM_PFVF(IQFLINT_END);
   1385
   1386	csio_mb_params(hw, mbp, CSIO_MB_DEFAULT_TMO, hw->pfn, 0,
   1387		       ARRAY_SIZE(param), param, NULL, false, NULL);
   1388	if (csio_mb_issue(hw, mbp)) {
   1389		csio_err(hw, "Issue of FW_PARAMS_CMD(read) failed!\n");
   1390		mempool_free(mbp, hw->mb_mempool);
   1391		return -EINVAL;
   1392	}
   1393
   1394	csio_mb_process_read_params_rsp(hw, mbp, &retval,
   1395			ARRAY_SIZE(param), param);
   1396	if (retval != FW_SUCCESS) {
   1397		csio_err(hw, "FW_PARAMS_CMD(read) failed with ret:0x%x!\n",
   1398				retval);
   1399		mempool_free(mbp, hw->mb_mempool);
   1400		return -EINVAL;
   1401	}
   1402
   1403	/* cache the information. */
   1404	hw->port_vec = param[0];
   1405	hw->vpd.cclk = param[1];
   1406	wrm->fw_eq_start = param[2];
   1407	wrm->fw_iq_start = param[4];
   1408
   1409	/* Using FW configured max iqs & eqs */
   1410	if ((hw->flags & CSIO_HWF_USING_SOFT_PARAMS) ||
   1411		!csio_is_hw_master(hw)) {
   1412		hw->cfg_niq = param[5] - param[4] + 1;
   1413		hw->cfg_neq = param[3] - param[2] + 1;
   1414		csio_dbg(hw, "Using fwconfig max niqs %d neqs %d\n",
   1415			hw->cfg_niq, hw->cfg_neq);
   1416	}
   1417
   1418	hw->port_vec &= csio_port_mask;
   1419
   1420	hw->num_pports	= hweight32(hw->port_vec);
   1421
   1422	csio_dbg(hw, "Port vector: 0x%x, #ports: %d\n",
   1423		    hw->port_vec, hw->num_pports);
   1424
   1425	for (i = 0; i < hw->num_pports; i++) {
   1426		while ((hw->port_vec & (1 << j)) == 0)
   1427			j++;
   1428		hw->pport[i].portid = j++;
   1429		csio_dbg(hw, "Found Port:%d\n", hw->pport[i].portid);
   1430	}
   1431	mempool_free(mbp, hw->mb_mempool);
   1432
   1433	return 0;
   1434}
   1435
   1436
   1437/*
   1438 * csio_config_device_caps - Get and set device capabilities.
   1439 * @hw: HW module
   1440 *
   1441 */
   1442static int
   1443csio_config_device_caps(struct csio_hw *hw)
   1444{
   1445	struct csio_mb	*mbp;
   1446	enum fw_retval retval;
   1447	int rv = -EINVAL;
   1448
   1449	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1450	if (!mbp) {
   1451		CSIO_INC_STATS(hw, n_err_nomem);
   1452		return -ENOMEM;
   1453	}
   1454
   1455	/* Get device capabilities */
   1456	csio_mb_caps_config(hw, mbp, CSIO_MB_DEFAULT_TMO, 0, 0, 0, 0, NULL);
   1457
   1458	if (csio_mb_issue(hw, mbp)) {
   1459		csio_err(hw, "Issue of FW_CAPS_CONFIG_CMD(r) failed!\n");
   1460		goto out;
   1461	}
   1462
   1463	retval = csio_mb_fw_retval(mbp);
   1464	if (retval != FW_SUCCESS) {
   1465		csio_err(hw, "FW_CAPS_CONFIG_CMD(r) returned %d!\n", retval);
   1466		goto out;
   1467	}
   1468
   1469	/* Validate device capabilities */
   1470	rv = csio_hw_validate_caps(hw, mbp);
   1471	if (rv != 0)
   1472		goto out;
   1473
   1474	/* Don't config device capabilities if already configured */
   1475	if (hw->fw_state == CSIO_DEV_STATE_INIT) {
   1476		rv = 0;
   1477		goto out;
   1478	}
   1479
   1480	/* Write back desired device capabilities */
   1481	csio_mb_caps_config(hw, mbp, CSIO_MB_DEFAULT_TMO, true, true,
   1482			    false, true, NULL);
   1483
   1484	if (csio_mb_issue(hw, mbp)) {
   1485		csio_err(hw, "Issue of FW_CAPS_CONFIG_CMD(w) failed!\n");
   1486		goto out;
   1487	}
   1488
   1489	retval = csio_mb_fw_retval(mbp);
   1490	if (retval != FW_SUCCESS) {
   1491		csio_err(hw, "FW_CAPS_CONFIG_CMD(w) returned %d!\n", retval);
   1492		goto out;
   1493	}
   1494
   1495	rv = 0;
   1496out:
   1497	mempool_free(mbp, hw->mb_mempool);
   1498	return rv;
   1499}
   1500
   1501static inline enum cc_fec fwcap_to_cc_fec(fw_port_cap32_t fw_fec)
   1502{
   1503	enum cc_fec cc_fec = 0;
   1504
   1505	if (fw_fec & FW_PORT_CAP32_FEC_RS)
   1506		cc_fec |= FEC_RS;
   1507	if (fw_fec & FW_PORT_CAP32_FEC_BASER_RS)
   1508		cc_fec |= FEC_BASER_RS;
   1509
   1510	return cc_fec;
   1511}
   1512
   1513static inline fw_port_cap32_t cc_to_fwcap_pause(enum cc_pause cc_pause)
   1514{
   1515	fw_port_cap32_t fw_pause = 0;
   1516
   1517	if (cc_pause & PAUSE_RX)
   1518		fw_pause |= FW_PORT_CAP32_FC_RX;
   1519	if (cc_pause & PAUSE_TX)
   1520		fw_pause |= FW_PORT_CAP32_FC_TX;
   1521
   1522	return fw_pause;
   1523}
   1524
   1525static inline fw_port_cap32_t cc_to_fwcap_fec(enum cc_fec cc_fec)
   1526{
   1527	fw_port_cap32_t fw_fec = 0;
   1528
   1529	if (cc_fec & FEC_RS)
   1530		fw_fec |= FW_PORT_CAP32_FEC_RS;
   1531	if (cc_fec & FEC_BASER_RS)
   1532		fw_fec |= FW_PORT_CAP32_FEC_BASER_RS;
   1533
   1534	return fw_fec;
   1535}
   1536
   1537/**
   1538 * fwcap_to_fwspeed - return highest speed in Port Capabilities
   1539 * @acaps: advertised Port Capabilities
   1540 *
   1541 * Get the highest speed for the port from the advertised Port
   1542 * Capabilities.
   1543 */
   1544fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps)
   1545{
   1546	#define TEST_SPEED_RETURN(__caps_speed) \
   1547		do { \
   1548			if (acaps & FW_PORT_CAP32_SPEED_##__caps_speed) \
   1549				return FW_PORT_CAP32_SPEED_##__caps_speed; \
   1550		} while (0)
   1551
   1552	TEST_SPEED_RETURN(400G);
   1553	TEST_SPEED_RETURN(200G);
   1554	TEST_SPEED_RETURN(100G);
   1555	TEST_SPEED_RETURN(50G);
   1556	TEST_SPEED_RETURN(40G);
   1557	TEST_SPEED_RETURN(25G);
   1558	TEST_SPEED_RETURN(10G);
   1559	TEST_SPEED_RETURN(1G);
   1560	TEST_SPEED_RETURN(100M);
   1561
   1562	#undef TEST_SPEED_RETURN
   1563
   1564	return 0;
   1565}
   1566
   1567/**
   1568 *      fwcaps16_to_caps32 - convert 16-bit Port Capabilities to 32-bits
   1569 *      @caps16: a 16-bit Port Capabilities value
   1570 *
   1571 *      Returns the equivalent 32-bit Port Capabilities value.
   1572 */
   1573fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16)
   1574{
   1575	fw_port_cap32_t caps32 = 0;
   1576
   1577	#define CAP16_TO_CAP32(__cap) \
   1578		do { \
   1579			if (caps16 & FW_PORT_CAP_##__cap) \
   1580				caps32 |= FW_PORT_CAP32_##__cap; \
   1581		} while (0)
   1582
   1583	CAP16_TO_CAP32(SPEED_100M);
   1584	CAP16_TO_CAP32(SPEED_1G);
   1585	CAP16_TO_CAP32(SPEED_25G);
   1586	CAP16_TO_CAP32(SPEED_10G);
   1587	CAP16_TO_CAP32(SPEED_40G);
   1588	CAP16_TO_CAP32(SPEED_100G);
   1589	CAP16_TO_CAP32(FC_RX);
   1590	CAP16_TO_CAP32(FC_TX);
   1591	CAP16_TO_CAP32(ANEG);
   1592	CAP16_TO_CAP32(MDIAUTO);
   1593	CAP16_TO_CAP32(MDISTRAIGHT);
   1594	CAP16_TO_CAP32(FEC_RS);
   1595	CAP16_TO_CAP32(FEC_BASER_RS);
   1596	CAP16_TO_CAP32(802_3_PAUSE);
   1597	CAP16_TO_CAP32(802_3_ASM_DIR);
   1598
   1599	#undef CAP16_TO_CAP32
   1600
   1601	return caps32;
   1602}
   1603
   1604/**
   1605 *	fwcaps32_to_caps16 - convert 32-bit Port Capabilities to 16-bits
   1606 *	@caps32: a 32-bit Port Capabilities value
   1607 *
   1608 *	Returns the equivalent 16-bit Port Capabilities value.  Note that
   1609 *	not all 32-bit Port Capabilities can be represented in the 16-bit
   1610 *	Port Capabilities and some fields/values may not make it.
   1611 */
   1612fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32)
   1613{
   1614	fw_port_cap16_t caps16 = 0;
   1615
   1616	#define CAP32_TO_CAP16(__cap) \
   1617		do { \
   1618			if (caps32 & FW_PORT_CAP32_##__cap) \
   1619				caps16 |= FW_PORT_CAP_##__cap; \
   1620		} while (0)
   1621
   1622	CAP32_TO_CAP16(SPEED_100M);
   1623	CAP32_TO_CAP16(SPEED_1G);
   1624	CAP32_TO_CAP16(SPEED_10G);
   1625	CAP32_TO_CAP16(SPEED_25G);
   1626	CAP32_TO_CAP16(SPEED_40G);
   1627	CAP32_TO_CAP16(SPEED_100G);
   1628	CAP32_TO_CAP16(FC_RX);
   1629	CAP32_TO_CAP16(FC_TX);
   1630	CAP32_TO_CAP16(802_3_PAUSE);
   1631	CAP32_TO_CAP16(802_3_ASM_DIR);
   1632	CAP32_TO_CAP16(ANEG);
   1633	CAP32_TO_CAP16(FORCE_PAUSE);
   1634	CAP32_TO_CAP16(MDIAUTO);
   1635	CAP32_TO_CAP16(MDISTRAIGHT);
   1636	CAP32_TO_CAP16(FEC_RS);
   1637	CAP32_TO_CAP16(FEC_BASER_RS);
   1638
   1639	#undef CAP32_TO_CAP16
   1640
   1641	return caps16;
   1642}
   1643
   1644/**
   1645 *      lstatus_to_fwcap - translate old lstatus to 32-bit Port Capabilities
   1646 *      @lstatus: old FW_PORT_ACTION_GET_PORT_INFO lstatus value
   1647 *
   1648 *      Translates old FW_PORT_ACTION_GET_PORT_INFO lstatus field into new
   1649 *      32-bit Port Capabilities value.
   1650 */
   1651fw_port_cap32_t lstatus_to_fwcap(u32 lstatus)
   1652{
   1653	fw_port_cap32_t linkattr = 0;
   1654
   1655	/* The format of the Link Status in the old
   1656	 * 16-bit Port Information message isn't the same as the
   1657	 * 16-bit Port Capabilities bitfield used everywhere else.
   1658	 */
   1659	if (lstatus & FW_PORT_CMD_RXPAUSE_F)
   1660		linkattr |= FW_PORT_CAP32_FC_RX;
   1661	if (lstatus & FW_PORT_CMD_TXPAUSE_F)
   1662		linkattr |= FW_PORT_CAP32_FC_TX;
   1663	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100M))
   1664		linkattr |= FW_PORT_CAP32_SPEED_100M;
   1665	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_1G))
   1666		linkattr |= FW_PORT_CAP32_SPEED_1G;
   1667	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G))
   1668		linkattr |= FW_PORT_CAP32_SPEED_10G;
   1669	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_25G))
   1670		linkattr |= FW_PORT_CAP32_SPEED_25G;
   1671	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G))
   1672		linkattr |= FW_PORT_CAP32_SPEED_40G;
   1673	if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100G))
   1674		linkattr |= FW_PORT_CAP32_SPEED_100G;
   1675
   1676	return linkattr;
   1677}
   1678
   1679/**
   1680 *      csio_init_link_config - initialize a link's SW state
   1681 *      @lc: pointer to structure holding the link state
   1682 *      @pcaps: link Port Capabilities
   1683 *      @acaps: link current Advertised Port Capabilities
   1684 *
   1685 *      Initializes the SW state maintained for each link, including the link's
   1686 *      capabilities and default speed/flow-control/autonegotiation settings.
   1687 */
   1688static void csio_init_link_config(struct link_config *lc, fw_port_cap32_t pcaps,
   1689				  fw_port_cap32_t acaps)
   1690{
   1691	lc->pcaps = pcaps;
   1692	lc->def_acaps = acaps;
   1693	lc->lpacaps = 0;
   1694	lc->speed_caps = 0;
   1695	lc->speed = 0;
   1696	lc->requested_fc = PAUSE_RX | PAUSE_TX;
   1697	lc->fc = lc->requested_fc;
   1698
   1699	/*
   1700	 * For Forward Error Control, we default to whatever the Firmware
   1701	 * tells us the Link is currently advertising.
   1702	 */
   1703	lc->requested_fec = FEC_AUTO;
   1704	lc->fec = fwcap_to_cc_fec(lc->def_acaps);
   1705
   1706	/* If the Port is capable of Auto-Negtotiation, initialize it as
   1707	 * "enabled" and copy over all of the Physical Port Capabilities
   1708	 * to the Advertised Port Capabilities.  Otherwise mark it as
   1709	 * Auto-Negotiate disabled and select the highest supported speed
   1710	 * for the link.  Note parallel structure in t4_link_l1cfg_core()
   1711	 * and t4_handle_get_port_info().
   1712	 */
   1713	if (lc->pcaps & FW_PORT_CAP32_ANEG) {
   1714		lc->acaps = lc->pcaps & ADVERT_MASK;
   1715		lc->autoneg = AUTONEG_ENABLE;
   1716		lc->requested_fc |= PAUSE_AUTONEG;
   1717	} else {
   1718		lc->acaps = 0;
   1719		lc->autoneg = AUTONEG_DISABLE;
   1720	}
   1721}
   1722
   1723static void csio_link_l1cfg(struct link_config *lc, uint16_t fw_caps,
   1724			    uint32_t *rcaps)
   1725{
   1726	unsigned int fw_mdi = FW_PORT_CAP32_MDI_V(FW_PORT_CAP32_MDI_AUTO);
   1727	fw_port_cap32_t fw_fc, cc_fec, fw_fec, lrcap;
   1728
   1729	lc->link_ok = 0;
   1730
   1731	/*
   1732	 * Convert driver coding of Pause Frame Flow Control settings into the
   1733	 * Firmware's API.
   1734	 */
   1735	fw_fc = cc_to_fwcap_pause(lc->requested_fc);
   1736
   1737	/*
   1738	 * Convert Common Code Forward Error Control settings into the
   1739	 * Firmware's API.  If the current Requested FEC has "Automatic"
   1740	 * (IEEE 802.3) specified, then we use whatever the Firmware
   1741	 * sent us as part of it's IEEE 802.3-based interpretation of
   1742	 * the Transceiver Module EPROM FEC parameters.  Otherwise we
   1743	 * use whatever is in the current Requested FEC settings.
   1744	 */
   1745	if (lc->requested_fec & FEC_AUTO)
   1746		cc_fec = fwcap_to_cc_fec(lc->def_acaps);
   1747	else
   1748		cc_fec = lc->requested_fec;
   1749	fw_fec = cc_to_fwcap_fec(cc_fec);
   1750
   1751	/* Figure out what our Requested Port Capabilities are going to be.
   1752	 * Note parallel structure in t4_handle_get_port_info() and
   1753	 * init_link_config().
   1754	 */
   1755	if (!(lc->pcaps & FW_PORT_CAP32_ANEG)) {
   1756		lrcap = (lc->pcaps & ADVERT_MASK) | fw_fc | fw_fec;
   1757		lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
   1758		lc->fec = cc_fec;
   1759	} else if (lc->autoneg == AUTONEG_DISABLE) {
   1760		lrcap = lc->speed_caps | fw_fc | fw_fec | fw_mdi;
   1761		lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
   1762		lc->fec = cc_fec;
   1763	} else {
   1764		lrcap = lc->acaps | fw_fc | fw_fec | fw_mdi;
   1765	}
   1766
   1767	*rcaps = lrcap;
   1768}
   1769
   1770/*
   1771 * csio_enable_ports - Bring up all available ports.
   1772 * @hw: HW module.
   1773 *
   1774 */
   1775static int
   1776csio_enable_ports(struct csio_hw *hw)
   1777{
   1778	struct csio_mb  *mbp;
   1779	u16 fw_caps = FW_CAPS_UNKNOWN;
   1780	enum fw_retval retval;
   1781	uint8_t portid;
   1782	fw_port_cap32_t pcaps, acaps, rcaps;
   1783	int i;
   1784
   1785	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1786	if (!mbp) {
   1787		CSIO_INC_STATS(hw, n_err_nomem);
   1788		return -ENOMEM;
   1789	}
   1790
   1791	for (i = 0; i < hw->num_pports; i++) {
   1792		portid = hw->pport[i].portid;
   1793
   1794		if (fw_caps == FW_CAPS_UNKNOWN) {
   1795			u32 param, val;
   1796
   1797			param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) |
   1798			 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_PORT_CAPS32));
   1799			val = 1;
   1800
   1801			csio_mb_params(hw, mbp, CSIO_MB_DEFAULT_TMO,
   1802				       hw->pfn, 0, 1, &param, &val, true,
   1803				       NULL);
   1804
   1805			if (csio_mb_issue(hw, mbp)) {
   1806				csio_err(hw, "failed to issue FW_PARAMS_CMD(r) port:%d\n",
   1807					 portid);
   1808				mempool_free(mbp, hw->mb_mempool);
   1809				return -EINVAL;
   1810			}
   1811
   1812			csio_mb_process_read_params_rsp(hw, mbp, &retval,
   1813							0, NULL);
   1814			fw_caps = retval ? FW_CAPS16 : FW_CAPS32;
   1815		}
   1816
   1817		/* Read PORT information */
   1818		csio_mb_port(hw, mbp, CSIO_MB_DEFAULT_TMO, portid,
   1819			     false, 0, fw_caps, NULL);
   1820
   1821		if (csio_mb_issue(hw, mbp)) {
   1822			csio_err(hw, "failed to issue FW_PORT_CMD(r) port:%d\n",
   1823				 portid);
   1824			mempool_free(mbp, hw->mb_mempool);
   1825			return -EINVAL;
   1826		}
   1827
   1828		csio_mb_process_read_port_rsp(hw, mbp, &retval, fw_caps,
   1829					      &pcaps, &acaps);
   1830		if (retval != FW_SUCCESS) {
   1831			csio_err(hw, "FW_PORT_CMD(r) port:%d failed: 0x%x\n",
   1832				 portid, retval);
   1833			mempool_free(mbp, hw->mb_mempool);
   1834			return -EINVAL;
   1835		}
   1836
   1837		csio_init_link_config(&hw->pport[i].link_cfg, pcaps, acaps);
   1838
   1839		csio_link_l1cfg(&hw->pport[i].link_cfg, fw_caps, &rcaps);
   1840
   1841		/* Write back PORT information */
   1842		csio_mb_port(hw, mbp, CSIO_MB_DEFAULT_TMO, portid,
   1843			     true, rcaps, fw_caps, NULL);
   1844
   1845		if (csio_mb_issue(hw, mbp)) {
   1846			csio_err(hw, "failed to issue FW_PORT_CMD(w) port:%d\n",
   1847				 portid);
   1848			mempool_free(mbp, hw->mb_mempool);
   1849			return -EINVAL;
   1850		}
   1851
   1852		retval = csio_mb_fw_retval(mbp);
   1853		if (retval != FW_SUCCESS) {
   1854			csio_err(hw, "FW_PORT_CMD(w) port:%d failed :0x%x\n",
   1855				 portid, retval);
   1856			mempool_free(mbp, hw->mb_mempool);
   1857			return -EINVAL;
   1858		}
   1859
   1860	} /* For all ports */
   1861
   1862	mempool_free(mbp, hw->mb_mempool);
   1863
   1864	return 0;
   1865}
   1866
   1867/*
   1868 * csio_get_fcoe_resinfo - Read fcoe fw resource info.
   1869 * @hw: HW module
   1870 * Issued with lock held.
   1871 */
   1872static int
   1873csio_get_fcoe_resinfo(struct csio_hw *hw)
   1874{
   1875	struct csio_fcoe_res_info *res_info = &hw->fres_info;
   1876	struct fw_fcoe_res_info_cmd *rsp;
   1877	struct csio_mb  *mbp;
   1878	enum fw_retval retval;
   1879
   1880	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1881	if (!mbp) {
   1882		CSIO_INC_STATS(hw, n_err_nomem);
   1883		return -ENOMEM;
   1884	}
   1885
   1886	/* Get FCoE FW resource information */
   1887	csio_fcoe_read_res_info_init_mb(hw, mbp, CSIO_MB_DEFAULT_TMO, NULL);
   1888
   1889	if (csio_mb_issue(hw, mbp)) {
   1890		csio_err(hw, "failed to issue FW_FCOE_RES_INFO_CMD\n");
   1891		mempool_free(mbp, hw->mb_mempool);
   1892		return -EINVAL;
   1893	}
   1894
   1895	rsp = (struct fw_fcoe_res_info_cmd *)(mbp->mb);
   1896	retval = FW_CMD_RETVAL_G(ntohl(rsp->retval_len16));
   1897	if (retval != FW_SUCCESS) {
   1898		csio_err(hw, "FW_FCOE_RES_INFO_CMD failed with ret x%x\n",
   1899			 retval);
   1900		mempool_free(mbp, hw->mb_mempool);
   1901		return -EINVAL;
   1902	}
   1903
   1904	res_info->e_d_tov = ntohs(rsp->e_d_tov);
   1905	res_info->r_a_tov_seq = ntohs(rsp->r_a_tov_seq);
   1906	res_info->r_a_tov_els = ntohs(rsp->r_a_tov_els);
   1907	res_info->r_r_tov = ntohs(rsp->r_r_tov);
   1908	res_info->max_xchgs = ntohl(rsp->max_xchgs);
   1909	res_info->max_ssns = ntohl(rsp->max_ssns);
   1910	res_info->used_xchgs = ntohl(rsp->used_xchgs);
   1911	res_info->used_ssns = ntohl(rsp->used_ssns);
   1912	res_info->max_fcfs = ntohl(rsp->max_fcfs);
   1913	res_info->max_vnps = ntohl(rsp->max_vnps);
   1914	res_info->used_fcfs = ntohl(rsp->used_fcfs);
   1915	res_info->used_vnps = ntohl(rsp->used_vnps);
   1916
   1917	csio_dbg(hw, "max ssns:%d max xchgs:%d\n", res_info->max_ssns,
   1918						  res_info->max_xchgs);
   1919	mempool_free(mbp, hw->mb_mempool);
   1920
   1921	return 0;
   1922}
   1923
   1924static int
   1925csio_hw_check_fwconfig(struct csio_hw *hw, u32 *param)
   1926{
   1927	struct csio_mb	*mbp;
   1928	enum fw_retval retval;
   1929	u32 _param[1];
   1930
   1931	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   1932	if (!mbp) {
   1933		CSIO_INC_STATS(hw, n_err_nomem);
   1934		return -ENOMEM;
   1935	}
   1936
   1937	/*
   1938	 * Find out whether we're dealing with a version of
   1939	 * the firmware which has configuration file support.
   1940	 */
   1941	_param[0] = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
   1942		     FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_CF));
   1943
   1944	csio_mb_params(hw, mbp, CSIO_MB_DEFAULT_TMO, hw->pfn, 0,
   1945		       ARRAY_SIZE(_param), _param, NULL, false, NULL);
   1946	if (csio_mb_issue(hw, mbp)) {
   1947		csio_err(hw, "Issue of FW_PARAMS_CMD(read) failed!\n");
   1948		mempool_free(mbp, hw->mb_mempool);
   1949		return -EINVAL;
   1950	}
   1951
   1952	csio_mb_process_read_params_rsp(hw, mbp, &retval,
   1953			ARRAY_SIZE(_param), _param);
   1954	if (retval != FW_SUCCESS) {
   1955		csio_err(hw, "FW_PARAMS_CMD(read) failed with ret:0x%x!\n",
   1956				retval);
   1957		mempool_free(mbp, hw->mb_mempool);
   1958		return -EINVAL;
   1959	}
   1960
   1961	mempool_free(mbp, hw->mb_mempool);
   1962	*param = _param[0];
   1963
   1964	return 0;
   1965}
   1966
   1967static int
   1968csio_hw_flash_config(struct csio_hw *hw, u32 *fw_cfg_param, char *path)
   1969{
   1970	int ret = 0;
   1971	const struct firmware *cf;
   1972	struct pci_dev *pci_dev = hw->pdev;
   1973	struct device *dev = &pci_dev->dev;
   1974	unsigned int mtype = 0, maddr = 0;
   1975	uint32_t *cfg_data;
   1976	int value_to_add = 0;
   1977	const char *fw_cfg_file;
   1978
   1979	if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK))
   1980		fw_cfg_file = FW_CFG_NAME_T5;
   1981	else
   1982		fw_cfg_file = FW_CFG_NAME_T6;
   1983
   1984	if (request_firmware(&cf, fw_cfg_file, dev) < 0) {
   1985		csio_err(hw, "could not find config file %s, err: %d\n",
   1986			 fw_cfg_file, ret);
   1987		return -ENOENT;
   1988	}
   1989
   1990	if (cf->size%4 != 0)
   1991		value_to_add = 4 - (cf->size % 4);
   1992
   1993	cfg_data = kzalloc(cf->size+value_to_add, GFP_KERNEL);
   1994	if (cfg_data == NULL) {
   1995		ret = -ENOMEM;
   1996		goto leave;
   1997	}
   1998
   1999	memcpy((void *)cfg_data, (const void *)cf->data, cf->size);
   2000	if (csio_hw_check_fwconfig(hw, fw_cfg_param) != 0) {
   2001		ret = -EINVAL;
   2002		goto leave;
   2003	}
   2004
   2005	mtype = FW_PARAMS_PARAM_Y_G(*fw_cfg_param);
   2006	maddr = FW_PARAMS_PARAM_Z_G(*fw_cfg_param) << 16;
   2007
   2008	ret = csio_memory_write(hw, mtype, maddr,
   2009				cf->size + value_to_add, cfg_data);
   2010
   2011	if ((ret == 0) && (value_to_add != 0)) {
   2012		union {
   2013			u32 word;
   2014			char buf[4];
   2015		} last;
   2016		size_t size = cf->size & ~0x3;
   2017		int i;
   2018
   2019		last.word = cfg_data[size >> 2];
   2020		for (i = value_to_add; i < 4; i++)
   2021			last.buf[i] = 0;
   2022		ret = csio_memory_write(hw, mtype, maddr + size, 4, &last.word);
   2023	}
   2024	if (ret == 0) {
   2025		csio_info(hw, "config file upgraded to %s\n", fw_cfg_file);
   2026		snprintf(path, 64, "%s%s", "/lib/firmware/", fw_cfg_file);
   2027	}
   2028
   2029leave:
   2030	kfree(cfg_data);
   2031	release_firmware(cf);
   2032	return ret;
   2033}
   2034
   2035/*
   2036 * HW initialization: contact FW, obtain config, perform basic init.
   2037 *
   2038 * If the firmware we're dealing with has Configuration File support, then
   2039 * we use that to perform all configuration -- either using the configuration
   2040 * file stored in flash on the adapter or using a filesystem-local file
   2041 * if available.
   2042 *
   2043 * If we don't have configuration file support in the firmware, then we'll
   2044 * have to set things up the old fashioned way with hard-coded register
   2045 * writes and firmware commands ...
   2046 */
   2047
   2048/*
   2049 * Attempt to initialize the HW via a Firmware Configuration File.
   2050 */
   2051static int
   2052csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param)
   2053{
   2054	struct csio_mb	*mbp = NULL;
   2055	struct fw_caps_config_cmd *caps_cmd;
   2056	unsigned int mtype, maddr;
   2057	int rv = -EINVAL;
   2058	uint32_t finiver = 0, finicsum = 0, cfcsum = 0;
   2059	char path[64];
   2060	char *config_name = NULL;
   2061
   2062	/*
   2063	 * Reset device if necessary
   2064	 */
   2065	if (reset) {
   2066		rv = csio_do_reset(hw, true);
   2067		if (rv != 0)
   2068			goto bye;
   2069	}
   2070
   2071	/*
   2072	 * If we have a configuration file in host ,
   2073	 * then use that.  Otherwise, use the configuration file stored
   2074	 * in the HW flash ...
   2075	 */
   2076	spin_unlock_irq(&hw->lock);
   2077	rv = csio_hw_flash_config(hw, fw_cfg_param, path);
   2078	spin_lock_irq(&hw->lock);
   2079	if (rv != 0) {
   2080		/*
   2081		 * config file was not found. Use default
   2082		 * config file from flash.
   2083		 */
   2084		config_name = "On FLASH";
   2085		mtype = FW_MEMTYPE_CF_FLASH;
   2086		maddr = hw->chip_ops->chip_flash_cfg_addr(hw);
   2087	} else {
   2088		config_name = path;
   2089		mtype = FW_PARAMS_PARAM_Y_G(*fw_cfg_param);
   2090		maddr = FW_PARAMS_PARAM_Z_G(*fw_cfg_param) << 16;
   2091	}
   2092
   2093	mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   2094	if (!mbp) {
   2095		CSIO_INC_STATS(hw, n_err_nomem);
   2096		return -ENOMEM;
   2097	}
   2098	/*
   2099	 * Tell the firmware to process the indicated Configuration File.
   2100	 * If there are no errors and the caller has provided return value
   2101	 * pointers for the [fini] section version, checksum and computed
   2102	 * checksum, pass those back to the caller.
   2103	 */
   2104	caps_cmd = (struct fw_caps_config_cmd *)(mbp->mb);
   2105	CSIO_INIT_MBP(mbp, caps_cmd, CSIO_MB_DEFAULT_TMO, hw, NULL, 1);
   2106	caps_cmd->op_to_write =
   2107		htonl(FW_CMD_OP_V(FW_CAPS_CONFIG_CMD) |
   2108		      FW_CMD_REQUEST_F |
   2109		      FW_CMD_READ_F);
   2110	caps_cmd->cfvalid_to_len16 =
   2111		htonl(FW_CAPS_CONFIG_CMD_CFVALID_F |
   2112		      FW_CAPS_CONFIG_CMD_MEMTYPE_CF_V(mtype) |
   2113		      FW_CAPS_CONFIG_CMD_MEMADDR64K_CF_V(maddr >> 16) |
   2114		      FW_LEN16(*caps_cmd));
   2115
   2116	if (csio_mb_issue(hw, mbp)) {
   2117		rv = -EINVAL;
   2118		goto bye;
   2119	}
   2120
   2121	rv = csio_mb_fw_retval(mbp);
   2122	 /* If the CAPS_CONFIG failed with an ENOENT (for a Firmware
   2123	  * Configuration File in FLASH), our last gasp effort is to use the
   2124	  * Firmware Configuration File which is embedded in the
   2125	  * firmware.  A very few early versions of the firmware didn't
   2126	  * have one embedded but we can ignore those.
   2127	  */
   2128	if (rv == ENOENT) {
   2129		CSIO_INIT_MBP(mbp, caps_cmd, CSIO_MB_DEFAULT_TMO, hw, NULL, 1);
   2130		caps_cmd->op_to_write = htonl(FW_CMD_OP_V(FW_CAPS_CONFIG_CMD) |
   2131					      FW_CMD_REQUEST_F |
   2132					      FW_CMD_READ_F);
   2133		caps_cmd->cfvalid_to_len16 = htonl(FW_LEN16(*caps_cmd));
   2134
   2135		if (csio_mb_issue(hw, mbp)) {
   2136			rv = -EINVAL;
   2137			goto bye;
   2138		}
   2139
   2140		rv = csio_mb_fw_retval(mbp);
   2141		config_name = "Firmware Default";
   2142	}
   2143	if (rv != FW_SUCCESS)
   2144		goto bye;
   2145
   2146	finiver = ntohl(caps_cmd->finiver);
   2147	finicsum = ntohl(caps_cmd->finicsum);
   2148	cfcsum = ntohl(caps_cmd->cfcsum);
   2149
   2150	/*
   2151	 * And now tell the firmware to use the configuration we just loaded.
   2152	 */
   2153	caps_cmd->op_to_write =
   2154		htonl(FW_CMD_OP_V(FW_CAPS_CONFIG_CMD) |
   2155		      FW_CMD_REQUEST_F |
   2156		      FW_CMD_WRITE_F);
   2157	caps_cmd->cfvalid_to_len16 = htonl(FW_LEN16(*caps_cmd));
   2158
   2159	if (csio_mb_issue(hw, mbp)) {
   2160		rv = -EINVAL;
   2161		goto bye;
   2162	}
   2163
   2164	rv = csio_mb_fw_retval(mbp);
   2165	if (rv != FW_SUCCESS) {
   2166		csio_dbg(hw, "FW_CAPS_CONFIG_CMD returned %d!\n", rv);
   2167		goto bye;
   2168	}
   2169
   2170	if (finicsum != cfcsum) {
   2171		csio_warn(hw,
   2172		      "Config File checksum mismatch: csum=%#x, computed=%#x\n",
   2173		      finicsum, cfcsum);
   2174	}
   2175
   2176	/* Validate device capabilities */
   2177	rv = csio_hw_validate_caps(hw, mbp);
   2178	if (rv != 0)
   2179		goto bye;
   2180
   2181	mempool_free(mbp, hw->mb_mempool);
   2182	mbp = NULL;
   2183
   2184	/*
   2185	 * Note that we're operating with parameters
   2186	 * not supplied by the driver, rather than from hard-wired
   2187	 * initialization constants buried in the driver.
   2188	 */
   2189	hw->flags |= CSIO_HWF_USING_SOFT_PARAMS;
   2190
   2191	/* device parameters */
   2192	rv = csio_get_device_params(hw);
   2193	if (rv != 0)
   2194		goto bye;
   2195
   2196	/* Configure SGE */
   2197	csio_wr_sge_init(hw);
   2198
   2199	/*
   2200	 * And finally tell the firmware to initialize itself using the
   2201	 * parameters from the Configuration File.
   2202	 */
   2203	/* Post event to notify completion of configuration */
   2204	csio_post_event(&hw->sm, CSIO_HWE_INIT);
   2205
   2206	csio_info(hw, "Successfully configure using Firmware "
   2207		  "Configuration File %s, version %#x, computed checksum %#x\n",
   2208		  config_name, finiver, cfcsum);
   2209	return 0;
   2210
   2211	/*
   2212	 * Something bad happened.  Return the error ...
   2213	 */
   2214bye:
   2215	if (mbp)
   2216		mempool_free(mbp, hw->mb_mempool);
   2217	hw->flags &= ~CSIO_HWF_USING_SOFT_PARAMS;
   2218	csio_warn(hw, "Configuration file error %d\n", rv);
   2219	return rv;
   2220}
   2221
   2222/* Is the given firmware API compatible with the one the driver was compiled
   2223 * with?
   2224 */
   2225static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
   2226{
   2227
   2228	/* short circuit if it's the exact same firmware version */
   2229	if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
   2230		return 1;
   2231
   2232#define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
   2233	if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
   2234	    SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe))
   2235		return 1;
   2236#undef SAME_INTF
   2237
   2238	return 0;
   2239}
   2240
   2241/* The firmware in the filesystem is usable, but should it be installed?
   2242 * This routine explains itself in detail if it indicates the filesystem
   2243 * firmware should be installed.
   2244 */
   2245static int csio_should_install_fs_fw(struct csio_hw *hw, int card_fw_usable,
   2246				int k, int c)
   2247{
   2248	const char *reason;
   2249
   2250	if (!card_fw_usable) {
   2251		reason = "incompatible or unusable";
   2252		goto install;
   2253	}
   2254
   2255	if (k > c) {
   2256		reason = "older than the version supported with this driver";
   2257		goto install;
   2258	}
   2259
   2260	return 0;
   2261
   2262install:
   2263	csio_err(hw, "firmware on card (%u.%u.%u.%u) is %s, "
   2264		"installing firmware %u.%u.%u.%u on card.\n",
   2265		FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
   2266		FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), reason,
   2267		FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
   2268		FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
   2269
   2270	return 1;
   2271}
   2272
   2273static struct fw_info fw_info_array[] = {
   2274	{
   2275		.chip = CHELSIO_T5,
   2276		.fs_name = FW_CFG_NAME_T5,
   2277		.fw_mod_name = FW_FNAME_T5,
   2278		.fw_hdr = {
   2279			.chip = FW_HDR_CHIP_T5,
   2280			.fw_ver = __cpu_to_be32(FW_VERSION(T5)),
   2281			.intfver_nic = FW_INTFVER(T5, NIC),
   2282			.intfver_vnic = FW_INTFVER(T5, VNIC),
   2283			.intfver_ri = FW_INTFVER(T5, RI),
   2284			.intfver_iscsi = FW_INTFVER(T5, ISCSI),
   2285			.intfver_fcoe = FW_INTFVER(T5, FCOE),
   2286		},
   2287	}, {
   2288		.chip = CHELSIO_T6,
   2289		.fs_name = FW_CFG_NAME_T6,
   2290		.fw_mod_name = FW_FNAME_T6,
   2291		.fw_hdr = {
   2292			.chip = FW_HDR_CHIP_T6,
   2293			.fw_ver = __cpu_to_be32(FW_VERSION(T6)),
   2294			.intfver_nic = FW_INTFVER(T6, NIC),
   2295			.intfver_vnic = FW_INTFVER(T6, VNIC),
   2296			.intfver_ri = FW_INTFVER(T6, RI),
   2297			.intfver_iscsi = FW_INTFVER(T6, ISCSI),
   2298			.intfver_fcoe = FW_INTFVER(T6, FCOE),
   2299		},
   2300	}
   2301};
   2302
   2303static struct fw_info *find_fw_info(int chip)
   2304{
   2305	int i;
   2306
   2307	for (i = 0; i < ARRAY_SIZE(fw_info_array); i++) {
   2308		if (fw_info_array[i].chip == chip)
   2309			return &fw_info_array[i];
   2310	}
   2311	return NULL;
   2312}
   2313
   2314static int csio_hw_prep_fw(struct csio_hw *hw, struct fw_info *fw_info,
   2315	       const u8 *fw_data, unsigned int fw_size,
   2316	       struct fw_hdr *card_fw, enum csio_dev_state state,
   2317	       int *reset)
   2318{
   2319	int ret, card_fw_usable, fs_fw_usable;
   2320	const struct fw_hdr *fs_fw;
   2321	const struct fw_hdr *drv_fw;
   2322
   2323	drv_fw = &fw_info->fw_hdr;
   2324
   2325	/* Read the header of the firmware on the card */
   2326	ret = csio_hw_read_flash(hw, FLASH_FW_START,
   2327			    sizeof(*card_fw) / sizeof(uint32_t),
   2328			    (uint32_t *)card_fw, 1);
   2329	if (ret == 0) {
   2330		card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw);
   2331	} else {
   2332		csio_err(hw,
   2333			"Unable to read card's firmware header: %d\n", ret);
   2334		card_fw_usable = 0;
   2335	}
   2336
   2337	if (fw_data != NULL) {
   2338		fs_fw = (const void *)fw_data;
   2339		fs_fw_usable = fw_compatible(drv_fw, fs_fw);
   2340	} else {
   2341		fs_fw = NULL;
   2342		fs_fw_usable = 0;
   2343	}
   2344
   2345	if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
   2346	    (!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) {
   2347		/* Common case: the firmware on the card is an exact match and
   2348		 * the filesystem one is an exact match too, or the filesystem
   2349		 * one is absent/incompatible.
   2350		 */
   2351	} else if (fs_fw_usable && state == CSIO_DEV_STATE_UNINIT &&
   2352		   csio_should_install_fs_fw(hw, card_fw_usable,
   2353					be32_to_cpu(fs_fw->fw_ver),
   2354					be32_to_cpu(card_fw->fw_ver))) {
   2355		ret = csio_hw_fw_upgrade(hw, hw->pfn, fw_data,
   2356				     fw_size, 0);
   2357		if (ret != 0) {
   2358			csio_err(hw,
   2359				"failed to install firmware: %d\n", ret);
   2360			goto bye;
   2361		}
   2362
   2363		/* Installed successfully, update the cached header too. */
   2364		memcpy(card_fw, fs_fw, sizeof(*card_fw));
   2365		card_fw_usable = 1;
   2366		*reset = 0;	/* already reset as part of load_fw */
   2367	}
   2368
   2369	if (!card_fw_usable) {
   2370		uint32_t d, c, k;
   2371
   2372		d = be32_to_cpu(drv_fw->fw_ver);
   2373		c = be32_to_cpu(card_fw->fw_ver);
   2374		k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0;
   2375
   2376		csio_err(hw, "Cannot find a usable firmware: "
   2377			"chip state %d, "
   2378			"driver compiled with %d.%d.%d.%d, "
   2379			"card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n",
   2380			state,
   2381			FW_HDR_FW_VER_MAJOR_G(d), FW_HDR_FW_VER_MINOR_G(d),
   2382			FW_HDR_FW_VER_MICRO_G(d), FW_HDR_FW_VER_BUILD_G(d),
   2383			FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
   2384			FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c),
   2385			FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
   2386			FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
   2387		ret = -EINVAL;
   2388		goto bye;
   2389	}
   2390
   2391	/* We're using whatever's on the card and it's known to be good. */
   2392	hw->fwrev = be32_to_cpu(card_fw->fw_ver);
   2393	hw->tp_vers = be32_to_cpu(card_fw->tp_microcode_ver);
   2394
   2395bye:
   2396	return ret;
   2397}
   2398
   2399/*
   2400 * Returns -EINVAL if attempts to flash the firmware failed,
   2401 * -ENOMEM if memory allocation failed else returns 0,
   2402 * if flashing was not attempted because the card had the
   2403 * latest firmware ECANCELED is returned
   2404 */
   2405static int
   2406csio_hw_flash_fw(struct csio_hw *hw, int *reset)
   2407{
   2408	int ret = -ECANCELED;
   2409	const struct firmware *fw;
   2410	struct fw_info *fw_info;
   2411	struct fw_hdr *card_fw;
   2412	struct pci_dev *pci_dev = hw->pdev;
   2413	struct device *dev = &pci_dev->dev ;
   2414	const u8 *fw_data = NULL;
   2415	unsigned int fw_size = 0;
   2416	const char *fw_bin_file;
   2417
   2418	/* This is the firmware whose headers the driver was compiled
   2419	 * against
   2420	 */
   2421	fw_info = find_fw_info(CHELSIO_CHIP_VERSION(hw->chip_id));
   2422	if (fw_info == NULL) {
   2423		csio_err(hw,
   2424			"unable to get firmware info for chip %d.\n",
   2425			CHELSIO_CHIP_VERSION(hw->chip_id));
   2426		return -EINVAL;
   2427	}
   2428
   2429	/* allocate memory to read the header of the firmware on the
   2430	 * card
   2431	 */
   2432	card_fw = kmalloc(sizeof(*card_fw), GFP_KERNEL);
   2433	if (!card_fw)
   2434		return -ENOMEM;
   2435
   2436	if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK))
   2437		fw_bin_file = FW_FNAME_T5;
   2438	else
   2439		fw_bin_file = FW_FNAME_T6;
   2440
   2441	if (request_firmware(&fw, fw_bin_file, dev) < 0) {
   2442		csio_err(hw, "could not find firmware image %s, err: %d\n",
   2443			 fw_bin_file, ret);
   2444	} else {
   2445		fw_data = fw->data;
   2446		fw_size = fw->size;
   2447	}
   2448
   2449	/* upgrade FW logic */
   2450	ret = csio_hw_prep_fw(hw, fw_info, fw_data, fw_size, card_fw,
   2451			 hw->fw_state, reset);
   2452
   2453	/* Cleaning up */
   2454	if (fw != NULL)
   2455		release_firmware(fw);
   2456	kfree(card_fw);
   2457	return ret;
   2458}
   2459
   2460static int csio_hw_check_fwver(struct csio_hw *hw)
   2461{
   2462	if (csio_is_t6(hw->pdev->device & CSIO_HW_CHIP_MASK) &&
   2463	    (hw->fwrev < CSIO_MIN_T6_FW)) {
   2464		csio_hw_print_fw_version(hw, "T6 unsupported fw");
   2465		return -1;
   2466	}
   2467
   2468	return 0;
   2469}
   2470
   2471/*
   2472 * csio_hw_configure - Configure HW
   2473 * @hw - HW module
   2474 *
   2475 */
   2476static void
   2477csio_hw_configure(struct csio_hw *hw)
   2478{
   2479	int reset = 1;
   2480	int rv;
   2481	u32 param[1];
   2482
   2483	rv = csio_hw_dev_ready(hw);
   2484	if (rv != 0) {
   2485		CSIO_INC_STATS(hw, n_err_fatal);
   2486		csio_post_event(&hw->sm, CSIO_HWE_FATAL);
   2487		goto out;
   2488	}
   2489
   2490	/* HW version */
   2491	hw->chip_ver = (char)csio_rd_reg32(hw, PL_REV_A);
   2492
   2493	/* Needed for FW download */
   2494	rv = csio_hw_get_flash_params(hw);
   2495	if (rv != 0) {
   2496		csio_err(hw, "Failed to get serial flash params rv:%d\n", rv);
   2497		csio_post_event(&hw->sm, CSIO_HWE_FATAL);
   2498		goto out;
   2499	}
   2500
   2501	/* Set PCIe completion timeout to 4 seconds */
   2502	if (pci_is_pcie(hw->pdev))
   2503		pcie_capability_clear_and_set_word(hw->pdev, PCI_EXP_DEVCTL2,
   2504				PCI_EXP_DEVCTL2_COMP_TIMEOUT, 0xd);
   2505
   2506	hw->chip_ops->chip_set_mem_win(hw, MEMWIN_CSIOSTOR);
   2507
   2508	rv = csio_hw_get_fw_version(hw, &hw->fwrev);
   2509	if (rv != 0)
   2510		goto out;
   2511
   2512	csio_hw_print_fw_version(hw, "Firmware revision");
   2513
   2514	rv = csio_do_hello(hw, &hw->fw_state);
   2515	if (rv != 0) {
   2516		CSIO_INC_STATS(hw, n_err_fatal);
   2517		csio_post_event(&hw->sm, CSIO_HWE_FATAL);
   2518		goto out;
   2519	}
   2520
   2521	/* Read vpd */
   2522	rv = csio_hw_get_vpd_params(hw, &hw->vpd);
   2523	if (rv != 0)
   2524		goto out;
   2525
   2526	csio_hw_get_fw_version(hw, &hw->fwrev);
   2527	csio_hw_get_tp_version(hw, &hw->tp_vers);
   2528	if (csio_is_hw_master(hw) && hw->fw_state != CSIO_DEV_STATE_INIT) {
   2529
   2530			/* Do firmware update */
   2531		spin_unlock_irq(&hw->lock);
   2532		rv = csio_hw_flash_fw(hw, &reset);
   2533		spin_lock_irq(&hw->lock);
   2534
   2535		if (rv != 0)
   2536			goto out;
   2537
   2538		rv = csio_hw_check_fwver(hw);
   2539		if (rv < 0)
   2540			goto out;
   2541
   2542		/* If the firmware doesn't support Configuration Files,
   2543		 * return an error.
   2544		 */
   2545		rv = csio_hw_check_fwconfig(hw, param);
   2546		if (rv != 0) {
   2547			csio_info(hw, "Firmware doesn't support "
   2548				  "Firmware Configuration files\n");
   2549			goto out;
   2550		}
   2551
   2552		/* The firmware provides us with a memory buffer where we can
   2553		 * load a Configuration File from the host if we want to
   2554		 * override the Configuration File in flash.
   2555		 */
   2556		rv = csio_hw_use_fwconfig(hw, reset, param);
   2557		if (rv == -ENOENT) {
   2558			csio_info(hw, "Could not initialize "
   2559				  "adapter, error%d\n", rv);
   2560			goto out;
   2561		}
   2562		if (rv != 0) {
   2563			csio_info(hw, "Could not initialize "
   2564				  "adapter, error%d\n", rv);
   2565			goto out;
   2566		}
   2567
   2568	} else {
   2569		rv = csio_hw_check_fwver(hw);
   2570		if (rv < 0)
   2571			goto out;
   2572
   2573		if (hw->fw_state == CSIO_DEV_STATE_INIT) {
   2574
   2575			hw->flags |= CSIO_HWF_USING_SOFT_PARAMS;
   2576
   2577			/* device parameters */
   2578			rv = csio_get_device_params(hw);
   2579			if (rv != 0)
   2580				goto out;
   2581
   2582			/* Get device capabilities */
   2583			rv = csio_config_device_caps(hw);
   2584			if (rv != 0)
   2585				goto out;
   2586
   2587			/* Configure SGE */
   2588			csio_wr_sge_init(hw);
   2589
   2590			/* Post event to notify completion of configuration */
   2591			csio_post_event(&hw->sm, CSIO_HWE_INIT);
   2592			goto out;
   2593		}
   2594	} /* if not master */
   2595
   2596out:
   2597	return;
   2598}
   2599
   2600/*
   2601 * csio_hw_initialize - Initialize HW
   2602 * @hw - HW module
   2603 *
   2604 */
   2605static void
   2606csio_hw_initialize(struct csio_hw *hw)
   2607{
   2608	struct csio_mb	*mbp;
   2609	enum fw_retval retval;
   2610	int rv;
   2611	int i;
   2612
   2613	if (csio_is_hw_master(hw) && hw->fw_state != CSIO_DEV_STATE_INIT) {
   2614		mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC);
   2615		if (!mbp)
   2616			goto out;
   2617
   2618		csio_mb_initialize(hw, mbp, CSIO_MB_DEFAULT_TMO, NULL);
   2619
   2620		if (csio_mb_issue(hw, mbp)) {
   2621			csio_err(hw, "Issue of FW_INITIALIZE_CMD failed!\n");
   2622			goto free_and_out;
   2623		}
   2624
   2625		retval = csio_mb_fw_retval(mbp);
   2626		if (retval != FW_SUCCESS) {
   2627			csio_err(hw, "FW_INITIALIZE_CMD returned 0x%x!\n",
   2628				 retval);
   2629			goto free_and_out;
   2630		}
   2631
   2632		mempool_free(mbp, hw->mb_mempool);
   2633	}
   2634
   2635	rv = csio_get_fcoe_resinfo(hw);
   2636	if (rv != 0) {
   2637		csio_err(hw, "Failed to read fcoe resource info: %d\n", rv);
   2638		goto out;
   2639	}
   2640
   2641	spin_unlock_irq(&hw->lock);
   2642	rv = csio_config_queues(hw);
   2643	spin_lock_irq(&hw->lock);
   2644
   2645	if (rv != 0) {
   2646		csio_err(hw, "Config of queues failed!: %d\n", rv);
   2647		goto out;
   2648	}
   2649
   2650	for (i = 0; i < hw->num_pports; i++)
   2651		hw->pport[i].mod_type = FW_PORT_MOD_TYPE_NA;
   2652
   2653	if (csio_is_hw_master(hw) && hw->fw_state != CSIO_DEV_STATE_INIT) {
   2654		rv = csio_enable_ports(hw);
   2655		if (rv != 0) {
   2656			csio_err(hw, "Failed to enable ports: %d\n", rv);
   2657			goto out;
   2658		}
   2659	}
   2660
   2661	csio_post_event(&hw->sm, CSIO_HWE_INIT_DONE);
   2662	return;
   2663
   2664free_and_out:
   2665	mempool_free(mbp, hw->mb_mempool);
   2666out:
   2667	return;
   2668}
   2669
   2670#define PF_INTR_MASK (PFSW_F | PFCIM_F)
   2671
   2672/*
   2673 * csio_hw_intr_enable - Enable HW interrupts
   2674 * @hw: Pointer to HW module.
   2675 *
   2676 * Enable interrupts in HW registers.
   2677 */
   2678static void
   2679csio_hw_intr_enable(struct csio_hw *hw)
   2680{
   2681	uint16_t vec = (uint16_t)csio_get_mb_intr_idx(csio_hw_to_mbm(hw));
   2682	u32 pf = 0;
   2683	uint32_t pl = csio_rd_reg32(hw, PL_INT_ENABLE_A);
   2684
   2685	if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK))
   2686		pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A));
   2687	else
   2688		pf = T6_SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A));
   2689
   2690	/*
   2691	 * Set aivec for MSI/MSIX. PCIE_PF_CFG.INTXType is set up
   2692	 * by FW, so do nothing for INTX.
   2693	 */
   2694	if (hw->intr_mode == CSIO_IM_MSIX)
   2695		csio_set_reg_field(hw, MYPF_REG(PCIE_PF_CFG_A),
   2696				   AIVEC_V(AIVEC_M), vec);
   2697	else if (hw->intr_mode == CSIO_IM_MSI)
   2698		csio_set_reg_field(hw, MYPF_REG(PCIE_PF_CFG_A),
   2699				   AIVEC_V(AIVEC_M), 0);
   2700
   2701	csio_wr_reg32(hw, PF_INTR_MASK, MYPF_REG(PL_PF_INT_ENABLE_A));
   2702
   2703	/* Turn on MB interrupts - this will internally flush PIO as well */
   2704	csio_mb_intr_enable(hw);
   2705
   2706	/* These are common registers - only a master can modify them */
   2707	if (csio_is_hw_master(hw)) {
   2708		/*
   2709		 * Disable the Serial FLASH interrupt, if enabled!
   2710		 */
   2711		pl &= (~SF_F);
   2712		csio_wr_reg32(hw, pl, PL_INT_ENABLE_A);
   2713
   2714		csio_wr_reg32(hw, ERR_CPL_EXCEED_IQE_SIZE_F |
   2715			      EGRESS_SIZE_ERR_F | ERR_INVALID_CIDX_INC_F |
   2716			      ERR_CPL_OPCODE_0_F | ERR_DROPPED_DB_F |
   2717			      ERR_DATA_CPL_ON_HIGH_QID1_F |
   2718			      ERR_DATA_CPL_ON_HIGH_QID0_F | ERR_BAD_DB_PIDX3_F |
   2719			      ERR_BAD_DB_PIDX2_F | ERR_BAD_DB_PIDX1_F |
   2720			      ERR_BAD_DB_PIDX0_F | ERR_ING_CTXT_PRIO_F |
   2721			      ERR_EGR_CTXT_PRIO_F | INGRESS_SIZE_ERR_F,
   2722			      SGE_INT_ENABLE3_A);
   2723		csio_set_reg_field(hw, PL_INT_MAP0_A, 0, 1 << pf);
   2724	}
   2725
   2726	hw->flags |= CSIO_HWF_HW_INTR_ENABLED;
   2727
   2728}
   2729
   2730/*
   2731 * csio_hw_intr_disable - Disable HW interrupts
   2732 * @hw: Pointer to HW module.
   2733 *
   2734 * Turn off Mailbox and PCI_PF_CFG interrupts.
   2735 */
   2736void
   2737csio_hw_intr_disable(struct csio_hw *hw)
   2738{
   2739	u32 pf = 0;
   2740
   2741	if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK))
   2742		pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A));
   2743	else
   2744		pf = T6_SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A));
   2745
   2746	if (!(hw->flags & CSIO_HWF_HW_INTR_ENABLED))
   2747		return;
   2748
   2749	hw->flags &= ~CSIO_HWF_HW_INTR_ENABLED;
   2750
   2751	csio_wr_reg32(hw, 0, MYPF_REG(PL_PF_INT_ENABLE_A));
   2752	if (csio_is_hw_master(hw))
   2753		csio_set_reg_field(hw, PL_INT_MAP0_A, 1 << pf, 0);
   2754
   2755	/* Turn off MB interrupts */
   2756	csio_mb_intr_disable(hw);
   2757
   2758}
   2759
   2760void
   2761csio_hw_fatal_err(struct csio_hw *hw)
   2762{
   2763	csio_set_reg_field(hw, SGE_CONTROL_A, GLOBALENABLE_F, 0);
   2764	csio_hw_intr_disable(hw);
   2765
   2766	/* Do not reset HW, we may need FW state for debugging */
   2767	csio_fatal(hw, "HW Fatal error encountered!\n");
   2768}
   2769
   2770/*****************************************************************************/
   2771/* START: HW SM                                                              */
   2772/*****************************************************************************/
   2773/*
   2774 * csio_hws_uninit - Uninit state
   2775 * @hw - HW module
   2776 * @evt - Event
   2777 *
   2778 */
   2779static void
   2780csio_hws_uninit(struct csio_hw *hw, enum csio_hw_ev evt)
   2781{
   2782	hw->prev_evt = hw->cur_evt;
   2783	hw->cur_evt = evt;
   2784	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2785
   2786	switch (evt) {
   2787	case CSIO_HWE_CFG:
   2788		csio_set_state(&hw->sm, csio_hws_configuring);
   2789		csio_hw_configure(hw);
   2790		break;
   2791
   2792	default:
   2793		CSIO_INC_STATS(hw, n_evt_unexp);
   2794		break;
   2795	}
   2796}
   2797
   2798/*
   2799 * csio_hws_configuring - Configuring state
   2800 * @hw - HW module
   2801 * @evt - Event
   2802 *
   2803 */
   2804static void
   2805csio_hws_configuring(struct csio_hw *hw, enum csio_hw_ev evt)
   2806{
   2807	hw->prev_evt = hw->cur_evt;
   2808	hw->cur_evt = evt;
   2809	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2810
   2811	switch (evt) {
   2812	case CSIO_HWE_INIT:
   2813		csio_set_state(&hw->sm, csio_hws_initializing);
   2814		csio_hw_initialize(hw);
   2815		break;
   2816
   2817	case CSIO_HWE_INIT_DONE:
   2818		csio_set_state(&hw->sm, csio_hws_ready);
   2819		/* Fan out event to all lnode SMs */
   2820		csio_notify_lnodes(hw, CSIO_LN_NOTIFY_HWREADY);
   2821		break;
   2822
   2823	case CSIO_HWE_FATAL:
   2824		csio_set_state(&hw->sm, csio_hws_uninit);
   2825		break;
   2826
   2827	case CSIO_HWE_PCI_REMOVE:
   2828		csio_do_bye(hw);
   2829		break;
   2830	default:
   2831		CSIO_INC_STATS(hw, n_evt_unexp);
   2832		break;
   2833	}
   2834}
   2835
   2836/*
   2837 * csio_hws_initializing - Initializing state
   2838 * @hw - HW module
   2839 * @evt - Event
   2840 *
   2841 */
   2842static void
   2843csio_hws_initializing(struct csio_hw *hw, enum csio_hw_ev evt)
   2844{
   2845	hw->prev_evt = hw->cur_evt;
   2846	hw->cur_evt = evt;
   2847	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2848
   2849	switch (evt) {
   2850	case CSIO_HWE_INIT_DONE:
   2851		csio_set_state(&hw->sm, csio_hws_ready);
   2852
   2853		/* Fan out event to all lnode SMs */
   2854		csio_notify_lnodes(hw, CSIO_LN_NOTIFY_HWREADY);
   2855
   2856		/* Enable interrupts */
   2857		csio_hw_intr_enable(hw);
   2858		break;
   2859
   2860	case CSIO_HWE_FATAL:
   2861		csio_set_state(&hw->sm, csio_hws_uninit);
   2862		break;
   2863
   2864	case CSIO_HWE_PCI_REMOVE:
   2865		csio_do_bye(hw);
   2866		break;
   2867
   2868	default:
   2869		CSIO_INC_STATS(hw, n_evt_unexp);
   2870		break;
   2871	}
   2872}
   2873
   2874/*
   2875 * csio_hws_ready - Ready state
   2876 * @hw - HW module
   2877 * @evt - Event
   2878 *
   2879 */
   2880static void
   2881csio_hws_ready(struct csio_hw *hw, enum csio_hw_ev evt)
   2882{
   2883	/* Remember the event */
   2884	hw->evtflag = evt;
   2885
   2886	hw->prev_evt = hw->cur_evt;
   2887	hw->cur_evt = evt;
   2888	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2889
   2890	switch (evt) {
   2891	case CSIO_HWE_HBA_RESET:
   2892	case CSIO_HWE_FW_DLOAD:
   2893	case CSIO_HWE_SUSPEND:
   2894	case CSIO_HWE_PCI_REMOVE:
   2895	case CSIO_HWE_PCIERR_DETECTED:
   2896		csio_set_state(&hw->sm, csio_hws_quiescing);
   2897		/* cleanup all outstanding cmds */
   2898		if (evt == CSIO_HWE_HBA_RESET ||
   2899		    evt == CSIO_HWE_PCIERR_DETECTED)
   2900			csio_scsim_cleanup_io(csio_hw_to_scsim(hw), false);
   2901		else
   2902			csio_scsim_cleanup_io(csio_hw_to_scsim(hw), true);
   2903
   2904		csio_hw_intr_disable(hw);
   2905		csio_hw_mbm_cleanup(hw);
   2906		csio_evtq_stop(hw);
   2907		csio_notify_lnodes(hw, CSIO_LN_NOTIFY_HWSTOP);
   2908		csio_evtq_flush(hw);
   2909		csio_mgmtm_cleanup(csio_hw_to_mgmtm(hw));
   2910		csio_post_event(&hw->sm, CSIO_HWE_QUIESCED);
   2911		break;
   2912
   2913	case CSIO_HWE_FATAL:
   2914		csio_set_state(&hw->sm, csio_hws_uninit);
   2915		break;
   2916
   2917	default:
   2918		CSIO_INC_STATS(hw, n_evt_unexp);
   2919		break;
   2920	}
   2921}
   2922
   2923/*
   2924 * csio_hws_quiescing - Quiescing state
   2925 * @hw - HW module
   2926 * @evt - Event
   2927 *
   2928 */
   2929static void
   2930csio_hws_quiescing(struct csio_hw *hw, enum csio_hw_ev evt)
   2931{
   2932	hw->prev_evt = hw->cur_evt;
   2933	hw->cur_evt = evt;
   2934	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2935
   2936	switch (evt) {
   2937	case CSIO_HWE_QUIESCED:
   2938		switch (hw->evtflag) {
   2939		case CSIO_HWE_FW_DLOAD:
   2940			csio_set_state(&hw->sm, csio_hws_resetting);
   2941			/* Download firmware */
   2942			fallthrough;
   2943
   2944		case CSIO_HWE_HBA_RESET:
   2945			csio_set_state(&hw->sm, csio_hws_resetting);
   2946			/* Start reset of the HBA */
   2947			csio_notify_lnodes(hw, CSIO_LN_NOTIFY_HWRESET);
   2948			csio_wr_destroy_queues(hw, false);
   2949			csio_do_reset(hw, false);
   2950			csio_post_event(&hw->sm, CSIO_HWE_HBA_RESET_DONE);
   2951			break;
   2952
   2953		case CSIO_HWE_PCI_REMOVE:
   2954			csio_set_state(&hw->sm, csio_hws_removing);
   2955			csio_notify_lnodes(hw, CSIO_LN_NOTIFY_HWREMOVE);
   2956			csio_wr_destroy_queues(hw, true);
   2957			/* Now send the bye command */
   2958			csio_do_bye(hw);
   2959			break;
   2960
   2961		case CSIO_HWE_SUSPEND:
   2962			csio_set_state(&hw->sm, csio_hws_quiesced);
   2963			break;
   2964
   2965		case CSIO_HWE_PCIERR_DETECTED:
   2966			csio_set_state(&hw->sm, csio_hws_pcierr);
   2967			csio_wr_destroy_queues(hw, false);
   2968			break;
   2969
   2970		default:
   2971			CSIO_INC_STATS(hw, n_evt_unexp);
   2972			break;
   2973
   2974		}
   2975		break;
   2976
   2977	default:
   2978		CSIO_INC_STATS(hw, n_evt_unexp);
   2979		break;
   2980	}
   2981}
   2982
   2983/*
   2984 * csio_hws_quiesced - Quiesced state
   2985 * @hw - HW module
   2986 * @evt - Event
   2987 *
   2988 */
   2989static void
   2990csio_hws_quiesced(struct csio_hw *hw, enum csio_hw_ev evt)
   2991{
   2992	hw->prev_evt = hw->cur_evt;
   2993	hw->cur_evt = evt;
   2994	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   2995
   2996	switch (evt) {
   2997	case CSIO_HWE_RESUME:
   2998		csio_set_state(&hw->sm, csio_hws_configuring);
   2999		csio_hw_configure(hw);
   3000		break;
   3001
   3002	default:
   3003		CSIO_INC_STATS(hw, n_evt_unexp);
   3004		break;
   3005	}
   3006}
   3007
   3008/*
   3009 * csio_hws_resetting - HW Resetting state
   3010 * @hw - HW module
   3011 * @evt - Event
   3012 *
   3013 */
   3014static void
   3015csio_hws_resetting(struct csio_hw *hw, enum csio_hw_ev evt)
   3016{
   3017	hw->prev_evt = hw->cur_evt;
   3018	hw->cur_evt = evt;
   3019	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   3020
   3021	switch (evt) {
   3022	case CSIO_HWE_HBA_RESET_DONE:
   3023		csio_evtq_start(hw);
   3024		csio_set_state(&hw->sm, csio_hws_configuring);
   3025		csio_hw_configure(hw);
   3026		break;
   3027
   3028	default:
   3029		CSIO_INC_STATS(hw, n_evt_unexp);
   3030		break;
   3031	}
   3032}
   3033
   3034/*
   3035 * csio_hws_removing - PCI Hotplug removing state
   3036 * @hw - HW module
   3037 * @evt - Event
   3038 *
   3039 */
   3040static void
   3041csio_hws_removing(struct csio_hw *hw, enum csio_hw_ev evt)
   3042{
   3043	hw->prev_evt = hw->cur_evt;
   3044	hw->cur_evt = evt;
   3045	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   3046
   3047	switch (evt) {
   3048	case CSIO_HWE_HBA_RESET:
   3049		if (!csio_is_hw_master(hw))
   3050			break;
   3051		/*
   3052		 * The BYE should have already been issued, so we can't
   3053		 * use the mailbox interface. Hence we use the PL_RST
   3054		 * register directly.
   3055		 */
   3056		csio_err(hw, "Resetting HW and waiting 2 seconds...\n");
   3057		csio_wr_reg32(hw, PIORSTMODE_F | PIORST_F, PL_RST_A);
   3058		mdelay(2000);
   3059		break;
   3060
   3061	/* Should never receive any new events */
   3062	default:
   3063		CSIO_INC_STATS(hw, n_evt_unexp);
   3064		break;
   3065
   3066	}
   3067}
   3068
   3069/*
   3070 * csio_hws_pcierr - PCI Error state
   3071 * @hw - HW module
   3072 * @evt - Event
   3073 *
   3074 */
   3075static void
   3076csio_hws_pcierr(struct csio_hw *hw, enum csio_hw_ev evt)
   3077{
   3078	hw->prev_evt = hw->cur_evt;
   3079	hw->cur_evt = evt;
   3080	CSIO_INC_STATS(hw, n_evt_sm[evt]);
   3081
   3082	switch (evt) {
   3083	case CSIO_HWE_PCIERR_SLOT_RESET:
   3084		csio_evtq_start(hw);
   3085		csio_set_state(&hw->sm, csio_hws_configuring);
   3086		csio_hw_configure(hw);
   3087		break;
   3088
   3089	default:
   3090		CSIO_INC_STATS(hw, n_evt_unexp);
   3091		break;
   3092	}
   3093}
   3094
   3095/*****************************************************************************/
   3096/* END: HW SM                                                                */
   3097/*****************************************************************************/
   3098
   3099/*
   3100 *	csio_handle_intr_status - table driven interrupt handler
   3101 *	@hw: HW instance
   3102 *	@reg: the interrupt status register to process
   3103 *	@acts: table of interrupt actions
   3104 *
   3105 *	A table driven interrupt handler that applies a set of masks to an
   3106 *	interrupt status word and performs the corresponding actions if the
   3107 *	interrupts described by the mask have occurred.  The actions include
   3108 *	optionally emitting a warning or alert message. The table is terminated
   3109 *	by an entry specifying mask 0.  Returns the number of fatal interrupt
   3110 *	conditions.
   3111 */
   3112int
   3113csio_handle_intr_status(struct csio_hw *hw, unsigned int reg,
   3114				 const struct intr_info *acts)
   3115{
   3116	int fatal = 0;
   3117	unsigned int mask = 0;
   3118	unsigned int status = csio_rd_reg32(hw, reg);
   3119
   3120	for ( ; acts->mask; ++acts) {
   3121		if (!(status & acts->mask))
   3122			continue;
   3123		if (acts->fatal) {
   3124			fatal++;
   3125			csio_fatal(hw, "Fatal %s (0x%x)\n",
   3126				    acts->msg, status & acts->mask);
   3127		} else if (acts->msg)
   3128			csio_info(hw, "%s (0x%x)\n",
   3129				    acts->msg, status & acts->mask);
   3130		mask |= acts->mask;
   3131	}
   3132	status &= mask;
   3133	if (status)                           /* clear processed interrupts */
   3134		csio_wr_reg32(hw, status, reg);
   3135	return fatal;
   3136}
   3137
   3138/*
   3139 * TP interrupt handler.
   3140 */
   3141static void csio_tp_intr_handler(struct csio_hw *hw)
   3142{
   3143	static struct intr_info tp_intr_info[] = {
   3144		{ 0x3fffffff, "TP parity error", -1, 1 },
   3145		{ FLMTXFLSTEMPTY_F, "TP out of Tx pages", -1, 1 },
   3146		{ 0, NULL, 0, 0 }
   3147	};
   3148
   3149	if (csio_handle_intr_status(hw, TP_INT_CAUSE_A, tp_intr_info))
   3150		csio_hw_fatal_err(hw);
   3151}
   3152
   3153/*
   3154 * SGE interrupt handler.
   3155 */
   3156static void csio_sge_intr_handler(struct csio_hw *hw)
   3157{
   3158	uint64_t v;
   3159
   3160	static struct intr_info sge_intr_info[] = {
   3161		{ ERR_CPL_EXCEED_IQE_SIZE_F,
   3162		  "SGE received CPL exceeding IQE size", -1, 1 },
   3163		{ ERR_INVALID_CIDX_INC_F,
   3164		  "SGE GTS CIDX increment too large", -1, 0 },
   3165		{ ERR_CPL_OPCODE_0_F, "SGE received 0-length CPL", -1, 0 },
   3166		{ ERR_DROPPED_DB_F, "SGE doorbell dropped", -1, 0 },
   3167		{ ERR_DATA_CPL_ON_HIGH_QID1_F | ERR_DATA_CPL_ON_HIGH_QID0_F,
   3168		  "SGE IQID > 1023 received CPL for FL", -1, 0 },
   3169		{ ERR_BAD_DB_PIDX3_F, "SGE DBP 3 pidx increment too large", -1,
   3170		  0 },
   3171		{ ERR_BAD_DB_PIDX2_F, "SGE DBP 2 pidx increment too large", -1,
   3172		  0 },
   3173		{ ERR_BAD_DB_PIDX1_F, "SGE DBP 1 pidx increment too large", -1,
   3174		  0 },
   3175		{ ERR_BAD_DB_PIDX0_F, "SGE DBP 0 pidx increment too large", -1,
   3176		  0 },
   3177		{ ERR_ING_CTXT_PRIO_F,
   3178		  "SGE too many priority ingress contexts", -1, 0 },
   3179		{ ERR_EGR_CTXT_PRIO_F,
   3180		  "SGE too many priority egress contexts", -1, 0 },
   3181		{ INGRESS_SIZE_ERR_F, "SGE illegal ingress QID", -1, 0 },
   3182		{ EGRESS_SIZE_ERR_F, "SGE illegal egress QID", -1, 0 },
   3183		{ 0, NULL, 0, 0 }
   3184	};
   3185
   3186	v = (uint64_t)csio_rd_reg32(hw, SGE_INT_CAUSE1_A) |
   3187	    ((uint64_t)csio_rd_reg32(hw, SGE_INT_CAUSE2_A) << 32);
   3188	if (v) {
   3189		csio_fatal(hw, "SGE parity error (%#llx)\n",
   3190			    (unsigned long long)v);
   3191		csio_wr_reg32(hw, (uint32_t)(v & 0xFFFFFFFF),
   3192						SGE_INT_CAUSE1_A);
   3193		csio_wr_reg32(hw, (uint32_t)(v >> 32), SGE_INT_CAUSE2_A);
   3194	}
   3195
   3196	v |= csio_handle_intr_status(hw, SGE_INT_CAUSE3_A, sge_intr_info);
   3197
   3198	if (csio_handle_intr_status(hw, SGE_INT_CAUSE3_A, sge_intr_info) ||
   3199	    v != 0)
   3200		csio_hw_fatal_err(hw);
   3201}
   3202
   3203#define CIM_OBQ_INTR (OBQULP0PARERR_F | OBQULP1PARERR_F | OBQULP2PARERR_F |\
   3204		      OBQULP3PARERR_F | OBQSGEPARERR_F | OBQNCSIPARERR_F)
   3205#define CIM_IBQ_INTR (IBQTP0PARERR_F | IBQTP1PARERR_F | IBQULPPARERR_F |\
   3206		      IBQSGEHIPARERR_F | IBQSGELOPARERR_F | IBQNCSIPARERR_F)
   3207
   3208/*
   3209 * CIM interrupt handler.
   3210 */
   3211static void csio_cim_intr_handler(struct csio_hw *hw)
   3212{
   3213	static struct intr_info cim_intr_info[] = {
   3214		{ PREFDROPINT_F, "CIM control register prefetch drop", -1, 1 },
   3215		{ CIM_OBQ_INTR, "CIM OBQ parity error", -1, 1 },
   3216		{ CIM_IBQ_INTR, "CIM IBQ parity error", -1, 1 },
   3217		{ MBUPPARERR_F, "CIM mailbox uP parity error", -1, 1 },
   3218		{ MBHOSTPARERR_F, "CIM mailbox host parity error", -1, 1 },
   3219		{ TIEQINPARERRINT_F, "CIM TIEQ outgoing parity error", -1, 1 },
   3220		{ TIEQOUTPARERRINT_F, "CIM TIEQ incoming parity error", -1, 1 },
   3221		{ 0, NULL, 0, 0 }
   3222	};
   3223	static struct intr_info cim_upintr_info[] = {
   3224		{ RSVDSPACEINT_F, "CIM reserved space access", -1, 1 },
   3225		{ ILLTRANSINT_F, "CIM illegal transaction", -1, 1 },
   3226		{ ILLWRINT_F, "CIM illegal write", -1, 1 },
   3227		{ ILLRDINT_F, "CIM illegal read", -1, 1 },
   3228		{ ILLRDBEINT_F, "CIM illegal read BE", -1, 1 },
   3229		{ ILLWRBEINT_F, "CIM illegal write BE", -1, 1 },
   3230		{ SGLRDBOOTINT_F, "CIM single read from boot space", -1, 1 },
   3231		{ SGLWRBOOTINT_F, "CIM single write to boot space", -1, 1 },
   3232		{ BLKWRBOOTINT_F, "CIM block write to boot space", -1, 1 },
   3233		{ SGLRDFLASHINT_F, "CIM single read from flash space", -1, 1 },
   3234		{ SGLWRFLASHINT_F, "CIM single write to flash space", -1, 1 },
   3235		{ BLKWRFLASHINT_F, "CIM block write to flash space", -1, 1 },
   3236		{ SGLRDEEPROMINT_F, "CIM single EEPROM read", -1, 1 },
   3237		{ SGLWREEPROMINT_F, "CIM single EEPROM write", -1, 1 },
   3238		{ BLKRDEEPROMINT_F, "CIM block EEPROM read", -1, 1 },
   3239		{ BLKWREEPROMINT_F, "CIM block EEPROM write", -1, 1 },
   3240		{ SGLRDCTLINT_F, "CIM single read from CTL space", -1, 1 },
   3241		{ SGLWRCTLINT_F, "CIM single write to CTL space", -1, 1 },
   3242		{ BLKRDCTLINT_F, "CIM block read from CTL space", -1, 1 },
   3243		{ BLKWRCTLINT_F, "CIM block write to CTL space", -1, 1 },
   3244		{ SGLRDPLINT_F, "CIM single read from PL space", -1, 1 },
   3245		{ SGLWRPLINT_F, "CIM single write to PL space", -1, 1 },
   3246		{ BLKRDPLINT_F, "CIM block read from PL space", -1, 1 },
   3247		{ BLKWRPLINT_F, "CIM block write to PL space", -1, 1 },
   3248		{ REQOVRLOOKUPINT_F, "CIM request FIFO overwrite", -1, 1 },
   3249		{ RSPOVRLOOKUPINT_F, "CIM response FIFO overwrite", -1, 1 },
   3250		{ TIMEOUTINT_F, "CIM PIF timeout", -1, 1 },
   3251		{ TIMEOUTMAINT_F, "CIM PIF MA timeout", -1, 1 },
   3252		{ 0, NULL, 0, 0 }
   3253	};
   3254
   3255	int fat;
   3256
   3257	fat = csio_handle_intr_status(hw, CIM_HOST_INT_CAUSE_A,
   3258				      cim_intr_info) +
   3259	      csio_handle_intr_status(hw, CIM_HOST_UPACC_INT_CAUSE_A,
   3260				      cim_upintr_info);
   3261	if (fat)
   3262		csio_hw_fatal_err(hw);
   3263}
   3264
   3265/*
   3266 * ULP RX interrupt handler.
   3267 */
   3268static void csio_ulprx_intr_handler(struct csio_hw *hw)
   3269{
   3270	static struct intr_info ulprx_intr_info[] = {
   3271		{ 0x1800000, "ULPRX context error", -1, 1 },
   3272		{ 0x7fffff, "ULPRX parity error", -1, 1 },
   3273		{ 0, NULL, 0, 0 }
   3274	};
   3275
   3276	if (csio_handle_intr_status(hw, ULP_RX_INT_CAUSE_A, ulprx_intr_info))
   3277		csio_hw_fatal_err(hw);
   3278}
   3279
   3280/*
   3281 * ULP TX interrupt handler.
   3282 */
   3283static void csio_ulptx_intr_handler(struct csio_hw *hw)
   3284{
   3285	static struct intr_info ulptx_intr_info[] = {
   3286		{ PBL_BOUND_ERR_CH3_F, "ULPTX channel 3 PBL out of bounds", -1,
   3287		  0 },
   3288		{ PBL_BOUND_ERR_CH2_F, "ULPTX channel 2 PBL out of bounds", -1,
   3289		  0 },
   3290		{ PBL_BOUND_ERR_CH1_F, "ULPTX channel 1 PBL out of bounds", -1,
   3291		  0 },
   3292		{ PBL_BOUND_ERR_CH0_F, "ULPTX channel 0 PBL out of bounds", -1,
   3293		  0 },
   3294		{ 0xfffffff, "ULPTX parity error", -1, 1 },
   3295		{ 0, NULL, 0, 0 }
   3296	};
   3297
   3298	if (csio_handle_intr_status(hw, ULP_TX_INT_CAUSE_A, ulptx_intr_info))
   3299		csio_hw_fatal_err(hw);
   3300}
   3301
   3302/*
   3303 * PM TX interrupt handler.
   3304 */
   3305static void csio_pmtx_intr_handler(struct csio_hw *hw)
   3306{
   3307	static struct intr_info pmtx_intr_info[] = {
   3308		{ PCMD_LEN_OVFL0_F, "PMTX channel 0 pcmd too large", -1, 1 },
   3309		{ PCMD_LEN_OVFL1_F, "PMTX channel 1 pcmd too large", -1, 1 },
   3310		{ PCMD_LEN_OVFL2_F, "PMTX channel 2 pcmd too large", -1, 1 },
   3311		{ ZERO_C_CMD_ERROR_F, "PMTX 0-length pcmd", -1, 1 },
   3312		{ 0xffffff0, "PMTX framing error", -1, 1 },
   3313		{ OESPI_PAR_ERROR_F, "PMTX oespi parity error", -1, 1 },
   3314		{ DB_OPTIONS_PAR_ERROR_F, "PMTX db_options parity error", -1,
   3315		  1 },
   3316		{ ICSPI_PAR_ERROR_F, "PMTX icspi parity error", -1, 1 },
   3317		{ PMTX_C_PCMD_PAR_ERROR_F, "PMTX c_pcmd parity error", -1, 1},
   3318		{ 0, NULL, 0, 0 }
   3319	};
   3320
   3321	if (csio_handle_intr_status(hw, PM_TX_INT_CAUSE_A, pmtx_intr_info))
   3322		csio_hw_fatal_err(hw);
   3323}
   3324
   3325/*
   3326 * PM RX interrupt handler.
   3327 */
   3328static void csio_pmrx_intr_handler(struct csio_hw *hw)
   3329{
   3330	static struct intr_info pmrx_intr_info[] = {
   3331		{ ZERO_E_CMD_ERROR_F, "PMRX 0-length pcmd", -1, 1 },
   3332		{ 0x3ffff0, "PMRX framing error", -1, 1 },
   3333		{ OCSPI_PAR_ERROR_F, "PMRX ocspi parity error", -1, 1 },
   3334		{ DB_OPTIONS_PAR_ERROR_F, "PMRX db_options parity error", -1,
   3335		  1 },
   3336		{ IESPI_PAR_ERROR_F, "PMRX iespi parity error", -1, 1 },
   3337		{ PMRX_E_PCMD_PAR_ERROR_F, "PMRX e_pcmd parity error", -1, 1},
   3338		{ 0, NULL, 0, 0 }
   3339	};
   3340
   3341	if (csio_handle_intr_status(hw, PM_RX_INT_CAUSE_A, pmrx_intr_info))
   3342		csio_hw_fatal_err(hw);
   3343}
   3344
   3345/*
   3346 * CPL switch interrupt handler.
   3347 */
   3348static void csio_cplsw_intr_handler(struct csio_hw *hw)
   3349{
   3350	static struct intr_info cplsw_intr_info[] = {
   3351		{ CIM_OP_MAP_PERR_F, "CPLSW CIM op_map parity error", -1, 1 },
   3352		{ CIM_OVFL_ERROR_F, "CPLSW CIM overflow", -1, 1 },
   3353		{ TP_FRAMING_ERROR_F, "CPLSW TP framing error", -1, 1 },
   3354		{ SGE_FRAMING_ERROR_F, "CPLSW SGE framing error", -1, 1 },
   3355		{ CIM_FRAMING_ERROR_F, "CPLSW CIM framing error", -1, 1 },
   3356		{ ZERO_SWITCH_ERROR_F, "CPLSW no-switch error", -1, 1 },
   3357		{ 0, NULL, 0, 0 }
   3358	};
   3359
   3360	if (csio_handle_intr_status(hw, CPL_INTR_CAUSE_A, cplsw_intr_info))
   3361		csio_hw_fatal_err(hw);
   3362}
   3363
   3364/*
   3365 * LE interrupt handler.
   3366 */
   3367static void csio_le_intr_handler(struct csio_hw *hw)
   3368{
   3369	enum chip_type chip = CHELSIO_CHIP_VERSION(hw->chip_id);
   3370
   3371	static struct intr_info le_intr_info[] = {
   3372		{ LIPMISS_F, "LE LIP miss", -1, 0 },
   3373		{ LIP0_F, "LE 0 LIP error", -1, 0 },
   3374		{ PARITYERR_F, "LE parity error", -1, 1 },
   3375		{ UNKNOWNCMD_F, "LE unknown command", -1, 1 },
   3376		{ REQQPARERR_F, "LE request queue parity error", -1, 1 },
   3377		{ 0, NULL, 0, 0 }
   3378	};
   3379
   3380	static struct intr_info t6_le_intr_info[] = {
   3381		{ T6_LIPMISS_F, "LE LIP miss", -1, 0 },
   3382		{ T6_LIP0_F, "LE 0 LIP error", -1, 0 },
   3383		{ TCAMINTPERR_F, "LE parity error", -1, 1 },
   3384		{ T6_UNKNOWNCMD_F, "LE unknown command", -1, 1 },
   3385		{ SSRAMINTPERR_F, "LE request queue parity error", -1, 1 },
   3386		{ 0, NULL, 0, 0 }
   3387	};
   3388
   3389	if (csio_handle_intr_status(hw, LE_DB_INT_CAUSE_A,
   3390				    (chip == CHELSIO_T5) ?
   3391				    le_intr_info : t6_le_intr_info))
   3392		csio_hw_fatal_err(hw);
   3393}
   3394
   3395/*
   3396 * MPS interrupt handler.
   3397 */
   3398static void csio_mps_intr_handler(struct csio_hw *hw)
   3399{
   3400	static struct intr_info mps_rx_intr_info[] = {
   3401		{ 0xffffff, "MPS Rx parity error", -1, 1 },
   3402		{ 0, NULL, 0, 0 }
   3403	};
   3404	static struct intr_info mps_tx_intr_info[] = {
   3405		{ TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 },
   3406		{ NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 },
   3407		{ TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error",
   3408		  -1, 1 },
   3409		{ TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error",
   3410		  -1, 1 },
   3411		{ BUBBLE_F, "MPS Tx underflow", -1, 1 },
   3412		{ SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 },
   3413		{ FRMERR_F, "MPS Tx framing error", -1, 1 },
   3414		{ 0, NULL, 0, 0 }
   3415	};
   3416	static struct intr_info mps_trc_intr_info[] = {
   3417		{ FILTMEM_V(FILTMEM_M), "MPS TRC filter parity error", -1, 1 },
   3418		{ PKTFIFO_V(PKTFIFO_M), "MPS TRC packet FIFO parity error",
   3419		  -1, 1 },
   3420		{ MISCPERR_F, "MPS TRC misc parity error", -1, 1 },
   3421		{ 0, NULL, 0, 0 }
   3422	};
   3423	static struct intr_info mps_stat_sram_intr_info[] = {
   3424		{ 0x1fffff, "MPS statistics SRAM parity error", -1, 1 },
   3425		{ 0, NULL, 0, 0 }
   3426	};
   3427	static struct intr_info mps_stat_tx_intr_info[] = {
   3428		{ 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 },
   3429		{ 0, NULL, 0, 0 }
   3430	};
   3431	static struct intr_info mps_stat_rx_intr_info[] = {
   3432		{ 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 },
   3433		{ 0, NULL, 0, 0 }
   3434	};
   3435	static struct intr_info mps_cls_intr_info[] = {
   3436		{ MATCHSRAM_F, "MPS match SRAM parity error", -1, 1 },
   3437		{ MATCHTCAM_F, "MPS match TCAM parity error", -1, 1 },
   3438		{ HASHSRAM_F, "MPS hash SRAM parity error", -1, 1 },
   3439		{ 0, NULL, 0, 0 }
   3440	};
   3441
   3442	int fat;
   3443
   3444	fat = csio_handle_intr_status(hw, MPS_RX_PERR_INT_CAUSE_A,
   3445				      mps_rx_intr_info) +
   3446	      csio_handle_intr_status(hw, MPS_TX_INT_CAUSE_A,
   3447				      mps_tx_intr_info) +
   3448	      csio_handle_intr_status(hw, MPS_TRC_INT_CAUSE_A,
   3449				      mps_trc_intr_info) +
   3450	      csio_handle_intr_status(hw, MPS_STAT_PERR_INT_CAUSE_SRAM_A,
   3451				      mps_stat_sram_intr_info) +
   3452	      csio_handle_intr_status(hw, MPS_STAT_PERR_INT_CAUSE_TX_FIFO_A,
   3453				      mps_stat_tx_intr_info) +
   3454	      csio_handle_intr_status(hw, MPS_STAT_PERR_INT_CAUSE_RX_FIFO_A,
   3455				      mps_stat_rx_intr_info) +
   3456	      csio_handle_intr_status(hw, MPS_CLS_INT_CAUSE_A,
   3457				      mps_cls_intr_info);
   3458
   3459	csio_wr_reg32(hw, 0, MPS_INT_CAUSE_A);
   3460	csio_rd_reg32(hw, MPS_INT_CAUSE_A);                    /* flush */
   3461	if (fat)
   3462		csio_hw_fatal_err(hw);
   3463}
   3464
   3465#define MEM_INT_MASK (PERR_INT_CAUSE_F | ECC_CE_INT_CAUSE_F | \
   3466		      ECC_UE_INT_CAUSE_F)
   3467
   3468/*
   3469 * EDC/MC interrupt handler.
   3470 */
   3471static void csio_mem_intr_handler(struct csio_hw *hw, int idx)
   3472{
   3473	static const char name[3][5] = { "EDC0", "EDC1", "MC" };
   3474
   3475	unsigned int addr, cnt_addr, v;
   3476
   3477	if (idx <= MEM_EDC1) {
   3478		addr = EDC_REG(EDC_INT_CAUSE_A, idx);
   3479		cnt_addr = EDC_REG(EDC_ECC_STATUS_A, idx);
   3480	} else {
   3481		addr = MC_INT_CAUSE_A;
   3482		cnt_addr = MC_ECC_STATUS_A;
   3483	}
   3484
   3485	v = csio_rd_reg32(hw, addr) & MEM_INT_MASK;
   3486	if (v & PERR_INT_CAUSE_F)
   3487		csio_fatal(hw, "%s FIFO parity error\n", name[idx]);
   3488	if (v & ECC_CE_INT_CAUSE_F) {
   3489		uint32_t cnt = ECC_CECNT_G(csio_rd_reg32(hw, cnt_addr));
   3490
   3491		csio_wr_reg32(hw, ECC_CECNT_V(ECC_CECNT_M), cnt_addr);
   3492		csio_warn(hw, "%u %s correctable ECC data error%s\n",
   3493			    cnt, name[idx], cnt > 1 ? "s" : "");
   3494	}
   3495	if (v & ECC_UE_INT_CAUSE_F)
   3496		csio_fatal(hw, "%s uncorrectable ECC data error\n", name[idx]);
   3497
   3498	csio_wr_reg32(hw, v, addr);
   3499	if (v & (PERR_INT_CAUSE_F | ECC_UE_INT_CAUSE_F))
   3500		csio_hw_fatal_err(hw);
   3501}
   3502
   3503/*
   3504 * MA interrupt handler.
   3505 */
   3506static void csio_ma_intr_handler(struct csio_hw *hw)
   3507{
   3508	uint32_t v, status = csio_rd_reg32(hw, MA_INT_CAUSE_A);
   3509
   3510	if (status & MEM_PERR_INT_CAUSE_F)
   3511		csio_fatal(hw, "MA parity error, parity status %#x\n",
   3512			    csio_rd_reg32(hw, MA_PARITY_ERROR_STATUS_A));
   3513	if (status & MEM_WRAP_INT_CAUSE_F) {
   3514		v = csio_rd_reg32(hw, MA_INT_WRAP_STATUS_A);
   3515		csio_fatal(hw,
   3516		   "MA address wrap-around error by client %u to address %#x\n",
   3517		   MEM_WRAP_CLIENT_NUM_G(v), MEM_WRAP_ADDRESS_G(v) << 4);
   3518	}
   3519	csio_wr_reg32(hw, status, MA_INT_CAUSE_A);
   3520	csio_hw_fatal_err(hw);
   3521}
   3522
   3523/*
   3524 * SMB interrupt handler.
   3525 */
   3526static void csio_smb_intr_handler(struct csio_hw *hw)
   3527{
   3528	static struct intr_info smb_intr_info[] = {
   3529		{ MSTTXFIFOPARINT_F, "SMB master Tx FIFO parity error", -1, 1 },
   3530		{ MSTRXFIFOPARINT_F, "SMB master Rx FIFO parity error", -1, 1 },
   3531		{ SLVFIFOPARINT_F, "SMB slave FIFO parity error", -1, 1 },
   3532		{ 0, NULL, 0, 0 }
   3533	};
   3534
   3535	if (csio_handle_intr_status(hw, SMB_INT_CAUSE_A, smb_intr_info))
   3536		csio_hw_fatal_err(hw);
   3537}
   3538
   3539/*
   3540 * NC-SI interrupt handler.
   3541 */
   3542static void csio_ncsi_intr_handler(struct csio_hw *hw)
   3543{
   3544	static struct intr_info ncsi_intr_info[] = {
   3545		{ CIM_DM_PRTY_ERR_F, "NC-SI CIM parity error", -1, 1 },
   3546		{ MPS_DM_PRTY_ERR_F, "NC-SI MPS parity error", -1, 1 },
   3547		{ TXFIFO_PRTY_ERR_F, "NC-SI Tx FIFO parity error", -1, 1 },
   3548		{ RXFIFO_PRTY_ERR_F, "NC-SI Rx FIFO parity error", -1, 1 },
   3549		{ 0, NULL, 0, 0 }
   3550	};
   3551
   3552	if (csio_handle_intr_status(hw, NCSI_INT_CAUSE_A, ncsi_intr_info))
   3553		csio_hw_fatal_err(hw);
   3554}
   3555
   3556/*
   3557 * XGMAC interrupt handler.
   3558 */
   3559static void csio_xgmac_intr_handler(struct csio_hw *hw, int port)
   3560{
   3561	uint32_t v = csio_rd_reg32(hw, T5_PORT_REG(port, MAC_PORT_INT_CAUSE_A));
   3562
   3563	v &= TXFIFO_PRTY_ERR_F | RXFIFO_PRTY_ERR_F;
   3564	if (!v)
   3565		return;
   3566
   3567	if (v & TXFIFO_PRTY_ERR_F)
   3568		csio_fatal(hw, "XGMAC %d Tx FIFO parity error\n", port);
   3569	if (v & RXFIFO_PRTY_ERR_F)
   3570		csio_fatal(hw, "XGMAC %d Rx FIFO parity error\n", port);
   3571	csio_wr_reg32(hw, v, T5_PORT_REG(port, MAC_PORT_INT_CAUSE_A));
   3572	csio_hw_fatal_err(hw);
   3573}
   3574
   3575/*
   3576 * PL interrupt handler.
   3577 */
   3578static void csio_pl_intr_handler(struct csio_hw *hw)
   3579{
   3580	static struct intr_info pl_intr_info[] = {
   3581		{ FATALPERR_F, "T4 fatal parity error", -1, 1 },
   3582		{ PERRVFID_F, "PL VFID_MAP parity error", -1, 1 },
   3583		{ 0, NULL, 0, 0 }
   3584	};
   3585
   3586	if (csio_handle_intr_status(hw, PL_PL_INT_CAUSE_A, pl_intr_info))
   3587		csio_hw_fatal_err(hw);
   3588}
   3589
   3590/*
   3591 *	csio_hw_slow_intr_handler - control path interrupt handler
   3592 *	@hw: HW module
   3593 *
   3594 *	Interrupt handler for non-data global interrupt events, e.g., errors.
   3595 *	The designation 'slow' is because it involves register reads, while
   3596 *	data interrupts typically don't involve any MMIOs.
   3597 */
   3598int
   3599csio_hw_slow_intr_handler(struct csio_hw *hw)
   3600{
   3601	uint32_t cause = csio_rd_reg32(hw, PL_INT_CAUSE_A);
   3602
   3603	if (!(cause & CSIO_GLBL_INTR_MASK)) {
   3604		CSIO_INC_STATS(hw, n_plint_unexp);
   3605		return 0;
   3606	}
   3607
   3608	csio_dbg(hw, "Slow interrupt! cause: 0x%x\n", cause);
   3609
   3610	CSIO_INC_STATS(hw, n_plint_cnt);
   3611
   3612	if (cause & CIM_F)
   3613		csio_cim_intr_handler(hw);
   3614
   3615	if (cause & MPS_F)
   3616		csio_mps_intr_handler(hw);
   3617
   3618	if (cause & NCSI_F)
   3619		csio_ncsi_intr_handler(hw);
   3620
   3621	if (cause & PL_F)
   3622		csio_pl_intr_handler(hw);
   3623
   3624	if (cause & SMB_F)
   3625		csio_smb_intr_handler(hw);
   3626
   3627	if (cause & XGMAC0_F)
   3628		csio_xgmac_intr_handler(hw, 0);
   3629
   3630	if (cause & XGMAC1_F)
   3631		csio_xgmac_intr_handler(hw, 1);
   3632
   3633	if (cause & XGMAC_KR0_F)
   3634		csio_xgmac_intr_handler(hw, 2);
   3635
   3636	if (cause & XGMAC_KR1_F)
   3637		csio_xgmac_intr_handler(hw, 3);
   3638
   3639	if (cause & PCIE_F)
   3640		hw->chip_ops->chip_pcie_intr_handler(hw);
   3641
   3642	if (cause & MC_F)
   3643		csio_mem_intr_handler(hw, MEM_MC);
   3644
   3645	if (cause & EDC0_F)
   3646		csio_mem_intr_handler(hw, MEM_EDC0);
   3647
   3648	if (cause & EDC1_F)
   3649		csio_mem_intr_handler(hw, MEM_EDC1);
   3650
   3651	if (cause & LE_F)
   3652		csio_le_intr_handler(hw);
   3653
   3654	if (cause & TP_F)
   3655		csio_tp_intr_handler(hw);
   3656
   3657	if (cause & MA_F)
   3658		csio_ma_intr_handler(hw);
   3659
   3660	if (cause & PM_TX_F)
   3661		csio_pmtx_intr_handler(hw);
   3662
   3663	if (cause & PM_RX_F)
   3664		csio_pmrx_intr_handler(hw);
   3665
   3666	if (cause & ULP_RX_F)
   3667		csio_ulprx_intr_handler(hw);
   3668
   3669	if (cause & CPL_SWITCH_F)
   3670		csio_cplsw_intr_handler(hw);
   3671
   3672	if (cause & SGE_F)
   3673		csio_sge_intr_handler(hw);
   3674
   3675	if (cause & ULP_TX_F)
   3676		csio_ulptx_intr_handler(hw);
   3677
   3678	/* Clear the interrupts just processed for which we are the master. */
   3679	csio_wr_reg32(hw, cause & CSIO_GLBL_INTR_MASK, PL_INT_CAUSE_A);
   3680	csio_rd_reg32(hw, PL_INT_CAUSE_A); /* flush */
   3681
   3682	return 1;
   3683}
   3684
   3685/*****************************************************************************
   3686 * HW <--> mailbox interfacing routines.
   3687 ****************************************************************************/
   3688/*
   3689 * csio_mberr_worker - Worker thread (dpc) for mailbox/error completions
   3690 *
   3691 * @data: Private data pointer.
   3692 *
   3693 * Called from worker thread context.
   3694 */
   3695static void
   3696csio_mberr_worker(void *data)
   3697{
   3698	struct csio_hw *hw = (struct csio_hw *)data;
   3699	struct csio_mbm *mbm = &hw->mbm;
   3700	LIST_HEAD(cbfn_q);
   3701	struct csio_mb *mbp_next;
   3702	int rv;
   3703
   3704	del_timer_sync(&mbm->timer);
   3705
   3706	spin_lock_irq(&hw->lock);
   3707	if (list_empty(&mbm->cbfn_q)) {
   3708		spin_unlock_irq(&hw->lock);
   3709		return;
   3710	}
   3711
   3712	list_splice_tail_init(&mbm->cbfn_q, &cbfn_q);
   3713	mbm->stats.n_cbfnq = 0;
   3714
   3715	/* Try to start waiting mailboxes */
   3716	if (!list_empty(&mbm->req_q)) {
   3717		mbp_next = list_first_entry(&mbm->req_q, struct csio_mb, list);
   3718		list_del_init(&mbp_next->list);
   3719
   3720		rv = csio_mb_issue(hw, mbp_next);
   3721		if (rv != 0)
   3722			list_add_tail(&mbp_next->list, &mbm->req_q);
   3723		else
   3724			CSIO_DEC_STATS(mbm, n_activeq);
   3725	}
   3726	spin_unlock_irq(&hw->lock);
   3727
   3728	/* Now callback completions */
   3729	csio_mb_completions(hw, &cbfn_q);
   3730}
   3731
   3732/*
   3733 * csio_hw_mb_timer - Top-level Mailbox timeout handler.
   3734 *
   3735 * @data: private data pointer
   3736 *
   3737 **/
   3738static void
   3739csio_hw_mb_timer(struct timer_list *t)
   3740{
   3741	struct csio_mbm *mbm = from_timer(mbm, t, timer);
   3742	struct csio_hw *hw = mbm->hw;
   3743	struct csio_mb *mbp = NULL;
   3744
   3745	spin_lock_irq(&hw->lock);
   3746	mbp = csio_mb_tmo_handler(hw);
   3747	spin_unlock_irq(&hw->lock);
   3748
   3749	/* Call back the function for the timed-out Mailbox */
   3750	if (mbp)
   3751		mbp->mb_cbfn(hw, mbp);
   3752
   3753}
   3754
   3755/*
   3756 * csio_hw_mbm_cleanup - Cleanup Mailbox module.
   3757 * @hw: HW module
   3758 *
   3759 * Called with lock held, should exit with lock held.
   3760 * Cancels outstanding mailboxes (waiting, in-flight) and gathers them
   3761 * into a local queue. Drops lock and calls the completions. Holds
   3762 * lock and returns.
   3763 */
   3764static void
   3765csio_hw_mbm_cleanup(struct csio_hw *hw)
   3766{
   3767	LIST_HEAD(cbfn_q);
   3768
   3769	csio_mb_cancel_all(hw, &cbfn_q);
   3770
   3771	spin_unlock_irq(&hw->lock);
   3772	csio_mb_completions(hw, &cbfn_q);
   3773	spin_lock_irq(&hw->lock);
   3774}
   3775
   3776/*****************************************************************************
   3777 * Event handling
   3778 ****************************************************************************/
   3779int
   3780csio_enqueue_evt(struct csio_hw *hw, enum csio_evt type, void *evt_msg,
   3781			uint16_t len)
   3782{
   3783	struct csio_evt_msg *evt_entry = NULL;
   3784
   3785	if (type >= CSIO_EVT_MAX)
   3786		return -EINVAL;
   3787
   3788	if (len > CSIO_EVT_MSG_SIZE)
   3789		return -EINVAL;
   3790
   3791	if (hw->flags & CSIO_HWF_FWEVT_STOP)
   3792		return -EINVAL;
   3793
   3794	if (list_empty(&hw->evt_free_q)) {
   3795		csio_err(hw, "Failed to alloc evt entry, msg type %d len %d\n",
   3796			 type, len);
   3797		return -ENOMEM;
   3798	}
   3799
   3800	evt_entry = list_first_entry(&hw->evt_free_q,
   3801				     struct csio_evt_msg, list);
   3802	list_del_init(&evt_entry->list);
   3803
   3804	/* copy event msg and queue the event */
   3805	evt_entry->type = type;
   3806	memcpy((void *)evt_entry->data, evt_msg, len);
   3807	list_add_tail(&evt_entry->list, &hw->evt_active_q);
   3808
   3809	CSIO_DEC_STATS(hw, n_evt_freeq);
   3810	CSIO_INC_STATS(hw, n_evt_activeq);
   3811
   3812	return 0;
   3813}
   3814
   3815static int
   3816csio_enqueue_evt_lock(struct csio_hw *hw, enum csio_evt type, void *evt_msg,
   3817			uint16_t len, bool msg_sg)
   3818{
   3819	struct csio_evt_msg *evt_entry = NULL;
   3820	struct csio_fl_dma_buf *fl_sg;
   3821	uint32_t off = 0;
   3822	unsigned long flags;
   3823	int n, ret = 0;
   3824
   3825	if (type >= CSIO_EVT_MAX)
   3826		return -EINVAL;
   3827
   3828	if (len > CSIO_EVT_MSG_SIZE)
   3829		return -EINVAL;
   3830
   3831	spin_lock_irqsave(&hw->lock, flags);
   3832	if (hw->flags & CSIO_HWF_FWEVT_STOP) {
   3833		ret = -EINVAL;
   3834		goto out;
   3835	}
   3836
   3837	if (list_empty(&hw->evt_free_q)) {
   3838		csio_err(hw, "Failed to alloc evt entry, msg type %d len %d\n",
   3839			 type, len);
   3840		ret = -ENOMEM;
   3841		goto out;
   3842	}
   3843
   3844	evt_entry = list_first_entry(&hw->evt_free_q,
   3845				     struct csio_evt_msg, list);
   3846	list_del_init(&evt_entry->list);
   3847
   3848	/* copy event msg and queue the event */
   3849	evt_entry->type = type;
   3850
   3851	/* If Payload in SG list*/
   3852	if (msg_sg) {
   3853		fl_sg = (struct csio_fl_dma_buf *) evt_msg;
   3854		for (n = 0; (n < CSIO_MAX_FLBUF_PER_IQWR && off < len); n++) {
   3855			memcpy((void *)((uintptr_t)evt_entry->data + off),
   3856				fl_sg->flbufs[n].vaddr,
   3857				fl_sg->flbufs[n].len);
   3858			off += fl_sg->flbufs[n].len;
   3859		}
   3860	} else
   3861		memcpy((void *)evt_entry->data, evt_msg, len);
   3862
   3863	list_add_tail(&evt_entry->list, &hw->evt_active_q);
   3864	CSIO_DEC_STATS(hw, n_evt_freeq);
   3865	CSIO_INC_STATS(hw, n_evt_activeq);
   3866out:
   3867	spin_unlock_irqrestore(&hw->lock, flags);
   3868	return ret;
   3869}
   3870
   3871static void
   3872csio_free_evt(struct csio_hw *hw, struct csio_evt_msg *evt_entry)
   3873{
   3874	if (evt_entry) {
   3875		spin_lock_irq(&hw->lock);
   3876		list_del_init(&evt_entry->list);
   3877		list_add_tail(&evt_entry->list, &hw->evt_free_q);
   3878		CSIO_DEC_STATS(hw, n_evt_activeq);
   3879		CSIO_INC_STATS(hw, n_evt_freeq);
   3880		spin_unlock_irq(&hw->lock);
   3881	}
   3882}
   3883
   3884void
   3885csio_evtq_flush(struct csio_hw *hw)
   3886{
   3887	uint32_t count;
   3888	count = 30;
   3889	while (hw->flags & CSIO_HWF_FWEVT_PENDING && count--) {
   3890		spin_unlock_irq(&hw->lock);
   3891		msleep(2000);
   3892		spin_lock_irq(&hw->lock);
   3893	}
   3894
   3895	CSIO_DB_ASSERT(!(hw->flags & CSIO_HWF_FWEVT_PENDING));
   3896}
   3897
   3898static void
   3899csio_evtq_stop(struct csio_hw *hw)
   3900{
   3901	hw->flags |= CSIO_HWF_FWEVT_STOP;
   3902}
   3903
   3904static void
   3905csio_evtq_start(struct csio_hw *hw)
   3906{
   3907	hw->flags &= ~CSIO_HWF_FWEVT_STOP;
   3908}
   3909
   3910static void
   3911csio_evtq_cleanup(struct csio_hw *hw)
   3912{
   3913	struct list_head *evt_entry, *next_entry;
   3914
   3915	/* Release outstanding events from activeq to freeq*/
   3916	if (!list_empty(&hw->evt_active_q))
   3917		list_splice_tail_init(&hw->evt_active_q, &hw->evt_free_q);
   3918
   3919	hw->stats.n_evt_activeq = 0;
   3920	hw->flags &= ~CSIO_HWF_FWEVT_PENDING;
   3921
   3922	/* Freeup event entry */
   3923	list_for_each_safe(evt_entry, next_entry, &hw->evt_free_q) {
   3924		kfree(evt_entry);
   3925		CSIO_DEC_STATS(hw, n_evt_freeq);
   3926	}
   3927
   3928	hw->stats.n_evt_freeq = 0;
   3929}
   3930
   3931
   3932static void
   3933csio_process_fwevtq_entry(struct csio_hw *hw, void *wr, uint32_t len,
   3934			  struct csio_fl_dma_buf *flb, void *priv)
   3935{
   3936	__u8 op;
   3937	void *msg = NULL;
   3938	uint32_t msg_len = 0;
   3939	bool msg_sg = 0;
   3940
   3941	op = ((struct rss_header *) wr)->opcode;
   3942	if (op == CPL_FW6_PLD) {
   3943		CSIO_INC_STATS(hw, n_cpl_fw6_pld);
   3944		if (!flb || !flb->totlen) {
   3945			CSIO_INC_STATS(hw, n_cpl_unexp);
   3946			return;
   3947		}
   3948
   3949		msg = (void *) flb;
   3950		msg_len = flb->totlen;
   3951		msg_sg = 1;
   3952	} else if (op == CPL_FW6_MSG || op == CPL_FW4_MSG) {
   3953
   3954		CSIO_INC_STATS(hw, n_cpl_fw6_msg);
   3955		/* skip RSS header */
   3956		msg = (void *)((uintptr_t)wr + sizeof(__be64));
   3957		msg_len = (op == CPL_FW6_MSG) ? sizeof(struct cpl_fw6_msg) :
   3958			   sizeof(struct cpl_fw4_msg);
   3959	} else {
   3960		csio_warn(hw, "unexpected CPL %#x on FW event queue\n", op);
   3961		CSIO_INC_STATS(hw, n_cpl_unexp);
   3962		return;
   3963	}
   3964
   3965	/*
   3966	 * Enqueue event to EventQ. Events processing happens
   3967	 * in Event worker thread context
   3968	 */
   3969	if (csio_enqueue_evt_lock(hw, CSIO_EVT_FW, msg,
   3970				  (uint16_t)msg_len, msg_sg))
   3971		CSIO_INC_STATS(hw, n_evt_drop);
   3972}
   3973
   3974void
   3975csio_evtq_worker(struct work_struct *work)
   3976{
   3977	struct csio_hw *hw = container_of(work, struct csio_hw, evtq_work);
   3978	struct list_head *evt_entry, *next_entry;
   3979	LIST_HEAD(evt_q);
   3980	struct csio_evt_msg	*evt_msg;
   3981	struct cpl_fw6_msg *msg;
   3982	struct csio_rnode *rn;
   3983	int rv = 0;
   3984	uint8_t evtq_stop = 0;
   3985
   3986	csio_dbg(hw, "event worker thread active evts#%d\n",
   3987		 hw->stats.n_evt_activeq);
   3988
   3989	spin_lock_irq(&hw->lock);
   3990	while (!list_empty(&hw->evt_active_q)) {
   3991		list_splice_tail_init(&hw->evt_active_q, &evt_q);
   3992		spin_unlock_irq(&hw->lock);
   3993
   3994		list_for_each_safe(evt_entry, next_entry, &evt_q) {
   3995			evt_msg = (struct csio_evt_msg *) evt_entry;
   3996
   3997			/* Drop events if queue is STOPPED */
   3998			spin_lock_irq(&hw->lock);
   3999			if (hw->flags & CSIO_HWF_FWEVT_STOP)
   4000				evtq_stop = 1;
   4001			spin_unlock_irq(&hw->lock);
   4002			if (evtq_stop) {
   4003				CSIO_INC_STATS(hw, n_evt_drop);
   4004				goto free_evt;
   4005			}
   4006
   4007			switch (evt_msg->type) {
   4008			case CSIO_EVT_FW:
   4009				msg = (struct cpl_fw6_msg *)(evt_msg->data);
   4010
   4011				if ((msg->opcode == CPL_FW6_MSG ||
   4012				     msg->opcode == CPL_FW4_MSG) &&
   4013				    !msg->type) {
   4014					rv = csio_mb_fwevt_handler(hw,
   4015								msg->data);
   4016					if (!rv)
   4017						break;
   4018					/* Handle any remaining fw events */
   4019					csio_fcoe_fwevt_handler(hw,
   4020							msg->opcode, msg->data);
   4021				} else if (msg->opcode == CPL_FW6_PLD) {
   4022
   4023					csio_fcoe_fwevt_handler(hw,
   4024							msg->opcode, msg->data);
   4025				} else {
   4026					csio_warn(hw,
   4027					     "Unhandled FW msg op %x type %x\n",
   4028						  msg->opcode, msg->type);
   4029					CSIO_INC_STATS(hw, n_evt_drop);
   4030				}
   4031				break;
   4032
   4033			case CSIO_EVT_MBX:
   4034				csio_mberr_worker(hw);
   4035				break;
   4036
   4037			case CSIO_EVT_DEV_LOSS:
   4038				memcpy(&rn, evt_msg->data, sizeof(rn));
   4039				csio_rnode_devloss_handler(rn);
   4040				break;
   4041
   4042			default:
   4043				csio_warn(hw, "Unhandled event %x on evtq\n",
   4044					  evt_msg->type);
   4045				CSIO_INC_STATS(hw, n_evt_unexp);
   4046				break;
   4047			}
   4048free_evt:
   4049			csio_free_evt(hw, evt_msg);
   4050		}
   4051
   4052		spin_lock_irq(&hw->lock);
   4053	}
   4054	hw->flags &= ~CSIO_HWF_FWEVT_PENDING;
   4055	spin_unlock_irq(&hw->lock);
   4056}
   4057
   4058int
   4059csio_fwevtq_handler(struct csio_hw *hw)
   4060{
   4061	int rv;
   4062
   4063	if (csio_q_iqid(hw, hw->fwevt_iq_idx) == CSIO_MAX_QID) {
   4064		CSIO_INC_STATS(hw, n_int_stray);
   4065		return -EINVAL;
   4066	}
   4067
   4068	rv = csio_wr_process_iq_idx(hw, hw->fwevt_iq_idx,
   4069			   csio_process_fwevtq_entry, NULL);
   4070	return rv;
   4071}
   4072
   4073/****************************************************************************
   4074 * Entry points
   4075 ****************************************************************************/
   4076
   4077/* Management module */
   4078/*
   4079 * csio_mgmt_req_lookup - Lookup the given IO req exist in Active Q.
   4080 * mgmt - mgmt module
   4081 * @io_req - io request
   4082 *
   4083 * Return - 0:if given IO Req exists in active Q.
   4084 *          -EINVAL  :if lookup fails.
   4085 */
   4086int
   4087csio_mgmt_req_lookup(struct csio_mgmtm *mgmtm, struct csio_ioreq *io_req)
   4088{
   4089	struct list_head *tmp;
   4090
   4091	/* Lookup ioreq in the ACTIVEQ */
   4092	list_for_each(tmp, &mgmtm->active_q) {
   4093		if (io_req == (struct csio_ioreq *)tmp)
   4094			return 0;
   4095	}
   4096	return -EINVAL;
   4097}
   4098
   4099#define	ECM_MIN_TMO	1000	/* Minimum timeout value for req */
   4100
   4101/*
   4102 * csio_mgmts_tmo_handler - MGMT IO Timeout handler.
   4103 * @data - Event data.
   4104 *
   4105 * Return - none.
   4106 */
   4107static void
   4108csio_mgmt_tmo_handler(struct timer_list *t)
   4109{
   4110	struct csio_mgmtm *mgmtm = from_timer(mgmtm, t, mgmt_timer);
   4111	struct list_head *tmp;
   4112	struct csio_ioreq *io_req;
   4113
   4114	csio_dbg(mgmtm->hw, "Mgmt timer invoked!\n");
   4115
   4116	spin_lock_irq(&mgmtm->hw->lock);
   4117
   4118	list_for_each(tmp, &mgmtm->active_q) {
   4119		io_req = (struct csio_ioreq *) tmp;
   4120		io_req->tmo -= min_t(uint32_t, io_req->tmo, ECM_MIN_TMO);
   4121
   4122		if (!io_req->tmo) {
   4123			/* Dequeue the request from retry Q. */
   4124			tmp = csio_list_prev(tmp);
   4125			list_del_init(&io_req->sm.sm_list);
   4126			if (io_req->io_cbfn) {
   4127				/* io_req will be freed by completion handler */
   4128				io_req->wr_status = -ETIMEDOUT;
   4129				io_req->io_cbfn(mgmtm->hw, io_req);
   4130			} else {
   4131				CSIO_DB_ASSERT(0);
   4132			}
   4133		}
   4134	}
   4135
   4136	/* If retry queue is not empty, re-arm timer */
   4137	if (!list_empty(&mgmtm->active_q))
   4138		mod_timer(&mgmtm->mgmt_timer,
   4139			  jiffies + msecs_to_jiffies(ECM_MIN_TMO));
   4140	spin_unlock_irq(&mgmtm->hw->lock);
   4141}
   4142
   4143static void
   4144csio_mgmtm_cleanup(struct csio_mgmtm *mgmtm)
   4145{
   4146	struct csio_hw *hw = mgmtm->hw;
   4147	struct csio_ioreq *io_req;
   4148	struct list_head *tmp;
   4149	uint32_t count;
   4150
   4151	count = 30;
   4152	/* Wait for all outstanding req to complete gracefully */
   4153	while ((!list_empty(&mgmtm->active_q)) && count--) {
   4154		spin_unlock_irq(&hw->lock);
   4155		msleep(2000);
   4156		spin_lock_irq(&hw->lock);
   4157	}
   4158
   4159	/* release outstanding req from ACTIVEQ */
   4160	list_for_each(tmp, &mgmtm->active_q) {
   4161		io_req = (struct csio_ioreq *) tmp;
   4162		tmp = csio_list_prev(tmp);
   4163		list_del_init(&io_req->sm.sm_list);
   4164		mgmtm->stats.n_active--;
   4165		if (io_req->io_cbfn) {
   4166			/* io_req will be freed by completion handler */
   4167			io_req->wr_status = -ETIMEDOUT;
   4168			io_req->io_cbfn(mgmtm->hw, io_req);
   4169		}
   4170	}
   4171}
   4172
   4173/*
   4174 * csio_mgmt_init - Mgmt module init entry point
   4175 * @mgmtsm - mgmt module
   4176 * @hw	 - HW module
   4177 *
   4178 * Initialize mgmt timer, resource wait queue, active queue,
   4179 * completion q. Allocate Egress and Ingress
   4180 * WR queues and save off the queue index returned by the WR
   4181 * module for future use. Allocate and save off mgmt reqs in the
   4182 * mgmt_req_freelist for future use. Make sure their SM is initialized
   4183 * to uninit state.
   4184 * Returns: 0 - on success
   4185 *          -ENOMEM   - on error.
   4186 */
   4187static int
   4188csio_mgmtm_init(struct csio_mgmtm *mgmtm, struct csio_hw *hw)
   4189{
   4190	timer_setup(&mgmtm->mgmt_timer, csio_mgmt_tmo_handler, 0);
   4191
   4192	INIT_LIST_HEAD(&mgmtm->active_q);
   4193	INIT_LIST_HEAD(&mgmtm->cbfn_q);
   4194
   4195	mgmtm->hw = hw;
   4196	/*mgmtm->iq_idx = hw->fwevt_iq_idx;*/
   4197
   4198	return 0;
   4199}
   4200
   4201/*
   4202 * csio_mgmtm_exit - MGMT module exit entry point
   4203 * @mgmtsm - mgmt module
   4204 *
   4205 * This function called during MGMT module uninit.
   4206 * Stop timers, free ioreqs allocated.
   4207 * Returns: None
   4208 *
   4209 */
   4210static void
   4211csio_mgmtm_exit(struct csio_mgmtm *mgmtm)
   4212{
   4213	del_timer_sync(&mgmtm->mgmt_timer);
   4214}
   4215
   4216
   4217/**
   4218 * csio_hw_start - Kicks off the HW State machine
   4219 * @hw:		Pointer to HW module.
   4220 *
   4221 * It is assumed that the initialization is a synchronous operation.
   4222 * So when we return after posting the event, the HW SM should be in
   4223 * the ready state, if there were no errors during init.
   4224 */
   4225int
   4226csio_hw_start(struct csio_hw *hw)
   4227{
   4228	spin_lock_irq(&hw->lock);
   4229	csio_post_event(&hw->sm, CSIO_HWE_CFG);
   4230	spin_unlock_irq(&hw->lock);
   4231
   4232	if (csio_is_hw_ready(hw))
   4233		return 0;
   4234	else if (csio_match_state(hw, csio_hws_uninit))
   4235		return -EINVAL;
   4236	else
   4237		return -ENODEV;
   4238}
   4239
   4240int
   4241csio_hw_stop(struct csio_hw *hw)
   4242{
   4243	csio_post_event(&hw->sm, CSIO_HWE_PCI_REMOVE);
   4244
   4245	if (csio_is_hw_removing(hw))
   4246		return 0;
   4247	else
   4248		return -EINVAL;
   4249}
   4250
   4251/* Max reset retries */
   4252#define CSIO_MAX_RESET_RETRIES	3
   4253
   4254/**
   4255 * csio_hw_reset - Reset the hardware
   4256 * @hw:		HW module.
   4257 *
   4258 * Caller should hold lock across this function.
   4259 */
   4260int
   4261csio_hw_reset(struct csio_hw *hw)
   4262{
   4263	if (!csio_is_hw_master(hw))
   4264		return -EPERM;
   4265
   4266	if (hw->rst_retries >= CSIO_MAX_RESET_RETRIES) {
   4267		csio_dbg(hw, "Max hw reset attempts reached..");
   4268		return -EINVAL;
   4269	}
   4270
   4271	hw->rst_retries++;
   4272	csio_post_event(&hw->sm, CSIO_HWE_HBA_RESET);
   4273
   4274	if (csio_is_hw_ready(hw)) {
   4275		hw->rst_retries = 0;
   4276		hw->stats.n_reset_start = jiffies_to_msecs(jiffies);
   4277		return 0;
   4278	} else
   4279		return -EINVAL;
   4280}
   4281
   4282/*
   4283 * csio_hw_get_device_id - Caches the Adapter's vendor & device id.
   4284 * @hw: HW module.
   4285 */
   4286static void
   4287csio_hw_get_device_id(struct csio_hw *hw)
   4288{
   4289	/* Is the adapter device id cached already ?*/
   4290	if (csio_is_dev_id_cached(hw))
   4291		return;
   4292
   4293	/* Get the PCI vendor & device id */
   4294	pci_read_config_word(hw->pdev, PCI_VENDOR_ID,
   4295			     &hw->params.pci.vendor_id);
   4296	pci_read_config_word(hw->pdev, PCI_DEVICE_ID,
   4297			     &hw->params.pci.device_id);
   4298
   4299	csio_dev_id_cached(hw);
   4300	hw->chip_id = (hw->params.pci.device_id & CSIO_HW_CHIP_MASK);
   4301
   4302} /* csio_hw_get_device_id */
   4303
   4304/*
   4305 * csio_hw_set_description - Set the model, description of the hw.
   4306 * @hw: HW module.
   4307 * @ven_id: PCI Vendor ID
   4308 * @dev_id: PCI Device ID
   4309 */
   4310static void
   4311csio_hw_set_description(struct csio_hw *hw, uint16_t ven_id, uint16_t dev_id)
   4312{
   4313	uint32_t adap_type, prot_type;
   4314
   4315	if (ven_id == CSIO_VENDOR_ID) {
   4316		prot_type = (dev_id & CSIO_ASIC_DEVID_PROTO_MASK);
   4317		adap_type = (dev_id & CSIO_ASIC_DEVID_TYPE_MASK);
   4318
   4319		if (prot_type == CSIO_T5_FCOE_ASIC) {
   4320			memcpy(hw->hw_ver,
   4321			       csio_t5_fcoe_adapters[adap_type].model_no, 16);
   4322			memcpy(hw->model_desc,
   4323			       csio_t5_fcoe_adapters[adap_type].description,
   4324			       32);
   4325		} else {
   4326			char tempName[32] = "Chelsio FCoE Controller";
   4327			memcpy(hw->model_desc, tempName, 32);
   4328		}
   4329	}
   4330} /* csio_hw_set_description */
   4331
   4332/**
   4333 * csio_hw_init - Initialize HW module.
   4334 * @hw:		Pointer to HW module.
   4335 *
   4336 * Initialize the members of the HW module.
   4337 */
   4338int
   4339csio_hw_init(struct csio_hw *hw)
   4340{
   4341	int rv = -EINVAL;
   4342	uint32_t i;
   4343	uint16_t ven_id, dev_id;
   4344	struct csio_evt_msg	*evt_entry;
   4345
   4346	INIT_LIST_HEAD(&hw->sm.sm_list);
   4347	csio_init_state(&hw->sm, csio_hws_uninit);
   4348	spin_lock_init(&hw->lock);
   4349	INIT_LIST_HEAD(&hw->sln_head);
   4350
   4351	/* Get the PCI vendor & device id */
   4352	csio_hw_get_device_id(hw);
   4353
   4354	strcpy(hw->name, CSIO_HW_NAME);
   4355
   4356	/* Initialize the HW chip ops T5 specific ops */
   4357	hw->chip_ops = &t5_ops;
   4358
   4359	/* Set the model & its description */
   4360
   4361	ven_id = hw->params.pci.vendor_id;
   4362	dev_id = hw->params.pci.device_id;
   4363
   4364	csio_hw_set_description(hw, ven_id, dev_id);
   4365
   4366	/* Initialize default log level */
   4367	hw->params.log_level = (uint32_t) csio_dbg_level;
   4368
   4369	csio_set_fwevt_intr_idx(hw, -1);
   4370	csio_set_nondata_intr_idx(hw, -1);
   4371
   4372	/* Init all the modules: Mailbox, WorkRequest and Transport */
   4373	if (csio_mbm_init(csio_hw_to_mbm(hw), hw, csio_hw_mb_timer))
   4374		goto err;
   4375
   4376	rv = csio_wrm_init(csio_hw_to_wrm(hw), hw);
   4377	if (rv)
   4378		goto err_mbm_exit;
   4379
   4380	rv = csio_scsim_init(csio_hw_to_scsim(hw), hw);
   4381	if (rv)
   4382		goto err_wrm_exit;
   4383
   4384	rv = csio_mgmtm_init(csio_hw_to_mgmtm(hw), hw);
   4385	if (rv)
   4386		goto err_scsim_exit;
   4387	/* Pre-allocate evtq and initialize them */
   4388	INIT_LIST_HEAD(&hw->evt_active_q);
   4389	INIT_LIST_HEAD(&hw->evt_free_q);
   4390	for (i = 0; i < csio_evtq_sz; i++) {
   4391
   4392		evt_entry = kzalloc(sizeof(struct csio_evt_msg), GFP_KERNEL);
   4393		if (!evt_entry) {
   4394			rv = -ENOMEM;
   4395			csio_err(hw, "Failed to initialize eventq");
   4396			goto err_evtq_cleanup;
   4397		}
   4398
   4399		list_add_tail(&evt_entry->list, &hw->evt_free_q);
   4400		CSIO_INC_STATS(hw, n_evt_freeq);
   4401	}
   4402
   4403	hw->dev_num = dev_num;
   4404	dev_num++;
   4405
   4406	return 0;
   4407
   4408err_evtq_cleanup:
   4409	csio_evtq_cleanup(hw);
   4410	csio_mgmtm_exit(csio_hw_to_mgmtm(hw));
   4411err_scsim_exit:
   4412	csio_scsim_exit(csio_hw_to_scsim(hw));
   4413err_wrm_exit:
   4414	csio_wrm_exit(csio_hw_to_wrm(hw), hw);
   4415err_mbm_exit:
   4416	csio_mbm_exit(csio_hw_to_mbm(hw));
   4417err:
   4418	return rv;
   4419}
   4420
   4421/**
   4422 * csio_hw_exit - Un-initialize HW module.
   4423 * @hw:		Pointer to HW module.
   4424 *
   4425 */
   4426void
   4427csio_hw_exit(struct csio_hw *hw)
   4428{
   4429	csio_evtq_cleanup(hw);
   4430	csio_mgmtm_exit(csio_hw_to_mgmtm(hw));
   4431	csio_scsim_exit(csio_hw_to_scsim(hw));
   4432	csio_wrm_exit(csio_hw_to_wrm(hw), hw);
   4433	csio_mbm_exit(csio_hw_to_mbm(hw));
   4434}