| From 07fd61c0383d0d583627e724a9e105568aad1474 Mon Sep 17 00:00:00 2001 |
| From: Julian Wiedmann <jwi@linux.ibm.com> |
| Date: Wed, 18 Dec 2019 16:32:26 +0100 |
| Subject: [PATCH] s390/qeth: handle error due to unsupported transport mode |
| |
| commit 2e3d7fa5d29b7ab649fdf8f9533ae0c0888a7fac upstream. |
| |
| Along with z/VM NICs, there's additional device types that only support |
| a specific transport mode (eg. external-bridged IQD). |
| Identify the corresponding error code, and raise a fitting error message |
| so that the user knows to adjust their device configuration. |
| |
| On top of that also fix the subsequent error path, so that the rejected |
| cmd doesn't need to wait for a timeout but gets cancelled straight away. |
| |
| Fixes: 4a71df50047f ("qeth: new qeth device driver") |
| Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c |
| index 6b8f99e7d8a8..720d750c6877 100644 |
| --- a/drivers/s390/net/qeth_core_main.c |
| +++ b/drivers/s390/net/qeth_core_main.c |
| @@ -676,17 +676,17 @@ static int qeth_check_idx_response(struct qeth_card *card, |
| unsigned char *buffer) |
| { |
| QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN); |
| - if ((buffer[2] & 0xc0) == 0xc0) { |
| + if ((buffer[2] & QETH_IDX_TERMINATE_MASK) == QETH_IDX_TERMINATE) { |
| QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#04x\n", |
| buffer[4]); |
| QETH_CARD_TEXT(card, 2, "ckidxres"); |
| QETH_CARD_TEXT(card, 2, " idxterm"); |
| - QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); |
| - if (buffer[4] == 0xf6) { |
| + QETH_CARD_TEXT_(card, 2, "rc%x", buffer[4]); |
| + if (buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT || |
| + buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT_VM) { |
| dev_err(&card->gdev->dev, |
| - "The qeth device is not configured " |
| - "for the OSI layer required by z/VM\n"); |
| - return -EPERM; |
| + "The device does not support the configured transport mode\n"); |
| + return -EPROTONOSUPPORT; |
| } |
| return -EIO; |
| } |
| @@ -792,10 +792,10 @@ static void qeth_issue_next_read_cb(struct qeth_card *card, |
| case 0: |
| break; |
| case -EIO: |
| - qeth_clear_ipacmd_list(card); |
| qeth_schedule_recovery(card); |
| /* fall through */ |
| default: |
| + qeth_clear_ipacmd_list(card); |
| goto out; |
| } |
| |
| diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h |
| index f5237b7c14c4..a1c62748f006 100644 |
| --- a/drivers/s390/net/qeth_core_mpc.h |
| +++ b/drivers/s390/net/qeth_core_mpc.h |
| @@ -918,6 +918,11 @@ extern unsigned char IDX_ACTIVATE_WRITE[]; |
| #define QETH_IDX_ACT_ERR_AUTH 0x1E |
| #define QETH_IDX_ACT_ERR_AUTH_USER 0x20 |
| |
| +#define QETH_IDX_TERMINATE 0xc0 |
| +#define QETH_IDX_TERMINATE_MASK 0xc0 |
| +#define QETH_IDX_TERM_BAD_TRANSPORT 0x41 |
| +#define QETH_IDX_TERM_BAD_TRANSPORT_VM 0xf6 |
| + |
| #define PDU_ENCAPSULATION(buffer) \ |
| (buffer + *(buffer + (*(buffer + 0x0b)) + \ |
| *(buffer + *(buffer + 0x0b) + 0x11) + 0x07)) |
| -- |
| 2.7.4 |
| |