Skip to content

Commit 0f9ad4e

Browse files
committed
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: David S. Miller <[email protected]>
2 parents afb8301 + 521c65b commit 0f9ad4e

File tree

15 files changed

+611
-53
lines changed

15 files changed

+611
-53
lines changed

arch/s390/include/asm/ccwdev.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,10 @@ extern void ccw_device_get_schid(struct ccw_device *, struct subchannel_id *);
238238
struct channel_path_desc_fmt0 *ccw_device_get_chp_desc(struct ccw_device *, int);
239239
u8 *ccw_device_get_util_str(struct ccw_device *cdev, int chp_idx);
240240
int ccw_device_pnso(struct ccw_device *cdev,
241-
struct chsc_pnso_area *pnso_area,
242-
struct chsc_pnso_resume_token resume_token,
243-
int cnc);
241+
struct chsc_pnso_area *pnso_area, u8 oc,
242+
struct chsc_pnso_resume_token resume_token, int cnc);
243+
int ccw_device_get_cssid(struct ccw_device *cdev, u8 *cssid);
244+
int ccw_device_get_iid(struct ccw_device *cdev, u8 *iid);
245+
int ccw_device_get_chpid(struct ccw_device *cdev, int chp_idx, u8 *chpid);
246+
int ccw_device_get_chid(struct ccw_device *cdev, int chp_idx, u16 *chid);
244247
#endif /* _S390_CCWDEV_H_ */

arch/s390/include/asm/chsc.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111

1212
#include <uapi/asm/chsc.h>
1313

14+
/**
15+
* Operation codes for CHSC PNSO:
16+
* PNSO_OC_NET_BRIDGE_INFO - only addresses that are visible to a bridgeport
17+
* PNSO_OC_NET_ADDR_INFO - all addresses
18+
*/
19+
#define PNSO_OC_NET_BRIDGE_INFO 0
20+
#define PNSO_OC_NET_ADDR_INFO 3
1421
/**
1522
* struct chsc_pnso_naid_l2 - network address information descriptor
1623
* @nit: Network interface token

arch/s390/include/asm/css_chars.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ struct css_general_char {
3636
u64 alt_ssi : 1; /* bit 108 */
3737
u64 : 1;
3838
u64 narf : 1; /* bit 110 */
39-
u64 : 12;
39+
u64 : 5;
40+
u64 enarf: 1; /* bit 116 */
41+
u64 : 6;
4042
u64 util_str : 1;/* bit 123 */
4143
} __packed;
4244

drivers/s390/cio/chsc.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ int chsc_error_from_response(int response)
6565
case 0x0100:
6666
case 0x0102:
6767
return -ENOMEM;
68+
case 0x0108: /* "HW limit exceeded" for the op 0x003d */
69+
return -EUSERS;
6870
default:
6971
return -EIO;
7072
}
@@ -1114,7 +1116,7 @@ int chsc_enable_facility(int operation_code)
11141116
return ret;
11151117
}
11161118

1117-
int __init chsc_get_cssid(int idx)
1119+
int __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid)
11181120
{
11191121
struct {
11201122
struct chsc_header request;
@@ -1125,7 +1127,8 @@ int __init chsc_get_cssid(int idx)
11251127
u32 reserved2[3];
11261128
struct {
11271129
u8 cssid;
1128-
u32 : 24;
1130+
u8 iid;
1131+
u32 : 16;
11291132
} list[0];
11301133
} *sdcal_area;
11311134
int ret;
@@ -1151,8 +1154,10 @@ int __init chsc_get_cssid(int idx)
11511154
}
11521155

