Commit 34c1b089 authored by David S. Miller's avatar David S. Miller

Merge branch 'fs_enet-opt'

Christophe Leroy says:

====================
Optimisation of fs_enet ethernet driver

This set optimises the freescale fs_enet ethernet driver:
1/ Merge of RX and TX NAPI functions in order to limit the amount of
interrupts
2/ Do not unmap DMA when packets len is below copybreak, otherwise there
is no benefit in copying the skb instead of allocating a new one
3/ Make copybreak value configurable as the optimised value is not the
same on all targets
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d1ba24fe b0ba357b
...@@ -81,12 +81,9 @@ struct fs_ops { ...@@ -81,12 +81,9 @@ struct fs_ops {
void (*adjust_link)(struct net_device *dev); void (*adjust_link)(struct net_device *dev);
void (*restart)(struct net_device *dev); void (*restart)(struct net_device *dev);
void (*stop)(struct net_device *dev); void (*stop)(struct net_device *dev);
void (*napi_clear_rx_event)(struct net_device *dev); void (*napi_clear_event)(struct net_device *dev);
void (*napi_enable_rx)(struct net_device *dev); void (*napi_enable)(struct net_device *dev);
void (*napi_disable_rx)(struct net_device *dev); void (*napi_disable)(struct net_device *dev);
void (*napi_clear_tx_event)(struct net_device *dev);
void (*napi_enable_tx)(struct net_device *dev);
void (*napi_disable_tx)(struct net_device *dev);
void (*rx_bd_done)(struct net_device *dev); void (*rx_bd_done)(struct net_device *dev);
void (*tx_kickstart)(struct net_device *dev); void (*tx_kickstart)(struct net_device *dev);
u32 (*get_int_events)(struct net_device *dev); u32 (*get_int_events)(struct net_device *dev);
...@@ -122,7 +119,6 @@ struct phy_info { ...@@ -122,7 +119,6 @@ struct phy_info {
struct fs_enet_private { struct fs_enet_private {
struct napi_struct napi; struct napi_struct napi;
struct napi_struct napi_tx;
struct device *dev; /* pointer back to the device (must be initialized first) */ struct device *dev; /* pointer back to the device (must be initialized first) */
struct net_device *ndev; struct net_device *ndev;
spinlock_t lock; /* during all ops except TX pckt processing */ spinlock_t lock; /* during all ops except TX pckt processing */
...@@ -152,10 +148,8 @@ struct fs_enet_private { ...@@ -152,10 +148,8 @@ struct fs_enet_private {
int oldduplex, oldspeed, oldlink; /* current settings */ int oldduplex, oldspeed, oldlink; /* current settings */
/* event masks */ /* event masks */
u32 ev_napi_rx; /* mask of NAPI rx events */ u32 ev_napi; /* mask of NAPI events */
u32 ev_napi_tx; /* mask of NAPI rx events */ u32 ev; /* event mask */
u32 ev_rx; /* rx event mask */
u32 ev_tx; /* tx event mask */
u32 ev_err; /* error event mask */ u32 ev_err; /* error event mask */
u16 bd_rx_empty; /* mask of BD rx empty */ u16 bd_rx_empty; /* mask of BD rx empty */
......
...@@ -124,10 +124,8 @@ static int do_pd_setup(struct fs_enet_private *fep) ...@@ -124,10 +124,8 @@ static int do_pd_setup(struct fs_enet_private *fep)
return ret; return ret;
} }
#define FCC_NAPI_RX_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB) #define FCC_NAPI_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB | FCC_ENET_TXB)
#define FCC_NAPI_TX_EVENT_MSK (FCC_ENET_TXB) #define FCC_EVENT (FCC_ENET_RXF | FCC_ENET_TXB)
#define FCC_RX_EVENT (FCC_ENET_RXF)
#define FCC_TX_EVENT (FCC_ENET_TXB)
#define FCC_ERR_EVENT_MSK (FCC_ENET_TXE) #define FCC_ERR_EVENT_MSK (FCC_ENET_TXE)
static int setup_data(struct net_device *dev) static int setup_data(struct net_device *dev)
...@@ -137,10 +135,8 @@ static int setup_data(struct net_device *dev) ...@@ -137,10 +135,8 @@ static int setup_data(struct net_device *dev)
if (do_pd_setup(fep) != 0) if (do_pd_setup(fep) != 0)
return -EINVAL; return -EINVAL;
fep->ev_napi_rx = FCC_NAPI_RX_EVENT_MSK; fep->ev_napi = FCC_NAPI_EVENT_MSK;
fep->ev_napi_tx = FCC_NAPI_TX_EVENT_MSK; fep->ev = FCC_EVENT;
fep->ev_rx = FCC_RX_EVENT;
fep->ev_tx = FCC_TX_EVENT;
fep->ev_err = FCC_ERR_EVENT_MSK; fep->ev_err = FCC_ERR_EVENT_MSK;
return 0; return 0;
...@@ -424,52 +420,28 @@ static void stop(struct net_device *dev) ...@@ -424,52 +420,28 @@ static void stop(struct net_device *dev)
fs_cleanup_bds(dev); fs_cleanup_bds(dev);
} }
static void napi_clear_rx_event(struct net_device *dev) static void napi_clear_event_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp; fcc_t __iomem *fccp = fep->fcc.fccp;
W16(fccp, fcc_fcce, FCC_NAPI_RX_EVENT_MSK); W16(fccp, fcc_fcce, FCC_NAPI_EVENT_MSK);
} }
static void napi_enable_rx(struct net_device *dev) static void napi_enable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp; fcc_t __iomem *fccp = fep->fcc.fccp;
S16(fccp, fcc_fccm, FCC_NAPI_RX_EVENT_MSK); S16(fccp, fcc_fccm, FCC_NAPI_EVENT_MSK);
} }
static void napi_disable_rx(struct net_device *dev) static void napi_disable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp; fcc_t __iomem *fccp = fep->fcc.fccp;
C16(fccp, fcc_fccm, FCC_NAPI_RX_EVENT_MSK); C16(fccp, fcc_fccm, FCC_NAPI_EVENT_MSK);
}
static void napi_clear_tx_event(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp;
W16(fccp, fcc_fcce, FCC_NAPI_TX_EVENT_MSK);
}
static void napi_enable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp;
S16(fccp, fcc_fccm, FCC_NAPI_TX_EVENT_MSK);
}
static void napi_disable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
fcc_t __iomem *fccp = fep->fcc.fccp;
C16(fccp, fcc_fccm, FCC_NAPI_TX_EVENT_MSK);
} }
static void rx_bd_done(struct net_device *dev) static void rx_bd_done(struct net_device *dev)
...@@ -595,12 +567,9 @@ const struct fs_ops fs_fcc_ops = { ...@@ -595,12 +567,9 @@ const struct fs_ops fs_fcc_ops = {
.set_multicast_list = set_multicast_list, .set_multicast_list = set_multicast_list,
.restart = restart, .restart = restart,
.stop = stop, .stop = stop,
.napi_clear_rx_event = napi_clear_rx_event, .napi_clear_event = napi_clear_event_fs,
.napi_enable_rx = napi_enable_rx, .napi_enable = napi_enable_fs,
.napi_disable_rx = napi_disable_rx, .napi_disable = napi_disable_fs,
.napi_clear_tx_event = napi_clear_tx_event,
.napi_enable_tx = napi_enable_tx,
.napi_disable_tx = napi_disable_tx,
.rx_bd_done = rx_bd_done, .rx_bd_done = rx_bd_done,
.tx_kickstart = tx_kickstart, .tx_kickstart = tx_kickstart,
.get_int_events = get_int_events, .get_int_events = get_int_events,
......
...@@ -109,10 +109,8 @@ static int do_pd_setup(struct fs_enet_private *fep) ...@@ -109,10 +109,8 @@ static int do_pd_setup(struct fs_enet_private *fep)
return 0; return 0;
} }
#define FEC_NAPI_RX_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB) #define FEC_NAPI_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_TXF)
#define FEC_NAPI_TX_EVENT_MSK (FEC_ENET_TXF) #define FEC_EVENT (FEC_ENET_RXF | FEC_ENET_TXF)
#define FEC_RX_EVENT (FEC_ENET_RXF)
#define FEC_TX_EVENT (FEC_ENET_TXF)
#define FEC_ERR_EVENT_MSK (FEC_ENET_HBERR | FEC_ENET_BABR | \ #define FEC_ERR_EVENT_MSK (FEC_ENET_HBERR | FEC_ENET_BABR | \
FEC_ENET_BABT | FEC_ENET_EBERR) FEC_ENET_BABT | FEC_ENET_EBERR)
...@@ -126,10 +124,8 @@ static int setup_data(struct net_device *dev) ...@@ -126,10 +124,8 @@ static int setup_data(struct net_device *dev)
fep->fec.hthi = 0; fep->fec.hthi = 0;
fep->fec.htlo = 0; fep->fec.htlo = 0;
fep->ev_napi_rx = FEC_NAPI_RX_EVENT_MSK; fep->ev_napi = FEC_NAPI_EVENT_MSK;
fep->ev_napi_tx = FEC_NAPI_TX_EVENT_MSK; fep->ev = FEC_EVENT;
fep->ev_rx = FEC_RX_EVENT;
fep->ev_tx = FEC_TX_EVENT;
fep->ev_err = FEC_ERR_EVENT_MSK; fep->ev_err = FEC_ERR_EVENT_MSK;
return 0; return 0;
...@@ -396,52 +392,28 @@ static void stop(struct net_device *dev) ...@@ -396,52 +392,28 @@ static void stop(struct net_device *dev)
} }
} }
static void napi_clear_rx_event(struct net_device *dev) static void napi_clear_event_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp; struct fec __iomem *fecp = fep->fec.fecp;
FW(fecp, ievent, FEC_NAPI_RX_EVENT_MSK); FW(fecp, ievent, FEC_NAPI_EVENT_MSK);
} }
static void napi_enable_rx(struct net_device *dev) static void napi_enable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp; struct fec __iomem *fecp = fep->fec.fecp;
FS(fecp, imask, FEC_NAPI_RX_EVENT_MSK); FS(fecp, imask, FEC_NAPI_EVENT_MSK);
} }
static void napi_disable_rx(struct net_device *dev) static void napi_disable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp; struct fec __iomem *fecp = fep->fec.fecp;
FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK); FC(fecp, imask, FEC_NAPI_EVENT_MSK);
}
static void napi_clear_tx_event(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp;
FW(fecp, ievent, FEC_NAPI_TX_EVENT_MSK);
}
static void napi_enable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp;
FS(fecp, imask, FEC_NAPI_TX_EVENT_MSK);
}
static void napi_disable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
struct fec __iomem *fecp = fep->fec.fecp;
FC(fecp, imask, FEC_NAPI_TX_EVENT_MSK);
} }
static void rx_bd_done(struct net_device *dev) static void rx_bd_done(struct net_device *dev)
...@@ -513,12 +485,9 @@ const struct fs_ops fs_fec_ops = { ...@@ -513,12 +485,9 @@ const struct fs_ops fs_fec_ops = {
.set_multicast_list = set_multicast_list, .set_multicast_list = set_multicast_list,
.restart = restart, .restart = restart,
.stop = stop, .stop = stop,
.napi_clear_rx_event = napi_clear_rx_event, .napi_clear_event = napi_clear_event_fs,
.napi_enable_rx = napi_enable_rx, .napi_enable = napi_enable_fs,
.napi_disable_rx = napi_disable_rx, .napi_disable = napi_disable_fs,
.napi_clear_tx_event = napi_clear_tx_event,
.napi_enable_tx = napi_enable_tx,
.napi_disable_tx = napi_disable_tx,
.rx_bd_done = rx_bd_done, .rx_bd_done = rx_bd_done,
.tx_kickstart = tx_kickstart, .tx_kickstart = tx_kickstart,
.get_int_events = get_int_events, .get_int_events = get_int_events,
......
...@@ -115,10 +115,8 @@ static int do_pd_setup(struct fs_enet_private *fep) ...@@ -115,10 +115,8 @@ static int do_pd_setup(struct fs_enet_private *fep)
return 0; return 0;
} }
#define SCC_NAPI_RX_EVENT_MSK (SCCE_ENET_RXF | SCCE_ENET_RXB) #define SCC_NAPI_EVENT_MSK (SCCE_ENET_RXF | SCCE_ENET_RXB | SCCE_ENET_TXB)
#define SCC_NAPI_TX_EVENT_MSK (SCCE_ENET_TXB) #define SCC_EVENT (SCCE_ENET_RXF | SCCE_ENET_TXB)
#define SCC_RX_EVENT (SCCE_ENET_RXF)
#define SCC_TX_EVENT (SCCE_ENET_TXB)
#define SCC_ERR_EVENT_MSK (SCCE_ENET_TXE | SCCE_ENET_BSY) #define SCC_ERR_EVENT_MSK (SCCE_ENET_TXE | SCCE_ENET_BSY)
static int setup_data(struct net_device *dev) static int setup_data(struct net_device *dev)
...@@ -130,10 +128,8 @@ static int setup_data(struct net_device *dev) ...@@ -130,10 +128,8 @@ static int setup_data(struct net_device *dev)
fep->scc.hthi = 0; fep->scc.hthi = 0;
fep->scc.htlo = 0; fep->scc.htlo = 0;
fep->ev_napi_rx = SCC_NAPI_RX_EVENT_MSK; fep->ev_napi = SCC_NAPI_EVENT_MSK;
fep->ev_napi_tx = SCC_NAPI_TX_EVENT_MSK; fep->ev = SCC_EVENT | SCCE_ENET_TXE;
fep->ev_rx = SCC_RX_EVENT;
fep->ev_tx = SCC_TX_EVENT | SCCE_ENET_TXE;
fep->ev_err = SCC_ERR_EVENT_MSK; fep->ev_err = SCC_ERR_EVENT_MSK;
return 0; return 0;
...@@ -379,52 +375,28 @@ static void stop(struct net_device *dev) ...@@ -379,52 +375,28 @@ static void stop(struct net_device *dev)
fs_cleanup_bds(dev); fs_cleanup_bds(dev);
} }
static void napi_clear_rx_event(struct net_device *dev) static void napi_clear_event_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp; scc_t __iomem *sccp = fep->scc.sccp;
W16(sccp, scc_scce, SCC_NAPI_RX_EVENT_MSK); W16(sccp, scc_scce, SCC_NAPI_EVENT_MSK);
} }
static void napi_enable_rx(struct net_device *dev) static void napi_enable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp; scc_t __iomem *sccp = fep->scc.sccp;
S16(sccp, scc_sccm, SCC_NAPI_RX_EVENT_MSK); S16(sccp, scc_sccm, SCC_NAPI_EVENT_MSK);
} }
static void napi_disable_rx(struct net_device *dev) static void napi_disable_fs(struct net_device *dev)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp; scc_t __iomem *sccp = fep->scc.sccp;
C16(sccp, scc_sccm, SCC_NAPI_RX_EVENT_MSK); C16(sccp, scc_sccm, SCC_NAPI_EVENT_MSK);
}
static void napi_clear_tx_event(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp;
W16(sccp, scc_scce, SCC_NAPI_TX_EVENT_MSK);
}
static void napi_enable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp;
S16(sccp, scc_sccm, SCC_NAPI_TX_EVENT_MSK);
}
static void napi_disable_tx(struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
scc_t __iomem *sccp = fep->scc.sccp;
C16(sccp, scc_sccm, SCC_NAPI_TX_EVENT_MSK);
} }
static void rx_bd_done(struct net_device *dev) static void rx_bd_done(struct net_device *dev)
...@@ -497,12 +469,9 @@ const struct fs_ops fs_scc_ops = { ...@@ -497,12 +469,9 @@ const struct fs_ops fs_scc_ops = {
.set_multicast_list = set_multicast_list, .set_multicast_list = set_multicast_list,
.restart = restart, .restart = restart,
.stop = stop, .stop = stop,
.napi_clear_rx_event = napi_clear_rx_event, .napi_clear_event = napi_clear_event_fs,
.napi_enable_rx = napi_enable_rx, .napi_enable = napi_enable_fs,
.napi_disable_rx = napi_disable_rx, .napi_disable = napi_disable_fs,
.napi_clear_tx_event = napi_clear_tx_event,
.napi_enable_tx = napi_enable_tx,
.napi_disable_tx = napi_disable_tx,
.rx_bd_done = rx_bd_done, .rx_bd_done = rx_bd_done,
.tx_kickstart = tx_kickstart, .tx_kickstart = tx_kickstart,
.get_int_events = get_int_events, .get_int_events = get_int_events,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment