* [patch 1/7] [PATCH] af_iucv: handle netdev events
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:06 ` [patch 2/7] [PATCH] af_iucv: add shutdown for HS transport frank.blaschka
` (6 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Ursula Braun
[-- Attachment #1: 605-af_iucv-netdev-events.diff --]
[-- Type: text/plain, Size: 5427 bytes --]
From: Ursula Braun <ursula.braun@de.ibm.com>
In case of transport through HiperSockets the underlying network
interface may switch to DOWN state or the underlying network device
may recover. In both cases the socket must change to IUCV_DISCONN
state. If the interface goes down, af_iucv has a chance to notify
its connection peer in addition.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
net/iucv/af_iucv.c | 106 +++++++++++++++++++++++++++++++----------------------
1 file changed, 62 insertions(+), 44 deletions(-)
diff -urpN linux-2.6/net/iucv/af_iucv.c linux-2.6-patched/net/iucv/af_iucv.c
--- linux-2.6/net/iucv/af_iucv.c 2012-03-06 13:35:57.000000000 +0100
+++ linux-2.6-patched/net/iucv/af_iucv.c 2012-03-06 13:35:57.000000000 +0100
@@ -453,14 +453,28 @@ static void iucv_sever_path(struct sock
}
}
+/* Send FIN through an IUCV socket for HIPER transport */
+static int iucv_send_ctrl(struct sock *sk, u8 flags)
+{
+ int err = 0;
+ int blen;
+ struct sk_buff *skb;
+
+ blen = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN;
+ skb = sock_alloc_send_skb(sk, blen, 1, &err);
+ if (skb) {
+ skb_reserve(skb, blen);
+ err = afiucv_hs_send(NULL, sk, skb, flags);
+ }
+ return err;
+}
+
/* Close an IUCV socket */
static void iucv_sock_close(struct sock *sk)
{
struct iucv_sock *iucv = iucv_sk(sk);
unsigned long timeo;
int err = 0;
- int blen;
- struct sk_buff *skb;
lock_sock(sk);
@@ -471,14 +485,7 @@ static void iucv_sock_close(struct sock
case IUCV_CONNECTED:
if (iucv->transport == AF_IUCV_TRANS_HIPER) {
- /* send fin */
- blen = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN;
- skb = sock_alloc_send_skb(sk, blen, 1, &err);
- if (skb) {
- skb_reserve(skb, blen);
- err = afiucv_hs_send(NULL, sk, skb,
- AF_IUCV_FLAG_FIN);
- }
+ err = iucv_send_ctrl(sk, AF_IUCV_FLAG_FIN);
sk->sk_state = IUCV_DISCONN;
sk->sk_state_change(sk);
}
@@ -782,26 +789,6 @@ static int iucv_sock_autobind(struct soc
return err;
}
-static int afiucv_hs_connect(struct socket *sock)
-{
- struct sock *sk = sock->sk;
- struct sk_buff *skb;
- int blen = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN;
- int err = 0;
-
- /* send syn */
- skb = sock_alloc_send_skb(sk, blen, 1, &err);
- if (!skb) {
- err = -ENOMEM;
- goto done;
- }
- skb->dev = NULL;
- skb_reserve(skb, blen);
- err = afiucv_hs_send(NULL, sk, skb, AF_IUCV_FLAG_SYN);
-done:
- return err;
-}
-
static int afiucv_path_connect(struct socket *sock, struct sockaddr *addr)
{
struct sockaddr_iucv *sa = (struct sockaddr_iucv *) addr;
@@ -882,7 +869,7 @@ static int iucv_sock_connect(struct sock
memcpy(iucv->dst_name, sa->siucv_name, 8);
if (iucv->transport == AF_IUCV_TRANS_HIPER)
- err = afiucv_hs_connect(sock);
+ err = iucv_send_ctrl(sock->sk, AF_IUCV_FLAG_SYN);
else
err = afiucv_path_connect(sock, addr);
if (err)
@@ -1332,8 +1319,7 @@ static int iucv_sock_recvmsg(struct kioc
struct sock *sk = sock->sk;
struct iucv_sock *iucv = iucv_sk(sk);
unsigned int copied, rlen;
- struct sk_buff *skb, *rskb, *cskb, *sskb;
- int blen;
+ struct sk_buff *skb, *rskb, *cskb;
int err = 0;
if ((sk->sk_state == IUCV_DISCONN) &&
@@ -1422,15 +1408,7 @@ static int iucv_sock_recvmsg(struct kioc
iucv_process_message_q(sk);
if (atomic_read(&iucv->msg_recv) >=
iucv->msglimit / 2) {
- /* send WIN to peer */
- blen = sizeof(struct af_iucv_trans_hdr) +
- ETH_HLEN;
- sskb = sock_alloc_send_skb(sk, blen, 1, &err);
- if (sskb) {
- skb_reserve(sskb, blen);
- err = afiucv_hs_send(NULL, sk, sskb,
- AF_IUCV_FLAG_WIN);
- }
+ err = iucv_send_ctrl(sk, AF_IUCV_FLAG_WIN);
if (err) {
sk->sk_state = IUCV_DISCONN;
sk->sk_state_change(sk);
@@ -2289,6 +2267,44 @@ out_unlock:
}
}
+
+/*
+ * afiucv_netdev_event: handle netdev notifier chain events
+ */
+static int afiucv_netdev_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ struct net_device *event_dev = (struct net_device *)ptr;
+ struct hlist_node *node;
+ struct sock *sk;
+ struct iucv_sock *iucv;
+
+ switch (event) {
+ case NETDEV_REBOOT:
+ case NETDEV_GOING_DOWN:
+ sk_for_each(sk, node, &iucv_sk_list.head) {
+ iucv = iucv_sk(sk);
+ if ((iucv->hs_dev == event_dev) &&
+ (sk->sk_state == IUCV_CONNECTED)) {
+ if (event == NETDEV_GOING_DOWN)
+ iucv_send_ctrl(sk, AF_IUCV_FLAG_FIN);
+ sk->sk_state = IUCV_DISCONN;
+ sk->sk_state_change(sk);
+ }
+ }
+ break;
+ case NETDEV_DOWN:
+ case NETDEV_UNREGISTER:
+ default:
+ break;
+ }
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block afiucv_netdev_notifier = {
+ .notifier_call = afiucv_netdev_event,
+};
+
static const struct proto_ops iucv_sock_ops = {
.family = PF_IUCV,
.owner = THIS_MODULE,
@@ -2388,7 +2404,8 @@ static int __init afiucv_init(void)
err = afiucv_iucv_init();
if (err)
goto out_sock;
- }
+ } else
+ register_netdevice_notifier(&afiucv_netdev_notifier);
dev_add_pack(&iucv_packet_type);
return 0;
@@ -2409,7 +2426,8 @@ static void __exit afiucv_exit(void)
driver_unregister(&af_iucv_driver);
pr_iucv->iucv_unregister(&af_iucv_handler, 0);
symbol_put(iucv_if);
- }
+ } else
+ unregister_netdevice_notifier(&afiucv_netdev_notifier);
dev_remove_pack(&iucv_packet_type);
sock_unregister(PF_IUCV);
proto_unregister(&iucv_proto);
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 2/7] [PATCH] af_iucv: add shutdown for HS transport
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
2012-03-07 12:06 ` [patch 1/7] [PATCH] af_iucv: handle netdev events frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:06 ` [patch 3/7] [PATCH] qeth: synchronize discipline module loading frank.blaschka
` (5 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Ursula Braun
[-- Attachment #1: 606-af_iucv-hs-shutdown.diff --]
[-- Type: text/plain, Size: 4550 bytes --]
From: Ursula Braun <ursula.braun@de.ibm.com>
AF_IUCV sockets offer a shutdown function. This patch makes sure
shutdown works for HS transport as well.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
include/net/iucv/af_iucv.h | 1
net/iucv/af_iucv.c | 79 +++++++++++++++++++++++++++++----------------
2 files changed, 53 insertions(+), 27 deletions(-)
diff -urpN linux-2.6/include/net/iucv/af_iucv.h linux-2.6-patched/include/net/iucv/af_iucv.h
--- linux-2.6/include/net/iucv/af_iucv.h 2012-03-06 13:35:57.000000000 +0100
+++ linux-2.6-patched/include/net/iucv/af_iucv.h 2012-03-06 13:35:57.000000000 +0100
@@ -62,6 +62,7 @@ struct sock_msg_q {
#define AF_IUCV_FLAG_SYN 0x2
#define AF_IUCV_FLAG_FIN 0x4
#define AF_IUCV_FLAG_WIN 0x8
+#define AF_IUCV_FLAG_SHT 0x10
struct af_iucv_trans_hdr {
u16 magic;
diff -urpN linux-2.6/net/iucv/af_iucv.c linux-2.6-patched/net/iucv/af_iucv.c
--- linux-2.6/net/iucv/af_iucv.c 2012-03-06 13:35:57.000000000 +0100
+++ linux-2.6-patched/net/iucv/af_iucv.c 2012-03-06 13:35:57.000000000 +0100
@@ -165,8 +165,6 @@ static int afiucv_pm_freeze(struct devic
read_lock(&iucv_sk_list.lock);
sk_for_each(sk, node, &iucv_sk_list.head) {
iucv = iucv_sk(sk);
- skb_queue_purge(&iucv->send_skb_q);
- skb_queue_purge(&iucv->backlog_skb_q);
switch (sk->sk_state) {
case IUCV_DISCONN:
case IUCV_CLOSING:
@@ -405,7 +403,19 @@ static struct sock *__iucv_get_sock_by_n
static void iucv_sock_destruct(struct sock *sk)
{
skb_queue_purge(&sk->sk_receive_queue);
- skb_queue_purge(&sk->sk_write_queue);
+ skb_queue_purge(&sk->sk_error_queue);
+
+ sk_mem_reclaim(sk);
+
+ if (!sock_flag(sk, SOCK_DEAD)) {
+ pr_err("Attempt to release alive iucv socket %p\n", sk);
+ return;
+ }
+
+ WARN_ON(atomic_read(&sk->sk_rmem_alloc));
+ WARN_ON(atomic_read(&sk->sk_wmem_alloc));
+ WARN_ON(sk->sk_wmem_queued);
+ WARN_ON(sk->sk_forward_alloc);
}
/* Cleanup Listen */
@@ -1342,6 +1352,8 @@ static int iucv_sock_recvmsg(struct kioc
rlen = skb->len; /* real length of skb */
copied = min_t(unsigned int, rlen, len);
+ if (!rlen)
+ sk->sk_shutdown = sk->sk_shutdown | RCV_SHUTDOWN;
cskb = skb;
if (skb_copy_datagram_iovec(cskb, 0, msg->msg_iov, copied)) {
@@ -1493,42 +1505,47 @@ static int iucv_sock_shutdown(struct soc
lock_sock(sk);
switch (sk->sk_state) {
+ case IUCV_LISTEN:
case IUCV_DISCONN:
case IUCV_CLOSING:
case IUCV_CLOSED:
err = -ENOTCONN;
goto fail;
-
default:
- sk->sk_shutdown |= how;
break;
}
if (how == SEND_SHUTDOWN || how == SHUTDOWN_MASK) {
- txmsg.class = 0;
- txmsg.tag = 0;
- err = pr_iucv->message_send(iucv->path, &txmsg, IUCV_IPRMDATA,
- 0, (void *) iprm_shutdown, 8);
- if (err) {
- switch (err) {
- case 1:
- err = -ENOTCONN;
- break;
- case 2:
- err = -ECONNRESET;
- break;
- default:
- err = -ENOTCONN;
- break;
+ if (iucv->transport == AF_IUCV_TRANS_IUCV) {
+ txmsg.class = 0;
+ txmsg.tag = 0;
+ err = pr_iucv->message_send(iucv->path, &txmsg,
+ IUCV_IPRMDATA, 0, (void *) iprm_shutdown, 8);
+ if (err) {
+ switch (err) {
+ case 1:
+ err = -ENOTCONN;
+ break;
+ case 2:
+ err = -ECONNRESET;
+ break;
+ default:
+ err = -ENOTCONN;
+ break;
+ }
}
- }
+ } else
+ iucv_send_ctrl(sk, AF_IUCV_FLAG_SHT);
}
+ sk->sk_shutdown |= how;
if (how == RCV_SHUTDOWN || how == SHUTDOWN_MASK) {
- err = pr_iucv->path_quiesce(iucv->path, NULL);
- if (err)
- err = -ENOTCONN;
-
+ if (iucv->transport == AF_IUCV_TRANS_IUCV) {
+ err = pr_iucv->path_quiesce(iucv->path, NULL);
+ if (err)
+ err = -ENOTCONN;
+/* skb_queue_purge(&sk->sk_receive_queue); */
+ }
skb_queue_purge(&sk->sk_receive_queue);
}
@@ -2066,8 +2083,13 @@ static int afiucv_hs_callback_rx(struct
return NET_RX_SUCCESS;
}
+ if (sk->sk_shutdown & RCV_SHUTDOWN) {
+ kfree_skb(skb);
+ return NET_RX_SUCCESS;
+ }
+
/* write stuff from iucv_msg to skb cb */
- if (skb->len <= sizeof(struct af_iucv_trans_hdr)) {
+ if (skb->len < sizeof(struct af_iucv_trans_hdr)) {
kfree_skb(skb);
return NET_RX_SUCCESS;
}
@@ -2173,7 +2195,10 @@ static int afiucv_hs_rcv(struct sk_buff
kfree_skb(skb);
break;
}
- /* fall through */
+ /* fall through and receive non-zero length data */
+ case (AF_IUCV_FLAG_SHT):
+ /* shutdown request */
+ /* fall through and receive zero length data */
case 0:
/* plain data frame */
memcpy(CB_TRGCLS(skb), &trans_hdr->iucv_hdr.class,
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 3/7] [PATCH] qeth: synchronize discipline module loading
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
2012-03-07 12:06 ` [patch 1/7] [PATCH] af_iucv: handle netdev events frank.blaschka
2012-03-07 12:06 ` [patch 2/7] [PATCH] af_iucv: add shutdown for HS transport frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:06 ` [patch 4/7] [PATCH] ctcm: make ctcmpc debugging compilable frank.blaschka
` (4 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390
[-- Attachment #1: 610-qeth-sync-modules.diff --]
[-- Type: text/plain, Size: 1659 bytes --]
From: Frank Blaschka <frank.blaschka@de.ibm.com>
During system startup udev may try to configure devices in
parallel so we have to synchronize discipline module
loading.
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/qeth_core_main.c | 4 ++++
1 file changed, 4 insertions(+)
diff -urpN linux-2.6/drivers/s390/net/qeth_core_main.c linux-2.6-patched/drivers/s390/net/qeth_core_main.c
--- linux-2.6/drivers/s390/net/qeth_core_main.c 2012-03-06 13:35:59.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/qeth_core_main.c 2012-03-06 13:35:59.000000000 +0100
@@ -51,6 +51,7 @@ static struct kmem_cache *qeth_qdio_outb
static struct device *qeth_core_root_dev;
static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY;
static struct lock_class_key qdio_out_skb_queue_key;
+static struct mutex qeth_mod_mutex;
static void qeth_send_control_data_cb(struct qeth_channel *,
struct qeth_cmd_buffer *);
@@ -5040,6 +5041,7 @@ int qeth_core_load_discipline(struct qet
enum qeth_discipline_id discipline)
{
int rc = 0;
+ mutex_lock(&qeth_mod_mutex);
switch (discipline) {
case QETH_DISCIPLINE_LAYER3:
card->discipline.ccwgdriver = try_then_request_module(
@@ -5057,6 +5059,7 @@ int qeth_core_load_discipline(struct qet
"support discipline %d\n", discipline);
rc = -EINVAL;
}
+ mutex_unlock(&qeth_mod_mutex);
return rc;
}
@@ -5540,6 +5543,7 @@ static int __init qeth_core_init(void)
pr_info("loading core functions\n");
INIT_LIST_HEAD(&qeth_core_card_list.list);
rwlock_init(&qeth_core_card_list.rwlock);
+ mutex_init(&qeth_mod_mutex);
rc = qeth_register_dbf_views();
if (rc)
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 4/7] [PATCH] ctcm: make ctcmpc debugging compilable
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
` (2 preceding siblings ...)
2012-03-07 12:06 ` [patch 3/7] [PATCH] qeth: synchronize discipline module loading frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:20 ` David Laight
2012-03-07 12:06 ` [patch 5/7] [PATCH] ctcm: use correct idal word list for ctcmpc frank.blaschka
` (3 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Ursula Braun
[-- Attachment #1: 611-ctcm-debug.diff --]
[-- Type: text/plain, Size: 2518 bytes --]
From: Ursula Braun <ursula.braun@de.ibm.com>
ctcmpc debugging can be activated defining constant DEBUGCCW.
The debugging part contains wrong checks for 64 bit addresses.
Thus the debugging version does not compile.
This patch corrects the 64-bit address checks to make it
compilable.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Reviewed-by: Belinda Thompson <belindat@us.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/ctcm_main.c | 3 +++
drivers/s390/net/ctcm_mpc.c | 12 ++++++------
2 files changed, 9 insertions(+), 6 deletions(-)
diff -urpN linux-2.6/drivers/s390/net/ctcm_main.c linux-2.6-patched/drivers/s390/net/ctcm_main.c
--- linux-2.6/drivers/s390/net/ctcm_main.c 2012-01-05 00:55:44.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/ctcm_main.c 2012-03-06 13:36:00.000000000 +0100
@@ -562,6 +562,9 @@ static int ctcm_transmit_skb(struct chan
skb_queue_tail(&ch->io_queue, skb);
ccw_idx = 3;
}
+ if (do_debug_ccw)
+ ctcmpc_dumpit((char *)&ch->ccw[ccw_idx],
+ sizeof(struct ccw1) * 3);
ch->retry = 0;
fsm_newstate(ch->fsm, CTC_STATE_TX);
fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
diff -urpN linux-2.6/drivers/s390/net/ctcm_mpc.c linux-2.6-patched/drivers/s390/net/ctcm_mpc.c
--- linux-2.6/drivers/s390/net/ctcm_mpc.c 2012-01-05 00:55:44.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/ctcm_mpc.c 2012-03-06 13:36:00.000000000 +0100
@@ -53,8 +53,8 @@
#include <linux/moduleparam.h>
#include <asm/idals.h>
-#include "ctcm_mpc.h"
#include "ctcm_main.h"
+#include "ctcm_mpc.h"
#include "ctcm_fsms.h"
static const struct xid2 init_xid = {
@@ -132,7 +132,7 @@ void ctcmpc_dumpit(char *buf, int len)
__u32 ct, sw, rm, dup;
char *ptr, *rptr;
char tbuf[82], tdup[82];
- #if (UTS_MACHINE == s390x)
+ #ifdef CONFIG_64BIT
char addr[22];
#else
char addr[12];
@@ -149,8 +149,8 @@ void ctcmpc_dumpit(char *buf, int len)
for (ct = 0; ct < len; ct++, ptr++, rptr++) {
if (sw == 0) {
- #if (UTS_MACHINE == s390x)
- sprintf(addr, "%16.16lx", (__u64)rptr);
+ #ifdef CONFIG_64BIT
+ sprintf(addr, "%16.16llx", (__u64)rptr);
#else
sprintf(addr, "%8.8X", (__u32)rptr);
#endif
@@ -164,8 +164,8 @@ void ctcmpc_dumpit(char *buf, int len)
if (sw == 8)
strcat(bhex, " ");
- #if (UTS_MACHINE == s390x)
- sprintf(tbuf, "%2.2lX", (__u64)*ptr);
+ #if CONFIG_64BIT
+ sprintf(tbuf, "%2.2llX", (__u64)*ptr);
#else
sprintf(tbuf, "%2.2X", (__u32)*ptr);
#endif
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [patch 4/7] [PATCH] ctcm: make ctcmpc debugging compilable
2012-03-07 12:06 ` [patch 4/7] [PATCH] ctcm: make ctcmpc debugging compilable frank.blaschka
@ 2012-03-07 12:20 ` David Laight
0 siblings, 0 replies; 11+ messages in thread
From: David Laight @ 2012-03-07 12:20 UTC (permalink / raw)
To: frank.blaschka, davem; +Cc: netdev, linux-s390, Ursula Braun
> static const struct xid2 init_xid = {
> @@ -132,7 +132,7 @@ void ctcmpc_dumpit(char *buf, int len)
> __u32 ct, sw, rm, dup;
> char *ptr, *rptr;
> char tbuf[82], tdup[82];
> - #if (UTS_MACHINE == s390x)
> + #ifdef CONFIG_64BIT
> char addr[22];
> #else
> char addr[12];
> @@ -149,8 +149,8 @@ void ctcmpc_dumpit(char *buf, int len)
>
> for (ct = 0; ct < len; ct++, ptr++, rptr++) {
> if (sw == 0) {
> - #if (UTS_MACHINE == s390x)
> - sprintf(addr, "%16.16lx", (__u64)rptr);
> + #ifdef CONFIG_64BIT
> + sprintf(addr, "%16.16llx", (__u64)rptr);
> #else
> sprintf(addr, "%8.8X", (__u32)rptr);
> #endif
What is wrong with:
char addr[24];
snprintf(addr, sizeof addr, "%p", rptr);
There seemed to be other 'dangerous' unbounded string
operations in that code as well.
David
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 5/7] [PATCH] ctcm: use correct idal word list for ctcmpc
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
` (3 preceding siblings ...)
2012-03-07 12:06 ` [patch 4/7] [PATCH] ctcm: make ctcmpc debugging compilable frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:06 ` [patch 6/7] [PATCH] qeth: meaningful return code for set_mac_address frank.blaschka
` (2 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Belinda Thompson
[-- Attachment #1: 612-ctcm-idal-list.diff --]
[-- Type: text/plain, Size: 1864 bytes --]
From: Belinda Thompson <belindat@us.ibm.com>
Communication Server Linux uses the ctcmpc code of the ctcm driver.
Sending problems have shown up caused by a wrong idal word list for
the first ccw. Function ctcmpc_chx_txdone() invokes the function
to prepare the idal word list without setting an appropriate length
for the first ccw, which may lead to an incomplete idal word list.
This patch sets the maximum buffer size as data length of the first
ccw. Thus correct idal word lists are guaranteed in all cases.
Signed-off-by: Belinda Thompson <belindat@us.ibm.com>
Reviewed-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/ctcm_fsms.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff -urpN linux-2.6/drivers/s390/net/ctcm_fsms.c linux-2.6-patched/drivers/s390/net/ctcm_fsms.c
--- linux-2.6/drivers/s390/net/ctcm_fsms.c 2012-01-05 00:55:44.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/ctcm_fsms.c 2012-03-06 13:36:00.000000000 +0100
@@ -1341,6 +1341,12 @@ static void ctcmpc_chx_txdone(fsm_instan
spin_unlock(&ch->collect_lock);
clear_normalized_cda(&ch->ccw[1]);
+
+ CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
+ (void *)(unsigned long)ch->ccw[1].cda,
+ ch->trans_skb->data);
+ ch->ccw[1].count = ch->max_bufsize;
+
if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
dev_kfree_skb_any(ch->trans_skb);
ch->trans_skb = NULL;
@@ -1350,6 +1356,11 @@ static void ctcmpc_chx_txdone(fsm_instan
fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
return;
}
+
+ CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
+ (void *)(unsigned long)ch->ccw[1].cda,
+ ch->trans_skb->data);
+
ch->ccw[1].count = ch->trans_skb->len;
fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
ch->prof.send_stamp = current_kernel_time(); /* xtime */
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 6/7] [PATCH] qeth: meaningful return code for set_mac_address
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
` (4 preceding siblings ...)
2012-03-07 12:06 ` [patch 5/7] [PATCH] ctcm: use correct idal word list for ctcmpc frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-07 12:06 ` [patch 7/7] [PATCH] lcs: Return zero from ccwgroup devs set_offline function frank.blaschka
2012-03-08 6:52 ` [patch 0/7] s390: network driver fixes for net-next David Miller
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Ursula Braun
[-- Attachment #1: 613-qeth-rc-set-mac.diff --]
[-- Type: text/plain, Size: 3649 bytes --]
From: Ursula Braun <ursula.braun@de.ibm.com>
Setting an invalid mac-address for a qeth layer2 device returns
with a strange error code:
# ip link set hsi1 address 00:00:00:00:00:01
RTNETLINK answers: Unknown error 18446744073709486085
Problem is caused by wrong usage of the return_code field within
structure qeth_ipa_cmd.
With this patch the ip command above returns
SIOCSIFHWADDR: Invalid argument
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/qeth_core_main.c | 6 +++---
drivers/s390/net/qeth_core_mpc.c | 1 +
drivers/s390/net/qeth_core_mpc.h | 1 +
drivers/s390/net/qeth_l2_main.c | 4 +---
drivers/s390/net/qeth_l3_main.c | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -2945,8 +2945,8 @@ static int qeth_query_ipassists_cb(struc
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
}
QETH_DBF_TEXT(SETUP, 2, "suppenbl");
- QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_supported);
- QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_enabled);
+ QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_supported);
+ QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_enabled);
return 0;
}
@@ -4322,7 +4322,7 @@ static int qeth_snmp_command_cb(struct q
/* check if there is enough room in userspace */
if ((qinfo->udata_len - qinfo->udata_offset) < data_len) {
QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOMEM);
- cmd->hdr.return_code = -ENOMEM;
+ cmd->hdr.return_code = IPA_RC_ENOMEM;
return 0;
}
QETH_CARD_TEXT_(card, 4, "snore%i",
--- a/drivers/s390/net/qeth_core_mpc.c
+++ b/drivers/s390/net/qeth_core_mpc.c
@@ -207,6 +207,7 @@ static struct ipa_rc_msg qeth_ipa_rc_msg
{IPA_RC_MC_ADDR_ALREADY_DEFINED, "Multicast address already defined"},
{IPA_RC_LAN_OFFLINE, "STRTLAN_LAN_DISABLED - LAN offline"},
{IPA_RC_INVALID_IP_VERSION2, "Invalid IP version"},
+ {IPA_RC_ENOMEM, "Memory problem"},
{IPA_RC_FFFF, "Unknown Error"}
};
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -190,6 +190,7 @@ enum qeth_ipa_return_codes {
IPA_RC_MC_ADDR_ALREADY_DEFINED = 0xe013,
IPA_RC_LAN_OFFLINE = 0xe080,
IPA_RC_INVALID_IP_VERSION2 = 0xf001,
+ IPA_RC_ENOMEM = 0xfffe,
IPA_RC_FFFF = 0xffff
};
/* for DELIP */
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -576,7 +576,6 @@ static int qeth_l2_send_setmac_cb(struct
default:
break;
}
- cmd->hdr.return_code = -EIO;
} else {
card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac,
@@ -605,7 +604,6 @@ static int qeth_l2_send_delmac_cb(struct
cmd = (struct qeth_ipa_cmd *) data;
if (cmd->hdr.return_code) {
QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
- cmd->hdr.return_code = -EIO;
return 0;
}
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
@@ -682,7 +680,7 @@ static int qeth_l2_set_mac_address(struc
rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
if (!rc)
rc = qeth_l2_send_setmac(card, addr->sa_data);
- return rc;
+ return rc ? -EINVAL : 0;
}
static void qeth_l2_set_multicast_list(struct net_device *dev)
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2430,7 +2430,7 @@ static int qeth_l3_arp_query_cb(struct q
if ((qinfo->udata_len - qinfo->udata_offset) < esize) {
QETH_CARD_TEXT_(card, 4, "qaer3%i", -ENOMEM);
- cmd->hdr.return_code = -ENOMEM;
+ cmd->hdr.return_code = IPA_RC_ENOMEM;
goto out_error;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 7/7] [PATCH] lcs: Return zero from ccwgroup devs set_offline function
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
` (5 preceding siblings ...)
2012-03-07 12:06 ` [patch 6/7] [PATCH] qeth: meaningful return code for set_mac_address frank.blaschka
@ 2012-03-07 12:06 ` frank.blaschka
2012-03-08 6:52 ` [patch 0/7] s390: network driver fixes for net-next David Miller
7 siblings, 0 replies; 11+ messages in thread
From: frank.blaschka @ 2012-03-07 12:06 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Klaus-Dieter Wacker
[-- Attachment #1: 607-lcs-offline.diff --]
[-- Type: text/plain, Size: 1631 bytes --]
From: Klaus-Dieter Wacker <kdwacker@de.ibm.com>
A return code of non-zero of the devs ccwgroup set_offline function
leaves the dev in online state. Having done a partly offlining
may leave the dev in unusable state. To make sure the dev is set to
offline, zero is returned. A setup trace entry is written in case
the offlining steps encountered some trouble.
Signed-off-by: Klaus-Dieter Wacker <kdwacker@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/lcs.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff -urpN linux-2.6/drivers/s390/net/lcs.c linux-2.6-patched/drivers/s390/net/lcs.c
--- linux-2.6/drivers/s390/net/lcs.c 2012-01-05 00:55:44.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/lcs.c 2012-03-06 13:35:58.000000000 +0100
@@ -2240,7 +2240,7 @@ __lcs_shutdown_device(struct ccwgroup_de
{
struct lcs_card *card;
enum lcs_dev_states recover_state;
- int ret;
+ int ret = 0, ret2 = 0, ret3 = 0;
LCS_DBF_TEXT(3, setup, "shtdndev");
card = dev_get_drvdata(&ccwgdev->dev);
@@ -2255,13 +2255,15 @@ __lcs_shutdown_device(struct ccwgroup_de
recover_state = card->state;
ret = lcs_stop_device(card->dev);
- ret = ccw_device_set_offline(card->read.ccwdev);
- ret = ccw_device_set_offline(card->write.ccwdev);
+ ret2 = ccw_device_set_offline(card->read.ccwdev);
+ ret3 = ccw_device_set_offline(card->write.ccwdev);
+ if (!ret)
+ ret = (ret2) ? ret2 : ret3;
+ if (ret)
+ LCS_DBF_TEXT_(3, setup, "1err:%d", ret);
if (recover_state == DEV_STATE_UP) {
card->state = DEV_STATE_RECOVER;
}
- if (ret)
- return ret;
return 0;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 0/7] s390: network driver fixes for net-next
2012-03-07 12:06 [patch 0/7] s390: network driver fixes for net-next frank.blaschka
` (6 preceding siblings ...)
2012-03-07 12:06 ` [patch 7/7] [PATCH] lcs: Return zero from ccwgroup devs set_offline function frank.blaschka
@ 2012-03-08 6:52 ` David Miller
7 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2012-03-08 6:52 UTC (permalink / raw)
To: frank.blaschka; +Cc: netdev, linux-s390
From: frank.blaschka@de.ibm.com
Date: Wed, 07 Mar 2012 13:06:22 +0100
> here is a couple of s390 network driver fixes for net-next
All applied, thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread