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

Commit c504ccad authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Greg Kroah-Hartman
Browse files

s390/qeth: fix SETIP command handling




[ Upstream commit 1c5b2216fbb973a9410e0b06389740b5c1289171 ]

send_control_data() applies some special handling to SETIP v4 IPA
commands. But current code parses *all* command types for the SETIP
command code. Limit the command code check to IPA commands.

Fixes: 5b54e16f ("qeth: do not spin for SETIP ip assist command")
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f1183f19
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -593,6 +593,11 @@ struct qeth_cmd_buffer {
	void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *);
};

static inline struct qeth_ipa_cmd *__ipa_cmd(struct qeth_cmd_buffer *iob)
{
	return (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
}

/**
 * definition of a qeth channel, used for read and write
 */
+8 −6
Original line number Diff line number Diff line
@@ -2023,7 +2023,7 @@ int qeth_send_control_data(struct qeth_card *card, int len,
	unsigned long flags;
	struct qeth_reply *reply = NULL;
	unsigned long timeout, event_timeout;
	struct qeth_ipa_cmd *cmd;
	struct qeth_ipa_cmd *cmd = NULL;

	QETH_CARD_TEXT(card, 2, "sendctl");

@@ -2050,10 +2050,13 @@ int qeth_send_control_data(struct qeth_card *card, int len,
	while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
	qeth_prepare_control_data(card, len, iob);

	if (IS_IPA(iob->data))
	if (IS_IPA(iob->data)) {
		cmd = __ipa_cmd(iob);
		event_timeout = QETH_IPA_TIMEOUT;
	else
	} else {
		event_timeout = QETH_TIMEOUT;
	}

	timeout = jiffies + event_timeout;

	QETH_CARD_TEXT(card, 6, "noirqpnd");
@@ -2078,9 +2081,8 @@ int qeth_send_control_data(struct qeth_card *card, int len,

	/* we have only one long running ipassist, since we can ensure
	   process context of this command we can sleep */
	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
	if ((cmd->hdr.command == IPA_CMD_SETIP) &&
	    (cmd->hdr.prot_version == QETH_PROT_IPV4)) {
	if (cmd && cmd->hdr.command == IPA_CMD_SETIP &&
	    cmd->hdr.prot_version == QETH_PROT_IPV4) {
		if (!wait_event_timeout(reply->wait_q,
		    atomic_read(&reply->received), event_timeout))
			goto time_err;