Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
b59655c4
Commit
b59655c4
authored
Oct 01, 2002
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge mandrakesoft.com:/home/jgarzik/repo/linus-2.5
into mandrakesoft.com:/home/jgarzik/repo/net-drivers-2.5
parents
4fed27d5
45ecad2e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
107 additions
and
32 deletions
+107
-32
drivers/pcmcia/cistpl.c
drivers/pcmcia/cistpl.c
+2
-2
drivers/pcmcia/cs.c
drivers/pcmcia/cs.c
+4
-4
drivers/pcmcia/cs_internal.h
drivers/pcmcia/cs_internal.h
+3
-3
drivers/pcmcia/rsrc_mgr.c
drivers/pcmcia/rsrc_mgr.c
+97
-22
mm/mmap.c
mm/mmap.c
+1
-1
No files found.
drivers/pcmcia/cistpl.c
View file @
b59655c4
...
...
@@ -264,11 +264,11 @@ static int setup_cis_mem(socket_info_t *s)
(
s
->
cis_mem
.
sys_start
==
0
))
{
int
low
=
!
(
s
->
cap
.
features
&
SS_CAP_PAGE_REGS
);
vs
=
s
;
validate_mem
(
cis_readable
,
checksum_match
,
low
);
validate_mem
(
cis_readable
,
checksum_match
,
low
,
s
);
s
->
cis_mem
.
sys_start
=
0
;
vs
=
NULL
;
if
(
find_mem_region
(
&
s
->
cis_mem
.
sys_start
,
s
->
cap
.
map_size
,
s
->
cap
.
map_size
,
low
,
"card services"
))
{
s
->
cap
.
map_size
,
low
,
"card services"
,
s
))
{
printk
(
KERN_NOTICE
"cs: unable to map card memory!
\n
"
);
return
CS_OUT_OF_RESOURCE
;
}
...
...
drivers/pcmcia/cs.c
View file @
b59655c4
...
...
@@ -809,7 +809,7 @@ static int alloc_io_space(socket_info_t *s, u_int attr, ioaddr_t *base,
return
1
;
for
(
i
=
0
;
i
<
MAX_IO_WIN
;
i
++
)
{
if
(
s
->
io
[
i
].
NumPorts
==
0
)
{
if
(
find_io_region
(
base
,
num
,
align
,
name
)
==
0
)
{
if
(
find_io_region
(
base
,
num
,
align
,
name
,
s
)
==
0
)
{
s
->
io
[
i
].
Attributes
=
attr
;
s
->
io
[
i
].
BasePort
=
*
base
;
s
->
io
[
i
].
NumPorts
=
s
->
io
[
i
].
InUse
=
num
;
...
...
@@ -821,7 +821,7 @@ static int alloc_io_space(socket_info_t *s, u_int attr, ioaddr_t *base,
/* Try to extend top of window */
try
=
s
->
io
[
i
].
BasePort
+
s
->
io
[
i
].
NumPorts
;
if
((
*
base
==
0
)
||
(
*
base
==
try
))
if
(
find_io_region
(
&
try
,
num
,
0
,
name
)
==
0
)
{
if
(
find_io_region
(
&
try
,
num
,
0
,
name
,
s
)
==
0
)
{
*
base
=
try
;
s
->
io
[
i
].
NumPorts
+=
num
;
s
->
io
[
i
].
InUse
+=
num
;
...
...
@@ -830,7 +830,7 @@ static int alloc_io_space(socket_info_t *s, u_int attr, ioaddr_t *base,
/* Try to extend bottom of window */
try
=
s
->
io
[
i
].
BasePort
-
num
;
if
((
*
base
==
0
)
||
(
*
base
==
try
))
if
(
find_io_region
(
&
try
,
num
,
0
,
name
)
==
0
)
{
if
(
find_io_region
(
&
try
,
num
,
0
,
name
,
s
)
==
0
)
{
s
->
io
[
i
].
BasePort
=
*
base
=
try
;
s
->
io
[
i
].
NumPorts
+=
num
;
s
->
io
[
i
].
InUse
+=
num
;
...
...
@@ -1974,7 +1974,7 @@ int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle
find_mem_region
(
&
win
->
base
,
win
->
size
,
align
,
(
req
->
Attributes
&
WIN_MAP_BELOW_1MB
)
||
!
(
s
->
cap
.
features
&
SS_CAP_PAGE_REGS
),
(
*
handle
)
->
dev_info
))
(
*
handle
)
->
dev_info
,
s
))
return
CS_IN_USE
;
(
*
handle
)
->
state
|=
CLIENT_WIN_REQ
(
w
);
...
...
drivers/pcmcia/cs_internal.h
View file @
b59655c4
...
...
@@ -238,11 +238,11 @@ int copy_memory(memory_handle_t handle, copy_op_t *req);
/* In rsrc_mgr */
void
validate_mem
(
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
),
int
force_low
);
int
force_low
,
socket_info_t
*
s
);
int
find_io_region
(
ioaddr_t
*
base
,
ioaddr_t
num
,
ioaddr_t
align
,
char
*
name
);
char
*
name
,
socket_info_t
*
s
);
int
find_mem_region
(
u_long
*
base
,
u_long
num
,
u_long
align
,
int
force_low
,
char
*
name
);
int
force_low
,
char
*
name
,
socket_info_t
*
s
);
int
try_irq
(
u_int
Attributes
,
int
irq
,
int
specific
);
void
undo_irq
(
u_int
Attributes
,
int
irq
);
int
adjust_resource_info
(
client_handle_t
handle
,
adjust_t
*
adj
);
...
...
drivers/pcmcia/rsrc_mgr.c
View file @
b59655c4
...
...
@@ -44,6 +44,7 @@
#include <linux/ioport.h>
#include <linux/timer.h>
#include <linux/proc_fs.h>
#include <linux/pci.h>
#include <asm/irq.h>
#include <asm/io.h>
...
...
@@ -103,8 +104,82 @@ static irq_info_t irq_table[NR_IRQS] = { { 0, 0, 0 }, /* etc */ };
======================================================================*/
#define check_io_resource(b,n) check_resource(&ioport_resource, (b), (n))
#define check_mem_resource(b,n) check_resource(&iomem_resource, (b), (n))
static
struct
resource
*
resource_parent
(
unsigned
long
b
,
unsigned
long
n
,
int
flags
,
struct
pci_dev
*
dev
)
{
#ifdef CONFIG_PCI
struct
resource
res
,
*
pr
;
if
(
dev
!=
NULL
)
{
res
.
start
=
b
;
res
.
end
=
b
+
n
-
1
;
res
.
flags
=
flags
;
pr
=
pci_find_parent_resource
(
dev
,
&
res
);
if
(
pr
)
return
pr
;
}
#endif
/* CONFIG_PCI */
if
(
flags
&
IORESOURCE_MEM
)
return
&
iomem_resource
;
return
&
ioport_resource
;
}
static
inline
int
check_io_resource
(
unsigned
long
b
,
unsigned
long
n
,
struct
pci_dev
*
dev
)
{
return
check_resource
(
resource_parent
(
b
,
n
,
IORESOURCE_IO
,
dev
),
b
,
n
);
}
static
inline
int
check_mem_resource
(
unsigned
long
b
,
unsigned
long
n
,
struct
pci_dev
*
dev
)
{
return
check_resource
(
resource_parent
(
b
,
n
,
IORESOURCE_MEM
,
dev
),
b
,
n
);
}
static
struct
resource
*
make_resource
(
unsigned
long
b
,
unsigned
long
n
,
int
flags
,
char
*
name
)
{
struct
resource
*
res
=
kmalloc
(
sizeof
(
*
res
),
GFP_KERNEL
);
if
(
res
)
{
memset
(
res
,
0
,
sizeof
(
*
res
));
res
->
name
=
name
;
res
->
start
=
b
;
res
->
end
=
b
+
n
-
1
;
res
->
flags
=
flags
|
IORESOURCE_BUSY
;
}
return
res
;
}
static
int
request_io_resource
(
unsigned
long
b
,
unsigned
long
n
,
char
*
name
,
struct
pci_dev
*
dev
)
{
struct
resource
*
res
=
make_resource
(
b
,
n
,
IORESOURCE_IO
,
name
);
struct
resource
*
pr
=
resource_parent
(
b
,
n
,
IORESOURCE_IO
,
dev
);
int
err
=
-
ENOMEM
;
if
(
res
)
{
err
=
request_resource
(
pr
,
res
);
if
(
err
)
kfree
(
res
);
}
return
err
;
}
static
int
request_mem_resource
(
unsigned
long
b
,
unsigned
long
n
,
char
*
name
,
struct
pci_dev
*
dev
)
{
struct
resource
*
res
=
make_resource
(
b
,
n
,
IORESOURCE_MEM
,
name
);
struct
resource
*
pr
=
resource_parent
(
b
,
n
,
IORESOURCE_MEM
,
dev
);
int
err
=
-
ENOMEM
;
if
(
res
)
{
err
=
request_resource
(
pr
,
res
);
if
(
err
)
kfree
(
res
);
}
return
err
;
}
/*======================================================================
...
...
@@ -194,7 +269,7 @@ static void do_io_probe(ioaddr_t base, ioaddr_t num)
}
memset
(
b
,
0
,
256
);
for
(
i
=
base
,
most
=
0
;
i
<
base
+
num
;
i
+=
8
)
{
if
(
check_io_resource
(
i
,
8
))
if
(
check_io_resource
(
i
,
8
,
NULL
))
continue
;
hole
=
inb
(
i
);
for
(
j
=
1
;
j
<
8
;
j
++
)
...
...
@@ -207,7 +282,7 @@ static void do_io_probe(ioaddr_t base, ioaddr_t num)
bad
=
any
=
0
;
for
(
i
=
base
;
i
<
base
+
num
;
i
+=
8
)
{
if
(
check_io_resource
(
i
,
8
))
if
(
check_io_resource
(
i
,
8
,
NULL
))
continue
;
for
(
j
=
0
;
j
<
8
;
j
++
)
if
(
inb
(
i
+
j
)
!=
most
)
break
;
...
...
@@ -247,7 +322,8 @@ static void do_io_probe(ioaddr_t base, ioaddr_t num)
======================================================================*/
static
int
do_mem_probe
(
u_long
base
,
u_long
num
,
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
))
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
),
socket_info_t
*
s
)
{
u_long
i
,
j
,
bad
,
fail
,
step
;
...
...
@@ -258,13 +334,14 @@ static int do_mem_probe(u_long base, u_long num,
for
(
i
=
j
=
base
;
i
<
base
+
num
;
i
=
j
+
step
)
{
if
(
!
fail
)
{
for
(
j
=
i
;
j
<
base
+
num
;
j
+=
step
)
if
((
check_mem_resource
(
j
,
step
)
==
0
)
&&
is_valid
(
j
))
if
((
check_mem_resource
(
j
,
step
,
s
->
cap
.
cb_dev
)
==
0
)
&&
is_valid
(
j
))
break
;
fail
=
((
i
==
base
)
&&
(
j
==
base
+
num
));
}
if
(
fail
)
{
for
(
j
=
i
;
j
<
base
+
num
;
j
+=
2
*
step
)
if
((
check_mem_resource
(
j
,
2
*
step
)
==
0
)
&&
if
((
check_mem_resource
(
j
,
2
*
step
,
s
->
cap
.
cb_dev
)
==
0
)
&&
do_cksum
(
j
)
&&
do_cksum
(
j
+
step
))
break
;
}
...
...
@@ -283,12 +360,12 @@ static int do_mem_probe(u_long base, u_long num,
static
u_long
inv_probe
(
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
),
resource_map_t
*
m
)
resource_map_t
*
m
,
socket_info_t
*
s
)
{
u_long
ok
;
if
(
m
==
&
mem_db
)
return
0
;
ok
=
inv_probe
(
is_valid
,
do_cksum
,
m
->
next
);
ok
=
inv_probe
(
is_valid
,
do_cksum
,
m
->
next
,
s
);
if
(
ok
)
{
if
(
m
->
base
>=
0x100000
)
sub_interval
(
&
mem_db
,
m
->
base
,
m
->
num
);
...
...
@@ -296,11 +373,11 @@ static u_long inv_probe(int (*is_valid)(u_long),
}
if
(
m
->
base
<
0x100000
)
return
0
;
return
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
);
return
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
,
s
);
}
void
validate_mem
(
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
),
int
force_low
)
int
force_low
,
socket_info_t
*
s
)
{
resource_map_t
*
m
,
*
n
;
static
u_char
order
[]
=
{
0xd0
,
0xe0
,
0xc0
,
0xf0
};
...
...
@@ -310,7 +387,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
if
(
!
probe_mem
)
return
;
/* We do up to four passes through the list */
if
(
!
force_low
)
{
if
(
hi
++
||
(
inv_probe
(
is_valid
,
do_cksum
,
mem_db
.
next
)
>
0
))
if
(
hi
++
||
(
inv_probe
(
is_valid
,
do_cksum
,
mem_db
.
next
,
s
)
>
0
))
return
;
printk
(
KERN_NOTICE
"cs: warning: no high memory space "
"available!
\n
"
);
...
...
@@ -321,7 +398,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
/* Only probe < 1 MB */
if
(
m
->
base
>=
0x100000
)
continue
;
if
((
m
->
base
|
m
->
num
)
&
0xffff
)
{
ok
+=
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
);
ok
+=
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
,
s
);
continue
;
}
/* Special probe for 64K-aligned block */
...
...
@@ -331,7 +408,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
if
(
ok
>=
mem_limit
)
sub_interval
(
&
mem_db
,
b
,
0x10000
);
else
ok
+=
do_mem_probe
(
b
,
0x10000
,
is_valid
,
do_cksum
);
ok
+=
do_mem_probe
(
b
,
0x10000
,
is_valid
,
do_cksum
,
s
);
}
}
}
...
...
@@ -340,7 +417,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
#else
/* CONFIG_ISA */
void
validate_mem
(
int
(
*
is_valid
)(
u_long
),
int
(
*
do_cksum
)(
u_long
),
int
force_low
)
int
force_low
,
socket_info_t
*
s
)
{
resource_map_t
*
m
;
static
int
done
=
0
;
...
...
@@ -348,7 +425,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
if
(
!
probe_mem
||
done
++
)
return
;
for
(
m
=
mem_db
.
next
;
m
!=
&
mem_db
;
m
=
m
->
next
)
if
(
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
))
if
(
do_mem_probe
(
m
->
base
,
m
->
num
,
is_valid
,
do_cksum
,
s
))
return
;
}
...
...
@@ -368,7 +445,7 @@ void validate_mem(int (*is_valid)(u_long), int (*do_cksum)(u_long),
======================================================================*/
int
find_io_region
(
ioaddr_t
*
base
,
ioaddr_t
num
,
ioaddr_t
align
,
char
*
name
)
char
*
name
,
socket_info_t
*
s
)
{
ioaddr_t
try
;
resource_map_t
*
m
;
...
...
@@ -378,9 +455,8 @@ int find_io_region(ioaddr_t *base, ioaddr_t num, ioaddr_t align,
for
(
try
=
(
try
>=
m
->
base
)
?
try
:
try
+
align
;
(
try
>=
m
->
base
)
&&
(
try
+
num
<=
m
->
base
+
m
->
num
);
try
+=
align
)
{
if
(
check_io_resource
(
try
,
num
)
==
0
)
{
if
(
request_io_resource
(
try
,
num
,
name
,
s
->
cap
.
cb_dev
)
==
0
)
{
*
base
=
try
;
request_region
(
try
,
num
,
name
);
return
0
;
}
if
(
!
align
)
break
;
...
...
@@ -390,7 +466,7 @@ int find_io_region(ioaddr_t *base, ioaddr_t num, ioaddr_t align,
}
int
find_mem_region
(
u_long
*
base
,
u_long
num
,
u_long
align
,
int
force_low
,
char
*
name
)
int
force_low
,
char
*
name
,
socket_info_t
*
s
)
{
u_long
try
;
resource_map_t
*
m
;
...
...
@@ -403,8 +479,7 @@ int find_mem_region(u_long *base, u_long num, u_long align,
for
(
try
=
(
try
>=
m
->
base
)
?
try
:
try
+
align
;
(
try
>=
m
->
base
)
&&
(
try
+
num
<=
m
->
base
+
m
->
num
);
try
+=
align
)
{
if
(
check_mem_resource
(
try
,
num
)
==
0
)
{
request_mem_region
(
try
,
num
,
name
);
if
(
request_mem_resource
(
try
,
num
,
name
,
s
->
cap
.
cb_dev
)
==
0
)
{
*
base
=
try
;
return
0
;
}
...
...
mm/mmap.c
View file @
b59655c4
...
...
@@ -1058,7 +1058,7 @@ int split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
if
(
new_below
)
{
new
->
vm_end
=
addr
;
vma
->
vm_start
=
addr
;
vma
->
vm_pgoff
+=
((
addr
-
vma
->
vm_start
)
>>
PAGE_SHIFT
);
vma
->
vm_pgoff
+=
((
addr
-
new
->
vm_start
)
>>
PAGE_SHIFT
);
}
else
{
vma
->
vm_end
=
addr
;
new
->
vm_start
=
addr
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment