projects
/
openwrt
/
openwrt.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
lantiq: ltq-atm/ltq-ptm: fix showtime handling on driver load
[openwrt/openwrt.git]
/
package
/
kernel
/
lantiq
/
ltq-ptm
/
src
/
ifxmips_ptm_vdsl.c
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 745eb03321d5f3a376c2a04034e733766526dfc5..22f1e23c4a4b2901259d357dd2cca81875996b91 100644
(file)
--- 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 <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>
@@
-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 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 *);
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_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,
};
.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)
{
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;
@@
-256,8
+260,8
@@
static int ptm_napi_poll(struct napi_struct *napi, int budget)
// clear interrupt
IFX_REG_W32_MASK(0, 1, MBOX_IGU1_ISRC);
// no more traffic
// clear interrupt
IFX_REG_W32_MASK(0, 1, MBOX_IGU1_ISRC);
// no more traffic
- if (
WAN_RX_DESC_BASE[g_ptm_priv_data.itf[0].rx_desc_pos].own ) { // if PP32 hold descriptor
-
napi_complete(napi);
+ if (
work_done < budget) {
+ napi_complete(napi);
IFX_REG_W32_MASK(0, 1, MBOX_IGU1_IER);
return work_done;
}
IFX_REG_W32_MASK(0, 1, MBOX_IGU1_IER);
return work_done;
}
@@
-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 ) {
/* 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;
dev->trans_start = jiffies;
+#endif
netif_stop_queue(dev);
IFX_REG_W32_MASK(0, 1 << 17, MBOX_IGU1_ISRC);
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;
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;
dev->trans_start = jiffies;
+#endif
return 0;
return 0;
@@
-355,6
+367,15
@@
PTM_HARD_START_XMIT_FAIL:
return 0;
}
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");
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)
{
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");
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;
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
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)
{
static int ptm_showtime_exit(void)
{
+ int i;
+
if ( !g_showtime )
return -1;
if ( !g_showtime )
return -1;
@@
-918,6
+946,9
@@
static int ptm_showtime_exit(void)
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
@@
-951,7
+982,7
@@
static int ifx_ptm_init(void)
}
for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ ) {
}
for ( i = 0; i < ARRAY_SIZE(g_net_dev); i++ ) {
- g_net_dev[i] = alloc_netdev(0, g_net_dev_name[i], ether_setup);
+ g_net_dev[i] = alloc_netdev(0, g_net_dev_name[i],
NET_NAME_UNKNOWN,
ether_setup);
if ( g_net_dev[i] == NULL )
goto ALLOC_NETDEV_FAIL;
ptm_setup(g_net_dev[i], i);
if ( g_net_dev[i] == NULL )
goto ALLOC_NETDEV_FAIL;
ptm_setup(g_net_dev[i], i);
@@
-964,7
+995,11
@@
static int ifx_ptm_init(void)
}
/* register interrupt handler */
}
/* 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);
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.");
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);
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;
ifx_mei_atm_showtime_enter = ptm_showtime_enter;
ifx_mei_atm_showtime_exit = ptm_showtime_exit;