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

Commit ca34fe38 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller
Browse files

be2net: fix wrong usage of adapter->generation



adapter->generation was being incorrectly set as BE_GEN3 for Skyhawk-R.
Replace generation usage with XXX_chip() macros to identify the chip.

Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5727f841
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -410,7 +410,6 @@ struct be_adapter {
	u32 rx_fc;		/* Rx flow control */
	u32 rx_fc;		/* Rx flow control */
	u32 tx_fc;		/* Tx flow control */
	u32 tx_fc;		/* Tx flow control */
	bool stats_cmd_sent;
	bool stats_cmd_sent;
	u8 generation;		/* BladeEngine ASIC generation */
	u32 if_type;
	u32 if_type;
	struct {
	struct {
		u8 __iomem *base;	/* Door Bell */
		u8 __iomem *base;	/* Door Bell */
@@ -458,19 +457,22 @@ struct be_adapter {
	for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs;	\
	for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs;	\
		i++, vf_cfg++)
		i++, vf_cfg++)


/* BladeEngine Generation numbers */
#define BE_GEN2 2
#define BE_GEN3 3
#define SH_HW	4

#define ON				1
#define ON				1
#define OFF				0
#define OFF				0
#define lancer_chip(adapter)	((adapter->pdev->device == OC_DEVICE_ID3) || \

				 (adapter->pdev->device == OC_DEVICE_ID4))
#define lancer_chip(adapter)	(adapter->pdev->device == OC_DEVICE_ID3 || \
				 adapter->pdev->device == OC_DEVICE_ID4)


#define skyhawk_chip(adapter)	(adapter->pdev->device == OC_DEVICE_ID5 || \
#define skyhawk_chip(adapter)	(adapter->pdev->device == OC_DEVICE_ID5 || \
				 adapter->pdev->device == OC_DEVICE_ID6)
				 adapter->pdev->device == OC_DEVICE_ID6)


#define BE3_chip(adapter)	(adapter->pdev->device == BE_DEVICE_ID2 || \
				 adapter->pdev->device == OC_DEVICE_ID2)

#define BE2_chip(adapter)	(adapter->pdev->device == BE_DEVICE_ID1 || \
				 adapter->pdev->device == OC_DEVICE_ID1)

#define BEx_chip(adapter)	(BE3_chip(adapter) || BE2_chip(adapter))


#define be_roce_supported(adapter) ((adapter->if_type == SLI_INTF_TYPE_3 || \
#define be_roce_supported(adapter) ((adapter->if_type == SLI_INTF_TYPE_3 || \
				adapter->sli_family == SKYHAWK_SLI_FAMILY) && \
				adapter->sli_family == SKYHAWK_SLI_FAMILY) && \
+4 −2
Original line number Original line Diff line number Diff line
@@ -1362,7 +1362,8 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
	be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
	be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
		OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd);
		OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd);


	if (adapter->generation == BE_GEN3)
	/* version 1 of the cmd is not supported only by BE2 */
	if (!BE2_chip(adapter))
		hdr->version = 1;
		hdr->version = 1;


	be_mcc_notify(adapter);
	be_mcc_notify(adapter);
@@ -1452,7 +1453,8 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
		OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
		OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);


	if (adapter->generation == BE_GEN3 || lancer_chip(adapter))
	/* version 1 of the cmd is not supported only by BE2 */
	if (!BE2_chip(adapter))
		req->hdr.version = 1;
		req->hdr.version = 1;


	req->hdr.domain = dom;
	req->hdr.domain = dom;
+0 −27
Original line number Original line Diff line number Diff line
@@ -1656,33 +1656,6 @@ struct be_cmd_resp_get_stats_v1 {
	struct be_hw_stats_v1 hw_stats;
	struct be_hw_stats_v1 hw_stats;
};
};


static inline void *hw_stats_from_cmd(struct be_adapter *adapter)
{
	if (adapter->generation == BE_GEN3) {
		struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	} else {
		struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	}
}

static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter)
{
	if (adapter->generation == BE_GEN3) {
		struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	} else {
		struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	}
}


