Skip to content

Commit f10a6a3

Browse files
atorguedavem330
authored andcommitted
stmmac: rework get_hw_feature function
On next GMAC IP generation (4.xx), the way to get hw feature is not the same than on previous 3.xx. As it is hardware dependent, the way to get hw capabilities should be defined in dma ops of each MAC IP. It will avoid also a huge computation of hw capabilities in stmmac_main. Signed-off-by: Alexandre TORGUE <[email protected]> Signed-off-by: Giuseppe Cavallaro <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5ada37b commit f10a6a3

File tree

3 files changed

+42
-46
lines changed

3 files changed

+42
-46
lines changed

drivers/net/ethernet/stmicro/stmmac/common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,8 @@ struct stmmac_dma_ops {
412412
int (*dma_interrupt) (void __iomem *ioaddr,
413413
struct stmmac_extra_stats *x);
414414
/* If supported then get the optional core features */
415-
unsigned int (*get_hw_feature) (void __iomem *ioaddr);
415+
void (*get_hw_feature)(void __iomem *ioaddr,
416+
struct dma_features *dma_cap);
416417
/* Program the HW RX Watchdog */
417418
void (*rx_watchdog) (void __iomem *ioaddr, u32 riwt);
418419
};

drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,40 @@ static void dwmac1000_dump_dma_regs(void __iomem *ioaddr)
215215
}
216216
}
217217

218-
static unsigned int dwmac1000_get_hw_feature(void __iomem *ioaddr)
218+
static void dwmac1000_get_hw_feature(void __iomem *ioaddr,
219+
struct dma_features *dma_cap)
219220
{
220-
return readl(ioaddr + DMA_HW_FEATURE);
221+
u32 hw_cap = readl(ioaddr + DMA_HW_FEATURE);
222+
223+
dma_cap->mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
224+
dma_cap->mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
225+
dma_cap->half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
226+
dma_cap->hash_filter = (hw_cap & DMA_HW_FEAT_HASHSEL) >> 4;
227+
dma_cap->multi_addr = (hw_cap & DMA_HW_FEAT_ADDMAC) >> 5;
228+
dma_cap->pcs = (hw_cap & DMA_HW_FEAT_PCSSEL) >> 6;
229+
dma_cap->sma_mdio = (hw_cap & DMA_HW_FEAT_SMASEL) >> 8;
230+
dma_cap->pmt_remote_wake_up = (hw_cap & DMA_HW_FEAT_RWKSEL) >> 9;
231+
dma_cap->pmt_magic_frame = (hw_cap & DMA_HW_FEAT_MGKSEL) >> 10;
232+
/* MMC */
233+
dma_cap->rmon = (hw_cap & DMA_HW_FEAT_MMCSEL) >> 11;
234+
/* IEEE 1588-2002 */
235+
dma_cap->time_stamp =
236+
(hw_cap & DMA_HW_FEAT_TSVER1SEL) >> 12;
237+
/* IEEE 1588-2008 */
238+
dma_cap->atime_stamp = (hw_cap & DMA_HW_FEAT_TSVER2SEL) >> 13;
239+
/* 802.3az - Energy-Efficient Ethernet (EEE) */
240+
dma_cap->eee = (hw_cap & DMA_HW_FEAT_EEESEL) >> 14;
241+
dma_cap->av = (hw_cap & DMA_HW_FEAT_AVSEL) >> 15;
242+
/* TX and RX csum */
243+
dma_cap->tx_coe = (hw_cap & DMA_HW_FEAT_TXCOESEL) >> 16;
244+
dma_cap->rx_coe_type1 = (hw_cap & DMA_HW_FEAT_RXTYP1COE) >> 17;
245+
dma_cap->rx_coe_type2 = (hw_cap & DMA_HW_FEAT_RXTYP2COE) >> 18;
246+
dma_cap->rxfifo_over_2048 = (hw_cap & DMA_HW_FEAT_RXFIFOSIZE) >> 19;
247+
/* TX and RX number of channels */
248+
dma_cap->number_rx_channel = (hw_cap & DMA_HW_FEAT_RXCHCNT) >> 20;
249+
dma_cap->number_tx_channel = (hw_cap & DMA_HW_FEAT_TXCHCNT) >> 22;
250+
/* Alternate (enhanced) DESC mode */
251+
dma_cap->enh_desc = (hw_cap & DMA_HW_FEAT_ENHDESSEL) >> 24;
221252
}
222253

