Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 3799
b: refs/heads/master
c: 2291663
h: refs/heads/master
i:
  3797: 77c5306
  3795: 24d79d6
  3791: 068a6fb
v: v3
  • Loading branch information
Dominik Brodowski authored and Linus Torvalds committed Jun 28, 2005
1 parent 762d778 commit 4141927
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 52 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5085cb26503a662a5cfdf53ce96fd606c1fbe9ba
refs/heads/master: 22916638b124e859b595099bd0c86a1e09e767fb
89 changes: 38 additions & 51 deletions trunk/drivers/pcmcia/rsrc_nonstatic.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,27 +683,23 @@ static struct resource * nonstatic_find_mem_region(u_long base, u_long num,
}


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->resource_data;
int ret;

base = adj->resource.memory.Base;
num = adj->resource.memory.Size;
if ((num == 0) || (base+num-1 < base))
return CS_BAD_SIZE;
unsigned long size = end - start + 1;
int ret = 0;

ret = CS_SUCCESS;
if (end <= start)
return -EINVAL;

down(&rsrc_sem);
switch (adj->Action) {
switch (action) {
case ADD_MANAGED_RESOURCE:
ret = add_interval(&data->mem_db, base, num);
ret = add_interval(&data->mem_db, start, size);
break;
case REMOVE_MANAGED_RESOURCE:
ret = sub_interval(&data->mem_db, base, num);
if (ret == CS_SUCCESS) {
ret = sub_interval(&data->mem_db, start, size);
if (!ret) {
struct pcmcia_socket *socket;
down_read(&pcmcia_socket_list_rwsem);
list_for_each_entry(socket, &pcmcia_socket_list, socket_list)
Expand All @@ -712,44 +708,43 @@ static int adjust_memory(struct pcmcia_socket *s, adjust_t *adj)
}
break;
default:
ret = CS_UNSUPPORTED_FUNCTION;
ret = -EINVAL;
}
up(&rsrc_sem);

return ret;
}


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->resource_data;
kio_addr_t base, num;
int ret = CS_SUCCESS;
unsigned long size = end - start + 1;
int ret = 0;

base = adj->resource.io.BasePort;
num = adj->resource.io.NumPorts;
if ((base < 0) || (base > 0xffff))
return CS_BAD_BASE;
if ((num <= 0) || (base+num > 0x10000) || (base+num <= base))
return CS_BAD_SIZE;
if (end <= start)
return -EINVAL;

if (end > IO_SPACE_LIMIT)
return -EINVAL;

down(&rsrc_sem);
switch (adj->Action) {
switch (action) {
case ADD_MANAGED_RESOURCE:
if (add_interval(&data->io_db, base, num) != 0) {
ret = CS_IN_USE;
if (add_interval(&data->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(&data->io_db, base, num);
sub_interval(&data->io_db, start, size);
break;
default:
ret = CS_UNSUPPORTED_FUNCTION;
ret = -EINVAL;
break;
}
up(&rsrc_sem);
Expand All @@ -760,11 +755,15 @@ static int adjust_io(struct pcmcia_socket *s, adjust_t *adj)

static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj)
{
unsigned long end;

switch (adj->Resource) {
case RES_MEMORY_RANGE:
return adjust_memory(s, adj);
end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
return adjust_memory(s, adj->Action, adj->resource.memory.Base, end);
case RES_IO_RANGE:
return adjust_io(s, adj);
end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
return adjust_io(s, adj->Action, adj->resource.io.BasePort, end);
}
return CS_UNSUPPORTED_FUNCTION;
}
Expand Down Expand Up @@ -845,30 +844,24 @@ static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size
{
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", &start_addr, &end_addr);
if (ret != 2) {
ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
add = 0;
add = REMOVE_MANAGED_RESOURCE;
if (ret != 2) {
ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
add = 1;
add = ADD_MANAGED_RESOURCE;
if (ret != 2)
return -EINVAL;
}
}
if (end_addr <= 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, &adj);
ret = adjust_io(s, add, start_addr, end_addr);

return ret ? ret : count;
}
Expand Down Expand Up @@ -901,30 +894,24 @@ static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, siz
{
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", &start_addr, &end_addr);
if (ret != 2) {
ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
add = 0;
add = REMOVE_MANAGED_RESOURCE;
if (ret != 2) {
ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
add = 1;
add = ADD_MANAGED_RESOURCE;
if (ret != 2)
return -EINVAL;
}
}
if (end_addr <= 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, &adj);
ret = adjust_memory(s, add, start_addr, end_addr);

return ret ? ret : count;
}
Expand Down

0 comments on commit 4141927

Please sign in to comment.