public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Aditional PnP Changes for 2.5.62
@ 2003-02-22 22:10 Adam Belay
  2003-02-22 22:10 ` Adam Belay
  0 siblings, 1 reply; 2+ messages in thread
From: Adam Belay @ 2003-02-22 22:10 UTC (permalink / raw)
  To: linux-kernel

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1023  -> 1.1024 
#	drivers/pnp/interface.c	1.11    -> 1.12   
#	drivers/pnp/manager.c	1.2     -> 1.3    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/02/22	ambx1@neo.rr.com	1.1024
# Large Stack Usage Fix
# 
# Reduces the stack memory usage in the following PnP Functions:
# pnp_printf
# pnp_set_current_resources
# pnp_manual_config_dev
# pnp_activate_dev
# --------------------------------------------
#
diff -Nru a/drivers/pnp/interface.c b/drivers/pnp/interface.c
--- a/drivers/pnp/interface.c	Sat Feb 22 22:04:59 2003
+++ b/drivers/pnp/interface.c	Sat Feb 22 22:04:59 2003
@@ -32,18 +32,16 @@
 {
 	va_list args;
 	int res;
-	char sbuffer[512];
 
 	if (buffer->stop || buffer->error)
 		return 0;
 	va_start(args, fmt);
-	res = vsprintf(sbuffer, fmt, args);
+	res = vsnprintf(buffer->curr, buffer->len - buffer->size, fmt, args);
 	va_end(args);
 	if (buffer->size + res >= buffer->len) {
 		buffer->stop = 1;
 		return 0;
 	}
-	strcpy(buffer->curr, sbuffer);
 	buffer->curr += res;
 	buffer->size += res;
 	return res;
@@ -432,13 +430,13 @@
 		goto done;
 	}
 	if (!strnicmp(buf,"set",3)) {
-		struct pnp_resource_table res;
 		int nport = 0, nmem = 0, nirq = 0, ndma = 0;
-
 		if (dev->active)
 			goto done;
 		buf += 3;
-		pnp_init_resource_table(&res);
+		spin_lock(&pnp_lock);
+		dev->config_mode = PNP_CONFIG_MANUAL;
+		pnp_init_resource_table(&dev->res);
 		while (1) {
 			while (isspace(*buf))
 				++buf;
@@ -446,17 +444,17 @@
 				buf += 2;
 				while (isspace(*buf))
 					++buf;
-				res.port_resource[nport].start = simple_strtoul(buf,&buf,0);
+				dev->res.port_resource[nport].start = simple_strtoul(buf,&buf,0);
 				while (isspace(*buf))
 					++buf;
 				if(*buf == '-') {
 					buf += 1;
 					while (isspace(*buf))
 						++buf;
-					res.port_resource[nport].end = simple_strtoul(buf,&buf,0);
+					dev->res.port_resource[nport].end = simple_strtoul(buf,&buf,0);
 				} else
-					res.port_resource[nport].end = res.port_resource[nport].start;
-				res.port_resource[nport].flags = IORESOURCE_IO;
+					dev->res.port_resource[nport].end = dev->res.port_resource[nport].start;
+				dev->res.port_resource[nport].flags = IORESOURCE_IO;
 				nport++;
 				if (nport >= PNP_MAX_PORT)
 					break;
@@ -466,17 +464,17 @@
 				buf += 3;
 				while (isspace(*buf))
 					++buf;
-				res.mem_resource[nmem].start = simple_strtoul(buf,&buf,0);
+				dev->res.mem_resource[nmem].start = simple_strtoul(buf,&buf,0);
 				while (isspace(*buf))
 					++buf;
 				if(*buf == '-') {
 					buf += 1;
 					while (isspace(*buf))
 						++buf;
-					res.mem_resource[nmem].end = simple_strtoul(buf,&buf,0);
+					dev->res.mem_resource[nmem].end = simple_strtoul(buf,&buf,0);
 				} else
-					res.mem_resource[nmem].end = res.mem_resource[nmem].start;
-				res.mem_resource[nmem].flags = IORESOURCE_MEM;
+					dev->res.mem_resource[nmem].end = dev->res.mem_resource[nmem].start;
+				dev->res.mem_resource[nmem].flags = IORESOURCE_MEM;
 				nmem++;
 				if (nmem >= PNP_MAX_MEM)
 					break;
@@ -486,9 +484,9 @@
 				buf += 3;
 				while (isspace(*buf))
 					++buf;
-				res.irq_resource[nirq].start =
-				res.irq_resource[nirq].end = simple_strtoul(buf,&buf,0);
-				res.irq_resource[nirq].flags = IORESOURCE_IRQ;
+				dev->res.irq_resource[nirq].start =
+				dev->res.irq_resource[nirq].end = simple_strtoul(buf,&buf,0);
+				dev->res.irq_resource[nirq].flags = IORESOURCE_IRQ;
 				nirq++;
 				if (nirq >= PNP_MAX_IRQ)
 					break;
@@ -498,9 +496,9 @@
 				buf += 3;
 				while (isspace(*buf))
 					++buf;
-				res.dma_resource[ndma].start =
-				res.dma_resource[ndma].end = simple_strtoul(buf,&buf,0);
-				res.dma_resource[ndma].flags = IORESOURCE_DMA;
+				dev->res.dma_resource[ndma].start =
+				dev->res.dma_resource[ndma].end = simple_strtoul(buf,&buf,0);
+				dev->res.dma_resource[ndma].flags = IORESOURCE_DMA;
 				ndma++;
 				if (ndma >= PNP_MAX_DMA)
 					break;
@@ -508,9 +506,6 @@
 			}
 			break;
 		}
-		spin_lock(&pnp_lock);
-		dev->config_mode = PNP_CONFIG_MANUAL;
-		dev->res = res;
 		spin_unlock(&pnp_lock);
 		goto done;
 	}
diff -Nru a/drivers/pnp/manager.c b/drivers/pnp/manager.c
--- a/drivers/pnp/manager.c	Sat Feb 22 22:04:59 2003
+++ b/drivers/pnp/manager.c	Sat Feb 22 22:04:59 2003
@@ -543,14 +543,18 @@
 int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table * res, int mode)
 {
 	int i;
-	struct pnp_resource_table bak = dev->res;
+	struct pnp_resource_table * bak;
 	if (!dev || !res)
 		return -EINVAL;
 	if (dev->active)
 		return -EBUSY;
+	bak = pnp_alloc(sizeof(struct pnp_resource_table));
+	if (!bak)
+		return -ENOMEM;
+	*bak = dev->res;
+
 	spin_lock(&pnp_lock);
 	dev->res = *res;
-
 	if (!(mode & PNP_CONFIG_FORCE)) {
 		for (i = 0; i < PNP_MAX_PORT; i++) {
 			if(pnp_check_port(dev,i))
@@ -569,15 +573,17 @@
 				goto fail;
 		}
 	}
+	dev->config_mode = PNP_CONFIG_MANUAL;
 	spin_unlock(&pnp_lock);
 
 	pnp_resolve_conflicts(dev);
-	dev->config_mode = PNP_CONFIG_MANUAL;
+	kfree(bak);
 	return 0;
 
 fail:
-	dev->res = bak;
+	dev->res = *bak;
 	spin_unlock(&pnp_lock);
+	kfree(bak);
 	return -EINVAL;
 }
 
@@ -625,10 +631,13 @@
 		goto fail;
 	}
 	if (pnp_can_read(dev)) {
-		struct pnp_resource_table res;
-		dev->protocol->get(dev, &res);
-		if (pnp_compare_resources(&dev->res, &res)) /* if this happens we may be in big trouble but it's best just to continue */
+		struct pnp_resource_table * res = pnp_alloc(sizeof(struct pnp_resource_table));
+		if (!res)
+			goto fail;
+		dev->protocol->get(dev, res);
+		if (pnp_compare_resources(&dev->res, res)) /* if this happens we may be in big trouble but it's best just to continue */
 			pnp_err("res: The resources requested do not match those set for the PnP device '%s'.", dev->dev.bus_id);
+		kfree(res);
 	} else
 		dev->active = pnp_is_active(dev);
 	pnp_dbg("res: the device '%s' has been activated.", dev->dev.bus_id);

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Aditional PnP Changes for 2.5.62
  2003-02-22 22:10 [PATCH] Aditional PnP Changes for 2.5.62 Adam Belay
@ 2003-02-22 22:10 ` Adam Belay
  0 siblings, 0 replies; 2+ messages in thread
From: Adam Belay @ 2003-02-22 22:10 UTC (permalink / raw)
  To: linux-kernel

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1024  -> 1.1025 
#	drivers/pnp/resource.c	1.8     -> 1.9    
#	drivers/pnp/manager.c	1.3     -> 1.4    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/02/22	ambx1@neo.rr.com	1.1025
# Resource Management Performance Fix
# 
# Fixes a typo in pnp_check_*_conflicts functions.  Without this fix the
# resource algorithm will work but will take longer to assign resources.
# 
# Also contains some minor reordering in pnp_activate_dev.
# --------------------------------------------
#
diff -Nru a/drivers/pnp/manager.c b/drivers/pnp/manager.c
--- a/drivers/pnp/manager.c	Sat Feb 22 22:04:48 2003
+++ b/drivers/pnp/manager.c	Sat Feb 22 22:04:48 2003
@@ -602,10 +602,6 @@
 		pnp_info("res: The PnP device '%s' is already active.", dev->dev.bus_id);
 		return -EBUSY;
 	}
-	spin_lock(&pnp_lock);	/* we lock just in case the device is being configured during this call */
-	dev->active = 1;
-	spin_unlock(&pnp_lock); /* once the device is claimed active we know it won't be configured so we can unlock */
-
 	/* If this condition is true, advanced configuration failed, we need to get this device up and running
 	 * so we use the simple config engine which ignores cold conflicts, this of course may lead to new failures */
 	if (!pnp_is_active(dev)) {
@@ -614,6 +610,11 @@
 			goto fail;
 		}
 	}
