Principal purpose is to prevent the error message
ifxmips_ptm_vdsl.c:281:ptm_hard_start_xmit: not in showtime
which is printed at least once per second to the serial console, if the
ptm interface is not in showtime, but a processes already sends
packages over that interface. This happens for adsl as well as vdsl
over ptm.
It's pppd which sends packages over the ptm device before in showtime.
As far as I can see, pppd is started unconditionally since netif can
not gather the link status of the ptm network interface.
Signed-off-by: Mathias Kresin <openwrt@kresin.me>
SVN-Revision: 47917
#include <linux/ioctl.h>
#include <linux/etherdevice.h>
#include <linux/interrupt.h>
#include <linux/ioctl.h>
#include <linux/etherdevice.h>
#include <linux/interrupt.h>
+#include <linux/netdevice.h>
static void ptm_setup(struct net_device *dev, int ndev)
{
static void ptm_setup(struct net_device *dev, int ndev)
{
+#if defined(CONFIG_IFXMIPS_DSL_CPE_MEI) || defined(CONFIG_IFXMIPS_DSL_CPE_MEI_MODULE)
+ netif_carrier_off(dev);
+#endif
+
/* hook network operations */
dev->netdev_ops = &g_ptm_netdev_ops;
netif_napi_add(dev, &g_ptm_priv_data.itf[ndev].napi, ptm_napi_poll, 25);
/* hook network operations */
dev->netdev_ops = &g_ptm_netdev_ops;
netif_napi_add(dev, &g_ptm_priv_data.itf[ndev].napi, ptm_napi_poll, 25);
static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr)
{
static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr)
{
+ for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ )
+ netif_carrier_on(g_net_dev[i]);
+
printk("enter showtime\n");
return 0;
printk("enter showtime\n");
return 0;
static int ptm_showtime_exit(void)
{
static int ptm_showtime_exit(void)
{
if ( !g_showtime )
return -1;
if ( !g_showtime )
return -1;
+ for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ )
+ netif_carrier_off(g_net_dev[i]);
+
g_showtime = 0;
printk("leave showtime\n");
g_showtime = 0;
printk("leave showtime\n");
#include <linux/ioctl.h>
#include <linux/etherdevice.h>
#include <linux/interrupt.h>
#include <linux/ioctl.h>
#include <linux/etherdevice.h>
#include <linux/interrupt.h>
+#include <linux/netdevice.h>
#include "ifxmips_ptm_vdsl.h"
#include <lantiq_soc.h>
#include "ifxmips_ptm_vdsl.h"
#include <lantiq_soc.h>
static void ptm_setup(struct net_device *dev, int ndev)
{
static void ptm_setup(struct net_device *dev, int ndev)
{
+ netif_carrier_off(dev);
+
dev->netdev_ops = &g_ptm_netdev_ops;
netif_napi_add(dev, &g_ptm_priv_data.itf[ndev].napi, ptm_napi_poll, 16);
dev->watchdog_timeo = ETH_WATCHDOG_TIMEOUT;
dev->netdev_ops = &g_ptm_netdev_ops;
netif_napi_add(dev, &g_ptm_priv_data.itf[ndev].napi, ptm_napi_poll, 16);
dev->watchdog_timeo = ETH_WATCHDOG_TIMEOUT;
static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr)
{
static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr)
{
ASSERT(port_cell != NULL, "port_cell is NULL");
ASSERT(xdata_addr != NULL, "xdata_addr is NULL");
ASSERT(port_cell != NULL, "port_cell is NULL");
ASSERT(xdata_addr != NULL, "xdata_addr is NULL");
+ for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ )
+ netif_carrier_on(g_net_dev[i]);
+
IFX_REG_W32(0x0F, UTP_CFG);
//#ifdef CONFIG_VR9
IFX_REG_W32(0x0F, UTP_CFG);
//#ifdef CONFIG_VR9
static int ptm_showtime_exit(void)
{
static int ptm_showtime_exit(void)
{
if ( !g_showtime )
return -1;
if ( !g_showtime )
return -1;
IFX_REG_W32(0x00, UTP_CFG);
IFX_REG_W32(0x00, UTP_CFG);
+ for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ )
+ netif_carrier_off(g_net_dev[i]);
+
g_showtime = 0;
// TODO: ReTX clean state
g_showtime = 0;
// TODO: ReTX clean state