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
f69e4170
Commit
f69e4170
authored
Jan 29, 2009
by
David Woodhouse
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
solos: Tidy up tx_mask handling for ports which need TX
Signed-off-by:
David Woodhouse
<
David.Woodhouse@intel.com
>
parent
eaf83e39
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
13 additions
and
7 deletions
+13
-7
drivers/atm/solos-pci.c
drivers/atm/solos-pci.c
+13
-7
No files found.
drivers/atm/solos-pci.c
View file @
f69e4170
...
...
@@ -100,6 +100,7 @@ struct solos_card {
void
__iomem
*
config_regs
;
void
__iomem
*
buffers
;
int
nr_ports
;
int
tx_mask
;
struct
pci_dev
*
dev
;
struct
atm_dev
*
atmdev
[
4
];
struct
tasklet_struct
tlet
;
...
...
@@ -590,15 +591,13 @@ void solos_bh(unsigned long card_arg)
struct
solos_card
*
card
=
(
void
*
)
card_arg
;
int
port
;
uint32_t
card_flags
;
uint32_t
tx_mask
;
uint32_t
rx_done
=
0
;
card_flags
=
ioread32
(
card
->
config_regs
+
FLAGS_ADDR
);
/* The TX bits are set if the channel is busy; clear if not. We want to
invoke fpga_tx() unless _all_ the bits for active channels are set */
tx_mask
=
(
1
<<
card
->
nr_ports
)
-
1
;
if
((
card_flags
&
tx_mask
)
!=
tx_mask
)
if
((
card_flags
&
card
->
tx_mask
)
!=
card
->
tx_mask
)
fpga_tx
(
card
);
for
(
port
=
0
;
port
<
card
->
nr_ports
;
port
++
)
{
...
...
@@ -887,15 +886,20 @@ static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb,
struct
atm_vcc
*
vcc
)
{
int
old_len
;
unsigned
long
flags
;
SKB_CB
(
skb
)
->
vcc
=
vcc
;
spin_lock
(
&
card
->
tx_queue_lock
);
spin_lock
_irqsave
(
&
card
->
tx_queue_lock
,
flags
);
old_len
=
skb_queue_len
(
&
card
->
tx_queue
[
port
]);
skb_queue_tail
(
&
card
->
tx_queue
[
port
],
skb
);
spin_unlock
(
&
card
->
tx_queue_lock
);
if
(
!
old_len
)
{
card
->
tx_mask
|=
(
1
<<
port
);
}
spin_unlock_irqrestore
(
&
card
->
tx_queue_lock
,
flags
);
/* If TX might need to be started, do so */
/* Theoretically we could just schedule the tasklet here, but
that introduces latency we don't want -- it's noticeable */
if
(
!
old_len
)
fpga_tx
(
card
);
}
...
...
@@ -911,7 +915,7 @@ static int fpga_tx(struct solos_card *card)
spin_lock_irqsave
(
&
card
->
tx_lock
,
flags
);
tx_pending
=
ioread32
(
card
->
config_regs
+
FLAGS_ADDR
);
tx_pending
=
ioread32
(
card
->
config_regs
+
FLAGS_ADDR
)
&
card
->
tx_mask
;
dev_vdbg
(
&
card
->
dev
->
dev
,
"TX Flags are %X
\n
"
,
tx_pending
);
...
...
@@ -925,6 +929,8 @@ static int fpga_tx(struct solos_card *card)
spin_lock
(
&
card
->
tx_queue_lock
);
skb
=
skb_dequeue
(
&
card
->
tx_queue
[
port
]);
if
(
!
skb
)
card
->
tx_mask
&=
~
(
1
<<
port
);
spin_unlock
(
&
card
->
tx_queue_lock
);
if
(
skb
&&
!
card
->
using_dma
)
{
...
...
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