X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/75c44942807c22fdb4943ecae3030a23ab1a5d28..3bad82d2e78536d6db1d97a8f45a18e41f5b9fd6:/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 712e9f1ec..1025bb4c4 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -35,10 +36,8 @@ #include #include -#define ETH_FCS_LEN 4 - #define AG71XX_DRV_NAME "ag71xx" -#define AG71XX_DRV_VERSION "0.5.26" +#define AG71XX_DRV_VERSION "0.5.35" #define AG71XX_NAPI_WEIGHT 64 #define AG71XX_OOM_REFILL (1 + HZ/10) @@ -50,18 +49,16 @@ #define AG71XX_INT_POLL (AG71XX_INT_RX | AG71XX_INT_TX) #define AG71XX_INT_INIT (AG71XX_INT_ERR | AG71XX_INT_POLL) -#define AG71XX_TX_FIFO_LEN 2048 -#define AG71XX_TX_MTU_LEN 1536 +#define AG71XX_TX_MTU_LEN 1540 #define AG71XX_RX_PKT_RESERVE 64 #define AG71XX_RX_PKT_SIZE \ - (AG71XX_RX_PKT_RESERVE + ETH_HLEN + ETH_FRAME_LEN + ETH_FCS_LEN) + (AG71XX_RX_PKT_RESERVE + ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) -#define AG71XX_TX_RING_SIZE 64 -#define AG71XX_TX_THRES_STOP (AG71XX_TX_RING_SIZE - 4) -#define AG71XX_TX_THRES_WAKEUP \ - (AG71XX_TX_RING_SIZE - (AG71XX_TX_RING_SIZE / 4)) +#define AG71XX_TX_RING_SIZE_DEFAULT 64 +#define AG71XX_RX_RING_SIZE_DEFAULT 128 -#define AG71XX_RX_RING_SIZE 128 +#define AG71XX_TX_RING_SIZE_MAX 256 +#define AG71XX_RX_RING_SIZE_MAX 256 #ifdef CONFIG_AG71XX_DEBUG #define DBG(fmt, args...) printk(KERN_DEBUG fmt, ## args) @@ -88,8 +85,10 @@ struct ag71xx_desc { } __attribute__((aligned(4))); struct ag71xx_buf { - struct sk_buff *skb; - struct ag71xx_desc *desc; + struct sk_buff *skb; + struct ag71xx_desc *desc; + dma_addr_t dma_addr; + unsigned long timestamp; }; struct ag71xx_ring { @@ -134,8 +133,6 @@ struct ag71xx_napi_stats { 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; @@ -156,12 +153,14 @@ struct ag71xx { struct mii_bus *mii_bus; struct phy_device *phy_dev; + void *phy_priv; unsigned int link; unsigned int speed; - int duplex; + int duplex; struct work_struct restart_work; + struct delayed_work link_work; struct timer_list oom_timer; #ifdef CONFIG_AG71XX_DEBUG_FS @@ -170,6 +169,7 @@ struct ag71xx { }; extern struct ethtool_ops ag71xx_ethtool_ops; +void ag71xx_link_adjust(struct ag71xx *ag); int ag71xx_mdio_driver_init(void) __init; void ag71xx_mdio_driver_exit(void); @@ -186,12 +186,12 @@ static inline struct ag71xx_platform_data *ag71xx_get_pdata(struct ag71xx *ag) static inline int ag71xx_desc_empty(struct ag71xx_desc *desc) { - return ((desc->ctrl & DESC_EMPTY) != 0); + return (desc->ctrl & DESC_EMPTY) != 0; } static inline int ag71xx_desc_pktlen(struct ag71xx_desc *desc) { - return (desc->ctrl & DESC_PKTLEN_M); + return desc->ctrl & DESC_PKTLEN_M; } /* Register offsets */ @@ -343,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) @@ -448,7 +428,7 @@ static inline u32 ag71xx_mii_ctrl_rr(struct ag71xx *ag) return __raw_readl(ag->mii_ctrl); } -static void inline ag71xx_mii_ctrl_set_if(struct ag71xx *ag, +static inline void ag71xx_mii_ctrl_set_if(struct ag71xx *ag, unsigned int mii_if) { u32 t; @@ -459,7 +439,7 @@ static void inline ag71xx_mii_ctrl_set_if(struct ag71xx *ag, ag71xx_mii_ctrl_wr(ag, t); } -static void inline ag71xx_mii_ctrl_set_speed(struct ag71xx *ag, +static inline void ag71xx_mii_ctrl_set_speed(struct ag71xx *ag, unsigned int speed) { u32 t; @@ -472,7 +452,12 @@ static void inline ag71xx_mii_ctrl_set_speed(struct ag71xx *ag, #ifdef CONFIG_AG71XX_AR8216_SUPPORT void ag71xx_add_ar8216_header(struct ag71xx *ag, struct sk_buff *skb); -int ag71xx_remove_ar8216_header(struct ag71xx *ag, struct sk_buff *skb); +int ag71xx_remove_ar8216_header(struct ag71xx *ag, struct sk_buff *skb, + int pktlen); +static inline int ag71xx_has_ar8216(struct ag71xx *ag) +{ + return ag71xx_get_pdata(ag)->has_ar8216; +} #else static inline void ag71xx_add_ar8216_header(struct ag71xx *ag, struct sk_buff *skb) @@ -480,7 +465,12 @@ static inline void ag71xx_add_ar8216_header(struct ag71xx *ag, } static inline int ag71xx_remove_ar8216_header(struct ag71xx *ag, - struct sk_buff *skb) + struct sk_buff *skb, + int pktlen) +{ + return 0; +} +static inline int ag71xx_has_ar8216(struct ag71xx *ag) { return 0; } @@ -504,4 +494,17 @@ static inline void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx) {} #endif /* CONFIG_AG71XX_DEBUG_FS */ +void ag71xx_ar7240_start(struct ag71xx *ag); +void ag71xx_ar7240_stop(struct ag71xx *ag); +int ag71xx_ar7240_init(struct ag71xx *ag); +void ag71xx_ar7240_cleanup(struct ag71xx *ag); + +int ag71xx_mdio_mii_read(struct ag71xx_mdio *am, int addr, int reg); +void ag71xx_mdio_mii_write(struct ag71xx_mdio *am, int addr, int reg, u16 val); + +u16 ar7240sw_phy_read(struct mii_bus *mii, unsigned phy_addr, + unsigned reg_addr); +int ar7240sw_phy_write(struct mii_bus *mii, unsigned phy_addr, + unsigned reg_addr, u16 reg_val); + #endif /* _AG71XX_H */