<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Dominik Brodowski &lt;linux@dominikbrodowski.net&gt;

Make adjust_io and adjust_memory independent of adjust_t to allow for IO
resources &gt; x86's IO_SPACE_LIMIT.

Signed-off-by: Dominik Brodowski &lt;linux@dominikbrodowski.net&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 25-akpm/drivers/pcmcia/rsrc_nonstatic.c |   89 +++++++++++++-------------------
 1 files changed, 38 insertions(+), 51 deletions(-)

diff -puN drivers/pcmcia/rsrc_nonstatic.c~pcmcia-update-resource-database-adjust-routines-to-use-unsigned-long-values drivers/pcmcia/rsrc_nonstatic.c
--- 25/drivers/pcmcia/rsrc_nonstatic.c~pcmcia-update-resource-database-adjust-routines-to-use-unsigned-long-values	2005-03-20 15:59:26.000000000 -0800
+++ 25-akpm/drivers/pcmcia/rsrc_nonstatic.c	2005-03-20 15:59:26.000000000 -0800
@@ -683,27 +683,23 @@ static struct resource * nonstatic_find_
 }
 
 
-static int adjust_memory(struct pcmcia_socket *s, adjust_t *adj)
+static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
 {
-	u_long base, num;
 	struct socket_data *data = s-&gt;resource_data;
-	int ret;
-
-	base = adj-&gt;resource.memory.Base;
-	num = adj-&gt;resource.memory.Size;
-	if ((num == 0) || (base+num-1 &lt; base))
-		return CS_BAD_SIZE;
+	unsigned long size = end - start + 1;
+	int ret = 0;
 
-	ret = CS_SUCCESS;
+	if (end &lt;= start)
+		return -EINVAL;
 
 	down(&amp;rsrc_sem);
-	switch (adj-&gt;Action) {
+	switch (action) {
 	case ADD_MANAGED_RESOURCE:
-		ret = add_interval(&amp;data-&gt;mem_db, base, num);
+		ret = add_interval(&amp;data-&gt;mem_db, start, size);
 		break;
 	case REMOVE_MANAGED_RESOURCE:
-		ret = sub_interval(&amp;data-&gt;mem_db, base, num);
-		if (ret == CS_SUCCESS) {
+		ret = sub_interval(&amp;data-&gt;mem_db, start, size);
+		if (!ret) {
 			struct pcmcia_socket *socket;
 			down_read(&amp;pcmcia_socket_list_rwsem);
 			list_for_each_entry(socket, &amp;pcmcia_socket_list, socket_list)
@@ -712,7 +708,7 @@ static int adjust_memory(struct pcmcia_s
 		}
 		break;
 	default:
-		ret = CS_UNSUPPORTED_FUNCTION;
+		ret = -EINVAL;
 	}
 	up(&amp;rsrc_sem);
 
@@ -720,36 +716,35 @@ static int adjust_memory(struct pcmcia_s
 }
 
 
-static int adjust_io(struct pcmcia_socket *s, adjust_t *adj)
+static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
 {
 	struct socket_data *data = s-&gt;resource_data;
-	kio_addr_t base, num;
-	int ret = CS_SUCCESS;
+	unsigned long size = end - start + 1;
+	int ret = 0;
+
+	if (end &lt;= start)
+		return -EINVAL;
 
-	base = adj-&gt;resource.io.BasePort;
-	num = adj-&gt;resource.io.NumPorts;
-	if ((base &lt; 0) || (base &gt; 0xffff))
-		return CS_BAD_BASE;
-	if ((num &lt;= 0) || (base+num &gt; 0x10000) || (base+num &lt;= base))
-		return CS_BAD_SIZE;
+	if (end &gt; IO_SPACE_LIMIT)
+		return -EINVAL;
 
 	down(&amp;rsrc_sem);
-	switch (adj-&gt;Action) {
+	switch (action) {
 	case ADD_MANAGED_RESOURCE:
-		if (add_interval(&amp;data-&gt;io_db, base, num) != 0) {
-			ret = CS_IN_USE;
+		if (add_interval(&amp;data-&gt;io_db, start, size) != 0) {
+			ret = -EBUSY;
 			break;
 		}
 #ifdef CONFIG_PCMCIA_PROBE
 		if (probe_io)
-			do_io_probe(s, base, num);
+			do_io_probe(s, start, size);
 #endif
 		break;
 	case REMOVE_MANAGED_RESOURCE:
-		sub_interval(&amp;data-&gt;io_db, base, num);
+		sub_interval(&amp;data-&gt;io_db, start, size);
 		break;
 	default:
-		ret = CS_UNSUPPORTED_FUNCTION;
+		ret = -EINVAL;
 		break;
 	}
 	up(&amp;rsrc_sem);
@@ -760,11 +755,15 @@ static int adjust_io(struct pcmcia_socke
 
 static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj)
 {
+	unsigned long end;
+
 	switch (adj-&gt;Resource) {
 	case RES_MEMORY_RANGE:
-		return adjust_memory(s, adj);
+		end = adj-&gt;resource.memory.Base + adj-&gt;resource.memory.Size - 1;
+		return adjust_memory(s, adj-&gt;Action, adj-&gt;resource.memory.Base, end);
 	case RES_IO_RANGE:
-		return adjust_io(s, adj);
+		end = adj-&gt;resource.io.BasePort + adj-&gt;resource.io.NumPorts - 1;
+		return adjust_io(s, adj-&gt;Action, adj-&gt;resource.io.BasePort, end);
 	}
 	return CS_UNSUPPORTED_FUNCTION;
 }
@@ -845,17 +844,16 @@ static ssize_t store_io_db(struct class_
 {
 	struct pcmcia_socket *s = class_get_devdata(class_dev);
 	unsigned long start_addr, end_addr;
-	unsigned int add = 1;
-	adjust_t adj;
+	unsigned int add = ADD_MANAGED_RESOURCE;
 	ssize_t ret = 0;
 
 	ret = sscanf (buf, "+ 0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
 	if (ret != 2) {
 		ret = sscanf (buf, "- 0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
-		add = 0;
+		add = REMOVE_MANAGED_RESOURCE;
 		if (ret != 2) {
 			ret = sscanf (buf, "0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
-			add = 1;
+			add = ADD_MANAGED_RESOURCE;
 			if (ret != 2)
 				return -EINVAL;
 		}
@@ -863,12 +861,7 @@ static ssize_t store_io_db(struct class_
 	if (end_addr &lt;= start_addr)
 		return -EINVAL;
 
-	adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE;
-	adj.Resource = RES_IO_RANGE;
-	adj.resource.io.BasePort = start_addr;
-	adj.resource.io.NumPorts = end_addr - start_addr + 1;
-
-	ret = adjust_io(s, &amp;adj);
+	ret = adjust_io(s, add, start_addr, end_addr);
 
 	return ret ? ret : count;
 }
@@ -901,17 +894,16 @@ static ssize_t store_mem_db(struct class
 {
 	struct pcmcia_socket *s = class_get_devdata(class_dev);
 	unsigned long start_addr, end_addr;
-	unsigned int add = 1;
-	adjust_t adj;
+	unsigned int add = ADD_MANAGED_RESOURCE;
 	ssize_t ret = 0;
 
 	ret = sscanf (buf, "+ 0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
 	if (ret != 2) {
 		ret = sscanf (buf, "- 0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
-		add = 0;
+		add = REMOVE_MANAGED_RESOURCE;
 		if (ret != 2) {
 			ret = sscanf (buf, "0x%lx - 0x%lx", &amp;start_addr, &amp;end_addr);
-			add = 1;
+			add = ADD_MANAGED_RESOURCE;
 			if (ret != 2)
 				return -EINVAL;
 		}
@@ -919,12 +911,7 @@ static ssize_t store_mem_db(struct class
 	if (end_addr &lt;= start_addr)
 		return -EINVAL;
 
-	adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE;
-	adj.Resource = RES_MEMORY_RANGE;
-	adj.resource.memory.Base = start_addr;
-	adj.resource.memory.Size = end_addr - start_addr + 1;
-
-	ret = adjust_memory(s, &amp;adj);
+	ret = adjust_memory(s, add, start_addr, end_addr);
 
 	return ret ? ret : count;
 }
_
</pre></body></html>