Commit 579a25a8 authored by Jose Abreu's avatar Jose Abreu Committed by Jakub Kicinski

net: stmmac: Initial support for TBS

Adds the initial hooks for TBS support. This needs a 32 byte descriptor
in order for it to work with current HW. Adds all the logic for Enhanced
Descriptors in main core but no HW related logic for now.

Changes from v2:
- Use bitfield for TBS status / support (Jakub)
- Remove unneeded cache alignment (Jakub)
- Fix checkpatch issues
Signed-off-by: default avatarJose Abreu <Jose.Abreu@synopsys.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ab9837b5
...@@ -171,6 +171,15 @@ struct dma_extended_desc { ...@@ -171,6 +171,15 @@ struct dma_extended_desc {
__le32 des7; /* Tx/Rx Timestamp High */ __le32 des7; /* Tx/Rx Timestamp High */
}; };
/* Enhanced descriptor for TBS */
struct dma_edesc {
__le32 des4;
__le32 des5;
__le32 des6;
__le32 des7;
struct dma_desc basic;
};
/* Transmit checksum insertion control */ /* Transmit checksum insertion control */
#define TX_CIC_FULL 3 /* Include IP header and pseudoheader */ #define TX_CIC_FULL 3 /* Include IP header and pseudoheader */
......
...@@ -29,6 +29,7 @@ struct stmmac_extra_stats; ...@@ -29,6 +29,7 @@ struct stmmac_extra_stats;
struct stmmac_safety_stats; struct stmmac_safety_stats;
struct dma_desc; struct dma_desc;
struct dma_extended_desc; struct dma_extended_desc;
struct dma_edesc;
/* Descriptors helpers */ /* Descriptors helpers */
struct stmmac_desc_ops { struct stmmac_desc_ops {
...@@ -95,6 +96,7 @@ struct stmmac_desc_ops { ...@@ -95,6 +96,7 @@ struct stmmac_desc_ops {
void (*set_vlan_tag)(struct dma_desc *p, u16 tag, u16 inner_tag, void (*set_vlan_tag)(struct dma_desc *p, u16 tag, u16 inner_tag,
u32 inner_type); u32 inner_type);
void (*set_vlan)(struct dma_desc *p, u32 type); void (*set_vlan)(struct dma_desc *p, u32 type);
void (*set_tbs)(struct dma_edesc *p, u32 sec, u32 nsec);
}; };
#define stmmac_init_rx_desc(__priv, __args...) \ #define stmmac_init_rx_desc(__priv, __args...) \
...@@ -157,6 +159,8 @@ struct stmmac_desc_ops { ...@@ -157,6 +159,8 @@ struct stmmac_desc_ops {
stmmac_do_void_callback(__priv, desc, set_vlan_tag, __args) stmmac_do_void_callback(__priv, desc, set_vlan_tag, __args)
#define stmmac_set_desc_vlan(__priv, __args...) \ #define stmmac_set_desc_vlan(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_vlan, __args) stmmac_do_void_callback(__priv, desc, set_vlan, __args)
#define stmmac_set_desc_tbs(__priv, __args...) \
stmmac_do_void_callback(__priv, desc, set_tbs, __args)
struct stmmac_dma_cfg; struct stmmac_dma_cfg;
struct dma_features; struct dma_features;
...@@ -210,6 +214,7 @@ struct stmmac_dma_ops { ...@@ -210,6 +214,7 @@ struct stmmac_dma_ops {
void (*qmode)(void __iomem *ioaddr, u32 channel, u8 qmode); void (*qmode)(void __iomem *ioaddr, u32 channel, u8 qmode);
void (*set_bfsize)(void __iomem *ioaddr, int bfsize, u32 chan); void (*set_bfsize)(void __iomem *ioaddr, int bfsize, u32 chan);
void (*enable_sph)(void __iomem *ioaddr, bool en, u32 chan); void (*enable_sph)(void __iomem *ioaddr, bool en, u32 chan);
int (*enable_tbs)(void __iomem *ioaddr, bool en, u32 chan);
}; };
#define stmmac_reset(__priv, __args...) \ #define stmmac_reset(__priv, __args...) \
...@@ -268,6 +273,8 @@ struct stmmac_dma_ops { ...@@ -268,6 +273,8 @@ struct stmmac_dma_ops {
stmmac_do_void_callback(__priv, dma, set_bfsize, __args) stmmac_do_void_callback(__priv, dma, set_bfsize, __args)
#define stmmac_enable_sph(__priv, __args...) \ #define stmmac_enable_sph(__priv, __args...) \
stmmac_do_void_callback(__priv, dma, enable_sph, __args) stmmac_do_void_callback(__priv, dma, enable_sph, __args)
#define stmmac_enable_tbs(__priv, __args...) \
stmmac_do_callback(__priv, dma, enable_tbs, __args)
struct mac_device_info; struct mac_device_info;
struct net_device; struct net_device;
......
...@@ -39,13 +39,18 @@ struct stmmac_tx_info { ...@@ -39,13 +39,18 @@ struct stmmac_tx_info {
bool is_jumbo; bool is_jumbo;
}; };
#define STMMAC_TBS_AVAIL BIT(0)
#define STMMAC_TBS_EN BIT(1)
/* Frequently used values are kept adjacent for cache effect */ /* Frequently used values are kept adjacent for cache effect */
struct stmmac_tx_queue { struct stmmac_tx_queue {
u32 tx_count_frames; u32 tx_count_frames;
int tbs;
struct timer_list txtimer; struct timer_list txtimer;
u32 queue_index; u32 queue_index;
struct stmmac_priv *priv_data; struct stmmac_priv *priv_data;
struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp; struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp;
struct dma_edesc *dma_entx;
struct dma_desc *dma_tx; struct dma_desc *dma_tx;
struct sk_buff **tx_skbuff; struct sk_buff **tx_skbuff;
struct stmmac_tx_info *tx_skbuff_dma; struct stmmac_tx_info *tx_skbuff_dma;
......
...@@ -139,6 +139,7 @@ struct stmmac_txq_cfg { ...@@ -139,6 +139,7 @@ struct stmmac_txq_cfg {
u32 low_credit; u32 low_credit;
bool use_prio; bool use_prio;
u32 prio; u32 prio;
int tbs_en;
}; };
struct plat_stmmacenet_data { struct plat_stmmacenet_data {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment