Commit 1fe5b012 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 's390-net-updates-2021-12-06'

Alexandra Winter says:

====================
s390/net: updates 2021-12-06

This brings some maintenance improvements and removes some
unnecessary code checks.
====================

Link: https://lore.kernel.org/r/20211207090452.1155688-1-wintera@linux.ibm.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c0e084e3 6dc490e8
...@@ -1030,8 +1030,6 @@ static inline int qeth_send_simple_setassparms_v6(struct qeth_card *card, ...@@ -1030,8 +1030,6 @@ static inline int qeth_send_simple_setassparms_v6(struct qeth_card *card,
data, QETH_PROT_IPV6); data, QETH_PROT_IPV6);
} }
int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb);
extern const struct qeth_discipline qeth_l2_discipline; extern const struct qeth_discipline qeth_l2_discipline;
extern const struct qeth_discipline qeth_l3_discipline; extern const struct qeth_discipline qeth_l3_discipline;
extern const struct ethtool_ops qeth_ethtool_ops; extern const struct ethtool_ops qeth_ethtool_ops;
...@@ -1099,6 +1097,8 @@ void qeth_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats); ...@@ -1099,6 +1097,8 @@ void qeth_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats);
int qeth_set_real_num_tx_queues(struct qeth_card *card, unsigned int count); int qeth_set_real_num_tx_queues(struct qeth_card *card, unsigned int count);
u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb, u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
u8 cast_type, struct net_device *sb_dev); u8 cast_type, struct net_device *sb_dev);
u16 qeth_osa_select_queue(struct net_device *dev, struct sk_buff *skb,
struct net_device *sb_dev);
int qeth_open(struct net_device *dev); int qeth_open(struct net_device *dev);
int qeth_stop(struct net_device *dev); int qeth_stop(struct net_device *dev);
......
...@@ -3635,12 +3635,10 @@ static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue) ...@@ -3635,12 +3635,10 @@ static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue)
if ((atomic_read(&queue->used_buffers) <= QETH_LOW_WATERMARK_PACK) || if ((atomic_read(&queue->used_buffers) <= QETH_LOW_WATERMARK_PACK) ||
!atomic_read(&queue->set_pci_flags_count)) { !atomic_read(&queue->set_pci_flags_count)) {
unsigned int index, flush_cnt; unsigned int index, flush_cnt;
bool q_was_packing;
spin_lock(&queue->lock); spin_lock(&queue->lock);
index = queue->next_buf_to_fill; index = queue->next_buf_to_fill;
q_was_packing = queue->do_pack;
flush_cnt = qeth_switch_to_nonpacking_if_needed(queue); flush_cnt = qeth_switch_to_nonpacking_if_needed(queue);
if (!flush_cnt && !atomic_read(&queue->set_pci_flags_count)) if (!flush_cnt && !atomic_read(&queue->set_pci_flags_count))
...@@ -3648,8 +3646,7 @@ static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue) ...@@ -3648,8 +3646,7 @@ static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue)
if (flush_cnt) { if (flush_cnt) {
qeth_flush_buffers(queue, index, flush_cnt); qeth_flush_buffers(queue, index, flush_cnt);
if (q_was_packing) QETH_TXQ_STAT_ADD(queue, bufs_pack, flush_cnt);
QETH_TXQ_STAT_ADD(queue, bufs_pack, flush_cnt);
} }
spin_unlock(&queue->lock); spin_unlock(&queue->lock);
...@@ -3769,7 +3766,7 @@ static void qeth_qdio_output_handler(struct ccw_device *ccwdev, ...@@ -3769,7 +3766,7 @@ static void qeth_qdio_output_handler(struct ccw_device *ccwdev,
/* /*
* Note: Function assumes that we have 4 outbound queues. * Note: Function assumes that we have 4 outbound queues.
*/ */
int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb) static int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb)
{ {
struct vlan_ethhdr *veth = vlan_eth_hdr(skb); struct vlan_ethhdr *veth = vlan_eth_hdr(skb);
u8 tos; u8 tos;
...@@ -3814,7 +3811,6 @@ int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb) ...@@ -3814,7 +3811,6 @@ int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb)
} }
return card->qdio.default_out_queue; return card->qdio.default_out_queue;
} }
EXPORT_SYMBOL_GPL(qeth_get_priority_queue);
/** /**
* qeth_get_elements_for_frags() - find number of SBALEs for skb frags. * qeth_get_elements_for_frags() - find number of SBALEs for skb frags.
...@@ -5575,29 +5571,9 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, ...@@ -5575,29 +5571,9 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
#endif #endif
static void qeth_receive_skb(struct qeth_card *card, struct sk_buff *skb, static void qeth_receive_skb(struct qeth_card *card, struct sk_buff *skb,
struct qeth_hdr *hdr, bool uses_frags) bool uses_frags, bool is_cso)
{ {
struct napi_struct *napi = &card->napi; struct napi_struct *napi = &card->napi;
bool is_cso;
switch (hdr->hdr.l2.id) {
#if IS_ENABLED(CONFIG_QETH_L3)
case QETH_HEADER_TYPE_LAYER3:
qeth_l3_rebuild_skb(card, skb, hdr);
is_cso = hdr->hdr.l3.ext_flags & QETH_HDR_EXT_CSUM_TRANSP_REQ;
break;
#endif
case QETH_HEADER_TYPE_LAYER2:
is_cso = hdr->hdr.l2.flags[1] & QETH_HDR_EXT_CSUM_TRANSP_REQ;
break;
default:
/* never happens */
if (uses_frags)
napi_free_frags(napi);
else
kfree_skb(skb);
return;
}
if (is_cso && (card->dev->features & NETIF_F_RXCSUM)) { if (is_cso && (card->dev->features & NETIF_F_RXCSUM)) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
...@@ -5654,6 +5630,7 @@ static int qeth_extract_skb(struct qeth_card *card, ...@@ -5654,6 +5630,7 @@ static int qeth_extract_skb(struct qeth_card *card,
struct qeth_hdr *hdr; struct qeth_hdr *hdr;
struct sk_buff *skb; struct sk_buff *skb;
int skb_len = 0; int skb_len = 0;
bool is_cso;
element = &buffer->element[*element_no]; element = &buffer->element[*element_no];
...@@ -5673,11 +5650,15 @@ static int qeth_extract_skb(struct qeth_card *card, ...@@ -5673,11 +5650,15 @@ static int qeth_extract_skb(struct qeth_card *card,
switch (hdr->hdr.l2.id) { switch (hdr->hdr.l2.id) {
case QETH_HEADER_TYPE_LAYER2: case QETH_HEADER_TYPE_LAYER2:
skb_len = hdr->hdr.l2.pkt_length; skb_len = hdr->hdr.l2.pkt_length;
is_cso = hdr->hdr.l2.flags[1] & QETH_HDR_EXT_CSUM_TRANSP_REQ;
linear_len = ETH_HLEN; linear_len = ETH_HLEN;
headroom = 0; headroom = 0;
break; break;
case QETH_HEADER_TYPE_LAYER3: case QETH_HEADER_TYPE_LAYER3:
skb_len = hdr->hdr.l3.length; skb_len = hdr->hdr.l3.length;
is_cso = hdr->hdr.l3.ext_flags & QETH_HDR_EXT_CSUM_TRANSP_REQ;
if (!IS_LAYER3(card)) { if (!IS_LAYER3(card)) {
QETH_CARD_STAT_INC(card, rx_dropped_notsupp); QETH_CARD_STAT_INC(card, rx_dropped_notsupp);
goto walk_packet; goto walk_packet;
...@@ -5804,7 +5785,12 @@ static int qeth_extract_skb(struct qeth_card *card, ...@@ -5804,7 +5785,12 @@ static int qeth_extract_skb(struct qeth_card *card,
*element_no = element - &buffer->element[0]; *element_no = element - &buffer->element[0];
*__offset = offset; *__offset = offset;
qeth_receive_skb(card, skb, hdr, uses_frags); #if IS_ENABLED(CONFIG_QETH_L3)
if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER3)
qeth_l3_rebuild_skb(card, skb, hdr);
#endif
qeth_receive_skb(card, skb, uses_frags, is_cso);
return 0; return 0;
} }
...@@ -7088,6 +7074,18 @@ u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb, ...@@ -7088,6 +7074,18 @@ u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
} }
EXPORT_SYMBOL_GPL(qeth_iqd_select_queue); EXPORT_SYMBOL_GPL(qeth_iqd_select_queue);
u16 qeth_osa_select_queue(struct net_device *dev, struct sk_buff *skb,
struct net_device *sb_dev)
{
struct qeth_card *card = dev->ml_priv;
if (qeth_uses_tx_prio_queueing(card))
return qeth_get_priority_queue(card, skb);
return netdev_pick_tx(dev, skb, sb_dev);
}
EXPORT_SYMBOL_GPL(qeth_osa_select_queue);
int qeth_open(struct net_device *dev) int qeth_open(struct net_device *dev)
{ {
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
......
...@@ -519,19 +519,11 @@ static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb, ...@@ -519,19 +519,11 @@ static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb,
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
static u16 qeth_l2_select_queue(struct net_device *dev, struct sk_buff *skb, static u16 qeth_l2_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
struct net_device *sb_dev) struct net_device *sb_dev)
{ {
struct qeth_card *card = dev->ml_priv; return qeth_iqd_select_queue(dev, skb, qeth_get_ether_cast_type(skb),
sb_dev);
if (IS_IQD(card))
return qeth_iqd_select_queue(dev, skb,
qeth_get_ether_cast_type(skb),
sb_dev);
if (qeth_uses_tx_prio_queueing(card))
return qeth_get_priority_queue(card, skb);
return netdev_pick_tx(dev, skb, sb_dev);
} }
static void qeth_l2_set_rx_mode(struct net_device *dev) static void qeth_l2_set_rx_mode(struct net_device *dev)
...@@ -726,7 +718,8 @@ struct qeth_l2_br2dev_event_work { ...@@ -726,7 +718,8 @@ struct qeth_l2_br2dev_event_work {
unsigned char addr[ETH_ALEN]; unsigned char addr[ETH_ALEN];
}; };
static const struct net_device_ops qeth_l2_netdev_ops; static const struct net_device_ops qeth_l2_iqd_netdev_ops;
static const struct net_device_ops qeth_l2_osa_netdev_ops;
static bool qeth_l2_must_learn(struct net_device *netdev, static bool qeth_l2_must_learn(struct net_device *netdev,
struct net_device *dstdev) struct net_device *dstdev)
...@@ -738,7 +731,8 @@ static bool qeth_l2_must_learn(struct net_device *netdev, ...@@ -738,7 +731,8 @@ static bool qeth_l2_must_learn(struct net_device *netdev,
(priv->brport_features & BR_LEARNING_SYNC) && (priv->brport_features & BR_LEARNING_SYNC) &&
!(br_port_flag_is_set(netdev, BR_ISOLATED) && !(br_port_flag_is_set(netdev, BR_ISOLATED) &&
br_port_flag_is_set(dstdev, BR_ISOLATED)) && br_port_flag_is_set(dstdev, BR_ISOLATED)) &&
netdev->netdev_ops == &qeth_l2_netdev_ops); (netdev->netdev_ops == &qeth_l2_iqd_netdev_ops ||
netdev->netdev_ops == &qeth_l2_osa_netdev_ops));
} }
/** /**
...@@ -1051,20 +1045,20 @@ static int qeth_l2_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh, ...@@ -1051,20 +1045,20 @@ static int qeth_l2_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
return rc; return rc;
} }
static const struct net_device_ops qeth_l2_netdev_ops = { static const struct net_device_ops qeth_l2_iqd_netdev_ops = {
.ndo_open = qeth_open, .ndo_open = qeth_open,
.ndo_stop = qeth_stop, .ndo_stop = qeth_stop,
.ndo_get_stats64 = qeth_get_stats64, .ndo_get_stats64 = qeth_get_stats64,
.ndo_start_xmit = qeth_l2_hard_start_xmit, .ndo_start_xmit = qeth_l2_hard_start_xmit,
.ndo_features_check = qeth_features_check, .ndo_features_check = qeth_features_check,
.ndo_select_queue = qeth_l2_select_queue, .ndo_select_queue = qeth_l2_iqd_select_queue,
.ndo_validate_addr = qeth_l2_validate_addr, .ndo_validate_addr = qeth_l2_validate_addr,
.ndo_set_rx_mode = qeth_l2_set_rx_mode, .ndo_set_rx_mode = qeth_l2_set_rx_mode,
.ndo_eth_ioctl = qeth_do_ioctl, .ndo_eth_ioctl = qeth_do_ioctl,
.ndo_siocdevprivate = qeth_siocdevprivate, .ndo_siocdevprivate = qeth_siocdevprivate,
.ndo_set_mac_address = qeth_l2_set_mac_address, .ndo_set_mac_address = qeth_l2_set_mac_address,
.ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid,
.ndo_tx_timeout = qeth_tx_timeout, .ndo_tx_timeout = qeth_tx_timeout,
.ndo_fix_features = qeth_fix_features, .ndo_fix_features = qeth_fix_features,
.ndo_set_features = qeth_set_features, .ndo_set_features = qeth_set_features,
...@@ -1072,10 +1066,30 @@ static const struct net_device_ops qeth_l2_netdev_ops = { ...@@ -1072,10 +1066,30 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
.ndo_bridge_setlink = qeth_l2_bridge_setlink, .ndo_bridge_setlink = qeth_l2_bridge_setlink,
}; };
static const struct net_device_ops qeth_l2_osa_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_features_check = qeth_features_check,
.ndo_select_queue = qeth_osa_select_queue,
.ndo_validate_addr = qeth_l2_validate_addr,
.ndo_set_rx_mode = qeth_l2_set_rx_mode,
.ndo_eth_ioctl = qeth_do_ioctl,
.ndo_siocdevprivate = qeth_siocdevprivate,
.ndo_set_mac_address = qeth_l2_set_mac_address,
.ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid,
.ndo_tx_timeout = qeth_tx_timeout,
.ndo_fix_features = qeth_fix_features,
.ndo_set_features = qeth_set_features,
};
static int qeth_l2_setup_netdev(struct qeth_card *card) static int qeth_l2_setup_netdev(struct qeth_card *card)
{ {
card->dev->netdev_ops = IS_IQD(card) ? &qeth_l2_iqd_netdev_ops :
&qeth_l2_osa_netdev_ops;
card->dev->needed_headroom = sizeof(struct qeth_hdr); card->dev->needed_headroom = sizeof(struct qeth_hdr);
card->dev->netdev_ops = &qeth_l2_netdev_ops;
card->dev->priv_flags |= IFF_UNICAST_FLT; card->dev->priv_flags |= IFF_UNICAST_FLT;
if (IS_OSM(card)) { if (IS_OSM(card)) {
......
...@@ -1822,17 +1822,6 @@ static u16 qeth_l3_iqd_select_queue(struct net_device *dev, struct sk_buff *skb, ...@@ -1822,17 +1822,6 @@ static u16 qeth_l3_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
qeth_l3_get_cast_type(skb, proto), sb_dev); qeth_l3_get_cast_type(skb, proto), sb_dev);
} }
static u16 qeth_l3_osa_select_queue(struct net_device *dev, struct sk_buff *skb,
struct net_device *sb_dev)
{
struct qeth_card *card = dev->ml_priv;
if (qeth_uses_tx_prio_queueing(card))
return qeth_get_priority_queue(card, skb);
return netdev_pick_tx(dev, skb, sb_dev);
}
static const struct net_device_ops qeth_l3_netdev_ops = { static const struct net_device_ops qeth_l3_netdev_ops = {
.ndo_open = qeth_open, .ndo_open = qeth_open,
.ndo_stop = qeth_stop, .ndo_stop = qeth_stop,
...@@ -1854,7 +1843,7 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { ...@@ -1854,7 +1843,7 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
.ndo_get_stats64 = qeth_get_stats64, .ndo_get_stats64 = qeth_get_stats64,
.ndo_start_xmit = qeth_l3_hard_start_xmit, .ndo_start_xmit = qeth_l3_hard_start_xmit,
.ndo_features_check = qeth_l3_osa_features_check, .ndo_features_check = qeth_l3_osa_features_check,
.ndo_select_queue = qeth_l3_osa_select_queue, .ndo_select_queue = qeth_osa_select_queue,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = qeth_l3_set_rx_mode, .ndo_set_rx_mode = qeth_l3_set_rx_mode,
.ndo_eth_ioctl = qeth_do_ioctl, .ndo_eth_ioctl = qeth_do_ioctl,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment