Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2aa48671 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller
Browse files

s390/qeth: translate SETVLAN/DELVLAN errors



Properly return any error encountered during VLAN processing to the
the caller.
Resulting change in behaviour: if SETVLAN fails while registering a
new VLAN ID, the stack no longer creates the corresponding vlan device.

Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Reviewed-by: default avatarUrsula Braun <ubraun@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab25a501
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -166,6 +166,7 @@ enum qeth_ipa_return_codes {
	IPA_RC_L2_INVALID_VLAN_ID	= 0x2015,
	IPA_RC_L2_INVALID_VLAN_ID	= 0x2015,
	IPA_RC_L2_DUP_VLAN_ID		= 0x2016,
	IPA_RC_L2_DUP_VLAN_ID		= 0x2016,
	IPA_RC_L2_VLAN_ID_NOT_FOUND	= 0x2017,
	IPA_RC_L2_VLAN_ID_NOT_FOUND	= 0x2017,
	IPA_RC_L2_VLAN_ID_NOT_ALLOWED	= 0x2050,
	IPA_RC_VNICC_VNICBP		= 0x20B0,
	IPA_RC_VNICC_VNICBP		= 0x20B0,
	IPA_RC_SBP_OSA_NOT_CONFIGURED	= 0x2B0C,
	IPA_RC_SBP_OSA_NOT_CONFIGURED	= 0x2B0C,
	IPA_RC_SBP_OSA_OS_MISMATCH	= 0x2B10,
	IPA_RC_SBP_OSA_OS_MISMATCH	= 0x2B10,
+35 −12
Original line number Original line Diff line number Diff line
@@ -78,7 +78,7 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
	return ndev;
	return ndev;
}
}


static int qeth_setdel_makerc(struct qeth_card *card, int retcode)
static int qeth_setdelmac_makerc(struct qeth_card *card, int retcode)
{
{
	int rc;
	int rc;


@@ -128,7 +128,7 @@ static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
	cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
	cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
	memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
	memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
	return qeth_setdel_makerc(card, qeth_send_ipa_cmd(card, iob,
	return qeth_setdelmac_makerc(card, qeth_send_ipa_cmd(card, iob,
					   NULL, NULL));
					   NULL, NULL));
}
}


@@ -289,16 +289,39 @@ static void qeth_l2_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb,
	}
	}
}
}


static int qeth_setdelvlan_makerc(struct qeth_card *card, int retcode)
{
	if (retcode)
		QETH_CARD_TEXT_(card, 2, "err%04x", retcode);

	switch (retcode) {
	case IPA_RC_SUCCESS:
		return 0;
	case IPA_RC_L2_INVALID_VLAN_ID:
		return -EINVAL;
	case IPA_RC_L2_DUP_VLAN_ID:
		return -EEXIST;
	case IPA_RC_L2_VLAN_ID_NOT_FOUND:
		return -ENOENT;
	case IPA_RC_L2_VLAN_ID_NOT_ALLOWED:
		return -EPERM;
	case -ENOMEM:
		return -ENOMEM;
	default:
		return -EIO;
	}
}

static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
			struct qeth_reply *reply, unsigned long data)
				      struct qeth_reply *reply,
				      unsigned long data)
{
{
	struct qeth_ipa_cmd *cmd;
	struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;


	QETH_CARD_TEXT(card, 2, "L2sdvcb");
	QETH_CARD_TEXT(card, 2, "L2sdvcb");
	cmd = (struct qeth_ipa_cmd *) data;
	if (cmd->hdr.return_code) {
	if (cmd->hdr.return_code) {
		QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
		QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x.\n",
			  "Continuing\n", cmd->data.setdelvlan.vlan_id,
				 cmd->data.setdelvlan.vlan_id,
				 QETH_CARD_IFNAME(card), cmd->hdr.return_code);
				 QETH_CARD_IFNAME(card), cmd->hdr.return_code);
		QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
		QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
@@ -318,8 +341,8 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
		return -ENOMEM;
		return -ENOMEM;
	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
	cmd->data.setdelvlan.vlan_id = i;
	cmd->data.setdelvlan.vlan_id = i;
	return qeth_send_ipa_cmd(card, iob,
	return qeth_setdelvlan_makerc(card, qeth_send_ipa_cmd(card, iob,
				 qeth_l2_send_setdelvlan_cb, NULL);
					    qeth_l2_send_setdelvlan_cb, NULL));
}
}


static void qeth_l2_process_vlans(struct qeth_card *card)
static void qeth_l2_process_vlans(struct qeth_card *card)