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
abc9d91a
Commit
abc9d91a
authored
Jul 09, 2008
by
Krzysztof Hałasa
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WAN: convert HD64572-based drivers to NAPI.
Signed-off-by:
Krzysztof Hałasa
<
khc@pm.waw.pl
>
parent
30224392
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
71 additions
and
37 deletions
+71
-37
drivers/net/wan/hd64572.c
drivers/net/wan/hd64572.c
+67
-35
drivers/net/wan/pc300too.c
drivers/net/wan/pc300too.c
+2
-1
drivers/net/wan/pci200syn.c
drivers/net/wan/pci200syn.c
+2
-1
No files found.
drivers/net/wan/hd64572.c
View file @
abc9d91a
/*
/*
* Hitachi (now Renesas) SCA-II HD64572 driver for Linux
* Hitachi (now Renesas) SCA-II HD64572 driver for Linux
*
*
* Copyright (C) 1998-200
3
Krzysztof Halasa <khc@pm.waw.pl>
* Copyright (C) 1998-200
8
Krzysztof Halasa <khc@pm.waw.pl>
*
*
* This program is free software; you can redistribute it and/or modify it
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License
* under the terms of version 2 of the GNU General Public License
...
@@ -45,6 +45,8 @@
...
@@ -45,6 +45,8 @@
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include "hd64572.h"
#include "hd64572.h"
#define NAPI_WEIGHT 16
#define get_msci(port) (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET)
#define get_msci(port) (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET)
#define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)
#define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)
#define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)
#define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)
...
@@ -53,6 +55,7 @@
...
@@ -53,6 +55,7 @@
#define SCA_INTR_DMAC_RX(node) (node ? 0x20 : 0x02)
#define SCA_INTR_DMAC_RX(node) (node ? 0x20 : 0x02)
#define SCA_INTR_DMAC_TX(node) (node ? 0x40 : 0x04)
#define SCA_INTR_DMAC_TX(node) (node ? 0x40 : 0x04)
static
int
sca_poll
(
struct
napi_struct
*
napi
,
int
budget
);
static
inline
struct
net_device
*
port_to_dev
(
port_t
*
port
)
static
inline
struct
net_device
*
port_to_dev
(
port_t
*
port
)
{
{
...
@@ -86,6 +89,20 @@ static inline port_t* dev_to_port(struct net_device *dev)
...
@@ -86,6 +89,20 @@ static inline port_t* dev_to_port(struct net_device *dev)
return
dev_to_hdlc
(
dev
)
->
priv
;
return
dev_to_hdlc
(
dev
)
->
priv
;
}
}
static
inline
void
enable_intr
(
port_t
*
port
)
{
/* DMA & MSCI IRQ enable */
/* IR0_TXINT | IR0_RXINTA | IR0_DMIB* | IR0_DMIA* */
sca_outl
(
sca_inl
(
IER0
,
port
->
card
)
|
(
phy_node
(
port
)
?
0x0A006600
:
0x000A0066
),
IER0
,
port
->
card
);
}
static
inline
void
disable_intr
(
port_t
*
port
)
{
sca_outl
(
sca_inl
(
IER0
,
port
->
card
)
&
(
phy_node
(
port
)
?
0x00FF00FF
:
0xFF00FF00
),
IER0
,
port
->
card
);
}
static
inline
u16
next_desc
(
port_t
*
port
,
u16
desc
,
int
transmit
)
static
inline
u16
next_desc
(
port_t
*
port
,
u16
desc
,
int
transmit
)
{
{
return
(
desc
+
1
)
%
(
transmit
?
port_to_card
(
port
)
->
tx_ring_buffers
return
(
desc
+
1
)
%
(
transmit
?
port_to_card
(
port
)
->
tx_ring_buffers
...
@@ -206,6 +223,7 @@ static void sca_init_port(port_t *port)
...
@@ -206,6 +223,7 @@ static void sca_init_port(port_t *port)
}
}
}
}
sca_set_carrier
(
port
);
sca_set_carrier
(
port
);
netif_napi_add
(
port_to_dev
(
port
),
&
port
->
napi
,
sca_poll
,
NAPI_WEIGHT
);
}
}
...
@@ -256,17 +274,18 @@ static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc,
...
@@ -256,17 +274,18 @@ static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc,
dev
->
stats
.
rx_packets
++
;
dev
->
stats
.
rx_packets
++
;
dev
->
stats
.
rx_bytes
+=
skb
->
len
;
dev
->
stats
.
rx_bytes
+=
skb
->
len
;
skb
->
protocol
=
hdlc_type_trans
(
skb
,
dev
);
skb
->
protocol
=
hdlc_type_trans
(
skb
,
dev
);
netif_r
x
(
skb
);
netif_r
eceive_skb
(
skb
);
}
}
/* Receive DMA
interrupt
service */
/* Receive DMA service */
static
inline
void
sca_rx_intr
(
port_t
*
por
t
)
static
inline
int
sca_rx_done
(
port_t
*
port
,
int
budge
t
)
{
{
struct
net_device
*
dev
=
port_to_dev
(
port
);
struct
net_device
*
dev
=
port_to_dev
(
port
);
u16
dmac
=
get_dmac_rx
(
port
);
u16
dmac
=
get_dmac_rx
(
port
);
card_t
*
card
=
port_to_card
(
port
);
card_t
*
card
=
port_to_card
(
port
);
u8
stat
=
sca_in
(
DSR_RX
(
phy_node
(
port
)),
card
);
/* read DMA Status */
u8
stat
=
sca_in
(
DSR_RX
(
phy_node
(
port
)),
card
);
/* read DMA Status */
int
received
=
0
;
/* Reset DSR status bits */
/* Reset DSR status bits */
sca_out
((
stat
&
(
DSR_EOT
|
DSR_EOM
|
DSR_BOF
|
DSR_COF
))
|
DSR_DWE
,
sca_out
((
stat
&
(
DSR_EOT
|
DSR_EOM
|
DSR_BOF
|
DSR_COF
))
|
DSR_DWE
,
...
@@ -276,7 +295,7 @@ static inline void sca_rx_intr(port_t *port)
...
@@ -276,7 +295,7 @@ static inline void sca_rx_intr(port_t *port)
/* Dropped one or more frames */
/* Dropped one or more frames */
dev
->
stats
.
rx_over_errors
++
;
dev
->
stats
.
rx_over_errors
++
;
while
(
1
)
{
while
(
received
<
budget
)
{
u32
desc_off
=
desc_offset
(
port
,
port
->
rxin
,
0
);
u32
desc_off
=
desc_offset
(
port
,
port
->
rxin
,
0
);
pkt_desc
__iomem
*
desc
;
pkt_desc
__iomem
*
desc
;
u32
cda
=
sca_inl
(
dmac
+
CDAL
,
card
);
u32
cda
=
sca_inl
(
dmac
+
CDAL
,
card
);
...
@@ -299,8 +318,10 @@ static inline void sca_rx_intr(port_t *port)
...
@@ -299,8 +318,10 @@ static inline void sca_rx_intr(port_t *port)
dev
->
stats
.
rx_crc_errors
++
;
dev
->
stats
.
rx_crc_errors
++
;
if
(
stat
&
ST_RX_EOM
)
if
(
stat
&
ST_RX_EOM
)
port
->
rxpart
=
0
;
/* received last fragment */
port
->
rxpart
=
0
;
/* received last fragment */
}
else
}
else
{
sca_rx
(
card
,
port
,
desc
,
port
->
rxin
);
sca_rx
(
card
,
port
,
desc
,
port
->
rxin
);
received
++
;
}
/* Set new error descriptor address */
/* Set new error descriptor address */
sca_outl
(
desc_off
,
dmac
+
EDAL
,
card
);
sca_outl
(
desc_off
,
dmac
+
EDAL
,
card
);
...
@@ -309,11 +330,12 @@ static inline void sca_rx_intr(port_t *port)
...
@@ -309,11 +330,12 @@ static inline void sca_rx_intr(port_t *port)
/* make sure RX DMA is enabled */
/* make sure RX DMA is enabled */
sca_out
(
DSR_DE
,
DSR_RX
(
phy_node
(
port
)),
card
);
sca_out
(
DSR_DE
,
DSR_RX
(
phy_node
(
port
)),
card
);
return
received
;
}
}
/* Transmit DMA
interrupt
service */
/* Transmit DMA service */
static
inline
void
sca_tx_
intr
(
port_t
*
port
)
static
inline
void
sca_tx_
done
(
port_t
*
port
)
{
{
struct
net_device
*
dev
=
port_to_dev
(
port
);
struct
net_device
*
dev
=
port_to_dev
(
port
);
u16
dmac
=
get_dmac_tx
(
port
);
u16
dmac
=
get_dmac_tx
(
port
);
...
@@ -348,27 +370,43 @@ static inline void sca_tx_intr(port_t *port)
...
@@ -348,27 +370,43 @@ static inline void sca_tx_intr(port_t *port)
}
}
static
int
sca_poll
(
struct
napi_struct
*
napi
,
int
budget
)
{
port_t
*
port
=
container_of
(
napi
,
port_t
,
napi
);
u8
stat
=
sca_intr_status
(
port
->
card
);
int
received
=
0
;
if
(
stat
&
SCA_INTR_MSCI
(
port
->
phy_node
))
sca_msci_intr
(
port
);
if
(
stat
&
SCA_INTR_DMAC_TX
(
port
->
phy_node
))
sca_tx_done
(
port
);
if
(
stat
&
SCA_INTR_DMAC_RX
(
port
->
phy_node
))
received
=
sca_rx_done
(
port
,
budget
);
if
(
received
<
budget
)
{
netif_rx_complete
(
port
->
dev
,
napi
);
enable_intr
(
port
);
}
return
received
;
}
static
irqreturn_t
sca_intr
(
int
irq
,
void
*
dev_id
)
static
irqreturn_t
sca_intr
(
int
irq
,
void
*
dev_id
)
{
{
card_t
*
card
=
dev_id
;
card_t
*
card
=
dev_id
;
int
i
;
int
i
;
u8
stat
;
u8
stat
=
sca_intr_status
(
card
)
;
int
handled
=
0
;
int
handled
=
0
;
while
((
stat
=
sca_intr_status
(
card
))
!=
0
)
{
handled
=
1
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
port_t
*
port
=
get_port
(
card
,
i
);
port_t
*
port
=
get_port
(
card
,
i
);
if
(
port
)
{
if
(
port
&&
(
stat
&
(
SCA_INTR_MSCI
(
i
)
|
SCA_INTR_DMAC_RX
(
i
)
|
if
(
stat
&
SCA_INTR_MSCI
(
i
))
SCA_INTR_DMAC_TX
(
i
))))
{
sca_msci_intr
(
port
);
handled
=
1
;
disable_intr
(
port
);
if
(
stat
&
SCA_INTR_DMAC_RX
(
i
))
netif_rx_schedule
(
port
->
dev
,
&
port
->
napi
);
sca_rx_intr
(
port
);
if
(
stat
&
SCA_INTR_DMAC_TX
(
i
))
sca_tx_intr
(
port
);
}
}
}
}
}
...
@@ -470,18 +508,12 @@ static void sca_open(struct net_device *dev)
...
@@ -470,18 +508,12 @@ static void sca_open(struct net_device *dev)
sca_out
(
0x3F
,
msci
+
TNR1
,
card
);
/* +1=TX DMA deactivation condition*/
sca_out
(
0x3F
,
msci
+
TNR1
,
card
);
/* +1=TX DMA deactivation condition*/
/* We're using the following interrupts:
/* We're using the following interrupts:
- TXINT (DMAC completed all transmisions, underrun or DCD change)
- TXINT (DMAC completed all transmis
s
ions, underrun or DCD change)
- all DMA interrupts
- all DMA interrupts
*/
*/
sca_set_carrier
(
port
);
/* MSCI TXINT and RXINTA interrupt enable */
/* MSCI TXINT and RXINTA interrupt enable */
sca_outl
(
IE0_TXINT
|
IE0_RXINTA
|
IE0_UDRN
|
IE0_CDCD
,
msci
+
IE0
,
sca_outl
(
IE0_TXINT
|
IE0_RXINTA
|
IE0_UDRN
|
IE0_CDCD
,
msci
+
IE0
,
card
);
card
);
/* DMA & MSCI IRQ enable */
sca_outl
(
sca_inl
(
IER0
,
card
)
|
(
phy_node
(
port
)
?
0x0A006600
:
0x000A0066
),
IER0
,
card
);
sca_out
(
port
->
tmc
,
msci
+
TMCR
,
card
);
sca_out
(
port
->
tmc
,
msci
+
TMCR
,
card
);
sca_out
(
port
->
tmc
,
msci
+
TMCT
,
card
);
sca_out
(
port
->
tmc
,
msci
+
TMCT
,
card
);
...
@@ -490,6 +522,9 @@ static void sca_open(struct net_device *dev)
...
@@ -490,6 +522,9 @@ static void sca_open(struct net_device *dev)
sca_out
(
CMD_TX_ENABLE
,
msci
+
CMD
,
card
);
sca_out
(
CMD_TX_ENABLE
,
msci
+
CMD
,
card
);
sca_out
(
CMD_RX_ENABLE
,
msci
+
CMD
,
card
);
sca_out
(
CMD_RX_ENABLE
,
msci
+
CMD
,
card
);
sca_set_carrier
(
port
);
enable_intr
(
port
);
napi_enable
(
&
port
->
napi
);
netif_start_queue
(
dev
);
netif_start_queue
(
dev
);
}
}
...
@@ -497,14 +532,11 @@ static void sca_open(struct net_device *dev)
...
@@ -497,14 +532,11 @@ static void sca_open(struct net_device *dev)
static
void
sca_close
(
struct
net_device
*
dev
)
static
void
sca_close
(
struct
net_device
*
dev
)
{
{
port_t
*
port
=
dev_to_port
(
dev
);
port_t
*
port
=
dev_to_port
(
dev
);
card_t
*
card
=
port_to_card
(
port
);
/* reset channel */
/* reset channel */
sca_out
(
CMD_RESET
,
get_msci
(
port
)
+
CMD
,
port_to_card
(
port
));
sca_out
(
CMD_RESET
,
get_msci
(
port
)
+
CMD
,
port_to_card
(
port
));
/* disable DMA & MSCI IRQ */
disable_intr
(
port
);
sca_outl
(
sca_inl
(
IER0
,
card
)
&
napi_disable
(
&
port
->
napi
);
(
phy_node
(
port
)
?
0x00FF00FF
:
0xFF00FF00
),
IER0
,
card
);
netif_stop_queue
(
dev
);
netif_stop_queue
(
dev
);
}
}
...
...
drivers/net/wan/pc300too.c
View file @
abc9d91a
...
@@ -78,6 +78,7 @@ typedef struct {
...
@@ -78,6 +78,7 @@ typedef struct {
typedef
struct
port_s
{
typedef
struct
port_s
{
struct
napi_struct
napi
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
struct
card_s
*
card
;
struct
card_s
*
card
;
spinlock_t
lock
;
/* TX lock */
spinlock_t
lock
;
/* TX lock */
...
@@ -481,6 +482,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
...
@@ -481,6 +482,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
else
else
port
->
iface
=
IF_IFACE_V35
;
port
->
iface
=
IF_IFACE_V35
;
sca_init_port
(
port
);
if
(
register_hdlc_device
(
dev
))
{
if
(
register_hdlc_device
(
dev
))
{
printk
(
KERN_ERR
"pc300: unable to register hdlc "
printk
(
KERN_ERR
"pc300: unable to register hdlc "
"device
\n
"
);
"device
\n
"
);
...
@@ -488,7 +490,6 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
...
@@ -488,7 +490,6 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
pc300_pci_remove_one
(
pdev
);
pc300_pci_remove_one
(
pdev
);
return
-
ENOBUFS
;
return
-
ENOBUFS
;
}
}
sca_init_port
(
port
);
/* Set up SCA memory */
printk
(
KERN_INFO
"%s: PC300 node %d
\n
"
,
printk
(
KERN_INFO
"%s: PC300 node %d
\n
"
,
dev
->
name
,
port
->
phy_node
);
dev
->
name
,
port
->
phy_node
);
...
...
drivers/net/wan/pci200syn.c
View file @
abc9d91a
...
@@ -65,6 +65,7 @@ typedef struct {
...
@@ -65,6 +65,7 @@ typedef struct {
typedef
struct
port_s
{
typedef
struct
port_s
{
struct
napi_struct
napi
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
struct
card_s
*
card
;
struct
card_s
*
card
;
spinlock_t
lock
;
/* TX lock */
spinlock_t
lock
;
/* TX lock */
...
@@ -423,6 +424,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
...
@@ -423,6 +424,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
hdlc
->
xmit
=
sca_xmit
;
hdlc
->
xmit
=
sca_xmit
;
port
->
settings
.
clock_type
=
CLOCK_EXT
;
port
->
settings
.
clock_type
=
CLOCK_EXT
;
port
->
card
=
card
;
port
->
card
=
card
;
sca_init_port
(
port
);
if
(
register_hdlc_device
(
dev
))
{
if
(
register_hdlc_device
(
dev
))
{
printk
(
KERN_ERR
"pci200syn: unable to register hdlc "
printk
(
KERN_ERR
"pci200syn: unable to register hdlc "
"device
\n
"
);
"device
\n
"
);
...
@@ -430,7 +432,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
...
@@ -430,7 +432,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
pci200_pci_remove_one
(
pdev
);
pci200_pci_remove_one
(
pdev
);
return
-
ENOBUFS
;
return
-
ENOBUFS
;
}
}
sca_init_port
(
port
);
/* Set up SCA memory */
printk
(
KERN_INFO
"%s: PCI200SYN node %d
\n
"
,
printk
(
KERN_INFO
"%s: PCI200SYN node %d
\n
"
,
dev
->
name
,
port
->
phy_node
);
dev
->
name
,
port
->
phy_node
);
...
...
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