Skip to content

Commit

Permalink
s390/qeth: split out OSN netdev ops
Browse files Browse the repository at this point in the history
Rather than special-casing OSN in a number of places, just give this
device type its own netdev_ops structure.

When setting up the OSN net_device, also skip the handling of the
various HW offloads (eg TSO). The device shouldn't be advertising any of
them, and the OSN code paths in qeth don't have support for them.
In particular RX VLAN filtering is not supported, so don't hook up those
callbacks in the netdev_ops.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Julian Wiedmann authored and David S. Miller committed Feb 16, 2019
1 parent 1b4d5e1 commit 8024cc9
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 15 deletions.
3 changes: 0 additions & 3 deletions drivers/s390/net/qeth_core_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5850,9 +5850,6 @@ int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
if (!card)
return -ENODEV;

if (card->info.type == QETH_CARD_TYPE_OSN)
return -EPERM;

switch (cmd) {
case SIOC_QETH_ADP_SET_SNMP_CONTROL:
rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
Expand Down
1 change: 1 addition & 0 deletions drivers/s390/net/qeth_core_mpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ enum qeth_card_types {
#define IS_OSD(card) ((card)->info.type == QETH_CARD_TYPE_OSD)
#define IS_OSM(card) ((card)->info.type == QETH_CARD_TYPE_OSM)
#define IS_OSN(card) ((card)->info.type == QETH_CARD_TYPE_OSN)
#define IS_OSX(card) ((card)->info.type == QETH_CARD_TYPE_OSX)
#define IS_VM_NIC(card) ((card)->info.guestlan)

#define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
Expand Down
32 changes: 20 additions & 12 deletions drivers/s390/net/qeth_l2_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ static int qeth_l2_validate_addr(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;

if (IS_OSN(card) || (card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
if (card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)
return eth_validate_addr(dev);

QETH_CARD_TEXT(card, 4, "nomacadr");
Expand All @@ -441,9 +441,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p)

QETH_CARD_TEXT(card, 3, "setmac");

if (card->info.type == QETH_CARD_TYPE_OSN ||
card->info.type == QETH_CARD_TYPE_OSM ||
card->info.type == QETH_CARD_TYPE_OSX) {
if (IS_OSM(card) || IS_OSX(card)) {
QETH_CARD_TEXT(card, 3, "setmcTYP");
return -EOPNOTSUPP;
}
Expand Down Expand Up @@ -537,9 +535,6 @@ static void qeth_l2_set_rx_mode(struct net_device *dev)
int i;
int rc;

if (card->info.type == QETH_CARD_TYPE_OSN)
return;

QETH_CARD_TEXT(card, 3, "setmulti");

spin_lock_bh(&card->mclock);
Expand Down Expand Up @@ -713,16 +708,28 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
.ndo_set_features = qeth_set_features
};

static const struct net_device_ops qeth_osn_netdev_ops = {
.ndo_open = qeth_open,
.ndo_stop = qeth_stop,
.ndo_get_stats64 = qeth_get_stats64,
.ndo_start_xmit = qeth_l2_hard_start_xmit,
.ndo_validate_addr = eth_validate_addr,
.ndo_tx_timeout = qeth_tx_timeout,
};

static int qeth_l2_setup_netdev(struct qeth_card *card, bool carrier_ok)
{
int rc;

card->dev->priv_flags |= IFF_UNICAST_FLT;
card->dev->netdev_ops = &qeth_l2_netdev_ops;
if (IS_OSN(card))
if (IS_OSN(card)) {
card->dev->netdev_ops = &qeth_osn_netdev_ops;
card->dev->flags |= IFF_NOARP;
else
card->dev->needed_headroom = sizeof(struct qeth_hdr);
goto add_napi;
}

card->dev->needed_headroom = sizeof(struct qeth_hdr);
card->dev->netdev_ops = &qeth_l2_netdev_ops;
card->dev->priv_flags |= IFF_UNICAST_FLT;

if (IS_OSM(card)) {
card->dev->features |= NETIF_F_VLAN_CHALLENGED;
Expand Down Expand Up @@ -764,6 +771,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card, bool carrier_ok)
PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1));
}

add_napi:
netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
rc = register_netdev(card->dev);
if (!rc && carrier_ok)
Expand Down

0 comments on commit 8024cc9

Please sign in to comment.