net: stmmac: Stop using hard-coded callbacks
Subsystems (4)
cover net: stmmac: Stop using hard-coded callbacks
This a starting point for a cleanup and re-organization of stmmac.
In this series we stop using hard-coded callbacks along the code and use instead helpers which are defined in a single place ("hwif.h").
This brings several advantages:
1) Less typing :)
2) Guaranteed function pointer check
3) More flexibility
By 2) we stop using the repeated pattern of:
if (priv->hw->mac->some_func) priv->hw->mac->some_func(...)
I didn't check but I expect the final .ko will be bigger with this series because *all* of function pointers are checked.
Anyway, I hope this can make the code more readable and more flexible now.
Jose Abreu (5):
net: stmmac: Switch stmmac_desc_ops to generic HW Interface Helpers
net: stmmac: Switch stmmac_dma_ops to generic HW Interface Helpers
net: stmmac: Switch stmmac_ops to generic HW Interface Helpers
net: stmmac: Switch stmmac_hwtimestamp to generic HW Interface Helpers
net: stmmac: Switch stmmac_mode_ops to generic HW Interface Helpers
drivers/net/ethernet/stmicro/stmmac/chain_mode.c | 34 +- drivers/net/ethernet/stmicro/stmmac/common.h | 199 +--------- drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | 4 +- drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 19 +- drivers/net/ethernet/stmicro/stmmac/dwmac5.h | 6 +- drivers/net/ethernet/stmicro/stmmac/enh_desc.c | 4 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 421 ++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/norm_desc.c | 4 +- drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 39 +- .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 82 ++-- .../net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 34 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 439 +++++++++------------ drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 18 +- 13 files changed, 726 insertions(+), 577 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/hwif.h
Signature · 1 line
2.9.3
PATCH 1/5 net: stmmac: Switch stmmac_desc_ops to generic HW Interface Helpers
Switch stmmac_desc_ops to generic Hardware Interface Helpers instead of using hard-coded callbacks. This makes the code more readable and more flexible.
No functional change.
--- drivers/net/ethernet/stmicro/stmmac/chain_mode.c | 14 +-- drivers/net/ethernet/stmicro/stmmac/common.h | 55 +-------- drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | 4 +- drivers/net/ethernet/stmicro/stmmac/enh_desc.c | 4 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 125 +++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/norm_desc.c | 4 +- drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 15 +-- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 110 +++++++++--------- 8 files changed, 195 insertions(+), 136 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/hwif.h
drivers/net/ethernet/stmicro/stmmac/chain_mode.c +6 -8
@@ -51,8 +51,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].len = bmax;/* do not close the descriptor and do not set own bit */ - priv->hw->desc->prepare_tx_desc (desc,1 , bmax, csum,STMMAC_CHAIN_MODE , -0 , false, skb->len); +stmmac_prepare_tx_desc (priv, desc,1 , bmax, csum,STMMAC_CHAIN_MODE , +0 , false, skb->len);while (len !=0 ) { tx_q->tx_skbuff[entry] =NULL ;
@@ -68,9 +68,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)return -1 ; tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].len = bmax; - priv->hw->desc->prepare_tx_desc (desc,0 , bmax, csum, -STMMAC_CHAIN_MODE ,1 , - false, skb->len); +stmmac_prepare_tx_desc (priv, desc,0 , bmax, csum, +STMMAC_CHAIN_MODE ,1 , false, skb->len); len -= bmax; i++; }else {
@@ -83,9 +82,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].buf = des2; tx_q->tx_skbuff_dma[entry].len = len;/* last descriptor can be set now */ - priv->hw->desc->prepare_tx_desc (desc,0 , len, csum, -STMMAC_CHAIN_MODE ,1 , - true, skb->len); +stmmac_prepare_tx_desc (priv, desc,0 , len, csum, +STMMAC_CHAIN_MODE ,1 , true, skb->len); len =0 ; } }
drivers/net/ethernet/stmicro/stmmac/common.h +1 -54
67 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c +2 -2
@@ -223,7 +223,7 @@ static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p)return 0 ; } -static inline u64 dwmac4_get_timestamp (void *desc,u32 ats) +static inline void dwmac4_get_timestamp (void *desc,u32 ats,u64 *ts) {struct dma_desc *p = (struct dma_desc *)desc;u64 ns;
@@ -232,7 +232,7 @@ static inline u64 dwmac4_get_timestamp(void *desc, u32 ats)/* convert high/sec time stamp value to nanosecond */ ns +=le32_to_cpu (p->des1) *1000000000ULL ; -return ns; + *ts = ns; }static int dwmac4_rx_check_timestamp (void *desc)
drivers/net/ethernet/stmicro/stmmac/enh_desc.c +2 -2
@@ -382,7 +382,7 @@ static int enh_desc_get_tx_timestamp_status(struct dma_desc *p)return (le32_to_cpu (p->des0) &ETDES0_TIME_STAMP_STATUS ) >>17 ; } -static u64 enh_desc_get_timestamp (void *desc,u32 ats) +static void enh_desc_get_timestamp (void *desc,u32 ats,u64 *ts) {u64 ns;
@@ -397,7 +397,7 @@ static u64 enh_desc_get_timestamp(void *desc, u32 ats) ns +=le32_to_cpu (p->des3) *1000000000ULL ; } -return ns; + *ts = ns; } static int enh_desc_get_rx_timestamp_status(void *desc, void *next_desc,
drivers/net/ethernet/stmicro/stmmac/hwif.h new file +125 -0
125 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/norm_desc.c +2 -2
@@ -253,7 +253,7 @@ static int ndesc_get_tx_timestamp_status(struct dma_desc *p)return (le32_to_cpu (p->des0) &TDES0_TIME_STAMP_STATUS ) >>17 ; } -static u64 ndesc_get_timestamp (void *desc,u32 ats) +static void ndesc_get_timestamp (void *desc,u32 ats,u64 *ts) {struct dma_desc *p = (struct dma_desc *)desc;u64 ns;
@@ -262,7 +262,7 @@ static u64 ndesc_get_timestamp(void *desc, u32 ats)/* convert high/sec time stamp value to nanosecond */ ns +=le32_to_cpu (p->des3) *1000000000ULL ; -return ns; + *ts = ns; }static int ndesc_get_rx_timestamp_status (void *desc,void *next_desc,u32 ats)
drivers/net/ethernet/stmicro/stmmac/ring_mode.c +6 -9
@@ -58,9 +58,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].is_jumbo = true; desc->des3 =cpu_to_le32 (des2 + BUF_SIZE_4KiB); - priv->hw->desc->prepare_tx_desc (desc,1 , bmax, csum, -STMMAC_RING_MODE ,0 , - false, skb->len); +stmmac_prepare_tx_desc (priv, desc,1 , bmax, csum, +STMMAC_RING_MODE ,0 , false, skb->len); tx_q->tx_skbuff[entry] =NULL ; entry =STMMAC_GET_ENTRY (entry,DMA_TX_SIZE );
@@ -79,9 +78,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].is_jumbo = true; desc->des3 =cpu_to_le32 (des2 + BUF_SIZE_4KiB); - priv->hw->desc->prepare_tx_desc (desc,0 , len, csum, -STMMAC_RING_MODE ,1 , - true, skb->len); +stmmac_prepare_tx_desc (priv, desc,0 , len, csum, +STMMAC_RING_MODE ,1 , true, skb->len); }else { des2 =dma_map_single (priv->device, skb->data, nopaged_len,DMA_TO_DEVICE );
@@ -92,9 +90,8 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].len = nopaged_len; tx_q->tx_skbuff_dma[entry].is_jumbo = true; desc->des3 =cpu_to_le32 (des2 + BUF_SIZE_4KiB); - priv->hw->desc->prepare_tx_desc (desc,1 , nopaged_len, csum, -STMMAC_RING_MODE ,0 , - true, skb->len); +stmmac_prepare_tx_desc (priv, desc,1 , nopaged_len, csum, +STMMAC_RING_MODE ,0 , true, skb->len); } tx_q->cur_tx = entry;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +51 -59
271 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH 2/5 net: stmmac: Switch stmmac_dma_ops to generic HW Interface Helpers
In reply to Jose AbreuSwitch stmmac_dma_ops to generic Hardware Interface Helpers instead of using hard-coded callbacks. This makes the code more readable and more flexible.
No functional change.
--- drivers/net/ethernet/stmicro/stmmac/common.h | 50 ------- drivers/net/ethernet/stmicro/stmmac/hwif.h | 106 +++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 14 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 147 +++++++++------------ 4 files changed, 172 insertions(+), 145 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +0 -50
@@ -381,56 +381,6 @@ struct dma_features {extern const struct stmmac_desc_ops enh_desc_ops;extern const struct stmmac_desc_ops ndesc_ops; -/* Specific DMA helpers */ -struct stmmac_dma_ops { -/* DMA core initialization */ -int (*reset)(void __iomem *ioaddr); -void (*init)(void __iomem *ioaddr,struct stmmac_dma_cfg *dma_cfg, -u32 dma_tx,u32 dma_rx,int atds); -void (*init_chan)(void __iomem *ioaddr, -struct stmmac_dma_cfg *dma_cfg,u32 chan); -void (*init_rx_chan)(void __iomem *ioaddr, -struct stmmac_dma_cfg *dma_cfg, -u32 dma_rx_phy,u32 chan); -void (*init_tx_chan)(void __iomem *ioaddr, -struct stmmac_dma_cfg *dma_cfg, -u32 dma_tx_phy,u32 chan); -/* Configure the AXI Bus Mode Register */ -void (*axi)(void __iomem *ioaddr,struct stmmac_axi *axi); -/* Dump DMA registers */ -void (*dump_regs)(void __iomem *ioaddr,u32 *reg_space); -/* Set tx/rx threshold in the csr6 register -* An invalid value enables the store-and-forward mode */ -void (*dma_mode)(void __iomem *ioaddr,int txmode,int rxmode, -int rxfifosz); -void (*dma_rx_mode)(void __iomem *ioaddr,int mode,u32 channel, -int fifosz,u8 qmode); -void (*dma_tx_mode)(void __iomem *ioaddr,int mode,u32 channel, -int fifosz,u8 qmode); -/* To track extra statistic (if supported) */ -void (*dma_diagnostic_fr) (void *data,struct stmmac_extra_stats *x, -void __iomem *ioaddr); -void (*enable_dma_transmission) (void __iomem *ioaddr); -void (*enable_dma_irq)(void __iomem *ioaddr,u32 chan); -void (*disable_dma_irq)(void __iomem *ioaddr,u32 chan); -void (*start_tx)(void __iomem *ioaddr,u32 chan); -void (*stop_tx)(void __iomem *ioaddr,u32 chan); -void (*start_rx)(void __iomem *ioaddr,u32 chan); -void (*stop_rx)(void __iomem *ioaddr,u32 chan); -int (*dma_interrupt) (void __iomem *ioaddr, -struct stmmac_extra_stats *x,u32 chan); -/* If supported then get the optional core features */ -void (*get_hw_feature)(void __iomem *ioaddr, -struct dma_features *dma_cap); -/* Program the HW RX Watchdog */ -void (*rx_watchdog)(void __iomem *ioaddr,u32 riwt,u32 number_chan); -void (*set_tx_ring_len)(void __iomem *ioaddr,u32 len,u32 chan); -void (*set_rx_ring_len)(void __iomem *ioaddr,u32 len,u32 chan); -void (*set_rx_tail_ptr)(void __iomem *ioaddr,u32 tail_ptr,u32 chan); -void (*set_tx_tail_ptr)(void __iomem *ioaddr,u32 tail_ptr,u32 chan); -void (*enable_tso)(void __iomem *ioaddr,bool en,u32 chan); -}; -struct mac_device_info ;/* Helpers to program the MAC core */
drivers/net/ethernet/stmicro/stmmac/hwif.h +106 -0
110 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +6 -8
@@ -443,7 +443,7 @@ static void stmmac_ethtool_gregs(struct net_device *dev,memset (reg_space,0x0 ,REG_SPACE_SIZE ); priv->hw->mac->dump_regs (priv->hw, reg_space); - priv->hw->dma->dump_regs (priv->ioaddr, reg_space); +stmmac_dump_dma_regs (priv, priv->ioaddr, reg_space);/* Copy DMA registers to where ethtool expects them */ memcpy (®_space[ETHTOOL_DMA_OFFSET ], ®_space[DMA_BUS_MODE /4 ],NUM_DWMAC1000_DMA_REGS *4 );
@@ -529,7 +529,7 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,u32 rx_queues_count = priv->plat->rx_queues_to_use;u32 tx_queues_count = priv->plat->tx_queues_to_use;unsigned long count; -int i, j =0 ; +int i, j =0 , ret;if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) { dump = priv->hw->mac->safety_feat_dump;
@@ -541,11 +541,9 @@ static void stmmac_get_ethtool_stats(struct net_device *dev, }/* Update the DMA HW counters for dwmac10/100 */ -if (priv->hw->dma->dma_diagnostic_fr) - priv->hw->dma->dma_diagnostic_fr (&dev->stats, - (void *) &priv->xstats, - priv->ioaddr); -else { + ret =stmmac_dma_diagnostic_fr (priv, &dev->stats, (void *) &priv->xstats, + priv->ioaddr); +if (ret) {/* If supported, for new GMAC chips expose the MMC counters */ if (priv->dma_cap.rmon) {dwmac_mmc_read (priv->mmcaddr, &priv->mmc);
@@ -810,7 +808,7 @@ static int stmmac_set_coalesce(struct net_device *dev, priv->tx_coal_frames = ec->tx_max_coalesced_frames; priv->tx_coal_timer = ec->tx_coalesce_usecs; priv->rx_riwt = rx_riwt; - priv->hw->dma->rx_watchdog (priv->ioaddr, priv->rx_riwt, rx_cnt); +stmmac_rx_watchdog (priv, priv->ioaddr, priv->rx_riwt, rx_cnt);return 0 ; }
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +60 -87
302 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH 3/5 net: stmmac: Switch stmmac_ops to generic HW Interface Helpers
In reply to Jose AbreuSwitch stmmac_ops to generic Hardware Interface Helpers instead of using hard-coded callbacks. This makes the code more readable and more flexible.
No functional change.
--- drivers/net/ethernet/stmicro/stmmac/common.h | 70 ----------- drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 19 +-- drivers/net/ethernet/stmicro/stmmac/dwmac5.h | 6 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 138 +++++++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 68 ++++------ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 122 +++++++++--------- 6 files changed, 235 insertions(+), 188 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +0 -70
@@ -383,76 +383,6 @@ extern const struct stmmac_desc_ops ndesc_ops;struct mac_device_info ; -/* Helpers to program the MAC core */ -struct stmmac_ops { -/* MAC core initialization */ -void (*core_init)(struct mac_device_info *hw,struct net_device *dev); -/* Enable the MAC RX/TX */ -void (*set_mac)(void __iomem *ioaddr,bool enable); -/* Enable and verify that the IPC module is supported */ -int (*rx_ipc)(struct mac_device_info *hw); -/* Enable RX Queues */ -void (*rx_queue_enable)(struct mac_device_info *hw,u8 mode,u32 queue); -/* RX Queues Priority */ -void (*rx_queue_prio)(struct mac_device_info *hw,u32 prio,u32 queue); -/* TX Queues Priority */ -void (*tx_queue_prio)(struct mac_device_info *hw,u32 prio,u32 queue); -/* RX Queues Routing */ -void (*rx_queue_routing)(struct mac_device_info *hw,u8 packet, -u32 queue); -/* Program RX Algorithms */ -void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw,u32 rx_alg); -/* Program TX Algorithms */ -void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw,u32 tx_alg); -/* Set MTL TX queues weight */ -void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw, -u32 weight,u32 queue); -/* RX MTL queue to RX dma mapping */ -void (*map_mtl_to_dma)(struct mac_device_info *hw,u32 queue,u32 chan); -/* Configure AV Algorithm */ -void (*config_cbs)(struct mac_device_info *hw,u32 send_slope, -u32 idle_slope,u32 high_credit,u32 low_credit, -u32 queue); -/* Dump MAC registers */ -void (*dump_regs)(struct mac_device_info *hw,u32 *reg_space); -/* Handle extra events on specific interrupts hw dependent */ -int (*host_irq_status)(struct mac_device_info *hw, -struct stmmac_extra_stats *x); -/* Handle MTL interrupts */ -int (*host_mtl_irq_status)(struct mac_device_info *hw,u32 chan); -/* Multicast filter setting */ -void (*set_filter)(struct mac_device_info *hw,struct net_device *dev); -/* Flow control setting */ -void (*flow_ctrl)(struct mac_device_info *hw,unsigned int duplex, -unsigned int fc,unsigned int pause_time,u32 tx_cnt); -/* Set power management mode (e.g. magic frame) */ -void (*pmt)(struct mac_device_info *hw,unsigned long mode); -/* Set/Get Unicast MAC addresses */ -void (*set_umac_addr)(struct mac_device_info *hw,unsigned char *addr, -unsigned int reg_n); -void (*get_umac_addr)(struct mac_device_info *hw,unsigned char *addr, -unsigned int reg_n); -void (*set_eee_mode)(struct mac_device_info *hw, -bool en_tx_lpi_clockgating); -void (*reset_eee_mode)(struct mac_device_info *hw); -void (*set_eee_timer)(struct mac_device_info *hw,int ls,int tw); -void (*set_eee_pls)(struct mac_device_info *hw,int link); -void (*debug)(void __iomem *ioaddr,struct stmmac_extra_stats *x, -u32 rx_queues,u32 tx_queues); -/* PCS calls */ -void (*pcs_ctrl_ane)(void __iomem *ioaddr,bool ane,bool srgmi_ral, -bool loopback); -void (*pcs_rane)(void __iomem *ioaddr,bool restart); -void (*pcs_get_adv_lp)(void __iomem *ioaddr,struct rgmii_adv *adv); -/* Safety Features */ -int (*safety_feat_config)(void __iomem *ioaddr,unsigned int asp); -bool (*safety_feat_irq_status)(struct net_device *ndev, -void __iomem *ioaddr,unsigned int asp, -struct stmmac_safety_stats *stats); -const char *(*safety_feat_dump)(struct stmmac_safety_stats *stats, -int index,unsigned long *count); -}; -/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {void (*config_hw_tstamping) (void __iomem *ioaddr,u32 data);
drivers/net/ethernet/stmicro/stmmac/dwmac5.c +11 -8
@@ -237,15 +237,16 @@ int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp)return 0 ; } -bool dwmac5_safety_feat_irq_status (struct net_device *ndev, +int dwmac5_safety_feat_irq_status (struct net_device *ndev,void __iomem *ioaddr,unsigned int asp,struct stmmac_safety_stats *stats) { -bool ret = false, err, corr; +bool err, corr;u32 mtl, dma; +int ret =0 ;if (!asp) -return false; +return -EINVAL ; mtl =readl (ioaddr +MTL_SAFETY_INT_STATUS ); dma =readl (ioaddr +DMA_SAFETY_INT_STATUS );
@@ -282,17 +283,19 @@ static const struct dwmac5_error { { dwmac5_dma_errors }, }; -const char *dwmac5_safety_feat_dump (struct stmmac_safety_stats *stats, -int index,unsigned long *count) +int dwmac5_safety_feat_dump (struct stmmac_safety_stats *stats, +int index,unsigned long *count,const char **desc) {int module = index /32 , offset = index %32 ;unsigned long *ptr = (unsigned long *)stats;if (module >=ARRAY_SIZE (dwmac5_all_errors)) -return NULL ; +return -EINVAL ;if (!dwmac5_all_errors[module].desc[offset].valid) -return NULL ; +return -EINVAL ;if (count) *count = *(ptr + index); -return dwmac5_all_errors[module].desc[offset].desc; +if (desc) + *desc = dwmac5_all_errors[module].desc[offset].desc; +return 0 ; }
drivers/net/ethernet/stmicro/stmmac/dwmac5.h +3 -3
@@ -43,10 +43,10 @@#define DMA_ECC_INT_STATUS 0x00001088int dwmac5_safety_feat_config (void __iomem *ioaddr,unsigned int asp); -bool dwmac5_safety_feat_irq_status (struct net_device *ndev, +int dwmac5_safety_feat_irq_status (struct net_device *ndev,void __iomem *ioaddr,unsigned int asp,struct stmmac_safety_stats *stats); -const char *dwmac5_safety_feat_dump (struct stmmac_safety_stats *stats, -int index,unsigned long *count); +int dwmac5_safety_feat_dump (struct stmmac_safety_stats *stats, +int index,unsigned long *count,const char **desc);#endif /* __DWMAC5_H__ */
drivers/net/ethernet/stmicro/stmmac/hwif.h +138 -0
142 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +25 -43
155 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +58 -64
331 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH 4/5 net: stmmac: Switch stmmac_hwtimestamp to generic HW Interface Helpers
In reply to Jose AbreuSwitch stmmac_hwtimestamp to generic Hardware Interface Helpers instead of using hard-coded callbacks. This makes the code more readable and more flexible.
No functional change.
--- drivers/net/ethernet/stmicro/stmmac/common.h | 12 -------- drivers/net/ethernet/stmicro/stmmac/hwif.h | 25 ++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 34 ++++++++++++---------- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 17 +++++------ drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 18 ++++-------- 5 files changed, 56 insertions(+), 50 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +0 -12
@@ -383,18 +383,6 @@ extern const struct stmmac_desc_ops ndesc_ops;struct mac_device_info ; -/* PTP and HW Timer helpers */ -struct stmmac_hwtimestamp { -void (*config_hw_tstamping) (void __iomem *ioaddr,u32 data); -u32 (*config_sub_second_increment)(void __iomem *ioaddr,u32 ptp_clock, -int gmac4); -int (*init_systime) (void __iomem *ioaddr,u32 sec,u32 nsec); -int (*config_addend) (void __iomem *ioaddr,u32 addend); -int (*adjust_systime) (void __iomem *ioaddr,u32 sec,u32 nsec, -int add_sub,int gmac4); -u64 (*get_systime) (void __iomem *ioaddr); -}; -extern const struct stmmac_hwtimestamp stmmac_ptp;extern const struct stmmac_mode_ops dwmac4_ring_mode_ops;
drivers/net/ethernet/stmicro/stmmac/hwif.h +25 -0
@@ -366,4 +366,29 @@ struct stmmac_ops { #define stmmac_safety_feat_dump(__priv, __args...) \ stmmac_do_callback(__priv, mac, safety_feat_dump, __args) +/* PTP and HW Timer helpers */ +struct stmmac_hwtimestamp { +void (*config_hw_tstamping) (void __iomem *ioaddr,u32 data); +void (*config_sub_second_increment)(void __iomem *ioaddr,u32 ptp_clock, +int gmac4,u32 *ssinc); +int (*init_systime) (void __iomem *ioaddr,u32 sec,u32 nsec); +int (*config_addend) (void __iomem *ioaddr,u32 addend); +int (*adjust_systime) (void __iomem *ioaddr,u32 sec,u32 nsec, +int add_sub,int gmac4); +void (*get_systime) (void __iomem *ioaddr,u64 *systime); +}; + +#define stmmac_config_hw_tstamping(__priv, __args...) \ + stmmac_do_void_callback(__priv, ptp, config_hw_tstamping, __args) +#define stmmac_config_sub_second_increment(__priv, __args...) \ + stmmac_do_void_callback(__priv, ptp, config_sub_second_increment, __args) +#define stmmac_init_systime(__priv, __args...) \ + stmmac_do_callback(__priv, ptp, init_systime, __args) +#define stmmac_config_addend(__priv, __args...) \ + stmmac_do_callback(__priv, ptp, config_addend, __args) +#define stmmac_adjust_systime(__priv, __args...) \ + stmmac_do_callback(__priv, ptp, adjust_systime, __args) +#define stmmac_get_systime(__priv, __args...) \ + stmmac_do_void_callback(__priv, ptp, get_systime, __args) +#endif /* __STMMAC_HWIF_H__ */
drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +18 -16
@@ -24,13 +24,13 @@#include "common.h" #include "stmmac_ptp.h" -static void stmmac_config_hw_tstamping (void __iomem *ioaddr,u32 data) +static void config_hw_tstamping (void __iomem *ioaddr,u32 data) {writel (data, ioaddr +PTP_TCR ); } -static u32 stmmac_config_sub_second_increment (void __iomem *ioaddr, -u32 ptp_clock,int gmac4) +static void config_sub_second_increment (void __iomem *ioaddr, +u32 ptp_clock,int gmac4,u32 *ssinc) {u32 value =readl (ioaddr +PTP_TCR );unsigned long data;
@@ -57,10 +57,11 @@ static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr,writel (reg_value, ioaddr +PTP_SSIR ); -return data; +if (ssinc) + *ssinc = data; } -static int stmmac_init_systime (void __iomem *ioaddr,u32 sec,u32 nsec) +static int init_systime (void __iomem *ioaddr,u32 sec,u32 nsec) {int limit;u32 value;
@@ -85,7 +86,7 @@ static int stmmac_init_systime(void __iomem *ioaddr, u32 sec, u32 nsec)return 0 ; } -static int stmmac_config_addend (void __iomem *ioaddr,u32 addend) +static int config_addend (void __iomem *ioaddr,u32 addend) {u32 value;int limit;
@@ -109,8 +110,8 @@ static int stmmac_config_addend(void __iomem *ioaddr, u32 addend)return 0 ; } -static int stmmac_adjust_systime (void __iomem *ioaddr,u32 sec,u32 nsec, -int add_sub,int gmac4) +static int adjust_systime (void __iomem *ioaddr,u32 sec,u32 nsec, +int add_sub,int gmac4) {u32 value;int limit;
@@ -152,7 +153,7 @@ static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,return 0 ; } -static u64 stmmac_get_systime (void __iomem *ioaddr) +static void get_systime (void __iomem *ioaddr,u64 *systime) {u64 ns;
@@ -161,14 +162,15 @@ static u64 stmmac_get_systime(void __iomem *ioaddr)/* Get the TSS and convert sec time value to nanosecond */ ns +=readl (ioaddr +PTP_STSR ) *1000000000ULL ; -return ns; +if (systime) + *systime = ns; }const struct stmmac_hwtimestamp stmmac_ptp = { - .config_hw_tstamping = stmmac_config_hw_tstamping, - .init_systime = stmmac_init_systime, - .config_sub_second_increment = stmmac_config_sub_second_increment, - .config_addend = stmmac_config_addend, - .adjust_systime = stmmac_adjust_systime, - .get_systime = stmmac_get_systime, + .config_hw_tstamping = config_hw_tstamping, + .init_systime = init_systime, + .config_sub_second_increment = config_sub_second_increment, + .config_addend = config_addend, + .adjust_systime = adjust_systime, + .get_systime = get_systime, };
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +8 -9
@@ -707,18 +707,18 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) priv->hwts_tx_en = config.tx_type ==HWTSTAMP_TX_ON ;if (!priv->hwts_tx_en && !priv->hwts_rx_en) - priv->hw->ptp->config_hw_tstamping (priv->ptpaddr,0 ); +stmmac_config_hw_tstamping (priv, priv->ptpaddr,0 );else { value = (PTP_TCR_TSENA |PTP_TCR_TSCFUPDT |PTP_TCR_TSCTRLSSR | tstamp_all | ptp_v2 | ptp_over_ethernet | ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en | ts_master_en | snap_type_sel); - priv->hw->ptp->config_hw_tstamping (priv->ptpaddr, value); +stmmac_config_hw_tstamping (priv, priv->ptpaddr, value);/* program Sub Second Increment reg */ - sec_inc = priv->hw->ptp->config_sub_second_increment ( - priv->ptpaddr, priv->plat->clk_ptp_rate, - priv->plat->has_gmac4); +stmmac_config_sub_second_increment (priv, + priv->ptpaddr, priv->plat->clk_ptp_rate, + priv->plat->has_gmac4, &sec_inc); temp =div_u64 (1000000000ULL , sec_inc);/* calculate default added value:
@@ -728,15 +728,14 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)*/ temp = (u64)(temp <<32 ); priv->default_addend =div_u64 (temp, priv->plat->clk_ptp_rate); - priv->hw->ptp->config_addend (priv->ptpaddr, - priv->default_addend); +stmmac_config_addend (priv, priv->ptpaddr, priv->default_addend);/* initialize system time */ ktime_get_real_ts64 (&now);/* lower 32 bits of tv_sec are safe until y2106 */ - priv->hw->ptp->init_systime (priv->ptpaddr, (u32 )now.tv_sec, - now.tv_nsec); +stmmac_init_systime (priv, priv->ptpaddr, + (u32 )now.tv_sec, now.tv_nsec); } return copy_to_user(ifr->ifr_data, &config,
drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +5 -13
@@ -49,9 +49,7 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb) addend = neg_adj ? (addend - diff) : (addend + diff);spin_lock_irqsave (&priv->ptp_lock, flags); - - priv->hw->ptp->config_addend (priv->ptpaddr, addend); - +stmmac_config_addend (priv, priv->ptpaddr, addend);spin_unlock_irqrestore (&priv->ptp_lock, flags);return 0 ;
@@ -84,10 +82,8 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta) nsec = reminder;spin_lock_irqsave (&priv->ptp_lock, flags); - - priv->hw->ptp->adjust_systime (priv->ptpaddr, sec, nsec, neg_adj, - priv->plat->has_gmac4); - +stmmac_adjust_systime (priv, priv->ptpaddr, sec, nsec, neg_adj, + priv->plat->has_gmac4);spin_unlock_irqrestore (&priv->ptp_lock, flags);return 0 ;
@@ -110,9 +106,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts)u64 ns;spin_lock_irqsave (&priv->ptp_lock, flags); - - ns = priv->hw->ptp->get_systime (priv->ptpaddr); - +stmmac_get_systime (priv, priv->ptpaddr, &ns);spin_unlock_irqrestore (&priv->ptp_lock, flags); *ts =ns_to_timespec64 (ns);
@@ -137,9 +131,7 @@ static int stmmac_set_time(struct ptp_clock_info *ptp,unsigned long flags;spin_lock_irqsave (&priv->ptp_lock, flags); - - priv->hw->ptp->init_systime (priv->ptpaddr, ts->tv_sec, ts->tv_nsec); - +stmmac_init_systime (priv, priv->ptpaddr, ts->tv_sec, ts->tv_nsec);spin_unlock_irqrestore (&priv->ptp_lock, flags);return 0 ;
Signature · 1 line
2.9.3
PATCH 5/5 net: stmmac: Switch stmmac_mode_ops to generic HW Interface Helpers
In reply to Jose AbreuSwitch stmmac_mode_ops to generic Hardware Interface Helpers instead of using hard-coded callbacks. This makes the code more readable and more flexible.
No functional change.
--- drivers/net/ethernet/stmicro/stmmac/chain_mode.c | 20 +++++------ drivers/net/ethernet/stmicro/stmmac/common.h | 12 ------- drivers/net/ethernet/stmicro/stmmac/hwif.h | 27 ++++++++++++++ drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 24 ++++++------- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 43 ++++++++++------------- 5 files changed, 68 insertions(+), 58 deletions(-)
drivers/net/ethernet/stmicro/stmmac/chain_mode.c +10 -10
@@ -24,7 +24,7 @@#include "stmmac.h" -static int stmmac_jumbo_frm (void *p,struct sk_buff *skb,int csum) +static int jumbo_frm (void *p,struct sk_buff *skb,int csum) {struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;unsigned int nopaged_len =skb_headlen (skb);
@@ -93,7 +93,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)return entry; } -static unsigned int stmmac_is_jumbo_frm (int len,int enh_desc) +static unsigned int is_jumbo_frm (int len,int enh_desc) {unsigned int ret =0 ;
@@ -105,7 +105,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)return ret; } -static void stmmac_init_dma_chain (void *des,dma_addr_t phy_addr, +static void init_dma_chain (void *des,dma_addr_t phy_addr,unsigned int size,unsigned int extend_desc) {/*
@@ -135,7 +135,7 @@ static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr, } } -static void stmmac_refill_desc3 (void *priv_ptr,struct dma_desc *p) +static void refill_desc3 (void *priv_ptr,struct dma_desc *p) {struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)priv_ptr;struct stmmac_priv *priv = rx_q->priv_data;
@@ -151,7 +151,7 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) sizeof(struct dma_desc))); } -static void stmmac_clean_desc3 (void *priv_ptr,struct dma_desc *p) +static void clean_desc3 (void *priv_ptr,struct dma_desc *p) {struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;struct stmmac_priv *priv = tx_q->priv_data;
@@ -169,9 +169,9 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) }const struct stmmac_mode_ops chain_mode_ops = { - .init = stmmac_init_dma_chain, - .is_jumbo_frm = stmmac_is_jumbo_frm, - .jumbo_frm = stmmac_jumbo_frm, - .refill_desc3 = stmmac_refill_desc3, - .clean_desc3 = stmmac_clean_desc3, + .init = init_dma_chain, + .is_jumbo_frm = is_jumbo_frm, + .jumbo_frm = jumbo_frm, + .refill_desc3 = refill_desc3, + .clean_desc3 = clean_desc3, };
drivers/net/ethernet/stmicro/stmmac/common.h +0 -12
@@ -405,18 +405,6 @@ struct mii_regs {unsigned int clk_csr_mask; }; -/* Helpers to manage the descriptors for chain and ring modes */ -struct stmmac_mode_ops { -void (*init) (void *des,dma_addr_t phy_addr,unsigned int size, -unsigned int extend_desc); -unsigned int (*is_jumbo_frm) (int len,int ehn_desc); -int (*jumbo_frm)(void *priv,struct sk_buff *skb,int csum); -int (*set_16kib_bfsize)(int mtu); -void (*init_desc3)(struct dma_desc *p); -void (*refill_desc3) (void *priv,struct dma_desc *p); -void (*clean_desc3) (void *priv,struct dma_desc *p); -}; -struct mac_device_info {const struct stmmac_ops *mac;const struct stmmac_desc_ops *desc;
drivers/net/ethernet/stmicro/stmmac/hwif.h +27 -0
@@ -391,4 +391,31 @@ struct stmmac_hwtimestamp { #define stmmac_get_systime(__priv, __args...) \ stmmac_do_void_callback(__priv, ptp, get_systime, __args) +/* Helpers to manage the descriptors for chain and ring modes */ +struct stmmac_mode_ops { +void (*init) (void *des,dma_addr_t phy_addr,unsigned int size, +unsigned int extend_desc); +unsigned int (*is_jumbo_frm) (int len,int ehn_desc); +int (*jumbo_frm)(void *priv,struct sk_buff *skb,int csum); +int (*set_16kib_bfsize)(int mtu); +void (*init_desc3)(struct dma_desc *p); +void (*refill_desc3) (void *priv,struct dma_desc *p); +void (*clean_desc3) (void *priv,struct dma_desc *p); +}; + +#define stmmac_mode_init(__priv, __args...) \ + stmmac_do_void_callback(__priv, mode, init, __args) +#define stmmac_is_jumbo_frm(__priv, __args...) \ + stmmac_do_callback(__priv, mode, is_jumbo_frm, __args) +#define stmmac_jumbo_frm(__priv, __args...) \ + stmmac_do_callback(__priv, mode, jumbo_frm, __args) +#define stmmac_set_16kib_bfsize(__priv, __args...) \ + stmmac_do_callback(__priv, mode, set_16kib_bfsize, __args) +#define stmmac_init_desc3(__priv, __args...) \ + stmmac_do_void_callback(__priv, mode, init_desc3, __args) +#define stmmac_refill_desc3(__priv, __args...) \ + stmmac_do_void_callback(__priv, mode, refill_desc3, __args) +#define stmmac_clean_desc3(__priv, __args...) \ + stmmac_do_void_callback(__priv, mode, clean_desc3, __args) +#endif /* __STMMAC_HWIF_H__ */
drivers/net/ethernet/stmicro/stmmac/ring_mode.c +12 -12
@@ -24,7 +24,7 @@#include "stmmac.h" -static int stmmac_jumbo_frm (void *p,struct sk_buff *skb,int csum) +static int jumbo_frm (void *p,struct sk_buff *skb,int csum) {struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;unsigned int nopaged_len =skb_headlen (skb);
@@ -99,7 +99,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)return entry; } -static unsigned int stmmac_is_jumbo_frm (int len,int enh_desc) +static unsigned int is_jumbo_frm (int len,int enh_desc) {unsigned int ret =0 ;
@@ -109,7 +109,7 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)return ret; } -static void stmmac_refill_desc3 (void *priv_ptr,struct dma_desc *p) +static void refill_desc3 (void *priv_ptr,struct dma_desc *p) {struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr;
@@ -119,12 +119,12 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) }/* In ring mode we need to fill the desc3 because it is used as buffer */ -static void stmmac_init_desc3 (struct dma_desc *p) +static void init_desc3 (struct dma_desc *p) { p->des3 =cpu_to_le32 (le32_to_cpu (p->des2) + BUF_SIZE_8KiB); } -static void stmmac_clean_desc3 (void *priv_ptr,struct dma_desc *p) +static void clean_desc3 (void *priv_ptr,struct dma_desc *p) {struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;struct stmmac_priv *priv = tx_q->priv_data;
@@ -137,7 +137,7 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) p->des3 =0 ; } -static int stmmac_set_16kib_bfsize (int mtu) +static int set_16kib_bfsize (int mtu) {int ret =0 ;if (unlikely (mtu >= BUF_SIZE_8KiB))
@@ -146,10 +146,10 @@ static int stmmac_set_16kib_bfsize(int mtu) }const struct stmmac_mode_ops ring_mode_ops = { - .is_jumbo_frm = stmmac_is_jumbo_frm, - .jumbo_frm = stmmac_jumbo_frm, - .refill_desc3 = stmmac_refill_desc3, - .init_desc3 = stmmac_init_desc3, - .clean_desc3 = stmmac_clean_desc3, - .set_16kib_bfsize = stmmac_set_16kib_bfsize, + .is_jumbo_frm = is_jumbo_frm, + .jumbo_frm = jumbo_frm, + .refill_desc3 = refill_desc3, + .init_desc3 = init_desc3, + .clean_desc3 = clean_desc3, + .set_16kib_bfsize = set_16kib_bfsize, };
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +19 -24
94 lines not on this page · raw message
Signature · 1 line
2.9.3
David Miller
maintainerFrom: Jose Abreu <[email protected]>
Date: Fri, 6 Apr 2018 14:08:14 +0100
Quoted 10 lines
This a starting point for a cleanup and re-organization of stmmac.
In this series we stop using hard-coded callbacks along the code and use instead helpers which are defined in a single place ("
hwif.h").This brings several advantages:
1) Less typing :)
2) Guaranteed function pointer check
3) More flexibility
Quoted 8 lines
By 2) we stop using the repeated pattern of:
if (priv->hw->mac->some_func) priv->hw->mac->some_func(...)I didn't check but I expect the final .ko will be bigger with this series because *all* of function pointers are checked.
Anyway, I hope this can make the code more readable and more flexible now.
The net-next tree is closed, please resubmit this series when it opens back up.
Thank you.
David Miller
maintainerFrom: Jose Abreu <[email protected]>
Date: Mon, 16 Apr 2018 16:08:11 +0100
Quoted 14 lines
This a starting point for a cleanup and re-organization of stmmac.
In this series we stop using hard-coded callbacks along the code and use instead helpers which are defined in a single place ("
hwif.h").This brings several advantages:
1) Less typing :)
2) Guaranteed function pointer check
3) More flexibilityBy 2) we stop using the repeated pattern of:
if (priv->hw->mac->some_func) priv->hw->mac->some_func(...)
Quoted 6 lines
I didn't check but I expect the final .ko will be bigger with this series because *all* of function pointers are checked.
Anyway, I hope this can make the code more readable and more flexible now.
[resending as per David Miller request]
Series applied, thanks Jose.