Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4bd8e738 authored by Himanshu Madhani's avatar Himanshu Madhani Committed by David S. Miller
Browse files

qlcnic: Fix for flash update failure on 83xx adapter



Flash update routine was improperly checking register read API return value.
Modify register read API and perform proper error check.

Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b1f5037f
Loading
Loading
Loading
Loading
+3 −9
Original line number Original line Diff line number Diff line
@@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64);
#define ADDR_IN_RANGE(addr, low, high)	\
#define ADDR_IN_RANGE(addr, low, high)	\
	(((addr) < (high)) && ((addr) >= (low)))
	(((addr) < (high)) && ((addr) >= (low)))


#define QLCRD32(adapter, off) \
#define QLCRD32(adapter, off, err) \
	(adapter->ahw->hw_ops->read_reg)(adapter, off)
	(adapter->ahw->hw_ops->read_reg)(adapter, off, err)


#define QLCWR32(adapter, off, val) \
#define QLCWR32(adapter, off, val) \
	adapter->ahw->hw_ops->write_reg(adapter, off, val)
	adapter->ahw->hw_ops->write_reg(adapter, off, val)
@@ -1604,7 +1604,7 @@ struct qlcnic_nic_template {
struct qlcnic_hardware_ops {
struct qlcnic_hardware_ops {
	void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
	void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
	void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
	void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
	int (*read_reg) (struct qlcnic_adapter *, ulong);
	int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
	int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
	int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
	void (*get_ocm_win) (struct qlcnic_hardware_context *);
	void (*get_ocm_win) (struct qlcnic_hardware_context *);
	int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
	int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
@@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
	adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
	adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
}
}


static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter,
				       ulong off)
{
	return adapter->ahw->hw_ops->read_reg(adapter, off);
}

static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
					ulong off, u32 data)
					ulong off, u32 data)
{
{
+60 −41
Original line number Original line Diff line number Diff line
@@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr)
	return 0;
	return 0;
}
}


int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr)
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
				int *err)
{
{
	int ret;
	struct qlcnic_hardware_context *ahw = adapter->ahw;
	struct qlcnic_hardware_context *ahw = adapter->ahw;


	ret = __qlcnic_set_win_base(adapter, (u32) addr);
	*err = __qlcnic_set_win_base(adapter, (u32) addr);
	if (!ret) {
	if (!*err) {
		return QLCRDX(ahw, QLCNIC_WILDCARD);
		return QLCRDX(ahw, QLCNIC_WILDCARD);
	} else {
	} else {
		dev_err(&adapter->pdev->dev,
		dev_err(&adapter->pdev->dev,
			"%s failed, addr = 0x%x\n", __func__, (int)addr);
			"%s failed, addr = 0x%lx\n", __func__, addr);
		return -EIO;
		return -EIO;
	}
	}
}
}
@@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter)
void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
			  loff_t offset, size_t size)
			  loff_t offset, size_t size)
{
{
	int ret;
	int ret = 0;
	u32 data;
	u32 data;


	if (qlcnic_api_lock(adapter)) {
	if (qlcnic_api_lock(adapter)) {
@@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
		return;
		return;
	}
	}


	ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset);
	data = QLCRD32(adapter, (u32) offset, &ret);
	qlcnic_api_unlock(adapter);
	qlcnic_api_unlock(adapter);


	if (ret == -EIO) {
	if (ret == -EIO) {
@@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
			__func__, (u32)offset);
			__func__, (u32)offset);
		return;
		return;
	}
	}
	data = ret;
	memcpy(buf, &data, size);
	memcpy(buf, &data, size);
}
}


@@ -2391,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
				      u32 flash_addr, u8 *p_data,
				      u32 flash_addr, u8 *p_data,
				      int count)
				      int count)
{
{
	int i, ret;
	u32 word, range, flash_offset, addr = flash_addr, ret;
	u32 word, range, flash_offset, addr = flash_addr;
	ulong indirect_add, direct_window;
	ulong indirect_add, direct_window;
	int i, err = 0;


	flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
	flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
	if (addr & 0x3) {
	if (addr & 0x3) {
@@ -2411,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
		/* Multi sector read */
		/* Multi sector read */
		for (i = 0; i < count; i++) {
		for (i = 0; i < count; i++) {
			indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
			indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
			ret = qlcnic_83xx_rd_reg_indirect(adapter,
			ret = QLCRD32(adapter, indirect_add, &err);
							  indirect_add);
			if (err == -EIO)
			if (ret == -EIO)
				return err;
				return -EIO;


			word = ret;
			word = ret;
			*(u32 *)p_data  = word;
			*(u32 *)p_data  = word;
@@ -2435,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
		/* Single sector read */
		/* Single sector read */
		for (i = 0; i < count; i++) {
		for (i = 0; i < count; i++) {
			indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
			indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
			ret = qlcnic_83xx_rd_reg_indirect(adapter,
			ret = QLCRD32(adapter, indirect_add, &err);
							  indirect_add);
			if (err == -EIO)
			if (ret == -EIO)
				return err;
				return -EIO;


			word = ret;
			word = ret;
			*(u32 *)p_data  = word;
			*(u32 *)p_data  = word;
@@ -2454,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
{
{
	u32 status;
	u32 status;
	int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
	int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
	int err = 0;


	do {
	do {
		status = qlcnic_83xx_rd_reg_indirect(adapter,
		status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
						     QLC_83XX_FLASH_STATUS);
		if (err == -EIO)
			return err;

		if ((status & QLC_83XX_FLASH_STATUS_READY) ==
		if ((status & QLC_83XX_FLASH_STATUS_READY) ==
		    QLC_83XX_FLASH_STATUS_READY)
		    QLC_83XX_FLASH_STATUS_READY)
			break;
			break;
@@ -2509,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter)


int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
{
{
	int ret, mfg_id;
	int ret, err = 0;
	u32 mfg_id;


	if (qlcnic_83xx_lock_flash(adapter))
	if (qlcnic_83xx_lock_flash(adapter))
		return -EIO;
		return -EIO;
@@ -2524,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
		return -EIO;
		return -EIO;
	}
	}


	mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
	mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
	if (mfg_id == -EIO)
	if (err == -EIO) {
		return -EIO;
		qlcnic_83xx_unlock_flash(adapter);
		return err;
	}


	adapter->flash_mfg_id = (mfg_id & 0xFF);
	adapter->flash_mfg_id = (mfg_id & 0xFF);
	qlcnic_83xx_unlock_flash(adapter);
	qlcnic_83xx_unlock_flash(adapter);
@@ -2643,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
				 u32 *p_data, int count)
				 u32 *p_data, int count)
{
{
	u32 temp;
	u32 temp;
	int ret = -EIO;
	int ret = -EIO, err = 0;


	if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
	if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
	    (count > QLC_83XX_FLASH_WRITE_MAX)) {
	    (count > QLC_83XX_FLASH_WRITE_MAX)) {
@@ -2652,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
		return -EIO;
		return -EIO;
	}
	}


	temp = qlcnic_83xx_rd_reg_indirect(adapter,
	temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
					   QLC_83XX_FLASH_SPI_CONTROL);
	if (err == -EIO)
		return err;

	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
				     (temp | QLC_83XX_FLASH_SPI_CTRL));
				     (temp | QLC_83XX_FLASH_SPI_CTRL));
	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
@@ -2702,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
		return -EIO;
		return -EIO;
	}
	}


	ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS);
	ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
	if (err == -EIO)
		return err;

	if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
	if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
		dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
		dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
			__func__, __LINE__);
			__func__, __LINE__);
		/* Operation failed, clear error bit */
		/* Operation failed, clear error bit */
		temp = qlcnic_83xx_rd_reg_indirect(adapter,
		temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
						   QLC_83XX_FLASH_SPI_CONTROL);
		if (err == -EIO)
			return err;

		qlcnic_83xx_wrt_reg_indirect(adapter,
		qlcnic_83xx_wrt_reg_indirect(adapter,
					     QLC_83XX_FLASH_SPI_CONTROL,
					     QLC_83XX_FLASH_SPI_CONTROL,
					     (temp | QLC_83XX_FLASH_SPI_CTRL));
					     (temp | QLC_83XX_FLASH_SPI_CTRL));
@@ -2830,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
{
{
	int i, j, ret = 0;
	int i, j, ret = 0;
	u32 temp;
	u32 temp;
	int err = 0;


	/* Check alignment */
	/* Check alignment */
	if (addr & 0xF)
	if (addr & 0xF)
@@ -2862,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
					     QLCNIC_TA_WRITE_START);
					     QLCNIC_TA_WRITE_START);


		for (j = 0; j < MAX_CTL_CHECK; j++) {
		for (j = 0; j < MAX_CTL_CHECK; j++) {
			temp = qlcnic_83xx_rd_reg_indirect(adapter,
			temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err);
							   QLCNIC_MS_CTRL);
			if (err == -EIO) {
				mutex_unlock(&adapter->ahw->mem_lock);
				return err;
			}

			if ((temp & TA_CTL_BUSY) == 0)
			if ((temp & TA_CTL_BUSY) == 0)
				break;
				break;
		}
		}
@@ -2885,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
			     u8 *p_data, int count)
			     u8 *p_data, int count)
{
{
	int i, ret;
	u32 word, addr = flash_addr, ret;
	u32 word, addr = flash_addr;
	ulong  indirect_addr;
	ulong  indirect_addr;
	int i, err = 0;


	if (qlcnic_83xx_lock_flash(adapter) != 0)
	if (qlcnic_83xx_lock_flash(adapter) != 0)
		return -EIO;
		return -EIO;
@@ -2907,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
		}
		}


		indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
		indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
		ret = qlcnic_83xx_rd_reg_indirect(adapter,
		ret = QLCRD32(adapter, indirect_addr, &err);
						  indirect_addr);
		if (err == -EIO)
		if (ret == -EIO)
			return err;
			return -EIO;

		word = ret;
		word = ret;
		*(u32 *)p_data  = word;
		*(u32 *)p_data  = word;
		p_data = p_data + 4;
		p_data = p_data + 4;
@@ -3376,7 +3391,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter,


static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
{
{
	int ret;
	int ret, err = 0;
	u32 temp;


	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
	qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
				     QLC_83XX_FLASH_OEM_READ_SIG);
				     QLC_83XX_FLASH_OEM_READ_SIG);
@@ -3386,8 +3402,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
	if (ret)
	if (ret)
		return -EIO;
		return -EIO;


	ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA);
	temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
	return ret & 0xFF;
	if (err == -EIO)
		return err;

	return temp & 0xFF;
}
}


int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
+1 −1
Original line number Original line Diff line number Diff line
@@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *);
void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong);
int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *);
int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
+61 −30
Original line number Original line Diff line number Diff line
@@ -1303,8 +1303,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
{
{
	int i, j;
	int i, j;
	u32 val = 0, val1 = 0, reg = 0;
	u32 val = 0, val1 = 0, reg = 0;
	int err = 0;


	val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG);
	val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
	if (err == -EIO)
		return;
	dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
	dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);


	for (j = 0; j < 2; j++) {
	for (j = 0; j < 2; j++) {
@@ -1318,7 +1321,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
			reg = QLC_83XX_PORT1_THRESHOLD;
			reg = QLC_83XX_PORT1_THRESHOLD;
		}
		}
		for (i = 0; i < 8; i++) {
		for (i = 0; i < 8; i++) {
			val = QLCRD32(adapter, reg + (i * 0x4));
			val = QLCRD32(adapter, reg + (i * 0x4), &err);
			if (err == -EIO)
				return;
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
		}
		}
		dev_info(&adapter->pdev->dev, "\n");
		dev_info(&adapter->pdev->dev, "\n");
@@ -1335,7 +1340,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
			reg = QLC_83XX_PORT1_TC_MC_REG;
			reg = QLC_83XX_PORT1_TC_MC_REG;
		}
		}
		for (i = 0; i < 4; i++) {
		for (i = 0; i < 4; i++) {
			val = QLCRD32(adapter, reg + (i * 0x4));
			val = QLCRD32(adapter, reg + (i * 0x4), &err);
			if (err == -EIO)
				return;
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
		}
		}
		dev_info(&adapter->pdev->dev, "\n");
		dev_info(&adapter->pdev->dev, "\n");
