| From 09a1e3a7cfbae13201c3b776651111553521e46a Mon Sep 17 00:00:00 2001 |
| From: Alexandra Winter <wintera@linux.ibm.com> |
| Date: Thu, 20 Feb 2020 15:54:54 +0100 |
| Subject: [PATCH] s390/qeth: vnicc Fix EOPNOTSUPP precedence |
| |
| commit 6f3846f0955308b6d1b219419da42b8de2c08845 upstream. |
| |
| When getting or setting VNICC parameters, the error code EOPNOTSUPP |
| should have precedence over EBUSY. |
| |
| EBUSY is used because vnicc feature and bridgeport feature are mutually |
| exclusive, which is a temporary condition. |
| Whereas EOPNOTSUPP indicates that the HW does not support all or parts of |
| the vnicc feature. |
| This issue causes the vnicc sysfs params to show 'blocked by bridgeport' |
| for HW that does not support VNICC at all. |
| |
| Fixes: caa1f0b10d18 ("s390/qeth: add VNICC enable/disable support") |
| Signed-off-by: Alexandra Winter <wintera@linux.ibm.com> |
| 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_l2_main.c b/drivers/s390/net/qeth_l2_main.c |
| index 9ad8fdbd0cc6..19cfeac0e182 100644 |
| --- a/drivers/s390/net/qeth_l2_main.c |
| +++ b/drivers/s390/net/qeth_l2_main.c |
| @@ -1921,15 +1921,14 @@ int qeth_l2_vnicc_set_state(struct qeth_card *card, u32 vnicc, bool state) |
| |
| QETH_CARD_TEXT(card, 2, "vniccsch"); |
| |
| - /* do not change anything if BridgePort is enabled */ |
| - if (qeth_bridgeport_is_in_use(card)) |
| - return -EBUSY; |
| - |
| /* check if characteristic and enable/disable are supported */ |
| if (!(card->options.vnicc.sup_chars & vnicc) || |
| !(card->options.vnicc.set_char_sup & vnicc)) |
| return -EOPNOTSUPP; |
| |
| + if (qeth_bridgeport_is_in_use(card)) |
| + return -EBUSY; |
| + |
| /* set enable/disable command and store wanted characteristic */ |
| if (state) { |
| cmd = IPA_VNICC_ENABLE; |
| @@ -1975,14 +1974,13 @@ int qeth_l2_vnicc_get_state(struct qeth_card *card, u32 vnicc, bool *state) |
| |
| QETH_CARD_TEXT(card, 2, "vniccgch"); |
| |
| - /* do not get anything if BridgePort is enabled */ |
| - if (qeth_bridgeport_is_in_use(card)) |
| - return -EBUSY; |
| - |
| /* check if characteristic is supported */ |
| if (!(card->options.vnicc.sup_chars & vnicc)) |
| return -EOPNOTSUPP; |
| |
| + if (qeth_bridgeport_is_in_use(card)) |
| + return -EBUSY; |
| + |
| /* if card is ready, query current VNICC state */ |
| if (qeth_card_hw_is_reachable(card)) |
| rc = qeth_l2_vnicc_query_chars(card); |
| @@ -2000,15 +1998,14 @@ int qeth_l2_vnicc_set_timeout(struct qeth_card *card, u32 timeout) |
| |
| QETH_CARD_TEXT(card, 2, "vniccsto"); |
| |
| - /* do not change anything if BridgePort is enabled */ |
| - if (qeth_bridgeport_is_in_use(card)) |
| - return -EBUSY; |
| - |
| /* check if characteristic and set_timeout are supported */ |
| if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || |
| !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) |
| return -EOPNOTSUPP; |
| |
| + if (qeth_bridgeport_is_in_use(card)) |
| + return -EBUSY; |
| + |
| /* do we need to do anything? */ |
| if (card->options.vnicc.learning_timeout == timeout) |
| return rc; |
| @@ -2037,14 +2034,14 @@ int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) |
| |
| QETH_CARD_TEXT(card, 2, "vniccgto"); |
| |
| - /* do not get anything if BridgePort is enabled */ |
| - if (qeth_bridgeport_is_in_use(card)) |
| - return -EBUSY; |
| - |
| /* check if characteristic and get_timeout are supported */ |
| if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || |
| !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) |
| return -EOPNOTSUPP; |
| + |
| + if (qeth_bridgeport_is_in_use(card)) |
| + return -EBUSY; |
| + |
| /* if card is ready, get timeout. Otherwise, just return stored value */ |
| *timeout = card->options.vnicc.learning_timeout; |
| if (qeth_card_hw_is_reachable(card)) |
| -- |
| 2.7.4 |
| |