223254
static void dwmac1000_rx_watchdog(void __iomem *ioaddr, u32 riwt)

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,51 +1552,15 @@ static void stmmac_selec_desc_mode(struct stmmac_priv *priv)
15521552
*/
15531553
static int stmmac_get_hw_features(struct stmmac_priv *priv)
15541554
{
1555-
u32 hw_cap = 0;
1555+
u32 ret = 0;
15561556

15571557
if (priv->hw->dma->get_hw_feature) {
1558-
hw_cap = priv->hw->dma->get_hw_feature(priv->ioaddr);
1559-
1560-
priv->dma_cap.mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
1561-
priv->dma_cap.mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
1562-
priv->dma_cap.half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
1563-
priv->dma_cap.hash_filter = (hw_cap & DMA_HW_FEAT_HASHSEL) >> 4;
1564-
priv->dma_cap.multi_addr = (hw_cap & DMA_HW_FEAT_ADDMAC) >> 5;
1565-
priv->dma_cap.pcs = (hw_cap & DMA_HW_FEAT_PCSSEL) >> 6;
1566-
priv->dma_cap.sma_mdio = (hw_cap & DMA_HW_FEAT_SMASEL) >> 8;
1567-
priv->dma_cap.pmt_remote_wake_up =
1568-
(hw_cap & DMA_HW_FEAT_RWKSEL) >> 9;
1569-
priv->dma_cap.pmt_magic_frame =
1570-
(hw_cap & DMA_HW_FEAT_MGKSEL) >> 10;
1571-
/* MMC */
1572-
priv->dma_cap.rmon = (hw_cap & DMA_HW_FEAT_MMCSEL) >> 11;
1573-
/* IEEE 1588-2002 */
1574-
priv->dma_cap.time_stamp =
1575-
(hw_cap & DMA_HW_FEAT_TSVER1SEL) >> 12;
1576-
/* IEEE 1588-2008 */
1577-
priv->dma_cap.atime_stamp =
1578-
(hw_cap & DMA_HW_FEAT_TSVER2SEL) >> 13;
1579-
/* 802.3az - Energy-Efficient Ethernet (EEE) */
1580-
priv->dma_cap.eee = (hw_cap & DMA_HW_FEAT_EEESEL) >> 14;
1581-
priv->dma_cap.av = (hw_cap & DMA_HW_FEAT_AVSEL) >> 15;
1582-
/* TX and RX csum */
1583-
priv->dma_cap.tx_coe = (hw_cap & DMA_HW_FEAT_TXCOESEL) >> 16;
1584-
priv->dma_cap.rx_coe_type1 =
1585-
(hw_cap & DMA_HW_FEAT_RXTYP1COE) >> 17;
1586-
priv->dma_cap.rx_coe_type2 =
1587-
(hw_cap & DMA_HW_FEAT_RXTYP2COE) >> 18;
1588-
priv->dma_cap.rxfifo_over_2048 =
1589-
(hw_cap & DMA_HW_FEAT_RXFIFOSIZE) >> 19;
1590-
/* TX and RX number of channels */
1591-
priv->dma_cap.number_rx_channel =
1592-
(hw_cap & DMA_HW_FEAT_RXCHCNT) >> 20;
1593-
priv->dma_cap.number_tx_channel =
1594-
(hw_cap & DMA_HW_FEAT_TXCHCNT) >> 22;
1595-
/* Alternate (enhanced) DESC mode */
1596-
priv->dma_cap.enh_desc = (hw_cap & DMA_HW_FEAT_ENHDESSEL) >> 24;
1597-
}
1598-
1599-
return hw_cap;
1558+
priv->hw->dma->get_hw_feature(priv->ioaddr,
1559+
&priv->dma_cap);
1560+
ret = 1;
1561+
}
1562+
1563+
return ret;
16001564
}
16011565

16021566
/**

0 commit comments

Comments
 (0)