Commit 0f9ad4e7 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 's390-qeth-next'



Julian Wiedmann says:

====================
s390/qeth: updates 2020-09-10

subject to positive review by the bridge maintainers on patch 5,
please apply the following patch series to netdev's net-next tree.

Alexandra adds BR_LEARNING_SYNC support to qeth. In addition to the
main qeth changes (controlling the feature, and raising switchdev
events), this also needs
- Patch 1 and 2 for some s390/cio infrastructure improvements
  (acked by Heiko to go in via net-next), and
- Patch 5 to introduce a new switchdev_notifier_type, so that a driver
  can clear all previously learned entries from the bridge FDB in case
  things go out-of-sync later on.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents afb83012 521c65b6
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -238,7 +238,10 @@ extern void ccw_device_get_schid(struct ccw_device *, struct subchannel_id *);
struct channel_path_desc_fmt0 *ccw_device_get_chp_desc(struct ccw_device *, int);
u8 *ccw_device_get_util_str(struct ccw_device *cdev, int chp_idx);
int ccw_device_pnso(struct ccw_device *cdev,
		    struct chsc_pnso_area *pnso_area,
		    struct chsc_pnso_resume_token resume_token,
		    int cnc);
		    struct chsc_pnso_area *pnso_area, u8 oc,
		    struct chsc_pnso_resume_token resume_token, int cnc);
int ccw_device_get_cssid(struct ccw_device *cdev, u8 *cssid);
int ccw_device_get_iid(struct ccw_device *cdev, u8 *iid);
int ccw_device_get_chpid(struct ccw_device *cdev, int chp_idx, u8 *chpid);
int ccw_device_get_chid(struct ccw_device *cdev, int chp_idx, u16 *chid);
#endif /* _S390_CCWDEV_H_ */
+7 −0
Original line number Diff line number Diff line
@@ -11,6 +11,13 @@

#include <uapi/asm/chsc.h>

/**
 * Operation codes for CHSC PNSO:
 *    PNSO_OC_NET_BRIDGE_INFO - only addresses that are visible to a bridgeport
 *    PNSO_OC_NET_ADDR_INFO   - all addresses
 */
#define PNSO_OC_NET_BRIDGE_INFO		0
#define PNSO_OC_NET_ADDR_INFO		3
/**
 * struct chsc_pnso_naid_l2 - network address information descriptor
 * @nit:  Network interface token
+3 −1
Original line number Diff line number Diff line
@@ -36,7 +36,9 @@ struct css_general_char {
	u64 alt_ssi : 1; /* bit 108 */
	u64 : 1;
	u64 narf : 1;	 /* bit 110 */
	u64 : 12;
	u64 : 5;
	u64 enarf: 1;	 /* bit 116 */
	u64 : 6;
	u64 util_str : 1;/* bit 123 */
} __packed;

+13 −9
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@ int chsc_error_from_response(int response)
	case 0x0100:
	case 0x0102:
		return -ENOMEM;
	case 0x0108:		/* "HW limit exceeded" for the op 0x003d */
		return -EUSERS;
	default:
		return -EIO;
	}
@@ -1114,7 +1116,7 @@ int chsc_enable_facility(int operation_code)
	return ret;
}

int __init chsc_get_cssid(int idx)
int __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid)
{
	struct {
		struct chsc_header request;
@@ -1125,7 +1127,8 @@ int __init chsc_get_cssid(int idx)
		u32 reserved2[3];
		struct {
			u8 cssid;
			u32 : 24;
			u8 iid;
			u32 : 16;
		} list[0];
	} *sdcal_area;
	int ret;
@@ -1151,8 +1154,10 @@ int __init chsc_get_cssid(int idx)
	}

	if ((addr_t) &sdcal_area->list[idx] <
	    (addr_t) &sdcal_area->response + sdcal_area->response.length)
		ret = sdcal_area->list[idx].cssid;
	    (addr_t) &sdcal_area->response + sdcal_area->response.length) {
		*cssid = sdcal_area->list[idx].cssid;
		*iid = sdcal_area->list[idx].iid;
	}
	else
		ret = -ENODEV;
exit:
@@ -1340,6 +1345,7 @@ EXPORT_SYMBOL_GPL(chsc_scm_info);
 * chsc_pnso() - Perform Network-Subchannel Operation
 * @schid:		id of the subchannel on which PNSO is performed
 * @pnso_area:		request and response block for the operation
 * @oc:			Operation Code
 * @resume_token:	resume token for multiblock response
 * @cnc:		Boolean change-notification control
 *
@@ -1347,10 +1353,8 @@ EXPORT_SYMBOL_GPL(chsc_scm_info);
 *
 * Returns 0 on success.
 */
int chsc_pnso(struct subchannel_id schid,
	      struct chsc_pnso_area *pnso_area,
	      struct chsc_pnso_resume_token resume_token,
	      int cnc)
int chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
	      u8 oc, struct chsc_pnso_resume_token resume_token, int cnc)
{
	memset(pnso_area, 0, sizeof(*pnso_area));
	pnso_area->request.length = 0x0030;
@@ -1359,7 +1363,7 @@ int chsc_pnso(struct subchannel_id schid,
	pnso_area->ssid  = schid.ssid;
	pnso_area->sch	 = schid.sch_no;
	pnso_area->cssid = schid.cssid;
	pnso_area->oc	 = 0; /* Store-network-bridging-information list */
	pnso_area->oc	 = oc;
	pnso_area->resume_token = resume_token;
	pnso_area->n	   = (cnc != 0);
	if (chsc(pnso_area))
+3 −5
Original line number Diff line number Diff line
@@ -205,12 +205,10 @@ struct chsc_scm_info {

int chsc_scm_info(struct chsc_scm_info *scm_area, u64 token);

int chsc_pnso(struct subchannel_id schid,
	      struct chsc_pnso_area *pnso_area,
	      struct chsc_pnso_resume_token resume_token,
	      int cnc);
int chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
	      u8 oc, struct chsc_pnso_resume_token resume_token, int cnc);

int __init chsc_get_cssid(int idx);
int __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid);

#ifdef CONFIG_SCM_BUS
int scm_update_information(void);
Loading