X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/e6e930942664682d11abe4ad7ccd0bada1afecfa..fa5eb96b1733cdc7cabb9e0de95efb35c207863e:/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 5be89987b..97e5fb284 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.33" +#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) @@ -89,9 +86,9 @@ struct ag71xx_desc { struct ag71xx_buf { struct sk_buff *skb; - struct ag71xx_desc *desc; + struct ag71xx_desc *desc; dma_addr_t dma_addr; - u32 pad; + unsigned long timestamp; }; struct ag71xx_ring { @@ -136,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; @@ -145,7 +140,6 @@ struct ag71xx_debug { struct ag71xx { void __iomem *mac_base; - void __iomem *mii_ctrl; spinlock_t lock; struct platform_device *pdev; @@ -153,17 +147,22 @@ struct ag71xx { struct napi_struct napi; u32 msg_enable; + struct ag71xx_desc *stop_desc; + dma_addr_t stop_desc_dma; + struct ag71xx_ring rx_ring; struct ag71xx_ring tx_ring; 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 @@ -189,12 +188,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 */ @@ -236,6 +235,10 @@ static inline int ag71xx_desc_pktlen(struct ag71xx_desc *desc) #define AG71XX_REG_INT_ENABLE 0x0198 #define AG71XX_REG_INT_STATUS 0x019c +#define AG71XX_REG_FIFO_DEPTH 0x01a8 +#define AG71XX_REG_RX_SM 0x01b0 +#define AG71XX_REG_TX_SM 0x01b4 + #define MAC_CFG1_TXE BIT(0) /* Tx Enable */ #define MAC_CFG1_STX BIT(1) /* Synchronize Tx Enable */ #define MAC_CFG1_RXE BIT(2) /* Rx Enable */ @@ -339,18 +342,12 @@ static inline int ag71xx_desc_pktlen(struct ag71xx_desc *desc) #define RX_STATUS_OF BIT(2) /* Rx Overflow */ #define RX_STATUS_BE BIT(3) /* Bus Error */ -#define MII_CTRL_IF_MASK 3 -#define MII_CTRL_SPEED_SHIFT 4 -#define MII_CTRL_SPEED_MASK 3 -#define MII_CTRL_SPEED_10 0 -#define MII_CTRL_SPEED_100 1 -#define MII_CTRL_SPEED_1000 2 - static inline void ag71xx_check_reg_offset(struct ag71xx *ag, unsigned reg) { switch (reg) { case AG71XX_REG_MAC_CFG1 ... AG71XX_REG_MAC_MFL: - case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_INT_STATUS: + case AG71XX_REG_MAC_IFCTL ... AG71XX_REG_TX_SM: + case AG71XX_REG_MII_CFG: break; default: @@ -408,54 +405,14 @@ static inline void ag71xx_int_disable(struct ag71xx *ag, u32 ints) ag71xx_cb(ag, AG71XX_REG_INT_ENABLE, ints); } -static inline void ag71xx_mii_ctrl_wr(struct ag71xx *ag, u32 value) -{ - struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); - - if (pdata->is_ar724x) - return; - - __raw_writel(value, ag->mii_ctrl); - - /* flush write */ - __raw_readl(ag->mii_ctrl); -} - -static inline u32 ag71xx_mii_ctrl_rr(struct ag71xx *ag) -{ - struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); - - if (pdata->is_ar724x) - return 0xffffffff; - - return __raw_readl(ag->mii_ctrl); -} - -static void inline ag71xx_mii_ctrl_set_if(struct ag71xx *ag, - unsigned int mii_if) -{ - u32 t; - - t = ag71xx_mii_ctrl_rr(ag); - t &= ~(MII_CTRL_IF_MASK); - t |= (mii_if & MII_CTRL_IF_MASK); - ag71xx_mii_ctrl_wr(ag, t); -} - -static void inline ag71xx_mii_ctrl_set_speed(struct ag71xx *ag, - unsigned int speed) -{ - u32 t; - - t = ag71xx_mii_ctrl_rr(ag); - t &= ~(MII_CTRL_SPEED_MASK << MII_CTRL_SPEED_SHIFT); - t |= (speed & MII_CTRL_SPEED_MASK) << MII_CTRL_SPEED_SHIFT; - ag71xx_mii_ctrl_wr(ag, t); -} - #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) @@ -463,7 +420,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; } @@ -487,4 +449,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 */