@@ -1352,17 +1359,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
			reg = QLC_83XX_PORT1_TC_STATS;
			reg = QLC_83XX_PORT1_TC_STATS;
		}
		}
		for (i = 7; i >= 0; i--) {
		for (i = 7; i >= 0; i--) {
			val = QLCRD32(adapter, reg);
			val = QLCRD32(adapter, reg, &err);
			if (err == -EIO)
				return;
			val &= ~(0x7 << 29);    /* Reset bits 29 to 31 */
			val &= ~(0x7 << 29);    /* Reset bits 29 to 31 */
			QLCWR32(adapter, reg, (val | (i << 29)));
			QLCWR32(adapter, reg, (val | (i << 29)));
			val = QLCRD32(adapter, reg);
			val = QLCRD32(adapter, reg, &err);
			if (err == -EIO)
				return;
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
			dev_info(&adapter->pdev->dev, "0x%x  ", val);
		}
		}
		dev_info(&adapter->pdev->dev, "\n");
		dev_info(&adapter->pdev->dev, "\n");
	}
	}


	val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD);
	val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
	val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD);
	if (err == -EIO)
		return;
	val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
	if (err == -EIO)
		return;
	dev_info(&adapter->pdev->dev,
	dev_info(&adapter->pdev->dev,
		 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
		 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
		 val, val1);
		 val, val1);
@@ -1425,7 +1440,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
{
{
	u32 heartbeat, peg_status;
	u32 heartbeat, peg_status;
	int retries, ret = -EIO;
	int retries, ret = -EIO, err = 0;


	retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
	retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
	p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
	p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
@@ -1453,11 +1468,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
			 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
			 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
			 "PEG_NET_4_PC: 0x%x\n", peg_status,
			 "PEG_NET_4_PC: 0x%x\n", peg_status,
			 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
			 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4));
			 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));


		if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
		if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
			dev_err(&p_dev->pdev->dev,
			dev_err(&p_dev->pdev->dev,
@@ -1501,18 +1516,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
				int duration, u32 mask, u32 status)
				int duration, u32 mask, u32 status)
{
{
	int timeout_error, err = 0;
	u32 value;
	u32 value;
	int timeout_error;
	u8 retries;
	u8 retries;


	value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
	value = QLCRD32(p_dev, addr, &err);
	if (err == -EIO)
		return err;
	retries = duration / 10;
	retries = duration / 10;


	do {
	do {
		if ((value & mask) != status) {
		if ((value & mask) != status) {
			timeout_error = 1;
			timeout_error = 1;
			msleep(duration / 10);
			msleep(duration / 10);
			value = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
			value = QLCRD32(p_dev, addr, &err);
			if (err == -EIO)
				return err;
		} else {
		} else {
			timeout_error = 0;
			timeout_error = 0;
			break;
			break;
@@ -1606,9 +1625,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
					   u32 raddr, u32 waddr)
					   u32 raddr, u32 waddr)
{
{
	int value;
	int err = 0;
	u32 value;


	value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
	value = QLCRD32(p_dev, raddr, &err);
	if (err == -EIO)
		return;
	qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
	qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
}
}


@@ -1617,12 +1639,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
				    u32 raddr, u32 waddr,
				    u32 raddr, u32 waddr,
				    struct qlc_83xx_rmw *p_rmw_hdr)
				    struct qlc_83xx_rmw *p_rmw_hdr)
{
{
	int value;
	int err = 0;
	u32 value;


	if (p_rmw_hdr->index_a)
	if (p_rmw_hdr->index_a) {
		value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
		value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
	else
	} else {
		value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr);
		value = QLCRD32(p_dev, raddr, &err);
		if (err == -EIO)
			return;
	}


	value &= p_rmw_hdr->mask;
	value &= p_rmw_hdr->mask;
	value <<= p_rmw_hdr->shl;
	value <<= p_rmw_hdr->shl;
@@ -1675,7 +1701,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
	long delay;
	long delay;
	struct qlc_83xx_entry *entry;
	struct qlc_83xx_entry *entry;
	struct qlc_83xx_poll *poll;
	struct qlc_83xx_poll *poll;
	int i;
	int i, err = 0;
	unsigned long arg1, arg2;
	unsigned long arg1, arg2;


	poll = (struct qlc_83xx_poll *)((char *)p_hdr +
	poll = (struct qlc_83xx_poll *)((char *)p_hdr +
@@ -1699,10 +1725,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
							 arg1, delay,
							 arg1, delay,
							 poll->mask,
							 poll->mask,
							 poll->status)){
							 poll->status)){
					qlcnic_83xx_rd_reg_indirect(p_dev,
					QLCRD32(p_dev, arg1, &err);
								    arg1);
					if (err == -EIO)
					qlcnic_83xx_rd_reg_indirect(p_dev,
						return;
								    arg2);
					QLCRD32(p_dev, arg2, &err);
					if (err == -EIO)
						return;
				}
				}
			}
			}
		}
		}
