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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
7b30d51a8f
2 changed files with 14 additions and 7 deletions
|
@ -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 {
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
Loading…
Reference in a new issue