Lines Matching refs:pdata
126 static unsigned int xgbe_usec_to_riwt(struct xgbe_prv_data *pdata, in xgbe_usec_to_riwt() argument
134 rate = pdata->sysclk_rate; in xgbe_usec_to_riwt()
149 static unsigned int xgbe_riwt_to_usec(struct xgbe_prv_data *pdata, in xgbe_riwt_to_usec() argument
157 rate = pdata->sysclk_rate; in xgbe_riwt_to_usec()
172 static int xgbe_config_pblx8(struct xgbe_prv_data *pdata) in xgbe_config_pblx8() argument
177 channel = pdata->channel; in xgbe_config_pblx8()
178 for (i = 0; i < pdata->channel_count; i++, channel++) in xgbe_config_pblx8()
180 pdata->pblx8); in xgbe_config_pblx8()
185 static int xgbe_get_tx_pbl_val(struct xgbe_prv_data *pdata) in xgbe_get_tx_pbl_val() argument
187 return XGMAC_DMA_IOREAD_BITS(pdata->channel, DMA_CH_TCR, PBL); in xgbe_get_tx_pbl_val()
190 static int xgbe_config_tx_pbl_val(struct xgbe_prv_data *pdata) in xgbe_config_tx_pbl_val() argument
195 channel = pdata->channel; in xgbe_config_tx_pbl_val()
196 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_tx_pbl_val()
201 pdata->tx_pbl); in xgbe_config_tx_pbl_val()
207 static int xgbe_get_rx_pbl_val(struct xgbe_prv_data *pdata) in xgbe_get_rx_pbl_val() argument
209 return XGMAC_DMA_IOREAD_BITS(pdata->channel, DMA_CH_RCR, PBL); in xgbe_get_rx_pbl_val()
212 static int xgbe_config_rx_pbl_val(struct xgbe_prv_data *pdata) in xgbe_config_rx_pbl_val() argument
217 channel = pdata->channel; in xgbe_config_rx_pbl_val()
218 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_rx_pbl_val()
223 pdata->rx_pbl); in xgbe_config_rx_pbl_val()
229 static int xgbe_config_osp_mode(struct xgbe_prv_data *pdata) in xgbe_config_osp_mode() argument
234 channel = pdata->channel; in xgbe_config_osp_mode()
235 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_osp_mode()
240 pdata->tx_osp_mode); in xgbe_config_osp_mode()
246 static int xgbe_config_rsf_mode(struct xgbe_prv_data *pdata, unsigned int val) in xgbe_config_rsf_mode() argument
250 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_config_rsf_mode()
251 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RSF, val); in xgbe_config_rsf_mode()
256 static int xgbe_config_tsf_mode(struct xgbe_prv_data *pdata, unsigned int val) in xgbe_config_tsf_mode() argument
260 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_config_tsf_mode()
261 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TSF, val); in xgbe_config_tsf_mode()
266 static int xgbe_config_rx_threshold(struct xgbe_prv_data *pdata, in xgbe_config_rx_threshold() argument
271 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_config_rx_threshold()
272 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RTC, val); in xgbe_config_rx_threshold()
277 static int xgbe_config_tx_threshold(struct xgbe_prv_data *pdata, in xgbe_config_tx_threshold() argument
282 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_config_tx_threshold()
283 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TTC, val); in xgbe_config_tx_threshold()
288 static int xgbe_config_rx_coalesce(struct xgbe_prv_data *pdata) in xgbe_config_rx_coalesce() argument
293 channel = pdata->channel; in xgbe_config_rx_coalesce()
294 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_rx_coalesce()
299 pdata->rx_riwt); in xgbe_config_rx_coalesce()
305 static int xgbe_config_tx_coalesce(struct xgbe_prv_data *pdata) in xgbe_config_tx_coalesce() argument
310 static void xgbe_config_rx_buffer_size(struct xgbe_prv_data *pdata) in xgbe_config_rx_buffer_size() argument
315 channel = pdata->channel; in xgbe_config_rx_buffer_size()
316 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_rx_buffer_size()
321 pdata->rx_buf_size); in xgbe_config_rx_buffer_size()
325 static void xgbe_config_tso_mode(struct xgbe_prv_data *pdata) in xgbe_config_tso_mode() argument
330 channel = pdata->channel; in xgbe_config_tso_mode()
331 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_tso_mode()
339 static void xgbe_config_sph_mode(struct xgbe_prv_data *pdata) in xgbe_config_sph_mode() argument
344 channel = pdata->channel; in xgbe_config_sph_mode()
345 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_config_sph_mode()
352 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, HDSMS, XGBE_SPH_HDSMS_SIZE); in xgbe_config_sph_mode()
355 static int xgbe_write_rss_reg(struct xgbe_prv_data *pdata, unsigned int type, in xgbe_write_rss_reg() argument
361 mutex_lock(&pdata->rss_mutex); in xgbe_write_rss_reg()
363 if (XGMAC_IOREAD_BITS(pdata, MAC_RSSAR, OB)) { in xgbe_write_rss_reg()
368 XGMAC_IOWRITE(pdata, MAC_RSSDR, val); in xgbe_write_rss_reg()
370 XGMAC_IOWRITE_BITS(pdata, MAC_RSSAR, RSSIA, index); in xgbe_write_rss_reg()
371 XGMAC_IOWRITE_BITS(pdata, MAC_RSSAR, ADDRT, type); in xgbe_write_rss_reg()
372 XGMAC_IOWRITE_BITS(pdata, MAC_RSSAR, CT, 0); in xgbe_write_rss_reg()
373 XGMAC_IOWRITE_BITS(pdata, MAC_RSSAR, OB, 1); in xgbe_write_rss_reg()
377 if (!XGMAC_IOREAD_BITS(pdata, MAC_RSSAR, OB)) in xgbe_write_rss_reg()
386 mutex_unlock(&pdata->rss_mutex); in xgbe_write_rss_reg()
391 static int xgbe_write_rss_hash_key(struct xgbe_prv_data *pdata) in xgbe_write_rss_hash_key() argument
393 unsigned int key_regs = sizeof(pdata->rss_key) / sizeof(u32); in xgbe_write_rss_hash_key()
394 unsigned int *key = (unsigned int *)&pdata->rss_key; in xgbe_write_rss_hash_key()
398 ret = xgbe_write_rss_reg(pdata, XGBE_RSS_HASH_KEY_TYPE, in xgbe_write_rss_hash_key()
407 static int xgbe_write_rss_lookup_table(struct xgbe_prv_data *pdata) in xgbe_write_rss_lookup_table() argument
412 for (i = 0; i < ARRAY_SIZE(pdata->rss_table); i++) { in xgbe_write_rss_lookup_table()
413 ret = xgbe_write_rss_reg(pdata, in xgbe_write_rss_lookup_table()
415 pdata->rss_table[i]); in xgbe_write_rss_lookup_table()
423 static int xgbe_set_rss_hash_key(struct xgbe_prv_data *pdata, const u8 *key) in xgbe_set_rss_hash_key() argument
425 memcpy(pdata->rss_key, key, sizeof(pdata->rss_key)); in xgbe_set_rss_hash_key()
427 return xgbe_write_rss_hash_key(pdata); in xgbe_set_rss_hash_key()
430 static int xgbe_set_rss_lookup_table(struct xgbe_prv_data *pdata, in xgbe_set_rss_lookup_table() argument
435 for (i = 0; i < ARRAY_SIZE(pdata->rss_table); i++) in xgbe_set_rss_lookup_table()
436 XGMAC_SET_BITS(pdata->rss_table[i], MAC_RSSDR, DMCH, table[i]); in xgbe_set_rss_lookup_table()
438 return xgbe_write_rss_lookup_table(pdata); in xgbe_set_rss_lookup_table()
441 static int xgbe_enable_rss(struct xgbe_prv_data *pdata) in xgbe_enable_rss() argument
445 if (!pdata->hw_feat.rss) in xgbe_enable_rss()
449 ret = xgbe_write_rss_hash_key(pdata); in xgbe_enable_rss()
454 ret = xgbe_write_rss_lookup_table(pdata); in xgbe_enable_rss()
459 XGMAC_IOWRITE(pdata, MAC_RSSCR, pdata->rss_options); in xgbe_enable_rss()
462 XGMAC_IOWRITE_BITS(pdata, MAC_RSSCR, RSSE, 1); in xgbe_enable_rss()
467 static int xgbe_disable_rss(struct xgbe_prv_data *pdata) in xgbe_disable_rss() argument
469 if (!pdata->hw_feat.rss) in xgbe_disable_rss()
472 XGMAC_IOWRITE_BITS(pdata, MAC_RSSCR, RSSE, 0); in xgbe_disable_rss()
477 static void xgbe_config_rss(struct xgbe_prv_data *pdata) in xgbe_config_rss() argument
481 if (!pdata->hw_feat.rss) in xgbe_config_rss()
484 if (pdata->netdev->features & NETIF_F_RXHASH) in xgbe_config_rss()
485 ret = xgbe_enable_rss(pdata); in xgbe_config_rss()
487 ret = xgbe_disable_rss(pdata); in xgbe_config_rss()
490 netdev_err(pdata->netdev, in xgbe_config_rss()
494 static int xgbe_disable_tx_flow_control(struct xgbe_prv_data *pdata) in xgbe_disable_tx_flow_control() argument
501 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_disable_tx_flow_control()
502 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, EHFC, 0); in xgbe_disable_tx_flow_control()
506 q_count = min_t(unsigned int, pdata->tx_q_count, max_q_count); in xgbe_disable_tx_flow_control()
509 reg_val = XGMAC_IOREAD(pdata, reg); in xgbe_disable_tx_flow_control()
511 XGMAC_IOWRITE(pdata, reg, reg_val); in xgbe_disable_tx_flow_control()
519 static int xgbe_enable_tx_flow_control(struct xgbe_prv_data *pdata) in xgbe_enable_tx_flow_control() argument
526 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_enable_tx_flow_control()
527 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, EHFC, 1); in xgbe_enable_tx_flow_control()
531 q_count = min_t(unsigned int, pdata->tx_q_count, max_q_count); in xgbe_enable_tx_flow_control()
534 reg_val = XGMAC_IOREAD(pdata, reg); in xgbe_enable_tx_flow_control()
541 XGMAC_IOWRITE(pdata, reg, reg_val); in xgbe_enable_tx_flow_control()
549 static int xgbe_disable_rx_flow_control(struct xgbe_prv_data *pdata) in xgbe_disable_rx_flow_control() argument
551 XGMAC_IOWRITE_BITS(pdata, MAC_RFCR, RFE, 0); in xgbe_disable_rx_flow_control()
556 static int xgbe_enable_rx_flow_control(struct xgbe_prv_data *pdata) in xgbe_enable_rx_flow_control() argument
558 XGMAC_IOWRITE_BITS(pdata, MAC_RFCR, RFE, 1); in xgbe_enable_rx_flow_control()
563 static int xgbe_config_tx_flow_control(struct xgbe_prv_data *pdata) in xgbe_config_tx_flow_control() argument
565 struct ieee_pfc *pfc = pdata->pfc; in xgbe_config_tx_flow_control()
567 if (pdata->tx_pause || (pfc && pfc->pfc_en)) in xgbe_config_tx_flow_control()
568 xgbe_enable_tx_flow_control(pdata); in xgbe_config_tx_flow_control()
570 xgbe_disable_tx_flow_control(pdata); in xgbe_config_tx_flow_control()
575 static int xgbe_config_rx_flow_control(struct xgbe_prv_data *pdata) in xgbe_config_rx_flow_control() argument
577 struct ieee_pfc *pfc = pdata->pfc; in xgbe_config_rx_flow_control()
579 if (pdata->rx_pause || (pfc && pfc->pfc_en)) in xgbe_config_rx_flow_control()
580 xgbe_enable_rx_flow_control(pdata); in xgbe_config_rx_flow_control()
582 xgbe_disable_rx_flow_control(pdata); in xgbe_config_rx_flow_control()
587 static void xgbe_config_flow_control(struct xgbe_prv_data *pdata) in xgbe_config_flow_control() argument
589 struct ieee_pfc *pfc = pdata->pfc; in xgbe_config_flow_control()
591 xgbe_config_tx_flow_control(pdata); in xgbe_config_flow_control()
592 xgbe_config_rx_flow_control(pdata); in xgbe_config_flow_control()
594 XGMAC_IOWRITE_BITS(pdata, MAC_RFCR, PFCE, in xgbe_config_flow_control()
598 static void xgbe_enable_dma_interrupts(struct xgbe_prv_data *pdata) in xgbe_enable_dma_interrupts() argument
604 channel = pdata->channel; in xgbe_enable_dma_interrupts()
605 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_enable_dma_interrupts()
627 if (!pdata->per_channel_irq) in xgbe_enable_dma_interrupts()
637 if (!pdata->per_channel_irq) in xgbe_enable_dma_interrupts()
645 static void xgbe_enable_mtl_interrupts(struct xgbe_prv_data *pdata) in xgbe_enable_mtl_interrupts() argument
650 q_count = max(pdata->hw_feat.tx_q_cnt, pdata->hw_feat.rx_q_cnt); in xgbe_enable_mtl_interrupts()
653 mtl_q_isr = XGMAC_MTL_IOREAD(pdata, i, MTL_Q_ISR); in xgbe_enable_mtl_interrupts()
654 XGMAC_MTL_IOWRITE(pdata, i, MTL_Q_ISR, mtl_q_isr); in xgbe_enable_mtl_interrupts()
657 XGMAC_MTL_IOWRITE(pdata, i, MTL_Q_IER, 0); in xgbe_enable_mtl_interrupts()
661 static void xgbe_enable_mac_interrupts(struct xgbe_prv_data *pdata) in xgbe_enable_mac_interrupts() argument
668 XGMAC_IOWRITE(pdata, MAC_IER, mac_ier); in xgbe_enable_mac_interrupts()
671 XGMAC_IOWRITE_BITS(pdata, MMC_RIER, ALL_INTERRUPTS, 0xffffffff); in xgbe_enable_mac_interrupts()
672 XGMAC_IOWRITE_BITS(pdata, MMC_TIER, ALL_INTERRUPTS, 0xffffffff); in xgbe_enable_mac_interrupts()
675 static int xgbe_set_gmii_speed(struct xgbe_prv_data *pdata) in xgbe_set_gmii_speed() argument
677 if (XGMAC_IOREAD_BITS(pdata, MAC_TCR, SS) == 0x3) in xgbe_set_gmii_speed()
680 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, SS, 0x3); in xgbe_set_gmii_speed()
685 static int xgbe_set_gmii_2500_speed(struct xgbe_prv_data *pdata) in xgbe_set_gmii_2500_speed() argument
687 if (XGMAC_IOREAD_BITS(pdata, MAC_TCR, SS) == 0x2) in xgbe_set_gmii_2500_speed()
690 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, SS, 0x2); in xgbe_set_gmii_2500_speed()
695 static int xgbe_set_xgmii_speed(struct xgbe_prv_data *pdata) in xgbe_set_xgmii_speed() argument
697 if (XGMAC_IOREAD_BITS(pdata, MAC_TCR, SS) == 0) in xgbe_set_xgmii_speed()
700 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, SS, 0); in xgbe_set_xgmii_speed()
705 static int xgbe_set_promiscuous_mode(struct xgbe_prv_data *pdata, in xgbe_set_promiscuous_mode() argument
710 if (XGMAC_IOREAD_BITS(pdata, MAC_PFR, PR) == val) in xgbe_set_promiscuous_mode()
714 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, PR, val); in xgbe_set_promiscuous_mode()
719 static int xgbe_set_all_multicast_mode(struct xgbe_prv_data *pdata, in xgbe_set_all_multicast_mode() argument
724 if (XGMAC_IOREAD_BITS(pdata, MAC_PFR, PM) == val) in xgbe_set_all_multicast_mode()
728 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, PM, val); in xgbe_set_all_multicast_mode()
733 static void xgbe_set_mac_reg(struct xgbe_prv_data *pdata, in xgbe_set_mac_reg() argument
758 XGMAC_IOWRITE(pdata, *mac_reg, mac_addr_hi); in xgbe_set_mac_reg()
760 XGMAC_IOWRITE(pdata, *mac_reg, mac_addr_lo); in xgbe_set_mac_reg()
764 static void xgbe_set_mac_addn_addrs(struct xgbe_prv_data *pdata) in xgbe_set_mac_addn_addrs() argument
766 struct net_device *netdev = pdata->netdev; in xgbe_set_mac_addn_addrs()
772 addn_macs = pdata->hw_feat.addn_mac; in xgbe_set_mac_addn_addrs()
775 xgbe_set_promiscuous_mode(pdata, 1); in xgbe_set_mac_addn_addrs()
778 xgbe_set_mac_reg(pdata, ha, &mac_reg); in xgbe_set_mac_addn_addrs()
783 xgbe_set_all_multicast_mode(pdata, 1); in xgbe_set_mac_addn_addrs()
786 xgbe_set_mac_reg(pdata, ha, &mac_reg); in xgbe_set_mac_addn_addrs()
794 xgbe_set_mac_reg(pdata, NULL, &mac_reg); in xgbe_set_mac_addn_addrs()
797 static void xgbe_set_mac_hash_table(struct xgbe_prv_data *pdata) in xgbe_set_mac_hash_table() argument
799 struct net_device *netdev = pdata->netdev; in xgbe_set_mac_hash_table()
807 hash_table_shift = 26 - (pdata->hw_feat.hash_table_size >> 7); in xgbe_set_mac_hash_table()
808 hash_table_count = pdata->hw_feat.hash_table_size / 32; in xgbe_set_mac_hash_table()
827 XGMAC_IOWRITE(pdata, hash_reg, hash_table[i]); in xgbe_set_mac_hash_table()
832 static int xgbe_add_mac_addresses(struct xgbe_prv_data *pdata) in xgbe_add_mac_addresses() argument
834 if (pdata->hw_feat.hash_table_size) in xgbe_add_mac_addresses()
835 xgbe_set_mac_hash_table(pdata); in xgbe_add_mac_addresses()
837 xgbe_set_mac_addn_addrs(pdata); in xgbe_add_mac_addresses()
842 static int xgbe_set_mac_address(struct xgbe_prv_data *pdata, u8 *addr) in xgbe_set_mac_address() argument
850 XGMAC_IOWRITE(pdata, MAC_MACA0HR, mac_addr_hi); in xgbe_set_mac_address()
851 XGMAC_IOWRITE(pdata, MAC_MACA0LR, mac_addr_lo); in xgbe_set_mac_address()
856 static int xgbe_config_rx_mode(struct xgbe_prv_data *pdata) in xgbe_config_rx_mode() argument
858 struct net_device *netdev = pdata->netdev; in xgbe_config_rx_mode()
864 xgbe_set_promiscuous_mode(pdata, pr_mode); in xgbe_config_rx_mode()
865 xgbe_set_all_multicast_mode(pdata, am_mode); in xgbe_config_rx_mode()
867 xgbe_add_mac_addresses(pdata); in xgbe_config_rx_mode()
872 static int xgbe_read_mmd_regs(struct xgbe_prv_data *pdata, int prtad, in xgbe_read_mmd_regs() argument
881 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); in xgbe_read_mmd_regs()
892 mutex_lock(&pdata->xpcs_mutex); in xgbe_read_mmd_regs()
893 XPCS_IOWRITE(pdata, PCS_MMD_SELECT << 2, mmd_address >> 8); in xgbe_read_mmd_regs()
894 mmd_data = XPCS_IOREAD(pdata, (mmd_address & 0xff) << 2); in xgbe_read_mmd_regs()
895 mutex_unlock(&pdata->xpcs_mutex); in xgbe_read_mmd_regs()
900 static void xgbe_write_mmd_regs(struct xgbe_prv_data *pdata, int prtad, in xgbe_write_mmd_regs() argument
908 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); in xgbe_write_mmd_regs()
913 struct phy_device *phydev = pdata->phydev; in xgbe_write_mmd_regs()
918 xgbe_set_gmii_speed(pdata); in xgbe_write_mmd_regs()
920 xgbe_set_gmii_2500_speed(pdata); in xgbe_write_mmd_regs()
923 xgbe_set_xgmii_speed(pdata); in xgbe_write_mmd_regs()
936 mutex_lock(&pdata->xpcs_mutex); in xgbe_write_mmd_regs()
937 XPCS_IOWRITE(pdata, PCS_MMD_SELECT << 2, mmd_address >> 8); in xgbe_write_mmd_regs()
938 XPCS_IOWRITE(pdata, (mmd_address & 0xff) << 2, mmd_data); in xgbe_write_mmd_regs()
939 mutex_unlock(&pdata->xpcs_mutex); in xgbe_write_mmd_regs()
947 static int xgbe_disable_rx_csum(struct xgbe_prv_data *pdata) in xgbe_disable_rx_csum() argument
949 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, IPC, 0); in xgbe_disable_rx_csum()
954 static int xgbe_enable_rx_csum(struct xgbe_prv_data *pdata) in xgbe_enable_rx_csum() argument
956 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, IPC, 1); in xgbe_enable_rx_csum()
961 static int xgbe_enable_rx_vlan_stripping(struct xgbe_prv_data *pdata) in xgbe_enable_rx_vlan_stripping() argument
964 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, EVLRXS, 1); in xgbe_enable_rx_vlan_stripping()
967 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, DOVLTC, 1); in xgbe_enable_rx_vlan_stripping()
970 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, ERSVLM, 0); in xgbe_enable_rx_vlan_stripping()
973 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, ESVL, 0); in xgbe_enable_rx_vlan_stripping()
976 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, EVLS, 0x3); in xgbe_enable_rx_vlan_stripping()
981 static int xgbe_disable_rx_vlan_stripping(struct xgbe_prv_data *pdata) in xgbe_disable_rx_vlan_stripping() argument
983 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, EVLS, 0); in xgbe_disable_rx_vlan_stripping()
988 static int xgbe_enable_rx_vlan_filtering(struct xgbe_prv_data *pdata) in xgbe_enable_rx_vlan_filtering() argument
991 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, VTFE, 1); in xgbe_enable_rx_vlan_filtering()
994 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, VTHM, 1); in xgbe_enable_rx_vlan_filtering()
997 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, VTIM, 0); in xgbe_enable_rx_vlan_filtering()
1000 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, ETV, 1); in xgbe_enable_rx_vlan_filtering()
1008 XGMAC_IOWRITE_BITS(pdata, MAC_VLANTR, VL, 1); in xgbe_enable_rx_vlan_filtering()
1013 static int xgbe_disable_rx_vlan_filtering(struct xgbe_prv_data *pdata) in xgbe_disable_rx_vlan_filtering() argument
1016 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, VTFE, 0); in xgbe_disable_rx_vlan_filtering()
1049 static int xgbe_update_vlan_hash_table(struct xgbe_prv_data *pdata) in xgbe_update_vlan_hash_table() argument
1057 for_each_set_bit(vid, pdata->active_vlans, VLAN_N_VID) { in xgbe_update_vlan_hash_table()
1066 XGMAC_IOWRITE_BITS(pdata, MAC_VLANHTR, VLHT, vlan_hash_table); in xgbe_update_vlan_hash_table()
1120 static void xgbe_rx_desc_reset(struct xgbe_prv_data *pdata, in xgbe_rx_desc_reset() argument
1124 unsigned int rx_usecs = pdata->rx_usecs; in xgbe_rx_desc_reset()
1125 unsigned int rx_frames = pdata->rx_frames; in xgbe_rx_desc_reset()
1167 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_rx_desc_init() local
1180 xgbe_rx_desc_reset(pdata, rdata, i); in xgbe_rx_desc_init()
1201 static void xgbe_update_tstamp_addend(struct xgbe_prv_data *pdata, in xgbe_update_tstamp_addend() argument
1205 XGMAC_IOWRITE(pdata, MAC_TSAR, addend); in xgbe_update_tstamp_addend()
1206 XGMAC_IOWRITE_BITS(pdata, MAC_TSCR, TSADDREG, 1); in xgbe_update_tstamp_addend()
1209 while (XGMAC_IOREAD_BITS(pdata, MAC_TSCR, TSADDREG)) in xgbe_update_tstamp_addend()
1213 static void xgbe_set_tstamp_time(struct xgbe_prv_data *pdata, unsigned int sec, in xgbe_set_tstamp_time() argument
1217 XGMAC_IOWRITE(pdata, MAC_STSUR, sec); in xgbe_set_tstamp_time()
1218 XGMAC_IOWRITE(pdata, MAC_STNUR, nsec); in xgbe_set_tstamp_time()
1219 XGMAC_IOWRITE_BITS(pdata, MAC_TSCR, TSINIT, 1); in xgbe_set_tstamp_time()
1222 while (XGMAC_IOREAD_BITS(pdata, MAC_TSCR, TSINIT)) in xgbe_set_tstamp_time()
1226 static u64 xgbe_get_tstamp_time(struct xgbe_prv_data *pdata) in xgbe_get_tstamp_time() argument
1230 nsec = XGMAC_IOREAD(pdata, MAC_STSR); in xgbe_get_tstamp_time()
1232 nsec += XGMAC_IOREAD(pdata, MAC_STNR); in xgbe_get_tstamp_time()
1237 static u64 xgbe_get_tx_tstamp(struct xgbe_prv_data *pdata) in xgbe_get_tx_tstamp() argument
1242 tx_snr = XGMAC_IOREAD(pdata, MAC_TXSNR); in xgbe_get_tx_tstamp()
1246 nsec = XGMAC_IOREAD(pdata, MAC_TXSSR); in xgbe_get_tx_tstamp()
1271 static int xgbe_config_tstamp(struct xgbe_prv_data *pdata, in xgbe_config_tstamp() argument
1283 XGMAC_IOWRITE(pdata, MAC_TSCR, mac_tscr); in xgbe_config_tstamp()
1290 XGMAC_IOWRITE_BITS(pdata, MAC_SSIR, SSINC, XGBE_TSTAMP_SSINC); in xgbe_config_tstamp()
1291 XGMAC_IOWRITE_BITS(pdata, MAC_SSIR, SNSINC, XGBE_TSTAMP_SNSINC); in xgbe_config_tstamp()
1292 xgbe_update_tstamp_addend(pdata, pdata->tstamp_addend); in xgbe_config_tstamp()
1293 xgbe_set_tstamp_time(pdata, 0, 0); in xgbe_config_tstamp()
1296 timecounter_init(&pdata->tstamp_tc, &pdata->tstamp_cc, in xgbe_config_tstamp()
1302 static void xgbe_config_dcb_tc(struct xgbe_prv_data *pdata) in xgbe_config_dcb_tc() argument
1304 struct ieee_ets *ets = pdata->ets; in xgbe_config_dcb_tc()
1314 XGMAC_IOWRITE_BITS(pdata, MTL_OMR, ETSALG, MTL_ETSALG_DWRR); in xgbe_config_dcb_tc()
1317 total_weight = pdata->netdev->mtu * pdata->hw_feat.tc_cnt; in xgbe_config_dcb_tc()
1322 for (i = 0; i < pdata->hw_feat.tc_cnt; i++) { in xgbe_config_dcb_tc()
1326 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_TC_ETSCR, TSA, in xgbe_config_dcb_tc()
1334 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_TC_ETSCR, TSA, in xgbe_config_dcb_tc()
1336 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_TC_QWR, QW, in xgbe_config_dcb_tc()
1343 static void xgbe_config_dcb_pfc(struct xgbe_prv_data *pdata) in xgbe_config_dcb_pfc() argument
1345 struct ieee_pfc *pfc = pdata->pfc; in xgbe_config_dcb_pfc()
1346 struct ieee_ets *ets = pdata->ets; in xgbe_config_dcb_pfc()
1353 for (tc = 0; tc < pdata->hw_feat.tc_cnt; tc++) { in xgbe_config_dcb_pfc()
1364 reg_val = XGMAC_IOREAD(pdata, reg); in xgbe_config_dcb_pfc()
1369 XGMAC_IOWRITE(pdata, reg, reg_val); in xgbe_config_dcb_pfc()
1372 xgbe_config_flow_control(pdata); in xgbe_config_dcb_pfc()
1378 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_tx_start_xmit() local
1391 if (pdata->tx_usecs && !channel->tx_timer_active) { in xgbe_tx_start_xmit()
1394 jiffies + usecs_to_jiffies(pdata->tx_usecs)); in xgbe_tx_start_xmit()
1402 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_dev_xmit() local
1444 if (!pdata->tx_frames) in xgbe_dev_xmit()
1446 else if (packet->tx_packets > pdata->tx_frames) in xgbe_dev_xmit()
1448 else if ((ring->coalesce_count % pdata->tx_frames) < in xgbe_dev_xmit()
1606 netif_xmit_stopped(netdev_get_tx_queue(pdata->netdev, in xgbe_dev_xmit()
1625 struct net_device *netdev = channel->pdata->netdev; in xgbe_dev_read()
1703 if (channel->pdata->netdev->features & NETIF_F_RXCSUM) in xgbe_dev_read()
1841 static int xgbe_exit(struct xgbe_prv_data *pdata) in xgbe_exit() argument
1848 XGMAC_IOWRITE_BITS(pdata, DMA_MR, SWR, 1); in xgbe_exit()
1852 while (count-- && XGMAC_IOREAD_BITS(pdata, DMA_MR, SWR)) in xgbe_exit()
1863 static int xgbe_flush_tx_queues(struct xgbe_prv_data *pdata) in xgbe_flush_tx_queues() argument
1867 if (XGMAC_GET_BITS(pdata->hw_feat.version, MAC_VR, SNPSVER) < 0x21) in xgbe_flush_tx_queues()
1870 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_flush_tx_queues()
1871 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, FTQ, 1); in xgbe_flush_tx_queues()
1874 for (i = 0; i < pdata->tx_q_count; i++) { in xgbe_flush_tx_queues()
1876 while (count-- && XGMAC_MTL_IOREAD_BITS(pdata, i, in xgbe_flush_tx_queues()
1887 static void xgbe_config_dma_bus(struct xgbe_prv_data *pdata) in xgbe_config_dma_bus() argument
1890 XGMAC_IOWRITE_BITS(pdata, DMA_SBMR, EAME, 1); in xgbe_config_dma_bus()
1893 XGMAC_IOWRITE_BITS(pdata, DMA_SBMR, UNDEF, 1); in xgbe_config_dma_bus()
1894 XGMAC_IOWRITE_BITS(pdata, DMA_SBMR, BLEN_256, 1); in xgbe_config_dma_bus()
1897 static void xgbe_config_dma_cache(struct xgbe_prv_data *pdata) in xgbe_config_dma_cache() argument
1902 XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRC, pdata->arcache); in xgbe_config_dma_cache()
1903 XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRD, pdata->axdomain); in xgbe_config_dma_cache()
1904 XGMAC_SET_BITS(arcache, DMA_AXIARCR, TEC, pdata->arcache); in xgbe_config_dma_cache()
1905 XGMAC_SET_BITS(arcache, DMA_AXIARCR, TED, pdata->axdomain); in xgbe_config_dma_cache()
1906 XGMAC_SET_BITS(arcache, DMA_AXIARCR, THC, pdata->arcache); in xgbe_config_dma_cache()
1907 XGMAC_SET_BITS(arcache, DMA_AXIARCR, THD, pdata->axdomain); in xgbe_config_dma_cache()
1908 XGMAC_IOWRITE(pdata, DMA_AXIARCR, arcache); in xgbe_config_dma_cache()
1911 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWC, pdata->awcache); in xgbe_config_dma_cache()
1912 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWD, pdata->axdomain); in xgbe_config_dma_cache()
1913 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPC, pdata->awcache); in xgbe_config_dma_cache()
1914 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPD, pdata->axdomain); in xgbe_config_dma_cache()
1915 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHC, pdata->awcache); in xgbe_config_dma_cache()
1916 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHD, pdata->axdomain); in xgbe_config_dma_cache()
1917 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDC, pdata->awcache); in xgbe_config_dma_cache()
1918 XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDD, pdata->axdomain); in xgbe_config_dma_cache()
1919 XGMAC_IOWRITE(pdata, DMA_AXIAWCR, awcache); in xgbe_config_dma_cache()
1922 static void xgbe_config_mtl_mode(struct xgbe_prv_data *pdata) in xgbe_config_mtl_mode() argument
1927 XGMAC_IOWRITE_BITS(pdata, MTL_OMR, ETSALG, MTL_ETSALG_WRR); in xgbe_config_mtl_mode()
1930 for (i = 0; i < pdata->hw_feat.tc_cnt; i++) { in xgbe_config_mtl_mode()
1931 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_TC_ETSCR, TSA, in xgbe_config_mtl_mode()
1933 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_TC_QWR, QW, 1); in xgbe_config_mtl_mode()
1937 XGMAC_IOWRITE_BITS(pdata, MTL_OMR, RAA, MTL_RAA_SP); in xgbe_config_mtl_mode()
2018 static void xgbe_config_tx_fifo_size(struct xgbe_prv_data *pdata) in xgbe_config_tx_fifo_size() argument
2023 fifo_size = xgbe_calculate_per_queue_fifo(pdata->hw_feat.tx_fifo_size, in xgbe_config_tx_fifo_size()
2024 pdata->tx_q_count); in xgbe_config_tx_fifo_size()
2026 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_config_tx_fifo_size()
2027 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TQS, fifo_size); in xgbe_config_tx_fifo_size()
2029 netdev_notice(pdata->netdev, in xgbe_config_tx_fifo_size()
2031 pdata->tx_q_count, ((fifo_size + 1) * 256)); in xgbe_config_tx_fifo_size()
2034 static void xgbe_config_rx_fifo_size(struct xgbe_prv_data *pdata) in xgbe_config_rx_fifo_size() argument
2039 fifo_size = xgbe_calculate_per_queue_fifo(pdata->hw_feat.rx_fifo_size, in xgbe_config_rx_fifo_size()
2040 pdata->rx_q_count); in xgbe_config_rx_fifo_size()
2042 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_config_rx_fifo_size()
2043 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RQS, fifo_size); in xgbe_config_rx_fifo_size()
2045 netdev_notice(pdata->netdev, in xgbe_config_rx_fifo_size()
2047 pdata->rx_q_count, ((fifo_size + 1) * 256)); in xgbe_config_rx_fifo_size()
2050 static void xgbe_config_queue_mapping(struct xgbe_prv_data *pdata) in xgbe_config_queue_mapping() argument
2061 qptc = pdata->tx_q_count / pdata->hw_feat.tc_cnt; in xgbe_config_queue_mapping()
2062 qptc_extra = pdata->tx_q_count % pdata->hw_feat.tc_cnt; in xgbe_config_queue_mapping()
2064 for (i = 0, queue = 0; i < pdata->hw_feat.tc_cnt; i++) { in xgbe_config_queue_mapping()
2067 XGMAC_MTL_IOWRITE_BITS(pdata, queue, MTL_Q_TQOMR, in xgbe_config_queue_mapping()
2069 pdata->q2tc_map[queue++] = i; in xgbe_config_queue_mapping()
2074 XGMAC_MTL_IOWRITE_BITS(pdata, queue, MTL_Q_TQOMR, in xgbe_config_queue_mapping()
2076 pdata->q2tc_map[queue++] = i; in xgbe_config_queue_mapping()
2082 pdata->rx_q_count); in xgbe_config_queue_mapping()
2093 pdata->prio2q_map[prio++] = i; in xgbe_config_queue_mapping()
2099 pdata->prio2q_map[prio++] = i; in xgbe_config_queue_mapping()
2107 XGMAC_IOWRITE(pdata, reg, reg_val); in xgbe_config_queue_mapping()
2115 for (i = 0; i < pdata->rx_q_count;) { in xgbe_config_queue_mapping()
2118 if ((i % MTL_RQDCM_Q_PER_REG) && (i != pdata->rx_q_count)) in xgbe_config_queue_mapping()
2121 XGMAC_IOWRITE(pdata, reg, reg_val); in xgbe_config_queue_mapping()
2128 static void xgbe_config_flow_control_threshold(struct xgbe_prv_data *pdata) in xgbe_config_flow_control_threshold() argument
2132 for (i = 0; i < pdata->rx_q_count; i++) { in xgbe_config_flow_control_threshold()
2134 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFA, 2); in xgbe_config_flow_control_threshold()
2137 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFD, 4); in xgbe_config_flow_control_threshold()
2141 static void xgbe_config_mac_address(struct xgbe_prv_data *pdata) in xgbe_config_mac_address() argument
2143 xgbe_set_mac_address(pdata, pdata->netdev->dev_addr); in xgbe_config_mac_address()
2146 if (pdata->hw_feat.hash_table_size) { in xgbe_config_mac_address()
2147 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, HPF, 1); in xgbe_config_mac_address()
2148 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, HUC, 1); in xgbe_config_mac_address()
2149 XGMAC_IOWRITE_BITS(pdata, MAC_PFR, HMC, 1); in xgbe_config_mac_address()
2153 static void xgbe_config_jumbo_enable(struct xgbe_prv_data *pdata) in xgbe_config_jumbo_enable() argument
2157 val = (pdata->netdev->mtu > XGMAC_STD_PACKET_MTU) ? 1 : 0; in xgbe_config_jumbo_enable()
2159 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val); in xgbe_config_jumbo_enable()
2162 static void xgbe_config_mac_speed(struct xgbe_prv_data *pdata) in xgbe_config_mac_speed() argument
2164 switch (pdata->phy_speed) { in xgbe_config_mac_speed()
2166 xgbe_set_xgmii_speed(pdata); in xgbe_config_mac_speed()
2170 xgbe_set_gmii_2500_speed(pdata); in xgbe_config_mac_speed()
2174 xgbe_set_gmii_speed(pdata); in xgbe_config_mac_speed()
2179 static void xgbe_config_checksum_offload(struct xgbe_prv_data *pdata) in xgbe_config_checksum_offload() argument
2181 if (pdata->netdev->features & NETIF_F_RXCSUM) in xgbe_config_checksum_offload()
2182 xgbe_enable_rx_csum(pdata); in xgbe_config_checksum_offload()
2184 xgbe_disable_rx_csum(pdata); in xgbe_config_checksum_offload()
2187 static void xgbe_config_vlan_support(struct xgbe_prv_data *pdata) in xgbe_config_vlan_support() argument
2190 XGMAC_IOWRITE_BITS(pdata, MAC_VLANIR, CSVL, 0); in xgbe_config_vlan_support()
2191 XGMAC_IOWRITE_BITS(pdata, MAC_VLANIR, VLTI, 1); in xgbe_config_vlan_support()
2194 xgbe_update_vlan_hash_table(pdata); in xgbe_config_vlan_support()
2196 if (pdata->netdev->features & NETIF_F_HW_VLAN_CTAG_FILTER) in xgbe_config_vlan_support()
2197 xgbe_enable_rx_vlan_filtering(pdata); in xgbe_config_vlan_support()
2199 xgbe_disable_rx_vlan_filtering(pdata); in xgbe_config_vlan_support()
2201 if (pdata->netdev->features & NETIF_F_HW_VLAN_CTAG_RX) in xgbe_config_vlan_support()
2202 xgbe_enable_rx_vlan_stripping(pdata); in xgbe_config_vlan_support()
2204 xgbe_disable_rx_vlan_stripping(pdata); in xgbe_config_vlan_support()
2207 static u64 xgbe_mmc_read(struct xgbe_prv_data *pdata, unsigned int reg_lo) in xgbe_mmc_read() argument
2225 val = XGMAC_IOREAD(pdata, reg_lo); in xgbe_mmc_read()
2228 val |= ((u64)XGMAC_IOREAD(pdata, reg_lo + 4) << 32); in xgbe_mmc_read()
2233 static void xgbe_tx_mmc_int(struct xgbe_prv_data *pdata) in xgbe_tx_mmc_int() argument
2235 struct xgbe_mmc_stats *stats = &pdata->mmc_stats; in xgbe_tx_mmc_int()
2236 unsigned int mmc_isr = XGMAC_IOREAD(pdata, MMC_TISR); in xgbe_tx_mmc_int()
2240 xgbe_mmc_read(pdata, MMC_TXOCTETCOUNT_GB_LO); in xgbe_tx_mmc_int()
2244 xgbe_mmc_read(pdata, MMC_TXFRAMECOUNT_GB_LO); in xgbe_tx_mmc_int()
2248 xgbe_mmc_read(pdata, MMC_TXBROADCASTFRAMES_G_LO); in xgbe_tx_mmc_int()
2252 xgbe_mmc_read(pdata, MMC_TXMULTICASTFRAMES_G_LO); in xgbe_tx_mmc_int()
2256 xgbe_mmc_read(pdata, MMC_TX64OCTETS_GB_LO); in xgbe_tx_mmc_int()
2260 xgbe_mmc_read(pdata, MMC_TX65TO127OCTETS_GB_LO); in xgbe_tx_mmc_int()
2264 xgbe_mmc_read(pdata, MMC_TX128TO255OCTETS_GB_LO); in xgbe_tx_mmc_int()
2268 xgbe_mmc_read(pdata, MMC_TX256TO511OCTETS_GB_LO); in xgbe_tx_mmc_int()
2272 xgbe_mmc_read(pdata, MMC_TX512TO1023OCTETS_GB_LO); in xgbe_tx_mmc_int()
2276 xgbe_mmc_read(pdata, MMC_TX1024TOMAXOCTETS_GB_LO); in xgbe_tx_mmc_int()
2280 xgbe_mmc_read(pdata, MMC_TXUNICASTFRAMES_GB_LO); in xgbe_tx_mmc_int()
2284 xgbe_mmc_read(pdata, MMC_TXMULTICASTFRAMES_GB_LO); in xgbe_tx_mmc_int()
2288 xgbe_mmc_read(pdata, MMC_TXBROADCASTFRAMES_GB_LO); in xgbe_tx_mmc_int()
2292 xgbe_mmc_read(pdata, MMC_TXUNDERFLOWERROR_LO); in xgbe_tx_mmc_int()
2296 xgbe_mmc_read(pdata, MMC_TXOCTETCOUNT_G_LO); in xgbe_tx_mmc_int()
2300 xgbe_mmc_read(pdata, MMC_TXFRAMECOUNT_G_LO); in xgbe_tx_mmc_int()
2304 xgbe_mmc_read(pdata, MMC_TXPAUSEFRAMES_LO); in xgbe_tx_mmc_int()
2308 xgbe_mmc_read(pdata, MMC_TXVLANFRAMES_G_LO); in xgbe_tx_mmc_int()
2311 static void xgbe_rx_mmc_int(struct xgbe_prv_data *pdata) in xgbe_rx_mmc_int() argument
2313 struct xgbe_mmc_stats *stats = &pdata->mmc_stats; in xgbe_rx_mmc_int()
2314 unsigned int mmc_isr = XGMAC_IOREAD(pdata, MMC_RISR); in xgbe_rx_mmc_int()
2318 xgbe_mmc_read(pdata, MMC_RXFRAMECOUNT_GB_LO); in xgbe_rx_mmc_int()
2322 xgbe_mmc_read(pdata, MMC_RXOCTETCOUNT_GB_LO); in xgbe_rx_mmc_int()
2326 xgbe_mmc_read(pdata, MMC_RXOCTETCOUNT_G_LO); in xgbe_rx_mmc_int()
2330 xgbe_mmc_read(pdata, MMC_RXBROADCASTFRAMES_G_LO); in xgbe_rx_mmc_int()
2334 xgbe_mmc_read(pdata, MMC_RXMULTICASTFRAMES_G_LO); in xgbe_rx_mmc_int()
2338 xgbe_mmc_read(pdata, MMC_RXCRCERROR_LO); in xgbe_rx_mmc_int()
2342 xgbe_mmc_read(pdata, MMC_RXRUNTERROR); in xgbe_rx_mmc_int()
2346 xgbe_mmc_read(pdata, MMC_RXJABBERERROR); in xgbe_rx_mmc_int()
2350 xgbe_mmc_read(pdata, MMC_RXUNDERSIZE_G); in xgbe_rx_mmc_int()
2354 xgbe_mmc_read(pdata, MMC_RXOVERSIZE_G); in xgbe_rx_mmc_int()
2358 xgbe_mmc_read(pdata, MMC_RX64OCTETS_GB_LO); in xgbe_rx_mmc_int()
2362 xgbe_mmc_read(pdata, MMC_RX65TO127OCTETS_GB_LO); in xgbe_rx_mmc_int()
2366 xgbe_mmc_read(pdata, MMC_RX128TO255OCTETS_GB_LO); in xgbe_rx_mmc_int()
2370 xgbe_mmc_read(pdata, MMC_RX256TO511OCTETS_GB_LO); in xgbe_rx_mmc_int()
2374 xgbe_mmc_read(pdata, MMC_RX512TO1023OCTETS_GB_LO); in xgbe_rx_mmc_int()
2378 xgbe_mmc_read(pdata, MMC_RX1024TOMAXOCTETS_GB_LO); in xgbe_rx_mmc_int()
2382 xgbe_mmc_read(pdata, MMC_RXUNICASTFRAMES_G_LO); in xgbe_rx_mmc_int()
2386 xgbe_mmc_read(pdata, MMC_RXLENGTHERROR_LO); in xgbe_rx_mmc_int()
2390 xgbe_mmc_read(pdata, MMC_RXOUTOFRANGETYPE_LO); in xgbe_rx_mmc_int()
2394 xgbe_mmc_read(pdata, MMC_RXPAUSEFRAMES_LO); in xgbe_rx_mmc_int()
2398 xgbe_mmc_read(pdata, MMC_RXFIFOOVERFLOW_LO); in xgbe_rx_mmc_int()
2402 xgbe_mmc_read(pdata, MMC_RXVLANFRAMES_GB_LO); in xgbe_rx_mmc_int()
2406 xgbe_mmc_read(pdata, MMC_RXWATCHDOGERROR); in xgbe_rx_mmc_int()
2409 static void xgbe_read_mmc_stats(struct xgbe_prv_data *pdata) in xgbe_read_mmc_stats() argument
2411 struct xgbe_mmc_stats *stats = &pdata->mmc_stats; in xgbe_read_mmc_stats()
2414 XGMAC_IOWRITE_BITS(pdata, MMC_CR, MCF, 1); in xgbe_read_mmc_stats()
2417 xgbe_mmc_read(pdata, MMC_TXOCTETCOUNT_GB_LO); in xgbe_read_mmc_stats()
2420 xgbe_mmc_read(pdata, MMC_TXFRAMECOUNT_GB_LO); in xgbe_read_mmc_stats()
2423 xgbe_mmc_read(pdata, MMC_TXBROADCASTFRAMES_G_LO); in xgbe_read_mmc_stats()
2426 xgbe_mmc_read(pdata, MMC_TXMULTICASTFRAMES_G_LO); in xgbe_read_mmc_stats()
2429 xgbe_mmc_read(pdata, MMC_TX64OCTETS_GB_LO); in xgbe_read_mmc_stats()
2432 xgbe_mmc_read(pdata, MMC_TX65TO127OCTETS_GB_LO); in xgbe_read_mmc_stats()
2435 xgbe_mmc_read(pdata, MMC_TX128TO255OCTETS_GB_LO); in xgbe_read_mmc_stats()
2438 xgbe_mmc_read(pdata, MMC_TX256TO511OCTETS_GB_LO); in xgbe_read_mmc_stats()
2441 xgbe_mmc_read(pdata, MMC_TX512TO1023OCTETS_GB_LO); in xgbe_read_mmc_stats()
2444 xgbe_mmc_read(pdata, MMC_TX1024TOMAXOCTETS_GB_LO); in xgbe_read_mmc_stats()
2447 xgbe_mmc_read(pdata, MMC_TXUNICASTFRAMES_GB_LO); in xgbe_read_mmc_stats()
2450 xgbe_mmc_read(pdata, MMC_TXMULTICASTFRAMES_GB_LO); in xgbe_read_mmc_stats()
2453 xgbe_mmc_read(pdata, MMC_TXBROADCASTFRAMES_GB_LO); in xgbe_read_mmc_stats()
2456 xgbe_mmc_read(pdata, MMC_TXUNDERFLOWERROR_LO); in xgbe_read_mmc_stats()
2459 xgbe_mmc_read(pdata, MMC_TXOCTETCOUNT_G_LO); in xgbe_read_mmc_stats()
2462 xgbe_mmc_read(pdata, MMC_TXFRAMECOUNT_G_LO); in xgbe_read_mmc_stats()
2465 xgbe_mmc_read(pdata, MMC_TXPAUSEFRAMES_LO); in xgbe_read_mmc_stats()
2468 xgbe_mmc_read(pdata, MMC_TXVLANFRAMES_G_LO); in xgbe_read_mmc_stats()
2471 xgbe_mmc_read(pdata, MMC_RXFRAMECOUNT_GB_LO); in xgbe_read_mmc_stats()
2474 xgbe_mmc_read(pdata, MMC_RXOCTETCOUNT_GB_LO); in xgbe_read_mmc_stats()
2477 xgbe_mmc_read(pdata, MMC_RXOCTETCOUNT_G_LO); in xgbe_read_mmc_stats()
2480 xgbe_mmc_read(pdata, MMC_RXBROADCASTFRAMES_G_LO); in xgbe_read_mmc_stats()
2483 xgbe_mmc_read(pdata, MMC_RXMULTICASTFRAMES_G_LO); in xgbe_read_mmc_stats()
2486 xgbe_mmc_read(pdata, MMC_RXCRCERROR_LO); in xgbe_read_mmc_stats()
2489 xgbe_mmc_read(pdata, MMC_RXRUNTERROR); in xgbe_read_mmc_stats()
2492 xgbe_mmc_read(pdata, MMC_RXJABBERERROR); in xgbe_read_mmc_stats()
2495 xgbe_mmc_read(pdata, MMC_RXUNDERSIZE_G); in xgbe_read_mmc_stats()
2498 xgbe_mmc_read(pdata, MMC_RXOVERSIZE_G); in xgbe_read_mmc_stats()
2501 xgbe_mmc_read(pdata, MMC_RX64OCTETS_GB_LO); in xgbe_read_mmc_stats()
2504 xgbe_mmc_read(pdata, MMC_RX65TO127OCTETS_GB_LO); in xgbe_read_mmc_stats()
2507 xgbe_mmc_read(pdata, MMC_RX128TO255OCTETS_GB_LO); in xgbe_read_mmc_stats()
2510 xgbe_mmc_read(pdata, MMC_RX256TO511OCTETS_GB_LO); in xgbe_read_mmc_stats()
2513 xgbe_mmc_read(pdata, MMC_RX512TO1023OCTETS_GB_LO); in xgbe_read_mmc_stats()
2516 xgbe_mmc_read(pdata, MMC_RX1024TOMAXOCTETS_GB_LO); in xgbe_read_mmc_stats()
2519 xgbe_mmc_read(pdata, MMC_RXUNICASTFRAMES_G_LO); in xgbe_read_mmc_stats()
2522 xgbe_mmc_read(pdata, MMC_RXLENGTHERROR_LO); in xgbe_read_mmc_stats()
2525 xgbe_mmc_read(pdata, MMC_RXOUTOFRANGETYPE_LO); in xgbe_read_mmc_stats()
2528 xgbe_mmc_read(pdata, MMC_RXPAUSEFRAMES_LO); in xgbe_read_mmc_stats()
2531 xgbe_mmc_read(pdata, MMC_RXFIFOOVERFLOW_LO); in xgbe_read_mmc_stats()
2534 xgbe_mmc_read(pdata, MMC_RXVLANFRAMES_GB_LO); in xgbe_read_mmc_stats()
2537 xgbe_mmc_read(pdata, MMC_RXWATCHDOGERROR); in xgbe_read_mmc_stats()
2540 XGMAC_IOWRITE_BITS(pdata, MMC_CR, MCF, 0); in xgbe_read_mmc_stats()
2543 static void xgbe_config_mmc(struct xgbe_prv_data *pdata) in xgbe_config_mmc() argument
2546 XGMAC_IOWRITE_BITS(pdata, MMC_CR, ROR, 1); in xgbe_config_mmc()
2549 XGMAC_IOWRITE_BITS(pdata, MMC_CR, CR, 1); in xgbe_config_mmc()
2552 static void xgbe_prepare_tx_stop(struct xgbe_prv_data *pdata, in xgbe_prepare_tx_stop() argument
2578 tx_status = XGMAC_IOREAD(pdata, tx_dsr); in xgbe_prepare_tx_stop()
2588 netdev_info(pdata->netdev, in xgbe_prepare_tx_stop()
2593 static void xgbe_enable_tx(struct xgbe_prv_data *pdata) in xgbe_enable_tx() argument
2599 channel = pdata->channel; in xgbe_enable_tx()
2600 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_enable_tx()
2608 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_enable_tx()
2609 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TXQEN, in xgbe_enable_tx()
2613 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 1); in xgbe_enable_tx()
2616 static void xgbe_disable_tx(struct xgbe_prv_data *pdata) in xgbe_disable_tx() argument
2622 channel = pdata->channel; in xgbe_disable_tx()
2623 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_disable_tx()
2627 xgbe_prepare_tx_stop(pdata, channel); in xgbe_disable_tx()
2631 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 0); in xgbe_disable_tx()
2634 for (i = 0; i < pdata->tx_q_count; i++) in xgbe_disable_tx()
2635 XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_TQOMR, TXQEN, 0); in xgbe_disable_tx()
2638 channel = pdata->channel; in xgbe_disable_tx()
2639 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_disable_tx()
2647 static void xgbe_enable_rx(struct xgbe_prv_data *pdata) in xgbe_enable_rx() argument
2653 channel = pdata->channel; in xgbe_enable_rx()
2654 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_enable_rx()
2663 for (i = 0; i < pdata->rx_q_count; i++) in xgbe_enable_rx()
2665 XGMAC_IOWRITE(pdata, MAC_RQC0R, reg_val); in xgbe_enable_rx()
2668 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, DCRCC, 1); in xgbe_enable_rx()
2669 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, CST, 1); in xgbe_enable_rx()
2670 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, ACS, 1); in xgbe_enable_rx()
2671 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, RE, 1); in xgbe_enable_rx()
2674 static void xgbe_disable_rx(struct xgbe_prv_data *pdata) in xgbe_disable_rx() argument
2680 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, DCRCC, 0); in xgbe_disable_rx()
2681 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, CST, 0); in xgbe_disable_rx()
2682 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, ACS, 0); in xgbe_disable_rx()
2683 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, RE, 0); in xgbe_disable_rx()
2686 XGMAC_IOWRITE(pdata, MAC_RQC0R, 0); in xgbe_disable_rx()
2689 channel = pdata->channel; in xgbe_disable_rx()
2690 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_disable_rx()
2698 static void xgbe_powerup_tx(struct xgbe_prv_data *pdata) in xgbe_powerup_tx() argument
2704 channel = pdata->channel; in xgbe_powerup_tx()
2705 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_powerup_tx()
2713 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 1); in xgbe_powerup_tx()
2716 static void xgbe_powerdown_tx(struct xgbe_prv_data *pdata) in xgbe_powerdown_tx() argument
2722 channel = pdata->channel; in xgbe_powerdown_tx()
2723 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_powerdown_tx()
2727 xgbe_prepare_tx_stop(pdata, channel); in xgbe_powerdown_tx()
2731 XGMAC_IOWRITE_BITS(pdata, MAC_TCR, TE, 0); in xgbe_powerdown_tx()
2734 channel = pdata->channel; in xgbe_powerdown_tx()
2735 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_powerdown_tx()
2743 static void xgbe_powerup_rx(struct xgbe_prv_data *pdata) in xgbe_powerup_rx() argument
2749 channel = pdata->channel; in xgbe_powerup_rx()
2750 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_powerup_rx()
2758 static void xgbe_powerdown_rx(struct xgbe_prv_data *pdata) in xgbe_powerdown_rx() argument
2764 channel = pdata->channel; in xgbe_powerdown_rx()
2765 for (i = 0; i < pdata->channel_count; i++, channel++) { in xgbe_powerdown_rx()
2773 static int xgbe_init(struct xgbe_prv_data *pdata) in xgbe_init() argument
2775 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_init()
2781 ret = xgbe_flush_tx_queues(pdata); in xgbe_init()
2788 xgbe_config_dma_bus(pdata); in xgbe_init()
2789 xgbe_config_dma_cache(pdata); in xgbe_init()
2790 xgbe_config_osp_mode(pdata); in xgbe_init()
2791 xgbe_config_pblx8(pdata); in xgbe_init()
2792 xgbe_config_tx_pbl_val(pdata); in xgbe_init()
2793 xgbe_config_rx_pbl_val(pdata); in xgbe_init()
2794 xgbe_config_rx_coalesce(pdata); in xgbe_init()
2795 xgbe_config_tx_coalesce(pdata); in xgbe_init()
2796 xgbe_config_rx_buffer_size(pdata); in xgbe_init()
2797 xgbe_config_tso_mode(pdata); in xgbe_init()
2798 xgbe_config_sph_mode(pdata); in xgbe_init()
2799 xgbe_config_rss(pdata); in xgbe_init()
2800 desc_if->wrapper_tx_desc_init(pdata); in xgbe_init()
2801 desc_if->wrapper_rx_desc_init(pdata); in xgbe_init()
2802 xgbe_enable_dma_interrupts(pdata); in xgbe_init()
2807 xgbe_config_mtl_mode(pdata); in xgbe_init()
2808 xgbe_config_queue_mapping(pdata); in xgbe_init()
2809 xgbe_config_tsf_mode(pdata, pdata->tx_sf_mode); in xgbe_init()
2810 xgbe_config_rsf_mode(pdata, pdata->rx_sf_mode); in xgbe_init()
2811 xgbe_config_tx_threshold(pdata, pdata->tx_threshold); in xgbe_init()
2812 xgbe_config_rx_threshold(pdata, pdata->rx_threshold); in xgbe_init()
2813 xgbe_config_tx_fifo_size(pdata); in xgbe_init()
2814 xgbe_config_rx_fifo_size(pdata); in xgbe_init()
2815 xgbe_config_flow_control_threshold(pdata); in xgbe_init()
2819 xgbe_config_dcb_tc(pdata); in xgbe_init()
2820 xgbe_config_dcb_pfc(pdata); in xgbe_init()
2821 xgbe_enable_mtl_interrupts(pdata); in xgbe_init()
2826 xgbe_config_mac_address(pdata); in xgbe_init()
2827 xgbe_config_rx_mode(pdata); in xgbe_init()
2828 xgbe_config_jumbo_enable(pdata); in xgbe_init()
2829 xgbe_config_flow_control(pdata); in xgbe_init()
2830 xgbe_config_mac_speed(pdata); in xgbe_init()
2831 xgbe_config_checksum_offload(pdata); in xgbe_init()
2832 xgbe_config_vlan_support(pdata); in xgbe_init()
2833 xgbe_config_mmc(pdata); in xgbe_init()
2834 xgbe_enable_mac_interrupts(pdata); in xgbe_init()