@@ -1768,7 +1796,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
				       struct qlc_83xx_entry_hdr *p_hdr)
				       struct qlc_83xx_entry_hdr *p_hdr)
{
{
	long delay;
	long delay;
	int index, i, j;
	int index, i, j, err;
	struct qlc_83xx_quad_entry *entry;
	struct qlc_83xx_quad_entry *entry;
	struct qlc_83xx_poll *poll;
	struct qlc_83xx_poll *poll;
	unsigned long addr;
	unsigned long addr;
@@ -1788,7 +1816,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
						  poll->mask, poll->status)){
						  poll->mask, poll->status)){
				index = p_dev->ahw->reset.array_index;
				index = p_dev->ahw->reset.array_index;
				addr = entry->dr_addr;
				addr = entry->dr_addr;
				j = qlcnic_83xx_rd_reg_indirect(p_dev, addr);
				j = QLCRD32(p_dev, addr, &err);
				if (err == -EIO)
					return;

				p_dev->ahw->reset.array[index++] = j;
				p_dev->ahw->reset.array[index++] = j;


				if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
				if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
+5 −5
Original line number Original line Diff line number Diff line
@@ -104,7 +104,7 @@ static u32
qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
{
{
	u32 rsp;
	u32 rsp;
	int timeout = 0;
	int timeout = 0, err = 0;


	do {
	do {
		/* give atleast 1ms for firmware to respond */
		/* give atleast 1ms for firmware to respond */
@@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
		if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
		if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
			return QLCNIC_CDRP_RSP_TIMEOUT;
			return QLCNIC_CDRP_RSP_TIMEOUT;


		rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET);
		rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err);
	} while (!QLCNIC_CDRP_IS_RSP(rsp));
	} while (!QLCNIC_CDRP_IS_RSP(rsp));


	return rsp;
	return rsp;
@@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
			  struct qlcnic_cmd_args *cmd)
			  struct qlcnic_cmd_args *cmd)
{
{
	int i;
	int i, err = 0;
	u32 rsp;
	u32 rsp;
	u32 signature;
	u32 signature;
	struct pci_dev *pdev = adapter->pdev;
	struct pci_dev *pdev = adapter->pdev;
@@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
		dev_err(&pdev->dev, "card response timeout.\n");
		dev_err(&pdev->dev, "card response timeout.\n");
		cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
		cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
	} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
	} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
		cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
		cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
		switch (cmd->rsp.arg[0]) {
		switch (cmd->rsp.arg[0]) {
		case QLCNIC_RCODE_INVALID_ARGS:
		case QLCNIC_RCODE_INVALID_ARGS:
			fmt = "CDRP invalid args: [%d]\n";
			fmt = "CDRP invalid args: [%d]\n";
@@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
		cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
		cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;


	for (i = 1; i < cmd->rsp.num; i++)
	for (i = 1; i < cmd->rsp.num; i++)
		cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i));
		cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err);


	/* Release semaphore */
	/* Release semaphore */
	qlcnic_api_unlock(adapter);
	qlcnic_api_unlock(adapter);
Loading