X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/bdcb066fc411a033fc1181873741f30fac6d0795..9cef2f85c2e34f4d51a1a99bf2cda4bdc68ff511:/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h index b2f710ede..881ffa369 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h @@ -38,7 +38,7 @@ #define ETH_FCS_LEN 4 #define AG71XX_DRV_NAME "ag71xx" -#define AG71XX_DRV_VERSION "0.5.25" +#define AG71XX_DRV_VERSION "0.5.27" #define AG71XX_NAPI_WEIGHT 64 #define AG71XX_OOM_REFILL (1 + HZ/10) @@ -109,8 +109,36 @@ struct ag71xx_mdio { struct ag71xx_mdio_platform_data *pdata; }; +struct ag71xx_int_stats { + unsigned long rx_pr; + unsigned long rx_be; + unsigned long rx_of; + unsigned long tx_ps; + unsigned long tx_be; + unsigned long tx_ur; + unsigned long total; +}; + +struct ag71xx_napi_stats { + unsigned long napi_calls; + unsigned long rx_count; + unsigned long rx_packets; + unsigned long rx_packets_max; + unsigned long tx_count; + unsigned long tx_packets; + unsigned long tx_packets_max; + + unsigned long rx[AG71XX_NAPI_WEIGHT + 1]; + unsigned long tx[AG71XX_NAPI_WEIGHT + 1]; +}; + struct ag71xx_debug { struct dentry *debugfs_dir; + struct dentry *debugfs_int_stats; + struct dentry *debugfs_napi_stats; + + struct ag71xx_int_stats int_stats; + struct ag71xx_napi_stats napi_stats; }; struct ag71xx { @@ -315,76 +343,56 @@ static inline int ag71xx_desc_pktlen(struct ag71xx_desc *desc) #define MII_CTRL_SPEED_100 1 #define MII_CTRL_SPEED_1000 2 -static inline void ag71xx_wr(struct ag71xx *ag, unsigned reg, u32 value) +static inline void ag71xx_check_reg_offset(struct ag71xx *ag, unsigned reg) { - void __iomem *r; - switch (reg) { case AG71XX_REG_MAC_CFG1 ... AG71XX_REG_MAC_MFL: case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_INT_STATUS: - r = ag->mac_base + reg; - __raw_writel(value, r); - - /* flush write */ - (void) __raw_readl(r); break; + default: BUG(); } } -static inline u32 ag71xx_rr(struct ag71xx *ag, unsigned reg) +static inline void ag71xx_wr(struct ag71xx *ag, unsigned reg, u32 value) { - void __iomem *r; - u32 ret; + ag71xx_check_reg_offset(ag, reg); - switch (reg) { - case AG71XX_REG_MAC_CFG1 ... AG71XX_REG_MAC_MFL: - case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_INT_STATUS: - r = ag->mac_base + reg; - ret = __raw_readl(r); - break; - default: - BUG(); - } + __raw_writel(value, ag->mac_base + reg); + /* flush write */ + (void) __raw_readl(ag->mac_base + reg); +} - return ret; +static inline u32 ag71xx_rr(struct ag71xx *ag, unsigned reg) +{ + ag71xx_check_reg_offset(ag, reg); + + return __raw_readl(ag->mac_base + reg); } static inline void ag71xx_sb(struct ag71xx *ag, unsigned reg, u32 mask) { void __iomem *r; - switch (reg) { - case AG71XX_REG_MAC_CFG1 ... AG71XX_REG_MAC_MFL: - case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_INT_STATUS: - r = ag->mac_base + reg; - __raw_writel(__raw_readl(r) | mask, r); + ag71xx_check_reg_offset(ag, reg); - /* flush write */ - (void)__raw_readl(r); - break; - default: - BUG(); - } + r = ag->mac_base + reg; + __raw_writel(__raw_readl(r) | mask, r); + /* flush write */ + (void)__raw_readl(r); } static inline void ag71xx_cb(struct ag71xx *ag, unsigned reg, u32 mask) { void __iomem *r; - switch (reg) { - case AG71XX_REG_MAC_CFG1 ... AG71XX_REG_MAC_MFL: - case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_INT_STATUS: - r = ag->mac_base + reg; - __raw_writel(__raw_readl(r) & ~mask, r); + ag71xx_check_reg_offset(ag, reg); - /* flush write */ - (void) __raw_readl(r); - break; - default: - BUG(); - } + r = ag->mac_base + reg; + __raw_writel(__raw_readl(r) & ~mask, r); + /* flush write */ + (void) __raw_readl(r); } static inline void ag71xx_int_enable(struct ag71xx *ag, u32 ints) @@ -463,11 +471,17 @@ int ag71xx_debugfs_root_init(void); void ag71xx_debugfs_root_exit(void); int ag71xx_debugfs_init(struct ag71xx *ag); void ag71xx_debugfs_exit(struct ag71xx *ag); +void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, u32 status); +void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx); #else static inline int ag71xx_debugfs_root_init(void) { return 0; } static inline void ag71xx_debugfs_root_exit(void) {} static inline int ag71xx_debugfs_init(struct ag71xx *ag) { return 0; } static inline void ag71xx_debugfs_exit(struct ag71xx *ag) {} +static inline void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, + u32 status) {} +static inline void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, + int rx, int tx) {} #endif /* CONFIG_AG71XX_DEBUG_FS */ #endif /* _AG71XX_H */