Commit 7284a3f1 authored by Giuseppe CAVALLARO's avatar Giuseppe CAVALLARO Committed by David S. Miller

stmmac: remove dead code for STMMAC_TIMER support

The TIMER option is not longer supported and this
code can be considered dead for this driver in
the new kernel series.
In fact, It was not updated at all and never used.
Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3872baf6
...@@ -54,31 +54,6 @@ config STMMAC_DA ...@@ -54,31 +54,6 @@ config STMMAC_DA
By default, the DMA arbitration scheme is based on Round-robin By default, the DMA arbitration scheme is based on Round-robin
(rx:tx priority is 1:1). (rx:tx priority is 1:1).
config STMMAC_TIMER
bool "STMMAC Timer optimisation"
default n
depends on RTC_HCTOSYS_DEVICE
---help---
Use an external timer for mitigating the number of network
interrupts. Currently, for SH architectures, it is possible
to use the TMU channel 2 and the SH-RTC device.
choice
prompt "Select Timer device"
depends on STMMAC_TIMER
config STMMAC_TMU_TIMER
bool "TMU channel 2"
depends on CPU_SH4
---help---
config STMMAC_RTC_TIMER
bool "Real time clock"
depends on RTC_CLASS
---help---
endchoice
choice choice
prompt "Select the DMA TX/RX descriptor operating modes" prompt "Select the DMA TX/RX descriptor operating modes"
depends on STMMAC_ETH depends on STMMAC_ETH
......
obj-$(CONFIG_STMMAC_ETH) += stmmac.o obj-$(CONFIG_STMMAC_ETH) += stmmac.o
stmmac-$(CONFIG_STMMAC_TIMER) += stmmac_timer.o
stmmac-$(CONFIG_STMMAC_RING) += ring_mode.o stmmac-$(CONFIG_STMMAC_RING) += ring_mode.o
stmmac-$(CONFIG_STMMAC_CHAINED) += chain_mode.o stmmac-$(CONFIG_STMMAC_CHAINED) += chain_mode.o
stmmac-$(CONFIG_STMMAC_PLATFORM) += stmmac_platform.o stmmac-$(CONFIG_STMMAC_PLATFORM) += stmmac_platform.o
......
...@@ -31,9 +31,6 @@ ...@@ -31,9 +31,6 @@
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/pci.h> #include <linux/pci.h>
#include "common.h" #include "common.h"
#ifdef CONFIG_STMMAC_TIMER
#include "stmmac_timer.h"
#endif
struct stmmac_priv { struct stmmac_priv {
/* Frequently used values are kept adjacent for cache effect */ /* Frequently used values are kept adjacent for cache effect */
...@@ -77,9 +74,6 @@ struct stmmac_priv { ...@@ -77,9 +74,6 @@ struct stmmac_priv {
spinlock_t tx_lock; spinlock_t tx_lock;
int wolopts; int wolopts;
int wol_irq; int wol_irq;
#ifdef CONFIG_STMMAC_TIMER
struct stmmac_timer *tm;
#endif
struct plat_stmmacenet_data *plat; struct plat_stmmacenet_data *plat;
struct stmmac_counters mmc; struct stmmac_counters mmc;
struct dma_features dma_cap; struct dma_features dma_cap;
......
...@@ -115,16 +115,6 @@ static int tc = TC_DEFAULT; ...@@ -115,16 +115,6 @@ static int tc = TC_DEFAULT;
module_param(tc, int, S_IRUGO | S_IWUSR); module_param(tc, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(tc, "DMA threshold control value"); MODULE_PARM_DESC(tc, "DMA threshold control value");
/* Pay attention to tune this parameter; take care of both
* hardware capability and network stabitily/performance impact.
* Many tests showed that ~4ms latency seems to be good enough. */
#ifdef CONFIG_STMMAC_TIMER
#define DEFAULT_PERIODIC_RATE 256
static int tmrate = DEFAULT_PERIODIC_RATE;
module_param(tmrate, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(tmrate, "External timer freq. (default: 256Hz)");
#endif
#define DMA_BUFFER_SIZE BUF_SIZE_2KiB #define DMA_BUFFER_SIZE BUF_SIZE_2KiB
static int buf_sz = DMA_BUFFER_SIZE; static int buf_sz = DMA_BUFFER_SIZE;
module_param(buf_sz, int, S_IRUGO | S_IWUSR); module_param(buf_sz, int, S_IRUGO | S_IWUSR);
...@@ -536,12 +526,6 @@ static void init_dma_desc_rings(struct net_device *dev) ...@@ -536,12 +526,6 @@ static void init_dma_desc_rings(struct net_device *dev)
else else
bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz);
#ifdef CONFIG_STMMAC_TIMER
/* Disable interrupts on completion for the reception if timer is on */
if (likely(priv->tm->enable))
dis_ic = 1;
#endif
DBG(probe, INFO, "stmmac: txsize %d, rxsize %d, bfsize %d\n", DBG(probe, INFO, "stmmac: txsize %d, rxsize %d, bfsize %d\n",
txsize, rxsize, bfsize); txsize, rxsize, bfsize);
...@@ -775,22 +759,12 @@ static void stmmac_tx(struct stmmac_priv *priv) ...@@ -775,22 +759,12 @@ static void stmmac_tx(struct stmmac_priv *priv)
static inline void stmmac_enable_irq(struct stmmac_priv *priv) static inline void stmmac_enable_irq(struct stmmac_priv *priv)
{ {
#ifdef CONFIG_STMMAC_TIMER priv->hw->dma->enable_dma_irq(priv->ioaddr);
if (likely(priv->tm->enable))
priv->tm->timer_start(tmrate);
else
#endif
priv->hw->dma->enable_dma_irq(priv->ioaddr);
} }
static inline void stmmac_disable_irq(struct stmmac_priv *priv) static inline void stmmac_disable_irq(struct stmmac_priv *priv)
{ {
#ifdef CONFIG_STMMAC_TIMER priv->hw->dma->disable_dma_irq(priv->ioaddr);
if (likely(priv->tm->enable))
priv->tm->timer_stop();
else
#endif
priv->hw->dma->disable_dma_irq(priv->ioaddr);
} }
static int stmmac_has_work(struct stmmac_priv *priv) static int stmmac_has_work(struct stmmac_priv *priv)
...@@ -818,25 +792,6 @@ static inline void _stmmac_schedule(struct stmmac_priv *priv) ...@@ -818,25 +792,6 @@ static inline void _stmmac_schedule(struct stmmac_priv *priv)
} }
} }
#ifdef CONFIG_STMMAC_TIMER
void stmmac_schedule(struct net_device *dev)
{
struct stmmac_priv *priv = netdev_priv(dev);
priv->xstats.sched_timer_n++;
_stmmac_schedule(priv);
}
static void stmmac_no_timer_started(unsigned int x)
{;
};
static void stmmac_no_timer_stopped(void)
{;
};
#endif
/** /**
* stmmac_tx_err: * stmmac_tx_err:
* @priv: pointer to the private device structure * @priv: pointer to the private device structure
...@@ -1038,23 +993,6 @@ static int stmmac_open(struct net_device *dev) ...@@ -1038,23 +993,6 @@ static int stmmac_open(struct net_device *dev)
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
int ret; int ret;
#ifdef CONFIG_STMMAC_TIMER
priv->tm = kzalloc(sizeof(struct stmmac_timer *), GFP_KERNEL);
if (unlikely(priv->tm == NULL))
return -ENOMEM;
priv->tm->freq = tmrate;
/* Test if the external timer can be actually used.
* In case of failure continue without timer. */
if (unlikely((stmmac_open_ext_timer(dev, priv->tm)) < 0)) {
pr_warning("stmmaceth: cannot attach the external timer.\n");
priv->tm->freq = 0;
priv->tm->timer_start = stmmac_no_timer_started;
priv->tm->timer_stop = stmmac_no_timer_stopped;
} else
priv->tm->enable = 1;
#endif
clk_prepare_enable(priv->stmmac_clk); clk_prepare_enable(priv->stmmac_clk);
stmmac_check_ether_addr(priv); stmmac_check_ether_addr(priv);
...@@ -1141,10 +1079,6 @@ static int stmmac_open(struct net_device *dev) ...@@ -1141,10 +1079,6 @@ static int stmmac_open(struct net_device *dev)
priv->hw->dma->start_tx(priv->ioaddr); priv->hw->dma->start_tx(priv->ioaddr);
priv->hw->dma->start_rx(priv->ioaddr); priv->hw->dma->start_rx(priv->ioaddr);
#ifdef CONFIG_STMMAC_TIMER
priv->tm->timer_start(tmrate);
#endif
/* Dump DMA/MAC registers */ /* Dump DMA/MAC registers */
if (netif_msg_hw(priv)) { if (netif_msg_hw(priv)) {
priv->hw->mac->dump_regs(priv->ioaddr); priv->hw->mac->dump_regs(priv->ioaddr);
...@@ -1170,9 +1104,6 @@ static int stmmac_open(struct net_device *dev) ...@@ -1170,9 +1104,6 @@ static int stmmac_open(struct net_device *dev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
open_error: open_error:
#ifdef CONFIG_STMMAC_TIMER
kfree(priv->tm);
#endif
if (priv->phydev) if (priv->phydev)
phy_disconnect(priv->phydev); phy_disconnect(priv->phydev);
...@@ -1203,12 +1134,6 @@ static int stmmac_release(struct net_device *dev) ...@@ -1203,12 +1134,6 @@ static int stmmac_release(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
#ifdef CONFIG_STMMAC_TIMER
/* Stop and release the timer */
stmmac_close_ext_timer();
if (priv->tm != NULL)
kfree(priv->tm);
#endif
napi_disable(&priv->napi); napi_disable(&priv->napi);
/* Free the IRQ lines */ /* Free the IRQ lines */
...@@ -1323,12 +1248,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1323,12 +1248,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
/* Interrupt on completition only for the latest segment */ /* Interrupt on completition only for the latest segment */
priv->hw->desc->close_tx_desc(desc); priv->hw->desc->close_tx_desc(desc);
#ifdef CONFIG_STMMAC_TIMER
/* Clean IC while using timer */
if (likely(priv->tm->enable))
priv->hw->desc->clear_tx_ic(desc);
#endif
wmb(); wmb();
/* To avoid raise condition */ /* To avoid raise condition */
...@@ -1523,7 +1442,7 @@ static int stmmac_poll(struct napi_struct *napi, int budget) ...@@ -1523,7 +1442,7 @@ static int stmmac_poll(struct napi_struct *napi, int budget)
* stmmac_tx_timeout * stmmac_tx_timeout
* @dev : Pointer to net device structure * @dev : Pointer to net device structure
* Description: this function is called when a packet transmission fails to * Description: this function is called when a packet transmission fails to
* complete within a reasonable tmrate. The driver will mark the error in the * complete within a reasonable time. The driver will mark the error in the
* netdev structure and arrange for the device to be reset to a sane state * netdev structure and arrange for the device to be reset to a sane state
* in order to transmit a new packet. * in order to transmit a new packet.
*/ */
...@@ -2141,11 +2060,6 @@ int stmmac_suspend(struct net_device *ndev) ...@@ -2141,11 +2060,6 @@ int stmmac_suspend(struct net_device *ndev)
netif_device_detach(ndev); netif_device_detach(ndev);
netif_stop_queue(ndev); netif_stop_queue(ndev);
#ifdef CONFIG_STMMAC_TIMER
priv->tm->timer_stop();
if (likely(priv->tm->enable))
dis_ic = 1;
#endif
napi_disable(&priv->napi); napi_disable(&priv->napi);
/* Stop TX/RX DMA */ /* Stop TX/RX DMA */
...@@ -2196,10 +2110,6 @@ int stmmac_resume(struct net_device *ndev) ...@@ -2196,10 +2110,6 @@ int stmmac_resume(struct net_device *ndev)
priv->hw->dma->start_tx(priv->ioaddr); priv->hw->dma->start_tx(priv->ioaddr);
priv->hw->dma->start_rx(priv->ioaddr); priv->hw->dma->start_rx(priv->ioaddr);
#ifdef CONFIG_STMMAC_TIMER
if (likely(priv->tm->enable))
priv->tm->timer_start(tmrate);
#endif
napi_enable(&priv->napi); napi_enable(&priv->napi);
netif_start_queue(ndev); netif_start_queue(ndev);
...@@ -2295,11 +2205,6 @@ static int __init stmmac_cmdline_opt(char *str) ...@@ -2295,11 +2205,6 @@ static int __init stmmac_cmdline_opt(char *str)
} else if (!strncmp(opt, "eee_timer:", 6)) { } else if (!strncmp(opt, "eee_timer:", 6)) {
if (kstrtoint(opt + 10, 0, &eee_timer)) if (kstrtoint(opt + 10, 0, &eee_timer))
goto err; goto err;
#ifdef CONFIG_STMMAC_TIMER
} else if (!strncmp(opt, "tmrate:", 7)) {
if (kstrtoint(opt + 7, 0, &tmrate))
goto err;
#endif
} }
} }
return 0; return 0;
......
/*******************************************************************************
STMMAC external timer support.
Copyright (C) 2007-2009 STMicroelectronics Ltd
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
*******************************************************************************/
#include <linux/kernel.h>
#include <linux/etherdevice.h>
#include "stmmac_timer.h"
static void stmmac_timer_handler(void *data)
{
struct net_device *dev = (struct net_device *)data;
stmmac_schedule(dev);
}
#define STMMAC_TIMER_MSG(timer, freq) \
printk(KERN_INFO "stmmac_timer: %s Timer ON (freq %dHz)\n", timer, freq);
#if defined(CONFIG_STMMAC_RTC_TIMER)
#include <linux/rtc.h>
static struct rtc_device *stmmac_rtc;
static rtc_task_t stmmac_task;
static void stmmac_rtc_start(unsigned int new_freq)
{
rtc_irq_set_freq(stmmac_rtc, &stmmac_task, new_freq);
rtc_irq_set_state(stmmac_rtc, &stmmac_task, 1);
}
static void stmmac_rtc_stop(void)
{
rtc_irq_set_state(stmmac_rtc, &stmmac_task, 0);
}
int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm)
{
stmmac_task.private_data = dev;
stmmac_task.func = stmmac_timer_handler;
stmmac_rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
if (stmmac_rtc == NULL) {
pr_err("open rtc device failed\n");
return -ENODEV;
}
rtc_irq_register(stmmac_rtc, &stmmac_task);
/* Periodic mode is not supported */
if ((rtc_irq_set_freq(stmmac_rtc, &stmmac_task, tm->freq) < 0)) {
pr_err("set periodic failed\n");
rtc_irq_unregister(stmmac_rtc, &stmmac_task);
rtc_class_close(stmmac_rtc);
return -1;
}
STMMAC_TIMER_MSG(CONFIG_RTC_HCTOSYS_DEVICE, tm->freq);
tm->timer_start = stmmac_rtc_start;
tm->timer_stop = stmmac_rtc_stop;
return 0;
}
int stmmac_close_ext_timer(void)
{
rtc_irq_set_state(stmmac_rtc, &stmmac_task, 0);
rtc_irq_unregister(stmmac_rtc, &stmmac_task);
rtc_class_close(stmmac_rtc);
return 0;
}
#elif defined(CONFIG_STMMAC_TMU_TIMER)
#include <linux/clk.h>
#define TMU_CHANNEL "tmu2_clk"
static struct clk *timer_clock;
static void stmmac_tmu_start(unsigned int new_freq)
{
clk_set_rate(timer_clock, new_freq);
clk_prepare_enable(timer_clock);
}
static void stmmac_tmu_stop(void)
{
clk_disable_unprepare(timer_clock);
}
int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm)
{
timer_clock = clk_get(NULL, TMU_CHANNEL);
if (IS_ERR(timer_clock))
return -1;
if (tmu2_register_user(stmmac_timer_handler, (void *)dev) < 0) {
timer_clock = NULL;
return -1;
}
STMMAC_TIMER_MSG("TMU2", tm->freq);
tm->timer_start = stmmac_tmu_start;
tm->timer_stop = stmmac_tmu_stop;
return 0;
}
int stmmac_close_ext_timer(void)
{
clk_disable_unprepare(timer_clock);
tmu2_unregister_user();
clk_put(timer_clock);
return 0;
}
#endif
/*******************************************************************************
STMMAC external timer Header File.
Copyright (C) 2007-2009 STMicroelectronics Ltd
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
*******************************************************************************/
#ifndef __STMMAC_TIMER_H__
#define __STMMAC_TIMER_H__
struct stmmac_timer {
void (*timer_start) (unsigned int new_freq);
void (*timer_stop) (void);
unsigned int freq;
unsigned int enable;
};
/* Open the HW timer device and return 0 in case of success */
int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm);
/* Stop the timer and release it */
int stmmac_close_ext_timer(void);
/* Function used for scheduling task within the stmmac */
void stmmac_schedule(struct net_device *dev);
#if defined(CONFIG_STMMAC_TMU_TIMER)
extern int tmu2_register_user(void *fnt, void *data);
extern void tmu2_unregister_user(void);
#endif
#endif /* __STMMAC_TIMER_H__ */
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