+
+	spin_lock(&pnp_lock);	/* we lock just in case the device is being configured during this call */
+	dev->active = 1;
+	spin_unlock(&pnp_lock); /* once the device is claimed active we know it won't be configured so we can unlock */
+
 	if (dev->config_mode & PNP_CONFIG_INVALID) {
 		pnp_info("res: Unable to activate the PnP device '%s' because its resource configuration is invalid.", dev->dev.bus_id);
 		goto fail;
diff -Nru a/drivers/pnp/resource.c b/drivers/pnp/resource.c
--- a/drivers/pnp/resource.c	Sat Feb 22 22:04:48 2003
+++ b/drivers/pnp/resource.c	Sat Feb 22 22:04:48 2003
@@ -268,7 +268,7 @@
 	/* check for cold conflicts */
 	pnp_for_each_dev(tdev) {
 		/* Is the device configurable? */
-		if (tdev == dev || (mode ? !dev->active : dev->active))
+		if (tdev == dev || (mode ? !tdev->active : tdev->active))
 			continue;
 		for (tmp = 0; tmp < PNP_MAX_PORT; tmp++) {
 			if (tdev->res.port_resource[tmp].flags & IORESOURCE_IO) {
@@ -339,7 +339,7 @@
 	/* check for cold conflicts */
 	pnp_for_each_dev(tdev) {
 		/* Is the device configurable? */
-		if (tdev == dev || (mode ? !dev->active : dev->active))
+		if (tdev == dev || (mode ? !tdev->active : tdev->active))
 			continue;
 		for (tmp = 0; tmp < PNP_MAX_MEM; tmp++) {
 			if (tdev->res.mem_resource[tmp].flags & IORESOURCE_MEM) {
@@ -408,7 +408,7 @@
 	/* check for cold conflicts */
 	pnp_for_each_dev(tdev) {
 		/* Is the device configurable? */
-		if (tdev == dev || (mode ? !dev->active : dev->active))
+		if (tdev == dev || (mode ? !tdev->active : tdev->active))
 			continue;
 		for (tmp = 0; tmp < PNP_MAX_IRQ; tmp++) {
 			if (tdev->res.irq_resource[tmp].flags & IORESOURCE_IRQ) {
@@ -490,7 +490,7 @@
 	/* check for cold conflicts */
 	pnp_for_each_dev(tdev) {
 		/* Is the device configurable? */
-		if (tdev == dev || (mode ? !dev->active : dev->active))
+		if (tdev == dev || (mode ? !tdev->active : tdev->active))
 			continue;
 		for (tmp = 0; tmp < PNP_MAX_DMA; tmp++) {
 			if (tdev->res.dma_resource[tmp].flags & IORESOURCE_DMA) {

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-02-23  3:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-22 22:10 [PATCH] Aditional PnP Changes for 2.5.62 Adam Belay
2003-02-22 22:10 ` Adam Belay

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