|
@@ -5289,18 +5289,6 @@ int qeth_setassparms_cb(struct qeth_card *card,
|
|
if (cmd->hdr.prot_version == QETH_PROT_IPV6)
|
|
if (cmd->hdr.prot_version == QETH_PROT_IPV6)
|
|
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
|
|
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
|
|
}
|
|
}
|
|
- if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
|
|
|
|
- cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
|
|
|
|
- card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
|
|
|
|
- QETH_CARD_TEXT_(card, 3, "csum:%d", card->info.csum_mask);
|
|
|
|
- }
|
|
|
|
- if (cmd->data.setassparms.hdr.assist_no == IPA_OUTBOUND_CHECKSUM &&
|
|
|
|
- cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
|
|
|
|
- card->info.tx_csum_mask =
|
|
|
|
- cmd->data.setassparms.data.flags_32bit;
|
|
|
|
- QETH_CARD_TEXT_(card, 3, "tcsu:%d", card->info.tx_csum_mask);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(qeth_setassparms_cb);
|
|
EXPORT_SYMBOL_GPL(qeth_setassparms_cb);
|
|
@@ -6060,23 +6048,78 @@ int qeth_core_ethtool_get_settings(struct net_device *netdev,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(qeth_core_ethtool_get_settings);
|
|
EXPORT_SYMBOL_GPL(qeth_core_ethtool_get_settings);
|
|
|
|
|
|
|
|
+/* Callback to handle checksum offload command reply from OSA card.
|
|
|
|
+ * Verify that required features have been enabled on the card.
|
|
|
|
+ * Return error in hdr->return_code as this value is checked by caller.
|
|
|
|
+ *
|
|
|
|
+ * Always returns zero to indicate no further messages from the OSA card.
|
|
|
|
+ */
|
|
|
|
+static int qeth_ipa_checksum_run_cmd_cb(struct qeth_card *card,
|
|
|
|
+ struct qeth_reply *reply,
|
|
|
|
+ unsigned long data)
|
|
|
|
+{
|
|
|
|
+ struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
|
|
|
+ struct qeth_checksum_cmd *chksum_cb =
|
|
|
|
+ (struct qeth_checksum_cmd *)reply->param;
|
|
|
|
+
|
|
|
|
+ QETH_CARD_TEXT(card, 4, "chkdoccb");
|
|
|
|
+ if (cmd->hdr.return_code)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ memset(chksum_cb, 0, sizeof(*chksum_cb));
|
|
|
|
+ if (cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
|
|
|
|
+ chksum_cb->supported =
|
|
|
|
+ cmd->data.setassparms.data.chksum.supported;
|
|
|
|
+ QETH_CARD_TEXT_(card, 3, "strt:%x", chksum_cb->supported);
|
|
|
|
+ }
|
|
|
|
+ if (cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_ENABLE) {
|
|
|
|
+ chksum_cb->supported =
|
|
|
|
+ cmd->data.setassparms.data.chksum.supported;
|
|
|
|
+ chksum_cb->enabled =
|
|
|
|
+ cmd->data.setassparms.data.chksum.enabled;
|
|
|
|
+ QETH_CARD_TEXT_(card, 3, "supp:%x", chksum_cb->supported);
|
|
|
|
+ QETH_CARD_TEXT_(card, 3, "enab:%x", chksum_cb->enabled);
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Send command to OSA card and check results. */
|
|
|
|
+static int qeth_ipa_checksum_run_cmd(struct qeth_card *card,
|
|
|
|
+ enum qeth_ipa_funcs ipa_func,
|
|
|
|
+ __u16 cmd_code, long data,
|
|
|
|
+ struct qeth_checksum_cmd *chksum_cb)
|
|
|
|
+{
|
|
|
|
+ struct qeth_cmd_buffer *iob;
|
|
|
|
+ int rc = -ENOMEM;
|
|
|
|
+
|
|
|
|
+ QETH_CARD_TEXT(card, 4, "chkdocmd");
|
|
|
|
+ iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
|
|
|
|
+ sizeof(__u32), QETH_PROT_IPV4);
|
|
|
|
+ if (iob)
|
|
|
|
+ rc = qeth_send_setassparms(card, iob, sizeof(__u32), data,
|
|
|
|
+ qeth_ipa_checksum_run_cmd_cb,
|
|
|
|
+ chksum_cb);
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
static int qeth_send_checksum_on(struct qeth_card *card, int cstype)
|
|
static int qeth_send_checksum_on(struct qeth_card *card, int cstype)
|
|
{
|
|
{
|
|
- long rxtx_arg;
|
|
|
|
|
|
+ struct qeth_checksum_cmd chksum_cb;
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
- rc = qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_START, 0);
|
|
|
|
|
|
+ rc = qeth_ipa_checksum_run_cmd(card, cstype, IPA_CMD_ASS_START, 0,
|
|
|
|
+ &chksum_cb);
|
|
if (rc) {
|
|
if (rc) {
|
|
|
|
+ qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_STOP, 0);
|
|
dev_warn(&card->gdev->dev,
|
|
dev_warn(&card->gdev->dev,
|
|
"Starting HW checksumming for %s failed, using SW checksumming\n",
|
|
"Starting HW checksumming for %s failed, using SW checksumming\n",
|
|
QETH_CARD_IFNAME(card));
|
|
QETH_CARD_IFNAME(card));
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
- rxtx_arg = (cstype == IPA_OUTBOUND_CHECKSUM) ? card->info.tx_csum_mask
|
|
|
|
- : card->info.csum_mask;
|
|
|
|
- rc = qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_ENABLE,
|
|
|
|
- rxtx_arg);
|
|
|
|
|
|
+ rc = qeth_ipa_checksum_run_cmd(card, cstype, IPA_CMD_ASS_ENABLE,
|
|
|
|
+ chksum_cb.supported, &chksum_cb);
|
|
if (rc) {
|
|
if (rc) {
|
|
|
|
+ qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_STOP, 0);
|
|
dev_warn(&card->gdev->dev,
|
|
dev_warn(&card->gdev->dev,
|
|
"Enabling HW checksumming for %s failed, using SW checksumming\n",
|
|
"Enabling HW checksumming for %s failed, using SW checksumming\n",
|
|
QETH_CARD_IFNAME(card));
|
|
QETH_CARD_IFNAME(card));
|
|
@@ -6090,19 +6133,10 @@ static int qeth_send_checksum_on(struct qeth_card *card, int cstype)
|
|
|
|
|
|
static int qeth_set_ipa_csum(struct qeth_card *card, int on, int cstype)
|
|
static int qeth_set_ipa_csum(struct qeth_card *card, int on, int cstype)
|
|
{
|
|
{
|
|
- int rc;
|
|
|
|
-
|
|
|
|
- if (on) {
|
|
|
|
- rc = qeth_send_checksum_on(card, cstype);
|
|
|
|
- if (rc)
|
|
|
|
- return -EIO;
|
|
|
|
- } else {
|
|
|
|
- rc = qeth_send_simple_setassparms(card, cstype,
|
|
|
|
- IPA_CMD_ASS_STOP, 0);
|
|
|
|
- if (rc)
|
|
|
|
- return -EIO;
|
|
|
|
- }
|
|
|
|
- return 0;
|
|
|
|
|
|
+ int rc = (on) ? qeth_send_checksum_on(card, cstype)
|
|
|
|
+ : qeth_send_simple_setassparms(card, cstype,
|
|
|
|
+ IPA_CMD_ASS_STOP, 0);
|
|
|
|
+ return rc ? -EIO : 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int qeth_set_ipa_tso(struct qeth_card *card, int on)
|
|
static int qeth_set_ipa_tso(struct qeth_card *card, int on)
|