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

Commit 3fd434d8 authored by Frank Blaschka's avatar Frank Blaschka Committed by David S. Miller
Browse files

qeth: allow dynamic change of rx checksumming



Technically there is no need to set the card offline to change
RX checksumming. Get rid of this stupid limitation.

Signed-off-by: default avatarFrank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c3b4a740
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -61,5 +61,6 @@ int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
			const u8 *);
			const u8 *);
int qeth_l3_set_large_send(struct qeth_card *, enum qeth_large_send_types);
int qeth_l3_set_large_send(struct qeth_card *, enum qeth_large_send_types);
int qeth_l3_set_rx_csum(struct qeth_card *, enum qeth_checksum_types);


#endif /* __QETH_L3_H__ */
#endif /* __QETH_L3_H__ */
+30 −14
Original line number Original line Diff line number Diff line
@@ -1465,6 +1465,35 @@ static int qeth_l3_send_checksum_command(struct qeth_card *card)
	return 0;
	return 0;
}
}


int qeth_l3_set_rx_csum(struct qeth_card *card,
	enum qeth_checksum_types csum_type)
{
	int rc = 0;

	if (card->options.checksum_type == HW_CHECKSUMMING) {
		if ((csum_type != HW_CHECKSUMMING) &&
			(card->state != CARD_STATE_DOWN)) {
			rc = qeth_l3_send_simple_setassparms(card,
				IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
			if (rc)
				return -EIO;
		}
	} else {
		if (csum_type == HW_CHECKSUMMING) {
			if (card->state != CARD_STATE_DOWN) {
				if (!qeth_is_supported(card,
				    IPA_INBOUND_CHECKSUM))
					return -EPERM;
				rc = qeth_l3_send_checksum_command(card);
				if (rc)
					return -EIO;
			}
		}
	}
	card->options.checksum_type = csum_type;
	return rc;
}

static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
{
{
	int rc = 0;
	int rc = 0;
@@ -2954,27 +2983,14 @@ static u32 qeth_l3_ethtool_get_rx_csum(struct net_device *dev)
static int qeth_l3_ethtool_set_rx_csum(struct net_device *dev, u32 data)
static int qeth_l3_ethtool_set_rx_csum(struct net_device *dev, u32 data)
{
{
	struct qeth_card *card = dev->ml_priv;
	struct qeth_card *card = dev->ml_priv;
	enum qeth_card_states old_state;
	enum qeth_checksum_types csum_type;
	enum qeth_checksum_types csum_type;


	if ((card->state != CARD_STATE_UP) &&
	    (card->state != CARD_STATE_DOWN))
		return -EPERM;

	if (data)
	if (data)
		csum_type = HW_CHECKSUMMING;
		csum_type = HW_CHECKSUMMING;
	else
	else
		csum_type = SW_CHECKSUMMING;
		csum_type = SW_CHECKSUMMING;


	if (card->options.checksum_type != csum_type) {
	return qeth_l3_set_rx_csum(card, csum_type);
		old_state = card->state;
		if (card->state == CARD_STATE_UP)
			__qeth_l3_set_offline(card->gdev, 1);
		card->options.checksum_type = csum_type;
		if (old_state == CARD_STATE_UP)
			__qeth_l3_set_online(card->gdev, 1);
	}
	return 0;
}
}


static int qeth_l3_ethtool_set_tso(struct net_device *dev, u32 data)
static int qeth_l3_ethtool_set_tso(struct net_device *dev, u32 data)
+10 −9
Original line number Original line Diff line number Diff line
@@ -293,25 +293,26 @@ static ssize_t qeth_l3_dev_checksum_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
		struct device_attribute *attr, const char *buf, size_t count)
{
{
	struct qeth_card *card = dev_get_drvdata(dev);
	struct qeth_card *card = dev_get_drvdata(dev);
	enum qeth_checksum_types csum_type;
	char *tmp;
	char *tmp;
	int rc;


	if (!card)
	if (!card)
		return -EINVAL;
		return -EINVAL;


	if ((card->state != CARD_STATE_DOWN) &&
	    (card->state != CARD_STATE_RECOVER))
		return -EPERM;

	tmp = strsep((char **) &buf, "\n");
	tmp = strsep((char **) &buf, "\n");
	if (!strcmp(tmp, "sw_checksumming"))
	if (!strcmp(tmp, "sw_checksumming"))
		card->options.checksum_type = SW_CHECKSUMMING;
		csum_type = SW_CHECKSUMMING;
	else if (!strcmp(tmp, "hw_checksumming"))
	else if (!strcmp(tmp, "hw_checksumming"))
		card->options.checksum_type = HW_CHECKSUMMING;
		csum_type = HW_CHECKSUMMING;
	else if (!strcmp(tmp, "no_checksumming"))
	else if (!strcmp(tmp, "no_checksumming"))
		card->options.checksum_type = NO_CHECKSUMMING;
		csum_type = NO_CHECKSUMMING;
	else {
	else
		return -EINVAL;
		return -EINVAL;
	}

	rc = qeth_l3_set_rx_csum(card, csum_type);
	if (rc)
		return rc;
	return count;
	return count;
}
}