[PATCH 2/5] s390: qeth driver fixes

2007-01-08 Thread Frank Pavlic
[PATCH 2/5] s390: qeth driver fixes

From: Frank Blaschka [EMAIL PROTECTED]
- packet socket support is not complete.
  Recvfrom a packet socket does not fill the sockaddr_ll structure.
  device function hard_header_parse is not implemented.
  For layer 2 mode and layer 3 mode with fake_ll turned on, we have
  the information to fill sockaddr_ll.

Signed-off-by: Frank Pavlic [EMAIL PROTECTED]
---
 drivers/s390/net/qeth_main.c |   58 ++
 1 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c
index 67062d5..337304d 100644
--- a/drivers/s390/net/qeth_main.c
+++ b/drivers/s390/net/qeth_main.c
@@ -3953,13 +3953,22 @@ static inline struct sk_buff *
 qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb,
 struct qeth_hdr **hdr, int ipv)
 {
-   struct sk_buff *new_skb;
+   struct sk_buff *new_skb, *new_skb2;

QETH_DBF_TEXT(trace, 6, prepskb);
-
-new_skb = qeth_realloc_headroom(card, skb, sizeof(struct qeth_hdr));
-   if (new_skb == NULL)
+   new_skb = skb;
+   new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC);
+   if (!new_skb)
return NULL;
+   new_skb2 = qeth_realloc_headroom(card, new_skb,
+sizeof(struct qeth_hdr));
+   if (!new_skb2) {
+   __qeth_free_new_skb(skb, new_skb);
+   return NULL;
+   }
+   if (new_skb != skb)
+   __qeth_free_new_skb(new_skb2, new_skb);
+   new_skb = new_skb2;
*hdr = __qeth_prepare_skb(card, new_skb, ipv);
if (*hdr == NULL) {
__qeth_free_new_skb(skb, new_skb);
@@ -6336,6 +6345,42 @@ static struct ethtool_ops qeth_ethtool_o
 };
 
 static int
+qeth_hard_header_parse(struct sk_buff *skb, unsigned char *haddr)
+{
+   struct qeth_card *card;
+   struct ethhdr *eth;
+
+   card = qeth_get_card_from_dev(skb-dev);
+   if (card-options.layer2)
+   goto haveheader;
+#ifdef CONFIG_QETH_IPV6
+   /* cause of the manipulated arp constructor and the ARP
+  flag for OSAE devices we have some nasty exceptions */
+   if (card-info.type == QETH_CARD_TYPE_OSAE) {
+   if (!card-options.fake_ll) {
+   if ((skb-pkt_type==PACKET_OUTGOING) 
+   (skb-protocol==ETH_P_IPV6))
+   goto haveheader;
+   else
+   return 0;
+   } else {
+   if ((skb-pkt_type==PACKET_OUTGOING) 
+   (skb-protocol==ETH_P_IP))
+   return 0;
+   else
+   goto haveheader;
+   }
+   }
+#endif
+   if (!card-options.fake_ll)
+   return 0;
+haveheader:
+   eth = eth_hdr(skb);
+   memcpy(haddr, eth-h_source, ETH_ALEN);
+   return ETH_ALEN;
+}
+
+static int
 qeth_netdev_init(struct net_device *dev)
 {
struct qeth_card *card;
@@ -6373,7 +6418,10 @@ #endif
if (card-options.fake_ll 
(qeth_get_netdev_flags(card)  IFF_NOARP))
dev-hard_header = qeth_fake_header;
-   dev-hard_header_parse = NULL;
+   if (dev-type == ARPHRD_IEEE802_TR)
+   dev-hard_header_parse = NULL;
+   else
+   dev-hard_header_parse = qeth_hard_header_parse;
dev-set_mac_address = qeth_layer2_set_mac_address;
dev-flags |= qeth_get_netdev_flags(card);
if ((card-options.fake_broadcast) ||
-- 
1.4.2.3

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/5] s390: qeth driver fixes

2006-05-24 Thread Frank Pavlic

From: Ursula Braun [EMAIL PROTECTED]
From: Frank Pavlic [EMAIL PROTECTED]

- correct checking of sscanf-%n value in qeth_string_to_ipaddr().
- don't use netif_stop_queue outside the hard_start_xmit routine. 
  Rather use netif_tx_disable.
- don't call qeth_netdev_init on a recovery.

Signed-off-by: Frank Pavlic [EMAIL PROTECTED]
---

 drivers/s390/net/qeth.h  |2 +-
 drivers/s390/net/qeth_main.c |   22 +++---
 2 files changed, 12 insertions(+), 12 deletions(-)

ef153db1ac07db7ec4eba2ec29237c58944b5c7b
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h
index 4df0fcd..65e2b1b 100644
--- a/drivers/s390/net/qeth.h
+++ b/drivers/s390/net/qeth.h
@@ -1099,7 +1099,7 @@ qeth_string_to_ipaddr4(const char *buf, 
 
rc = sscanf(buf, %d.%d.%d.%d%n, 
in[0], in[1], in[2], in[3], count);
-   if (rc != 4  || count) 
+   if (rc != 4  || count=0)
return -EINVAL;
for (count = 0; count  4; count++) {
if (in[count]  255)
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c
index cb14642..0f6648f 100644
--- a/drivers/s390/net/qeth_main.c
+++ b/drivers/s390/net/qeth_main.c
@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
 
card = (struct qeth_card *) dev-priv;
 
-   netif_stop_queue(dev);
+   netif_tx_disable(dev);
card-dev-flags = ~IFF_UP;
if (card-state == CARD_STATE_UP)
card-state = CARD_STATE_SOFTSETUP;
@@ -6359,12 +6359,9 @@ qeth_netdev_init(struct net_device *dev)
dev-vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
dev-vlan_rx_add_vid = qeth_vlan_rx_add_vid;
 #endif
-   dev-hard_header = card-orig_hard_header;
if (qeth_get_netdev_flags(card)  IFF_NOARP) {
dev-rebuild_header = NULL;
dev-hard_header = NULL;
-   if (card-options.fake_ll)
-   dev-hard_header = qeth_fake_header;
dev-header_cache_update = NULL;
dev-hard_header_cache = NULL;
}
@@ -6477,6 +6474,9 @@ retry:
/*network device will be recovered*/
if (card-dev) {
card-dev-hard_header = card-orig_hard_header;
+   if (card-options.fake_ll  
+   (qeth_get_netdev_flags(card)  IFF_NOARP))
+   card-dev-hard_header = qeth_fake_header;
return 0;
}
/* at first set_online allocate netdev */
@@ -7031,7 +7031,7 @@ qeth_softsetup_ipv6(struct qeth_card *ca
 
QETH_DBF_TEXT(trace,3,softipv6);
 
-   netif_stop_queue(card-dev);
+   netif_tx_disable(card-dev);
rc = qeth_send_startlan(card, QETH_PROT_IPV6);
if (rc) {
PRINT_ERR(IPv6 startlan failed on %s\n,
@@ -7352,7 +7352,8 @@ qeth_set_large_send(struct qeth_card *ca
card-options.large_send = type;
return 0;
}
-   netif_stop_queue(card-dev);
+   if (card-state == CARD_STATE_UP)
+   netif_tx_disable(card-dev);
card-options.large_send = type;
switch (card-options.large_send) {
case QETH_LARGE_SEND_EDDP:
@@ -7374,7 +7375,8 @@ qeth_set_large_send(struct qeth_card *ca
card-dev-features = ~(NETIF_F_TSO | NETIF_F_SG);
break;
}
-   netif_wake_queue(card-dev);
+   if (card-state == CARD_STATE_UP)
+   netif_wake_queue(card-dev);
return rc;
 }
 
@@ -7427,7 +7429,7 @@ qeth_softsetup_card(struct qeth_card *ca
if ((rc = qeth_setrouting_v6(card)))
QETH_DBF_TEXT_(setup, 2, 5err%d, rc);
 out:
-   netif_stop_queue(card-dev);
+   netif_tx_disable(card-dev);
return 0;
 }
 
@@ -7736,10 +7738,8 @@ static int
 qeth_register_netdev(struct qeth_card *card)
 {
QETH_DBF_TEXT(setup, 3, regnetd);
-   if (card-dev-reg_state != NETREG_UNINITIALIZED) {
-   qeth_netdev_init(card-dev);
+   if (card-dev-reg_state != NETREG_UNINITIALIZED) 
return 0;
-   }
/* sysfs magic */
SET_NETDEV_DEV(card-dev, card-gdev-dev);
return register_netdev(card-dev);
-- 
1.2.4

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html