/************** get fat capabilites *******************/
/************** get fat capabilites *******************/
#define MAX_MODULES 27
#define MAX_MODULES 27
#define MAX_MODES 4
#define MAX_MODES 4
+78 −56
Original line number Original line Diff line number Diff line
@@ -285,7 +285,35 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
	return status;
	return status;
}
}


static void populate_be2_stats(struct be_adapter *adapter)
/* BE2 supports only v0 cmd */
static void *hw_stats_from_cmd(struct be_adapter *adapter)
{
	if (BE2_chip(adapter)) {
		struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	} else  {
		struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va;

		return &cmd->hw_stats;
	}
}

/* BE2 supports only v0 cmd */
static void *be_erx_stats_from_cmd(struct be_adapter *adapter)
{
	if (BE2_chip(adapter)) {
		struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	} else {
		struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);

		return &hw_stats->erx;
	}
}

static void populate_be_v0_stats(struct be_adapter *adapter)
{
{
	struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
@@ -334,7 +362,7 @@ static void populate_be2_stats(struct be_adapter *adapter)
	adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops;
	adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops;
}
}


static void populate_be3_stats(struct be_adapter *adapter)
static void populate_be_v1_stats(struct be_adapter *adapter)
{
{
	struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
	struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
@@ -436,28 +464,25 @@ void be_parse_stats(struct be_adapter *adapter)
	struct be_rx_obj *rxo;
	struct be_rx_obj *rxo;
	int i;
	int i;


	if (adapter->generation == BE_GEN3) {
	if (lancer_chip(adapter)) {
		if (lancer_chip(adapter))
		populate_lancer_stats(adapter);
		populate_lancer_stats(adapter);
		 else
			populate_be3_stats(adapter);
	} else {
	} else {
		populate_be2_stats(adapter);
		if (BE2_chip(adapter))
	}
			populate_be_v0_stats(adapter);

		else
	if (lancer_chip(adapter))
			/* for BE3 and Skyhawk */
		goto done;
			populate_be_v1_stats(adapter);


	/* as erx_v1 is longer than v0, ok to use v1 defn for v0 access */
		/* as erx_v1 is longer than v0, ok to use v1 for v0 access */
		for_all_rx_queues(adapter, rxo, i) {
		for_all_rx_queues(adapter, rxo, i) {
			/* below erx HW counter can actually wrap around after
			/* below erx HW counter can actually wrap around after
			 * 65535. Driver accumulates a 32-bit value
			 * 65535. Driver accumulates a 32-bit value
			 */
			 */
			accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
			accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
				(u16)erx->rx_drops_no_fragments[rxo->q.id]);
					     (u16)erx->rx_drops_no_fragments \
					     [rxo->q.id]);
		}
	}
	}
done:
	return;
}
}


static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev,
static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev,
@@ -1874,7 +1899,7 @@ static int be_num_txqs_want(struct be_adapter *adapter)
	if ((!lancer_chip(adapter) && sriov_want(adapter)) ||
	if ((!lancer_chip(adapter) && sriov_want(adapter)) ||
	    be_is_mc(adapter) ||
	    be_is_mc(adapter) ||
	    (!lancer_chip(adapter) && !be_physfn(adapter)) ||
	    (!lancer_chip(adapter) && !be_physfn(adapter)) ||
	    adapter->generation == BE_GEN2)
	    BE2_chip(adapter))
		return 1;
		return 1;
	else
	else
		return adapter->max_tx_queues;
		return adapter->max_tx_queues;
@@ -3046,7 +3071,7 @@ static bool is_comp_in_ufi(struct be_adapter *adapter,
	int i = 0, img_type = 0;
	int i = 0, img_type = 0;
	struct flash_section_info_g2 *fsec_g2 = NULL;
	struct flash_section_info_g2 *fsec_g2 = NULL;


	if (adapter->generation != BE_GEN3)
	if (BE2_chip(adapter))
		fsec_g2 = (struct flash_section_info_g2 *)fsec;
		fsec_g2 = (struct flash_section_info_g2 *)fsec;


	for (i = 0; i < MAX_FLASH_COMP; i++) {
	for (i = 0; i < MAX_FLASH_COMP; i++) {
@@ -3120,7 +3145,8 @@ static int be_flash(struct be_adapter *adapter, const u8 *img,
	return 0;
	return 0;
}
}


static int be_flash_data(struct be_adapter *adapter,
/* For BE2 and BE3 */
static int be_flash_BEx(struct be_adapter *adapter,
			 const struct firmware *fw,
			 const struct firmware *fw,
			 struct be_dma_mem *flash_cmd,
			 struct be_dma_mem *flash_cmd,
			 int num_of_images)
			 int num_of_images)
@@ -3175,7 +3201,7 @@ static int be_flash_data(struct be_adapter *adapter,
			 FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE}
			 FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE}
	};
	};


	if (adapter->generation == BE_GEN3) {
	if (BE3_chip(adapter)) {
		pflashcomp = gen3_flash_types;
		pflashcomp = gen3_flash_types;
		filehdr_size = sizeof(struct flash_file_hdr_g3);
		filehdr_size = sizeof(struct flash_file_hdr_g3);
		num_comp = ARRAY_SIZE(gen3_flash_types);
		num_comp = ARRAY_SIZE(gen3_flash_types);
@@ -3184,6 +3210,7 @@ static int be_flash_data(struct be_adapter *adapter,
		filehdr_size = sizeof(struct flash_file_hdr_g2);
		filehdr_size = sizeof(struct flash_file_hdr_g2);
		num_comp = ARRAY_SIZE(gen2_flash_types);
		num_comp = ARRAY_SIZE(gen2_flash_types);
	}
	}

	/* Get flash section info*/
	/* Get flash section info*/
	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
	if (!fsec) {
	if (!fsec) {
@@ -3431,20 +3458,21 @@ static int lancer_fw_download(struct be_adapter *adapter,
	return status;
	return status;
}
}


static int be_get_ufi_gen(struct be_adapter *adapter,
#define UFI_TYPE2		2
#define UFI_TYPE3		3
#define UFI_TYPE4		4
static int be_get_ufi_type(struct be_adapter *adapter,
			   struct flash_file_hdr_g2 *fhdr)
			   struct flash_file_hdr_g2 *fhdr)
{
{
	if (fhdr == NULL)
	if (fhdr == NULL)
		goto be_get_ufi_exit;
		goto be_get_ufi_exit;


	if (adapter->generation == BE_GEN3) {
	if (skyhawk_chip(adapter) && fhdr->build[0] == '4')
	if (skyhawk_chip(adapter) && fhdr->build[0] == '4')
			return SH_HW;
		return UFI_TYPE4;
		else if (!skyhawk_chip(adapter) && fhdr->build[0] == '3')
	else if (BE3_chip(adapter) && fhdr->build[0] == '3')
			return BE_GEN3;
		return UFI_TYPE3;
	} else if (adapter->generation == BE_GEN2 && fhdr->build[0] == '2') {
	else if (BE2_chip(adapter) && fhdr->build[0] == '2')
			return BE_GEN2;
		return UFI_TYPE2;
	}


be_get_ufi_exit:
be_get_ufi_exit:
	dev_err(&adapter->pdev->dev,
	dev_err(&adapter->pdev->dev,
@@ -3474,7 +3502,7 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw)
	p = fw->data;
	p = fw->data;
	fhdr = (struct flash_file_hdr_g2 *)p;
	fhdr = (struct flash_file_hdr_g2 *)p;


	ufi_type = be_get_ufi_gen(adapter, fhdr);
	ufi_type = be_get_ufi_type(adapter, fhdr);


	fhdr3 = (struct flash_file_hdr_g3 *)fw->data;
	fhdr3 = (struct flash_file_hdr_g3 *)fw->data;
	num_imgs = le32_to_cpu(fhdr3->num_imgs);
	num_imgs = le32_to_cpu(fhdr3->num_imgs);
@@ -3483,17 +3511,17 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw)
				(sizeof(struct flash_file_hdr_g3) +
				(sizeof(struct flash_file_hdr_g3) +
				 i * sizeof(struct image_hdr)));
				 i * sizeof(struct image_hdr)));
		if (le32_to_cpu(img_hdr_ptr->imageid) == 1) {
		if (le32_to_cpu(img_hdr_ptr->imageid) == 1) {
			if (ufi_type == SH_HW)
			if (ufi_type == UFI_TYPE4)
				status = be_flash_skyhawk(adapter, fw,
				status = be_flash_skyhawk(adapter, fw,
							&flash_cmd, num_imgs);
							&flash_cmd, num_imgs);
			else if (ufi_type == BE_GEN3)
			else if (ufi_type == UFI_TYPE3)
				status = be_flash_data(adapter, fw,
				status = be_flash_BEx(adapter, fw, &flash_cmd,
							&flash_cmd, num_imgs);
						      num_imgs);
		}
		}
	}
	}


	if (ufi_type == BE_GEN2)
	if (ufi_type == UFI_TYPE2)
		status = be_flash_data(adapter, fw, &flash_cmd, 0);
		status = be_flash_BEx(adapter, fw, &flash_cmd, 0);
	else if (ufi_type == -1)
	else if (ufi_type == -1)
		status = -1;
		status = -1;


