Netdev List
 help / color / mirror / Atom feed
* [patch 5/9] [PATCH] lcs: get rid of compile warning
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Heiko Carstens
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 604-lcs-compile-warning.diff --]
[-- Type: text/plain, Size: 1658 bytes --]

From: Heiko Carstens <heiko.carstens@de.ibm.com>

-Wunused-but-set-variable generates a compile warning for lcs' tasklet
function. Invoked functions contain already error handling; thus
additional return code checking is not needed here.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 drivers/s390/net/lcs.c |   10 +++-------
 1 file changed, 3 insertions(+), 7 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	2011-05-10 09:14:06.000000000 +0200
+++ linux-2.6-patched/drivers/s390/net/lcs.c	2011-05-10 09:14:25.000000000 +0200
@@ -1483,7 +1483,6 @@ lcs_tasklet(unsigned long data)
 	struct lcs_channel *channel;
 	struct lcs_buffer *iob;
 	int buf_idx;
-	int rc;
 
 	channel = (struct lcs_channel *) data;
 	LCS_DBF_TEXT_(5, trace, "tlet%s", dev_name(&channel->ccwdev->dev));
@@ -1500,14 +1499,11 @@ lcs_tasklet(unsigned long data)
 	channel->buf_idx = buf_idx;
 
 	if (channel->state == LCS_CH_STATE_STOPPED)
-		// FIXME: what if rc != 0 ??
-		rc = lcs_start_channel(channel);
+		lcs_start_channel(channel);
 	spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
 	if (channel->state == LCS_CH_STATE_SUSPENDED &&
-	    channel->iob[channel->io_idx].state == LCS_BUF_STATE_READY) {
-		// FIXME: what if rc != 0 ??
-		rc = __lcs_resume_channel(channel);
-	}
+	    channel->iob[channel->io_idx].state == LCS_BUF_STATE_READY)
+		__lcs_resume_channel(channel);
 	spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
 
 	/* Something happened on the channel. Wake up waiters. */


^ permalink raw reply

* [patch 2/9] [PATCH] qeth: add OSA concurrent hardware trap
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 601-qeth-hardware-trap.diff --]
[-- Type: text/plain, Size: 15659 bytes --]

From: Frank Blaschka <frank.blaschka@de.ibm.com>

This patch improves FFDC (first failure data capture) by requesting
a hardware trace in case the device driver, the hardware or a user
detects an error.

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 drivers/s390/net/qeth_core.h      |   18 ++++
 drivers/s390/net/qeth_core_main.c |  148 ++++++++++++++++++++++++++++++++++++++
 drivers/s390/net/qeth_core_mpc.h  |    9 ++
 drivers/s390/net/qeth_core_sys.c  |   61 +++++++++++++++
 drivers/s390/net/qeth_l2_main.c   |   16 ++++
 drivers/s390/net/qeth_l3_main.c   |   53 ++++---------
 6 files changed, 268 insertions(+), 37 deletions(-)
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -631,6 +631,8 @@ struct qeth_card_info {
 	__u32 csum_mask;
 	__u32 tx_csum_mask;
 	enum qeth_ipa_promisc_modes promisc_mode;
+	__u32 diagass_support;
+	__u32 hwtrap;
 };
 
 struct qeth_card_options {
@@ -752,6 +754,14 @@ struct qeth_card_list_struct {
 	rwlock_t rwlock;
 };
 
+struct qeth_trap_id {
+	__u16 lparnr;
+	char vmname[8];
+	__u8 chpid;
+	__u8 ssid;
+	__u16 devno;
+} __packed;
+
 /*some helper functions*/
 #define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "")
 
@@ -786,6 +796,12 @@ static inline void qeth_put_buffer_pool_
 	list_add_tail(&entry->list, &card->qdio.in_buf_pool.entry_list);
 }
 
+static inline int qeth_is_diagass_supported(struct qeth_card *card,
+		enum qeth_diags_cmds cmd)
+{
+	return card->info.diagass_support & (__u32)cmd;
+}
+
 extern struct ccwgroup_driver qeth_l2_ccwgroup_driver;
 extern struct ccwgroup_driver qeth_l3_ccwgroup_driver;
 const char *qeth_get_cardname_short(struct qeth_card *);
@@ -871,6 +887,8 @@ void qeth_dbf_longtext(debug_info_t *id,
 int qeth_core_ethtool_get_settings(struct net_device *, struct ethtool_cmd *);
 int qeth_set_access_ctrl_online(struct qeth_card *card);
 int qeth_hdr_chk_and_bounce(struct sk_buff *, int);
+int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
+int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot);
 
 /* exports for OSN */
 int qeth_osn_assist(struct net_device *, void *, int);
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -24,6 +24,7 @@
 
 #include <asm/ebcdic.h>
 #include <asm/io.h>
+#include <asm/sysinfo.h>
 
 #include "qeth_core.h"
 
@@ -349,6 +350,8 @@ static struct qeth_ipa_cmd *qeth_check_i
 					   card->info.chpid);
 				netif_carrier_on(card->dev);
 				card->lan_online = 1;
+				if (card->info.hwtrap)
+					card->info.hwtrap = 2;
 				qeth_schedule_recovery(card);
 				return NULL;
 			case IPA_CMD_MODCCID:
@@ -2573,6 +2576,142 @@ int qeth_query_setadapterparms(struct qe
 }
 EXPORT_SYMBOL_GPL(qeth_query_setadapterparms);
 
+static int qeth_query_ipassists_cb(struct qeth_card *card,
+		struct qeth_reply *reply, unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(SETUP, 2, "qipasscb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
+		card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
+		card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
+	} else {
+		card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
+		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);
+	return 0;
+}
+
+int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
+	rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
+	return rc;
+}
+EXPORT_SYMBOL_GPL(qeth_query_ipassists);
+
+static int qeth_query_setdiagass_cb(struct qeth_card *card,
+		struct qeth_reply *reply, unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+	__u16 rc;
+
+	cmd = (struct qeth_ipa_cmd *)data;
+	rc = cmd->hdr.return_code;
+	if (rc)
+		QETH_CARD_TEXT_(card, 2, "diagq:%x", rc);
+	else
+		card->info.diagass_support = cmd->data.diagass.ext;
+	return 0;
+}
+
+static int qeth_query_setdiagass(struct qeth_card *card)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd    *cmd;
+
+	QETH_DBF_TEXT(SETUP, 2, "qdiagass");
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.diagass.subcmd_len = 16;
+	cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY;
+	return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
+}
+
+static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
+{
+	unsigned long info = get_zeroed_page(GFP_KERNEL);
+	struct sysinfo_2_2_2 *info222 = (struct sysinfo_2_2_2 *)info;
+	struct sysinfo_3_2_2 *info322 = (struct sysinfo_3_2_2 *)info;
+	struct ccw_dev_id ccwid;
+	int level, rc;
+
+	tid->chpid = card->info.chpid;
+	ccw_device_get_id(CARD_RDEV(card), &ccwid);
+	tid->ssid = ccwid.ssid;
+	tid->devno = ccwid.devno;
+	if (!info)
+		return;
+
+	rc = stsi(NULL, 0, 0, 0);
+	if (rc == -ENOSYS)
+		level = rc;
+	else
+		level = (((unsigned int) rc) >> 28);
+
+	if ((level >= 2) && (stsi(info222, 2, 2, 2) != -ENOSYS))
+		tid->lparnr = info222->lpar_number;
+
+	if ((level >= 3) && (stsi(info322, 3, 2, 2) != -ENOSYS)) {
+		EBCASC(info322->vm[0].name, sizeof(info322->vm[0].name));
+		memcpy(tid->vmname, info322->vm[0].name, sizeof(tid->vmname));
+	}
+	free_page(info);
+	return;
+}
+
+static int qeth_hw_trap_cb(struct qeth_card *card,
+		struct qeth_reply *reply, unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+	__u16 rc;
+
+	cmd = (struct qeth_ipa_cmd *)data;
+	rc = cmd->hdr.return_code;
+	if (rc)
+		QETH_CARD_TEXT_(card, 2, "trapc:%x", rc);
+	return 0;
+}
+
+int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(SETUP, 2, "diagtrap");
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.diagass.subcmd_len = 80;
+	cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP;
+	cmd->data.diagass.type = 1;
+	cmd->data.diagass.action = action;
+	switch (action) {
+	case QETH_DIAGS_TRAP_ARM:
+		cmd->data.diagass.options = 0x0003;
+		cmd->data.diagass.ext = 0x00010000 +
+			sizeof(struct qeth_trap_id);
+		qeth_get_trap_id(card,
+			(struct qeth_trap_id *)cmd->data.diagass.cdata);
+		break;
+	case QETH_DIAGS_TRAP_DISARM:
+		cmd->data.diagass.options = 0x0001;
+		break;
+	case QETH_DIAGS_TRAP_CAPTURE:
+		break;
+	}
+	return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
+}
+EXPORT_SYMBOL_GPL(qeth_hw_trap);
+
 int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
 		unsigned int qdio_error, const char *dbftext)
 {
@@ -3983,6 +4122,15 @@ retriable:
 		QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
 		goto out;
 	}
+
+	card->options.ipa4.supported_funcs = 0;
+	card->options.adp.supported_funcs = 0;
+	card->info.diagass_support = 0;
+	qeth_query_ipassists(card, QETH_PROT_IPV4);
+	if (qeth_is_supported(card, IPA_SETADAPTERPARMS))
+		qeth_query_setadapterparms(card);
+	if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST))
+		qeth_query_setdiagass(card);
 	return 0;
 out:
 	dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -448,6 +448,12 @@ enum qeth_diags_trace_cmds {
 	QETH_DIAGS_CMD_TRACE_QUERY	= 0x0010,
 };
 
