Skip to content

Commit 5b54e16

Browse files
Frank Blaschkadavem330
authored andcommitted
qeth: do not spin for SETIP ip assist command
The ip assist hw command for setting an IP address last unacceptable long so we can not spin while we waiting for the irq. Since we can ensure process context for all occurrences of this command we can use wait. Signed-off-by: Frank Blaschka <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fc9c246 commit 5b54e16

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

drivers/s390/net/qeth_core_main.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,7 @@ int qeth_send_control_data(struct qeth_card *card, int len,
16851685
unsigned long flags;
16861686
struct qeth_reply *reply = NULL;
16871687
unsigned long timeout;
1688+
struct qeth_ipa_cmd *cmd;
16881689

16891690
QETH_DBF_TEXT(TRACE, 2, "sendctl");
16901691

@@ -1731,17 +1732,34 @@ int qeth_send_control_data(struct qeth_card *card, int len,
17311732
wake_up(&card->wait_q);
17321733
return rc;
17331734
}
1734-
while (!atomic_read(&reply->received)) {
1735-
if (time_after(jiffies, timeout)) {
1736-
spin_lock_irqsave(&reply->card->lock, flags);
1737-
list_del_init(&reply->list);
1738-
spin_unlock_irqrestore(&reply->card->lock, flags);
1739-
reply->rc = -ETIME;
1740-
atomic_inc(&reply->received);
1741-
wake_up(&reply->wait_q);
1742-
}
1743-
cpu_relax();
1744-
};
1735+
1736+
/* we have only one long running ipassist, since we can ensure
1737+
process context of this command we can sleep */
1738+
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1739+
if ((cmd->hdr.command == IPA_CMD_SETIP) &&
1740+
(cmd->hdr.prot_version == QETH_PROT_IPV4)) {
1741+
if (!wait_event_timeout(reply->wait_q,
1742+
atomic_read(&reply->received), timeout))
1743+
goto time_err;
1744+
} else {
1745+
while (!atomic_read(&reply->received)) {
1746+
if (time_after(jiffies, timeout))
1747+
goto time_err;
1748+
cpu_relax();
1749+
};
1750+
}
1751+
1752+
rc = reply->rc;
1753+
qeth_put_reply(reply);
1754+
return rc;
1755+
1756+
time_err:
1757+
spin_lock_irqsave(&reply->card->lock, flags);
1758+
list_del_init(&reply->list);
1759+
spin_unlock_irqrestore(&reply->card->lock, flags);
1760+
reply->rc = -ETIME;
1761+
atomic_inc(&reply->received);
1762+
wake_up(&reply->wait_q);
17451763
rc = reply->rc;
17461764
qeth_put_reply(reply);
17471765
return rc;

0 commit comments

Comments
 (0)