@@ -3644,7 +3672,7 @@ static int be_map_pci_bars(struct be_adapter *adapter)
		adapter->csr = addr;
		adapter->csr = addr;
	}
	}


	if (adapter->generation == BE_GEN2) {
	if (BE2_chip(adapter)) {
		db_reg = 4;
		db_reg = 4;
	} else {
	} else {
		if (be_physfn(adapter))
		if (be_physfn(adapter))
@@ -3751,14 +3779,14 @@ static int be_stats_init(struct be_adapter *adapter)
{
{
	struct be_dma_mem *cmd = &adapter->stats_cmd;
	struct be_dma_mem *cmd = &adapter->stats_cmd;


	if (adapter->generation == BE_GEN2) {
		cmd->size = sizeof(struct be_cmd_req_get_stats_v0);
	} else {
	if (lancer_chip(adapter))
	if (lancer_chip(adapter))
		cmd->size = sizeof(struct lancer_cmd_req_pport_stats);
		cmd->size = sizeof(struct lancer_cmd_req_pport_stats);
	else if (BE2_chip(adapter))
		cmd->size = sizeof(struct be_cmd_req_get_stats_v0);
	else
	else
		/* BE3 and Skyhawk */
		cmd->size = sizeof(struct be_cmd_req_get_stats_v1);
		cmd->size = sizeof(struct be_cmd_req_get_stats_v1);
	}

	cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma,
	cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma,
				     GFP_KERNEL);
				     GFP_KERNEL);
	if (cmd->va == NULL)
	if (cmd->va == NULL)
@@ -3878,11 +3906,9 @@ static int be_dev_type_check(struct be_adapter *adapter)
	switch (pdev->device) {
	switch (pdev->device) {
	case BE_DEVICE_ID1:
	case BE_DEVICE_ID1:
	case OC_DEVICE_ID1:
	case OC_DEVICE_ID1:
		adapter->generation = BE_GEN2;
		break;
		break;
	case BE_DEVICE_ID2:
	case BE_DEVICE_ID2:
	case OC_DEVICE_ID2:
	case OC_DEVICE_ID2:
		adapter->generation = BE_GEN3;
		break;
		break;
	case OC_DEVICE_ID3:
	case OC_DEVICE_ID3:
	case OC_DEVICE_ID4:
	case OC_DEVICE_ID4:
@@ -3898,7 +3924,6 @@ static int be_dev_type_check(struct be_adapter *adapter)
		}
		}
		adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
		adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
					 SLI_INTF_FAMILY_SHIFT);
					 SLI_INTF_FAMILY_SHIFT);
		adapter->generation = BE_GEN3;
		break;
		break;
	case OC_DEVICE_ID5:
	case OC_DEVICE_ID5:
	case OC_DEVICE_ID6:
	case OC_DEVICE_ID6:
@@ -3909,10 +3934,7 @@ static int be_dev_type_check(struct be_adapter *adapter)
		}
		}
		adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
		adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
					 SLI_INTF_FAMILY_SHIFT);
					 SLI_INTF_FAMILY_SHIFT);
		adapter->generation = BE_GEN3;
		break;
		break;
	default:
		adapter->generation = 0;
	}
	}


	pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);
	pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);