提交 3fd434d8 编写于 作者: F Frank Blaschka 提交者: David S. Miller

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: NFrank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 c3b4a740
...@@ -61,5 +61,6 @@ int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *); ...@@ -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__ */
...@@ -1465,6 +1465,35 @@ static int qeth_l3_send_checksum_command(struct qeth_card *card) ...@@ -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) ...@@ -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)
......
...@@ -293,25 +293,26 @@ static ssize_t qeth_l3_dev_checksum_store(struct device *dev, ...@@ -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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册