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
0f8b375f
Commit
0f8b375f
authored
Feb 19, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://gkernel.bkbits.net/net-drivers-2.5
into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents
1f0bb3eb
6bac5a4d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
40 additions
and
24 deletions
+40
-24
drivers/ide/ppc/pmac.c
drivers/ide/ppc/pmac.c
+28
-23
drivers/net/sungem.c
drivers/net/sungem.c
+12
-1
No files found.
drivers/ide/ppc/pmac.c
View file @
0f8b375f
...
...
@@ -55,7 +55,7 @@ extern void ide_do_request(ide_hwgroup_t *hwgroup, int masked_irq);
#define IDE_PMAC_DEBUG
#define DMA_WAIT_TIMEOUT
10
0
#define DMA_WAIT_TIMEOUT
5
0
typedef
struct
pmac_ide_hwif
{
unsigned
long
regbase
;
...
...
@@ -2026,8 +2026,11 @@ pmac_ide_dma_end (ide_drive_t *drive)
dstat
=
readl
(
&
dma
->
status
);
writel
(((
RUN
|
WAKE
|
DEAD
)
<<
16
),
&
dma
->
control
);
pmac_ide_destroy_dmatable
(
drive
);
/* verify good dma status */
return
(
dstat
&
(
RUN
|
DEAD
|
ACTIVE
))
!=
RUN
;
/* verify good dma status. we don't check for ACTIVE beeing 0. We should...
* in theory, but with ATAPI decices doing buffer underruns, that would
* cause us to disable DMA, which isn't what we want
*/
return
(
dstat
&
(
RUN
|
DEAD
))
!=
RUN
;
}
/*
...
...
@@ -2041,7 +2044,7 @@ pmac_ide_dma_test_irq (ide_drive_t *drive)
{
pmac_ide_hwif_t
*
pmif
=
(
pmac_ide_hwif_t
*
)
HWIF
(
drive
)
->
hwif_data
;
volatile
struct
dbdma_regs
*
dma
;
unsigned
long
status
;
unsigned
long
status
,
timeout
;
if
(
pmif
==
NULL
)
return
0
;
...
...
@@ -2057,17 +2060,8 @@ pmac_ide_dma_test_irq (ide_drive_t *drive)
* - The dbdma fifo hasn't yet finished flushing to
* to system memory when the disk interrupt occurs.
*
* The trick here is to increment drive->waiting_for_dma,
* and return as if no interrupt occurred. If the counter
* reach a certain timeout value, we then return 1. If
* we really got the interrupt, it will happen right away
* again.
* Apple's solution here may be more elegant. They issue
* a DMA channel interrupt (a separate irq line) via a DBDMA
* NOP command just before the STOP, and wait for both the
* disk and DBDMA interrupts to have completed.
*/
/* If ACTIVE is cleared, the STOP command have passed and
* transfer is complete.
*/
...
...
@@ -2079,15 +2073,26 @@ pmac_ide_dma_test_irq (ide_drive_t *drive)
called while not waiting
\n
"
,
HWIF
(
drive
)
->
index
);
/* If dbdma didn't execute the STOP command yet, the
* active bit is still set */
drive
->
waiting_for_dma
++
;
if
(
drive
->
waiting_for_dma
>=
DMA_WAIT_TIMEOUT
)
{
printk
(
KERN_WARNING
"ide%d, timeout waiting \
for dbdma command stop
\n
"
,
HWIF
(
drive
)
->
index
);
return
1
;
}
udelay
(
5
);
return
0
;
* active bit is still set. We consider that we aren't
* sharing interrupts (which is hopefully the case with
* those controllers) and so we just try to flush the
* channel for pending data in the fifo
*/
udelay
(
1
);
writel
((
FLUSH
<<
16
)
|
FLUSH
,
&
dma
->
control
);
timeout
=
0
;
for
(;;)
{
udelay
(
1
);
status
=
readl
(
&
dma
->
status
);
if
((
status
&
FLUSH
)
==
0
)
break
;
if
(
++
timeout
>
100
)
{
printk
(
KERN_WARNING
"ide%d, ide_dma_test_irq \
timeout flushing channel
\n
"
,
HWIF
(
drive
)
->
index
);
break
;
}
}
return
1
;
}
static
int
__pmac
...
...
drivers/net/sungem.c
View file @
0f8b375f
...
...
@@ -654,6 +654,7 @@ static __inline__ void gem_post_rxds(struct gem *gp, int limit)
cluster_start
=
curr
=
(
gp
->
rx_new
&
~
(
4
-
1
));
count
=
0
;
kick
=
-
1
;
wmb
();
while
(
curr
!=
limit
)
{
curr
=
NEXT_RX
(
curr
);
if
(
++
count
==
4
)
{
...
...
@@ -670,8 +671,10 @@ static __inline__ void gem_post_rxds(struct gem *gp, int limit)
count
=
0
;
}
}
if
(
kick
>=
0
)
if
(
kick
>=
0
)
{
mb
();
writel
(
kick
,
gp
->
regs
+
RXDMA_KICK
);
}
}
static
void
gem_rx
(
struct
gem
*
gp
)
...
...
@@ -884,6 +887,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
if
(
gem_intme
(
entry
))
ctrl
|=
TXDCTRL_INTME
;
txd
->
buffer
=
cpu_to_le64
(
mapping
);
wmb
();
txd
->
control_word
=
cpu_to_le64
(
ctrl
);
entry
=
NEXT_TX
(
entry
);
}
else
{
...
...
@@ -923,6 +927,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
txd
=
&
gp
->
init_block
->
txd
[
entry
];
txd
->
buffer
=
cpu_to_le64
(
mapping
);
wmb
();
txd
->
control_word
=
cpu_to_le64
(
this_ctrl
|
len
);
if
(
gem_intme
(
entry
))
...
...
@@ -932,6 +937,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
}
txd
=
&
gp
->
init_block
->
txd
[
first_entry
];
txd
->
buffer
=
cpu_to_le64
(
first_mapping
);
wmb
();
txd
->
control_word
=
cpu_to_le64
(
ctrl
|
TXDCTRL_SOF
|
intme
|
first_len
);
}
...
...
@@ -943,6 +949,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
if
(
netif_msg_tx_queued
(
gp
))
printk
(
KERN_DEBUG
"%s: tx queued, slot %d, skblen %d
\n
"
,
dev
->
name
,
entry
,
skb
->
len
);
mb
();
writel
(
gp
->
tx_new
,
gp
->
regs
+
TXDMA_KICK
);
spin_unlock_irq
(
&
gp
->
lock
);
...
...
@@ -1418,6 +1425,7 @@ static void gem_clean_rings(struct gem *gp)
gp
->
rx_skbs
[
i
]
=
NULL
;
}
rxd
->
status_word
=
0
;
wmb
();
rxd
->
buffer
=
0
;
}
...
...
@@ -1478,6 +1486,7 @@ static void gem_init_rings(struct gem *gp)
RX_BUF_ALLOC_SIZE
(
gp
),
PCI_DMA_FROMDEVICE
);
rxd
->
buffer
=
cpu_to_le64
(
dma_addr
);
wmb
();
rxd
->
status_word
=
cpu_to_le64
(
RXDCTRL_FRESH
(
gp
));
skb_reserve
(
skb
,
RX_OFFSET
);
}
...
...
@@ -1486,8 +1495,10 @@ static void gem_init_rings(struct gem *gp)
struct
gem_txd
*
txd
=
&
gb
->
txd
[
i
];
txd
->
control_word
=
0
;
wmb
();
txd
->
buffer
=
0
;
}
wmb
();
}
/* Must be invoked under gp->lock. */
...
...
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