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
Kirill Smelkov
linux
Commits
072152fc
Commit
072152fc
authored
Jan 14, 2004
by
Ben Collins
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[IEEE1394]: Per-host address space patch from Steve.
parent
5c0b7f26
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
155 additions
and
98 deletions
+155
-98
drivers/ieee1394/cmp.c
drivers/ieee1394/cmp.c
+23
-15
drivers/ieee1394/csr.c
drivers/ieee1394/csr.c
+55
-38
drivers/ieee1394/eth1394.c
drivers/ieee1394/eth1394.c
+24
-15
drivers/ieee1394/highlevel.c
drivers/ieee1394/highlevel.c
+28
-12
drivers/ieee1394/highlevel.h
drivers/ieee1394/highlevel.h
+6
-3
drivers/ieee1394/hosts.c
drivers/ieee1394/hosts.c
+2
-0
drivers/ieee1394/hosts.h
drivers/ieee1394/hosts.h
+2
-0
drivers/ieee1394/ieee1394_core.c
drivers/ieee1394/ieee1394_core.c
+0
-1
drivers/ieee1394/raw1394.c
drivers/ieee1394/raw1394.c
+3
-3
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.c
+12
-11
No files found.
drivers/ieee1394/cmp.c
View file @
072152fc
...
@@ -77,6 +77,25 @@ enum {
...
@@ -77,6 +77,25 @@ enum {
static
struct
hpsb_highlevel
cmp_highlevel
;
static
struct
hpsb_highlevel
cmp_highlevel
;
static
void
cmp_add_host
(
struct
hpsb_host
*
host
);
static
void
cmp_host_reset
(
struct
hpsb_host
*
host
);
static
int
pcr_read
(
struct
hpsb_host
*
host
,
int
nodeid
,
quadlet_t
*
buf
,
u64
addr
,
size_t
length
,
u16
flags
);
static
int
pcr_lock
(
struct
hpsb_host
*
host
,
int
nodeid
,
quadlet_t
*
store
,
u64
addr
,
quadlet_t
data
,
quadlet_t
arg
,
int
extcode
,
u16
flags
);
static
struct
hpsb_highlevel
cmp_highlevel
=
{
.
name
=
"cmp"
,
.
add_host
=
cmp_add_host
,
.
host_reset
=
cmp_host_reset
,
};
static
struct
hpsb_address_ops
pcr_ops
=
{
.
read
=
pcr_read
,
.
lock
=
pcr_lock
,
};
struct
cmp_pcr
*
struct
cmp_pcr
*
cmp_register_opcr
(
struct
hpsb_host
*
host
,
int
opcr_number
,
int
payload
,
cmp_register_opcr
(
struct
hpsb_host
*
host
,
int
opcr_number
,
int
payload
,
void
(
*
update
)(
struct
cmp_pcr
*
pcr
,
void
*
data
),
void
(
*
update
)(
struct
cmp_pcr
*
pcr
,
void
*
data
),
...
@@ -137,6 +156,10 @@ static void cmp_add_host(struct hpsb_host *host)
...
@@ -137,6 +156,10 @@ static void cmp_add_host(struct hpsb_host *host)
return
;
return
;
}
}
hpsb_register_addrspace
(
&
cmp_highlevel
,
host
,
&
pcr_ops
,
CSR_REGISTER_BASE
+
CSR_PCR_MAP
,
CSR_REGISTER_BASE
+
CSR_PCR_MAP_END
);
ch
->
host
=
host
;
ch
->
host
=
host
;
ch
->
u
.
ompr
.
rate
=
IEEE1394_SPEED_100
;
ch
->
u
.
ompr
.
rate
=
IEEE1394_SPEED_100
;
ch
->
u
.
ompr
.
bcast_channel_base
=
63
;
ch
->
u
.
ompr
.
bcast_channel_base
=
63
;
...
@@ -258,17 +281,6 @@ static int pcr_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,
...
@@ -258,17 +281,6 @@ static int pcr_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,
}
}
static
struct
hpsb_highlevel
cmp_highlevel
=
{
.
name
=
"cmp"
,
.
add_host
=
cmp_add_host
,
.
host_reset
=
cmp_host_reset
,
};
static
struct
hpsb_address_ops
pcr_ops
=
{
.
read
=
pcr_read
,
.
lock
=
pcr_lock
,
};
/* Module interface */
/* Module interface */
MODULE_AUTHOR
(
"Kristian Hogsberg <hogsberg@users.sf.net>"
);
MODULE_AUTHOR
(
"Kristian Hogsberg <hogsberg@users.sf.net>"
);
...
@@ -283,10 +295,6 @@ static int __init cmp_init_module (void)
...
@@ -283,10 +295,6 @@ static int __init cmp_init_module (void)
{
{
hpsb_register_highlevel
(
&
cmp_highlevel
);
hpsb_register_highlevel
(
&
cmp_highlevel
);
hpsb_register_addrspace
(
&
cmp_highlevel
,
&
pcr_ops
,
CSR_REGISTER_BASE
+
CSR_PCR_MAP
,
CSR_REGISTER_BASE
+
CSR_PCR_MAP_END
);
HPSB_INFO
(
"Loaded CMP driver"
);
HPSB_INFO
(
"Loaded CMP driver"
);
return
0
;
return
0
;
...
...
drivers/ieee1394/csr.c
View file @
072152fc
...
@@ -35,6 +35,43 @@ static int fcp = 1;
...
@@ -35,6 +35,43 @@ static int fcp = 1;
module_param
(
fcp
,
int
,
0444
);
module_param
(
fcp
,
int
,
0444
);
MODULE_PARM_DESC
(
fcp
,
"Map FCP registers (default = 1, disable = 0)."
);
MODULE_PARM_DESC
(
fcp
,
"Map FCP registers (default = 1, disable = 0)."
);
static
void
add_host
(
struct
hpsb_host
*
host
);
static
void
host_reset
(
struct
hpsb_host
*
host
);
static
int
read_maps
(
struct
hpsb_host
*
host
,
int
nodeid
,
quadlet_t
*
buffer
,
u64
addr
,
size_t
length
,
u16
fl
);
static
int
write_fcp
(
struct
hpsb_host
*
host
,
int
nodeid
,
int
dest
,
quadlet_t
*
data
,
u64
addr
,
size_t
length
,
u16
flags
);
static
int
read_regs
(
struct
hpsb_host
*
host
,
int
nodeid
,
quadlet_t
*
buf
,
u64
addr
,
size_t
length
,
u16
flags
);
static
int
write_regs
(
struct
hpsb_host
*
host
,
int
nodeid
,
int
destid
,
quadlet_t
*
data
,
u64
addr
,
size_t
length
,
u16
flags
);
static
int
lock_regs
(
struct
hpsb_host
*
host
,
int
nodeid
,
quadlet_t
*
store
,
u64
addr
,
quadlet_t
data
,
quadlet_t
arg
,
int
extcode
,
u16
fl
);
static
int
lock64_regs
(
struct
hpsb_host
*
host
,
int
nodeid
,
octlet_t
*
store
,
u64
addr
,
octlet_t
data
,
octlet_t
arg
,
int
extcode
,
u16
fl
);
static
struct
hpsb_highlevel
csr_highlevel
=
{
.
name
=
"standard registers"
,
.
add_host
=
add_host
,
.
host_reset
=
host_reset
,
};
static
struct
hpsb_address_ops
map_ops
=
{
.
read
=
read_maps
,
};
static
struct
hpsb_address_ops
fcp_ops
=
{
.
write
=
write_fcp
,
};
static
struct
hpsb_address_ops
reg_ops
=
{
.
read
=
read_regs
,
.
write
=
write_regs
,
.
lock
=
lock_regs
,
.
lock64
=
lock64_regs
,
};
static
u16
csr_crc16
(
unsigned
*
data
,
int
length
)
static
u16
csr_crc16
(
unsigned
*
data
,
int
length
)
{
{
int
check
=
0
,
i
;
int
check
=
0
,
i
;
...
@@ -125,6 +162,24 @@ static inline void calculate_expire(struct csr_control *csr)
...
@@ -125,6 +162,24 @@ static inline void calculate_expire(struct csr_control *csr)
static
void
add_host
(
struct
hpsb_host
*
host
)
static
void
add_host
(
struct
hpsb_host
*
host
)
{
{
hpsb_register_addrspace
(
&
csr_highlevel
,
host
,
&
reg_ops
,
CSR_REGISTER_BASE
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM
);
hpsb_register_addrspace
(
&
csr_highlevel
,
host
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM_END
);
if
(
fcp
)
{
hpsb_register_addrspace
(
&
csr_highlevel
,
host
,
&
fcp_ops
,
CSR_REGISTER_BASE
+
CSR_FCP_COMMAND
,
CSR_REGISTER_BASE
+
CSR_FCP_END
);
}
hpsb_register_addrspace
(
&
csr_highlevel
,
host
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_TOPOLOGY_MAP
,
CSR_REGISTER_BASE
+
CSR_TOPOLOGY_MAP_END
);
hpsb_register_addrspace
(
&
csr_highlevel
,
host
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_SPEED_MAP
,
CSR_REGISTER_BASE
+
CSR_SPEED_MAP_END
);
host
->
csr
.
lock
=
SPIN_LOCK_UNLOCKED
;
host
->
csr
.
lock
=
SPIN_LOCK_UNLOCKED
;
host
->
csr
.
rom_size
=
host
->
driver
->
get_rom
(
host
,
&
host
->
csr
.
rom
);
host
->
csr
.
rom_size
=
host
->
driver
->
get_rom
(
host
,
&
host
->
csr
.
rom
);
...
@@ -684,48 +739,10 @@ static int write_fcp(struct hpsb_host *host, int nodeid, int dest,
...
@@ -684,48 +739,10 @@ static int write_fcp(struct hpsb_host *host, int nodeid, int dest,
}
}
static
struct
hpsb_highlevel
csr_highlevel
=
{
.
name
=
"standard registers"
,
.
add_host
=
add_host
,
.
host_reset
=
host_reset
,
};
static
struct
hpsb_address_ops
map_ops
=
{
.
read
=
read_maps
,
};
static
struct
hpsb_address_ops
fcp_ops
=
{
.
write
=
write_fcp
,
};
static
struct
hpsb_address_ops
reg_ops
=
{
.
read
=
read_regs
,
.
write
=
write_regs
,
.
lock
=
lock_regs
,
.
lock64
=
lock64_regs
,
};
void
init_csr
(
void
)
void
init_csr
(
void
)
{
{
hpsb_register_highlevel
(
&
csr_highlevel
);
hpsb_register_highlevel
(
&
csr_highlevel
);
hpsb_register_addrspace
(
&
csr_highlevel
,
&
reg_ops
,
CSR_REGISTER_BASE
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM
);
hpsb_register_addrspace
(
&
csr_highlevel
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM
,
CSR_REGISTER_BASE
+
CSR_CONFIG_ROM_END
);
if
(
fcp
)
{
hpsb_register_addrspace
(
&
csr_highlevel
,
&
fcp_ops
,
CSR_REGISTER_BASE
+
CSR_FCP_COMMAND
,
CSR_REGISTER_BASE
+
CSR_FCP_END
);
}
hpsb_register_addrspace
(
&
csr_highlevel
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_TOPOLOGY_MAP
,
CSR_REGISTER_BASE
+
CSR_TOPOLOGY_MAP_END
);
hpsb_register_addrspace
(
&
csr_highlevel
,
&
map_ops
,
CSR_REGISTER_BASE
+
CSR_SPEED_MAP
,
CSR_REGISTER_BASE
+
CSR_SPEED_MAP_END
);
}
}
void
cleanup_csr
(
void
)
void
cleanup_csr
(
void
)
...
...
drivers/ieee1394/eth1394.c
View file @
072152fc
...
@@ -168,6 +168,26 @@ static void ether1394_iso(struct hpsb_iso *iso);
...
@@ -168,6 +168,26 @@ static void ether1394_iso(struct hpsb_iso *iso);
static
int
ether1394_do_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
ifr
,
int
cmd
);
static
int
ether1394_do_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
ifr
,
int
cmd
);
static
int
ether1394_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
);
static
int
ether1394_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
);
static
int
ether1394_write
(
struct
hpsb_host
*
host
,
int
srcid
,
int
destid
,
quadlet_t
*
data
,
u64
addr
,
size_t
len
,
u16
flags
);
static
void
ether1394_add_host
(
struct
hpsb_host
*
host
);
static
void
ether1394_remove_host
(
struct
hpsb_host
*
host
);
static
void
ether1394_host_reset
(
struct
hpsb_host
*
host
);
/* Function for incoming 1394 packets */
static
struct
hpsb_address_ops
addr_ops
=
{
.
write
=
ether1394_write
,
};
/* Ieee1394 highlevel driver functions */
static
struct
hpsb_highlevel
eth1394_highlevel
=
{
.
name
=
driver_name
,
.
add_host
=
ether1394_add_host
,
.
remove_host
=
ether1394_remove_host
,
.
host_reset
=
ether1394_host_reset
,
};
static
void
eth1394_iso_shutdown
(
struct
eth1394_priv
*
priv
)
static
void
eth1394_iso_shutdown
(
struct
eth1394_priv
*
priv
)
{
{
priv
->
bc_state
=
ETHER1394_BC_CLOSED
;
priv
->
bc_state
=
ETHER1394_BC_CLOSED
;
...
@@ -420,6 +440,10 @@ static void ether1394_add_host (struct hpsb_host *host)
...
@@ -420,6 +440,10 @@ static void ether1394_add_host (struct hpsb_host *host)
struct
eth1394_priv
*
priv
;
struct
eth1394_priv
*
priv
;
static
int
version_printed
=
0
;
static
int
version_printed
=
0
;
hpsb_register_addrspace
(
&
eth1394_highlevel
,
host
,
&
addr_ops
,
ETHER1394_REGION_ADDR
,
ETHER1394_REGION_ADDR_END
);
if
(
version_printed
++
==
0
)
if
(
version_printed
++
==
0
)
ETH1394_PRINT_G
(
KERN_INFO
,
"%s
\n
"
,
version
);
ETH1394_PRINT_G
(
KERN_INFO
,
"%s
\n
"
,
version
);
...
@@ -1619,18 +1643,6 @@ static int ether1394_ethtool_ioctl(struct net_device *dev, void *useraddr)
...
@@ -1619,18 +1643,6 @@ static int ether1394_ethtool_ioctl(struct net_device *dev, void *useraddr)
return
0
;
return
0
;
}
}
/* Function for incoming 1394 packets */
static
struct
hpsb_address_ops
addr_ops
=
{
.
write
=
ether1394_write
,
};
/* Ieee1394 highlevel driver functions */
static
struct
hpsb_highlevel
eth1394_highlevel
=
{
.
name
=
driver_name
,
.
add_host
=
ether1394_add_host
,
.
remove_host
=
ether1394_remove_host
,
.
host_reset
=
ether1394_host_reset
,
};
static
int
__init
ether1394_init_module
(
void
)
static
int
__init
ether1394_init_module
(
void
)
{
{
...
@@ -1640,9 +1652,6 @@ static int __init ether1394_init_module (void)
...
@@ -1640,9 +1652,6 @@ static int __init ether1394_init_module (void)
/* Register ourselves as a highlevel driver */
/* Register ourselves as a highlevel driver */
hpsb_register_highlevel
(
&
eth1394_highlevel
);
hpsb_register_highlevel
(
&
eth1394_highlevel
);
hpsb_register_addrspace
(
&
eth1394_highlevel
,
&
addr_ops
,
ETHER1394_REGION_ADDR
,
ETHER1394_REGION_ADDR_END
);
return
0
;
return
0
;
}
}
...
...
drivers/ieee1394/highlevel.c
View file @
072152fc
...
@@ -41,7 +41,6 @@ struct hl_host_info {
...
@@ -41,7 +41,6 @@ struct hl_host_info {
static
LIST_HEAD
(
hl_drivers
);
static
LIST_HEAD
(
hl_drivers
);
static
rwlock_t
hl_drivers_lock
=
RW_LOCK_UNLOCKED
;
static
rwlock_t
hl_drivers_lock
=
RW_LOCK_UNLOCKED
;
static
LIST_HEAD
(
addr_space
);
static
rwlock_t
addr_space_lock
=
RW_LOCK_UNLOCKED
;
static
rwlock_t
addr_space_lock
=
RW_LOCK_UNLOCKED
;
/* addr_space list will have zero and max already included as bounds */
/* addr_space list will have zero and max already included as bounds */
...
@@ -288,7 +287,7 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
...
@@ -288,7 +287,7 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
nodemgr_for_each_host
(
hl
,
highlevel_for_each_host_unreg
);
nodemgr_for_each_host
(
hl
,
highlevel_for_each_host_unreg
);
}
}
int
hpsb_register_addrspace
(
struct
hpsb_highlevel
*
hl
,
int
hpsb_register_addrspace
(
struct
hpsb_highlevel
*
hl
,
struct
hpsb_host
*
host
,
struct
hpsb_address_ops
*
ops
,
u64
start
,
u64
end
)
struct
hpsb_address_ops
*
ops
,
u64
start
,
u64
end
)
{
{
struct
hpsb_address_serve
*
as
;
struct
hpsb_address_serve
*
as
;
...
@@ -314,7 +313,7 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl,
...
@@ -314,7 +313,7 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl,
as
->
end
=
end
;
as
->
end
=
end
;
write_lock_irqsave
(
&
addr_space_lock
,
flags
);
write_lock_irqsave
(
&
addr_space_lock
,
flags
);
entry
=
addr_space
.
next
;
entry
=
host
->
addr_space
.
next
;
while
(
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
)
->
end
while
(
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
)
->
end
<=
start
)
{
<=
start
)
{
...
@@ -336,7 +335,8 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl,
...
@@ -336,7 +335,8 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl,
return
retval
;
return
retval
;
}
}
int
hpsb_unregister_addrspace
(
struct
hpsb_highlevel
*
hl
,
u64
start
)
int
hpsb_unregister_addrspace
(
struct
hpsb_highlevel
*
hl
,
struct
hpsb_host
*
host
,
u64
start
)
{
{
int
retval
=
0
;
int
retval
=
0
;
struct
hpsb_address_serve
*
as
;
struct
hpsb_address_serve
*
as
;
...
@@ -350,7 +350,7 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, u64 start)
...
@@ -350,7 +350,7 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, u64 start)
while
(
entry
!=
&
hl
->
addr_list
)
{
while
(
entry
!=
&
hl
->
addr_list
)
{
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
addr_list
);
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
addr_list
);
entry
=
entry
->
next
;
entry
=
entry
->
next
;
if
(
as
->
start
==
start
)
{
if
(
as
->
start
==
start
&&
as
->
host
==
host
)
{
list_del
(
&
as
->
as_list
);
list_del
(
&
as
->
as_list
);
list_del
(
&
as
->
addr_list
);
list_del
(
&
as
->
addr_list
);
kfree
(
as
);
kfree
(
as
);
...
@@ -398,6 +398,8 @@ void highlevel_add_host(struct hpsb_host *host)
...
@@ -398,6 +398,8 @@ void highlevel_add_host(struct hpsb_host *host)
struct
list_head
*
entry
;
struct
list_head
*
entry
;
struct
hpsb_highlevel
*
hl
;
struct
hpsb_highlevel
*
hl
;
init_hpsb_highlevel
(
host
);
read_lock
(
&
hl_drivers_lock
);
read_lock
(
&
hl_drivers_lock
);
list_for_each
(
entry
,
&
hl_drivers
)
{
list_for_each
(
entry
,
&
hl_drivers
)
{
hl
=
list_entry
(
entry
,
struct
hpsb_highlevel
,
hl_list
);
hl
=
list_entry
(
entry
,
struct
hpsb_highlevel
,
hl_list
);
...
@@ -411,6 +413,9 @@ void highlevel_remove_host(struct hpsb_host *host)
...
@@ -411,6 +413,9 @@ void highlevel_remove_host(struct hpsb_host *host)
{
{
struct
list_head
*
entry
;
struct
list_head
*
entry
;
struct
hpsb_highlevel
*
hl
;
struct
hpsb_highlevel
*
hl
;
struct
list_head
*
lh
,
*
next
;
struct
hpsb_address_serve
*
as
;
unsigned
long
flags
;
read_lock
(
&
hl_drivers_lock
);
read_lock
(
&
hl_drivers_lock
);
list_for_each
(
entry
,
&
hl_drivers
)
{
list_for_each
(
entry
,
&
hl_drivers
)
{
...
@@ -422,6 +427,17 @@ void highlevel_remove_host(struct hpsb_host *host)
...
@@ -422,6 +427,17 @@ void highlevel_remove_host(struct hpsb_host *host)
}
}
}
}
read_unlock
(
&
hl_drivers_lock
);
read_unlock
(
&
hl_drivers_lock
);
/* Free up 1394 address space left behind by high level drivers. */
write_lock_irqsave
(
&
addr_space_lock
,
flags
);
list_for_each_safe
(
lh
,
next
,
&
host
->
addr_space
)
{
as
=
list_entry
(
lh
,
struct
hpsb_address_serve
,
as_list
);
if
(
!
list_empty
(
&
as
->
addr_list
))
{
list_del
(
&
as
->
addr_list
);
kfree
(
as
);
}
}
write_unlock_irqrestore
(
&
addr_space_lock
,
flags
);
}
}
void
highlevel_host_reset
(
struct
hpsb_host
*
host
)
void
highlevel_host_reset
(
struct
hpsb_host
*
host
)
...
@@ -490,7 +506,7 @@ int highlevel_read(struct hpsb_host *host, int nodeid, void *data,
...
@@ -490,7 +506,7 @@ int highlevel_read(struct hpsb_host *host, int nodeid, void *data,
read_lock
(
&
addr_space_lock
);
read_lock
(
&
addr_space_lock
);
entry
=
addr_space
.
next
;
entry
=
host
->
addr_space
.
next
;
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
while
(
as
->
start
<=
addr
)
{
while
(
as
->
start
<=
addr
)
{
...
@@ -536,7 +552,7 @@ int highlevel_write(struct hpsb_host *host, int nodeid, int destid,
...
@@ -536,7 +552,7 @@ int highlevel_write(struct hpsb_host *host, int nodeid, int destid,
read_lock
(
&
addr_space_lock
);
read_lock
(
&
addr_space_lock
);
entry
=
addr_space
.
next
;
entry
=
host
->
addr_space
.
next
;
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
while
(
as
->
start
<=
addr
)
{
while
(
as
->
start
<=
addr
)
{
...
@@ -582,7 +598,7 @@ int highlevel_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,
...
@@ -582,7 +598,7 @@ int highlevel_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,
read_lock
(
&
addr_space_lock
);
read_lock
(
&
addr_space_lock
);
entry
=
addr_space
.
next
;
entry
=
host
->
addr_space
.
next
;
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
while
(
as
->
start
<=
addr
)
{
while
(
as
->
start
<=
addr
)
{
...
@@ -615,7 +631,7 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
...
@@ -615,7 +631,7 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
read_lock
(
&
addr_space_lock
);
read_lock
(
&
addr_space_lock
);
entry
=
addr_space
.
next
;
entry
=
host
->
addr_space
.
next
;
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
as
=
list_entry
(
entry
,
struct
hpsb_address_serve
,
as_list
);
while
(
as
->
start
<=
addr
)
{
while
(
as
->
start
<=
addr
)
{
...
@@ -640,7 +656,7 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
...
@@ -640,7 +656,7 @@ int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
return
rcode
;
return
rcode
;
}
}
void
init_hpsb_highlevel
(
void
)
void
init_hpsb_highlevel
(
struct
hpsb_host
*
host
)
{
{
INIT_LIST_HEAD
(
&
dummy_zero_addr
.
as_list
);
INIT_LIST_HEAD
(
&
dummy_zero_addr
.
as_list
);
INIT_LIST_HEAD
(
&
dummy_zero_addr
.
addr_list
);
INIT_LIST_HEAD
(
&
dummy_zero_addr
.
addr_list
);
...
@@ -652,6 +668,6 @@ void init_hpsb_highlevel(void)
...
@@ -652,6 +668,6 @@ void init_hpsb_highlevel(void)
dummy_zero_addr
.
start
=
dummy_zero_addr
.
end
=
0
;
dummy_zero_addr
.
start
=
dummy_zero_addr
.
end
=
0
;
dummy_max_addr
.
start
=
dummy_max_addr
.
end
=
((
u64
)
1
)
<<
48
;
dummy_max_addr
.
start
=
dummy_max_addr
.
end
=
((
u64
)
1
)
<<
48
;
list_add_tail
(
&
dummy_zero_addr
.
as_list
,
&
addr_space
);
list_add_tail
(
&
dummy_zero_addr
.
as_list
,
&
host
->
addr_space
);
list_add_tail
(
&
dummy_max_addr
.
as_list
,
&
addr_space
);
list_add_tail
(
&
dummy_max_addr
.
as_list
,
&
host
->
addr_space
);
}
}
drivers/ieee1394/highlevel.h
View file @
072152fc
...
@@ -10,6 +10,8 @@ struct hpsb_address_serve {
...
@@ -10,6 +10,8 @@ struct hpsb_address_serve {
struct
hpsb_address_ops
*
op
;
struct
hpsb_address_ops
*
op
;
struct
hpsb_host
*
host
;
/* first address handled and first address behind, quadlet aligned */
/* first address handled and first address behind, quadlet aligned */
u64
start
,
end
;
u64
start
,
end
;
};
};
...
@@ -137,10 +139,11 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl);
...
@@ -137,10 +139,11 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl);
* It returns true for successful allocation. There is no unregister function,
* It returns true for successful allocation. There is no unregister function,
* all address spaces are deallocated together with the hpsb_highlevel.
* all address spaces are deallocated together with the hpsb_highlevel.
*/
*/
int
hpsb_register_addrspace
(
struct
hpsb_highlevel
*
hl
,
int
hpsb_register_addrspace
(
struct
hpsb_highlevel
*
hl
,
struct
hpsb_host
*
host
,
struct
hpsb_address_ops
*
ops
,
u64
start
,
u64
end
);
struct
hpsb_address_ops
*
ops
,
u64
start
,
u64
end
);
int
hpsb_unregister_addrspace
(
struct
hpsb_highlevel
*
hl
,
u64
start
);
int
hpsb_unregister_addrspace
(
struct
hpsb_highlevel
*
hl
,
struct
hpsb_host
*
host
,
u64
start
);
/*
/*
* Enable or disable receving a certain isochronous channel through the
* Enable or disable receving a certain isochronous channel through the
...
@@ -179,6 +182,6 @@ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *d
...
@@ -179,6 +182,6 @@ int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *d
struct
hpsb_host
*
hpsb_get_host_bykey
(
struct
hpsb_highlevel
*
hl
,
unsigned
long
key
);
struct
hpsb_host
*
hpsb_get_host_bykey
(
struct
hpsb_highlevel
*
hl
,
unsigned
long
key
);
/* Initialize the highlevel system */
/* Initialize the highlevel system */
void
init_hpsb_highlevel
(
void
);
void
init_hpsb_highlevel
(
struct
hpsb_host
*
host
);
#endif
/* IEEE1394_HIGHLEVEL_H */
#endif
/* IEEE1394_HIGHLEVEL_H */
drivers/ieee1394/hosts.c
View file @
072152fc
...
@@ -89,6 +89,8 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
...
@@ -89,6 +89,8 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
INIT_LIST_HEAD
(
&
h
->
pending_packets
);
INIT_LIST_HEAD
(
&
h
->
pending_packets
);
spin_lock_init
(
&
h
->
pending_pkt_lock
);
spin_lock_init
(
&
h
->
pending_pkt_lock
);
INIT_LIST_HEAD
(
&
h
->
addr_space
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
h
->
tpool
);
i
++
)
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
h
->
tpool
);
i
++
)
HPSB_TPOOL_INIT
(
&
h
->
tpool
[
i
]);
HPSB_TPOOL_INIT
(
&
h
->
tpool
[
i
]);
...
...
drivers/ieee1394/hosts.h
View file @
072152fc
...
@@ -69,6 +69,8 @@ struct hpsb_host {
...
@@ -69,6 +69,8 @@ struct hpsb_host {
int
id
;
int
id
;
struct
device
device
;
struct
device
device
;
struct
list_head
addr_space
;
};
};
...
...
drivers/ieee1394/ieee1394_core.c
View file @
072152fc
...
@@ -1009,7 +1009,6 @@ static int __init ieee1394_init(void)
...
@@ -1009,7 +1009,6 @@ static int __init ieee1394_init(void)
bus_register
(
&
ieee1394_bus_type
);
bus_register
(
&
ieee1394_bus_type
);
init_hpsb_highlevel
();
init_csr
();
init_csr
();
if
(
!
disable_nodemgr
)
if
(
!
disable_nodemgr
)
...
...
drivers/ieee1394/raw1394.c
View file @
072152fc
...
@@ -1696,7 +1696,7 @@ static int arm_register(struct file_info *fi, struct pending_request *req)
...
@@ -1696,7 +1696,7 @@ static int arm_register(struct file_info *fi, struct pending_request *req)
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
return
sizeof
(
struct
raw1394_request
);
return
sizeof
(
struct
raw1394_request
);
}
}
retval
=
hpsb_register_addrspace
(
&
raw1394_highlevel
,
&
arm_ops
,
req
->
req
.
address
,
retval
=
hpsb_register_addrspace
(
&
raw1394_highlevel
,
fi
->
host
,
&
arm_ops
,
req
->
req
.
address
,
req
->
req
.
address
+
req
->
req
.
length
);
req
->
req
.
address
+
req
->
req
.
length
);
if
(
retval
)
{
if
(
retval
)
{
/* INSERT ENTRY */
/* INSERT ENTRY */
...
@@ -1783,7 +1783,7 @@ static int arm_unregister(struct file_info *fi, struct pending_request *req)
...
@@ -1783,7 +1783,7 @@ static int arm_unregister(struct file_info *fi, struct pending_request *req)
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
return
sizeof
(
struct
raw1394_request
);
return
sizeof
(
struct
raw1394_request
);
}
}
retval
=
hpsb_unregister_addrspace
(
&
raw1394_highlevel
,
addr
->
start
);
retval
=
hpsb_unregister_addrspace
(
&
raw1394_highlevel
,
fi
->
host
,
addr
->
start
);
if
(
!
retval
)
{
if
(
!
retval
)
{
printk
(
KERN_ERR
"raw1394: arm_Unregister failed -> EINVAL
\n
"
);
printk
(
KERN_ERR
"raw1394: arm_Unregister failed -> EINVAL
\n
"
);
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
spin_unlock_irqrestore
(
&
host_info_lock
,
flags
);
...
@@ -2551,7 +2551,7 @@ static int raw1394_release(struct inode *inode, struct file *file)
...
@@ -2551,7 +2551,7 @@ static int raw1394_release(struct inode *inode, struct file *file)
}
}
if
(
!
another_host
)
{
if
(
!
another_host
)
{
DBGMSG
(
"raw1394_release: call hpsb_arm_unregister"
);
DBGMSG
(
"raw1394_release: call hpsb_arm_unregister"
);
retval
=
hpsb_unregister_addrspace
(
&
raw1394_highlevel
,
addr
->
start
);
retval
=
hpsb_unregister_addrspace
(
&
raw1394_highlevel
,
fi
->
host
,
addr
->
start
);
if
(
!
retval
)
{
if
(
!
retval
)
{
++
fail
;
++
fail
;
printk
(
KERN_ERR
"raw1394_release arm_Unregister failed
\n
"
);
printk
(
KERN_ERR
"raw1394_release arm_Unregister failed
\n
"
);
...
...
drivers/ieee1394/sbp2.c
View file @
072152fc
...
@@ -712,6 +712,18 @@ static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host)
...
@@ -712,6 +712,18 @@ static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host)
return
NULL
;
return
NULL
;
}
}
/* Register our sbp2 status address space... */
hpsb_register_addrspace
(
&
sbp2_highlevel
,
host
,
&
sbp2_ops
,
SBP2_STATUS_FIFO_ADDRESS
,
SBP2_STATUS_FIFO_ADDRESS
+
SBP2_STATUS_FIFO_ENTRY_TO_OFFSET
(
SBP2SCSI_MAX_SCSI_IDS
+
1
));
/* Handle data movement if physical dma is not enabled/supported
* on host controller */
#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
hpsb_register_addrspace
(
&
sbp2_highlevel
,
host
,
&
sbp2_physdma_ops
,
0x0ULL
,
0xfffffffcULL
);
#endif
hi
=
hpsb_create_hostinfo
(
&
sbp2_highlevel
,
host
,
sizeof
(
*
hi
));
hi
=
hpsb_create_hostinfo
(
&
sbp2_highlevel
,
host
,
sizeof
(
*
hi
));
if
(
!
hi
)
{
if
(
!
hi
)
{
SBP2_ERR
(
"failed to allocate hostinfo"
);
SBP2_ERR
(
"failed to allocate hostinfo"
);
...
@@ -2881,17 +2893,6 @@ static int sbp2_module_init(void)
...
@@ -2881,17 +2893,6 @@ static int sbp2_module_init(void)
/* Register our high level driver with 1394 stack */
/* Register our high level driver with 1394 stack */
hpsb_register_highlevel
(
&
sbp2_highlevel
);
hpsb_register_highlevel
(
&
sbp2_highlevel
);
/* Register our sbp2 status address space... */
hpsb_register_addrspace
(
&
sbp2_highlevel
,
&
sbp2_ops
,
SBP2_STATUS_FIFO_ADDRESS
,
SBP2_STATUS_FIFO_ADDRESS
+
SBP2_STATUS_FIFO_ENTRY_TO_OFFSET
(
SBP2SCSI_MAX_SCSI_IDS
+
1
));
/* Handle data movement if physical dma is not enabled/supported
* on host controller */
#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
hpsb_register_addrspace
(
&
sbp2_highlevel
,
&
sbp2_physdma_ops
,
0x0ULL
,
0xfffffffcULL
);
#endif
hpsb_register_protocol
(
&
sbp2_driver
);
hpsb_register_protocol
(
&
sbp2_driver
);
return
0
;
return
0
;
...
...
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