Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
23cb3ada
Commit
23cb3ada
authored
Dec 18, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394
parents
27f4e083
16e842a6
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
58 additions
and
10 deletions
+58
-10
drivers/ieee1394/hosts.h
drivers/ieee1394/hosts.h
+1
-0
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.c
+57
-10
No files found.
drivers/ieee1394/hosts.h
View file @
23cb3ada
...
@@ -41,6 +41,7 @@ struct hpsb_host {
...
@@ -41,6 +41,7 @@ struct hpsb_host {
/* this nodes state */
/* this nodes state */
unsigned
in_bus_reset
:
1
;
unsigned
in_bus_reset
:
1
;
unsigned
is_shutdown
:
1
;
unsigned
is_shutdown
:
1
;
unsigned
resume_packet_sent
:
1
;
/* this nodes' duties on the bus */
/* this nodes' duties on the bus */
unsigned
is_root
:
1
;
unsigned
is_root
:
1
;
...
...
drivers/ieee1394/nodemgr.c
View file @
23cb3ada
...
@@ -1349,6 +1349,33 @@ static void nodemgr_update_pdrv(struct node_entry *ne)
...
@@ -1349,6 +1349,33 @@ static void nodemgr_update_pdrv(struct node_entry *ne)
}
}
/* Write the BROADCAST_CHANNEL as per IEEE1394a 8.3.2.3.11 and 8.4.2.3. This
* seems like an optional service but in the end it is practically mandatory
* as a consequence of these clauses.
*
* Note that we cannot do a broadcast write to all nodes at once because some
* pre-1394a devices would hang. */
static
void
nodemgr_irm_write_bc
(
struct
node_entry
*
ne
,
int
generation
)
{
const
u64
bc_addr
=
(
CSR_REGISTER_BASE
|
CSR_BROADCAST_CHANNEL
);
quadlet_t
bc_remote
,
bc_local
;
int
ret
;
if
(
!
ne
->
host
->
is_irm
||
ne
->
generation
!=
generation
||
ne
->
nodeid
==
ne
->
host
->
node_id
)
return
;
bc_local
=
cpu_to_be32
(
ne
->
host
->
csr
.
broadcast_channel
);
/* Check if the register is implemented and 1394a compliant. */
ret
=
hpsb_read
(
ne
->
host
,
ne
->
nodeid
,
generation
,
bc_addr
,
&
bc_remote
,
sizeof
(
bc_remote
));
if
(
!
ret
&&
bc_remote
&
cpu_to_be32
(
0x80000000
)
&&
bc_remote
!=
bc_local
)
hpsb_node_write
(
ne
,
bc_addr
,
&
bc_local
,
sizeof
(
bc_local
));
}
static
void
nodemgr_probe_ne
(
struct
host_info
*
hi
,
struct
node_entry
*
ne
,
int
generation
)
static
void
nodemgr_probe_ne
(
struct
host_info
*
hi
,
struct
node_entry
*
ne
,
int
generation
)
{
{
struct
device
*
dev
;
struct
device
*
dev
;
...
@@ -1360,6 +1387,8 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge
...
@@ -1360,6 +1387,8 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge
if
(
!
dev
)
if
(
!
dev
)
return
;
return
;
nodemgr_irm_write_bc
(
ne
,
generation
);
/* If "needs_probe", then this is either a new or changed node we
/* If "needs_probe", then this is either a new or changed node we
* rescan totally. If the generation matches for an existing node
* rescan totally. If the generation matches for an existing node
* (one that existed prior to the bus reset) we send update calls
* (one that existed prior to the bus reset) we send update calls
...
@@ -1413,9 +1442,25 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
...
@@ -1413,9 +1442,25 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
return
;
return
;
}
}
/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
static
int
nodemgr_send_resume_packet
(
struct
hpsb_host
*
host
)
* nodes of the broadcast channel. (Really we're only setting the validity
{
* bit). Other IRM responsibilities go in here as well. */
struct
hpsb_packet
*
packet
;
int
ret
=
1
;
packet
=
hpsb_make_phypacket
(
host
,
0x003c0000
|
NODEID_TO_NODE
(
host
->
node_id
)
<<
24
);
if
(
packet
)
{
packet
->
no_waiter
=
1
;
packet
->
generation
=
get_hpsb_generation
(
host
);
ret
=
hpsb_send_packet
(
packet
);
}
if
(
ret
)
HPSB_WARN
(
"fw-host%d: Failed to broadcast resume packet"
,
host
->
id
);
return
ret
;
}
/* Perform a few high-level IRM responsibilities. */
static
int
nodemgr_do_irm_duties
(
struct
hpsb_host
*
host
,
int
cycles
)
static
int
nodemgr_do_irm_duties
(
struct
hpsb_host
*
host
,
int
cycles
)
{
{
quadlet_t
bc
;
quadlet_t
bc
;
...
@@ -1424,13 +1469,8 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
...
@@ -1424,13 +1469,8 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
if
(
!
host
->
is_irm
||
host
->
irm_id
==
(
nodeid_t
)
-
1
)
if
(
!
host
->
is_irm
||
host
->
irm_id
==
(
nodeid_t
)
-
1
)
return
1
;
return
1
;
host
->
csr
.
broadcast_channel
|=
0x40000000
;
/* set validity bit */
/* We are a 1394a-2000 compliant IRM. Set the validity bit. */
host
->
csr
.
broadcast_channel
|=
0x40000000
;
bc
=
cpu_to_be32
(
host
->
csr
.
broadcast_channel
);
hpsb_write
(
host
,
LOCAL_BUS
|
ALL_NODES
,
get_hpsb_generation
(
host
),
(
CSR_REGISTER_BASE
|
CSR_BROADCAST_CHANNEL
),
&
bc
,
sizeof
(
quadlet_t
));
/* If there is no bus manager then we should set the root node's
/* If there is no bus manager then we should set the root node's
* force_root bit to promote bus stability per the 1394
* force_root bit to promote bus stability per the 1394
...
@@ -1463,6 +1503,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
...
@@ -1463,6 +1503,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
}
}
}
}
/* Some devices suspend their ports while being connected to an inactive
* host adapter, i.e. if connected before the low-level driver is
* loaded. They become visible either when physically unplugged and
* replugged, or when receiving a resume packet. Send one once. */
if
(
!
host
->
resume_packet_sent
&&
!
nodemgr_send_resume_packet
(
host
))
host
->
resume_packet_sent
=
1
;
return
1
;
return
1
;
}
}
...
...
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