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
130ca59d
Commit
130ca59d
authored
Aug 03, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://gkernel.bkbits.net/misc-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
c3b26786
0b520647
Changes
14
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
938 additions
and
2430 deletions
+938
-2430
arch/sparc64/kernel/devices.c
arch/sparc64/kernel/devices.c
+6
-0
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+77
-88
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sparc64_ksyms.c
+4
-0
arch/sparc64/solaris/systbl.S
arch/sparc64/solaris/systbl.S
+2
-2
drivers/net/myri_sbus.c
drivers/net/myri_sbus.c
+8
-2
drivers/net/myri_sbus.h
drivers/net/myri_sbus.h
+1
-0
drivers/sbus/char/openprom.c
drivers/sbus/char/openprom.c
+0
-27
drivers/scsi/qlogicpti.c
drivers/scsi/qlogicpti.c
+21
-19
drivers/serial/sunsab.c
drivers/serial/sunsab.c
+767
-2213
drivers/serial/sunsab.h
drivers/serial/sunsab.h
+4
-63
drivers/serial/sunsu.c
drivers/serial/sunsu.c
+16
-5
drivers/serial/sunzilog.c
drivers/serial/sunzilog.c
+20
-9
include/asm-sparc64/ns87303.h
include/asm-sparc64/ns87303.h
+8
-2
include/linux/serial_core.h
include/linux/serial_core.h
+4
-0
No files found.
arch/sparc64/kernel/devices.c
View file @
130ca59d
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
#include <linux/init.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/ioport.h>
#include <linux/string.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <asm/page.h>
#include <asm/page.h>
#include <asm/oplib.h>
#include <asm/oplib.h>
...
@@ -17,6 +18,11 @@
...
@@ -17,6 +18,11 @@
#include <asm/smp.h>
#include <asm/smp.h>
#include <asm/spitfire.h>
#include <asm/spitfire.h>
/* Used to synchronize acceses to NatSemi SUPER I/O chip configure
* operations in asm/ns87303.h
*/
spinlock_t
ns87303_lock
=
SPIN_LOCK_UNLOCKED
;
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
]
__initdata
=
{
{
0
}
};
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
]
__initdata
=
{
{
0
}
};
unsigned
prom_cpu_nodes
[
NR_CPUS
];
unsigned
prom_cpu_nodes
[
NR_CPUS
];
int
linux_num_cpus
=
0
;
int
linux_num_cpus
=
0
;
...
...
arch/sparc64/kernel/smp.c
View file @
130ca59d
...
@@ -45,7 +45,6 @@ cpuinfo_sparc cpu_data[NR_CPUS];
...
@@ -45,7 +45,6 @@ cpuinfo_sparc cpu_data[NR_CPUS];
/* Please don't make this stuff initdata!!! --DaveM */
/* Please don't make this stuff initdata!!! --DaveM */
static
unsigned
char
boot_cpu_id
;
static
unsigned
char
boot_cpu_id
;
static
int
smp_activated
;
/* Kernel spinlock */
/* Kernel spinlock */
spinlock_t
kernel_flag
__cacheline_aligned_in_smp
=
SPIN_LOCK_UNLOCKED
;
spinlock_t
kernel_flag
__cacheline_aligned_in_smp
=
SPIN_LOCK_UNLOCKED
;
...
@@ -223,85 +222,46 @@ extern unsigned long sparc64_cpu_startup;
...
@@ -223,85 +222,46 @@ extern unsigned long sparc64_cpu_startup;
*/
*/
static
struct
thread_info
*
cpu_new_thread
=
NULL
;
static
struct
thread_info
*
cpu_new_thread
=
NULL
;
static
void
__init
smp_boot_cpus
(
unsigned
int
max_cpus
)
static
int
__devinit
smp_boot_one_cpu
(
unsigned
int
cpu
)
{
{
int
cpucount
=
0
,
i
;
printk
(
"Entering UltraSMPenguin Mode...
\n
"
);
local_irq_enable
();
smp_store_cpu_info
(
boot_cpu_id
);
if
(
linux_num_cpus
==
1
)
return
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
i
==
boot_cpu_id
)
continue
;
if
((
cpucount
+
1
)
==
max_cpus
)
goto
ignorecpu
;
if
(
test_bit
(
i
,
&
phys_cpu_present_map
))
{
unsigned
long
entry
=
unsigned
long
entry
=
(
unsigned
long
)(
&
sparc64_cpu_startup
);
(
unsigned
long
)(
&
sparc64_cpu_startup
);
unsigned
long
cookie
=
unsigned
long
cookie
=
(
unsigned
long
)(
&
cpu_new_thread
);
(
unsigned
long
)(
&
cpu_new_thread
);
struct
task_struct
*
p
;
struct
task_struct
*
p
;
int
timeout
;
int
timeout
,
no
,
ret
;
int
no
;
prom_printf
(
"Starting CPU %d... "
,
i
);
kernel_thread
(
NULL
,
NULL
,
CLONE_IDLETASK
);
kernel_thread
(
NULL
,
NULL
,
CLONE_IDLETASK
);
cpucount
++
;
p
=
prev_task
(
&
init_task
);
p
=
prev_task
(
&
init_task
);
init_idle
(
p
,
i
);
init_idle
(
p
,
cpu
);
unhash_process
(
p
);
unhash_process
(
p
);
callin_flag
=
0
;
callin_flag
=
0
;
for
(
no
=
0
;
no
<
linux_num_cpus
;
no
++
)
for
(
no
=
0
;
no
<
linux_num_cpus
;
no
++
)
if
(
linux_cpus
[
no
].
mid
==
i
)
if
(
linux_cpus
[
no
].
mid
==
cpu
)
break
;
break
;
cpu_new_thread
=
p
->
thread_info
;
cpu_new_thread
=
p
->
thread_info
;
set_bit
(
i
,
&
cpu_callout_map
);
set_bit
(
cpu
,
&
cpu_callout_map
);
prom_startcpu
(
linux_cpus
[
no
].
prom_node
,
prom_startcpu
(
linux_cpus
[
no
].
prom_node
,
entry
,
cookie
);
entry
,
cookie
);
for
(
timeout
=
0
;
timeout
<
5000000
;
timeout
++
)
{
for
(
timeout
=
0
;
timeout
<
5000000
;
timeout
++
)
{
if
(
callin_flag
)
if
(
callin_flag
)
break
;
break
;
udelay
(
100
);
udelay
(
100
);
}
}
if
(
callin_flag
)
{
if
(
callin_flag
)
{
prom_cpu_nodes
[
i
]
=
linux_cpus
[
no
].
prom_node
;
prom_cpu_nodes
[
cpu
]
=
linux_cpus
[
no
].
prom_node
;
prom_printf
(
"OK
\n
"
)
;
ret
=
0
;
}
else
{
}
else
{
cpucount
--
;
printk
(
"Processor %d is stuck.
\n
"
,
cpu
);
printk
(
"Processor %d is stuck.
\n
"
,
i
);
clear_bit
(
cpu
,
&
cpu_callout_map
);
prom_printf
(
"FAILED
\n
"
);
ret
=
-
ENODEV
;
clear_bit
(
i
,
&
cpu_callout_map
);
}
ignorecpu:
}
}
}
cpu_new_thread
=
NULL
;
cpu_new_thread
=
NULL
;
if
(
cpucount
==
0
)
{
if
(
max_cpus
!=
1
)
printk
(
"Error: only one processor found.
\n
"
);
}
else
{
unsigned
long
bogosum
=
0
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
return
ret
;
if
(
cpu_online
(
i
))
bogosum
+=
cpu_data
[
i
].
udelay_val
;
}
printk
(
"Total of %d processors activated "
"(%lu.%02lu BogoMIPS).
\n
"
,
cpucount
+
1
,
bogosum
/
(
500000
/
HZ
),
(
bogosum
/
(
5000
/
HZ
))
%
100
);
smp_activated
=
1
;
}
}
}
static
void
spitfire_xcall_helper
(
u64
data0
,
u64
data1
,
u64
data2
,
u64
pstate
,
unsigned
long
cpu
)
static
void
spitfire_xcall_helper
(
u64
data0
,
u64
data1
,
u64
data2
,
u64
pstate
,
unsigned
long
cpu
)
...
@@ -1119,8 +1079,6 @@ static void __init smp_setup_percpu_timer(void)
...
@@ -1119,8 +1079,6 @@ static void __init smp_setup_percpu_timer(void)
void
__init
smp_tick_init
(
void
)
void
__init
smp_tick_init
(
void
)
{
{
int
i
;
boot_cpu_id
=
hard_smp_processor_id
();
boot_cpu_id
=
hard_smp_processor_id
();
current_tick_offset
=
timer_tick_offset
;
current_tick_offset
=
timer_tick_offset
;
...
@@ -1129,19 +1087,10 @@ void __init smp_tick_init(void)
...
@@ -1129,19 +1087,10 @@ void __init smp_tick_init(void)
prom_halt
();
prom_halt
();
}
}
atomic_set
(
&
sparc64_num_cpus_online
,
1
);
atomic_inc
(
&
sparc64_num_cpus_online
);
memset
(
&
cpu_online_map
,
0
,
sizeof
(
cpu_online_map
));
set_bit
(
boot_cpu_id
,
&
cpu_online_map
);
set_bit
(
boot_cpu_id
,
&
cpu_online_map
);
prom_cpu_nodes
[
boot_cpu_id
]
=
linux_cpus
[
0
].
prom_node
;
prom_cpu_nodes
[
boot_cpu_id
]
=
linux_cpus
[
0
].
prom_node
;
prof_counter
(
boot_cpu_id
)
=
prof_multiplier
(
boot_cpu_id
)
=
1
;
prof_counter
(
boot_cpu_id
)
=
prof_multiplier
(
boot_cpu_id
)
=
1
;
for
(
i
=
0
;
i
<
linux_num_cpus
;
i
++
)
{
if
(
linux_cpus
[
i
].
mid
<
NR_CPUS
)
{
set_bit
(
linux_cpus
[
i
].
mid
,
&
phys_cpu_present_map
);
atomic_inc
(
&
sparc64_num_cpus_possible
);
}
}
}
}
cycles_t
cacheflush_time
;
cycles_t
cacheflush_time
;
...
@@ -1272,19 +1221,59 @@ int setup_profiling_timer(unsigned int multiplier)
...
@@ -1272,19 +1221,59 @@ int setup_profiling_timer(unsigned int multiplier)
void
__init
smp_prepare_cpus
(
unsigned
int
max_cpus
)
void
__init
smp_prepare_cpus
(
unsigned
int
max_cpus
)
{
{
smp_boot_cpus
(
max_cpus
);
int
i
;
for
(
i
=
0
;
i
<
linux_num_cpus
;
i
++
)
{
if
(
linux_cpus
[
i
].
mid
<
max_cpus
)
{
set_bit
(
linux_cpus
[
i
].
mid
,
&
phys_cpu_present_map
);
atomic_inc
(
&
sparc64_num_cpus_possible
);
}
}
if
(
atomic_read
(
&
sparc64_num_cpus_possible
)
>
max_cpus
)
{
for
(
i
=
linux_num_cpus
-
1
;
i
>=
0
;
i
--
)
{
if
(
linux_cpus
[
i
].
mid
!=
boot_cpu_id
)
{
clear_bit
(
linux_cpus
[
i
].
mid
,
&
phys_cpu_present_map
);
atomic_dec
(
&
sparc64_num_cpus_possible
);
if
(
atomic_read
(
&
sparc64_num_cpus_possible
)
<=
max_cpus
)
break
;
}
}
}
smp_store_cpu_info
(
boot_cpu_id
);
}
}
int
__devinit
__cpu_up
(
unsigned
int
cpu
)
int
__devinit
__cpu_up
(
unsigned
int
cpu
)
{
{
int
ret
=
smp_boot_one_cpu
(
cpu
);
if
(
!
ret
)
{
set_bit
(
cpu
,
&
smp_commenced_mask
);
set_bit
(
cpu
,
&
smp_commenced_mask
);
while
(
!
test_bit
(
cpu
,
&
cpu_online_map
))
while
(
!
test_bit
(
cpu
,
&
cpu_online_map
))
mb
();
mb
();
return
0
;
if
(
!
test_bit
(
cpu
,
&
cpu_online_map
))
ret
=
-
ENODEV
;
}
return
ret
;
}
}
void
__init
smp_cpus_done
(
unsigned
int
max_cpus
)
void
__init
smp_cpus_done
(
unsigned
int
max_cpus
)
{
{
unsigned
long
bogosum
=
0
;
int
i
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
cpu_online
(
i
))
bogosum
+=
cpu_data
[
i
].
udelay_val
;
}
printk
(
"Total of %d processors activated "
"(%lu.%02lu BogoMIPS).
\n
"
,
num_online_cpus
(),
bogosum
/
(
500000
/
HZ
),
(
bogosum
/
(
5000
/
HZ
))
%
100
);
/* We want to run this with all the other cpus spinning
/* We want to run this with all the other cpus spinning
* in the kernel.
* in the kernel.
*/
*/
...
...
arch/sparc64/kernel/sparc64_ksyms.c
View file @
130ca59d
...
@@ -52,6 +52,7 @@
...
@@ -52,6 +52,7 @@
#include <asm/isa.h>
#include <asm/isa.h>
#endif
#endif
#include <asm/a.out.h>
#include <asm/a.out.h>
#include <asm/ns87303.h>
struct
poll
{
struct
poll
{
int
fd
;
int
fd
;
...
@@ -373,3 +374,6 @@ EXPORT_SYMBOL(kbd_pt_regs);
...
@@ -373,3 +374,6 @@ EXPORT_SYMBOL(kbd_pt_regs);
#ifdef CONFIG_DEBUG_BUGVERBOSE
#ifdef CONFIG_DEBUG_BUGVERBOSE
EXPORT_SYMBOL
(
do_BUG
);
EXPORT_SYMBOL
(
do_BUG
);
#endif
#endif
/* for ns8703 */
EXPORT_SYMBOL
(
ns87303_lock
);
arch/sparc64/solaris/systbl.S
View file @
130ca59d
...
@@ -250,8 +250,8 @@ solaris_sys_table:
...
@@ -250,8 +250,8 @@ solaris_sys_table:
.
word
solaris_fstatvfs64
/*
fstatvfs64
dP
219
*/
.
word
solaris_fstatvfs64
/*
fstatvfs64
dP
219
*/
.
word
solaris_setrlimit64
/*
setrlimit64
dP
220
*/
.
word
solaris_setrlimit64
/*
setrlimit64
dP
220
*/
.
word
solaris_getrlimit64
/*
getrlimit64
dP
221
*/
.
word
solaris_getrlimit64
/*
getrlimit64
dP
221
*/
.
word
CHAIN
(
pread
)
/*
pread64
dpdD
222
*/
.
word
CHAIN
(
pread
64
)
/*
pread64
dpdD
222
*/
.
word
CHAIN
(
pwrite
)
/*
pwrite64
dpdD
223
*/
.
word
CHAIN
(
pwrite
64
)
/*
pwrite64
dpdD
223
*/
.
word
CHAIN
(
creat
)
/*
creat64
so
224
*/
.
word
CHAIN
(
creat
)
/*
creat64
so
224
*/
.
word
solaris_open
/*
open64
soo
225
*/
.
word
solaris_open
/*
open64
soo
225
*/
.
word
solaris_unimplemented
/*
226
*/
.
word
solaris_unimplemented
/*
226
*/
...
...
drivers/net/myri_sbus.c
View file @
130ca59d
...
@@ -546,8 +546,11 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -546,8 +546,11 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct
myri_eth
*
mp
=
(
struct
myri_eth
*
)
dev
->
priv
;
struct
myri_eth
*
mp
=
(
struct
myri_eth
*
)
dev
->
priv
;
unsigned
long
lregs
=
mp
->
lregs
;
unsigned
long
lregs
=
mp
->
lregs
;
struct
myri_channel
*
chan
=
&
mp
->
shmem
->
channel
;
struct
myri_channel
*
chan
=
&
mp
->
shmem
->
channel
;
unsigned
long
flags
;
u32
status
;
u32
status
;
spin_lock_irqsave
(
&
mp
->
irq_lock
,
flags
);
status
=
sbus_readl
(
lregs
+
LANAI_ISTAT
);
status
=
sbus_readl
(
lregs
+
LANAI_ISTAT
);
DIRQ
((
"myri_interrupt: status[%08x] "
,
status
));
DIRQ
((
"myri_interrupt: status[%08x] "
,
status
));
if
(
status
&
ISTAT_HOST
)
{
if
(
status
&
ISTAT_HOST
)
{
...
@@ -569,6 +572,8 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -569,6 +572,8 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
myri_enable_irq
(
lregs
,
mp
->
cregs
);
myri_enable_irq
(
lregs
,
mp
->
cregs
);
}
}
DIRQ
((
"
\n
"
));
DIRQ
((
"
\n
"
));
spin_unlock_irqrestore
(
&
mp
->
irq_lock
,
flags
);
}
}
static
int
myri_open
(
struct
net_device
*
dev
)
static
int
myri_open
(
struct
net_device
*
dev
)
...
@@ -622,7 +627,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -622,7 +627,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
return
1
;
return
1
;
}
}
s
ave_and_cli
(
flags
);
s
pin_lock_irqsave
(
&
mp
->
irq_lock
,
flags
);
DHDR
((
"xmit[skbdata(%p)]
\n
"
,
skb
->
data
));
DHDR
((
"xmit[skbdata(%p)]
\n
"
,
skb
->
data
));
#ifdef DEBUG_HEADER
#ifdef DEBUG_HEADER
...
@@ -669,7 +674,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -669,7 +674,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
DTX
((
"tbusy=0, returning 0
\n
"
));
DTX
((
"tbusy=0, returning 0
\n
"
));
netif_start_queue
(
dev
);
netif_start_queue
(
dev
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
mp
->
irq_lock
,
flags
);
return
0
;
return
0
;
}
}
...
@@ -900,6 +905,7 @@ static int __init myri_ether_init(struct net_device *dev, struct sbus_dev *sdev,
...
@@ -900,6 +905,7 @@ static int __init myri_ether_init(struct net_device *dev, struct sbus_dev *sdev,
printk
(
"%s: MyriCOM MyriNET Ethernet "
,
dev
->
name
);
printk
(
"%s: MyriCOM MyriNET Ethernet "
,
dev
->
name
);
mp
=
(
struct
myri_eth
*
)
dev
->
priv
;
mp
=
(
struct
myri_eth
*
)
dev
->
priv
;
spin_lock_init
(
&
mp
->
irq_lock
);
mp
->
myri_sdev
=
sdev
;
mp
->
myri_sdev
=
sdev
;
/* Clean out skb arrays. */
/* Clean out skb arrays. */
...
...
drivers/net/myri_sbus.h
View file @
130ca59d
...
@@ -269,6 +269,7 @@ struct myri_eth {
...
@@ -269,6 +269,7 @@ struct myri_eth {
/* These are frequently accessed, keep together
/* These are frequently accessed, keep together
* to obtain good cache hit rates.
* to obtain good cache hit rates.
*/
*/
spinlock_t
irq_lock
;
struct
myri_shmem
*
shmem
;
/* Shared data structures. */
struct
myri_shmem
*
shmem
;
/* Shared data structures. */
unsigned
long
cregs
;
/* Control register space. */
unsigned
long
cregs
;
/* Control register space. */
struct
recvq
*
rqack
;
/* Where we ack rx's. */
struct
recvq
*
rqack
;
/* Where we ack rx's. */
...
...
drivers/sbus/char/openprom.c
View file @
130ca59d
...
@@ -147,7 +147,6 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -147,7 +147,6 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
DATA
*
data
=
(
DATA
*
)
file
->
private_data
;
DATA
*
data
=
(
DATA
*
)
file
->
private_data
;
char
buffer
[
OPROMMAXPARAM
+
1
],
*
buf
;
char
buffer
[
OPROMMAXPARAM
+
1
],
*
buf
;
struct
openpromio
*
opp
;
struct
openpromio
*
opp
;
unsigned
long
flags
;
int
bufsize
,
len
,
error
=
0
;
int
bufsize
,
len
,
error
=
0
;
extern
char
saved_command_line
[];
extern
char
saved_command_line
[];
static
int
cnt
;
static
int
cnt
;
...
@@ -163,18 +162,14 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -163,18 +162,14 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
switch
(
cmd
)
{
switch
(
cmd
)
{
case
OPROMGETOPT
:
case
OPROMGETOPT
:
case
OPROMGETPROP
:
case
OPROMGETPROP
:
save_and_cli
(
flags
);
len
=
prom_getproplen
(
node
,
opp
->
oprom_array
);
len
=
prom_getproplen
(
node
,
opp
->
oprom_array
);
restore_flags
(
flags
);
if
(
len
<=
0
||
len
>
bufsize
)
{
if
(
len
<=
0
||
len
>
bufsize
)
{
error
=
copyout
((
void
*
)
arg
,
opp
,
sizeof
(
int
));
error
=
copyout
((
void
*
)
arg
,
opp
,
sizeof
(
int
));
break
;
break
;
}
}
save_and_cli
(
flags
);
len
=
prom_getproperty
(
node
,
opp
->
oprom_array
,
buffer
,
bufsize
);
len
=
prom_getproperty
(
node
,
opp
->
oprom_array
,
buffer
,
bufsize
);
restore_flags
(
flags
);
memcpy
(
opp
->
oprom_array
,
buffer
,
len
);
memcpy
(
opp
->
oprom_array
,
buffer
,
len
);
opp
->
oprom_array
[
len
]
=
'\0'
;
opp
->
oprom_array
[
len
]
=
'\0'
;
...
@@ -185,9 +180,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -185,9 +180,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
case
OPROMNXTOPT
:
case
OPROMNXTOPT
:
case
OPROMNXTPROP
:
case
OPROMNXTPROP
:
save_and_cli
(
flags
);
buf
=
prom_nextprop
(
node
,
opp
->
oprom_array
,
buffer
);
buf
=
prom_nextprop
(
node
,
opp
->
oprom_array
,
buffer
);
restore_flags
(
flags
);
len
=
strlen
(
buf
);
len
=
strlen
(
buf
);
if
(
len
==
0
||
len
+
1
>
bufsize
)
{
if
(
len
==
0
||
len
+
1
>
bufsize
)
{
...
@@ -207,10 +200,8 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -207,10 +200,8 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
buf
=
opp
->
oprom_array
+
strlen
(
opp
->
oprom_array
)
+
1
;
buf
=
opp
->
oprom_array
+
strlen
(
opp
->
oprom_array
)
+
1
;
len
=
opp
->
oprom_array
+
bufsize
-
buf
;
len
=
opp
->
oprom_array
+
bufsize
-
buf
;
save_and_cli
(
flags
);
error
=
prom_setprop
(
options_node
,
opp
->
oprom_array
,
error
=
prom_setprop
(
options_node
,
opp
->
oprom_array
,
buf
,
len
);
buf
,
len
);
restore_flags
(
flags
);
if
(
error
<
0
)
if
(
error
<
0
)
error
=
-
EINVAL
;
error
=
-
EINVAL
;
...
@@ -226,13 +217,11 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -226,13 +217,11 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
node
=
*
((
int
*
)
opp
->
oprom_array
);
node
=
*
((
int
*
)
opp
->
oprom_array
);
save_and_cli
(
flags
);
switch
(
cmd
)
{
switch
(
cmd
)
{
case
OPROMNEXT
:
node
=
__prom_getsibling
(
node
);
break
;
case
OPROMNEXT
:
node
=
__prom_getsibling
(
node
);
break
;
case
OPROMCHILD
:
node
=
__prom_getchild
(
node
);
break
;
case
OPROMCHILD
:
node
=
__prom_getchild
(
node
);
break
;
case
OPROMSETCUR
:
break
;
case
OPROMSETCUR
:
break
;
}
}
restore_flags
(
flags
);
data
->
current_node
=
node
;
data
->
current_node
=
node
;
*
((
int
*
)
opp
->
oprom_array
)
=
node
;
*
((
int
*
)
opp
->
oprom_array
)
=
node
;
...
@@ -264,9 +253,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
...
@@ -264,9 +253,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
break
;
break
;
case
OPROMPATH2NODE
:
case
OPROMPATH2NODE
:
save_and_cli
(
flags
);
node
=
prom_finddevice
(
opp
->
oprom_array
);
node
=
prom_finddevice
(
opp
->
oprom_array
);
restore_flags
(
flags
);
data
->
current_node
=
node
;
data
->
current_node
=
node
;
*
((
int
*
)
opp
->
oprom_array
)
=
node
;
*
((
int
*
)
opp
->
oprom_array
)
=
node
;
opp
->
oprom_size
=
sizeof
(
int
);
opp
->
oprom_size
=
sizeof
(
int
);
...
@@ -361,7 +348,6 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -361,7 +348,6 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
{
{
DATA
*
data
=
(
DATA
*
)
file
->
private_data
;
DATA
*
data
=
(
DATA
*
)
file
->
private_data
;
struct
opiocdesc
op
;
struct
opiocdesc
op
;
unsigned
long
flags
;
int
error
,
node
,
len
;
int
error
,
node
,
len
;
char
*
str
,
*
tmp
;
char
*
str
,
*
tmp
;
char
buffer
[
64
];
char
buffer
[
64
];
...
@@ -379,9 +365,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -379,9 +365,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
if
(
error
)
if
(
error
)
return
error
;
return
error
;
save_and_cli
(
flags
);
len
=
prom_getproplen
(
op
.
op_nodeid
,
str
);
len
=
prom_getproplen
(
op
.
op_nodeid
,
str
);
restore_flags
(
flags
);
if
(
len
>
op
.
op_buflen
)
{
if
(
len
>
op
.
op_buflen
)
{
kfree
(
str
);
kfree
(
str
);
...
@@ -405,9 +389,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -405,9 +389,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
save_and_cli
(
flags
);
prom_getproperty
(
op
.
op_nodeid
,
str
,
tmp
,
len
);
prom_getproperty
(
op
.
op_nodeid
,
str
,
tmp
,
len
);
restore_flags
(
flags
);
tmp
[
len
]
=
'\0'
;
tmp
[
len
]
=
'\0'
;
...
@@ -431,9 +413,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -431,9 +413,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
if
(
error
)
if
(
error
)
return
error
;
return
error
;
save_and_cli
(
flags
);
tmp
=
prom_nextprop
(
op
.
op_nodeid
,
str
,
buffer
);
tmp
=
prom_nextprop
(
op
.
op_nodeid
,
str
,
buffer
);
restore_flags
(
flags
);
if
(
tmp
)
{
if
(
tmp
)
{
len
=
strlen
(
tmp
);
len
=
strlen
(
tmp
);
...
@@ -481,9 +461,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -481,9 +461,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
return
error
;
return
error
;
}
}
save_and_cli
(
flags
);
len
=
prom_setprop
(
op
.
op_nodeid
,
str
,
tmp
,
op
.
op_buflen
+
1
);
len
=
prom_setprop
(
op
.
op_nodeid
,
str
,
tmp
,
op
.
op_buflen
+
1
);
restore_flags
(
flags
);
if
(
len
!=
op
.
op_buflen
)
if
(
len
!=
op
.
op_buflen
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -503,12 +481,10 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
...
@@ -503,12 +481,10 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
if
(
copy_from_user
(
&
node
,
(
void
*
)
arg
,
sizeof
(
int
)))
if
(
copy_from_user
(
&
node
,
(
void
*
)
arg
,
sizeof
(
int
)))
return
-
EFAULT
;
return
-
EFAULT
;
save_and_cli
(
flags
);
if
(
cmd
==
OPIOCGETNEXT
)
if
(
cmd
==
OPIOCGETNEXT
)
node
=
__prom_getsibling
(
node
);
node
=
__prom_getsibling
(
node
);
else
else
node
=
__prom_getchild
(
node
);
node
=
__prom_getchild
(
node
);
restore_flags
(
flags
);
if
(
__copy_to_user
((
void
*
)
arg
,
&
node
,
sizeof
(
int
)))
if
(
__copy_to_user
((
void
*
)
arg
,
&
node
,
sizeof
(
int
)))
return
-
EFAULT
;
return
-
EFAULT
;
...
@@ -624,7 +600,6 @@ static struct miscdevice openprom_dev = {
...
@@ -624,7 +600,6 @@ static struct miscdevice openprom_dev = {
static
int
__init
openprom_init
(
void
)
static
int
__init
openprom_init
(
void
)
{
{
unsigned
long
flags
;
int
error
;
int
error
;
error
=
misc_register
(
&
openprom_dev
);
error
=
misc_register
(
&
openprom_dev
);
...
@@ -633,10 +608,8 @@ static int __init openprom_init(void)
...
@@ -633,10 +608,8 @@ static int __init openprom_init(void)
return
error
;
return
error
;
}
}
save_and_cli
(
flags
);
options_node
=
prom_getchild
(
prom_root_node
);
options_node
=
prom_getchild
(
prom_root_node
);
options_node
=
prom_searchsiblings
(
options_node
,
"options"
);
options_node
=
prom_searchsiblings
(
options_node
,
"options"
);
restore_flags
(
flags
);
if
(
options_node
==
0
||
options_node
==
-
1
)
{
if
(
options_node
==
0
||
options_node
==
-
1
)
{
printk
(
KERN_ERR
"openprom: unable to find options node
\n
"
);
printk
(
KERN_ERR
"openprom: unable to find options node
\n
"
);
...
...
drivers/scsi/qlogicpti.c
View file @
130ca59d
...
@@ -318,7 +318,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -318,7 +318,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
risc_code_addr
=
0x1000
;
/* all load addresses are at 0x1000 */
risc_code_addr
=
0x1000
;
/* all load addresses are at 0x1000 */
s
ave_flags
(
flags
);
cli
(
);
s
pin_lock_irqsave
(
&
qpti
->
lock
,
flags
);
sbus_writew
(
HCCTRL_PAUSE
,
qpti
->
qregs
+
HCCTRL
);
sbus_writew
(
HCCTRL_PAUSE
,
qpti
->
qregs
+
HCCTRL
);
...
@@ -366,7 +366,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -366,7 +366,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
printk
(
KERN_EMERG
"qlogicpti%d: Cannot execute ISP firmware.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: Cannot execute ISP firmware.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -377,7 +377,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -377,7 +377,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
printk
(
KERN_EMERG
"qlogicpti%d: Cannot set initiator SCSI ID.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: Cannot set initiator SCSI ID.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -392,7 +392,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -392,7 +392,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
printk
(
KERN_EMERG
"qlogicpti%d: Cannot init response queue.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: Cannot init response queue.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -404,7 +404,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -404,7 +404,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
printk
(
KERN_EMERG
"qlogicpti%d: Cannot init request queue.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: Cannot init request queue.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -450,7 +450,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
...
@@ -450,7 +450,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
qlogicpti_mbox_command
(
qpti
,
param
,
0
);
qlogicpti_mbox_command
(
qpti
,
param
,
0
);
qpti
->
send_marker
=
1
;
qpti
->
send_marker
=
1
;
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
0
;
return
0
;
}
}
...
@@ -468,7 +468,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -468,7 +468,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
risc_code_addr
=
0x1000
;
/* all f/w modules load at 0x1000 */
risc_code_addr
=
0x1000
;
/* all f/w modules load at 0x1000 */
risc_code_length
=
sbus_risc_code_length01
;
risc_code_length
=
sbus_risc_code_length01
;
s
ave_flags
(
flags
);
cli
(
);
s
pin_lock_irqsave
(
&
qpti
->
lock
,
flags
);
/* Verify the checksum twice, one before loading it, and once
/* Verify the checksum twice, one before loading it, and once
* afterwards via the mailbox commands.
* afterwards via the mailbox commands.
...
@@ -476,7 +476,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -476,7 +476,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
for
(
i
=
0
;
i
<
risc_code_length
;
i
++
)
for
(
i
=
0
;
i
<
risc_code_length
;
i
++
)
csum
+=
risc_code
[
i
];
csum
+=
risc_code
[
i
];
if
(
csum
)
{
if
(
csum
)
{
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
printk
(
KERN_EMERG
"qlogicpti%d: Aieee, firmware checksum failed!"
,
printk
(
KERN_EMERG
"qlogicpti%d: Aieee, firmware checksum failed!"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
return
1
;
return
1
;
...
@@ -488,7 +488,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -488,7 +488,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
while
(
--
timeout
&&
(
sbus_readw
(
qpti
->
qregs
+
SBUS_CTRL
)
&
SBUS_CTRL_RESET
))
while
(
--
timeout
&&
(
sbus_readw
(
qpti
->
qregs
+
SBUS_CTRL
)
&
SBUS_CTRL_RESET
))
udelay
(
20
);
udelay
(
20
);
if
(
!
timeout
)
{
if
(
!
timeout
)
{
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
printk
(
KERN_EMERG
"qlogicpti%d: Cannot reset the ISP."
,
qpti
->
qpti_id
);
printk
(
KERN_EMERG
"qlogicpti%d: Cannot reset the ISP."
,
qpti
->
qpti_id
);
return
1
;
return
1
;
}
}
...
@@ -528,7 +528,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -528,7 +528,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
if
(
qlogicpti_mbox_command
(
qpti
,
param
,
1
))
{
printk
(
KERN_EMERG
"qlogicpti%d: Cannot stop firmware for reload.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: Cannot stop firmware for reload.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -541,7 +541,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -541,7 +541,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
)
{
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
)
{
printk
(
"qlogicpti%d: Firmware dload failed, I'm bolixed!
\n
"
,
printk
(
"qlogicpti%d: Firmware dload failed, I'm bolixed!
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
}
}
...
@@ -561,7 +561,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -561,7 +561,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
printk
(
KERN_EMERG
"qlogicpti%d: New firmware csum failure!
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: New firmware csum failure!
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -575,7 +575,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -575,7 +575,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
printk
(
KERN_EMERG
"qlogicpti%d: AboutFirmware cmd fails.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: AboutFirmware cmd fails.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -591,7 +591,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -591,7 +591,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
(
param
[
0
]
!=
MBOX_COMMAND_COMPLETE
))
{
printk
(
KERN_EMERG
"qlogicpti%d: could not set clock rate.
\n
"
,
printk
(
KERN_EMERG
"qlogicpti%d: could not set clock rate.
\n
"
,
qpti
->
qpti_id
);
qpti
->
qpti_id
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
1
;
return
1
;
}
}
...
@@ -608,7 +608,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
...
@@ -608,7 +608,7 @@ static int __init qlogicpti_load_firmware(struct qlogicpti *qpti)
qlogicpti_mbox_command
(
qpti
,
param
,
1
);
qlogicpti_mbox_command
(
qpti
,
param
,
1
);
}
}
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
0
;
return
0
;
}
}
...
@@ -1166,8 +1166,8 @@ static void ourdone(Scsi_Cmnd *Cmnd)
...
@@ -1166,8 +1166,8 @@ static void ourdone(Scsi_Cmnd *Cmnd)
int
qlogicpti_queuecommand_slow
(
Scsi_Cmnd
*
Cmnd
,
void
(
*
done
)(
Scsi_Cmnd
*
))
int
qlogicpti_queuecommand_slow
(
Scsi_Cmnd
*
Cmnd
,
void
(
*
done
)(
Scsi_Cmnd
*
))
{
{
unsigned
long
flags
;
struct
qlogicpti
*
qpti
=
(
struct
qlogicpti
*
)
Cmnd
->
host
->
hostdata
;
struct
qlogicpti
*
qpti
=
(
struct
qlogicpti
*
)
Cmnd
->
host
->
hostdata
;
unsigned
long
flags
;
/*
/*
* done checking this host adapter?
* done checking this host adapter?
...
@@ -1178,12 +1178,13 @@ int qlogicpti_queuecommand_slow(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *))
...
@@ -1178,12 +1178,13 @@ int qlogicpti_queuecommand_slow(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *))
if
(
qpti
->
sbits
&&
qpti
->
sbits
!=
0xffff
)
{
if
(
qpti
->
sbits
&&
qpti
->
sbits
!=
0xffff
)
{
/* See above about in ourdone this ugliness... */
/* See above about in ourdone this ugliness... */
Cmnd
->
SCp
.
Message
=
((
unsigned
long
)
done
)
&
0xffffffff
;
Cmnd
->
SCp
.
Message
=
((
unsigned
long
)
done
)
&
0xffffffff
;
#ifdef
__sparc_v9__
#ifdef
CONFIG_SPARC64
Cmnd
->
SCp
.
Status
=
((
unsigned
long
)
done
>>
32UL
)
&
0xffffffff
;
Cmnd
->
SCp
.
Status
=
((
unsigned
long
)
done
>>
32UL
)
&
0xffffffff
;
#endif
#endif
return
qlogicpti_queuecommand
(
Cmnd
,
ourdone
);
return
qlogicpti_queuecommand
(
Cmnd
,
ourdone
);
}
}
save_flags
(
flags
);
cli
();
spin_lock_irqsave
(
&
qpti
->
lock
,
flags
);
/*
/*
* We've peeked at all targets for this bus- time
* We've peeked at all targets for this bus- time
...
@@ -1226,7 +1227,8 @@ int qlogicpti_queuecommand_slow(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *))
...
@@ -1226,7 +1227,8 @@ int qlogicpti_queuecommand_slow(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *))
if
(
qpti
==
NULL
)
if
(
qpti
==
NULL
)
Cmnd
->
host
->
hostt
->
queuecommand
=
qlogicpti_queuecommand
;
Cmnd
->
host
->
hostt
->
queuecommand
=
qlogicpti_queuecommand
;
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
qpti
->
lock
,
flags
);
return
qlogicpti_queuecommand
(
Cmnd
,
done
);
return
qlogicpti_queuecommand
(
Cmnd
,
done
);
}
}
...
...
drivers/serial/sunsab.c
View file @
130ca59d
This diff is collapsed.
Click to expand it.
include/asm-sparc64/sab82532
.h
→
drivers/serial/sunsab
.h
View file @
130ca59d
/* $Id: sab82532.h,v 1.7 2001/05/23 23:09:10 ecd Exp $
/* sunsab.h: Register Definitions for the Siemens SAB82532 DUSCC
* sab82532.h: Register Definitions for the Siemens SAB82532 DUSCC
*
*
* Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
* Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
*/
*/
#ifndef _SPARC64_SAB82532_H
#ifndef _SUNSAB_H
#define _SPARC64_SAB82532_H
#define _SUNSAB_H
#include <linux/types.h>
#include <linux/serial.h>
#include <linux/circ_buf.h>
struct
sab82532_async_rd_regs
{
struct
sab82532_async_rd_regs
{
u8
rfifo
[
0x20
];
/* Receive FIFO */
u8
rfifo
[
0x20
];
/* Receive FIFO */
...
@@ -120,8 +115,6 @@ union sab82532_async_regs {
...
@@ -120,8 +115,6 @@ union sab82532_async_regs {
__volatile__
struct
sab82532_async_rw_regs
rw
;
__volatile__
struct
sab82532_async_rw_regs
rw
;
};
};
#define NR_PORTS 2
union
sab82532_irq_status
{
union
sab82532_irq_status
{
unsigned
short
stat
;
unsigned
short
stat
;
struct
{
struct
{
...
@@ -130,62 +123,10 @@ union sab82532_irq_status {
...
@@ -130,62 +123,10 @@ union sab82532_irq_status {
}
sreg
;
}
sreg
;
};
};
struct
sab82532
{
int
magic
;
int
baud_base
;
union
sab82532_async_regs
*
regs
;
int
irq
;
int
flags
;
/* defined in tty.h */
int
type
;
/* SAB82532 version */
struct
tty_struct
*
tty
;
int
read_status_mask
;
int
ignore_status_mask
;
int
timeout
;
int
xmit_fifo_size
;
int
recv_fifo_size
;
int
custom_divisor
;
int
baud
;
unsigned
int
cec_timeout
;
unsigned
int
tec_timeout
;
int
x_char
;
int
close_delay
;
unsigned
short
closing_wait
;
unsigned
short
closing_wait2
;
unsigned
long
irqflags
;
int
is_console
;
unsigned
char
interrupt_mask0
;
unsigned
char
interrupt_mask1
;
unsigned
char
pvr_dtr_bit
;
unsigned
char
pvr_dsr_bit
;
unsigned
char
dcd
;
unsigned
char
cts
;
unsigned
char
dsr
;
unsigned
long
event
;
unsigned
long
last_active
;
int
line
;
int
count
;
int
blocked_open
;
long
session
;
long
pgrp
;
struct
circ_buf
xmit
;
struct
tq_struct
tqueue
;
struct
tq_struct
tqueue_hangup
;
struct
async_icount
icount
;
struct
termios
normal_termios
;
struct
termios
callout_termios
;
wait_queue_head_t
open_wait
;
wait_queue_head_t
close_wait
;
wait_queue_head_t
delta_msr_wait
;
struct
sab82532
*
next
;
struct
sab82532
*
prev
;
};
/* irqflags bits */
/* irqflags bits */
#define SAB82532_ALLS 0x00000001
#define SAB82532_ALLS 0x00000001
#define SAB82532_XPR 0x00000002
#define SAB82532_XPR 0x00000002
/* RFIFO Status Byte */
/* RFIFO Status Byte */
#define SAB82532_RSTAT_PE 0x80
#define SAB82532_RSTAT_PE 0x80
#define SAB82532_RSTAT_FE 0x40
#define SAB82532_RSTAT_FE 0x40
...
@@ -377,4 +318,4 @@ struct sab82532 {
...
@@ -377,4 +318,4 @@ struct sab82532 {
#define SAB82532_CCR4_ICD 0x10
#define SAB82532_CCR4_ICD 0x10
#endif
/* !(_S
PARC64_SAB82532
_H) */
#endif
/* !(_S
UNSAB
_H) */
drivers/serial/sunsu.c
View file @
130ca59d
...
@@ -1362,7 +1362,7 @@ static void sunsu_console_write(struct console *co, const char *s,
...
@@ -1362,7 +1362,7 @@ static void sunsu_console_write(struct console *co, const char *s,
static
kdev_t
sunsu_console_device
(
struct
console
*
co
)
static
kdev_t
sunsu_console_device
(
struct
console
*
co
)
{
{
return
mk_kdev
(
TTY_MAJOR
,
64
+
co
->
index
);
return
mk_kdev
(
sunsu_reg
.
major
,
sunsu_reg
.
minor
+
co
->
index
);
}
}
/*
/*
...
@@ -1379,6 +1379,9 @@ static int __init sunsu_console_setup(struct console *co, char *options)
...
@@ -1379,6 +1379,9 @@ static int __init sunsu_console_setup(struct console *co, char *options)
int
parity
=
'n'
;
int
parity
=
'n'
;
int
flow
=
'n'
;
int
flow
=
'n'
;
printk
(
"Console: ttyS%d (SU)
\n
"
,
(
sunsu_reg
.
minor
-
64
)
+
co
->
index
);
/*
/*
* Check whether an invalid uart number has been specified, and
* Check whether an invalid uart number has been specified, and
* if so, search for the first available port that does have
* if so, search for the first available port that does have
...
@@ -1414,15 +1417,23 @@ static struct console sunsu_cons = {
...
@@ -1414,15 +1417,23 @@ static struct console sunsu_cons = {
static
int
__init
sunsu_serial_console_init
(
void
)
static
int
__init
sunsu_serial_console_init
(
void
)
{
{
int
i
ndex
;
int
i
;
if
(
con_is_present
())
if
(
con_is_present
())
return
0
;
return
0
;
index
=
serial_console
-
1
;
for
(
i
=
0
;
i
<
UART_NR
;
i
++
)
{
if
(
sunsu_ports
[
index
].
port_node
==
0
)
int
this_minor
=
sunsu_reg
.
minor
+
i
;
if
((
this_minor
-
64
)
==
(
serial_console
-
1
))
break
;
}
if
(
i
==
UART_NR
)
return
0
;
return
0
;
sunsu_cons
.
index
=
index
;
if
(
sunsu_ports
[
i
].
port_node
==
0
)
return
0
;
sunsu_cons
.
index
=
i
;
register_console
(
&
sunsu_cons
);
register_console
(
&
sunsu_cons
);
return
0
;
return
0
;
}
}
...
...
drivers/serial/sunzilog.c
View file @
130ca59d
...
@@ -1013,7 +1013,6 @@ static struct uart_driver sunzilog_reg = {
...
@@ -1013,7 +1013,6 @@ static struct uart_driver sunzilog_reg = {
.
dev_name
=
"ttyS"
,
.
dev_name
=
"ttyS"
,
#endif
#endif
.
major
=
TTY_MAJOR
,
.
major
=
TTY_MAJOR
,
.
minor
=
64
,
};
};
static
void
*
__init
alloc_one_table
(
unsigned
long
size
)
static
void
*
__init
alloc_one_table
(
unsigned
long
size
)
...
@@ -1386,7 +1385,7 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count)
...
@@ -1386,7 +1385,7 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count)
static
kdev_t
sunzilog_console_device
(
struct
console
*
con
)
static
kdev_t
sunzilog_console_device
(
struct
console
*
con
)
{
{
return
mk_kdev
(
TTY_MAJOR
,
64
+
con
->
index
);
return
mk_kdev
(
sunzilog_reg
.
major
,
sunzilog_reg
.
minor
+
con
->
index
);
}
}
static
int
__init
sunzilog_console_setup
(
struct
console
*
con
,
char
*
options
)
static
int
__init
sunzilog_console_setup
(
struct
console
*
con
,
char
*
options
)
...
@@ -1395,7 +1394,8 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
...
@@ -1395,7 +1394,8 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
unsigned
long
flags
;
unsigned
long
flags
;
int
baud
,
brg
;
int
baud
,
brg
;
printk
(
"Console: ttyS%d (Zilog8530)
\n
"
,
con
->
index
/
2
);
printk
(
"Console: ttyS%d (Zilog8530)
\n
"
,
(
sunzilog_reg
.
minor
-
64
)
+
con
->
index
);
/* Get firmware console settings. */
/* Get firmware console settings. */
sunserial_console_termios
(
con
);
sunserial_console_termios
(
con
);
...
@@ -1447,10 +1447,21 @@ static struct console sunzilog_console = {
...
@@ -1447,10 +1447,21 @@ static struct console sunzilog_console = {
static
int
__init
sunzilog_console_init
(
void
)
static
int
__init
sunzilog_console_init
(
void
)
{
{
int
i
;
if
(
con_is_present
())
if
(
con_is_present
())
return
0
;
return
0
;
sunzilog_console
.
index
=
serial_console
-
1
;
for
(
i
=
0
;
i
<
NUM_CHANNELS
;
i
++
)
{
int
this_minor
=
sunzilog_reg
.
minor
+
i
;
if
((
this_minor
-
64
)
==
(
serial_console
-
1
))
break
;
}
if
(
i
==
NUM_CHANNELS
)
return
0
;
sunzilog_console
.
index
=
i
;
register_console
(
&
sunzilog_console
);
register_console
(
&
sunzilog_console
);
return
0
;
return
0
;
}
}
...
@@ -1480,6 +1491,7 @@ static void __init sunzilog_prepare(void)
...
@@ -1480,6 +1491,7 @@ static void __init sunzilog_prepare(void)
up
[(
chip
*
2
)
+
0
].
port
.
uartclk
=
ZS_CLOCK
;
up
[(
chip
*
2
)
+
0
].
port
.
uartclk
=
ZS_CLOCK
;
up
[(
chip
*
2
)
+
0
].
port
.
fifosize
=
1
;
up
[(
chip
*
2
)
+
0
].
port
.
fifosize
=
1
;
up
[(
chip
*
2
)
+
0
].
port
.
ops
=
&
sunzilog_pops
;
up
[(
chip
*
2
)
+
0
].
port
.
ops
=
&
sunzilog_pops
;
up
[(
chip
*
2
)
+
0
].
port
.
type
=
PORT_SUNZILOG
;
up
[(
chip
*
2
)
+
0
].
port
.
flags
=
0
;
up
[(
chip
*
2
)
+
0
].
port
.
flags
=
0
;
up
[(
chip
*
2
)
+
0
].
port
.
line
=
(
chip
*
2
)
+
0
;
up
[(
chip
*
2
)
+
0
].
port
.
line
=
(
chip
*
2
)
+
0
;
up
[(
chip
*
2
)
+
0
].
flags
|=
SUNZILOG_FLAG_IS_CHANNEL_A
;
up
[(
chip
*
2
)
+
0
].
flags
|=
SUNZILOG_FLAG_IS_CHANNEL_A
;
...
@@ -1490,6 +1502,7 @@ static void __init sunzilog_prepare(void)
...
@@ -1490,6 +1502,7 @@ static void __init sunzilog_prepare(void)
up
[(
chip
*
2
)
+
1
].
port
.
uartclk
=
ZS_CLOCK
;
up
[(
chip
*
2
)
+
1
].
port
.
uartclk
=
ZS_CLOCK
;
up
[(
chip
*
2
)
+
1
].
port
.
fifosize
=
1
;
up
[(
chip
*
2
)
+
1
].
port
.
fifosize
=
1
;
up
[(
chip
*
2
)
+
1
].
port
.
ops
=
&
sunzilog_pops
;
up
[(
chip
*
2
)
+
1
].
port
.
ops
=
&
sunzilog_pops
;
up
[(
chip
*
2
)
+
1
].
port
.
type
=
PORT_SUNZILOG
;
up
[(
chip
*
2
)
+
1
].
port
.
flags
=
0
;
up
[(
chip
*
2
)
+
1
].
port
.
flags
=
0
;
up
[(
chip
*
2
)
+
1
].
port
.
line
=
(
chip
*
2
)
+
1
;
up
[(
chip
*
2
)
+
1
].
port
.
line
=
(
chip
*
2
)
+
1
;
up
[(
chip
*
2
)
+
1
].
flags
|=
0
;
up
[(
chip
*
2
)
+
1
].
flags
|=
0
;
...
@@ -1607,12 +1620,10 @@ static int __init sunzilog_ports_init(void)
...
@@ -1607,12 +1620,10 @@ static int __init sunzilog_ports_init(void)
* in the system.
* in the system.
*/
*/
sunzilog_reg
.
nr
=
NUM_CHANNELS
;
sunzilog_reg
.
nr
=
NUM_CHANNELS
;
#ifdef CONFIG_SERIAL_CONSOLE
sunzilog_reg
.
cons
=
&
sunzilog_console
;
sunzilog_reg
.
cons
=
&
sunzilog_console
;
#else
sunzilog_reg
.
cons
=
NULL
;
sunzilog_reg
.
minor
=
sunserial_current_minor
;
#endif
sunserial_current_minor
+=
NUM_CHANNELS
;
ret
=
uart_register_driver
(
&
sunzilog_reg
);
ret
=
uart_register_driver
(
&
sunzilog_reg
);
if
(
ret
==
0
)
{
if
(
ret
==
0
)
{
...
...
include/asm-sparc64/ns87303.h
View file @
130ca59d
...
@@ -78,9 +78,13 @@
...
@@ -78,9 +78,13 @@
#ifdef __KERNEL__
#ifdef __KERNEL__
#include <linux/spinlock.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/io.h>
extern
spinlock_t
ns87303_lock
;
static
__inline__
int
ns87303_modify
(
unsigned
long
port
,
unsigned
int
index
,
static
__inline__
int
ns87303_modify
(
unsigned
long
port
,
unsigned
int
index
,
unsigned
char
clr
,
unsigned
char
set
)
unsigned
char
clr
,
unsigned
char
set
)
{
{
...
@@ -96,14 +100,16 @@ static __inline__ int ns87303_modify(unsigned long port, unsigned int index,
...
@@ -96,14 +100,16 @@ static __inline__ int ns87303_modify(unsigned long port, unsigned int index,
if
(
index
>
0x0d
)
if
(
index
>
0x0d
)
return
-
EINVAL
;
return
-
EINVAL
;
save_flags
(
flags
);
cli
();
spin_lock_irqsave
(
&
ns87303_lock
,
flags
);
outb
(
index
,
port
);
outb
(
index
,
port
);
value
=
inb
(
port
+
1
);
value
=
inb
(
port
+
1
);
value
&=
~
(
reserved
[
index
]
|
clr
);
value
&=
~
(
reserved
[
index
]
|
clr
);
value
|=
set
;
value
|=
set
;
outb
(
value
,
port
+
1
);
outb
(
value
,
port
+
1
);
outb
(
value
,
port
+
1
);
outb
(
value
,
port
+
1
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
ns87303_lock
,
flags
);
return
0
;
return
0
;
}
}
...
...
include/linux/serial_core.h
View file @
130ca59d
...
@@ -51,6 +51,10 @@
...
@@ -51,6 +51,10 @@
#define PORT_UART00 35
#define PORT_UART00 35
#define PORT_21285 37
#define PORT_21285 37
/* Sparc type numbers. */
#define PORT_SUNZILOG 38
#define PORT_SUNSAB 39
#ifdef __KERNEL__
#ifdef __KERNEL__
#include <linux/config.h>
#include <linux/config.h>
...
...
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