Commit f80742b9 authored by David S. Miller's avatar David S. Miller

Merge branch 's390-fixes'

Julian Wiedmann says:

====================
s390/qeth: fixes 2019-12-18

please apply the following patch series to your net tree.
This brings two fixes for initialization / teardown issues, and one
ENOTSUPP cleanup.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ea8608d4 39bdbf3e
...@@ -655,17 +655,17 @@ static int qeth_check_idx_response(struct qeth_card *card, ...@@ -655,17 +655,17 @@ static int qeth_check_idx_response(struct qeth_card *card,
unsigned char *buffer) unsigned char *buffer)
{ {
QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN); 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", QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#04x\n",
buffer[4]); buffer[4]);
QETH_CARD_TEXT(card, 2, "ckidxres"); QETH_CARD_TEXT(card, 2, "ckidxres");
QETH_CARD_TEXT(card, 2, " idxterm"); QETH_CARD_TEXT(card, 2, " idxterm");
QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); QETH_CARD_TEXT_(card, 2, "rc%x", buffer[4]);
if (buffer[4] == 0xf6) { if (buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT ||
buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT_VM) {
dev_err(&card->gdev->dev, dev_err(&card->gdev->dev,
"The qeth device is not configured " "The device does not support the configured transport mode\n");
"for the OSI layer required by z/VM\n"); return -EPROTONOSUPPORT;
return -EPERM;
} }
return -EIO; return -EIO;
} }
...@@ -742,10 +742,10 @@ static void qeth_issue_next_read_cb(struct qeth_card *card, ...@@ -742,10 +742,10 @@ static void qeth_issue_next_read_cb(struct qeth_card *card,
case 0: case 0:
break; break;
case -EIO: case -EIO:
qeth_clear_ipacmd_list(card);
qeth_schedule_recovery(card); qeth_schedule_recovery(card);
/* fall through */ /* fall through */
default: default:
qeth_clear_ipacmd_list(card);
goto out; goto out;
} }
......
...@@ -899,6 +899,11 @@ extern unsigned char IDX_ACTIVATE_WRITE[]; ...@@ -899,6 +899,11 @@ extern unsigned char IDX_ACTIVATE_WRITE[];
#define QETH_IDX_ACT_ERR_AUTH 0x1E #define QETH_IDX_ACT_ERR_AUTH 0x1E
#define QETH_IDX_ACT_ERR_AUTH_USER 0x20 #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) \ #define PDU_ENCAPSULATION(buffer) \
(buffer + *(buffer + (*(buffer + 0x0b)) + \ (buffer + *(buffer + (*(buffer + 0x0b)) + \
*(buffer + *(buffer + 0x0b) + 0x11) + 0x07)) *(buffer + *(buffer + 0x0b) + 0x11) + 0x07))
......
...@@ -207,7 +207,7 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev, ...@@ -207,7 +207,7 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev,
card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
} else if (sysfs_streq(buf, "prio_queueing_vlan")) { } else if (sysfs_streq(buf, "prio_queueing_vlan")) {
if (IS_LAYER3(card)) { if (IS_LAYER3(card)) {
rc = -ENOTSUPP; rc = -EOPNOTSUPP;
goto out; goto out;
} }
card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_VLAN; card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_VLAN;
......
...@@ -295,6 +295,7 @@ static void qeth_l2_stop_card(struct qeth_card *card) ...@@ -295,6 +295,7 @@ static void qeth_l2_stop_card(struct qeth_card *card)
flush_workqueue(card->event_wq); flush_workqueue(card->event_wq);
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
card->info.promisc_mode = 0;
} }
static int qeth_l2_process_inbound_buffer(struct qeth_card *card, static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
......
...@@ -262,7 +262,8 @@ void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) ...@@ -262,7 +262,8 @@ void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card)
return; return;
mutex_lock(&card->sbp_lock); mutex_lock(&card->sbp_lock);
if (card->options.sbp.role != QETH_SBP_ROLE_NONE) { if (!card->options.sbp.reflect_promisc &&
card->options.sbp.role != QETH_SBP_ROLE_NONE) {
/* Conditional to avoid spurious error messages */ /* Conditional to avoid spurious error messages */
qeth_bridgeport_setrole(card, card->options.sbp.role); qeth_bridgeport_setrole(card, card->options.sbp.role);
/* Let the callback function refresh the stored role value. */ /* Let the callback function refresh the stored role value. */
......
...@@ -1314,6 +1314,7 @@ static void qeth_l3_stop_card(struct qeth_card *card) ...@@ -1314,6 +1314,7 @@ static void qeth_l3_stop_card(struct qeth_card *card)
} }
flush_workqueue(card->event_wq); flush_workqueue(card->event_wq);
card->info.promisc_mode = 0;
} }
static void qeth_l3_set_promisc_mode(struct qeth_card *card) static void qeth_l3_set_promisc_mode(struct qeth_card *card)
......
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