aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/net/qeth_core_main.c40
1 files changed, 29 insertions, 11 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index ffe6960cb30..4a2ac0c8cef 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -1685,6 +1685,7 @@ int qeth_send_control_data(struct qeth_card *card, int len,
1685 unsigned long flags; 1685 unsigned long flags;
1686 struct qeth_reply *reply = NULL; 1686 struct qeth_reply *reply = NULL;
1687 unsigned long timeout; 1687 unsigned long timeout;
1688 struct qeth_ipa_cmd *cmd;
1688 1689
1689 QETH_DBF_TEXT(TRACE, 2, "sendctl"); 1690 QETH_DBF_TEXT(TRACE, 2, "sendctl");
1690 1691
@@ -1731,17 +1732,34 @@ int qeth_send_control_data(struct qeth_card *card, int len,
1731 wake_up(&card->wait_q); 1732 wake_up(&card->wait_q);
1732 return rc; 1733 return rc;
1733 } 1734 }
1734 while (!atomic_read(&reply->received)) { 1735
1735 if (time_after(jiffies, timeout)) { 1736 /* we have only one long running ipassist, since we can ensure
1736 spin_lock_irqsave(&reply->card->lock, flags); 1737 process context of this command we can sleep */
1737 list_del_init(&reply->list); 1738 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1738 spin_unlock_irqrestore(&reply->card->lock, flags); 1739 if ((cmd->hdr.command == IPA_CMD_SETIP) &&
1739 reply->rc = -ETIME; 1740 (cmd->hdr.prot_version == QETH_PROT_IPV4)) {
1740 atomic_inc(&reply->received); 1741 if (!wait_event_timeout(reply->wait_q,
1741 wake_up(&reply->wait_q); 1742 atomic_read(&reply->received), timeout))
1742 } 1743 goto time_err;
1743 cpu_relax(); 1744 } else {
1744 }; 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
1756time_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);
1745 rc = reply->rc; 1763 rc = reply->rc;
1746 qeth_put_reply(reply); 1764 qeth_put_reply(reply);
1747 return rc; 1765 return rc;