X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=blobdiff_plain;f=package%2Fkernel%2Flantiq%2Fltq-ptm%2Fsrc%2Fifxmips_ptm_vdsl.c;h=22f1e23c4a4b2901259d357dd2cca81875996b91;hp=b328261c5f9c5222692c2135e4d7125542696647;hb=2d6c7c2526b6cc522975e27c26cd1d42ebb7bcd1;hpb=0d414e1c78bf85232e9597a53a715974578ede6c diff --git a/package/kernel/lantiq/ltq-ptm/src/ifxmips_ptm_vdsl.c b/package/kernel/lantiq/ltq-ptm/src/ifxmips_ptm_vdsl.c index b328261c5f..22f1e23c4a 100644 --- a/package/kernel/lantiq/ltq-ptm/src/ifxmips_ptm_vdsl.c +++ b/package/kernel/lantiq/ltq-ptm/src/ifxmips_ptm_vdsl.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "ifxmips_ptm_vdsl.h" #include @@ -73,6 +74,7 @@ static int ptm_stop(struct net_device *); static unsigned int ptm_poll(int, unsigned int); static int ptm_napi_poll(struct napi_struct *, int); static int ptm_hard_start_xmit(struct sk_buff *, struct net_device *); +static int ptm_change_mtu(struct net_device *, int); static int ptm_ioctl(struct net_device *, struct ifreq *, int); static void ptm_tx_timeout(struct net_device *); @@ -113,7 +115,7 @@ static struct net_device_ops g_ptm_netdev_ops = { .ndo_start_xmit = ptm_hard_start_xmit, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = eth_mac_addr, - .ndo_change_mtu = eth_change_mtu, + .ndo_change_mtu = ptm_change_mtu, .ndo_do_ioctl = ptm_ioctl, .ndo_tx_timeout = ptm_tx_timeout, }; @@ -136,6 +138,8 @@ unsigned int ifx_ptm_dbg_enable = DBG_ENABLE_MASK_ERR; 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; @@ -285,7 +289,11 @@ static int ptm_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) /* allocate descriptor */ desc_base = get_tx_desc(0, &f_full); if ( f_full ) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif netif_stop_queue(dev); IFX_REG_W32_MASK(0, 1 << 17, MBOX_IGU1_ISRC); @@ -344,7 +352,11 @@ static int ptm_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) wmb(); *(volatile unsigned int *)desc = *(unsigned int *)®_desc; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif return 0; @@ -355,6 +367,15 @@ PTM_HARD_START_XMIT_FAIL: return 0; } +static int ptm_change_mtu(struct net_device *dev, int mtu) +{ + /* Allow up to 1508 bytes, for RFC4638 */ + if (mtu < 68 || mtu > ETH_DATA_LEN + 8) + return -EINVAL; + dev->mtu = mtu; + return 0; +} + static int ptm_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { ASSERT(dev == g_net_dev[0], "incorrect device"); @@ -888,6 +909,8 @@ static inline void clear_tables(void) static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr) { + int i; + ASSERT(port_cell != NULL, "port_cell is NULL"); ASSERT(xdata_addr != NULL, "xdata_addr is NULL"); @@ -896,6 +919,9 @@ static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr g_showtime = 1; + 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 @@ -909,6 +935,8 @@ static int ptm_showtime_enter(struct port_cell_info *port_cell, void *xdata_addr static int ptm_showtime_exit(void) { + int i; + if ( !g_showtime ) return -1; @@ -918,6 +946,9 @@ static int ptm_showtime_exit(void) 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 @@ -964,7 +995,11 @@ static int ifx_ptm_init(void) } /* register interrupt handler */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0) + ret = request_irq(PPE_MAILBOX_IGU1_INT, mailbox_irq_handler, 0, "ptm_mailbox_isr", &g_ptm_priv_data); +#else ret = request_irq(PPE_MAILBOX_IGU1_INT, mailbox_irq_handler, IRQF_DISABLED, "ptm_mailbox_isr", &g_ptm_priv_data); +#endif if ( ret ) { if ( ret == -EBUSY ) { err("IRQ may be occupied by other driver, please reconfig to disable it."); @@ -987,7 +1022,10 @@ static int ifx_ptm_init(void) enable_irq(PPE_MAILBOX_IGU1_INT); ifx_mei_atm_showtime_check(&g_showtime, &port_cell, &g_xdata_addr); - + if ( g_showtime ) { + ptm_showtime_enter(&port_cell, &g_xdata_addr); + } + ifx_mei_atm_showtime_enter = ptm_showtime_enter; ifx_mei_atm_showtime_exit = ptm_showtime_exit;