+enum qeth_diags_trap_action {
+	QETH_DIAGS_TRAP_ARM	= 0x01,
+	QETH_DIAGS_TRAP_DISARM	= 0x02,
+	QETH_DIAGS_TRAP_CAPTURE = 0x04,
+};
+
 struct qeth_ipacmd_diagass {
 	__u32  host_tod2;
 	__u32:32;
@@ -457,7 +463,8 @@ struct qeth_ipacmd_diagass {
 	__u8   type;
 	__u8   action;
 	__u16  options;
-	__u32:32;
+	__u32  ext;
+	__u8   cdata[64];
 } __attribute__ ((packed));
 
 /* Header for each IPA command */
--- a/drivers/s390/net/qeth_core_sys.c
+++ b/drivers/s390/net/qeth_core_sys.c
@@ -530,6 +530,66 @@ out:
 static DEVICE_ATTR(isolation, 0644, qeth_dev_isolation_show,
 		   qeth_dev_isolation_store);
 
+static ssize_t qeth_hw_trap_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct qeth_card *card = dev_get_drvdata(dev);
+
+	if (!card)
+		return -EINVAL;
+	if (card->info.hwtrap)
+		return snprintf(buf, 5, "arm\n");
+	else
+		return snprintf(buf, 8, "disarm\n");
+}
+
+static ssize_t qeth_hw_trap_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev_get_drvdata(dev);
+	int rc = 0;
+	char *tmp, *curtoken;
+	int state = 0;
+	curtoken = (char *)buf;
+
+	if (!card)
+		return -EINVAL;
+
+	mutex_lock(&card->conf_mutex);
+	if (card->state == CARD_STATE_SOFTSETUP || card->state == CARD_STATE_UP)
+		state = 1;
+	tmp = strsep(&curtoken, "\n");
+
+	if (!strcmp(tmp, "arm") && !card->info.hwtrap) {
+		if (state) {
+			if (qeth_is_diagass_supported(card,
+			    QETH_DIAGS_CMD_TRAP)) {
+				rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM);
+				if (!rc)
+					card->info.hwtrap = 1;
+			} else
+				rc = -EINVAL;
+		} else
+			card->info.hwtrap = 1;
+	} else if (!strcmp(tmp, "disarm") && card->info.hwtrap) {
+		if (state) {
+			rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
+			if (!rc)
+				card->info.hwtrap = 0;
+		} else
+			card->info.hwtrap = 0;
+	} else if (!strcmp(tmp, "trap") && state && card->info.hwtrap)
+		rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_CAPTURE);
+	else
+		rc = -EINVAL;
+
+	mutex_unlock(&card->conf_mutex);
+	return rc ? rc : count;
+}
+
+static DEVICE_ATTR(hw_trap, 0644, qeth_hw_trap_show,
+		   qeth_hw_trap_store);
+
 static ssize_t qeth_dev_blkt_show(char *buf, struct qeth_card *card, int value)
 {
 
@@ -653,6 +713,7 @@ static struct attribute *qeth_device_att
 	&dev_attr_performance_stats.attr,
 	&dev_attr_layer2.attr,
 	&dev_attr_isolation.attr,
+	&dev_attr_hw_trap.attr,
 	NULL,
 };
 
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -876,6 +876,7 @@ static int qeth_l2_probe_device(struct c
 	INIT_LIST_HEAD(&card->vid_list);
 	INIT_LIST_HEAD(&card->mc_list);
 	card->options.layer2 = 1;
+	card->info.hwtrap = 0;
 	card->discipline.start_poll = qeth_qdio_start_poll;
 	card->discipline.input_handler = (qdio_handler_t *)
 		qeth_qdio_input_handler;
@@ -994,6 +995,13 @@ static int __qeth_l2_set_online(struct c
 	if (card->info.type != QETH_CARD_TYPE_OSN)
 		qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
 
+	if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
+		if (card->info.hwtrap &&
+		    qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
+			card->info.hwtrap = 0;
+	} else
+		card->info.hwtrap = 0;
+
 	card->state = CARD_STATE_HARDSETUP;
 	memset(&card->rx, 0, sizeof(struct qeth_rx));
 	qeth_print_status_message(card);
@@ -1092,6 +1100,10 @@ static int __qeth_l2_set_offline(struct
 	if (card->dev && netif_carrier_ok(card->dev))
 		netif_carrier_off(card->dev);
 	recover_flag = card->state;
+	if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
+		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
+		card->info.hwtrap = 1;
+	}
 	qeth_l2_stop_card(card, recovery_mode);
 	rc  = ccw_device_set_offline(CARD_DDEV(card));
 	rc2 = ccw_device_set_offline(CARD_WDEV(card));
@@ -1157,6 +1169,8 @@ static void __exit qeth_l2_exit(void)
 static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
 {
 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
+	if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
+		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
 	qeth_qdio_clear_card(card, 0);
 	qeth_clear_qdio_buffers(card);
 }
@@ -1172,6 +1186,8 @@ static int qeth_l2_pm_suspend(struct ccw
 	if (gdev->state == CCWGROUP_OFFLINE)
 		return 0;
 	if (card->state == CARD_STATE_UP) {
+		if (card->info.hwtrap)
+			qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
 		__qeth_l2_set_offline(card->gdev, 1);
 	} else
 		__qeth_l2_set_offline(card->gdev, 0);
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -1277,39 +1277,6 @@ static int qeth_l3_start_ipa_multicast(s
 	return rc;
 }
 
-static int qeth_l3_query_ipassists_cb(struct qeth_card *card,
-		struct qeth_reply *reply, unsigned long data)
-{
-	struct qeth_ipa_cmd *cmd;
-
-	QETH_DBF_TEXT(SETUP, 2, "qipasscb");
-
-	cmd = (struct qeth_ipa_cmd *) data;
-	if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
-		card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
-		card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
-	} else {
-		card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
-		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);
-	return 0;
-}
-
-static int qeth_l3_query_ipassists(struct qeth_card *card,
-				enum qeth_prot_versions prot)
-{
-	int rc;
-	struct qeth_cmd_buffer *iob;
-
-	QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
-	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
-	rc = qeth_send_ipa_cmd(card, iob, qeth_l3_query_ipassists_cb, NULL);
-	return rc;
-}
-
 #ifdef CONFIG_QETH_IPV6
 static int qeth_l3_softsetup_ipv6(struct qeth_card *card)
 {
@@ -1320,7 +1287,7 @@ static int qeth_l3_softsetup_ipv6(struct
 	if (card->info.type == QETH_CARD_TYPE_IQD)
 		goto out;
 
-	rc = qeth_l3_query_ipassists(card, QETH_PROT_IPV6);
+	rc = qeth_query_ipassists(card, QETH_PROT_IPV6);
 	if (rc) {
 		dev_err(&card->gdev->dev,
 			"Activating IPv6 support for %s failed\n",
@@ -3372,6 +3339,7 @@ static int qeth_l3_probe_device(struct c
 
 	qeth_l3_create_device_attributes(&gdev->dev);
 	card->options.layer2 = 0;
+	card->info.hwtrap = 0;
 	card->discipline.start_poll = qeth_qdio_start_poll;
 	card->discipline.input_handler = (qdio_handler_t *)
 		qeth_qdio_input_handler;
@@ -3423,13 +3391,18 @@ static int __qeth_l3_set_online(struct c
 		goto out_remove;
 	}
 
-	qeth_l3_query_ipassists(card, QETH_PROT_IPV4);
-
 	if (!card->dev && qeth_l3_setup_netdev(card)) {
 		rc = -ENODEV;
 		goto out_remove;
 	}
 
+	if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
+		if (card->info.hwtrap &&
+		    qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
+			card->info.hwtrap = 0;
+	} else
+		card->info.hwtrap = 0;
+
 	card->state = CARD_STATE_HARDSETUP;
 	memset(&card->rx, 0, sizeof(struct qeth_rx));
 	qeth_print_status_message(card);
@@ -3531,6 +3504,10 @@ static int __qeth_l3_set_offline(struct
 	if (card->dev && netif_carrier_ok(card->dev))
 		netif_carrier_off(card->dev);
 	recover_flag = card->state;
+	if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
+		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
+		card->info.hwtrap = 1;
+	}
 	qeth_l3_stop_card(card, recovery_mode);
 	rc  = ccw_device_set_offline(CARD_DDEV(card));
 	rc2 = ccw_device_set_offline(CARD_WDEV(card));
@@ -3586,6 +3563,8 @@ static int qeth_l3_recover(void *ptr)
 static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
 {
 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
+	if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
+		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
 	qeth_qdio_clear_card(card, 0);
 	qeth_clear_qdio_buffers(card);
 }
@@ -3601,6 +3580,8 @@ static int qeth_l3_pm_suspend(struct ccw
 	if (gdev->state == CCWGROUP_OFFLINE)
 		return 0;
 	if (card->state == CARD_STATE_UP) {
+		if (card->info.hwtrap)
+			qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
 		__qeth_l3_set_offline(card->gdev, 1);
 	} else
 		__qeth_l3_set_offline(card->gdev, 0);


^ permalink raw reply

* [patch 7/9] [PATCH] iucv: get rid of compile warning
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Ursula Braun
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 606-iucv-compile-warning.diff --]
[-- Type: text/plain, Size: 990 bytes --]

From: Ursula Braun <ursula.braun@de.ibm.com>

-Wunused-but-set-variable generates a compile warning. The affected
variable is removed.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 net/iucv/iucv.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff -urpN linux-2.6/net/iucv/iucv.c linux-2.6-patched/net/iucv/iucv.c
--- linux-2.6/net/iucv/iucv.c	2011-05-10 09:14:08.000000000 +0200
+++ linux-2.6-patched/net/iucv/iucv.c	2011-05-10 09:14:26.000000000 +0200
@@ -828,14 +828,14 @@ EXPORT_SYMBOL(iucv_unregister);
 static int iucv_reboot_event(struct notifier_block *this,
 			     unsigned long event, void *ptr)
 {
-	int i, rc;
+	int i;
 
 	get_online_cpus();
 	on_each_cpu(iucv_block_cpu, NULL, 1);
 	preempt_disable();
 	for (i = 0; i < iucv_max_pathid; i++) {
 		if (iucv_path_table[i])
-			rc = iucv_sever_pathid(i, NULL);
+			iucv_sever_pathid(i, NULL);
 	}
 	preempt_enable();
 	put_online_cpus();


^ permalink raw reply

* [patch 1/9] [PATCH] qeth: convert to hw_features part 2
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: qeth_hw_feat2.patch --]
[-- Type: text/plain, Size: 12127 bytes --]

From: Frank Blaschka <frank.blaschka@de.ibm.com>

Set rx csum default to hw checksumming again.
Remove sysfs interface for rx csum (checksumming) and TSO (large_send).
With the new hw_features it does not work to keep the old sysfs
interface in parallel. Convert options.checksum_type to new hw_features.

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
 drivers/s390/net/qeth_core.h      |    1 
 drivers/s390/net/qeth_core_main.c |    1 
 drivers/s390/net/qeth_core_mpc.h  |    8 --
 drivers/s390/net/qeth_l2_main.c   |    5 -
 drivers/s390/net/qeth_l3.h        |    2 
 drivers/s390/net/qeth_l3_main.c   |  109 +++++++++++++++++---------------------
 drivers/s390/net/qeth_l3_sys.c    |  106 ------------------------------------
 7 files changed, 52 insertions(+), 180 deletions(-)

--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -639,7 +639,6 @@ struct qeth_card_options {
 	struct qeth_ipa_info adp; /*Adapter parameters*/
 	struct qeth_routing_info route6;
 	struct qeth_ipa_info ipa6;
-	enum qeth_checksum_types checksum_type;
 	int broadcast_mode;
 	int macaddr_mode;
 	int fake_broadcast;
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -1039,7 +1039,6 @@ static void qeth_set_intial_options(stru
 {
 	card->options.route4.type = NO_ROUTER;
 	card->options.route6.type = NO_ROUTER;
-	card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
 	card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
 	card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
 	card->options.fake_broadcast = 0;
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -80,14 +80,6 @@ enum qeth_tr_broadcast_modes {
 	QETH_TR_BROADCAST_LOCAL    = 1,
 };
 
-/* these values match CHECKSUM_* in include/linux/skbuff.h */
-enum qeth_checksum_types {
-	SW_CHECKSUMMING = 0, /* TODO: set to bit flag used in IPA Command */
-	HW_CHECKSUMMING = 1,
-	NO_CHECKSUMMING = 2,
-};
-#define QETH_CHECKSUM_DEFAULT SW_CHECKSUMMING
-
 /*
  * Routing stuff
  */
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -420,10 +420,7 @@ static int qeth_l2_process_inbound_buffe
 		case QETH_HEADER_TYPE_LAYER2:
 			skb->pkt_type = PACKET_HOST;
 			skb->protocol = eth_type_trans(skb, skb->dev);
-			if (card->options.checksum_type == NO_CHECKSUMMING)
-				skb->ip_summed = CHECKSUM_UNNECESSARY;
-			else
-				skb->ip_summed = CHECKSUM_NONE;
+			skb->ip_summed = CHECKSUM_NONE;
 			if (skb->protocol == htons(ETH_P_802_2))
 				*((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
 			len = skb->len;
--- a/drivers/s390/net/qeth_l3.h
+++ b/drivers/s390/net/qeth_l3.h
@@ -62,8 +62,6 @@ void qeth_l3_del_vipa(struct qeth_card *
 int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
 void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
 			const u8 *);
-int qeth_l3_set_large_send(struct qeth_card *, enum qeth_large_send_types);
-int qeth_l3_set_rx_csum(struct qeth_card *, enum qeth_checksum_types);
 int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
 
 #endif /* __QETH_L3_H__ */
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -1445,34 +1445,30 @@ static int qeth_l3_send_checksum_command
 	return 0;
 }
 
-int qeth_l3_set_rx_csum(struct qeth_card *card,
-	enum qeth_checksum_types csum_type)
+int qeth_l3_set_rx_csum(struct qeth_card *card, int on)
 {
 	int rc = 0;
 
-	if (card->options.checksum_type == HW_CHECKSUMMING) {
-		if ((csum_type != HW_CHECKSUMMING) &&
-			(card->state != CARD_STATE_DOWN)) {
-			rc = qeth_l3_send_simple_setassparms(card,
-				IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
+	if (on) {
+		if (card->state != CARD_STATE_DOWN) {
+			if (!qeth_is_supported(card,
+				    IPA_INBOUND_CHECKSUM))
+					return -EPERM;
+			rc = qeth_l3_send_checksum_command(card);
 			if (rc)
 				return -EIO;
+			card->dev->features |= NETIF_F_RXCSUM;
 		}
-		card->dev->features |= NETIF_F_RXCSUM;
 	} else {
-		if (csum_type == HW_CHECKSUMMING) {
-			if (card->state != CARD_STATE_DOWN) {
-				if (!qeth_is_supported(card,
-				    IPA_INBOUND_CHECKSUM))
-					return -EPERM;
-				rc = qeth_l3_send_checksum_command(card);
-				if (rc)
-					return -EIO;
-			}
+		if (card->state != CARD_STATE_DOWN) {
+			rc = qeth_l3_send_simple_setassparms(card,
+				IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
+			if (rc)
+				return -EIO;
+			card->dev->features &= ~NETIF_F_RXCSUM;
 		}
-		card->dev->features &= ~NETIF_F_RXCSUM;
 	}
-	card->options.checksum_type = csum_type;
+
 	return rc;
 }
 
@@ -1482,32 +1478,35 @@ static int qeth_l3_start_ipa_checksum(st
 
 	QETH_CARD_TEXT(card, 3, "strtcsum");
 
-	if (card->options.checksum_type == NO_CHECKSUMMING) {
-		dev_info(&card->gdev->dev,
-			"Using no checksumming on %s.\n",
-			QETH_CARD_IFNAME(card));
-		return 0;
-	}
-	if (card->options.checksum_type == SW_CHECKSUMMING) {
-		dev_info(&card->gdev->dev,
-			"Using SW checksumming on %s.\n",
-			QETH_CARD_IFNAME(card));
-		return 0;
-	}
-	if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
-		dev_info(&card->gdev->dev,
+	if (card->dev->features & NETIF_F_RXCSUM) {
+		/* hw may have changed during offline or recovery */
+		if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
+			dev_info(&card->gdev->dev,
 			"Inbound HW Checksumming not "
 			"supported on %s,\ncontinuing "
 			"using Inbound SW Checksumming\n",
 			QETH_CARD_IFNAME(card));
-		card->options.checksum_type = SW_CHECKSUMMING;
-		return 0;
-	}
-	rc = qeth_l3_send_checksum_command(card);
-	if (!rc)
-		dev_info(&card->gdev->dev,
+			goto update_feature;
+		}
+
+		rc = qeth_l3_send_checksum_command(card);
+		if (!rc)
+			dev_info(&card->gdev->dev,
 			"HW Checksumming (inbound) enabled\n");
+		else
+			goto update_feature;
+	} else
+		dev_info(&card->gdev->dev,
+			"Using SW checksumming on %s.\n",
+			QETH_CARD_IFNAME(card));
+	return 0;
 
+update_feature:
+	rtnl_lock();
+	card->dev->hw_features &= ~NETIF_F_RXCSUM;
+	card->dev->features &= ~NETIF_F_RXCSUM;
+	netdev_update_features(card->dev);
+	rtnl_unlock();
 	return rc;
 }
 
@@ -2037,14 +2036,7 @@ static inline int qeth_l3_rebuild_skb(st
 		is_vlan = 1;
 	}
 
-	switch (card->options.checksum_type) {
-	case SW_CHECKSUMMING:
-		skb->ip_summed = CHECKSUM_NONE;
-		break;
-	case NO_CHECKSUMMING:
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-		break;
-	case HW_CHECKSUMMING:
+	if (card->dev->features & NETIF_F_RXCSUM) {
 		if ((hdr->hdr.l3.ext_flags &
 		    (QETH_HDR_EXT_CSUM_HDR_REQ |
 		     QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
@@ -2053,7 +2045,8 @@ static inline int qeth_l3_rebuild_skb(st
 			skb->ip_summed = CHECKSUM_UNNECESSARY;
 		else
 			skb->ip_summed = CHECKSUM_NONE;
-	}
+	} else
+		skb->ip_summed = CHECKSUM_NONE;
 
 	return is_vlan;
 }
@@ -3235,20 +3228,19 @@ static u32 qeth_l3_fix_features(struct n
 
 static int qeth_l3_set_features(struct net_device *dev, u32 features)
 {
-	enum qeth_checksum_types csum_type;
 	struct qeth_card *card = dev->ml_priv;
 	u32 changed = dev->features ^ features;
+	int on;
 
 	if (!(changed & NETIF_F_RXCSUM))
 		return 0;
 
 	if (features & NETIF_F_RXCSUM)
-		csum_type = HW_CHECKSUMMING;
+		on = 1;
 	else
-		csum_type = SW_CHECKSUMMING;
+		on = 0;
 
-	dev->features = features ^ NETIF_F_RXCSUM;
-	return qeth_l3_set_rx_csum(card, csum_type);
+	return qeth_l3_set_rx_csum(card, on);
 }
 
 static const struct ethtool_ops qeth_l3_ethtool_ops = {
@@ -3342,6 +3334,12 @@ static int qeth_l3_setup_netdev(struct q
 			if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
 				card->dev->dev_id = card->info.unique_id &
 							 0xffff;
+			if (!card->info.guestlan) {
+				card->dev->hw_features = NETIF_F_SG |
+					NETIF_F_RXCSUM | NETIF_F_IP_CSUM |
+					NETIF_F_TSO;
+				card->dev->features = NETIF_F_RXCSUM;
+			}
 		}
 	} else if (card->info.type == QETH_CARD_TYPE_IQD) {
 		card->dev = alloc_netdev(0, "hsi%d", ether_setup);
@@ -3357,8 +3355,6 @@ static int qeth_l3_setup_netdev(struct q
 	card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
 	card->dev->mtu = card->info.initial_mtu;
 	SET_ETHTOOL_OPS(card->dev, &qeth_l3_ethtool_ops);
-	card->dev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM |
-		NETIF_F_IP_CSUM | NETIF_F_TSO;
 	card->dev->features |=	NETIF_F_HW_VLAN_TX |
 				NETIF_F_HW_VLAN_RX |
 				NETIF_F_HW_VLAN_FILTER;
@@ -3382,9 +3378,6 @@ static int qeth_l3_probe_device(struct c
 	card->discipline.output_handler = (qdio_handler_t *)
 		qeth_qdio_output_handler;
 	card->discipline.recover = qeth_l3_recover;
-	if ((card->info.type == QETH_CARD_TYPE_OSD) ||
-	    (card->info.type == QETH_CARD_TYPE_OSX))
-		card->options.checksum_type = HW_CHECKSUMMING;
 	return 0;
 }
 
--- a/drivers/s390/net/qeth_l3_sys.c
+++ b/drivers/s390/net/qeth_l3_sys.c
@@ -15,16 +15,6 @@
 #define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \
 struct device_attribute dev_attr_##_id = __ATTR(_name, _mode, _show, _store)
 
-static const char *qeth_l3_get_checksum_str(struct qeth_card *card)
-{
-	if (card->options.checksum_type == SW_CHECKSUMMING)
-		return "sw";
-	else if (card->options.checksum_type == HW_CHECKSUMMING)
-		return "hw";
-	else
-		return "no";
-}
-
 static ssize_t qeth_l3_dev_route_show(struct qeth_card *card,
 			struct qeth_routing_info *route, char *buf)
 {
@@ -295,51 +285,6 @@ out:
 static DEVICE_ATTR(canonical_macaddr, 0644, qeth_l3_dev_canonical_macaddr_show,
 		   qeth_l3_dev_canonical_macaddr_store);
 
-static ssize_t qeth_l3_dev_checksum_show(struct device *dev,
-			struct device_attribute *attr, char *buf)
-{
-	struct qeth_card *card = dev_get_drvdata(dev);
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s checksumming\n",
-			qeth_l3_get_checksum_str(card));
-}
-
-static ssize_t qeth_l3_dev_checksum_store(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev_get_drvdata(dev);
-	enum qeth_checksum_types csum_type;
-	char *tmp;
-	int rc = 0;
-
-	if (!card)
-		return -EINVAL;
-
-	mutex_lock(&card->conf_mutex);
-	tmp = strsep((char **) &buf, "\n");
-	if (!strcmp(tmp, "sw_checksumming"))
-		csum_type = SW_CHECKSUMMING;
-	else if (!strcmp(tmp, "hw_checksumming"))
-		csum_type = HW_CHECKSUMMING;
-	else if (!strcmp(tmp, "no_checksumming"))
-		csum_type = NO_CHECKSUMMING;
-	else {
-		rc = -EINVAL;
-		goto out;
-	}
-
-	rc = qeth_l3_set_rx_csum(card, csum_type);
-out:
-	mutex_unlock(&card->conf_mutex);
-	return rc ? rc : count;
-}
-
-static DEVICE_ATTR(checksumming, 0644, qeth_l3_dev_checksum_show,
-		qeth_l3_dev_checksum_store);
-
 static ssize_t qeth_l3_dev_sniffer_show(struct device *dev,
 		struct device_attribute *attr, char *buf)
 {
@@ -402,64 +347,13 @@ out:
 static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show,
 		qeth_l3_dev_sniffer_store);
 
-static ssize_t qeth_l3_dev_large_send_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	struct qeth_card *card = dev_get_drvdata(dev);
-
-	if (!card)
-		return -EINVAL;
-
-	if (!(card->dev->features & NETIF_F_TSO))
-		return sprintf(buf, "%s\n", "no");
-	else
-		return sprintf(buf, "%s\n", "TSO");
-}
-
-static ssize_t qeth_l3_dev_large_send_store(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct qeth_card *card;
-	char *tmp;
-	int enable;
-
-	if (!card)
-		return -EINVAL;
-	tmp = strsep((char **) &buf, "\n");
-	if (!strcmp(tmp, "no"))
-		enable = 0;
-	else if (!strcmp(tmp, "TSO"))
-		enable = 1;
-	else
-		return -EINVAL;
-
-	rtnl_lock();
-
-	card = dev_get_drvdata(dev);
-
-	if (enable)
-		card->dev->wanted_features |= NETIF_F_TSO;
-	else
-		card->dev->wanted_features &= ~NETIF_F_TSO;
-	netdev_update_features(card->dev);
-
-	rtnl_unlock();
-
-	return count;
-}
-
-static DEVICE_ATTR(large_send, 0644, qeth_l3_dev_large_send_show,
-		   qeth_l3_dev_large_send_store);
-
 static struct attribute *qeth_l3_device_attrs[] = {
 	&dev_attr_route4.attr,
 	&dev_attr_route6.attr,
 	&dev_attr_fake_broadcast.attr,
 	&dev_attr_broadcast_mode.attr,
 	&dev_attr_canonical_macaddr.attr,
-	&dev_attr_checksumming.attr,
 	&dev_attr_sniffer.attr,
-	&dev_attr_large_send.attr,
 	NULL,
 };
 


^ permalink raw reply

* [patch 4/9] [PATCH] claw: remove unused return code handling
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Heiko Carstens
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 603-claw-unused-rc.diff --]
[-- Type: text/plain, Size: 3801 bytes --]

From: Heiko Carstens <heiko.carstens@de.ibm.com>

Remove unused return code handling. The claw driver is mostly dead, so
just make sure it keeps compiling without warnings.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 drivers/s390/net/claw.c |   22 +++-------------------
 1 file changed, 3 insertions(+), 19 deletions(-)
diff -urpN linux-2.6/drivers/s390/net/claw.c linux-2.6-patched/drivers/s390/net/claw.c
--- linux-2.6/drivers/s390/net/claw.c	2011-05-10 09:14:06.000000000 +0200
+++ linux-2.6-patched/drivers/s390/net/claw.c	2011-05-10 09:14:25.000000000 +0200
@@ -845,12 +845,10 @@ claw_irq_tasklet ( unsigned long data )
 {
 	struct chbk * p_ch;
         struct net_device  *dev;
-        struct claw_privbk *       privptr;
 
 	p_ch = (struct chbk *) data;
         dev = (struct net_device *)p_ch->ndev;
 	CLAW_DBF_TEXT(4, trace, "IRQtask");
-	privptr = (struct claw_privbk *)dev->ml_priv;
         unpack_read(dev);
         clear_bit(CLAW_BH_ACTIVE, (void *)&p_ch->flag_a);
 	CLAW_DBF_TEXT(4, trace, "TskletXt");
@@ -1026,7 +1024,6 @@ claw_write_next ( struct chbk * p_ch )
         struct net_device  *dev;
         struct claw_privbk *privptr=NULL;
 	struct sk_buff *pk_skb;
-	int	rc;
 
 	CLAW_DBF_TEXT(4, trace, "claw_wrt");
         if (p_ch->claw_state == CLAW_STOP)
@@ -1038,7 +1035,7 @@ claw_write_next ( struct chbk * p_ch )
 	    !skb_queue_empty(&p_ch->collect_queue)) {
 	  	pk_skb = claw_pack_skb(privptr);
 		while (pk_skb != NULL) {
-			rc = claw_hw_tx( pk_skb, dev,1);
+			claw_hw_tx(pk_skb, dev, 1);
 			if (privptr->write_free_count > 0) {
 	   			pk_skb = claw_pack_skb(privptr);
 			} else
@@ -1322,15 +1319,12 @@ claw_hw_tx(struct sk_buff *skb, struct n
         unsigned char                   *pDataAddress;
         struct endccw                   *pEnd;
         struct ccw1                     tempCCW;
-        struct chbk                     *p_ch;
 	struct claw_env			*p_env;
-        int                             lock;
 	struct clawph			*pk_head;
 	struct chbk			*ch;
 
 	CLAW_DBF_TEXT(4, trace, "hw_tx");
 	privptr = (struct claw_privbk *)(dev->ml_priv);
-	p_ch = (struct chbk *)&privptr->channel[WRITE_CHANNEL];
 	p_env =privptr->p_env;
 	claw_free_wrt_buf(dev);	/* Clean up free chain if posible */
         /*  scan the write queue to free any completed write packets   */
@@ -1511,12 +1505,6 @@ claw_hw_tx(struct sk_buff *skb, struct n
 
         } /* endif (p_first_ccw!=NULL)  */
         dev_kfree_skb_any(skb);
-	if (linkid==0) {
-        	lock=LOCK_NO;
-        }
-        else  {
-                lock=LOCK_YES;
-        }
         claw_strt_out_IO(dev );
         /*      if write free count is zero , set NOBUFFER       */
 	if (privptr->write_free_count==0) {
@@ -2821,15 +2809,11 @@ claw_free_wrt_buf( struct net_device *de
 {
 
 	struct claw_privbk *privptr = (struct claw_privbk *)dev->ml_priv;
-        struct ccwbk*p_first_ccw;
-	struct ccwbk*p_last_ccw;
 	struct ccwbk*p_this_ccw;
 	struct ccwbk*p_next_ccw;
 
 	CLAW_DBF_TEXT(4, trace, "freewrtb");
         /*  scan the write queue to free any completed write packets   */
-        p_first_ccw=NULL;
-        p_last_ccw=NULL;
         p_this_ccw=privptr->p_write_active_first;
         while ( (p_this_ccw!=NULL) && (p_this_ccw->header.flag!=CLAW_PENDING))
         {
@@ -3072,7 +3056,7 @@ claw_shutdown_device(struct ccwgroup_dev
 {
 	struct claw_privbk *priv;
 	struct net_device *ndev;
-	int	ret;
+	int ret = 0;
 
 	CLAW_DBF_TEXT_(2, setup, "%s", dev_name(&cgdev->dev));
 	priv = dev_get_drvdata(&cgdev->dev);
@@ -3095,7 +3079,7 @@ claw_shutdown_device(struct ccwgroup_dev
 	}
 	ccw_device_set_offline(cgdev->cdev[1]);
 	ccw_device_set_offline(cgdev->cdev[0]);
-	return 0;
+	return ret;
 }
 
 static void


^ permalink raw reply

* [patch 8/9] [PATCH] af_iucv: get rid of compile warning
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Ursula Braun
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 607-af_iucv-compile-warning.diff --]
[-- Type: text/plain, Size: 1811 bytes --]

From: Ursula Braun <ursula.braun@de.ibm.com>

-Wunused-but-set-variable generates compile warnings. The affected
variables are removed.

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 |    9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -190,7 +190,6 @@ static int afiucv_pm_freeze(struct devic
  */
 static int afiucv_pm_restore_thaw(struct device *dev)
 {
-	struct iucv_sock *iucv;
 	struct sock *sk;
 	struct hlist_node *node;
 
@@ -199,7 +198,6 @@ static int afiucv_pm_restore_thaw(struct
 #endif
 	read_lock(&iucv_sk_list.lock);
 	sk_for_each(sk, node, &iucv_sk_list.head) {
-		iucv = iucv_sk(sk);
 		switch (sk->sk_state) {
 		case IUCV_CONNECTED:
 			sk->sk_err = EPIPE;
@@ -381,7 +379,6 @@ static void iucv_sock_close(struct sock
 {
 	unsigned char user_data[16];
 	struct iucv_sock *iucv = iucv_sk(sk);
-	int err;
 	unsigned long timeo;
 
 	iucv_sock_clear_timer(sk);
@@ -394,8 +391,6 @@ static void iucv_sock_close(struct sock
 
 	case IUCV_CONNECTED:
 	case IUCV_DISCONN:
-		err = 0;
-
 		sk->sk_state = IUCV_CLOSING;
 		sk->sk_state_change(sk);
 
@@ -404,7 +399,7 @@ static void iucv_sock_close(struct sock
 				timeo = sk->sk_lingertime;
 			else
 				timeo = IUCV_DISCONN_TIMEOUT;
-			err = iucv_sock_wait(sk,
+			iucv_sock_wait(sk,
 					iucv_sock_in_state(sk, IUCV_CLOSED, 0),
 					timeo);
 		}
@@ -417,7 +412,7 @@ static void iucv_sock_close(struct sock
 			low_nmcpy(user_data, iucv->src_name);
 			high_nmcpy(user_data, iucv->dst_name);
 			ASCEBC(user_data, sizeof(user_data));
-			err = iucv_path_sever(iucv->path, user_data);
+			iucv_path_sever(iucv->path, user_data);
 			iucv_path_free(iucv->path);
 			iucv->path = NULL;
 		}


^ permalink raw reply

* [patch 9/9] [PATCH] convert old cpumask API into new one
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, KOSAKI Motohiro
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 608-cpumask-api.diff --]
[-- Type: text/plain, Size: 8375 bytes --]

From: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>

Adapt new API.

Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 net/iucv/iucv.c |   73 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 37 insertions(+), 36 deletions(-)
diff -urpN linux-2.6/net/iucv/iucv.c linux-2.6-patched/net/iucv/iucv.c
--- linux-2.6/net/iucv/iucv.c	2011-05-10 09:14:27.000000000 +0200
+++ linux-2.6-patched/net/iucv/iucv.c	2011-05-10 09:14:27.000000000 +0200
@@ -128,8 +128,8 @@ struct iucv_irq_list {
 };
 
 static struct iucv_irq_data *iucv_irq_data[NR_CPUS];
-static cpumask_t iucv_buffer_cpumask = CPU_MASK_NONE;
-static cpumask_t iucv_irq_cpumask = CPU_MASK_NONE;
+static cpumask_t iucv_buffer_cpumask = { CPU_BITS_NONE };
+static cpumask_t iucv_irq_cpumask = { CPU_BITS_NONE };
 
 /*
  * Queue of interrupt buffers lock for delivery via the tasklet
@@ -406,7 +406,7 @@ static void iucv_allow_cpu(void *data)
 	parm->set_mask.ipmask = 0xf8;
 	iucv_call_b2f0(IUCV_SETCONTROLMASK, parm);
 	/* Set indication that iucv interrupts are allowed for this cpu. */
-	cpu_set(cpu, iucv_irq_cpumask);
+	cpumask_set_cpu(cpu, &iucv_irq_cpumask);
 }
 
 /**
@@ -426,7 +426,7 @@ static void iucv_block_cpu(void *data)
 	iucv_call_b2f0(IUCV_SETMASK, parm);
 
 	/* Clear indication that iucv interrupts are allowed for this cpu. */
-	cpu_clear(cpu, iucv_irq_cpumask);
+	cpumask_clear_cpu(cpu, &iucv_irq_cpumask);
 }
 
 /**
@@ -451,7 +451,7 @@ static void iucv_block_cpu_almost(void *
 	iucv_call_b2f0(IUCV_SETCONTROLMASK, parm);
 
 	/* Clear indication that iucv interrupts are allowed for this cpu. */
-	cpu_clear(cpu, iucv_irq_cpumask);
+	cpumask_clear_cpu(cpu, &iucv_irq_cpumask);
 }
 
 /**
@@ -466,7 +466,7 @@ static void iucv_declare_cpu(void *data)
 	union iucv_param *parm;
 	int rc;
 
-	if (cpu_isset(cpu, iucv_buffer_cpumask))
+	if (cpumask_test_cpu(cpu, &iucv_buffer_cpumask))
 		return;
 
 	/* Declare interrupt buffer. */
@@ -499,9 +499,9 @@ static void iucv_declare_cpu(void *data)
 	}
 
 	/* Set indication that an iucv buffer exists for this cpu. */
-	cpu_set(cpu, iucv_buffer_cpumask);
+	cpumask_set_cpu(cpu, &iucv_buffer_cpumask);
 
-	if (iucv_nonsmp_handler == 0 || cpus_empty(iucv_irq_cpumask))
+	if (iucv_nonsmp_handler == 0 || cpumask_empty(&iucv_irq_cpumask))
 		/* Enable iucv interrupts on this cpu. */
 		iucv_allow_cpu(NULL);
 	else
@@ -520,7 +520,7 @@ static void iucv_retrieve_cpu(void *data
 	int cpu = smp_processor_id();
 	union iucv_param *parm;
 
-	if (!cpu_isset(cpu, iucv_buffer_cpumask))
+	if (!cpumask_test_cpu(cpu, &iucv_buffer_cpumask))
 		return;
 
 	/* Block iucv interrupts. */
@@ -531,7 +531,7 @@ static void iucv_retrieve_cpu(void *data
 	iucv_call_b2f0(IUCV_RETRIEVE_BUFFER, parm);
 
 	/* Clear indication that an iucv buffer exists for this cpu. */
-	cpu_clear(cpu, iucv_buffer_cpumask);
+	cpumask_clear_cpu(cpu, &iucv_buffer_cpumask);
 }
 
 /**
@@ -546,8 +546,8 @@ static void iucv_setmask_mp(void)
 	get_online_cpus();
 	for_each_online_cpu(cpu)
 		/* Enable all cpus with a declared buffer. */
-		if (cpu_isset(cpu, iucv_buffer_cpumask) &&
-		    !cpu_isset(cpu, iucv_irq_cpumask))
+		if (cpumask_test_cpu(cpu, &iucv_buffer_cpumask) &&
+		    !cpumask_test_cpu(cpu, &iucv_irq_cpumask))
 			smp_call_function_single(cpu, iucv_allow_cpu,
 						 NULL, 1);
 	put_online_cpus();
@@ -564,9 +564,9 @@ static void iucv_setmask_up(void)
 	int cpu;
 
 	/* Disable all cpu but the first in cpu_irq_cpumask. */
-	cpumask = iucv_irq_cpumask;
-	cpu_clear(first_cpu(iucv_irq_cpumask), cpumask);
-	for_each_cpu_mask_nr(cpu, cpumask)
+	cpumask_copy(&cpumask, &iucv_irq_cpumask);
+	cpumask_clear_cpu(cpumask_first(&iucv_irq_cpumask), &cpumask);
+	for_each_cpu(cpu, &cpumask)
 		smp_call_function_single(cpu, iucv_block_cpu, NULL, 1);
 }
 
@@ -593,7 +593,7 @@ static int iucv_enable(void)
 	rc = -EIO;
 	for_each_online_cpu(cpu)
 		smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1);
-	if (cpus_empty(iucv_buffer_cpumask))
+	if (cpumask_empty(&iucv_buffer_cpumask))
 		/* No cpu could declare an iucv buffer. */
 		goto out;
 	put_online_cpus();
@@ -675,15 +675,16 @@ static int __cpuinit iucv_cpu_notify(str
 	case CPU_DOWN_PREPARE_FROZEN:
 		if (!iucv_path_table)
 			break;
-		cpumask = iucv_buffer_cpumask;
-		cpu_clear(cpu, cpumask);
-		if (cpus_empty(cpumask))
+		cpumask_copy(&cpumask, &iucv_buffer_cpumask);
+		cpumask_clear_cpu(cpu, &cpumask);
+		if (cpumask_empty(&cpumask))
 			/* Can't offline last IUCV enabled cpu. */
 			return notifier_from_errno(-EINVAL);
 		smp_call_function_single(cpu, iucv_retrieve_cpu, NULL, 1);
-		if (cpus_empty(iucv_irq_cpumask))
-			smp_call_function_single(first_cpu(iucv_buffer_cpumask),
-						 iucv_allow_cpu, NULL, 1);
+		if (cpumask_empty(&iucv_irq_cpumask))
+			smp_call_function_single(
+				cpumask_first(&iucv_buffer_cpumask),
+				iucv_allow_cpu, NULL, 1);
 		break;
 	}
 	return NOTIFY_OK;
@@ -866,7 +867,7 @@ int iucv_path_accept(struct iucv_path *p
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -915,7 +916,7 @@ int iucv_path_connect(struct iucv_path *
 
 	spin_lock_bh(&iucv_table_lock);
 	iucv_cleanup_queue();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -975,7 +976,7 @@ int iucv_path_quiesce(struct iucv_path *
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1007,7 +1008,7 @@ int iucv_path_resume(struct iucv_path *p
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1036,7 +1037,7 @@ int iucv_path_sever(struct iucv_path *pa
 	int rc;
 
 	preempt_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1070,7 +1071,7 @@ int iucv_message_purge(struct iucv_path
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1162,7 +1163,7 @@ int __iucv_message_receive(struct iucv_p
 	if (msg->flags & IUCV_IPRMDATA)
 		return iucv_message_receive_iprmdata(path, msg, flags,
 						     buffer, size, residual);
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	 if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1235,7 +1236,7 @@ int iucv_message_reject(struct iucv_path
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1274,7 +1275,7 @@ int iucv_message_reply(struct iucv_path
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1324,7 +1325,7 @@ int __iucv_message_send(struct iucv_path
 	union iucv_param *parm;
 	int rc;
 
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1411,7 +1412,7 @@ int iucv_message_send2way(struct iucv_pa
 	int rc;
 
 	local_bh_disable();
-	if (cpus_empty(iucv_buffer_cpumask)) {
+	if (cpumask_empty(&iucv_buffer_cpumask)) {
 		rc = -EIO;
 		goto out;
 	}
@@ -1888,7 +1889,7 @@ static int iucv_pm_freeze(struct device
 	printk(KERN_WARNING "iucv_pm_freeze\n");
 #endif
 	if (iucv_pm_state != IUCV_PM_FREEZING) {
-		for_each_cpu_mask_nr(cpu, iucv_irq_cpumask)
+		for_each_cpu(cpu, &iucv_irq_cpumask)
 			smp_call_function_single(cpu, iucv_block_cpu_almost,
 						 NULL, 1);
 		cancel_work_sync(&iucv_work);
@@ -1928,7 +1929,7 @@ static int iucv_pm_thaw(struct device *d
 		if (rc)
 			goto out;
 	}
-	if (cpus_empty(iucv_irq_cpumask)) {
+	if (cpumask_empty(&iucv_irq_cpumask)) {
 		if (iucv_nonsmp_handler)
 			/* enable interrupts on one cpu */
 			iucv_allow_cpu(NULL);
@@ -1961,7 +1962,7 @@ static int iucv_pm_restore(struct device
 		pr_warning("Suspending Linux did not completely close all IUCV "
 			"connections\n");
 	iucv_pm_state = IUCV_PM_RESTORING;
-	if (cpus_empty(iucv_irq_cpumask)) {
+	if (cpumask_empty(&iucv_irq_cpumask)) {
 		rc = iucv_query_maxconn();
 		rc = iucv_enable();
 		if (rc)


^ permalink raw reply

* [patch 6/9] [PATCH] ctcm: get rid of compile warning
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Ursula Braun
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 605-ctcm-compile-warning.diff --]
[-- Type: text/plain, Size: 2987 bytes --]

From: Ursula Braun <ursula.braun@de.ibm.com>

-Wunused-but-set-variable generates compile warnings. The affected
variables are removed.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 drivers/s390/net/ctcm_main.c |    2 --
 drivers/s390/net/ctcm_mpc.c  |   13 ++++---------
 2 files changed, 4 insertions(+), 11 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	2011-05-10 09:14:06.000000000 +0200
+++ linux-2.6-patched/drivers/s390/net/ctcm_main.c	2011-05-10 09:14:26.000000000 +0200
@@ -672,7 +672,6 @@ static int ctcmpc_transmit_skb(struct ch
 	int ccw_idx;
 	unsigned long hi;
 	unsigned long saveflags = 0;	/* avoids compiler warning */
-	__u16 block_len;
 
 	CTCM_PR_DEBUG("Enter %s: %s, cp=%i ch=0x%p id=%s state=%s\n",
 			__func__, dev->name, smp_processor_id(), ch,
@@ -719,7 +718,6 @@ static int ctcmpc_transmit_skb(struct ch
 	 */
 	atomic_inc(&skb->users);
 
-	block_len = skb->len + TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
 	/*
 	 * IDAL support in CTCM is broken, so we have to
 	 * care about skb's above 2G ourselves.
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	2011-03-15 02:20:32.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/ctcm_mpc.c	2011-05-10 09:14:26.000000000 +0200
@@ -653,7 +653,6 @@ static void ctcmpc_send_sweep_resp(struc
 	struct net_device *dev = rch->netdev;
 	struct ctcm_priv *priv = dev->ml_priv;
 	struct mpc_group *grp = priv->mpcg;
-	int rc = 0;
 	struct th_sweep *header;
 	struct sk_buff *sweep_skb;
 	struct channel *ch  = priv->channel[CTCM_WRITE];
@@ -665,16 +664,14 @@ static void ctcmpc_send_sweep_resp(struc
 		CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
 			"%s(%s): sweep_skb allocation ERROR\n",
 			CTCM_FUNTAIL, rch->id);
-		rc = -ENOMEM;
-				goto done;
+		goto done;
 	}
 
 	header = kmalloc(sizeof(struct th_sweep), gfp_type());
 
 	if (!header) {
 		dev_kfree_skb_any(sweep_skb);
-		rc = -ENOMEM;
-				goto done;
+		goto done;
 	}
 
 	header->th.th_seg	= 0x00 ;
@@ -1370,8 +1367,7 @@ static void mpc_action_go_inop(fsm_insta
 	struct net_device  *dev = arg;
 	struct ctcm_priv    *priv;
 	struct mpc_group *grp;
-	int rc = 0;
-	struct channel *wch, *rch;
+	struct channel *wch;
 
 	BUG_ON(dev == NULL);
 	CTCM_PR_DEBUG("Enter %s: %s\n",	__func__, dev->name);
@@ -1396,7 +1392,6 @@ static void mpc_action_go_inop(fsm_insta
 		fsm_deltimer(&priv->restart_timer);
 
 	wch = priv->channel[CTCM_WRITE];
-	rch = priv->channel[CTCM_READ];
 
 	switch (grp->saved_state) {
 	case MPCG_STATE_RESET:
@@ -1435,7 +1430,7 @@ static void mpc_action_go_inop(fsm_insta
 
 	if (grp->send_qllc_disc == 1) {
 		grp->send_qllc_disc = 0;
-		rc = mpc_send_qllc_discontact(dev);
+		mpc_send_qllc_discontact(dev);
 	}
 
 	/* DO NOT issue DEV_EVENT_STOP directly out of this code */


^ permalink raw reply

* [patch 3/9] [PATCH] qeth: add owner to ccw driver
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, Sebastian Ott
In-Reply-To: <20110512054318.241733700@de.ibm.com>

[-- Attachment #1: 602-qeth-add-ccw-driver-owner.diff --]
[-- Type: text/plain, Size: 563 bytes --]

From: Sebastian Ott <sebott@linux.vnet.ibm.com>

Fill in the owner of qeth's ccw device driver.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---


 drivers/s390/net/qeth_core_main.c |    1 +
 1 file changed, 1 insertion(+)
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -4041,6 +4041,7 @@ MODULE_DEVICE_TABLE(ccw, qeth_ids);
 
 static struct ccw_driver qeth_ccw_driver = {
 	.driver = {
+		.owner = THIS_MODULE,
 		.name = "qeth",
 	},
 	.ids = qeth_ids,


^ permalink raw reply

* [patch 0/9] [resend] s390: network feature patches for net-next
From: frank.blaschka @ 2011-05-12  5:43 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390

Hi Dave,

I have updated the hw_features patch with feedback from Michal
and respined the patch set.

shortlog:
Frank Blaschka (2)
qeth: convert to hw_features part 2
qeth: add OSA concurrent hardware trap

Sebastian Ott (1)
qeth: add owner to ccw driver

Heiko Carstens (2)
claw: remove unused return code handling
lcs: get rid of compile warning

Ursula Braun (3)
ctcm: get rid of compile warning
iucv: get rid of compile warning
af_iucv: get rid of compile warning

KOSAKI Motohiro (1)
convert old cpumask API into new one

Thanks,
        Frank


^ permalink raw reply

* Re: [PATCH 4/10] ipvs: Use IP_VS_RT_MODE_* instead of magic constants.
From: Hans Schillstrom @ 2011-05-12  5:28 UTC (permalink / raw)
  To: Julian Anastasov; +Cc: David Miller, netdev@vger.kernel.org
In-Reply-To: <alpine.LFD.2.00.1105120212150.2431@ja.ssi.bg>

On Thursday 12 May 2011 01:32:09 Julian Anastasov wrote:
> 
> 	Hello,
> 
> On Tue, 10 May 2011, David Miller wrote:
> 
> > > 	Following patch can be used after patch 4, eg. as
> > > number 6 because patches 4 and 5 are ok and we are going to replace
> > > patches 6 and 7.
> > 
> > Thanks Julian.
> > 
> > What I'm going to do is hold back the IPVS parts of the patches I
> > posted last night.  In particular, I'll integrate this into the
> > original patch #4.
> > 
> > And then we can work through the reimplementation ideas you posted to
> > me in private email.
> 
> 	My simple tests do not show any problems with patches
> 4, 5 and the new 6 and 7. I tested TUN mode for rt_src/rt_dst
> and DR/NAT for rt_dst replacement, related ICMP is relayed properly.
> So, we should be ok but I'll do more tests in the following
> days because the list with possible combinations for testing
> is too long: different forwarding mode (DR/TUN/NAT),
> local or remote real server, local or remote client,
> In or Out related ICMP, Passive or Active FTP...
> 
I will try to test the Backup/Failover aspects of above

-- 
Regards
Hans Schillstrom <hans.schillstrom@ericsson.com>

^ permalink raw reply

* Re: [PATCH net-next 2/4] tulip: Convert printks to netdev_<level>
From: Joe Perches @ 2011-05-12  4:59 UTC (permalink / raw)
  To: Grant Grundler; +Cc: Tobias Ringstrom, netdev, linux-kernel
In-Reply-To: <20110512040906.GB8885@parisc-linux.org>

On Wed, 2011-05-11 at 22:09 -0600, Grant Grundler wrote:
> Some additional clean ups to consider in a future patch:
> o replace "if (skb == NULL)" with "if (!skb)" 

Hey Grant.

I generally don't change those.
While I prefer (!ptr), others prefer explicit comparisons.
I do have a script that does the conversion though.
(de4x5.c is a mess and I didn't change it)

Here's the output with hoisted assigns from if too.
(and a spelling fix I noticed)

 drivers/net/tulip/de2104x.c     |    3 ++-
 drivers/net/tulip/dmfe.c        |   11 ++++++-----
 drivers/net/tulip/eeprom.c      |    6 +++---
 drivers/net/tulip/interrupt.c   |   18 +++++++++---------
 drivers/net/tulip/timer.c       |    2 +-
 drivers/net/tulip/tulip_core.c  |   15 +++++++++------
 drivers/net/tulip/uli526x.c     |   15 +++++++--------
 drivers/net/tulip/winbond-840.c |   14 ++++++++------
 drivers/net/tulip/xircom_cb.c   |   12 ++++++------
 9 files changed, 51 insertions(+), 45 deletions(-)

diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c
index e2f6923..45a4843 100644
--- a/drivers/net/tulip/de2104x.c
+++ b/drivers/net/tulip/de2104x.c
@@ -2170,7 +2170,8 @@ static int de_resume (struct pci_dev *pdev)
 		goto out;
 	if (!netif_running(dev))
 		goto out_attach;
-	if ((retval = pci_enable_device(pdev))) {
+	retval = pci_enable_device(pdev);
+	if (retval) {
 		netdev_err(dev, "pci_enable_device failed in resume\n");
 		goto out;
 	}
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c
index 4685127..588d6b4 100644
--- a/drivers/net/tulip/dmfe.c
+++ b/drivers/net/tulip/dmfe.c
@@ -400,7 +400,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
 
 	/* Init network device */
 	dev = alloc_etherdev(sizeof(*db));
-	if (dev == NULL)
+	if (!dev)
 		return -ENOMEM;
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
@@ -1009,10 +1009,10 @@ static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db)
 					db->dm910x_chk_mode = 3;
 				} else {
 					/* Good packet, send to upper layer */
-					/* Shorst packet used new SKB */
+					/* Short packet used new SKB */
 					if ((rxlen < RX_COPY_SIZE) &&
-						((newskb = dev_alloc_skb(rxlen + 2))
-						!= NULL)) {
+					    (newskb =
+						dev_alloc_skb(rxlen + 2))) {
 
 						skb = newskb;
 						/* size less than COPY_SIZE, allocate a rxlen SKB */
@@ -1561,7 +1561,8 @@ static void allocate_rx_buffer(struct dmfe_board_info *db)
 	rxptr = db->rx_insert_ptr;
 
 	while(db->rx_avail_cnt < RX_DESC_CNT) {
-		if ( ( skb = dev_alloc_skb(RX_ALLOC_SIZE) ) == NULL )
+		skb = dev_alloc_skb(RX_ALLOC_SIZE);
+		if (!skb)
 			break;
 		rxptr->rx_skb_ptr = skb; /* FIXME (?) */
 		rxptr->rdes2 = cpu_to_le32( pci_map_single(db->pdev, skb->data,
diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c
index fa5eee9..a11eb73 100644
--- a/drivers/net/tulip/eeprom.c
+++ b/drivers/net/tulip/eeprom.c
@@ -123,7 +123,7 @@ static void __devinit tulip_build_fake_mediatable(struct tulip_private *tp)
 		tp->mtable = kmalloc(sizeof(struct mediatable) +
 				     sizeof(struct medialeaf), GFP_KERNEL);
 
-		if (tp->mtable == NULL)
+		if (!tp->mtable)
 			return; /* Horrible, impossible failure. */
 
 		tp->mtable->defaultmedia = 0x800;
@@ -192,7 +192,7 @@ void __devinit tulip_parse_eeprom(struct net_device *dev)
 		  break;
 		}
 	  }
-	  if (eeprom_fixups[i].name == NULL) { /* No fixup found. */
+	  if (!eeprom_fixups[i].name) { /* No fixup found. */
 		  pr_info("%s: Old style EEPROM with no media selection information\n",
 			  dev->name);
 		return;
@@ -230,7 +230,7 @@ subsequent_board:
 		mtable = kmalloc(sizeof(struct mediatable) +
 				 count * sizeof(struct medialeaf),
 				 GFP_KERNEL);
-		if (mtable == NULL)
+		if (!mtable)
 			return;				/* Horrible, impossible failure. */
 		last_mediatable = tp->mtable = mtable;
 		mtable->defaultmedia = media;
diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c
index 5350d75..1a1bff5 100644
--- a/drivers/net/tulip/interrupt.c
+++ b/drivers/net/tulip/interrupt.c
@@ -68,12 +68,12 @@ int tulip_refill_rx(struct net_device *dev)
 	/* Refill the Rx ring buffers. */
 	for (; tp->cur_rx - tp->dirty_rx > 0; tp->dirty_rx++) {
 		entry = tp->dirty_rx % RX_RING_SIZE;
-		if (tp->rx_buffers[entry].skb == NULL) {
+		if (!tp->rx_buffers[entry].skb) {
 			struct sk_buff *skb;
 			dma_addr_t mapping;
 
 			skb = tp->rx_buffers[entry].skb = dev_alloc_skb(PKT_BUF_SZ);
-			if (skb == NULL)
+			if (!skb)
 				break;
 
 			mapping = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ,
@@ -205,7 +205,7 @@ int tulip_poll(struct napi_struct *napi, int budget)
                                /* Check if the packet is long enough to accept without copying
                                   to a minimally-sized skbuff. */
                                if (pkt_len < tulip_rx_copybreak &&
-                                   (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+				   (skb = dev_alloc_skb(pkt_len + 2))) {
                                        skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                        pci_dma_sync_single_for_cpu(tp->pdev,
 								   tp->rx_buffers[entry].mapping,
@@ -311,7 +311,7 @@ int tulip_poll(struct napi_struct *napi, int budget)
          tulip_refill_rx(dev);
 
          /* If RX ring is not full we are out of memory. */
-         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
+	 if (!tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb)
 		 goto oom;
 
          /* Remove us from polling list and enable RX intr. */
@@ -334,10 +334,10 @@ int tulip_poll(struct napi_struct *napi, int budget)
 
  not_done:
          if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 ||
-             tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
+	     !tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb)
                  tulip_refill_rx(dev);
 
-         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
+	 if (!tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb)
 		 goto oom;
 
          return work_done;
@@ -431,7 +431,7 @@ static int tulip_rx(struct net_device *dev)
 			/* Check if the packet is long enough to accept without copying
 			   to a minimally-sized skbuff. */
 			if (pkt_len < tulip_rx_copybreak &&
-			    (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+			    (skb = dev_alloc_skb(pkt_len + 2))) {
 				skb_reserve(skb, 2);	/* 16 byte align the IP header */
 				pci_dma_sync_single_for_cpu(tp->pdev,
 							    tp->rx_buffers[entry].mapping,
@@ -591,7 +591,7 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance)
 					break;			/* It still has not been Txed */
 
 				/* Check for Rx filter setup frames. */
-				if (tp->tx_buffers[entry].skb == NULL) {
+				if (!tp->tx_buffers[entry].skb) {
 					/* test because dummy frames not mapped */
 					if (tp->tx_buffers[entry].mapping)
 						pci_unmap_single(tp->pdev,
@@ -775,7 +775,7 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance)
 
 	/* check if the card is in suspend mode */
 	entry = tp->dirty_rx % RX_RING_SIZE;
-	if (tp->rx_buffers[entry].skb == NULL) {
+	if (!tp->rx_buffers[entry].skb) {
 		if (tulip_debug > 1)
 			dev_warn(&dev->dev,
 				 "in rx suspend mode: (%lu) (tp->cur_rx = %u, ttimer = %d, rx = %d) go/stay in suspend mode\n",
diff --git a/drivers/net/tulip/timer.c b/drivers/net/tulip/timer.c
index 2017faf..afc5445 100644
--- a/drivers/net/tulip/timer.c
+++ b/drivers/net/tulip/timer.c
@@ -43,7 +43,7 @@ void tulip_media_task(struct work_struct *work)
 	default: {
 		struct medialeaf *mleaf;
 		unsigned char *p;
-		if (tp->mtable == NULL) {	/* No EEPROM info, use generic code. */
+		if (!tp->mtable) {	/* No EEPROM info, use generic code. */
 			/* Not much that can be done.
 			   Assume this a generic MII or SYM transceiver. */
 			next_tick = 60*HZ;
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
index 82f8764..0ab2465 100644
--- a/drivers/net/tulip/tulip_core.c
+++ b/drivers/net/tulip/tulip_core.c
@@ -384,7 +384,7 @@ static void tulip_up(struct net_device *dev)
 
 	/* Allow selecting a default media. */
 	i = 0;
-	if (tp->mtable == NULL)
+	if (!tp->mtable)
 		goto media_picked;
 	if (dev->if_port) {
 		int looking_for = tulip_media_cap[dev->if_port] & MediaIsMII ? 11 :
@@ -642,7 +642,7 @@ static void tulip_init_ring(struct net_device *dev)
 		   use skb_reserve() to align the IP header! */
 		struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ);
 		tp->rx_buffers[i].skb = skb;
-		if (skb == NULL)
+		if (!skb)
 			break;
 		mapping = pci_map_single(tp->pdev, skb->data,
 					 PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
@@ -728,7 +728,7 @@ static void tulip_clean_tx_ring(struct tulip_private *tp)
 		}
 
 		/* Check for Tx filter setup frames. */
-		if (tp->tx_buffers[entry].skb == NULL) {
+		if (!tp->tx_buffers[entry].skb) {
 			/* test because dummy frames not mapped */
 			if (tp->tx_buffers[entry].mapping)
 				pci_unmap_single(tp->pdev,
@@ -821,7 +821,7 @@ static void tulip_free_ring (struct net_device *dev)
 	for (i = 0; i < TX_RING_SIZE; i++) {
 		struct sk_buff *skb = tp->tx_buffers[i].skb;
 
-		if (skb != NULL) {
+		if (skb) {
 			pci_unmap_single(tp->pdev, tp->tx_buffers[i].mapping,
 					 skb->len, PCI_DMA_TODEVICE);
 			dev_kfree_skb (skb);
@@ -1900,12 +1900,15 @@ static int tulip_resume(struct pci_dev *pdev)
 	if (!netif_running(dev))
 		return 0;
 
-	if ((retval = pci_enable_device(pdev))) {
+	retval = pci_enable_device(pdev);
+	if (retval) {
 		pr_err("pci_enable_device failed in resume\n");
 		return retval;
 	}
 
-	if ((retval = request_irq(dev->irq, tulip_interrupt, IRQF_SHARED, dev->name, dev))) {
+	retval = request_irq(dev->irq, tulip_interrupt, IRQF_SHARED,
+			     dev->name, dev);
+	if (retval) {
 		pr_err("request_irq failed in resume\n");
 		return retval;
 	}
diff --git a/drivers/net/tulip/uli526x.c b/drivers/net/tulip/uli526x.c
index 9e63f40..a6f6a9e 100644
--- a/drivers/net/tulip/uli526x.c
+++ b/drivers/net/tulip/uli526x.c
@@ -286,7 +286,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
 
 	/* Init network device */
 	dev = alloc_etherdev(sizeof(*db));
-	if (dev == NULL)
+	if (!dev)
 		return -ENOMEM;
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
@@ -324,14 +324,12 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
 
 	/* Allocate Tx/Rx descriptor memory */
 	db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
-	if(db->desc_pool_ptr == NULL)
-	{
+	if (!db->desc_pool_ptr) {
 		err = -ENOMEM;
 		goto err_out_nomem;
 	}
 	db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
-	if(db->buf_pool_ptr == NULL)
-	{
+	if (!db->buf_pool_ptr) {
 		err = -ENOMEM;
 		goto err_out_nomem;
 	}
@@ -404,7 +402,7 @@ err_out_nomem:
 		pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20,
 			db->desc_pool_ptr, db->desc_pool_dma_ptr);
 
-	if(db->buf_pool_ptr != NULL)
+	if (db->buf_pool_ptr)
 		pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
 			db->buf_pool_ptr, db->buf_pool_dma_ptr);
 err_out_disable:
@@ -844,7 +842,7 @@ static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info
 				/* Good packet, send to upper layer */
 				/* Shorst packet used new SKB */
 				if ((rxlen < RX_COPY_SIZE) &&
-				    (((new_skb = dev_alloc_skb(rxlen + 2)) != NULL))) {
+				    (new_skb = dev_alloc_skb(rxlen + 2))) {
 					skb = new_skb;
 					/* size less than COPY_SIZE, allocate a rxlen SKB */
 					skb_reserve(skb, 2); /* 16byte align */
@@ -1440,7 +1438,8 @@ static void allocate_rx_buffer(struct uli526x_board_info *db)
 	rxptr = db->rx_insert_ptr;
 
 	while(db->rx_avail_cnt < RX_DESC_CNT) {
-		if ( ( skb = dev_alloc_skb(RX_ALLOC_SIZE) ) == NULL )
+		skb = dev_alloc_skb(RX_ALLOC_SIZE);
+		if (!skb)
 			break;
 		rxptr->rx_skb_ptr = skb; /* FIXME (?) */
 		rxptr->rdes2 = cpu_to_le32(pci_map_single(db->pdev,
diff --git a/drivers/net/tulip/winbond-840.c b/drivers/net/tulip/winbond-840.c
index 862eadf..a957e72 100644
--- a/drivers/net/tulip/winbond-840.c
+++ b/drivers/net/tulip/winbond-840.c
@@ -647,7 +647,8 @@ static int netdev_open(struct net_device *dev)
 	if (debug > 1)
 		netdev_dbg(dev, "w89c840_open() irq %d\n", dev->irq);
 
-	if((i=alloc_ringdesc(dev)))
+	i = alloc_ringdesc(dev);
+	if (i)
 		goto out_err;
 
 	spin_lock_irq(&np->lock);
@@ -817,7 +818,7 @@ static void init_rxtx_rings(struct net_device *dev)
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
 		np->rx_skbuff[i] = skb;
-		if (skb == NULL)
+		if (!skb)
 			break;
 		np->rx_addr[i] = pci_map_single(np->pci_dev,skb->data,
 					np->rx_buf_sz,PCI_DMA_FROMDEVICE);
@@ -1231,7 +1232,7 @@ static int netdev_rx(struct net_device *dev)
 			/* Check if the packet is long enough to accept without copying
 			   to a minimally-sized skbuff. */
 			if (pkt_len < rx_copybreak &&
-			    (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+			    (skb = dev_alloc_skb(pkt_len + 2))) {
 				skb_reserve(skb, 2);	/* 16 byte align the IP header */
 				pci_dma_sync_single_for_cpu(np->pci_dev,np->rx_addr[entry],
 							    np->rx_skbuff[entry]->len,
@@ -1269,10 +1270,10 @@ static int netdev_rx(struct net_device *dev)
 	for (; np->cur_rx - np->dirty_rx > 0; np->dirty_rx++) {
 		struct sk_buff *skb;
 		entry = np->dirty_rx % RX_RING_SIZE;
-		if (np->rx_skbuff[entry] == NULL) {
+		if (!np->rx_skbuff[entry]) {
 			skb = dev_alloc_skb(np->rx_buf_sz);
 			np->rx_skbuff[entry] = skb;
-			if (skb == NULL)
+			if (!skb)
 				break;			/* Better luck next round. */
 			np->rx_addr[entry] = pci_map_single(np->pci_dev,
 							skb->data,
@@ -1618,7 +1619,8 @@ static int w840_resume (struct pci_dev *pdev)
 	if (netif_device_present(dev))
 		goto out; /* device not suspended */
 	if (netif_running(dev)) {
-		if ((retval = pci_enable_device(pdev))) {
+		retval = pci_enable_device(pdev);
+		if (retval) {
 			dev_err(&dev->dev,
 				"pci_enable_device failed in resume\n");
 			goto out;
diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
index 988b8eb..1cb7208 100644
--- a/drivers/net/tulip/xircom_cb.c
+++ b/drivers/net/tulip/xircom_cb.c
@@ -230,12 +230,12 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
 
 	/* Allocate the send/receive buffers */
 	private->rx_buffer = pci_alloc_consistent(pdev,8192,&private->rx_dma_handle);
-	if (private->rx_buffer == NULL) {
+	if (!private->rx_buffer) {
 		pr_err("%s: no memory for rx buffer\n", __func__);
 		goto rx_buf_fail;
 	}
 	private->tx_buffer = pci_alloc_consistent(pdev,8192,&private->tx_dma_handle);
-	if (private->tx_buffer == NULL) {
+	if (!private->tx_buffer) {
 		pr_err("%s: no memory for tx buffer\n", __func__);
 		goto tx_buf_fail;
 	}
@@ -546,8 +546,8 @@ static void setup_descriptors(struct xircom_private *card)
 	u32 address;
 	int i;
 
-	BUG_ON(card->rx_buffer == NULL);
-	BUG_ON(card->tx_buffer == NULL);
+	BUG_ON(!card->rx_buffer);
+	BUG_ON(!card->tx_buffer);
 
 	/* Receive descriptors */
 	memset(card->rx_buffer, 0, 128);	/* clear the descriptors */
@@ -1086,7 +1086,7 @@ investigate_read_descriptor(struct net_device *dev, struct xircom_private *card,
 		}
 
 		skb = dev_alloc_skb(pkt_len + 2);
-		if (skb == NULL) {
+		if (!skb) {
 			dev->stats.rx_dropped++;
 			goto out;
 		}
@@ -1125,7 +1125,7 @@ investigate_write_descriptor(struct net_device *dev,
 	}
 #endif
 	if (status > 0) {	/* bit 31 is 0 when done */
-		if (card->tx_skb[descnr]!=NULL) {
+		if (card->tx_skb[descnr]) {
 			dev->stats.tx_bytes += card->tx_skb[descnr]->len;
 			dev_kfree_skb_irq(card->tx_skb[descnr]);
 		}

> o in general, HW doesn't return signed integer values.  Where possible,
>   I prefer to see "unsigned int status;" and "if (status)".

That one is yours to change if you want.


^ permalink raw reply related

* Re: [PATCHv1] e1000e: Allow ethtool to enable/disable loopback.
From: David Miller @ 2011-05-12  4:45 UTC (permalink / raw)
  To: maheshb; +Cc: mirqus, jeffrey.t.kirsher, e1000-devel, netdev, therbert
In-Reply-To: <BANLkTimfF4EJ_B=Y-ssjkzmtG123P+HMTA@mail.gmail.com>

From: Mahesh Bandewar <maheshb@google.com>
Date: Wed, 11 May 2011 16:11:21 -0700

> On Wed, May 11, 2011 at 12:15 PM, Michał Mirosław <mirqus@gmail.com> wrote:
>> 2011/5/11 Mahesh Bandewar <maheshb@google.com>:
>>> This patch adds e1000_set_features() to handle loopback mode. When loopback
>>> is enabled, it enables internal-MAC loopback.
>>
>> Please wait for this driver's conversion to hw_features. One comment
>> below, though.
>>
> This is not intrusive so should not create problems when that happens.

Right and the Intel maintainer folks can resolve such conflicts
anyways.

^ permalink raw reply

* Re: [PATCH] iproute2: use IFLA_TXQLEN when it is available
From: Eric Dumazet @ 2011-05-12  4:40 UTC (permalink / raw)
  To: Changli Gao; +Cc: shemminger, netdev, kuznet
In-Reply-To: <1305170886.3232.13.camel@edumazet-laptop>

Le jeudi 12 mai 2011 à 05:28 +0200, Eric Dumazet a écrit :
> Le jeudi 12 mai 2011 à 10:47 +0800, Changli Gao a écrit :
> > Use IFLA_TXQLEN when it is available, to avoid additional system calls.
> > 
> > Signed-off-by: Changli Gao <xiaosuo@gmail.com>
> > ---
> >  ip/ipaddress.c |   12 ++++++++++--
> >  1 file changed, 10 insertions(+), 2 deletions(-)
> > diff --git a/ip/ipaddress.c b/ip/ipaddress.c
> > index a1f78b9..59afafd 100644
> > --- a/ip/ipaddress.c
> > +++ b/ip/ipaddress.c
> > @@ -285,8 +285,16 @@ int print_linkinfo(const struct sockaddr_nl *who,
> >  	if (tb[IFLA_OPERSTATE])
> >  		print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE]));
> >  		
> > -	if (filter.showqueue)
> > -		print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME]));
> > +	if (filter.showqueue) {
> > +		if (tb[IFLA_TXQLEN]) {
> > +			__u32 txqlen = *(__u32 *)RTA_DATA(tb[IFLA_TXQLEN]);
> > +
> > +			if (txqlen)
> > +				fprintf(fp, "qlen %u", txqlen);
> > +		} else {
> > +			print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME]));
> > +		}
> > +	}
> >  
> >  	if (!filter.family || filter.family == AF_PACKET) {
> >  		SPRINT_BUF(b1);
> 
> Hmm, what iproute2 version do you use ???
> 
> commit 62a5e0668e2920b7f09896abd884753255712a46
> Author: Eric Dumazet <dada1@cosmosbay.com>
> Date:   Fri Oct 23 06:25:53 2009 +0200
> 
>     ip: Support IFLA_TXQLEN in ip link show command
>     
>     We currently use an expensive ioctl() to get device txqueuelen, while
>     rtnetlink gave it to us for free. This patch speeds up ip link operation
>     when many devices are registered.
> 
> 


Apparently my patch was somehow lost

http://patchwork.ozlabs.org/patch/36762/

Strange thing is it's in my git tree.

Stephen, any idea of what happened ?

Thanks

commit 62a5e0668e2920b7f09896abd884753255712a46
Author: Eric Dumazet <dada1@cosmosbay.com>
Date:   Fri Oct 23 06:25:53 2009 +0200

[PATCH iproute2] ip: Support IFLA_TXQLEN in ip link show command
    
We currently use an expensive ioctl() to get device txqueuelen, while
rtnetlink gave it to us for free. This patch speeds up ip link operation
when many devices are registered.

diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 267ecb3..cadc1a3 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -131,26 +131,31 @@ static void print_operstate(FILE *f, __u8 state)
 		fprintf(f, "state %s ", oper_states[state]);
 }
 
-static void print_queuelen(FILE *f, const char *name)
+static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1])
 {
-	struct ifreq ifr;
-	int s;
-
-	s = socket(AF_INET, SOCK_STREAM, 0);
-	if (s < 0)
-		return;
-
-	memset(&ifr, 0, sizeof(ifr));
-	strcpy(ifr.ifr_name, name);
-	if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) {
-		fprintf(f, "ioctl(SIOCGIFXQLEN) failed: %s\n", strerror(errno));
+	int qlen;
+
+	if (tb[IFLA_TXQLEN])
+		qlen = *(int *)RTA_DATA(tb[IFLA_TXQLEN]);
+	else {
+		struct ifreq ifr;
+		int s = socket(AF_INET, SOCK_STREAM, 0);
+
+		if (s < 0)
+			return;
+
+		memset(&ifr, 0, sizeof(ifr));
+		strcpy(ifr.ifr_name, (char *)RTA_DATA(tb[IFLA_IFNAME]));
+		if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) {
+			fprintf(f, "ioctl(SIOCGIFXQLEN) failed: %s\n", strerror(errno));
+			close(s);
+			return;
+		}
 		close(s);
-		return;
+		qlen = ifr.ifr_qlen;
 	}
-	close(s);
-
-	if (ifr.ifr_qlen)
-		fprintf(f, "qlen %d", ifr.ifr_qlen);
+	if (qlen)
+		fprintf(f, "qlen %d", qlen);
 }
 
 static void print_linktype(FILE *fp, struct rtattr *tb)
@@ -253,7 +258,7 @@ int print_linkinfo(const struct sockaddr_nl *who,
 		print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE]));
 		
 	if (filter.showqueue)
-		print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME]));
+		print_queuelen(fp, tb);
 
 	if (!filter.family || filter.family == AF_PACKET) {
 		SPRINT_BUF(b1);



^ permalink raw reply related

* Re: [PATCH] ehea: Fix memory hotplug oops
From: David Miller @ 2011-05-12  4:38 UTC (permalink / raw)
  To: leitao; +Cc: anton, netdev
In-Reply-To: <4DCA853B.6060904@linux.vnet.ibm.com>

From: Breno Leitao <leitao@linux.vnet.ibm.com>
Date: Wed, 11 May 2011 09:46:51 -0300

> On 05/10/2011 11:17 PM, Anton Blanchard wrote:
>>
>>  The ehea driver oopses during memory hotplug if the ports are not
>>  up. A simple testcase:
>>
>>  # ifconfig ethX down
>>  # echo offline > /sys/devices/system/memory/memory32/state
>>
>>  Oops: Kernel access of bad area, sig: 11 [#1]
>>  last sysfs file: /sys/devices/system/memory/memory32/state
>>  REGS: c000000709393110 TRAP: 0300 Not tainted 
> (2.6.39-rc2-01385-g7ef73bc-dirty)
>>  DAR: 0000000000000000, DSISR: 40000000
>>  ...
>>  NIP [c000000000067c98] .__wake_up_common+0x48/0xf0
>>  LR [c00000000006d034] .__wake_up+0x54/0x90
>>  Call Trace:
>>  [c00000000006d034] .__wake_up+0x54/0x90
>>  [d000000006bb6270] .ehea_rereg_mrs+0x140/0x730 [ehea]
>>  [d000000006bb69c4] .ehea_mem_notifier+0x164/0x170 [ehea]
>>  [c0000000006fc8a8] .notifier_call_chain+0x78/0xf0
>>  [c0000000000b3d70] .__blocking_notifier_call_chain+0x70/0xb0
>>  [c000000000458d78] .memory_notify+0x28/0x40
>>  [c0000000001871d8] .remove_memory+0x208/0x6d0
>>  [c000000000458264] .memory_section_action+0x94/0x140
>>  [c0000000004583ec] .memory_block_change_state+0xdc/0x1d0
>>  [c0000000004585cc] .store_mem_state+0xec/0x160
>>  [c00000000044768c] .sysdev_store+0x3c/0x50
>>  [c00000000020b48c] .sysfs_write_file+0xec/0x1f0
>>  [c00000000018f86c] .vfs_write+0xec/0x1e0
>>  [c00000000018fa88] .SyS_write+0x58/0xd0
>>
>>  To fix this, initialise the waitqueues during port probe instead
>>  of port open.
>>
>>  Signed-off-by: Anton Blanchard <anton@samba.org>
> Acked-by: Breno Leitao <leitao@linux.vnet.ibm.com>

Applied to net-2.6, thanks.

^ permalink raw reply

* [PATCH net-next-2.6] l2tp: fix potential rcu race
From: Eric Dumazet @ 2011-05-12  4:22 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Paul E. McKenney, James Chapman

While trying to remove useless synchronize_rcu() calls, I found l2tp is
indeed incorrectly using two of such calls, but also bumps tunnel
refcount after list insertion.

tunnel refcount must be incremented before being made publically visible
by rcu readers.

This fix can be applied to 2.6.35+ and might need a backport for older
kernels, since things were shuffled in commit fd558d186df2c
(l2tp: Split pppol2tp patch into separate l2tp and ppp parts)

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
CC: James Chapman <jchapman@katalix.com>
---

I based this patch on net-next-2.6 because of recent commits in this
file and linux-2.6 being on late RC phase. But its a stable candidate.

 net/l2tp/l2tp_core.c |   10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 9be095e..ed8a233 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1435,16 +1435,15 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
 
 	/* Add tunnel to our list */
 	INIT_LIST_HEAD(&tunnel->list);
-	spin_lock_bh(&pn->l2tp_tunnel_list_lock);
-	list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list);
-	spin_unlock_bh(&pn->l2tp_tunnel_list_lock);
-	synchronize_rcu();
 	atomic_inc(&l2tp_tunnel_count);
 
 	/* Bump the reference count. The tunnel context is deleted
-	 * only when this drops to zero.
+	 * only when this drops to zero. Must be done before list insertion
 	 */
 	l2tp_tunnel_inc_refcount(tunnel);
+	spin_lock_bh(&pn->l2tp_tunnel_list_lock);
+	list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list);
+	spin_unlock_bh(&pn->l2tp_tunnel_list_lock);
 
 	err = 0;
 err:
@@ -1636,7 +1635,6 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn
 			hlist_add_head_rcu(&session->global_hlist,
 					   l2tp_session_id_hash_2(pn, session_id));
 			spin_unlock_bh(&pn->l2tp_session_hlist_lock);
-			synchronize_rcu();
 		}
 
 		/* Ignore management session in session count value */



^ permalink raw reply related

* Re: [PATCH net-next 2/4] tulip: Convert printks to netdev_<level>
From: Grant Grundler @ 2011-05-12  4:09 UTC (permalink / raw)
  To: Joe Perches; +Cc: Tobias Ringstrom, netdev, linux-kernel
In-Reply-To: <84a86a5b89eac3aec88427c8afd09591bd5b0cfc.1304733889.git.joe@perches.com>

On Fri, May 06, 2011 at 07:08:43PM -0700, Joe Perches wrote:
> Use the current more descriptive logging styles.
> 
> Add pr_fmt and remove PFX where appropriate.
> Use netif_<level>, netdev_<level>
> Indent a few blocks in xircom_cb where appropriate.
> 
> Signed-off-by: Joe Perches <joe@perches.com>

Ack-by: Grant Grundler <grundler@parisc-linux.org>

Some additional clean ups to consider in a future patch:
o replace "if (skb == NULL)" with "if (!skb)" 
o in general, HW doesn't return signed integer values.  Where possible,
  I prefer to see "unsigned int status;" and "if (status)".

thanks,
grant

> ---
>  drivers/net/tulip/de2104x.c     |  139 +++++++++++++++++---------------------
>  drivers/net/tulip/dmfe.c        |    2 +-
>  drivers/net/tulip/eeprom.c      |    4 +-
>  drivers/net/tulip/tulip_core.c  |   25 +++----
>  drivers/net/tulip/uli526x.c     |   42 +++++-------
>  drivers/net/tulip/winbond-840.c |    6 +-
>  drivers/net/tulip/xircom_cb.c   |  140 +++++++++++++++++++++------------------
>  7 files changed, 174 insertions(+), 184 deletions(-)
> 
> diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c
> index 46d5a1b..62883a0 100644
> --- a/drivers/net/tulip/de2104x.c
> +++ b/drivers/net/tulip/de2104x.c
> @@ -27,6 +27,8 @@
>  
>   */
>  
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
>  #define DRV_NAME		"de2104x"
>  #define DRV_VERSION		"0.7"
>  #define DRV_RELDATE		"Mar 17, 2004"
> @@ -73,8 +75,6 @@ static int rx_copybreak = 100;
>  module_param (rx_copybreak, int, 0);
>  MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copied");
>  
> -#define PFX			DRV_NAME ": "
> -
>  #define DE_DEF_MSG_ENABLE	(NETIF_MSG_DRV		| \
>  				 NETIF_MSG_PROBE 	| \
>  				 NETIF_MSG_LINK		| \
> @@ -377,18 +377,16 @@ static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
>  static void de_rx_err_acct (struct de_private *de, unsigned rx_tail,
>  			    u32 status, u32 len)
>  {
> -	if (netif_msg_rx_err (de))
> -		printk (KERN_DEBUG
> -			"%s: rx err, slot %d status 0x%x len %d\n",
> -			de->dev->name, rx_tail, status, len);
> +	netif_printk(de, rx_err, KERN_DEBUG, de->dev,
> +		     "rx err, slot %d status 0x%x len %d\n",
> +		     rx_tail, status, len);
>  
>  	if ((status & 0x38000300) != 0x0300) {
>  		/* Ingore earlier buffers. */
>  		if ((status & 0xffff) != 0x7fff) {
> -			if (netif_msg_rx_err(de))
> -				dev_warn(&de->dev->dev,
> -					 "Oversized Ethernet frame spanned multiple buffers, status %08x!\n",
> -					 status);
> +			netif_warn(de, rx_err, de->dev,
> +				   "Oversized Ethernet frame spanned multiple buffers, status %08x!\n",
> +				   status);
>  			de->net_stats.rx_length_errors++;
>  		}
>  	} else if (status & RxError) {
> @@ -491,7 +489,7 @@ rx_next:
>  	}
>  
>  	if (!rx_work)
> -		dev_warn(&de->dev->dev, "rx work limit reached\n");
> +		netdev_warn(de->dev, "rx work limit reached\n");
>  
>  	de->rx_tail = rx_tail;
>  }
> @@ -534,9 +532,9 @@ static irqreturn_t de_interrupt (int irq, void *dev_instance)
>  
>  		pci_read_config_word(de->pdev, PCI_STATUS, &pci_status);
>  		pci_write_config_word(de->pdev, PCI_STATUS, pci_status);
> -		dev_err(&de->dev->dev,
> -			"PCI bus error, status=%08x, PCI status=%04x\n",
> -			status, pci_status);
> +		netdev_err(de->dev,
> +			   "PCI bus error, status=%08x, PCI status=%04x\n",
> +			   status, pci_status);
>  	}
>  
>  	return IRQ_HANDLED;
> @@ -873,7 +871,7 @@ static void de_stop_rxtx (struct de_private *de)
>  		udelay(100);
>  	}
>  
> -	dev_warn(&de->dev->dev, "timeout expired stopping DMA\n");
> +	netdev_warn(de->dev, "timeout expired, stopping DMA\n");
>  }
>  
>  static inline void de_start_rxtx (struct de_private *de)
> @@ -907,9 +905,8 @@ static void de_link_up(struct de_private *de)
>  {
>  	if (!netif_carrier_ok(de->dev)) {
>  		netif_carrier_on(de->dev);
> -		if (netif_msg_link(de))
> -			dev_info(&de->dev->dev, "link up, media %s\n",
> -				 media_name[de->media_type]);
> +		netif_info(de, link, de->dev, "link up, media %s\n",
> +			   media_name[de->media_type]);
>  	}
>  }
>  
> @@ -917,8 +914,7 @@ static void de_link_down(struct de_private *de)
>  {
>  	if (netif_carrier_ok(de->dev)) {
>  		netif_carrier_off(de->dev);
> -		if (netif_msg_link(de))
> -			dev_info(&de->dev->dev, "link down\n");
> +		netif_info(de, link, de->dev, "link down\n");
>  	}
>  }
>  
> @@ -928,8 +924,7 @@ static void de_set_media (struct de_private *de)
>  	u32 macmode = dr32(MacMode);
>  
>  	if (de_is_running(de))
> -		dev_warn(&de->dev->dev,
> -			 "chip is running while changing media!\n");
> +		netdev_warn(de->dev, "chip is running while changing media!\n");
>  
>  	if (de->de21040)
>  		dw32(CSR11, FULL_DUPLEX_MAGIC);
> @@ -948,18 +943,13 @@ static void de_set_media (struct de_private *de)
>  	else
>  		macmode &= ~FullDuplex;
>  
> -	if (netif_msg_link(de))
> -		dev_info(&de->dev->dev, "set link %s\n", media_name[media]);
> -	if (netif_msg_hw(de)) {
> -		dev_info(&de->dev->dev, "mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n",
> -			 dr32(MacMode), dr32(SIAStatus),
> -			 dr32(CSR13), dr32(CSR14), dr32(CSR15));
> -
> -		dev_info(&de->dev->dev,
> -			 "set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
> -			 macmode, de->media[media].csr13,
> -			 de->media[media].csr14, de->media[media].csr15);
> -	}
> +	netif_info(de, link, de->dev, "set link %s\n", media_name[media]);
> +	netif_info(de, hw, de->dev, "mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n",
> +		   dr32(MacMode), dr32(SIAStatus),
> +		   dr32(CSR13), dr32(CSR14), dr32(CSR15));
> +	netif_info(de, hw, de->dev, "set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
> +		   macmode, de->media[media].csr13,
> +		   de->media[media].csr14, de->media[media].csr15);
>  	if (macmode != dr32(MacMode))
>  		dw32(MacMode, macmode);
>  }
> @@ -996,9 +986,8 @@ static void de21040_media_timer (unsigned long data)
>  		if (!netif_carrier_ok(dev))
>  			de_link_up(de);
>  		else
> -			if (netif_msg_timer(de))
> -				dev_info(&dev->dev, "%s link ok, status %x\n",
> -					 media_name[de->media_type], status);
> +			netif_info(de, timer, dev, "%s link ok, status %x\n",
> +				   media_name[de->media_type], status);
>  		return;
>  	}
>  
> @@ -1025,9 +1014,8 @@ no_link_yet:
>  	de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
>  	add_timer(&de->media_timer);
>  
> -	if (netif_msg_timer(de))
> -		dev_info(&dev->dev, "no link, trying media %s, status %x\n",
> -			 media_name[de->media_type], status);
> +	netif_info(de, timer, dev, "no link, trying media %s, status %x\n",
> +		   media_name[de->media_type], status);
>  }
>  
>  static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media)
> @@ -1085,11 +1073,10 @@ static void de21041_media_timer (unsigned long data)
>  		if (!netif_carrier_ok(dev))
>  			de_link_up(de);
>  		else
> -			if (netif_msg_timer(de))
> -				dev_info(&dev->dev,
> -					 "%s link ok, mode %x status %x\n",
> -					 media_name[de->media_type],
> -					 dr32(MacMode), status);
> +			netif_info(de, timer, dev,
> +				   "%s link ok, mode %x status %x\n",
> +				   media_name[de->media_type],
> +				   dr32(MacMode), status);
>  		return;
>  	}
>  
> @@ -1163,9 +1150,8 @@ no_link_yet:
>  	de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
>  	add_timer(&de->media_timer);
>  
> -	if (netif_msg_timer(de))
> -		dev_info(&dev->dev, "no link, trying media %s, status %x\n",
> -			 media_name[de->media_type], status);
> +	netif_info(de, timer, dev, "no link, trying media %s, status %x\n",
> +		   media_name[de->media_type], status);
>  }
>  
>  static void de_media_interrupt (struct de_private *de, u32 status)
> @@ -1401,14 +1387,13 @@ static int de_open (struct net_device *dev)
>  	struct de_private *de = netdev_priv(dev);
>  	int rc;
>  
> -	if (netif_msg_ifup(de))
> -		printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
> +	netif_printk(de, ifup, KERN_DEBUG, dev, "enabling interface\n");
>  
>  	de->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
>  
>  	rc = de_alloc_rings(de);
>  	if (rc) {
> -		dev_err(&dev->dev, "ring allocation failure, err=%d\n", rc);
> +		netdev_err(dev, "ring allocation failure, err=%d\n", rc);
>  		return rc;
>  	}
>  
> @@ -1416,14 +1401,14 @@ static int de_open (struct net_device *dev)
>  
>  	rc = request_irq(dev->irq, de_interrupt, IRQF_SHARED, dev->name, dev);
>  	if (rc) {
> -		dev_err(&dev->dev, "IRQ %d request failure, err=%d\n",
> -			dev->irq, rc);
> +		netdev_err(dev, "IRQ %d request failure, err=%d\n",
> +			   dev->irq, rc);
>  		goto err_out_free;
>  	}
>  
>  	rc = de_init_hw(de);
>  	if (rc) {
> -		dev_err(&dev->dev, "h/w init failure, err=%d\n", rc);
> +		netdev_err(dev, "h/w init failure, err=%d\n", rc);
>  		goto err_out_free_irq;
>  	}
>  
> @@ -1444,8 +1429,7 @@ static int de_close (struct net_device *dev)
>  	struct de_private *de = netdev_priv(dev);
>  	unsigned long flags;
>  
> -	if (netif_msg_ifdown(de))
> -		printk(KERN_DEBUG "%s: disabling interface\n", dev->name);
> +	netif_printk(de, ifdown, KERN_DEBUG, dev, "disabling interface\n");
>  
>  	del_timer_sync(&de->media_timer);
>  
> @@ -1466,9 +1450,10 @@ static void de_tx_timeout (struct net_device *dev)
>  {
>  	struct de_private *de = netdev_priv(dev);
>  
> -	printk(KERN_DEBUG "%s: NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
> -	       dev->name, dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
> -	       de->rx_tail, de->tx_head, de->tx_tail);
> +	netdev_printk(KERN_DEBUG, dev,
> +		      "NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
> +		      dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
> +		      de->rx_tail, de->tx_head, de->tx_tail);
>  
>  	del_timer_sync(&de->media_timer);
>  
> @@ -1693,9 +1678,8 @@ static int de_nway_reset(struct net_device *dev)
>  
>  	status = dr32(SIAStatus);
>  	dw32(SIAStatus, (status & ~NWayState) | NWayRestart);
> -	if (netif_msg_link(de))
> -		dev_info(&de->dev->dev, "link nway restart, status %x,%x\n",
> -			 status, dr32(SIAStatus));
> +	netif_info(de, link, dev, "link nway restart, status %x,%x\n",
> +		   status, dr32(SIAStatus));
>  	return 0;
>  }
>  
> @@ -1740,7 +1724,8 @@ static void __devinit de21040_get_mac_address (struct de_private *de)
>  		de->dev->dev_addr[i] = value;
>  		udelay(1);
>  		if (boguscnt <= 0)
> -			pr_warning(PFX "timeout reading 21040 MAC address byte %u\n", i);
> +			pr_warn("timeout reading 21040 MAC address byte %u\n",
> +				i);
>  	}
>  }
>  
> @@ -1926,8 +1911,10 @@ static void __devinit de21041_get_srom_info (struct de_private *de)
>  					de->media[idx].csr14,
>  					de->media[idx].csr15);
>  
> -		} else if (netif_msg_probe(de))
> -			pr_cont("\n");
> +		} else {
> +			if (netif_msg_probe(de))
> +				pr_cont("\n");
> +		}
>  
>  		if (bufp > ((void *)&ee_data[DE_EEPROM_SIZE - 3]))
>  			break;
> @@ -2038,7 +2025,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
>  	/* check for invalid IRQ value */
>  	if (pdev->irq < 2) {
>  		rc = -EIO;
> -		pr_err(PFX "invalid irq (%d) for pci dev %s\n",
> +		pr_err("invalid irq (%d) for pci dev %s\n",
>  		       pdev->irq, pci_name(pdev));
>  		goto err_out_res;
>  	}
> @@ -2049,12 +2036,12 @@ static int __devinit de_init_one (struct pci_dev *pdev,
>  	pciaddr = pci_resource_start(pdev, 1);
>  	if (!pciaddr) {
>  		rc = -EIO;
> -		pr_err(PFX "no MMIO resource for pci dev %s\n", pci_name(pdev));
> +		pr_err("no MMIO resource for pci dev %s\n", pci_name(pdev));
>  		goto err_out_res;
>  	}
>  	if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) {
>  		rc = -EIO;
> -		pr_err(PFX "MMIO resource (%llx) too small on pci dev %s\n",
> +		pr_err("MMIO resource (%llx) too small on pci dev %s\n",
>  		       (unsigned long long)pci_resource_len(pdev, 1),
>  		       pci_name(pdev));
>  		goto err_out_res;
> @@ -2064,7 +2051,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
>  	regs = ioremap_nocache(pciaddr, DE_REGS_SIZE);
>  	if (!regs) {
>  		rc = -EIO;
> -		pr_err(PFX "Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n",
> +		pr_err("Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n",
>  		       (unsigned long long)pci_resource_len(pdev, 1),
>  		       pciaddr, pci_name(pdev));
>  		goto err_out_res;
> @@ -2077,7 +2064,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
>  	/* make sure hardware is not running */
>  	rc = de_reset_mac(de);
>  	if (rc) {
> -		pr_err(PFX "Cannot reset MAC, pci dev %s\n", pci_name(pdev));
> +		pr_err("Cannot reset MAC, pci dev %s\n", pci_name(pdev));
>  		goto err_out_iomap;
>  	}
>  
> @@ -2097,11 +2084,11 @@ static int __devinit de_init_one (struct pci_dev *pdev,
>  		goto err_out_iomap;
>  
>  	/* print info about board and interface just registered */
> -	dev_info(&dev->dev, "%s at 0x%lx, %pM, IRQ %d\n",
> -		 de->de21040 ? "21040" : "21041",
> -		 dev->base_addr,
> -		 dev->dev_addr,
> -		 dev->irq);
> +	netdev_info(dev, "%s at 0x%lx, %pM, IRQ %d\n",
> +		    de->de21040 ? "21040" : "21041",
> +		    dev->base_addr,
> +		    dev->dev_addr,
> +		    dev->irq);
>  
>  	pci_set_drvdata(pdev, dev);
>  
> @@ -2189,7 +2176,7 @@ static int de_resume (struct pci_dev *pdev)
>  	if (!netif_running(dev))
>  		goto out_attach;
>  	if ((retval = pci_enable_device(pdev))) {
> -		dev_err(&dev->dev, "pci_enable_device failed in resume\n");
> +		netdev_err(dev, "pci_enable_device failed in resume\n");
>  		goto out;
>  	}
>  	pci_set_master(pdev);
> diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c
> index fb07f48..96e8541 100644
> --- a/drivers/net/tulip/dmfe.c
> +++ b/drivers/net/tulip/dmfe.c
> @@ -406,7 +406,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
>  	SET_NETDEV_DEV(dev, &pdev->dev);
>  
>  	if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
> -		pr_warning("32-bit PCI DMA not available\n");
> +		pr_warn("32-bit PCI DMA not available\n");
>  		err = -ENODEV;
>  		goto err_out_free;
>  	}
> diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c
> index 296486b..fa5eee9 100644
> --- a/drivers/net/tulip/eeprom.c
> +++ b/drivers/net/tulip/eeprom.c
> @@ -222,8 +222,8 @@ subsequent_board:
>  	        /* there is no phy information, don't even try to build mtable */
>  	        if (count == 0) {
>  			if (tulip_debug > 0)
> -				pr_warning("%s: no phy info, aborting mtable build\n",
> -					   dev->name);
> +				pr_warn("%s: no phy info, aborting mtable build\n",
> +					dev->name);
>  		        return;
>  		}
>  
> diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
> index 5c01e26..f46898a 100644
> --- a/drivers/net/tulip/tulip_core.c
> +++ b/drivers/net/tulip/tulip_core.c
> @@ -12,6 +12,7 @@
>  	Please submit bugs to http://bugzilla.kernel.org/ .
>  */
>  
> +#define pr_fmt(fmt) "tulip: " fmt
>  
>  #define DRV_NAME	"tulip"
>  #ifdef CONFIG_TULIP_NAPI
> @@ -119,8 +120,6 @@ module_param(csr0, int, 0);
>  module_param_array(options, int, NULL, 0);
>  module_param_array(full_duplex, int, NULL, 0);
>  
> -#define PFX DRV_NAME ": "
> -
>  #ifdef TULIP_DEBUG
>  int tulip_debug = TULIP_DEBUG;
>  #else
> @@ -1340,13 +1339,13 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
>  	 */
>  
>          if (pdev->subsystem_vendor == PCI_VENDOR_ID_LMC) {
> -		pr_err(PFX "skipping LMC card\n");
> +		pr_err("skipping LMC card\n");
>  		return -ENODEV;
>  	} else if (pdev->subsystem_vendor == PCI_VENDOR_ID_SBE &&
>  		   (pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_T3E3 ||
>  		    pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P0 ||
>  		    pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P1)) {
> -		pr_err(PFX "skipping SBE T3E3 port\n");
> +		pr_err("skipping SBE T3E3 port\n");
>  		return -ENODEV;
>  	}
>  
> @@ -1362,13 +1361,13 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
>  
>  		if (pdev->vendor == 0x1282 && pdev->device == 0x9100 &&
>  		    pdev->revision < 0x30) {
> -			pr_info(PFX "skipping early DM9100 with Crc bug (use dmfe)\n");
> +			pr_info("skipping early DM9100 with Crc bug (use dmfe)\n");
>  			return -ENODEV;
>  		}
>  
>  		dp = pci_device_to_OF_node(pdev);
>  		if (!(dp && of_get_property(dp, "local-mac-address", NULL))) {
> -			pr_info(PFX "skipping DM910x expansion card (use dmfe)\n");
> +			pr_info("skipping DM910x expansion card (use dmfe)\n");
>  			return -ENODEV;
>  		}
>  	}
> @@ -1415,16 +1414,14 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
>  
>  	i = pci_enable_device(pdev);
>  	if (i) {
> -		pr_err(PFX "Cannot enable tulip board #%d, aborting\n",
> -		       board_idx);
> +		pr_err("Cannot enable tulip board #%d, aborting\n", board_idx);
>  		return i;
>  	}
>  
>  	/* The chip will fail to enter a low-power state later unless
>  	 * first explicitly commanded into D0 */
>  	if (pci_set_power_state(pdev, PCI_D0)) {
> -		printk (KERN_NOTICE PFX
> -			"Failed to set power state to D0\n");
> +		pr_notice("Failed to set power state to D0\n");
>  	}
>  
>  	irq = pdev->irq;
> @@ -1432,13 +1429,13 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
>  	/* alloc_etherdev ensures aligned and zeroed private structures */
>  	dev = alloc_etherdev (sizeof (*tp));
>  	if (!dev) {
> -		pr_err(PFX "ether device alloc failed, aborting\n");
> +		pr_err("ether device alloc failed, aborting\n");
>  		return -ENOMEM;
>  	}
>  
>  	SET_NETDEV_DEV(dev, &pdev->dev);
>  	if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) {
> -		pr_err(PFX "%s: I/O region (0x%llx@0x%llx) too small, aborting\n",
> +		pr_err("%s: I/O region (0x%llx@0x%llx) too small, aborting\n",
>  		       pci_name(pdev),
>  		       (unsigned long long)pci_resource_len (pdev, 0),
>  		       (unsigned long long)pci_resource_start (pdev, 0));
> @@ -1905,12 +1902,12 @@ static int tulip_resume(struct pci_dev *pdev)
>  		return 0;
>  
>  	if ((retval = pci_enable_device(pdev))) {
> -		pr_err(PFX "pci_enable_device failed in resume\n");
> +		pr_err("pci_enable_device failed in resume\n");
>  		return retval;
>  	}
>  
>  	if ((retval = request_irq(dev->irq, tulip_interrupt, IRQF_SHARED, dev->name, dev))) {
> -		pr_err(PFX "request_irq failed in resume\n");
> +		pr_err("request_irq failed in resume\n");
>  		return retval;
>  	}
>  
> diff --git a/drivers/net/tulip/uli526x.c b/drivers/net/tulip/uli526x.c
> index a4375c4..92c00ee 100644
> --- a/drivers/net/tulip/uli526x.c
> +++ b/drivers/net/tulip/uli526x.c
> @@ -292,7 +292,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
>  	SET_NETDEV_DEV(dev, &pdev->dev);
>  
>  	if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
> -		pr_warning("32-bit PCI DMA not available\n");
> +		pr_warn("32-bit PCI DMA not available\n");
>  		err = -ENODEV;
>  		goto err_out_free;
>  	}
> @@ -390,9 +390,9 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
>  	if (err)
>  		goto err_out_res;
>  
> -	dev_info(&dev->dev, "ULi M%04lx at pci%s, %pM, irq %d\n",
> -		 ent->driver_data >> 16, pci_name(pdev),
> -		 dev->dev_addr, dev->irq);
> +	netdev_info(dev, "ULi M%04lx at pci%s, %pM, irq %d\n",
> +		    ent->driver_data >> 16, pci_name(pdev),
> +		    dev->dev_addr, dev->irq);
>  
>  	pci_set_master(pdev);
>  
> @@ -524,7 +524,7 @@ static void uli526x_init(struct net_device *dev)
>  		}
>  	}
>  	if(phy_tmp == 32)
> -		pr_warning("Can not find the phy address!!!");
> +		pr_warn("Can not find the phy address!!!\n");
>  	/* Parser SROM and media mode */
>  	db->media_mode = uli526x_media_mode;
>  
> @@ -590,7 +590,7 @@ static netdev_tx_t uli526x_start_xmit(struct sk_buff *skb,
>  
>  	/* Too large packet check */
>  	if (skb->len > MAX_PACKET_SIZE) {
> -		pr_err("big packet = %d\n", (u16)skb->len);
> +		netdev_err(dev, "big packet = %d\n", (u16)skb->len);
>  		dev_kfree_skb(skb);
>  		return NETDEV_TX_OK;
>  	}
> @@ -600,7 +600,7 @@ static netdev_tx_t uli526x_start_xmit(struct sk_buff *skb,
>  	/* No Tx resource check, it never happen nromally */
>  	if (db->tx_packet_cnt >= TX_FREE_DESC_CNT) {
>  		spin_unlock_irqrestore(&db->lock, flags);
> -		pr_err("No Tx resource %ld\n", db->tx_packet_cnt);
> +		netdev_err(dev, "No Tx resource %ld\n", db->tx_packet_cnt);
>  		return NETDEV_TX_BUSY;
>  	}
>  
> @@ -1024,7 +1024,6 @@ static void uli526x_timer(unsigned long data)
>  	struct net_device *dev = (struct net_device *) data;
>  	struct uli526x_board_info *db = netdev_priv(dev);
>   	unsigned long flags;
> -	u8 TmpSpeed=10;
>  
>  	//ULI526X_DBUG(0, "uli526x_timer()", 0);
>  	spin_lock_irqsave(&db->lock, flags);
> @@ -1070,7 +1069,7 @@ static void uli526x_timer(unsigned long data)
>  		/* Link Failed */
>  		ULI526X_DBUG(0, "Link Failed", tmp_cr12);
>  		netif_carrier_off(dev);
> -		pr_info("%s NIC Link is Down\n",dev->name);
> +		netdev_info(dev, "NIC Link is Down\n");
>  		db->link_failed = 1;
>  
>  		/* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */
> @@ -1096,18 +1095,13 @@ static void uli526x_timer(unsigned long data)
>  
>  			if(db->link_failed==0)
>  			{
> -				if(db->op_mode==ULI526X_100MHF || db->op_mode==ULI526X_100MFD)
> -				{
> -					TmpSpeed = 100;
> -				}
> -				if(db->op_mode==ULI526X_10MFD || db->op_mode==ULI526X_100MFD)
> -				{
> -					pr_info("%s NIC Link is Up %d Mbps Full duplex\n",dev->name,TmpSpeed);
> -				}
> -				else
> -				{
> -					pr_info("%s NIC Link is Up %d Mbps Half duplex\n",dev->name,TmpSpeed);
> -				}
> +				netdev_info(dev, "NIC Link is Up %d Mbps %s duplex\n",
> +					    (db->op_mode == ULI526X_100MHF ||
> +					     db->op_mode == ULI526X_100MFD)
> +					    ? 100 : 10,
> +					    (db->op_mode == ULI526X_10MFD ||
> +					     db->op_mode == ULI526X_100MFD)
> +					    ? "Full" : "Half");
>  				netif_carrier_on(dev);
>  			}
>  			/* SHOW_MEDIA_TYPE(db->op_mode); */
> @@ -1116,7 +1110,7 @@ static void uli526x_timer(unsigned long data)
>  		{
>  			if(db->init==1)
>  			{
> -				pr_info("%s NIC Link is Down\n",dev->name);
> +				netdev_info(dev, "NIC Link is Down\n");
>  				netif_carrier_off(dev);
>  			}
>  		}
> @@ -1242,7 +1236,7 @@ static int uli526x_resume(struct pci_dev *pdev)
>  
>  	err = pci_set_power_state(pdev, PCI_D0);
>  	if (err) {
> -		dev_warn(&dev->dev, "Could not put device into D0\n");
> +		netdev_warn(dev, "Could not put device into D0\n");
>  		return err;
>  	}
>  
> @@ -1443,7 +1437,7 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
>  		update_cr6(db->cr6_data, dev->base_addr);
>  		dev->trans_start = jiffies;
>  	} else
> -		pr_err("No Tx resource - Send_filter_frame!\n");
> +		netdev_err(dev, "No Tx resource - Send_filter_frame!\n");
>  }
>  
>  
> diff --git a/drivers/net/tulip/winbond-840.c b/drivers/net/tulip/winbond-840.c
> index f0b2310..939c96e 100644
> --- a/drivers/net/tulip/winbond-840.c
> +++ b/drivers/net/tulip/winbond-840.c
> @@ -44,6 +44,8 @@
>  	* Wake-On-LAN
>  */
>  
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
>  #define DRV_NAME	"winbond-840"
>  #define DRV_VERSION	"1.01-e"
>  #define DRV_RELDATE	"Sep-11-2006"
> @@ -375,8 +377,8 @@ static int __devinit w840_probe1 (struct pci_dev *pdev,
>  	irq = pdev->irq;
>  
>  	if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
> -		pr_warning("Winbond-840: Device %s disabled due to DMA limitations\n",
> -			   pci_name(pdev));
> +		pr_warn("Device %s disabled due to DMA limitations\n",
> +			pci_name(pdev));
>  		return -EIO;
>  	}
>  	dev = alloc_etherdev(sizeof(*np));
> diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
> index 4436865..abfe2e3 100644
> --- a/drivers/net/tulip/xircom_cb.c
> +++ b/drivers/net/tulip/xircom_cb.c
> @@ -272,8 +272,8 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
>  		goto reg_fail;
>  	}
>  
> -	dev_info(&dev->dev, "Xircom cardbus revision %i at irq %i\n",
> -		 pdev->revision, pdev->irq);
> +	netdev_info(dev, "Xircom cardbus revision %i at irq %i\n",
> +		    pdev->revision, pdev->irq);
>  	/* start the transmitter to get a heartbeat */
>  	/* TODO: send 2 dummy packets here */
>  	transceiver_voodoo(private);
> @@ -350,7 +350,7 @@ static irqreturn_t xircom_interrupt(int irq, void *dev_instance)
>  		int newlink;
>  		printk(KERN_DEBUG "xircom_cb: Link status has changed\n");
>  		newlink = link_status(card);
> -		dev_info(&dev->dev, "Link is %i mbit\n", newlink);
> +		netdev_info(dev, "Link is %d mbit\n", newlink);
>  		if (newlink)
>  			netif_carrier_on(dev);
>  		else
> @@ -447,8 +447,8 @@ static int xircom_open(struct net_device *dev)
>  	struct xircom_private *xp = netdev_priv(dev);
>  	int retval;
>  	func_enter();
> -	pr_info("xircom cardbus adaptor found, registering as %s, using irq %i\n",
> -		dev->name, dev->irq);
> +	netdev_info(dev, "xircom cardbus adaptor found, using irq %i\n",
> +		    dev->irq);
>  	retval = request_irq(dev->irq, xircom_interrupt, IRQF_SHARED, dev->name, dev);
>  	if (retval) {
>  		func_exit();
> @@ -761,7 +761,7 @@ static void activate_receiver(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Receiver failed to deactivate\n");
> +			netdev_err(card->dev, "Receiver failed to deactivate\n");
>  	}
>  
>  	/* enable the receiver */
> @@ -778,7 +778,8 @@ static void activate_receiver(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Receiver failed to re-activate\n");
> +			netdev_err(card->dev,
> +				   "Receiver failed to re-activate\n");
>  	}
>  
>  	func_exit();
> @@ -809,7 +810,7 @@ static void deactivate_receiver(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Receiver failed to deactivate\n");
> +			netdev_err(card->dev, "Receiver failed to deactivate\n");
>  	}
>  
>  
> @@ -852,7 +853,8 @@ static void activate_transmitter(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Transmitter failed to deactivate\n");
> +			netdev_err(card->dev,
> +				   "Transmitter failed to deactivate\n");
>  	}
>  
>  	/* enable the transmitter */
> @@ -869,7 +871,8 @@ static void activate_transmitter(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Transmitter failed to re-activate\n");
> +			netdev_err(card->dev,
> +				   "Transmitter failed to re-activate\n");
>  	}
>  
>  	func_exit();
> @@ -900,7 +903,8 @@ static void deactivate_transmitter(struct xircom_private *card)
>  		udelay(50);
>  		counter--;
>  		if (counter <= 0)
> -			pr_err("Transmitter failed to deactivate\n");
> +			netdev_err(card->dev,
> +				   "Transmitter failed to deactivate\n");
>  	}
>  
>  
> @@ -1160,80 +1164,86 @@ static void xircom_up(struct xircom_private *card)
>  }
>  
>  /* Bufferoffset is in BYTES */
> -static void investigate_read_descriptor(struct net_device *dev,struct xircom_private *card, int descnr, unsigned int bufferoffset)
> +static void
> +investigate_read_descriptor(struct net_device *dev, struct xircom_private *card,
> +			    int descnr, unsigned int bufferoffset)
>  {
> -		int status;
> +	int status;
>  
> -		func_enter();
> -		status = le32_to_cpu(card->rx_buffer[4*descnr]);
> -
> -		if ((status > 0)) {	/* packet received */
> +	func_enter();
>  
> -			/* TODO: discard error packets */
> +	status = le32_to_cpu(card->rx_buffer[4*descnr]);
> +	if (status > 0) {		/* packet received */
>  
> -			short pkt_len = ((status >> 16) & 0x7ff) - 4;	/* minus 4, we don't want the CRC */
> -			struct sk_buff *skb;
> +		/* TODO: discard error packets */
>  
> -			if (pkt_len > 1518) {
> -				pr_err("Packet length %i is bogus\n", pkt_len);
> -				pkt_len = 1518;
> -			}
> +		short pkt_len = ((status >> 16) & 0x7ff) - 4;
> +					/* minus 4, we don't want the CRC */
> +		struct sk_buff *skb;
>  
> -			skb = dev_alloc_skb(pkt_len + 2);
> -			if (skb == NULL) {
> -				dev->stats.rx_dropped++;
> -				goto out;
> -			}
> -			skb_reserve(skb, 2);
> -			skb_copy_to_linear_data(skb, (unsigned char*)&card->rx_buffer[bufferoffset / 4], pkt_len);
> -			skb_put(skb, pkt_len);
> -			skb->protocol = eth_type_trans(skb, dev);
> -			netif_rx(skb);
> -			dev->stats.rx_packets++;
> -			dev->stats.rx_bytes += pkt_len;
> -
> -		      out:
> -			/* give the buffer back to the card */
> -			card->rx_buffer[4*descnr] =  cpu_to_le32(0x80000000);
> -			trigger_receive(card);
> +		if (pkt_len > 1518) {
> +			netdev_err(dev, "Packet length %i is bogus\n", pkt_len);
> +			pkt_len = 1518;
>  		}
>  
> -		func_exit();
> +		skb = dev_alloc_skb(pkt_len + 2);
> +		if (skb == NULL) {
> +			dev->stats.rx_dropped++;
> +			goto out;
> +		}
> +		skb_reserve(skb, 2);
> +		skb_copy_to_linear_data(skb,
> +					&card->rx_buffer[bufferoffset / 4],
> +					pkt_len);
> +		skb_put(skb, pkt_len);
> +		skb->protocol = eth_type_trans(skb, dev);
> +		netif_rx(skb);
> +		dev->stats.rx_packets++;
> +		dev->stats.rx_bytes += pkt_len;
> +
> +out:
> +		/* give the buffer back to the card */
> +		card->rx_buffer[4*descnr] =  cpu_to_le32(0x80000000);
> +		trigger_receive(card);
> +	}
>  
> +	func_exit();
>  }
>  
>  
>  /* Bufferoffset is in BYTES */
> -static void investigate_write_descriptor(struct net_device *dev, struct xircom_private *card, int descnr, unsigned int bufferoffset)
> +static void
> +investigate_write_descriptor(struct net_device *dev,
> +			     struct xircom_private *card,
> +			     int descnr, unsigned int bufferoffset)
>  {
> -		int status;
> +	int status;
>  
> -		func_enter();
> +	func_enter();
>  
> -		status = le32_to_cpu(card->tx_buffer[4*descnr]);
> +	status = le32_to_cpu(card->tx_buffer[4*descnr]);
>  #if 0
> -		if (status & 0x8000) {	/* Major error */
> -			pr_err("Major transmit error status %x\n", status);
> -			card->tx_buffer[4*descnr] = 0;
> -			netif_wake_queue (dev);
> -		}
> +	if (status & 0x8000) {	/* Major error */
> +		netdev_err(dev, "Major transmit error status %x\n", status);
> +		card->tx_buffer[4*descnr] = 0;
> +		netif_wake_queue(dev);
> +	}
>  #endif
> -		if (status > 0) {	/* bit 31 is 0 when done */
> -			if (card->tx_skb[descnr]!=NULL) {
> -				dev->stats.tx_bytes += card->tx_skb[descnr]->len;
> -				dev_kfree_skb_irq(card->tx_skb[descnr]);
> -			}
> -			card->tx_skb[descnr] = NULL;
> -			/* Bit 8 in the status field is 1 if there was a collision */
> -			if (status&(1<<8))
> -				dev->stats.collisions++;
> -			card->tx_buffer[4*descnr] = 0; /* descriptor is free again */
> -			netif_wake_queue (dev);
> -			dev->stats.tx_packets++;
> +	if (status > 0) {	/* bit 31 is 0 when done */
> +		if (card->tx_skb[descnr] != NULL) {
> +			dev->stats.tx_bytes += card->tx_skb[descnr]->len;
> +			dev_kfree_skb_irq(card->tx_skb[descnr]);
>  		}
> +		card->tx_skb[descnr] = NULL;
> +		/* Bit 8 in the status field is 1 if there was a collision */
> +		if (status&(1<<8))
> +			dev->stats.collisions++;
> +		card->tx_buffer[4*descnr] = 0; /* descriptor is free again */
> +		netif_wake_queue(dev);
> +		dev->stats.tx_packets++;
> +	}
>  
> -		func_exit();
> -
> +	func_exit();
>  }
>  
>  
> -- 
> 1.7.5.rc3.dirty

^ permalink raw reply

* Re: [PATCH net-next 1/4] tulip: xircom_cb: Convert #ifdef DEBUG blocks and enter/leave uses
From: Grant Grundler @ 2011-05-12  3:36 UTC (permalink / raw)
  To: Joe Perches; +Cc: netdev, linux-kernel
In-Reply-To: <aae1da5aca13af94b621ffe64634435c26c88465.1304733889.git.joe@perches.com>

On Fri, May 06, 2011 at 07:08:42PM -0700, Joe Perches wrote:
> Change the blocks that are guarded by #if DEBUG to
> be #if defined DEBUG && DEBUG > 1 so that pr_debug
> can be used later.
> 
> Rename enter/leave macros to func_enter and func_exit.
> 
> Signed-off-by: Joe Perches <joe@perches.com>

Good cleanups. :)

Acked-by: Grant Grundler <grundler@parisc-linux.org>

thanks!
grant

> ---
>  drivers/net/tulip/xircom_cb.c |  152 ++++++++++++++++++++--------------------
>  1 files changed, 76 insertions(+), 76 deletions(-)
> 
> diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
> index 5a73752..4436865 100644
> --- a/drivers/net/tulip/xircom_cb.c
> +++ b/drivers/net/tulip/xircom_cb.c
> @@ -37,12 +37,12 @@
>  #include <asm/irq.h>
>  #endif
>  
> -#ifdef DEBUG
> -#define enter(x)   printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__)
> -#define leave(x)   printk("Leave: %s, %s line %i\n",x,__FILE__,__LINE__)
> +#if defined DEBUG && DEBUG > 1
> +#define func_enter(x)	pr_debug("Enter: %s\n", __func__)
> +#define func_exit(x)	pr_debug("Exit: %s\n", __func__)
>  #else
> -#define enter(x)   do {} while (0)
> -#define leave(x)   do {} while (0)
> +#define func_enter(x)	no_printk(KERN_DEBUG "Enter: %s\n", __func__)
> +#define func_exit(x)	no_printk(KERN_DEBUG "Exit: %s\n", __func__)
>  #endif
>  
>  
> @@ -161,7 +161,7 @@ static struct pci_driver xircom_ops = {
>  };
>  
>  
> -#ifdef DEBUG
> +#if defined DEBUG && DEBUG > 1
>  static void print_binary(unsigned int number)
>  {
>  	int i,i2;
> @@ -176,7 +176,7 @@ static void print_binary(unsigned int number)
>  		if ((i&3)==0)
>  			buffer[i2++]=' ';
>  	}
> -	printk("%s\n",buffer);
> +	pr_debug("%s\n",buffer);
>  }
>  #endif
>  
> @@ -205,7 +205,7 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
>  	struct xircom_private *private;
>  	unsigned long flags;
>  	unsigned short tmp16;
> -	enter("xircom_probe");
> +	func_enter();
>  
>  	/* First do the PCI initialisation */
>  
> @@ -285,7 +285,7 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
>  
>  	trigger_receive(private);
>  
> -	leave("xircom_probe");
> +	func_exit();
>  	return 0;
>  
>  reg_fail:
> @@ -310,7 +310,7 @@ static void __devexit xircom_remove(struct pci_dev *pdev)
>  	struct net_device *dev = pci_get_drvdata(pdev);
>  	struct xircom_private *card = netdev_priv(dev);
>  
> -	enter("xircom_remove");
> +	func_enter();
>  	pci_free_consistent(pdev,8192,card->rx_buffer,card->rx_dma_handle);
>  	pci_free_consistent(pdev,8192,card->tx_buffer,card->tx_dma_handle);
>  
> @@ -318,7 +318,7 @@ static void __devexit xircom_remove(struct pci_dev *pdev)
>  	unregister_netdev(dev);
>  	free_netdev(dev);
>  	pci_set_drvdata(pdev, NULL);
> -	leave("xircom_remove");
> +	func_exit();
>  }
>  
>  static irqreturn_t xircom_interrupt(int irq, void *dev_instance)
> @@ -328,17 +328,17 @@ static irqreturn_t xircom_interrupt(int irq, void *dev_instance)
>  	unsigned int status;
>  	int i;
>  
> -	enter("xircom_interrupt\n");
> +	func_enter();
>  
>  	spin_lock(&card->lock);
>  	status = inl(card->io_port+CSR5);
>  
> -#ifdef DEBUG
> +#if defined DEBUG && DEBUG > 1
>  	print_binary(status);
> -	printk("tx status 0x%08x 0x%08x\n",
> -	       card->tx_buffer[0], card->tx_buffer[4]);
> -	printk("rx status 0x%08x 0x%08x\n",
> -	       card->rx_buffer[0], card->rx_buffer[4]);
> +	pr_debug("tx status 0x%08x 0x%08x\n",
> +		 card->tx_buffer[0], card->tx_buffer[4]);
> +	pr_debug("rx status 0x%08x 0x%08x\n",
> +		 card->rx_buffer[0], card->rx_buffer[4]);
>  #endif
>  	/* Handle shared irq and hotplug */
>  	if (status == 0 || status == 0xffffffff) {
> @@ -371,7 +371,7 @@ static irqreturn_t xircom_interrupt(int irq, void *dev_instance)
>  
>  
>  	spin_unlock(&card->lock);
> -	leave("xircom_interrupt");
> +	func_exit();
>  	return IRQ_HANDLED;
>  }
>  
> @@ -382,7 +382,7 @@ static netdev_tx_t xircom_start_xmit(struct sk_buff *skb,
>  	unsigned long flags;
>  	int nextdescriptor;
>  	int desc;
> -	enter("xircom_start_xmit");
> +	func_enter();
>  
>  	card = netdev_priv(dev);
>  	spin_lock_irqsave(&card->lock,flags);
> @@ -424,7 +424,7 @@ static netdev_tx_t xircom_start_xmit(struct sk_buff *skb,
>  				netif_stop_queue(dev);
>  			}
>  			card->transmit_used = nextdescriptor;
> -			leave("xircom-start_xmit - sent");
> +			func_exit();
>  			spin_unlock_irqrestore(&card->lock,flags);
>  			return NETDEV_TX_OK;
>  	}
> @@ -446,18 +446,18 @@ static int xircom_open(struct net_device *dev)
>  {
>  	struct xircom_private *xp = netdev_priv(dev);
>  	int retval;
> -	enter("xircom_open");
> +	func_enter();
>  	pr_info("xircom cardbus adaptor found, registering as %s, using irq %i\n",
>  		dev->name, dev->irq);
>  	retval = request_irq(dev->irq, xircom_interrupt, IRQF_SHARED, dev->name, dev);
>  	if (retval) {
> -		leave("xircom_open - No IRQ");
> +		func_exit();
>  		return retval;
>  	}
>  
>  	xircom_up(xp);
>  	xp->open = 1;
> -	leave("xircom_open");
> +	func_exit();
>  	return 0;
>  }
>  
> @@ -466,7 +466,7 @@ static int xircom_close(struct net_device *dev)
>  	struct xircom_private *card;
>  	unsigned long flags;
>  
> -	enter("xircom_close");
> +	func_enter();
>  	card = netdev_priv(dev);
>  	netif_stop_queue(dev); /* we don't want new packets */
>  
> @@ -486,7 +486,7 @@ static int xircom_close(struct net_device *dev)
>  	card->open = 0;
>  	free_irq(dev->irq,dev);
>  
> -	leave("xircom_close");
> +	func_exit();
>  
>  	return 0;
>  
> @@ -507,7 +507,7 @@ static void initialize_card(struct xircom_private *card)
>  {
>  	unsigned int val;
>  	unsigned long flags;
> -	enter("initialize_card");
> +	func_enter();
>  
>  
>  	spin_lock_irqsave(&card->lock, flags);
> @@ -535,7 +535,7 @@ static void initialize_card(struct xircom_private *card)
>  
>  	spin_unlock_irqrestore(&card->lock, flags);
>  
> -	leave("initialize_card");
> +	func_exit();
>  }
>  
>  /*
> @@ -547,12 +547,12 @@ ignored; I chose zero.
>  static void trigger_transmit(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("trigger_transmit");
> +	func_enter();
>  
>  	val = 0;
>  	outl(val, card->io_port + CSR1);
>  
> -	leave("trigger_transmit");
> +	func_exit();
>  }
>  
>  /*
> @@ -565,12 +565,12 @@ ignored; I chose zero.
>  static void trigger_receive(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("trigger_receive");
> +	func_enter();
>  
>  	val = 0;
>  	outl(val, card->io_port + CSR2);
>  
> -	leave("trigger_receive");
> +	func_exit();
>  }
>  
>  /*
> @@ -581,7 +581,7 @@ static void setup_descriptors(struct xircom_private *card)
>  {
>  	u32 address;
>  	int i;
> -	enter("setup_descriptors");
> +	func_enter();
>  
>  
>  	BUG_ON(card->rx_buffer == NULL);
> @@ -637,7 +637,7 @@ static void setup_descriptors(struct xircom_private *card)
>  	address = card->tx_dma_handle;
>  	outl(address, card->io_port + CSR4);	/* xmit descr list address */
>  
> -	leave("setup_descriptors");
> +	func_exit();
>  }
>  
>  /*
> @@ -647,13 +647,13 @@ valid by setting the address in the card to 0x00.
>  static void remove_descriptors(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("remove_descriptors");
> +	func_enter();
>  
>  	val = 0;
>  	outl(val, card->io_port + CSR3);	/* Receive descriptor address */
>  	outl(val, card->io_port + CSR4);	/* Send descriptor address */
>  
> -	leave("remove_descriptors");
> +	func_exit();
>  }
>  
>  /*
> @@ -665,12 +665,12 @@ This function also clears the status-bit.
>  static int link_status_changed(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("link_status_changed");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR5);	/* Status register */
>  
>  	if ((val & (1 << 27)) == 0) {	/* no change */
> -		leave("link_status_changed - nochange");
> +		func_exit();
>  		return 0;
>  	}
>  
> @@ -679,7 +679,7 @@ static int link_status_changed(struct xircom_private *card)
>  	val = (1 << 27);
>  	outl(val, card->io_port + CSR5);
>  
> -	leave("link_status_changed - changed");
> +	func_exit();
>  	return 1;
>  }
>  
> @@ -691,16 +691,16 @@ in a non-stopped state.
>  static int transmit_active(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("transmit_active");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR5);	/* Status register */
>  
>  	if ((val & (7 << 20)) == 0) {	/* transmitter disabled */
> -		leave("transmit_active - inactive");
> +		func_exit();
>  		return 0;
>  	}
>  
> -	leave("transmit_active - active");
> +	func_exit();
>  	return 1;
>  }
>  
> @@ -711,17 +711,17 @@ in a non-stopped state.
>  static int receive_active(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("receive_active");
> +	func_enter();
>  
>  
>  	val = inl(card->io_port + CSR5);	/* Status register */
>  
>  	if ((val & (7 << 17)) == 0) {	/* receiver disabled */
> -		leave("receive_active - inactive");
> +		func_exit();
>  		return 0;
>  	}
>  
> -	leave("receive_active - active");
> +	func_exit();
>  	return 1;
>  }
>  
> @@ -739,7 +739,7 @@ static void activate_receiver(struct xircom_private *card)
>  {
>  	unsigned int val;
>  	int counter;
> -	enter("activate_receiver");
> +	func_enter();
>  
>  
>  	val = inl(card->io_port + CSR6);	/* Operation mode */
> @@ -781,7 +781,7 @@ static void activate_receiver(struct xircom_private *card)
>  			pr_err("Receiver failed to re-activate\n");
>  	}
>  
> -	leave("activate_receiver");
> +	func_exit();
>  }
>  
>  /*
> @@ -795,7 +795,7 @@ static void deactivate_receiver(struct xircom_private *card)
>  {
>  	unsigned int val;
>  	int counter;
> -	enter("deactivate_receiver");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR6);	/* Operation mode */
>  	val = val & ~2;				/* disable the receiver */
> @@ -813,7 +813,7 @@ static void deactivate_receiver(struct xircom_private *card)
>  	}
>  
>  
> -	leave("deactivate_receiver");
> +	func_exit();
>  }
>  
>  
> @@ -831,7 +831,7 @@ static void activate_transmitter(struct xircom_private *card)
>  {
>  	unsigned int val;
>  	int counter;
> -	enter("activate_transmitter");
> +	func_enter();
>  
>  
>  	val = inl(card->io_port + CSR6);	/* Operation mode */
> @@ -872,7 +872,7 @@ static void activate_transmitter(struct xircom_private *card)
>  			pr_err("Transmitter failed to re-activate\n");
>  	}
>  
> -	leave("activate_transmitter");
> +	func_exit();
>  }
>  
>  /*
> @@ -886,7 +886,7 @@ static void deactivate_transmitter(struct xircom_private *card)
>  {
>  	unsigned int val;
>  	int counter;
> -	enter("deactivate_transmitter");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR6);	/* Operation mode */
>  	val = val & ~2;		/* disable the transmitter */
> @@ -904,7 +904,7 @@ static void deactivate_transmitter(struct xircom_private *card)
>  	}
>  
>  
> -	leave("deactivate_transmitter");
> +	func_exit();
>  }
>  
>  
> @@ -916,13 +916,13 @@ must be called with the lock held and interrupts disabled.
>  static void enable_transmit_interrupt(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_transmit_interrupt");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR7);	/* Interrupt enable register */
>  	val |= 1;				/* enable the transmit interrupt */
>  	outl(val, card->io_port + CSR7);
>  
> -	leave("enable_transmit_interrupt");
> +	func_exit();
>  }
>  
>  
> @@ -934,13 +934,13 @@ must be called with the lock held and interrupts disabled.
>  static void enable_receive_interrupt(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_receive_interrupt");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR7);	/* Interrupt enable register */
>  	val = val | (1 << 6);			/* enable the receive interrupt */
>  	outl(val, card->io_port + CSR7);
>  
> -	leave("enable_receive_interrupt");
> +	func_exit();
>  }
>  
>  /*
> @@ -951,13 +951,13 @@ must be called with the lock held and interrupts disabled.
>  static void enable_link_interrupt(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_link_interrupt");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR7);	/* Interrupt enable register */
>  	val = val | (1 << 27);			/* enable the link status chage interrupt */
>  	outl(val, card->io_port + CSR7);
>  
> -	leave("enable_link_interrupt");
> +	func_exit();
>  }
>  
>  
> @@ -970,12 +970,12 @@ must be called with the lock held and interrupts disabled.
>  static void disable_all_interrupts(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_all_interrupts");
> +	func_enter();
>  
>  	val = 0;				/* disable all interrupts */
>  	outl(val, card->io_port + CSR7);
>  
> -	leave("disable_all_interrupts");
> +	func_exit();
>  }
>  
>  /*
> @@ -986,7 +986,7 @@ must be called with the lock held and interrupts disabled.
>  static void enable_common_interrupts(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_link_interrupt");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR7);	/* Interrupt enable register */
>  	val |= (1<<16); /* Normal Interrupt Summary */
> @@ -999,7 +999,7 @@ static void enable_common_interrupts(struct xircom_private *card)
>  	val |= (1<<1);  /* Transmit Process Stopped */
>  	outl(val, card->io_port + CSR7);
>  
> -	leave("enable_link_interrupt");
> +	func_exit();
>  }
>  
>  /*
> @@ -1010,13 +1010,13 @@ must be called with the lock held and interrupts disabled.
>  static int enable_promisc(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("enable_promisc");
> +	func_enter();
>  
>  	val = inl(card->io_port + CSR6);
>  	val = val | (1 << 6);
>  	outl(val, card->io_port + CSR6);
>  
> -	leave("enable_promisc");
> +	func_exit();
>  	return 1;
>  }
>  
> @@ -1031,7 +1031,7 @@ Must be called in locked state with interrupts disabled
>  static int link_status(struct xircom_private *card)
>  {
>  	unsigned int val;
> -	enter("link_status");
> +	func_enter();
>  
>  	val = inb(card->io_port + CSR12);
>  
> @@ -1042,7 +1042,7 @@ static int link_status(struct xircom_private *card)
>  
>  	/* If we get here -> no link at all */
>  
> -	leave("link_status");
> +	func_exit();
>  	return 0;
>  }
>  
> @@ -1061,7 +1061,7 @@ static void read_mac_address(struct xircom_private *card)
>  	unsigned long flags;
>  	int i;
>  
> -	enter("read_mac_address");
> +	func_enter();
>  
>  	spin_lock_irqsave(&card->lock, flags);
>  
> @@ -1090,7 +1090,7 @@ static void read_mac_address(struct xircom_private *card)
>  	}
>  	spin_unlock_irqrestore(&card->lock, flags);
>  	pr_debug(" %pM\n", card->dev->dev_addr);
> -	leave("read_mac_address");
> +	func_exit();
>  }
>  
>  
> @@ -1103,7 +1103,7 @@ static void transceiver_voodoo(struct xircom_private *card)
>  {
>  	unsigned long flags;
>  
> -	enter("transceiver_voodoo");
> +	func_enter();
>  
>  	/* disable all powermanagement */
>  	pci_write_config_dword(card->pdev, PCI_POWERMGMT, 0x0000);
> @@ -1122,7 +1122,7 @@ static void transceiver_voodoo(struct xircom_private *card)
>          spin_unlock_irqrestore(&card->lock, flags);
>  
>  	netif_start_queue(card->dev);
> -	leave("transceiver_voodoo");
> +	func_exit();
>  }
>  
>  
> @@ -1131,7 +1131,7 @@ static void xircom_up(struct xircom_private *card)
>  	unsigned long flags;
>  	int i;
>  
> -	enter("xircom_up");
> +	func_enter();
>  
>  	/* disable all powermanagement */
>  	pci_write_config_dword(card->pdev, PCI_POWERMGMT, 0x0000);
> @@ -1156,7 +1156,7 @@ static void xircom_up(struct xircom_private *card)
>  	trigger_receive(card);
>  	trigger_transmit(card);
>  	netif_start_queue(card->dev);
> -	leave("xircom_up");
> +	func_exit();
>  }
>  
>  /* Bufferoffset is in BYTES */
> @@ -1164,7 +1164,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
>  {
>  		int status;
>  
> -		enter("investigate_read_descriptor");
> +		func_enter();
>  		status = le32_to_cpu(card->rx_buffer[4*descnr]);
>  
>  		if ((status > 0)) {	/* packet received */
> @@ -1198,7 +1198,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
>  			trigger_receive(card);
>  		}
>  
> -		leave("investigate_read_descriptor");
> +		func_exit();
>  
>  }
>  
> @@ -1208,7 +1208,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p
>  {
>  		int status;
>  
> -		enter("investigate_write_descriptor");
> +		func_enter();
>  
>  		status = le32_to_cpu(card->tx_buffer[4*descnr]);
>  #if 0
> @@ -1232,7 +1232,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p
>  			dev->stats.tx_packets++;
>  		}
>  
> -		leave("investigate_write_descriptor");
> +		func_exit();
>  
>  }
>  
> -- 
> 1.7.5.rc3.dirty

^ permalink raw reply

* Re: [PATCH] iproute2: use IFLA_TXQLEN when it is available
From: Eric Dumazet @ 2011-05-12  3:28 UTC (permalink / raw)
  To: Changli Gao; +Cc: shemminger, netdev, kuznet
In-Reply-To: <1305168451-14491-1-git-send-email-xiaosuo@gmail.com>

Le jeudi 12 mai 2011 à 10:47 +0800, Changli Gao a écrit :
> Use IFLA_TXQLEN when it is available, to avoid additional system calls.
> 
> Signed-off-by: Changli Gao <xiaosuo@gmail.com>
> ---
>  ip/ipaddress.c |   12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> diff --git a/ip/ipaddress.c b/ip/ipaddress.c
> index a1f78b9..59afafd 100644
> --- a/ip/ipaddress.c
> +++ b/ip/ipaddress.c
> @@ -285,8 +285,16 @@ int print_linkinfo(const struct sockaddr_nl *who,
>  	if (tb[IFLA_OPERSTATE])
>  		print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE]));
>  		
> -	if (filter.showqueue)
> -		print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME]));
> +	if (filter.showqueue) {
> +		if (tb[IFLA_TXQLEN]) {
> +			__u32 txqlen = *(__u32 *)RTA_DATA(tb[IFLA_TXQLEN]);
> +
> +			if (txqlen)
> +				fprintf(fp, "qlen %u", txqlen);
> +		} else {
> +			print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME]));
> +		}
> +	}
>  
>  	if (!filter.family || filter.family == AF_PACKET) {
>  		SPRINT_BUF(b1);

Hmm, what iproute2 version do you use ???

commit 62a5e0668e2920b7f09896abd884753255712a46
Author: Eric Dumazet <dada1@cosmosbay.com>
Date:   Fri Oct 23 06:25:53 2009 +0200

    ip: Support IFLA_TXQLEN in ip link show command
    
    We currently use an expensive ioctl() to get device txqueuelen, while
    rtnetlink gave it to us for free. This patch speeds up ip link operation
    when many devices are registered.




^ permalink raw reply

* Re: [PATCH 15/15] ehea: Remove unused tcp_end field in send WQ
From: Joe Perches @ 2011-05-12  3:12 UTC (permalink / raw)
  To: David Miller; +Cc: anton, leitao, michael, jesse, bhutchings, netdev
In-Reply-To: <20110511.230603.1390935245880337663.davem@davemloft.net>

On Wed, 2011-05-11 at 23:06 -0400, David Miller wrote:
> From: Joe Perches <joe@perches.com>
> Date: Wed, 11 May 2011 19:31:13 -0700
> > On Thu, 2011-05-12 at 10:52 +1000, Anton Blanchard wrote:
> >> plain text document attachment (ehea_22.patch)
> >> The tcp_end field is not actually used by the hardware, so there
> >> is no need to set it. 
> >> +++ linux-net/drivers/net/ehea/ehea_qmr.h	2011-05-12 07:48:06.380382084 +1000
> >> @@ -106,7 +106,7 @@ struct ehea_swqe {
> >>  	u8 immediate_data_length;
> >>  	u8 tcp_offset;
> >>  	u8 reserved2;
> >> -	u16 tcp_end;
> >> +	u16 reserved2b;
> >>  	u8 wrap_tag;
> >>  	u8 descriptors;		/* number of valid descriptors in WQE */
> >>  	u16 reserved3;
> > struct ehea_swqe isn't __packed.  Shouldn't it be?
> Please don't mark it __packed unless absolutely necessary :-)

Isn't it read from hardware.
If not, why reserve anything?


^ permalink raw reply

* Re: [PATCH] Add libertas_disablemesh module parameter to disable mesh interface
From: Dan Williams @ 2011-05-12  3:11 UTC (permalink / raw)
  To: Sascha Silbe
  Cc: linux-wireless, devel, John W. Linville, libertas-dev, netdev,
	linux-kernel
In-Reply-To: <1305118354-17337-1-git-send-email-silbe@activitycentral.com>

On Wed, 2011-05-11 at 14:52 +0200, Sascha Silbe wrote:
> This allows individual users and deployments to disable mesh support at
> runtime, i.e. without having to build and maintain a custom kernel.

Does the mesh interface somehow cause problems, even when nothing is
using it?  I'd expect that if the mesh interface was simply left alone,
there would be no need to disable it.

Dan

> Based on a patch by Paul Fox <pgf@laptop.org>.
> Signed-off-by: Sascha Silbe <silbe@activitycentral.com>
> ---
>  drivers/net/wireless/libertas/main.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
> 
> The patch is based on the OLPC 2.6.35 kernel tree, but applies cleanly to
> wireless-next.
> 
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 8445473..62069e2 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -41,6 +41,10 @@ unsigned int lbs_debug;
>  EXPORT_SYMBOL_GPL(lbs_debug);
>  module_param_named(libertas_debug, lbs_debug, int, 0644);
> 
> +unsigned int lbs_disablemesh;
> +EXPORT_SYMBOL_GPL(lbs_disablemesh);
> +module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);
> +
> 
>  /* This global structure is used to send the confirm_sleep command as
>   * fast as possible down to the firmware. */
> @@ -1086,7 +1090,10 @@ int lbs_start_card(struct lbs_private *priv)
> 
>  	lbs_update_channel(priv);
> 
> -	lbs_init_mesh(priv);
> +	if (!lbs_disablemesh)
> +		lbs_init_mesh(priv);
> +	else
> +		lbs_pr_info("%s: mesh disabled\n", dev->name);
> 
>  	/*
>  	 * While rtap isn't related to mesh, only mesh-enabled
> --
> 1.7.4.1
> 

^ permalink raw reply

* Re: [PATCH 03/15] ehea: Remove force_irq logic in napi poll routine
From: David Miller @ 2011-05-12  3:06 UTC (permalink / raw)
  To: joe; +Cc: anton, leitao, michael, jesse, bhutchings, netdev
In-Reply-To: <1305167470.6124.10.camel@Joe-Laptop>

From: Joe Perches <joe@perches.com>
Date: Wed, 11 May 2011 19:31:10 -0700

> On Thu, 2011-05-12 at 10:52 +1000, Anton Blanchard wrote:
>> commit 18604c548545 (ehea: NAPI multi queue TX/RX path for SMP) added
>> driver specific logic for exiting napi mode. I'm not sure what it was
>> trying to solve and it should be up to the network stack to decide when
>> we are done polling so remove it.
>> Signed-off-by: Anton Blanchard <anton@samba.org>
> 
>> +++ linux-net/drivers/net/ehea/ehea_main.c	2011-05-12 07:47:51.960153456 +1000
>> @@ -937,18 +936,13 @@ static int ehea_poll(struct napi_struct
> []
>> +	while ((rx != budget)) {
> 
> one level of parentheses is enough.

Agreed.

^ permalink raw reply

* Re: [PATCH 15/15] ehea: Remove unused tcp_end field in send WQ
From: David Miller @ 2011-05-12  3:06 UTC (permalink / raw)
  To: joe; +Cc: anton, leitao, michael, jesse, bhutchings, netdev
In-Reply-To: <1305167473.6124.11.camel@Joe-Laptop>

From: Joe Perches <joe@perches.com>
Date: Wed, 11 May 2011 19:31:13 -0700

> On Thu, 2011-05-12 at 10:52 +1000, Anton Blanchard wrote:
>> plain text document attachment (ehea_22.patch)
>> The tcp_end field is not actually used by the hardware, so there
>> is no need to set it. 
>> +++ linux-net/drivers/net/ehea/ehea_qmr.h	2011-05-12 07:48:06.380382084 +1000
>> @@ -106,7 +106,7 @@ struct ehea_swqe {
>>  	u8 immediate_data_length;
>>  	u8 tcp_offset;
>>  	u8 reserved2;
>> -	u16 tcp_end;
>> +	u16 reserved2b;
>>  	u8 wrap_tag;
>>  	u8 descriptors;		/* number of valid descriptors in WQE */
>>  	u16 reserved3;
> 
> struct ehea_swqe isn't __packed.  Shouldn't it be?

Please don't mark it __packed unless absolutely necessary :-)

^ permalink raw reply

* can: hardware vs. software filter
From: Kurt Van Dijck @ 2011-05-12  3:03 UTC (permalink / raw)
  To: Alan Cox
  Cc: sachi-EvXpCiN+lbve9wHmmfpqLFaTQe2KTcn/,
	davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
	Arnd Bergmann, Subhasish Ghosh, nsekhar-l0cyMroinI0, open list,
	CAN NETWORK DRIVERS, Marc Kleine-Budde, Wolfgang Grandegger,
	Netdev-u79uwXL29TY76Z2rM5mHXA, m-watkins-l0cyMroinI0,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
In-Reply-To: <20110511235652.7ccddb3b-qBU/x9rampVanCEyBjwyrvXRex20P6io@public.gmane.org>

On Wed, May 11, 2011 at 11:56:52PM +0100, Alan Cox wrote:
> > I'm not sure if reprogramming hardware filters on the fly works on evey
> > can core. The more conservative solution would be to configure the
> > filter list globally (+when the interface is down) via netlink.
> 
> For anything that isn't so braindead it ought to be done on the fly and
> behind the users back to avoid having to make app code specially aware.

> If the lists are fixed either in firmware or in software the stack needs
> to error attempts to use anything else

That is the best guarantee to let users never use this.
A tool like 'candump' should not know about any pre-configured
filter that is in place. It's the responsibility of the root user
to put proper preconfigured filters.

A lot of code would be spent to allow an application to request
software filters that fit in the preconfigured ones.
IMHO its the root users job to judge about a proper preconfigured
filter that suits the applications that run. The applications should
then be able to request any software filter they like, the root user
decided on limiting traffic.

This poses a problem in that an application may depend on these filters
for its proper operation. That exactly is the responsibility of the
root user who restricts the preconfigured filter.

Kurt

^ permalink raw reply

* Re: [PATCH 02/15] ehea: Update multiqueue support
From: Ben Hutchings @ 2011-05-12  2:57 UTC (permalink / raw)
  To: Anton Blanchard; +Cc: leitao, michael, jesse, netdev
In-Reply-To: <20110512005622.681433781@samba.org>

On Thu, 2011-05-12 at 10:52 +1000, Anton Blanchard wrote:
> The ehea driver had some multiqueue support but was missing the last
> few years of networking stack improvements:
[...]
> --- linux-net.orig/drivers/net/ehea/ehea_main.c	2011-05-12 07:47:48.840103988 +1000
> +++ linux-net/drivers/net/ehea/ehea_main.c	2011-05-12 07:47:49.640116670 +1000
> @@ -60,7 +60,7 @@ static int rq1_entries = EHEA_DEF_ENTRIE
>  static int rq2_entries = EHEA_DEF_ENTRIES_RQ2;
>  static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
>  static int sq_entries = EHEA_DEF_ENTRIES_SQ;
> -static int use_mcs;
> +static int use_mcs = 1;
>  static int use_lro;
>  static int lro_max_aggr = EHEA_LRO_MAX_AGGR;
>  static int num_tx_qps = EHEA_NUM_TX_QP;
> @@ -93,7 +93,7 @@ MODULE_PARM_DESC(rq1_entries, "Number of
>  MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue  "
>  		 "[2^x - 1], x = [6..14]. Default = "
>  		 __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
> -MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 0 ");
> +MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 1 ");
[...]

You're using NAPI whether or not there are multiple receive queues, so
this description is wrong.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.


^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox