• Home
  • Raw
  • Download

Lines Matching full:cpsw

44 #include "cpsw.h"
153 #define cpsw_slave_index(cpsw, priv) \ argument
154 ((cpsw->data.dual_emac) ? priv->emac_port : \
155 cpsw->data.active_slave)
180 MODULE_PARM_DESC(debug_level, "cpsw debug level (NETIF_MSG bits)");
184 MODULE_PARM_DESC(ale_ageout, "cpsw ale ageout interval (seconds)");
470 struct cpsw_common *cpsw; member
552 #define ndev_to_cpsw(ndev) (((struct cpsw_priv *)netdev_priv(ndev))->cpsw)
557 struct cpsw_common *cpsw = (priv)->cpsw; \
559 if (cpsw->data.dual_emac) \
560 (func)((cpsw)->slaves + priv->emac_port, ##arg);\
562 for (n = cpsw->data.slaves, \
563 slave = cpsw->slaves; \
575 struct cpsw_common *cpsw = priv->cpsw; in cpsw_add_mcast() local
577 if (cpsw->data.dual_emac) { in cpsw_add_mcast()
578 struct cpsw_slave *slave = cpsw->slaves + priv->emac_port; in cpsw_add_mcast()
581 cpsw_ale_add_mcast(cpsw->ale, addr, in cpsw_add_mcast()
587 cpsw_ale_add_mcast(cpsw->ale, addr, ALE_ALL_PORTS, 0, 0, 0); in cpsw_add_mcast()
592 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_set_promiscious() local
593 struct cpsw_ale *ale = cpsw->ale; in cpsw_set_promiscious()
596 if (cpsw->data.dual_emac) { in cpsw_set_promiscious()
603 for (i = 0; i < cpsw->data.slaves; i++) in cpsw_set_promiscious()
604 if (cpsw->slaves[i].ndev->flags & IFF_PROMISC) in cpsw_set_promiscious()
627 for (i = 0; i <= cpsw->data.slaves; i++) { in cpsw_set_promiscious()
655 for (i = 0; i <= cpsw->data.slaves; i++) { in cpsw_set_promiscious()
669 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_set_rx_mode() local
672 if (cpsw->data.dual_emac) in cpsw_ndo_set_rx_mode()
673 vid = cpsw->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_rx_mode()
675 vid = cpsw->data.default_vlan; in cpsw_ndo_set_rx_mode()
680 cpsw_ale_set_allmulti(cpsw->ale, IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
688 cpsw_ale_set_allmulti(cpsw->ale, priv->ndev->flags & IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
691 cpsw_ale_flush_multicast(cpsw->ale, ALE_ALL_PORTS, vid); in cpsw_ndo_set_rx_mode()
703 static void cpsw_intr_enable(struct cpsw_common *cpsw) in cpsw_intr_enable() argument
705 writel_relaxed(0xFF, &cpsw->wr_regs->tx_en); in cpsw_intr_enable()
706 writel_relaxed(0xFF, &cpsw->wr_regs->rx_en); in cpsw_intr_enable()
708 cpdma_ctlr_int_ctrl(cpsw->dma, true); in cpsw_intr_enable()
712 static void cpsw_intr_disable(struct cpsw_common *cpsw) in cpsw_intr_disable() argument
714 writel_relaxed(0, &cpsw->wr_regs->tx_en); in cpsw_intr_disable()
715 writel_relaxed(0, &cpsw->wr_regs->rx_en); in cpsw_intr_disable()
717 cpdma_ctlr_int_ctrl(cpsw->dma, false); in cpsw_intr_disable()
726 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_tx_handler() local
735 cpts_tx_timestamp(cpsw->cpts, skb); in cpsw_tx_handler()
744 struct cpsw_common *cpsw = priv->cpsw; in cpsw_rx_vlan_encap() local
766 if (cpsw->data.dual_emac && in cpsw_rx_vlan_encap()
767 vid == cpsw->slaves[priv->emac_port].port_vlan) in cpsw_rx_vlan_encap()
791 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_rx_handler() local
793 if (cpsw->data.dual_emac) { in cpsw_rx_handler()
796 ndev = cpsw->slaves[--port].ndev; in cpsw_rx_handler()
803 if (cpsw->data.dual_emac && cpsw->usage_count && in cpsw_rx_handler()
820 new_skb = netdev_alloc_skb_ip_align(ndev, cpsw->rx_packet_max); in cpsw_rx_handler()
826 cpts_rx_timestamp(cpsw->cpts, skb); in cpsw_rx_handler()
843 ch = cpsw->rxv[skb_get_queue_mapping(new_skb)].ch; in cpsw_rx_handler()
854 struct cpsw_common *cpsw = priv->cpsw; in cpsw_split_res() local
855 struct cpsw_vector *txv = cpsw->txv; in cpsw_split_res()
861 for (i = 0; i < cpsw->tx_ch_num; i++) { in cpsw_split_res()
870 if (cpsw->tx_ch_num == rlim_ch_num) { in cpsw_split_res()
873 ch_budget = CPSW_POLL_WEIGHT / cpsw->tx_ch_num; in cpsw_split_res()
877 max_rate = cpsw->speed * 1000; in cpsw_split_res()
890 (cpsw->tx_ch_num - rlim_ch_num); in cpsw_split_res()
892 (cpsw->tx_ch_num - rlim_ch_num); in cpsw_split_res()
897 for (i = 0; i < cpsw->tx_ch_num; i++) { in cpsw_split_res()
911 cpdma_chan_set_weight(cpsw->txv[i].ch, ch_weight); in cpsw_split_res()
916 cpdma_chan_set_weight(cpsw->txv[i].ch, 0); in cpsw_split_res()
927 ch_budget = budget / cpsw->rx_ch_num; in cpsw_split_res()
928 for (i = 0; i < cpsw->rx_ch_num; i++) { in cpsw_split_res()
929 cpsw->rxv[i].budget = ch_budget; in cpsw_split_res()
934 cpsw->rxv[0].budget += budget; in cpsw_split_res()
939 struct cpsw_common *cpsw = dev_id; in cpsw_tx_interrupt() local
941 writel(0, &cpsw->wr_regs->tx_en); in cpsw_tx_interrupt()
942 cpdma_ctlr_eoi(cpsw->dma, CPDMA_EOI_TX); in cpsw_tx_interrupt()
944 if (cpsw->quirk_irq) { in cpsw_tx_interrupt()
945 disable_irq_nosync(cpsw->irqs_table[1]); in cpsw_tx_interrupt()
946 cpsw->tx_irq_disabled = true; in cpsw_tx_interrupt()
949 napi_schedule(&cpsw->napi_tx); in cpsw_tx_interrupt()
955 struct cpsw_common *cpsw = dev_id; in cpsw_rx_interrupt() local
957 writel(0, &cpsw->wr_regs->rx_en); in cpsw_rx_interrupt()
958 cpdma_ctlr_eoi(cpsw->dma, CPDMA_EOI_RX); in cpsw_rx_interrupt()
960 if (cpsw->quirk_irq) { in cpsw_rx_interrupt()
961 disable_irq_nosync(cpsw->irqs_table[0]); in cpsw_rx_interrupt()
962 cpsw->rx_irq_disabled = true; in cpsw_rx_interrupt()
965 napi_schedule(&cpsw->napi_rx); in cpsw_rx_interrupt()
973 struct cpsw_common *cpsw = napi_to_cpsw(napi_tx); in cpsw_tx_mq_poll() local
977 ch_map = cpdma_ctrl_txchs_state(cpsw->dma); in cpsw_tx_mq_poll()
982 txv = &cpsw->txv[ch]; in cpsw_tx_mq_poll()
995 writel(0xff, &cpsw->wr_regs->tx_en); in cpsw_tx_mq_poll()
1003 struct cpsw_common *cpsw = napi_to_cpsw(napi_tx); in cpsw_tx_poll() local
1006 num_tx = cpdma_chan_process(cpsw->txv[0].ch, budget); in cpsw_tx_poll()
1009 writel(0xff, &cpsw->wr_regs->tx_en); in cpsw_tx_poll()
1010 if (cpsw->tx_irq_disabled) { in cpsw_tx_poll()
1011 cpsw->tx_irq_disabled = false; in cpsw_tx_poll()
1012 enable_irq(cpsw->irqs_table[1]); in cpsw_tx_poll()
1023 struct cpsw_common *cpsw = napi_to_cpsw(napi_rx); in cpsw_rx_mq_poll() local
1027 ch_map = cpdma_ctrl_rxchs_state(cpsw->dma); in cpsw_rx_mq_poll()
1032 rxv = &cpsw->rxv[ch]; in cpsw_rx_mq_poll()
1045 writel(0xff, &cpsw->wr_regs->rx_en); in cpsw_rx_mq_poll()
1053 struct cpsw_common *cpsw = napi_to_cpsw(napi_rx); in cpsw_rx_poll() local
1056 num_rx = cpdma_chan_process(cpsw->rxv[0].ch, budget); in cpsw_rx_poll()
1059 writel(0xff, &cpsw->wr_regs->rx_en); in cpsw_rx_poll()
1060 if (cpsw->rx_irq_disabled) { in cpsw_rx_poll()
1061 cpsw->rx_irq_disabled = false; in cpsw_rx_poll()
1062 enable_irq(cpsw->irqs_table[0]); in cpsw_rx_poll()
1090 struct cpsw_common *cpsw = priv->cpsw; in cpsw_shp_is_off() local
1094 val = readl_relaxed(&cpsw->regs->ptype); in cpsw_shp_is_off()
1096 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_shp_is_off()
1106 struct cpsw_common *cpsw = priv->cpsw; in cpsw_fifo_shp_on() local
1110 val = readl_relaxed(&cpsw->regs->ptype); in cpsw_fifo_shp_on()
1112 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_fifo_shp_on()
1117 writel_relaxed(val, &cpsw->regs->ptype); in cpsw_fifo_shp_on()
1126 struct cpsw_common *cpsw = priv->cpsw; in _cpsw_adjust_link() local
1134 mac_control = cpsw->data.mac_control; in _cpsw_adjust_link()
1137 cpsw_ale_control_set(cpsw->ale, slave_port, in _cpsw_adjust_link()
1168 cpsw_ale_control_set(cpsw->ale, slave_port, in _cpsw_adjust_link()
1180 static int cpsw_get_common_speed(struct cpsw_common *cpsw) in cpsw_get_common_speed() argument
1184 for (i = 0, speed = 0; i < cpsw->data.slaves; i++) in cpsw_get_common_speed()
1185 if (cpsw->slaves[i].phy && cpsw->slaves[i].phy->link) in cpsw_get_common_speed()
1186 speed += cpsw->slaves[i].phy->speed; in cpsw_get_common_speed()
1191 static int cpsw_need_resplit(struct cpsw_common *cpsw) in cpsw_need_resplit() argument
1197 speed = cpsw_get_common_speed(cpsw); in cpsw_need_resplit()
1198 if (speed == cpsw->speed || !speed) in cpsw_need_resplit()
1201 cpsw->speed = speed; in cpsw_need_resplit()
1203 for (i = 0, rlim_ch_num = 0; i < cpsw->tx_ch_num; i++) { in cpsw_need_resplit()
1204 ch_rate = cpdma_chan_get_rate(cpsw->txv[i].ch); in cpsw_need_resplit()
1212 if (!rlim_ch_num || rlim_ch_num == cpsw->tx_ch_num) in cpsw_need_resplit()
1221 struct cpsw_common *cpsw = priv->cpsw; in cpsw_adjust_link() local
1227 if (cpsw_need_resplit(cpsw)) in cpsw_adjust_link()
1242 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_coalesce() local
1244 coal->rx_coalesce_usecs = cpsw->coal_intvl; in cpsw_get_coalesce()
1257 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_coalesce() local
1261 int_ctrl = readl(&cpsw->wr_regs->int_control); in cpsw_set_coalesce()
1262 prescale = cpsw->bus_freq_mhz * 4; in cpsw_set_coalesce()
1290 writel(num_interrupts, &cpsw->wr_regs->rx_imax); in cpsw_set_coalesce()
1291 writel(num_interrupts, &cpsw->wr_regs->tx_imax); in cpsw_set_coalesce()
1298 writel(int_ctrl, &cpsw->wr_regs->int_control); in cpsw_set_coalesce()
1301 cpsw->coal_intvl = coal_intvl; in cpsw_set_coalesce()
1308 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_sset_count() local
1313 (cpsw->rx_ch_num + cpsw->tx_ch_num) * in cpsw_get_sset_count()
1339 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_strings() local
1351 cpsw_add_ch_strings(&p, cpsw->rx_ch_num, 1); in cpsw_get_strings()
1352 cpsw_add_ch_strings(&p, cpsw->tx_ch_num, 0); in cpsw_get_strings()
1361 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_ethtool_stats() local
1367 data[l] = readl(cpsw->hw_stats + in cpsw_get_ethtool_stats()
1370 for (ch = 0; ch < cpsw->rx_ch_num; ch++) { in cpsw_get_ethtool_stats()
1371 cpdma_chan_get_stats(cpsw->rxv[ch].ch, &ch_stats); in cpsw_get_ethtool_stats()
1379 for (ch = 0; ch < cpsw->tx_ch_num; ch++) { in cpsw_get_ethtool_stats()
1380 cpdma_chan_get_stats(cpsw->txv[ch].ch, &ch_stats); in cpsw_get_ethtool_stats()
1393 struct cpsw_common *cpsw = priv->cpsw; in cpsw_tx_packet_submit() local
1397 priv->emac_port + cpsw->data.dual_emac); in cpsw_tx_packet_submit()
1404 struct cpsw_common *cpsw = priv->cpsw; in cpsw_add_dual_emac_def_ale_entries() local
1407 if (cpsw->version == CPSW_VERSION_1) in cpsw_add_dual_emac_def_ale_entries()
1411 cpsw_ale_add_vlan(cpsw->ale, slave->port_vlan, port_mask, in cpsw_add_dual_emac_def_ale_entries()
1413 cpsw_ale_add_mcast(cpsw->ale, priv->ndev->broadcast, in cpsw_add_dual_emac_def_ale_entries()
1415 cpsw_ale_add_ucast(cpsw->ale, priv->mac_addr, in cpsw_add_dual_emac_def_ale_entries()
1418 cpsw_ale_control_set(cpsw->ale, slave_port, in cpsw_add_dual_emac_def_ale_entries()
1434 struct cpsw_common *cpsw = priv->cpsw; in cpsw_slave_open() local
1441 switch (cpsw->version) { in cpsw_slave_open()
1465 writel_relaxed(cpsw->rx_packet_max, &slave->sliver->rx_maxlen); in cpsw_slave_open()
1472 if (cpsw->data.dual_emac) in cpsw_slave_open()
1475 cpsw_ale_add_mcast(cpsw->ale, priv->ndev->broadcast, in cpsw_slave_open()
1506 cpsw_phy_sel(cpsw->dev, slave->phy->interface, slave->slave_num); in cpsw_slave_open()
1511 struct cpsw_common *cpsw = priv->cpsw; in cpsw_add_default_vlan() local
1512 const int vlan = cpsw->data.default_vlan; in cpsw_add_default_vlan()
1517 reg = (cpsw->version == CPSW_VERSION_1) ? CPSW1_PORT_VLAN : in cpsw_add_default_vlan()
1520 writel(vlan, &cpsw->host_port_regs->port_vlan); in cpsw_add_default_vlan()
1522 for (i = 0; i < cpsw->data.slaves; i++) in cpsw_add_default_vlan()
1523 slave_write(cpsw->slaves + i, vlan, reg); in cpsw_add_default_vlan()
1530 cpsw_ale_add_vlan(cpsw->ale, vlan, ALE_ALL_PORTS, in cpsw_add_default_vlan()
1539 struct cpsw_common *cpsw = priv->cpsw; in cpsw_init_host_port() local
1542 soft_reset("cpsw", &cpsw->regs->soft_reset); in cpsw_init_host_port()
1543 cpsw_ale_start(cpsw->ale); in cpsw_init_host_port()
1546 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, ALE_VLAN_AWARE, in cpsw_init_host_port()
1548 control_reg = readl(&cpsw->regs->control); in cpsw_init_host_port()
1550 writel(control_reg, &cpsw->regs->control); in cpsw_init_host_port()
1551 fifo_mode = (cpsw->data.dual_emac) ? CPSW_FIFO_DUAL_MAC_MODE : in cpsw_init_host_port()
1553 writel(fifo_mode, &cpsw->host_port_regs->tx_in_ctl); in cpsw_init_host_port()
1557 &cpsw->host_port_regs->cpdma_tx_pri_map); in cpsw_init_host_port()
1558 writel_relaxed(0, &cpsw->host_port_regs->cpdma_rx_chan_map); in cpsw_init_host_port()
1560 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, in cpsw_init_host_port()
1563 if (!cpsw->data.dual_emac) { in cpsw_init_host_port()
1564 cpsw_ale_add_ucast(cpsw->ale, priv->mac_addr, HOST_PORT_NUM, in cpsw_init_host_port()
1566 cpsw_ale_add_mcast(cpsw->ale, priv->ndev->broadcast, in cpsw_init_host_port()
1573 struct cpsw_common *cpsw = priv->cpsw; in cpsw_fill_rx_channels() local
1578 for (ch = 0; ch < cpsw->rx_ch_num; ch++) { in cpsw_fill_rx_channels()
1579 ch_buf_num = cpdma_chan_get_rx_buf_num(cpsw->rxv[ch].ch); in cpsw_fill_rx_channels()
1582 cpsw->rx_packet_max, in cpsw_fill_rx_channels()
1590 ret = cpdma_chan_submit(cpsw->rxv[ch].ch, skb, in cpsw_fill_rx_channels()
1610 static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_common *cpsw) in cpsw_slave_stop() argument
1621 cpsw_ale_control_set(cpsw->ale, slave_port, in cpsw_slave_stop()
1636 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_fifo_bw() local
1647 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_set_fifo_bw()
1696 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_fifo_rlimit() local
1705 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_set_fifo_rlimit()
1706 tx_in_ctl_rg = cpsw->version == CPSW_VERSION_1 ? in cpsw_set_fifo_rlimit()
1748 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_cbs() local
1771 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_set_cbs()
1785 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_set_cbs()
1787 pm_runtime_put_noidle(cpsw->dev); in cpsw_set_cbs()
1802 pm_runtime_put_sync(cpsw->dev); in cpsw_set_cbs()
1821 struct cpsw_common *cpsw = priv->cpsw; in cpsw_mqprio_resume() local
1835 tx_prio_rg = cpsw->version == CPSW_VERSION_1 ? in cpsw_mqprio_resume()
1854 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_open() local
1858 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ndo_open()
1860 pm_runtime_put_noidle(cpsw->dev); in cpsw_ndo_open()
1867 ret = netif_set_real_num_tx_queues(ndev, cpsw->tx_ch_num); in cpsw_ndo_open()
1873 ret = netif_set_real_num_rx_queues(ndev, cpsw->rx_ch_num); in cpsw_ndo_open()
1879 reg = cpsw->version; in cpsw_ndo_open()
1881 dev_info(priv->dev, "initializing cpsw version %d.%d (%d)\n", in cpsw_ndo_open()
1886 if (!cpsw->usage_count) in cpsw_ndo_open()
1891 if (!cpsw->data.dual_emac) in cpsw_ndo_open()
1894 cpsw_ale_add_vlan(cpsw->ale, cpsw->data.default_vlan, in cpsw_ndo_open()
1898 if (!cpsw->usage_count) { in cpsw_ndo_open()
1900 writel_relaxed(0, &cpsw->regs->ptype); in cpsw_ndo_open()
1903 writel_relaxed(0x7, &cpsw->regs->stat_port_en); in cpsw_ndo_open()
1906 writel(0x7, &cpsw->regs->flow_control); in cpsw_ndo_open()
1908 napi_enable(&cpsw->napi_rx); in cpsw_ndo_open()
1909 napi_enable(&cpsw->napi_tx); in cpsw_ndo_open()
1911 if (cpsw->tx_irq_disabled) { in cpsw_ndo_open()
1912 cpsw->tx_irq_disabled = false; in cpsw_ndo_open()
1913 enable_irq(cpsw->irqs_table[1]); in cpsw_ndo_open()
1916 if (cpsw->rx_irq_disabled) { in cpsw_ndo_open()
1917 cpsw->rx_irq_disabled = false; in cpsw_ndo_open()
1918 enable_irq(cpsw->irqs_table[0]); in cpsw_ndo_open()
1925 if (cpts_register(cpsw->cpts)) in cpsw_ndo_open()
1933 if (cpsw->coal_intvl != 0) { in cpsw_ndo_open()
1936 coal.rx_coalesce_usecs = cpsw->coal_intvl; in cpsw_ndo_open()
1940 cpdma_ctlr_start(cpsw->dma); in cpsw_ndo_open()
1941 cpsw_intr_enable(cpsw); in cpsw_ndo_open()
1942 cpsw->usage_count++; in cpsw_ndo_open()
1947 cpdma_ctlr_stop(cpsw->dma); in cpsw_ndo_open()
1948 for_each_slave(priv, cpsw_slave_stop, cpsw); in cpsw_ndo_open()
1949 pm_runtime_put_sync(cpsw->dev); in cpsw_ndo_open()
1957 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_stop() local
1959 cpsw_info(priv, ifdown, "shutting down cpsw device\n"); in cpsw_ndo_stop()
1963 if (cpsw->usage_count <= 1) { in cpsw_ndo_stop()
1964 napi_disable(&cpsw->napi_rx); in cpsw_ndo_stop()
1965 napi_disable(&cpsw->napi_tx); in cpsw_ndo_stop()
1966 cpts_unregister(cpsw->cpts); in cpsw_ndo_stop()
1967 cpsw_intr_disable(cpsw); in cpsw_ndo_stop()
1968 cpdma_ctlr_stop(cpsw->dma); in cpsw_ndo_stop()
1969 cpsw_ale_stop(cpsw->ale); in cpsw_ndo_stop()
1971 for_each_slave(priv, cpsw_slave_stop, cpsw); in cpsw_ndo_stop()
1973 if (cpsw_need_resplit(cpsw)) in cpsw_ndo_stop()
1976 cpsw->usage_count--; in cpsw_ndo_stop()
1977 pm_runtime_put_sync(cpsw->dev); in cpsw_ndo_stop()
1985 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_start_xmit() local
1986 struct cpts *cpts = cpsw->cpts; in cpsw_ndo_start_xmit()
2002 if (q_idx >= cpsw->tx_ch_num) in cpsw_ndo_start_xmit()
2003 q_idx = q_idx % cpsw->tx_ch_num; in cpsw_ndo_start_xmit()
2005 txch = cpsw->txv[q_idx].ch; in cpsw_ndo_start_xmit()
2042 static void cpsw_hwtstamp_v1(struct cpsw_common *cpsw) in cpsw_hwtstamp_v1() argument
2044 struct cpsw_slave *slave = &cpsw->slaves[cpsw->data.active_slave]; in cpsw_hwtstamp_v1()
2047 if (!cpts_is_tx_enabled(cpsw->cpts) && in cpsw_hwtstamp_v1()
2048 !cpts_is_rx_enabled(cpsw->cpts)) { in cpsw_hwtstamp_v1()
2056 if (cpts_is_tx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v1()
2059 if (cpts_is_rx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v1()
2069 struct cpsw_common *cpsw = priv->cpsw; in cpsw_hwtstamp_v2() local
2072 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_hwtstamp_v2()
2075 switch (cpsw->version) { in cpsw_hwtstamp_v2()
2079 if (cpts_is_tx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v2()
2082 if (cpts_is_rx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v2()
2089 if (cpts_is_tx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v2()
2092 if (cpts_is_rx_enabled(cpsw->cpts)) in cpsw_hwtstamp_v2()
2101 writel_relaxed(ETH_P_1588, &cpsw->regs->ts_ltype); in cpsw_hwtstamp_v2()
2108 struct cpsw_common *cpsw = priv->cpsw; in cpsw_hwtstamp_set() local
2109 struct cpts *cpts = cpsw->cpts; in cpsw_hwtstamp_set()
2111 if (cpsw->version != CPSW_VERSION_1 && in cpsw_hwtstamp_set()
2112 cpsw->version != CPSW_VERSION_2 && in cpsw_hwtstamp_set()
2113 cpsw->version != CPSW_VERSION_3) in cpsw_hwtstamp_set()
2157 switch (cpsw->version) { in cpsw_hwtstamp_set()
2159 cpsw_hwtstamp_v1(cpsw); in cpsw_hwtstamp_set()
2174 struct cpsw_common *cpsw = ndev_to_cpsw(dev); in cpsw_hwtstamp_get() local
2175 struct cpts *cpts = cpsw->cpts; in cpsw_hwtstamp_get()
2178 if (cpsw->version != CPSW_VERSION_1 && in cpsw_hwtstamp_get()
2179 cpsw->version != CPSW_VERSION_2 && in cpsw_hwtstamp_get()
2180 cpsw->version != CPSW_VERSION_3) in cpsw_hwtstamp_get()
2206 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_ioctl() local
2207 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_ndo_ioctl()
2219 if (!cpsw->slaves[slave_no].phy) in cpsw_ndo_ioctl()
2221 return phy_mii_ioctl(cpsw->slaves[slave_no].phy, req, cmd); in cpsw_ndo_ioctl()
2227 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_tx_timeout() local
2232 cpsw_intr_disable(cpsw); in cpsw_ndo_tx_timeout()
2233 for (ch = 0; ch < cpsw->tx_ch_num; ch++) { in cpsw_ndo_tx_timeout()
2234 cpdma_chan_stop(cpsw->txv[ch].ch); in cpsw_ndo_tx_timeout()
2235 cpdma_chan_start(cpsw->txv[ch].ch); in cpsw_ndo_tx_timeout()
2238 cpsw_intr_enable(cpsw); in cpsw_ndo_tx_timeout()
2247 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_set_mac_address() local
2255 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ndo_set_mac_address()
2257 pm_runtime_put_noidle(cpsw->dev); in cpsw_ndo_set_mac_address()
2261 if (cpsw->data.dual_emac) { in cpsw_ndo_set_mac_address()
2262 vid = cpsw->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_mac_address()
2266 cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, HOST_PORT_NUM, in cpsw_ndo_set_mac_address()
2268 cpsw_ale_add_ucast(cpsw->ale, addr->sa_data, HOST_PORT_NUM, in cpsw_ndo_set_mac_address()
2275 pm_runtime_put(cpsw->dev); in cpsw_ndo_set_mac_address()
2283 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_ndo_poll_controller() local
2285 cpsw_intr_disable(cpsw); in cpsw_ndo_poll_controller()
2286 cpsw_rx_interrupt(cpsw->irqs_table[0], cpsw); in cpsw_ndo_poll_controller()
2287 cpsw_tx_interrupt(cpsw->irqs_table[1], cpsw); in cpsw_ndo_poll_controller()
2288 cpsw_intr_enable(cpsw); in cpsw_ndo_poll_controller()
2298 struct cpsw_common *cpsw = priv->cpsw; in cpsw_add_vlan_ale_entry() local
2300 if (cpsw->data.dual_emac) { in cpsw_add_vlan_ale_entry()
2314 ret = cpsw_ale_add_vlan(cpsw->ale, vid, port_mask, 0, port_mask, in cpsw_add_vlan_ale_entry()
2319 ret = cpsw_ale_add_ucast(cpsw->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
2324 ret = cpsw_ale_add_mcast(cpsw->ale, priv->ndev->broadcast, in cpsw_add_vlan_ale_entry()
2331 cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
2334 cpsw_ale_del_vlan(cpsw->ale, vid, 0); in cpsw_add_vlan_ale_entry()
2342 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_vlan_rx_add_vid() local
2345 if (vid == cpsw->data.default_vlan) in cpsw_ndo_vlan_rx_add_vid()
2348 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ndo_vlan_rx_add_vid()
2350 pm_runtime_put_noidle(cpsw->dev); in cpsw_ndo_vlan_rx_add_vid()
2354 if (cpsw->data.dual_emac) { in cpsw_ndo_vlan_rx_add_vid()
2361 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_ndo_vlan_rx_add_vid()
2362 if (vid == cpsw->slaves[i].port_vlan) { in cpsw_ndo_vlan_rx_add_vid()
2372 pm_runtime_put(cpsw->dev); in cpsw_ndo_vlan_rx_add_vid()
2380 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_vlan_rx_kill_vid() local
2383 if (vid == cpsw->data.default_vlan) in cpsw_ndo_vlan_rx_kill_vid()
2386 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ndo_vlan_rx_kill_vid()
2388 pm_runtime_put_noidle(cpsw->dev); in cpsw_ndo_vlan_rx_kill_vid()
2392 if (cpsw->data.dual_emac) { in cpsw_ndo_vlan_rx_kill_vid()
2395 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_ndo_vlan_rx_kill_vid()
2396 if (vid == cpsw->slaves[i].port_vlan) in cpsw_ndo_vlan_rx_kill_vid()
2402 ret = cpsw_ale_del_vlan(cpsw->ale, vid, 0); in cpsw_ndo_vlan_rx_kill_vid()
2403 ret |= cpsw_ale_del_ucast(cpsw->ale, priv->mac_addr, in cpsw_ndo_vlan_rx_kill_vid()
2405 ret |= cpsw_ale_del_mcast(cpsw->ale, priv->ndev->broadcast, in cpsw_ndo_vlan_rx_kill_vid()
2408 pm_runtime_put(cpsw->dev); in cpsw_ndo_vlan_rx_kill_vid()
2415 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ndo_set_tx_maxrate() local
2426 min_rate = cpdma_chan_get_min_rate(cpsw->dma); in cpsw_ndo_set_tx_maxrate()
2433 if (rate > cpsw->speed) { in cpsw_ndo_set_tx_maxrate()
2438 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ndo_set_tx_maxrate()
2440 pm_runtime_put_noidle(cpsw->dev); in cpsw_ndo_set_tx_maxrate()
2444 ret = cpdma_chan_set_rate(cpsw->txv[queue].ch, ch_rate); in cpsw_ndo_set_tx_maxrate()
2445 pm_runtime_put(cpsw->dev); in cpsw_ndo_set_tx_maxrate()
2451 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_ndo_set_tx_maxrate()
2452 slave = &cpsw->slaves[i]; in cpsw_ndo_set_tx_maxrate()
2467 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_mqprio() local
2480 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_set_mqprio()
2482 pm_runtime_put_noidle(cpsw->dev); in cpsw_set_mqprio()
2509 offset = cpsw->version == CPSW_VERSION_1 ? in cpsw_set_mqprio()
2512 slave = &cpsw->slaves[cpsw_slave_index(cpsw, priv)]; in cpsw_set_mqprio()
2515 pm_runtime_put_sync(cpsw->dev); in cpsw_set_mqprio()
2555 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_regs_len() local
2557 return cpsw->data.ale_entries * ALE_ENTRY_WORDS * sizeof(u32); in cpsw_get_regs_len()
2564 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_regs() local
2566 /* update CPSW IP version */ in cpsw_get_regs()
2567 regs->version = cpsw->version; in cpsw_get_regs()
2569 cpsw_ale_dump(cpsw->ale, reg); in cpsw_get_regs()
2575 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_drvinfo() local
2576 struct platform_device *pdev = to_platform_device(cpsw->dev); in cpsw_get_drvinfo()
2578 strlcpy(info->driver, "cpsw", sizeof(info->driver)); in cpsw_get_drvinfo()
2599 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_ts_info() local
2608 info->phc_index = cpsw->cpts->phc_index; in cpsw_get_ts_info()
2637 struct cpsw_common *cpsw = priv->cpsw; in cpsw_get_link_ksettings() local
2638 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_get_link_ksettings()
2640 if (!cpsw->slaves[slave_no].phy) in cpsw_get_link_ksettings()
2643 phy_ethtool_ksettings_get(cpsw->slaves[slave_no].phy, ecmd); in cpsw_get_link_ksettings()
2651 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_link_ksettings() local
2652 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_set_link_ksettings()
2654 if (cpsw->slaves[slave_no].phy) in cpsw_set_link_ksettings()
2655 return phy_ethtool_ksettings_set(cpsw->slaves[slave_no].phy, in cpsw_set_link_ksettings()
2664 struct cpsw_common *cpsw = priv->cpsw; in cpsw_get_wol() local
2665 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_get_wol()
2670 if (cpsw->slaves[slave_no].phy) in cpsw_get_wol()
2671 phy_ethtool_get_wol(cpsw->slaves[slave_no].phy, wol); in cpsw_get_wol()
2677 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_wol() local
2678 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_set_wol()
2680 if (cpsw->slaves[slave_no].phy) in cpsw_set_wol()
2681 return phy_ethtool_set_wol(cpsw->slaves[slave_no].phy, wol); in cpsw_set_wol()
2712 struct cpsw_common *cpsw = priv->cpsw; in cpsw_ethtool_op_begin() local
2715 ret = pm_runtime_get_sync(cpsw->dev); in cpsw_ethtool_op_begin()
2718 pm_runtime_put_noidle(cpsw->dev); in cpsw_ethtool_op_begin()
2729 ret = pm_runtime_put(priv->cpsw->dev); in cpsw_ethtool_op_complete()
2737 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_get_channels() local
2739 ch->max_rx = cpsw->quirk_irq ? 1 : CPSW_MAX_QUEUES; in cpsw_get_channels()
2740 ch->max_tx = cpsw->quirk_irq ? 1 : CPSW_MAX_QUEUES; in cpsw_get_channels()
2744 ch->rx_count = cpsw->rx_ch_num; in cpsw_get_channels()
2745 ch->tx_count = cpsw->tx_ch_num; in cpsw_get_channels()
2749 static int cpsw_check_ch_settings(struct cpsw_common *cpsw, in cpsw_check_ch_settings() argument
2752 if (cpsw->quirk_irq) { in cpsw_check_ch_settings()
2753 dev_err(cpsw->dev, "Maximum one tx/rx queue is allowed"); in cpsw_check_ch_settings()
2764 if (ch->rx_count > cpsw->data.channels || in cpsw_check_ch_settings()
2765 ch->tx_count > cpsw->data.channels) in cpsw_check_ch_settings()
2773 struct cpsw_common *cpsw = priv->cpsw; in cpsw_update_channels_res() local
2780 ch = &cpsw->rx_ch_num; in cpsw_update_channels_res()
2781 vec = cpsw->rxv; in cpsw_update_channels_res()
2784 ch = &cpsw->tx_ch_num; in cpsw_update_channels_res()
2785 vec = cpsw->txv; in cpsw_update_channels_res()
2791 vec[*ch].ch = cpdma_chan_create(cpsw->dma, vch, handler, rx); in cpsw_update_channels_res()
2838 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_suspend_data_pass() local
2843 cpsw_intr_disable(cpsw); in cpsw_suspend_data_pass()
2848 for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) { in cpsw_suspend_data_pass()
2857 cpdma_ctlr_stop(cpsw->dma); in cpsw_suspend_data_pass()
2863 struct cpsw_common *cpsw = priv->cpsw; in cpsw_resume_data_pass() local
2868 for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) in cpsw_resume_data_pass()
2873 if (cpsw->usage_count) { in cpsw_resume_data_pass()
2878 cpdma_ctlr_start(cpsw->dma); in cpsw_resume_data_pass()
2879 cpsw_intr_enable(cpsw); in cpsw_resume_data_pass()
2883 for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) in cpsw_resume_data_pass()
2894 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_channels() local
2898 ret = cpsw_check_ch_settings(cpsw, chs); in cpsw_set_channels()
2907 for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) { in cpsw_set_channels()
2913 cpsw->tx_ch_num); in cpsw_set_channels()
2920 cpsw->rx_ch_num); in cpsw_set_channels()
2927 if (cpsw->usage_count) in cpsw_set_channels()
2942 struct cpsw_common *cpsw = priv->cpsw; in cpsw_get_eee() local
2943 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_get_eee()
2945 if (cpsw->slaves[slave_no].phy) in cpsw_get_eee()
2946 return phy_ethtool_get_eee(cpsw->slaves[slave_no].phy, edata); in cpsw_get_eee()
2954 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_eee() local
2955 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_set_eee()
2957 if (cpsw->slaves[slave_no].phy) in cpsw_set_eee()
2958 return phy_ethtool_set_eee(cpsw->slaves[slave_no].phy, edata); in cpsw_set_eee()
2966 struct cpsw_common *cpsw = priv->cpsw; in cpsw_nway_reset() local
2967 int slave_no = cpsw_slave_index(cpsw, priv); in cpsw_nway_reset()
2969 if (cpsw->slaves[slave_no].phy) in cpsw_nway_reset()
2970 return genphy_restart_aneg(cpsw->slaves[slave_no].phy); in cpsw_nway_reset()
2979 struct cpsw_common *cpsw = priv->cpsw; in cpsw_get_ringparam() local
2983 ering->tx_pending = cpdma_get_num_tx_descs(cpsw->dma); in cpsw_get_ringparam()
2985 ering->rx_pending = cpdma_get_num_rx_descs(cpsw->dma); in cpsw_get_ringparam()
2992 struct cpsw_common *cpsw = priv->cpsw; in cpsw_set_ringparam() local
3002 if (ering->rx_pending == cpdma_get_num_rx_descs(cpsw->dma)) in cpsw_set_ringparam()
3007 cpdma_set_num_rx_descs(cpsw->dma, ering->rx_pending); in cpsw_set_ringparam()
3009 if (cpsw->usage_count) in cpsw_set_ringparam()
3010 cpdma_chan_split_pool(cpsw->dma); in cpsw_set_ringparam()
3051 static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_common *cpsw, in cpsw_slave_init() argument
3054 void __iomem *regs = cpsw->regs; in cpsw_slave_init()
3056 struct cpsw_slave_data *data = cpsw->data.slave_data + slave_num; in cpsw_slave_init()
3223 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_remove_dt() local
3224 struct cpsw_platform_data *data = &cpsw->data; in cpsw_remove_dt()
3250 struct cpsw_common *cpsw = priv->cpsw; in cpsw_probe_dual_emac() local
3251 struct cpsw_platform_data *data = &cpsw->data; in cpsw_probe_dual_emac()
3258 dev_err(cpsw->dev, "cpsw: error allocating net_device\n"); in cpsw_probe_dual_emac()
3263 priv_sl2->cpsw = cpsw; in cpsw_probe_dual_emac()
3271 dev_info(cpsw->dev, "cpsw: Detected MACID = %pM\n", in cpsw_probe_dual_emac()
3275 dev_info(cpsw->dev, "cpsw: Random MACID = %pM\n", in cpsw_probe_dual_emac()
3281 cpsw->slaves[1].ndev = ndev; in cpsw_probe_dual_emac()
3288 SET_NETDEV_DEV(ndev, cpsw->dev); in cpsw_probe_dual_emac()
3291 dev_err(cpsw->dev, "cpsw: error registering net device\n"); in cpsw_probe_dual_emac()
3300 { .compatible = "ti,cpsw"},
3301 { .compatible = "ti,am335x-cpsw"},
3302 { .compatible = "ti,am4372-cpsw"},
3303 { .compatible = "ti,dra7-cpsw"},
3327 struct cpsw_common *cpsw; in cpsw_probe() local
3331 cpsw = devm_kzalloc(&pdev->dev, sizeof(struct cpsw_common), GFP_KERNEL); in cpsw_probe()
3332 if (!cpsw) in cpsw_probe()
3335 cpsw->dev = &pdev->dev; in cpsw_probe()
3345 priv->cpsw = cpsw; in cpsw_probe()
3349 cpsw->rx_packet_max = max(rx_packet_max, 128); in cpsw_probe()
3375 ret = cpsw_probe_dt(&cpsw->data, pdev); in cpsw_probe()
3379 data = &cpsw->data; in cpsw_probe()
3380 cpsw->rx_ch_num = 1; in cpsw_probe()
3381 cpsw->tx_ch_num = 1; in cpsw_probe()
3393 cpsw->slaves = devm_kcalloc(&pdev->dev, in cpsw_probe()
3396 if (!cpsw->slaves) { in cpsw_probe()
3401 cpsw->slaves[i].slave_num = i; in cpsw_probe()
3403 cpsw->slaves[0].ndev = ndev; in cpsw_probe()
3412 cpsw->bus_freq_mhz = clk_get_rate(clk) / 1000000; in cpsw_probe()
3420 cpsw->regs = ss_regs; in cpsw_probe()
3422 cpsw->version = readl(&cpsw->regs->id_ver); in cpsw_probe()
3425 cpsw->wr_regs = devm_ioremap_resource(&pdev->dev, res); in cpsw_probe()
3426 if (IS_ERR(cpsw->wr_regs)) { in cpsw_probe()
3427 ret = PTR_ERR(cpsw->wr_regs); in cpsw_probe()
3434 switch (cpsw->version) { in cpsw_probe()
3436 cpsw->host_port_regs = ss_regs + CPSW1_HOST_PORT_OFFSET; in cpsw_probe()
3438 cpsw->hw_stats = ss_regs + CPSW1_HW_STATS; in cpsw_probe()
3450 cpsw->host_port_regs = ss_regs + CPSW2_HOST_PORT_OFFSET; in cpsw_probe()
3452 cpsw->hw_stats = ss_regs + CPSW2_HW_STATS; in cpsw_probe()
3463 dev_err(priv->dev, "unknown version 0x%08x\n", cpsw->version); in cpsw_probe()
3467 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_probe()
3468 struct cpsw_slave *slave = &cpsw->slaves[i]; in cpsw_probe()
3470 cpsw_slave_init(slave, cpsw, slave_offset, sliver_offset); in cpsw_probe()
3489 dma_params.bus_freq_mhz = cpsw->bus_freq_mhz; in cpsw_probe()
3492 cpsw->dma = cpdma_ctlr_create(&dma_params); in cpsw_probe()
3493 if (!cpsw->dma) { in cpsw_probe()
3501 cpsw->quirk_irq = 1; in cpsw_probe()
3503 ch = cpsw->quirk_irq ? 0 : 7; in cpsw_probe()
3504 cpsw->txv[0].ch = cpdma_chan_create(cpsw->dma, ch, cpsw_tx_handler, 0); in cpsw_probe()
3505 if (IS_ERR(cpsw->txv[0].ch)) { in cpsw_probe()
3507 ret = PTR_ERR(cpsw->txv[0].ch); in cpsw_probe()
3511 cpsw->rxv[0].ch = cpdma_chan_create(cpsw->dma, 0, cpsw_rx_handler, 1); in cpsw_probe()
3512 if (IS_ERR(cpsw->rxv[0].ch)) { in cpsw_probe()
3514 ret = PTR_ERR(cpsw->rxv[0].ch); in cpsw_probe()
3523 cpsw->ale = cpsw_ale_create(&ale_params); in cpsw_probe()
3524 if (!cpsw->ale) { in cpsw_probe()
3530 cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node); in cpsw_probe()
3531 if (IS_ERR(cpsw->cpts)) { in cpsw_probe()
3532 ret = PTR_ERR(cpsw->cpts); in cpsw_probe()
3547 netif_napi_add(ndev, &cpsw->napi_rx, in cpsw_probe()
3548 cpsw->quirk_irq ? cpsw_rx_poll : cpsw_rx_mq_poll, in cpsw_probe()
3550 netif_tx_napi_add(ndev, &cpsw->napi_tx, in cpsw_probe()
3551 cpsw->quirk_irq ? cpsw_tx_poll : cpsw_tx_mq_poll, in cpsw_probe()
3564 if (cpsw->data.dual_emac) { in cpsw_probe()
3587 cpsw->irqs_table[0] = irq; in cpsw_probe()
3589 0, dev_name(&pdev->dev), cpsw); in cpsw_probe()
3602 cpsw->irqs_table[1] = irq; in cpsw_probe()
3604 0, dev_name(&pdev->dev), cpsw); in cpsw_probe()
3621 cpdma_ctlr_destroy(cpsw->dma); in cpsw_probe()
3635 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_remove() local
3644 if (cpsw->data.dual_emac) in cpsw_remove()
3645 unregister_netdev(cpsw->slaves[1].ndev); in cpsw_remove()
3648 cpts_release(cpsw->cpts); in cpsw_remove()
3649 cpdma_ctlr_destroy(cpsw->dma); in cpsw_remove()
3653 if (cpsw->data.dual_emac) in cpsw_remove()
3654 free_netdev(cpsw->slaves[1].ndev); in cpsw_remove()
3664 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_suspend() local
3666 if (cpsw->data.dual_emac) { in cpsw_suspend()
3669 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_suspend()
3670 if (netif_running(cpsw->slaves[i].ndev)) in cpsw_suspend()
3671 cpsw_ndo_stop(cpsw->slaves[i].ndev); in cpsw_suspend()
3688 struct cpsw_common *cpsw = ndev_to_cpsw(ndev); in cpsw_resume() local
3695 if (cpsw->data.dual_emac) { in cpsw_resume()
3698 for (i = 0; i < cpsw->data.slaves; i++) { in cpsw_resume()
3699 if (netif_running(cpsw->slaves[i].ndev)) in cpsw_resume()
3700 cpsw_ndo_open(cpsw->slaves[i].ndev); in cpsw_resume()
3716 .name = "cpsw",
3729 MODULE_DESCRIPTION("TI CPSW Ethernet driver");