mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
s390/qeth: vnicc Fix EOPNOTSUPP precedence
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: caa1f0b10d
("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>
This commit is contained in:
parent
16a556eeb7
commit
6f3846f095
1 changed files with 13 additions and 16 deletions
|
@ -1707,15 +1707,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;
|
||||
|
@ -1761,14 +1760,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);
|
||||
|
@ -1786,15 +1784,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;
|
||||
|
@ -1823,14 +1820,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))
|
||||
|
|
Loading…
Reference in a new issue