Commit 7b30d51a authored by David S. Miller's avatar David S. Miller

Merge branch 's390-qeth-fixes'

Julian Wiedmann says:

====================
s390/qeth: fixes 2018-02-09

please apply the following two qeth patches for 4.16 and stable.

One restricts a command quirk to the intended commandd type,
while the other fixes an off-by-one during data transmission
that can cause qeth to build malformed buffer descriptors.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0bf7800f 1c5b2216
...@@ -591,6 +591,11 @@ struct qeth_cmd_buffer { ...@@ -591,6 +591,11 @@ struct qeth_cmd_buffer {
void (*callback) (struct qeth_channel *, 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 * definition of a qeth channel, used for read and write
*/ */
...@@ -846,7 +851,7 @@ struct qeth_trap_id { ...@@ -846,7 +851,7 @@ struct qeth_trap_id {
*/ */
static inline int qeth_get_elements_for_range(addr_t start, addr_t end) static inline int qeth_get_elements_for_range(addr_t start, addr_t end)
{ {
return PFN_UP(end - 1) - PFN_DOWN(start); return PFN_UP(end) - PFN_DOWN(start);
} }
static inline int qeth_get_micros(void) static inline int qeth_get_micros(void)
......
...@@ -2120,7 +2120,7 @@ int qeth_send_control_data(struct qeth_card *card, int len, ...@@ -2120,7 +2120,7 @@ int qeth_send_control_data(struct qeth_card *card, int len,
unsigned long flags; unsigned long flags;
struct qeth_reply *reply = NULL; struct qeth_reply *reply = NULL;
unsigned long timeout, event_timeout; unsigned long timeout, event_timeout;
struct qeth_ipa_cmd *cmd; struct qeth_ipa_cmd *cmd = NULL;
QETH_CARD_TEXT(card, 2, "sendctl"); QETH_CARD_TEXT(card, 2, "sendctl");
...@@ -2146,10 +2146,13 @@ int qeth_send_control_data(struct qeth_card *card, int len, ...@@ -2146,10 +2146,13 @@ int qeth_send_control_data(struct qeth_card *card, int len,
while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ; while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
qeth_prepare_control_data(card, len, iob); 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; event_timeout = QETH_IPA_TIMEOUT;
else } else {
event_timeout = QETH_TIMEOUT; event_timeout = QETH_TIMEOUT;
}
timeout = jiffies + event_timeout; timeout = jiffies + event_timeout;
QETH_CARD_TEXT(card, 6, "noirqpnd"); QETH_CARD_TEXT(card, 6, "noirqpnd");
...@@ -2174,9 +2177,8 @@ int qeth_send_control_data(struct qeth_card *card, int len, ...@@ -2174,9 +2177,8 @@ int qeth_send_control_data(struct qeth_card *card, int len,
/* we have only one long running ipassist, since we can ensure /* we have only one long running ipassist, since we can ensure
process context of this command we can sleep */ process context of this command we can sleep */
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); if (cmd && cmd->hdr.command == IPA_CMD_SETIP &&
if ((cmd->hdr.command == IPA_CMD_SETIP) && cmd->hdr.prot_version == QETH_PROT_IPV4) {
(cmd->hdr.prot_version == QETH_PROT_IPV4)) {
if (!wait_event_timeout(reply->wait_q, if (!wait_event_timeout(reply->wait_q,
atomic_read(&reply->received), event_timeout)) atomic_read(&reply->received), event_timeout))
goto time_err; goto time_err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment