Commit 24386225 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds

[PATCH] s390: qeth network driver

From: Steffen Thoss <thoss@de.ibm.com>
From: Frank Pavlic <pavlic@de.ibm.com>

qeth network driver changes:
 - Improve performance by omitting svs.
 - Use function callback mechanism to set layer 2 parameters when getting
   a reply for a Layer 2 command.
 - dev->hard_header must not be NULL when fake_ll is no set since
   IPv6 and Layer2 needs the default function set by network stack.
 - ping6 works now when running in layer 2 mode.
 - Save original dev->hard_header to restore it when the user doesn't
   want to use fake_ll anymore.
 - Fake ethernet header in outgoing packets. This currently works
   only if qeth is compiled without ipv6 support.
 - Add more debug information in case of failures in qeth_set_offline.
 - Using fake_ll with HiperSockets devices results in misaligned
   ip packets and thus no traffic over HiperSockets.
 - Start qeth_remove_device only after the qeth recovery completed.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7ea9e313
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "qeth_mpc.h" #include "qeth_mpc.h"
#define VERSION_QETH_H "$Revision: 1.129 $" #define VERSION_QETH_H "$Revision: 1.132 $"
#ifdef CONFIG_QETH_IPV6 #ifdef CONFIG_QETH_IPV6
#define QETH_VERSION_IPV6 ":IPv6" #define QETH_VERSION_IPV6 ":IPv6"
...@@ -754,6 +754,8 @@ struct qeth_card { ...@@ -754,6 +754,8 @@ struct qeth_card {
struct qeth_perf_stats perf_stats; struct qeth_perf_stats perf_stats;
#endif /* CONFIG_QETH_PERF_STATS */ #endif /* CONFIG_QETH_PERF_STATS */
int use_hard_stop; int use_hard_stop;
int (*orig_hard_header)(struct sk_buff *,struct net_device *,
unsigned short,void *,void *,unsigned);
}; };
struct qeth_card_list_struct { struct qeth_card_list_struct {
...@@ -828,6 +830,17 @@ qeth_get_netdev_flags(struct qeth_card *card) ...@@ -828,6 +830,17 @@ qeth_get_netdev_flags(struct qeth_card *card)
#endif #endif
} }
} }
static inline struct sk_buff *
qeth_pskb_unshare(struct sk_buff *skb, int pri)
{
struct sk_buff *nskb;
if (!skb_cloned(skb))
return skb;
nskb = skb_copy(skb, pri);
kfree_skb(skb); /* free our shared copy */
return nskb;
}
inline static int inline static int
qeth_get_initial_mtu_for_card(struct qeth_card * card) qeth_get_initial_mtu_for_card(struct qeth_card * card)
...@@ -1071,8 +1084,4 @@ qeth_schedule_recovery(struct qeth_card *); ...@@ -1071,8 +1084,4 @@ qeth_schedule_recovery(struct qeth_card *);
extern int extern int
qeth_realloc_buffer_pool(struct qeth_card *, int); qeth_realloc_buffer_pool(struct qeth_card *, int);
extern int
qeth_fake_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, void *daddr, void *saddr,
unsigned len);
#endif /* __QETH_H__ */ #endif /* __QETH_H__ */
This diff is collapsed.
/* /*
* *
* linux/drivers/s390/net/qeth_sys.c ($Revision: 1.48 $) * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.49 $)
* *
* Linux on zSeries OSA Express and HiperSockets support * Linux on zSeries OSA Express and HiperSockets support
* This file contains code related to sysfs. * This file contains code related to sysfs.
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "qeth_mpc.h" #include "qeth_mpc.h"
#include "qeth_fs.h" #include "qeth_fs.h"
const char *VERSION_QETH_SYS_C = "$Revision: 1.48 $"; const char *VERSION_QETH_SYS_C = "$Revision: 1.49 $";
/*****************************************************************************/ /*****************************************************************************/
/* */ /* */
...@@ -514,19 +514,11 @@ qeth_dev_fake_ll_store(struct device *dev, const char *buf, size_t count) ...@@ -514,19 +514,11 @@ qeth_dev_fake_ll_store(struct device *dev, const char *buf, size_t count)
return -EPERM; return -EPERM;
i = simple_strtoul(buf, &tmp, 16); i = simple_strtoul(buf, &tmp, 16);
if ((i == 0) || (i == 1)) { if ((i != 0) && (i != 1)) {
card->options.fake_ll = i;
if (card->dev) {
if (i)
card->dev->hard_header = qeth_fake_header;
else
card->dev->hard_header = NULL;
}
}
else {
PRINT_WARN("fake_ll: write 0 or 1 to this file!\n"); PRINT_WARN("fake_ll: write 0 or 1 to this file!\n");
return -EINVAL; return -EINVAL;
} }
card->options.fake_ll = i;
return count; return count;
} }
......
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