11531156
if ((addr_t) &sdcal_area->list[idx] <
1154-
(addr_t) &sdcal_area->response + sdcal_area->response.length)
1155-
ret = sdcal_area->list[idx].cssid;
1157+
(addr_t) &sdcal_area->response + sdcal_area->response.length) {
1158+
*cssid = sdcal_area->list[idx].cssid;
1159+
*iid = sdcal_area->list[idx].iid;
1160+
}
11561161
else
11571162
ret = -ENODEV;
11581163
exit:
@@ -1340,17 +1345,16 @@ EXPORT_SYMBOL_GPL(chsc_scm_info);
13401345
* chsc_pnso() - Perform Network-Subchannel Operation
13411346
* @schid: id of the subchannel on which PNSO is performed
13421347
* @pnso_area: request and response block for the operation
1348+
* @oc: Operation Code
13431349
* @resume_token: resume token for multiblock response
13441350
* @cnc: Boolean change-notification control
13451351
*
13461352
* pnso_area must be allocated by the caller with get_zeroed_page(GFP_KERNEL)
13471353
*
13481354
* Returns 0 on success.
13491355
*/
1350-
int chsc_pnso(struct subchannel_id schid,
1351-
struct chsc_pnso_area *pnso_area,
1352-
struct chsc_pnso_resume_token resume_token,
1353-
int cnc)
1356+
int chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
1357+
u8 oc, struct chsc_pnso_resume_token resume_token, int cnc)
13541358
{
13551359
memset(pnso_area, 0, sizeof(*pnso_area));
13561360
pnso_area->request.length = 0x0030;
@@ -1359,7 +1363,7 @@ int chsc_pnso(struct subchannel_id schid,
13591363
pnso_area->ssid = schid.ssid;
13601364
pnso_area->sch = schid.sch_no;
13611365
pnso_area->cssid = schid.cssid;
1362-
pnso_area->oc = 0; /* Store-network-bridging-information list */
1366+
pnso_area->oc = oc;
13631367
pnso_area->resume_token = resume_token;
13641368
pnso_area->n = (cnc != 0);
13651369
if (chsc(pnso_area))

drivers/s390/cio/chsc.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,10 @@ struct chsc_scm_info {
205205

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

208-
int chsc_pnso(struct subchannel_id schid,
209-
struct chsc_pnso_area *pnso_area,
210-
struct chsc_pnso_resume_token resume_token,
211-
int cnc);
208+
int chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
209+
u8 oc, struct chsc_pnso_resume_token resume_token, int cnc);
212210

213-
int __init chsc_get_cssid(int idx);
211+
int __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid);
214212

215213
#ifdef CONFIG_SCM_BUS
216214
int scm_update_information(void);

drivers/s390/cio/css.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ css_generate_pgid(struct channel_subsystem *css, u32 tod_high)
854854
if (css_general_characteristics.mcss) {
855855
css->global_pgid.pgid_high.ext_cssid.version = 0x80;
856856
css->global_pgid.pgid_high.ext_cssid.cssid =
857-
(css->cssid < 0) ? 0 : css->cssid;
857+
css->id_valid ? css->cssid : 0;
858858
} else {
859859
css->global_pgid.pgid_high.cpu_addr = stap();
860860
}
@@ -877,7 +877,7 @@ static ssize_t real_cssid_show(struct device *dev, struct device_attribute *a,
877877
{
878878
struct channel_subsystem *css = to_css(dev);
879879

880-
if (css->cssid < 0)
880+
if (!css->id_valid)
881881
return -EINVAL;
882882

883883
return sprintf(buf, "%x\n", css->cssid);
@@ -975,7 +975,12 @@ static int __init setup_css(int nr)
975975
css->device.dma_mask = &css->device.coherent_dma_mask;
976976

977977
mutex_init(&css->mutex);
978-
css->cssid = chsc_get_cssid(nr);
978+
ret = chsc_get_cssid_iid(nr, &css->cssid, &css->iid);
979+
if (!ret) {
980+
css->id_valid = true;
981+
pr_info("Partition identifier %01x.%01x\n", css->cssid,
982+
css->iid);
983+
}
979984
css_generate_pgid(css, (u32) (get_tod_clock() >> 32));
980985

981986
ret = device_register(&css->device);

drivers/s390/cio/css.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *);
115115
void css_update_ssd_info(struct subchannel *sch);
116116

117117
struct channel_subsystem {
118-
int cssid;
118+
u8 cssid;
119+
u8 iid;
120+
bool id_valid; /* cssid,iid */
119121
struct channel_path *chps[__MAX_CHPID + 1];
120122
struct device device;
121123
struct pgid global_pgid;

drivers/s390/cio/device_ops.c

Lines changed: 89 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,7 @@ EXPORT_SYMBOL_GPL(ccw_device_get_schid);
714714
* ccw_device_pnso() - Perform Network-Subchannel Operation
715715
* @cdev: device on which PNSO is performed
716716
* @pnso_area: request and response block for the operation
717+
* @oc: Operation Code
717718
* @resume_token: resume token for multiblock response
718719
* @cnc: Boolean change-notification control
719720
*
@@ -722,17 +723,101 @@ EXPORT_SYMBOL_GPL(ccw_device_get_schid);
722723
* Returns 0 on success.
723724
*/
724725
int ccw_device_pnso(struct ccw_device *cdev,
725-
struct chsc_pnso_area *pnso_area,
726-
struct chsc_pnso_resume_token resume_token,
727-
int cnc)
726+
struct chsc_pnso_area *pnso_area, u8 oc,
727+
struct chsc_pnso_resume_token resume_token, int cnc)
728728
{
729729
struct subchannel_id schid;
730730

731731
ccw_device_get_schid(cdev, &schid);
732-
return chsc_pnso(schid, pnso_area, resume_token, cnc);
732+
return chsc_pnso(schid, pnso_area, oc, resume_token, cnc);
733733
}
734734
EXPORT_SYMBOL_GPL(ccw_device_pnso);
735735

736+
/**
737+
* ccw_device_get_cssid() - obtain Channel Subsystem ID
738+
* @cdev: device to obtain the CSSID for
739+
* @cssid: The resulting Channel Subsystem ID
740+
*/
741+
int ccw_device_get_cssid(struct ccw_device *cdev, u8 *cssid)
742+
{
743+
struct device *sch_dev = cdev->dev.parent;
744+
struct channel_subsystem *css = to_css(sch_dev->parent);
745+
746+
if (css->id_valid)
747+
*cssid = css->cssid;
748+
return css->id_valid ? 0 : -ENODEV;
749+
}
750+
EXPORT_SYMBOL_GPL(ccw_device_get_cssid);
751+
752+
/**
753+
* ccw_device_get_iid() - obtain MIF-image ID
754+
* @cdev: device to obtain the MIF-image ID for
755+
* @iid: The resulting MIF-image ID
756+
*/
757+
int ccw_device_get_iid(struct ccw_device *cdev, u8 *iid)
758+
{
759+
struct device *sch_dev = cdev->dev.parent;
760+
struct channel_subsystem *css = to_css(sch_dev->parent);
761+
762+
if (css->id_valid)
763+
*iid = css->iid;
764+
return css->id_valid ? 0 : -ENODEV;
765+
}
766+
EXPORT_SYMBOL_GPL(ccw_device_get_iid);
767+
768+
/**
769+
* ccw_device_get_chpid() - obtain Channel Path ID
770+
* @cdev: device to obtain the Channel Path ID for
771+
* @chp_idx: Index of the channel path
772+
* @chpid: The resulting Channel Path ID
773+
*/
774+
int ccw_device_get_chpid(struct ccw_device *cdev, int chp_idx, u8 *chpid)
775+
{
776+
struct subchannel *sch = to_subchannel(cdev->dev.parent);
777+
int mask;
778+
779+
if ((chp_idx < 0) || (chp_idx > 7))
780+
return -EINVAL;
781+
mask = 0x80 >> chp_idx;
782+
if (!(sch->schib.pmcw.pim & mask))
783+
return -ENODEV;
784+
785+
*chpid = sch->schib.pmcw.chpid[chp_idx];
786+
return 0;
787+
}
788+
EXPORT_SYMBOL_GPL(ccw_device_get_chpid);
789+
790+
/**
791+
* ccw_device_get_chid() - obtain Channel ID associated with specified CHPID
792+
* @cdev: device to obtain the Channel ID for
793+
* @chp_idx: Index of the channel path
794+
* @chid: The resulting Channel ID
795+
*/
796+
int ccw_device_get_chid(struct ccw_device *cdev, int chp_idx, u16 *chid)
797+
{
798+
struct chp_id cssid_chpid;
799+
struct channel_path *chp;
800+
int rc;
801+
802+
chp_id_init(&cssid_chpid);
803+
rc = ccw_device_get_chpid(cdev, chp_idx, &cssid_chpid.id);
804+
if (rc)
805+
return rc;
806+
chp = chpid_to_chp(cssid_chpid);
807+
if (!chp)
808+
return -ENODEV;
809+
810+
mutex_lock(&chp->lock);
811+
if (chp->desc_fmt1.flags & 0x10)
812+
*chid = chp->desc_fmt1.chid;
813+
else
814+
rc = -ENODEV;
815+
mutex_unlock(&chp->lock);
816+
817+
return rc;
818+
}
819+
EXPORT_SYMBOL_GPL(ccw_device_get_chid);
820+
736821
/*
737822
* Allocate zeroed dma coherent 31 bit addressable memory using
738823
* the subchannels dma pool. Maximal size of allocation supported

drivers/s390/net/qeth_core.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,16 +677,24 @@ struct qeth_card_blkt {
677677
enum qeth_pnso_mode {
678678
QETH_PNSO_NONE,
679679
QETH_PNSO_BRIDGEPORT,
680+
QETH_PNSO_ADDR_INFO,
680681
};
681682

682683
#define QETH_BROADCAST_WITH_ECHO 0x01
683684
#define QETH_BROADCAST_WITHOUT_ECHO 0x02
684685
struct qeth_card_info {
685686
unsigned short unit_addr2;
686687
unsigned short cula;
687-
u8 chpid;
688688
__u16 func_level;
689689
char mcl_level[QETH_MCL_LENGTH + 1];
690+
/* doubleword below corresponds to net_if_token */
691+
u16 ddev_devno;
692+
u8 cssid;
693+
u8 iid;
694+
u8 ssid;
695+
u8 chpid;
696+
u16 chid;
697+
u8 ids_valid:1; /* cssid,iid,chid */
690698
u8 dev_addr_is_registered:1;
691699
u8 open_when_online:1;
692700
u8 promisc_mode:1;
@@ -780,6 +788,8 @@ struct qeth_switch_info {
780788

781789
struct qeth_priv {
782790
unsigned int rx_copybreak;
791+
u32 brport_hw_features;
792+
u32 brport_features;
783793
};
784794

785795
#define QETH_NAPI_WEIGHT NAPI_POLL_WEIGHT

0 commit comments

Comments
 (0)