[PATCH] s390: qeth driver fixes
From: Frank Blaschka <Frank.Blaschka@de.ibm.com> From: Frank Pavlic <fpavlic@de.ibm.com> - fix fake_ll during initial device bringup. fake_ll was not active after first start of the device. Problem only occured when qeth was built without IPV6 support. - avoid skb usage after invocation of qeth_flush_buffers, because skb might already be freed. - remove yet another useless netif_wake_queue in qeth_softsetup_ipv6 since this function is only called when device is going online. In this case card->state will never be in state UP. So let the net_device queue down . Signed-off-by: Frank Pavlic <fpavlic@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
b85e1fa196
commit
ba1aa084d6
@@ -3798,11 +3798,11 @@ qeth_open(struct net_device *dev)
|
|||||||
QETH_DBF_TEXT(trace,4,"nomacadr");
|
QETH_DBF_TEXT(trace,4,"nomacadr");
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
card->dev->flags |= IFF_UP;
|
|
||||||
netif_start_queue(dev);
|
|
||||||
card->data.state = CH_STATE_UP;
|
card->data.state = CH_STATE_UP;
|
||||||
card->state = CARD_STATE_UP;
|
card->state = CARD_STATE_UP;
|
||||||
|
card->dev->flags |= IFF_UP;
|
||||||
|
netif_start_queue(dev);
|
||||||
|
|
||||||
if (!card->lan_online && netif_carrier_ok(dev))
|
if (!card->lan_online && netif_carrier_ok(dev))
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
|
|||||||
#endif
|
#endif
|
||||||
*hdr = (struct qeth_hdr *)
|
*hdr = (struct qeth_hdr *)
|
||||||
qeth_push_skb(card, skb, sizeof(struct qeth_hdr));
|
qeth_push_skb(card, skb, sizeof(struct qeth_hdr));
|
||||||
if (hdr == NULL)
|
if (*hdr == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||||||
enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
|
enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
|
||||||
struct qeth_eddp_context *ctx = NULL;
|
struct qeth_eddp_context *ctx = NULL;
|
||||||
int tx_bytes = skb->len;
|
int tx_bytes = skb->len;
|
||||||
|
unsigned short nr_frags = skb_shinfo(skb)->nr_frags;
|
||||||
|
unsigned short tso_size = skb_shinfo(skb)->tso_size;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
QETH_DBF_TEXT(trace, 6, "sendpkt");
|
QETH_DBF_TEXT(trace, 6, "sendpkt");
|
||||||
@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||||||
card->stats.tx_packets++;
|
card->stats.tx_packets++;
|
||||||
card->stats.tx_bytes += tx_bytes;
|
card->stats.tx_bytes += tx_bytes;
|
||||||
#ifdef CONFIG_QETH_PERF_STATS
|
#ifdef CONFIG_QETH_PERF_STATS
|
||||||
if (skb_shinfo(skb)->tso_size &&
|
if (tso_size &&
|
||||||
!(large_send == QETH_LARGE_SEND_NO)) {
|
!(large_send == QETH_LARGE_SEND_NO)) {
|
||||||
card->perf_stats.large_send_bytes += skb->len;
|
card->perf_stats.large_send_bytes += tx_bytes;
|
||||||
card->perf_stats.large_send_cnt++;
|
card->perf_stats.large_send_cnt++;
|
||||||
}
|
}
|
||||||
if (skb_shinfo(skb)->nr_frags > 0){
|
if (nr_frags > 0){
|
||||||
card->perf_stats.sg_skbs_sent++;
|
card->perf_stats.sg_skbs_sent++;
|
||||||
/* nr_frags + skb->data */
|
/* nr_frags + skb->data */
|
||||||
card->perf_stats.sg_frags_sent +=
|
card->perf_stats.sg_frags_sent +=
|
||||||
skb_shinfo(skb)->nr_frags + 1;
|
nr_frags + 1;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_QETH_PERF_STATS */
|
#endif /* CONFIG_QETH_PERF_STATS */
|
||||||
}
|
}
|
||||||
@@ -6370,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
|
|||||||
if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
|
if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
|
||||||
card->dev->dev_id = card->info.unique_id & 0xffff;
|
card->dev->dev_id = card->info.unique_id & 0xffff;
|
||||||
#endif
|
#endif
|
||||||
|
if (card->options.fake_ll &&
|
||||||
|
(qeth_get_netdev_flags(card) & IFF_NOARP))
|
||||||
|
dev->hard_header = qeth_fake_header;
|
||||||
dev->hard_header_parse = NULL;
|
dev->hard_header_parse = NULL;
|
||||||
dev->set_mac_address = qeth_layer2_set_mac_address;
|
dev->set_mac_address = qeth_layer2_set_mac_address;
|
||||||
dev->flags |= qeth_get_netdev_flags(card);
|
dev->flags |= qeth_get_netdev_flags(card);
|
||||||
@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
|
|||||||
|
|
||||||
QETH_DBF_TEXT(trace,3,"softipv6");
|
QETH_DBF_TEXT(trace,3,"softipv6");
|
||||||
|
|
||||||
netif_tx_disable(card->dev);
|
|
||||||
rc = qeth_send_startlan(card, QETH_PROT_IPV6);
|
rc = qeth_send_startlan(card, QETH_PROT_IPV6);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
PRINT_ERR("IPv6 startlan failed on %s\n",
|
PRINT_ERR("IPv6 startlan failed on %s\n",
|
||||||
QETH_CARD_IFNAME(card));
|
QETH_CARD_IFNAME(card));
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
netif_wake_queue(card->dev);
|
|
||||||
rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
|
rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
PRINT_ERR("IPv6 query ipassist failed on %s\n",
|
PRINT_ERR("IPv6 query ipassist failed on %s\n",
|
||||||
|
Reference in New Issue
Block a user