Lines Matching refs:priv

55 #define cpsw_info(priv, type, format, ...)		\  argument
57 if (netif_msg_##type(priv) && net_ratelimit()) \
58 dev_info(priv->dev, format, ## __VA_ARGS__); \
61 #define cpsw_err(priv, type, format, ...) \ argument
63 if (netif_msg_##type(priv) && net_ratelimit()) \
64 dev_err(priv->dev, format, ## __VA_ARGS__); \
67 #define cpsw_dbg(priv, type, format, ...) \ argument
69 if (netif_msg_##type(priv) && net_ratelimit()) \
70 dev_dbg(priv->dev, format, ## __VA_ARGS__); \
73 #define cpsw_notice(priv, type, format, ...) \ argument
75 if (netif_msg_##type(priv) && net_ratelimit()) \
76 dev_notice(priv->dev, format, ## __VA_ARGS__); \
143 #define cpsw_slave_index(priv) \ argument
144 ((priv->data.dual_emac) ? priv->emac_port : \
145 priv->data.active_slave)
492 #define for_each_slave(priv, func, arg...) \ argument
496 if (priv->data.dual_emac) \
497 (func)((priv)->slaves + priv->emac_port, ##arg);\
499 for (n = (priv)->data.slaves, \
500 slave = (priv)->slaves; \
504 #define cpsw_get_slave_ndev(priv, __slave_no__) \ argument
505 ((__slave_no__ < priv->data.slaves) ? \
506 priv->slaves[__slave_no__].ndev : NULL)
507 #define cpsw_get_slave_priv(priv, __slave_no__) \ argument
508 (((__slave_no__ < priv->data.slaves) && \
509 (priv->slaves[__slave_no__].ndev)) ? \
510 netdev_priv(priv->slaves[__slave_no__].ndev) : NULL) \
512 #define cpsw_dual_emac_src_port_detect(status, priv, ndev, skb) \ argument
514 if (!priv->data.dual_emac) \
517 ndev = cpsw_get_slave_ndev(priv, 0); \
518 priv = netdev_priv(ndev); \
521 ndev = cpsw_get_slave_ndev(priv, 1); \
522 priv = netdev_priv(ndev); \
526 #define cpsw_add_mcast(priv, addr) \ argument
528 if (priv->data.dual_emac) { \
529 struct cpsw_slave *slave = priv->slaves + \
530 priv->emac_port; \
531 int slave_port = cpsw_get_slave_port(priv, \
533 cpsw_ale_add_mcast(priv->ale, addr, \
534 1 << slave_port | 1 << priv->host_port, \
537 cpsw_ale_add_mcast(priv->ale, addr, \
538 ALE_ALL_PORTS << priv->host_port, \
543 static inline int cpsw_get_slave_port(struct cpsw_priv *priv, u32 slave_num) in cpsw_get_slave_port() argument
545 if (priv->host_port == 0) in cpsw_get_slave_port()
553 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_promiscious() local
554 struct cpsw_ale *ale = priv->ale; in cpsw_set_promiscious()
557 if (priv->data.dual_emac) { in cpsw_set_promiscious()
564 for (i = 0; i < priv->data.slaves; i++) in cpsw_set_promiscious()
565 if (priv->slaves[i].ndev->flags & IFF_PROMISC) in cpsw_set_promiscious()
588 for (i = 0; i <= priv->data.slaves; i++) { in cpsw_set_promiscious()
606 priv->host_port, -1); in cpsw_set_promiscious()
616 for (i = 0; i <= priv->data.slaves; i++) { in cpsw_set_promiscious()
629 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_set_rx_mode() local
632 if (priv->data.dual_emac) in cpsw_ndo_set_rx_mode()
633 vid = priv->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_rx_mode()
635 vid = priv->data.default_vlan; in cpsw_ndo_set_rx_mode()
640 cpsw_ale_set_allmulti(priv->ale, IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
648 cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
651 cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port, in cpsw_ndo_set_rx_mode()
659 cpsw_add_mcast(priv, (u8 *)ha->addr); in cpsw_ndo_set_rx_mode()
664 static void cpsw_intr_enable(struct cpsw_priv *priv) in cpsw_intr_enable() argument
666 __raw_writel(0xFF, &priv->wr_regs->tx_en); in cpsw_intr_enable()
667 __raw_writel(0xFF, &priv->wr_regs->rx_en); in cpsw_intr_enable()
669 cpdma_ctlr_int_ctrl(priv->dma, true); in cpsw_intr_enable()
673 static void cpsw_intr_disable(struct cpsw_priv *priv) in cpsw_intr_disable() argument
675 __raw_writel(0, &priv->wr_regs->tx_en); in cpsw_intr_disable()
676 __raw_writel(0, &priv->wr_regs->rx_en); in cpsw_intr_disable()
678 cpdma_ctlr_int_ctrl(priv->dma, false); in cpsw_intr_disable()
686 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_tx_handler() local
693 cpts_tx_timestamp(priv->cpts, skb); in cpsw_tx_handler()
704 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_rx_handler() local
707 cpsw_dual_emac_src_port_detect(status, priv, ndev, skb); in cpsw_rx_handler()
711 struct cpsw_slave *slave = priv->slaves; in cpsw_rx_handler()
714 if (priv->data.dual_emac) { in cpsw_rx_handler()
716 for (n = priv->data.slaves; n; n--, slave++) in cpsw_rx_handler()
737 new_skb = netdev_alloc_skb_ip_align(ndev, priv->rx_packet_max); in cpsw_rx_handler()
740 cpts_rx_timestamp(priv->cpts, skb); in cpsw_rx_handler()
751 ret = cpdma_chan_submit(priv->rxch, new_skb, new_skb->data, in cpsw_rx_handler()
759 struct cpsw_priv *priv = dev_id; in cpsw_tx_interrupt() local
761 writel(0, &priv->wr_regs->tx_en); in cpsw_tx_interrupt()
762 cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); in cpsw_tx_interrupt()
764 if (priv->quirk_irq) { in cpsw_tx_interrupt()
765 disable_irq_nosync(priv->irqs_table[1]); in cpsw_tx_interrupt()
766 priv->tx_irq_disabled = true; in cpsw_tx_interrupt()
769 napi_schedule(&priv->napi_tx); in cpsw_tx_interrupt()
775 struct cpsw_priv *priv = dev_id; in cpsw_rx_interrupt() local
777 cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); in cpsw_rx_interrupt()
778 writel(0, &priv->wr_regs->rx_en); in cpsw_rx_interrupt()
780 if (priv->quirk_irq) { in cpsw_rx_interrupt()
781 disable_irq_nosync(priv->irqs_table[0]); in cpsw_rx_interrupt()
782 priv->rx_irq_disabled = true; in cpsw_rx_interrupt()
785 napi_schedule(&priv->napi_rx); in cpsw_rx_interrupt()
791 struct cpsw_priv *priv = napi_to_priv(napi_tx); in cpsw_tx_poll() local
794 num_tx = cpdma_chan_process(priv->txch, budget); in cpsw_tx_poll()
797 writel(0xff, &priv->wr_regs->tx_en); in cpsw_tx_poll()
798 if (priv->quirk_irq && priv->tx_irq_disabled) { in cpsw_tx_poll()
799 priv->tx_irq_disabled = false; in cpsw_tx_poll()
800 enable_irq(priv->irqs_table[1]); in cpsw_tx_poll()
805 cpsw_dbg(priv, intr, "poll %d tx pkts\n", num_tx); in cpsw_tx_poll()
812 struct cpsw_priv *priv = napi_to_priv(napi_rx); in cpsw_rx_poll() local
815 num_rx = cpdma_chan_process(priv->rxch, budget); in cpsw_rx_poll()
818 writel(0xff, &priv->wr_regs->rx_en); in cpsw_rx_poll()
819 if (priv->quirk_irq && priv->rx_irq_disabled) { in cpsw_rx_poll()
820 priv->rx_irq_disabled = false; in cpsw_rx_poll()
821 enable_irq(priv->irqs_table[0]); in cpsw_rx_poll()
826 cpsw_dbg(priv, intr, "poll %d rx pkts\n", num_rx); in cpsw_rx_poll()
848 struct cpsw_priv *priv) in cpsw_set_slave_mac() argument
850 slave_write(slave, mac_hi(priv->mac_addr), SA_HI); in cpsw_set_slave_mac()
851 slave_write(slave, mac_lo(priv->mac_addr), SA_LO); in cpsw_set_slave_mac()
855 struct cpsw_priv *priv, bool *link) in _cpsw_adjust_link() argument
864 slave_port = cpsw_get_slave_port(priv, slave->slave_num); in _cpsw_adjust_link()
867 mac_control = priv->data.mac_control; in _cpsw_adjust_link()
870 cpsw_ale_control_set(priv->ale, slave_port, in _cpsw_adjust_link()
884 if (priv->rx_pause) in _cpsw_adjust_link()
887 if (priv->tx_pause) in _cpsw_adjust_link()
894 cpsw_ale_control_set(priv->ale, slave_port, in _cpsw_adjust_link()
908 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_adjust_link() local
911 for_each_slave(priv, _cpsw_adjust_link, priv, &link); in cpsw_adjust_link()
926 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_coalesce() local
928 coal->rx_coalesce_usecs = priv->coal_intvl; in cpsw_get_coalesce()
935 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_coalesce() local
944 int_ctrl = readl(&priv->wr_regs->int_control); in cpsw_set_coalesce()
945 prescale = priv->bus_freq_mhz * 4; in cpsw_set_coalesce()
973 writel(num_interrupts, &priv->wr_regs->rx_imax); in cpsw_set_coalesce()
974 writel(num_interrupts, &priv->wr_regs->tx_imax); in cpsw_set_coalesce()
981 writel(int_ctrl, &priv->wr_regs->int_control); in cpsw_set_coalesce()
983 cpsw_notice(priv, timer, "Set coalesce to %d usecs.\n", coal_intvl); in cpsw_set_coalesce()
984 if (priv->data.dual_emac) { in cpsw_set_coalesce()
987 for (i = 0; i < priv->data.slaves; i++) { in cpsw_set_coalesce()
988 priv = netdev_priv(priv->slaves[i].ndev); in cpsw_set_coalesce()
989 priv->coal_intvl = coal_intvl; in cpsw_set_coalesce()
992 priv->coal_intvl = coal_intvl; in cpsw_set_coalesce()
1027 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_ethtool_stats() local
1035 cpdma_chan_get_stats(priv->rxch, &rx_stats); in cpsw_get_ethtool_stats()
1036 cpdma_chan_get_stats(priv->txch, &tx_stats); in cpsw_get_ethtool_stats()
1041 val = readl(priv->hw_stats + in cpsw_get_ethtool_stats()
1061 static int cpsw_common_res_usage_state(struct cpsw_priv *priv) in cpsw_common_res_usage_state() argument
1066 if (!priv->data.dual_emac) in cpsw_common_res_usage_state()
1069 for (i = 0; i < priv->data.slaves; i++) in cpsw_common_res_usage_state()
1070 if (priv->slaves[i].open_stat) in cpsw_common_res_usage_state()
1077 struct cpsw_priv *priv, struct sk_buff *skb) in cpsw_tx_packet_submit() argument
1079 if (!priv->data.dual_emac) in cpsw_tx_packet_submit()
1080 return cpdma_chan_submit(priv->txch, skb, skb->data, in cpsw_tx_packet_submit()
1083 if (ndev == cpsw_get_slave_ndev(priv, 0)) in cpsw_tx_packet_submit()
1084 return cpdma_chan_submit(priv->txch, skb, skb->data, in cpsw_tx_packet_submit()
1087 return cpdma_chan_submit(priv->txch, skb, skb->data, in cpsw_tx_packet_submit()
1092 struct cpsw_priv *priv, struct cpsw_slave *slave, in cpsw_add_dual_emac_def_ale_entries() argument
1095 u32 port_mask = 1 << slave_port | 1 << priv->host_port; in cpsw_add_dual_emac_def_ale_entries()
1097 if (priv->version == CPSW_VERSION_1) in cpsw_add_dual_emac_def_ale_entries()
1101 cpsw_ale_add_vlan(priv->ale, slave->port_vlan, port_mask, in cpsw_add_dual_emac_def_ale_entries()
1103 cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_add_dual_emac_def_ale_entries()
1105 cpsw_ale_add_ucast(priv->ale, priv->mac_addr, in cpsw_add_dual_emac_def_ale_entries()
1106 priv->host_port, ALE_VLAN | ALE_SECURE, slave->port_vlan); in cpsw_add_dual_emac_def_ale_entries()
1117 static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv) in cpsw_slave_open() argument
1126 switch (priv->version) { in cpsw_slave_open()
1138 __raw_writel(priv->rx_packet_max, &slave->sliver->rx_maxlen); in cpsw_slave_open()
1139 cpsw_set_slave_mac(slave, priv); in cpsw_slave_open()
1143 slave_port = cpsw_get_slave_port(priv, slave->slave_num); in cpsw_slave_open()
1145 if (priv->data.dual_emac) in cpsw_slave_open()
1146 cpsw_add_dual_emac_def_ale_entries(priv, slave, slave_port); in cpsw_slave_open()
1148 cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_slave_open()
1151 if (priv->phy_node) in cpsw_slave_open()
1152 slave->phy = of_phy_connect(priv->ndev, priv->phy_node, in cpsw_slave_open()
1155 slave->phy = phy_connect(priv->ndev, slave->data->phy_id, in cpsw_slave_open()
1158 dev_err(priv->dev, "phy %s not found on slave %d\n", in cpsw_slave_open()
1162 dev_info(priv->dev, "phy found : id is : 0x%x\n", in cpsw_slave_open()
1167 cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface, in cpsw_slave_open()
1172 static inline void cpsw_add_default_vlan(struct cpsw_priv *priv) in cpsw_add_default_vlan() argument
1174 const int vlan = priv->data.default_vlan; in cpsw_add_default_vlan()
1175 const int port = priv->host_port; in cpsw_add_default_vlan()
1180 reg = (priv->version == CPSW_VERSION_1) ? CPSW1_PORT_VLAN : in cpsw_add_default_vlan()
1183 writel(vlan, &priv->host_port_regs->port_vlan); in cpsw_add_default_vlan()
1185 for (i = 0; i < priv->data.slaves; i++) in cpsw_add_default_vlan()
1186 slave_write(priv->slaves + i, vlan, reg); in cpsw_add_default_vlan()
1188 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_default_vlan()
1193 cpsw_ale_add_vlan(priv->ale, vlan, ALE_ALL_PORTS << port, in cpsw_add_default_vlan()
1198 static void cpsw_init_host_port(struct cpsw_priv *priv) in cpsw_init_host_port() argument
1204 soft_reset("cpsw", &priv->regs->soft_reset); in cpsw_init_host_port()
1205 cpsw_ale_start(priv->ale); in cpsw_init_host_port()
1208 cpsw_ale_control_set(priv->ale, priv->host_port, ALE_VLAN_AWARE, in cpsw_init_host_port()
1210 control_reg = readl(&priv->regs->control); in cpsw_init_host_port()
1212 writel(control_reg, &priv->regs->control); in cpsw_init_host_port()
1213 fifo_mode = (priv->data.dual_emac) ? CPSW_FIFO_DUAL_MAC_MODE : in cpsw_init_host_port()
1215 writel(fifo_mode, &priv->host_port_regs->tx_in_ctl); in cpsw_init_host_port()
1219 &priv->host_port_regs->cpdma_tx_pri_map); in cpsw_init_host_port()
1220 __raw_writel(0, &priv->host_port_regs->cpdma_rx_chan_map); in cpsw_init_host_port()
1222 cpsw_ale_control_set(priv->ale, priv->host_port, in cpsw_init_host_port()
1225 if (!priv->data.dual_emac) { in cpsw_init_host_port()
1226 cpsw_ale_add_ucast(priv->ale, priv->mac_addr, priv->host_port, in cpsw_init_host_port()
1228 cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_init_host_port()
1229 1 << priv->host_port, 0, 0, ALE_MCAST_FWD_2); in cpsw_init_host_port()
1233 static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_priv *priv) in cpsw_slave_stop() argument
1237 slave_port = cpsw_get_slave_port(priv, slave->slave_num); in cpsw_slave_stop()
1244 cpsw_ale_control_set(priv->ale, slave_port, in cpsw_slave_stop()
1250 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_open() local
1254 if (!cpsw_common_res_usage_state(priv)) in cpsw_ndo_open()
1255 cpsw_intr_disable(priv); in cpsw_ndo_open()
1258 pm_runtime_get_sync(&priv->pdev->dev); in cpsw_ndo_open()
1260 reg = priv->version; in cpsw_ndo_open()
1262 dev_info(priv->dev, "initializing cpsw version %d.%d (%d)\n", in cpsw_ndo_open()
1267 if (!cpsw_common_res_usage_state(priv)) in cpsw_ndo_open()
1268 cpsw_init_host_port(priv); in cpsw_ndo_open()
1269 for_each_slave(priv, cpsw_slave_open, priv); in cpsw_ndo_open()
1272 if (!priv->data.dual_emac) in cpsw_ndo_open()
1273 cpsw_add_default_vlan(priv); in cpsw_ndo_open()
1275 cpsw_ale_add_vlan(priv->ale, priv->data.default_vlan, in cpsw_ndo_open()
1276 ALE_ALL_PORTS << priv->host_port, in cpsw_ndo_open()
1277 ALE_ALL_PORTS << priv->host_port, 0, 0); in cpsw_ndo_open()
1279 if (!cpsw_common_res_usage_state(priv)) { in cpsw_ndo_open()
1280 struct cpsw_priv *priv_sl0 = cpsw_get_slave_priv(priv, 0); in cpsw_ndo_open()
1283 cpdma_control_set(priv->dma, CPDMA_TX_PRIO_FIXED, 1); in cpsw_ndo_open()
1284 cpdma_control_set(priv->dma, CPDMA_RX_BUFFER_OFFSET, 0); in cpsw_ndo_open()
1287 __raw_writel(0, &priv->regs->ptype); in cpsw_ndo_open()
1290 __raw_writel(0x7, &priv->regs->stat_port_en); in cpsw_ndo_open()
1293 writel(0x7, &priv->regs->flow_control); in cpsw_ndo_open()
1300 enable_irq(priv->irqs_table[1]); in cpsw_ndo_open()
1305 enable_irq(priv->irqs_table[0]); in cpsw_ndo_open()
1308 if (WARN_ON(!priv->data.rx_descs)) in cpsw_ndo_open()
1309 priv->data.rx_descs = 128; in cpsw_ndo_open()
1311 for (i = 0; i < priv->data.rx_descs; i++) { in cpsw_ndo_open()
1315 skb = __netdev_alloc_skb_ip_align(priv->ndev, in cpsw_ndo_open()
1316 priv->rx_packet_max, GFP_KERNEL); in cpsw_ndo_open()
1319 ret = cpdma_chan_submit(priv->rxch, skb, skb->data, in cpsw_ndo_open()
1329 cpsw_info(priv, ifup, "submitted %d rx descriptors\n", i); in cpsw_ndo_open()
1331 if (cpts_register(&priv->pdev->dev, priv->cpts, in cpsw_ndo_open()
1332 priv->data.cpts_clock_mult, in cpsw_ndo_open()
1333 priv->data.cpts_clock_shift)) in cpsw_ndo_open()
1334 dev_err(priv->dev, "error registering cpts device\n"); in cpsw_ndo_open()
1339 if (priv->coal_intvl != 0) { in cpsw_ndo_open()
1342 coal.rx_coalesce_usecs = (priv->coal_intvl << 4); in cpsw_ndo_open()
1346 cpdma_ctlr_start(priv->dma); in cpsw_ndo_open()
1347 cpsw_intr_enable(priv); in cpsw_ndo_open()
1349 if (priv->data.dual_emac) in cpsw_ndo_open()
1350 priv->slaves[priv->emac_port].open_stat = true; in cpsw_ndo_open()
1354 cpdma_ctlr_stop(priv->dma); in cpsw_ndo_open()
1355 for_each_slave(priv, cpsw_slave_stop, priv); in cpsw_ndo_open()
1356 pm_runtime_put_sync(&priv->pdev->dev); in cpsw_ndo_open()
1357 netif_carrier_off(priv->ndev); in cpsw_ndo_open()
1363 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_stop() local
1365 cpsw_info(priv, ifdown, "shutting down cpsw device\n"); in cpsw_ndo_stop()
1366 netif_stop_queue(priv->ndev); in cpsw_ndo_stop()
1367 netif_carrier_off(priv->ndev); in cpsw_ndo_stop()
1369 if (cpsw_common_res_usage_state(priv) <= 1) { in cpsw_ndo_stop()
1370 struct cpsw_priv *priv_sl0 = cpsw_get_slave_priv(priv, 0); in cpsw_ndo_stop()
1374 cpts_unregister(priv->cpts); in cpsw_ndo_stop()
1375 cpsw_intr_disable(priv); in cpsw_ndo_stop()
1376 cpdma_ctlr_stop(priv->dma); in cpsw_ndo_stop()
1377 cpsw_ale_stop(priv->ale); in cpsw_ndo_stop()
1379 for_each_slave(priv, cpsw_slave_stop, priv); in cpsw_ndo_stop()
1380 pm_runtime_put_sync(&priv->pdev->dev); in cpsw_ndo_stop()
1381 if (priv->data.dual_emac) in cpsw_ndo_stop()
1382 priv->slaves[priv->emac_port].open_stat = false; in cpsw_ndo_stop()
1389 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_start_xmit() local
1395 cpsw_err(priv, tx_err, "packet pad failed\n"); in cpsw_ndo_start_xmit()
1401 priv->cpts->tx_enable) in cpsw_ndo_start_xmit()
1406 ret = cpsw_tx_packet_submit(ndev, priv, skb); in cpsw_ndo_start_xmit()
1408 cpsw_err(priv, tx_err, "desc submit failed\n"); in cpsw_ndo_start_xmit()
1415 if (unlikely(!cpdma_check_free_tx_desc(priv->txch))) in cpsw_ndo_start_xmit()
1427 static void cpsw_hwtstamp_v1(struct cpsw_priv *priv) in cpsw_hwtstamp_v1() argument
1429 struct cpsw_slave *slave = &priv->slaves[priv->data.active_slave]; in cpsw_hwtstamp_v1()
1432 if (!priv->cpts->tx_enable && !priv->cpts->rx_enable) { in cpsw_hwtstamp_v1()
1440 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v1()
1443 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v1()
1450 static void cpsw_hwtstamp_v2(struct cpsw_priv *priv) in cpsw_hwtstamp_v2() argument
1455 if (priv->data.dual_emac) in cpsw_hwtstamp_v2()
1456 slave = &priv->slaves[priv->emac_port]; in cpsw_hwtstamp_v2()
1458 slave = &priv->slaves[priv->data.active_slave]; in cpsw_hwtstamp_v2()
1461 switch (priv->version) { in cpsw_hwtstamp_v2()
1465 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v2()
1468 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v2()
1475 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v2()
1478 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v2()
1487 __raw_writel(ETH_P_1588, &priv->regs->ts_ltype); in cpsw_hwtstamp_v2()
1492 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_hwtstamp_set() local
1493 struct cpts *cpts = priv->cpts; in cpsw_hwtstamp_set()
1496 if (priv->version != CPSW_VERSION_1 && in cpsw_hwtstamp_set()
1497 priv->version != CPSW_VERSION_2 && in cpsw_hwtstamp_set()
1498 priv->version != CPSW_VERSION_3) in cpsw_hwtstamp_set()
1538 switch (priv->version) { in cpsw_hwtstamp_set()
1540 cpsw_hwtstamp_v1(priv); in cpsw_hwtstamp_set()
1544 cpsw_hwtstamp_v2(priv); in cpsw_hwtstamp_set()
1555 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_hwtstamp_get() local
1556 struct cpts *cpts = priv->cpts; in cpsw_hwtstamp_get()
1559 if (priv->version != CPSW_VERSION_1 && in cpsw_hwtstamp_get()
1560 priv->version != CPSW_VERSION_2 && in cpsw_hwtstamp_get()
1561 priv->version != CPSW_VERSION_3) in cpsw_hwtstamp_get()
1576 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_ndo_ioctl() local
1577 int slave_no = cpsw_slave_index(priv); in cpsw_ndo_ioctl()
1591 if (!priv->slaves[slave_no].phy) in cpsw_ndo_ioctl()
1593 return phy_mii_ioctl(priv->slaves[slave_no].phy, req, cmd); in cpsw_ndo_ioctl()
1598 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_tx_timeout() local
1600 cpsw_err(priv, tx_err, "transmit timeout, restarting dma\n"); in cpsw_ndo_tx_timeout()
1602 cpsw_intr_disable(priv); in cpsw_ndo_tx_timeout()
1603 cpdma_chan_stop(priv->txch); in cpsw_ndo_tx_timeout()
1604 cpdma_chan_start(priv->txch); in cpsw_ndo_tx_timeout()
1605 cpsw_intr_enable(priv); in cpsw_ndo_tx_timeout()
1610 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_set_mac_address() local
1618 if (priv->data.dual_emac) { in cpsw_ndo_set_mac_address()
1619 vid = priv->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_mac_address()
1623 cpsw_ale_del_ucast(priv->ale, priv->mac_addr, priv->host_port, in cpsw_ndo_set_mac_address()
1625 cpsw_ale_add_ucast(priv->ale, addr->sa_data, priv->host_port, in cpsw_ndo_set_mac_address()
1628 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in cpsw_ndo_set_mac_address()
1629 memcpy(ndev->dev_addr, priv->mac_addr, ETH_ALEN); in cpsw_ndo_set_mac_address()
1630 for_each_slave(priv, cpsw_set_slave_mac, priv); in cpsw_ndo_set_mac_address()
1638 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_poll_controller() local
1640 cpsw_intr_disable(priv); in cpsw_ndo_poll_controller()
1641 cpsw_rx_interrupt(priv->irqs_table[0], priv); in cpsw_ndo_poll_controller()
1642 cpsw_tx_interrupt(priv->irqs_table[1], priv); in cpsw_ndo_poll_controller()
1643 cpsw_intr_enable(priv); in cpsw_ndo_poll_controller()
1647 static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, in cpsw_add_vlan_ale_entry() argument
1654 if (priv->data.dual_emac) { in cpsw_add_vlan_ale_entry()
1655 port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST; in cpsw_add_vlan_ale_entry()
1657 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_vlan_ale_entry()
1662 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_vlan_ale_entry()
1668 ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask, in cpsw_add_vlan_ale_entry()
1669 unreg_mcast_mask << priv->host_port); in cpsw_add_vlan_ale_entry()
1673 ret = cpsw_ale_add_ucast(priv->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
1674 priv->host_port, ALE_VLAN, vid); in cpsw_add_vlan_ale_entry()
1678 ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_add_vlan_ale_entry()
1685 cpsw_ale_del_ucast(priv->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
1686 priv->host_port, ALE_VLAN, vid); in cpsw_add_vlan_ale_entry()
1688 cpsw_ale_del_vlan(priv->ale, vid, 0); in cpsw_add_vlan_ale_entry()
1695 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_vlan_rx_add_vid() local
1697 if (vid == priv->data.default_vlan) in cpsw_ndo_vlan_rx_add_vid()
1700 if (priv->data.dual_emac) { in cpsw_ndo_vlan_rx_add_vid()
1707 for (i = 0; i < priv->data.slaves; i++) { in cpsw_ndo_vlan_rx_add_vid()
1708 if (vid == priv->slaves[i].port_vlan) in cpsw_ndo_vlan_rx_add_vid()
1713 dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); in cpsw_ndo_vlan_rx_add_vid()
1714 return cpsw_add_vlan_ale_entry(priv, vid); in cpsw_ndo_vlan_rx_add_vid()
1720 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_vlan_rx_kill_vid() local
1723 if (vid == priv->data.default_vlan) in cpsw_ndo_vlan_rx_kill_vid()
1726 if (priv->data.dual_emac) { in cpsw_ndo_vlan_rx_kill_vid()
1729 for (i = 0; i < priv->data.slaves; i++) { in cpsw_ndo_vlan_rx_kill_vid()
1730 if (vid == priv->slaves[i].port_vlan) in cpsw_ndo_vlan_rx_kill_vid()
1735 dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); in cpsw_ndo_vlan_rx_kill_vid()
1736 ret = cpsw_ale_del_vlan(priv->ale, vid, 0); in cpsw_ndo_vlan_rx_kill_vid()
1740 ret = cpsw_ale_del_ucast(priv->ale, priv->mac_addr, in cpsw_ndo_vlan_rx_kill_vid()
1741 priv->host_port, ALE_VLAN, vid); in cpsw_ndo_vlan_rx_kill_vid()
1745 return cpsw_ale_del_mcast(priv->ale, priv->ndev->broadcast, in cpsw_ndo_vlan_rx_kill_vid()
1768 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_regs_len() local
1770 return priv->data.ale_entries * ALE_ENTRY_WORDS * sizeof(u32); in cpsw_get_regs_len()
1776 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_regs() local
1780 regs->version = priv->version; in cpsw_get_regs()
1782 cpsw_ale_dump(priv->ale, reg); in cpsw_get_regs()
1788 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_drvinfo() local
1792 strlcpy(info->bus_info, priv->pdev->name, sizeof(info->bus_info)); in cpsw_get_drvinfo()
1797 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_msglevel() local
1798 return priv->msg_enable; in cpsw_get_msglevel()
1803 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_msglevel() local
1804 priv->msg_enable = value; in cpsw_set_msglevel()
1811 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_ts_info() local
1820 info->phc_index = priv->cpts->phc_index; in cpsw_get_ts_info()
1842 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_settings() local
1843 int slave_no = cpsw_slave_index(priv); in cpsw_get_settings()
1845 if (priv->slaves[slave_no].phy) in cpsw_get_settings()
1846 return phy_ethtool_gset(priv->slaves[slave_no].phy, ecmd); in cpsw_get_settings()
1853 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_settings() local
1854 int slave_no = cpsw_slave_index(priv); in cpsw_set_settings()
1856 if (priv->slaves[slave_no].phy) in cpsw_set_settings()
1857 return phy_ethtool_sset(priv->slaves[slave_no].phy, ecmd); in cpsw_set_settings()
1864 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_wol() local
1865 int slave_no = cpsw_slave_index(priv); in cpsw_get_wol()
1870 if (priv->slaves[slave_no].phy) in cpsw_get_wol()
1871 phy_ethtool_get_wol(priv->slaves[slave_no].phy, wol); in cpsw_get_wol()
1876 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_wol() local
1877 int slave_no = cpsw_slave_index(priv); in cpsw_set_wol()
1879 if (priv->slaves[slave_no].phy) in cpsw_set_wol()
1880 return phy_ethtool_set_wol(priv->slaves[slave_no].phy, wol); in cpsw_set_wol()
1888 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_pauseparam() local
1891 pause->rx_pause = priv->rx_pause ? true : false; in cpsw_get_pauseparam()
1892 pause->tx_pause = priv->tx_pause ? true : false; in cpsw_get_pauseparam()
1898 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_pauseparam() local
1901 priv->rx_pause = pause->rx_pause ? true : false; in cpsw_set_pauseparam()
1902 priv->tx_pause = pause->tx_pause ? true : false; in cpsw_set_pauseparam()
1904 for_each_slave(priv, _cpsw_adjust_link, priv, &link); in cpsw_set_pauseparam()
1930 static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_priv *priv, in cpsw_slave_init() argument
1933 void __iomem *regs = priv->regs; in cpsw_slave_init()
1935 struct cpsw_slave_data *data = priv->data.slave_data + slave_num; in cpsw_slave_init()
1943 static int cpsw_probe_dt(struct cpsw_priv *priv, in cpsw_probe_dt() argument
1948 struct cpsw_platform_data *data = &priv->data; in cpsw_probe_dt()
2036 priv->phy_node = of_parse_phandle(slave_node, "phy-handle", 0); in cpsw_probe_dt()
2115 struct cpsw_priv *priv) in cpsw_probe_dual_emac() argument
2117 struct cpsw_platform_data *data = &priv->data; in cpsw_probe_dual_emac()
2147 priv_sl2->slaves = priv->slaves; in cpsw_probe_dual_emac()
2148 priv_sl2->clk = priv->clk; in cpsw_probe_dual_emac()
2151 priv_sl2->bus_freq_mhz = priv->bus_freq_mhz; in cpsw_probe_dual_emac()
2153 priv_sl2->regs = priv->regs; in cpsw_probe_dual_emac()
2154 priv_sl2->host_port = priv->host_port; in cpsw_probe_dual_emac()
2155 priv_sl2->host_port_regs = priv->host_port_regs; in cpsw_probe_dual_emac()
2156 priv_sl2->wr_regs = priv->wr_regs; in cpsw_probe_dual_emac()
2157 priv_sl2->hw_stats = priv->hw_stats; in cpsw_probe_dual_emac()
2158 priv_sl2->dma = priv->dma; in cpsw_probe_dual_emac()
2159 priv_sl2->txch = priv->txch; in cpsw_probe_dual_emac()
2160 priv_sl2->rxch = priv->rxch; in cpsw_probe_dual_emac()
2161 priv_sl2->ale = priv->ale; in cpsw_probe_dual_emac()
2163 priv->slaves[1].ndev = ndev; in cpsw_probe_dual_emac()
2164 priv_sl2->cpts = priv->cpts; in cpsw_probe_dual_emac()
2165 priv_sl2->version = priv->version; in cpsw_probe_dual_emac()
2167 for (i = 0; i < priv->num_irqs; i++) { in cpsw_probe_dual_emac()
2168 priv_sl2->irqs_table[i] = priv->irqs_table[i]; in cpsw_probe_dual_emac()
2169 priv_sl2->num_irqs = priv->num_irqs; in cpsw_probe_dual_emac()
2230 struct cpsw_priv *priv; in cpsw_probe() local
2248 priv = netdev_priv(ndev); in cpsw_probe()
2249 spin_lock_init(&priv->lock); in cpsw_probe()
2250 priv->pdev = pdev; in cpsw_probe()
2251 priv->ndev = ndev; in cpsw_probe()
2252 priv->dev = &ndev->dev; in cpsw_probe()
2253 priv->msg_enable = netif_msg_init(debug_level, CPSW_DEBUG); in cpsw_probe()
2254 priv->rx_packet_max = max(rx_packet_max, 128); in cpsw_probe()
2255 priv->cpts = devm_kzalloc(&pdev->dev, sizeof(struct cpts), GFP_KERNEL); in cpsw_probe()
2256 if (!priv->cpts) { in cpsw_probe()
2277 if (cpsw_probe_dt(priv, pdev)) { in cpsw_probe()
2282 data = &priv->data; in cpsw_probe()
2285 memcpy(priv->mac_addr, data->slave_data[0].mac_addr, ETH_ALEN); in cpsw_probe()
2286 dev_info(&pdev->dev, "Detected MACID = %pM\n", priv->mac_addr); in cpsw_probe()
2288 eth_random_addr(priv->mac_addr); in cpsw_probe()
2289 dev_info(&pdev->dev, "Random MACID = %pM\n", priv->mac_addr); in cpsw_probe()
2292 memcpy(ndev->dev_addr, priv->mac_addr, ETH_ALEN); in cpsw_probe()
2294 priv->slaves = devm_kzalloc(&pdev->dev, in cpsw_probe()
2297 if (!priv->slaves) { in cpsw_probe()
2302 priv->slaves[i].slave_num = i; in cpsw_probe()
2304 priv->slaves[0].ndev = ndev; in cpsw_probe()
2305 priv->emac_port = 0; in cpsw_probe()
2307 priv->clk = devm_clk_get(&pdev->dev, "fck"); in cpsw_probe()
2308 if (IS_ERR(priv->clk)) { in cpsw_probe()
2309 dev_err(priv->dev, "fck is not found\n"); in cpsw_probe()
2313 priv->coal_intvl = 0; in cpsw_probe()
2314 priv->bus_freq_mhz = clk_get_rate(priv->clk) / 1000000; in cpsw_probe()
2322 priv->regs = ss_regs; in cpsw_probe()
2323 priv->host_port = HOST_PORT_NUM; in cpsw_probe()
2329 priv->version = readl(&priv->regs->id_ver); in cpsw_probe()
2333 priv->wr_regs = devm_ioremap_resource(&pdev->dev, res); in cpsw_probe()
2334 if (IS_ERR(priv->wr_regs)) { in cpsw_probe()
2335 ret = PTR_ERR(priv->wr_regs); in cpsw_probe()
2342 switch (priv->version) { in cpsw_probe()
2344 priv->host_port_regs = ss_regs + CPSW1_HOST_PORT_OFFSET; in cpsw_probe()
2345 priv->cpts->reg = ss_regs + CPSW1_CPTS_OFFSET; in cpsw_probe()
2346 priv->hw_stats = ss_regs + CPSW1_HW_STATS; in cpsw_probe()
2358 priv->host_port_regs = ss_regs + CPSW2_HOST_PORT_OFFSET; in cpsw_probe()
2359 priv->cpts->reg = ss_regs + CPSW2_CPTS_OFFSET; in cpsw_probe()
2360 priv->hw_stats = ss_regs + CPSW2_HW_STATS; in cpsw_probe()
2371 dev_err(priv->dev, "unknown version 0x%08x\n", priv->version); in cpsw_probe()
2375 for (i = 0; i < priv->data.slaves; i++) { in cpsw_probe()
2376 struct cpsw_slave *slave = &priv->slaves[i]; in cpsw_probe()
2377 cpsw_slave_init(slave, priv, slave_offset, sliver_offset); in cpsw_probe()
2397 priv->dma = cpdma_ctlr_create(&dma_params); in cpsw_probe()
2398 if (!priv->dma) { in cpsw_probe()
2399 dev_err(priv->dev, "error initializing dma\n"); in cpsw_probe()
2404 priv->txch = cpdma_chan_create(priv->dma, tx_chan_num(0), in cpsw_probe()
2406 priv->rxch = cpdma_chan_create(priv->dma, rx_chan_num(0), in cpsw_probe()
2409 if (WARN_ON(!priv->txch || !priv->rxch)) { in cpsw_probe()
2410 dev_err(priv->dev, "error initializing dma channels\n"); in cpsw_probe()
2420 priv->ale = cpsw_ale_create(&ale_params); in cpsw_probe()
2421 if (!priv->ale) { in cpsw_probe()
2422 dev_err(priv->dev, "error initializing ale engine\n"); in cpsw_probe()
2429 dev_err(priv->dev, "error getting irq resource\n"); in cpsw_probe()
2438 priv->quirk_irq = true; in cpsw_probe()
2456 priv->irqs_table[0] = irq; in cpsw_probe()
2458 0, dev_name(&pdev->dev), priv); in cpsw_probe()
2460 dev_err(priv->dev, "error attaching irq (%d)\n", ret); in cpsw_probe()
2471 priv->irqs_table[1] = irq; in cpsw_probe()
2473 0, dev_name(&pdev->dev), priv); in cpsw_probe()
2475 dev_err(priv->dev, "error attaching irq (%d)\n", ret); in cpsw_probe()
2478 priv->num_irqs = 2; in cpsw_probe()
2484 netif_napi_add(ndev, &priv->napi_rx, cpsw_rx_poll, CPSW_POLL_WEIGHT); in cpsw_probe()
2485 netif_napi_add(ndev, &priv->napi_tx, cpsw_tx_poll, CPSW_POLL_WEIGHT); in cpsw_probe()
2491 dev_err(priv->dev, "error registering net device\n"); in cpsw_probe()
2496 cpsw_notice(priv, probe, "initialized device (regs %pa, irq %d)\n", in cpsw_probe()
2499 if (priv->data.dual_emac) { in cpsw_probe()
2500 ret = cpsw_probe_dual_emac(pdev, priv); in cpsw_probe()
2502 cpsw_err(priv, probe, "error probe slave 2 emac interface\n"); in cpsw_probe()
2510 cpsw_ale_destroy(priv->ale); in cpsw_probe()
2512 cpdma_chan_destroy(priv->txch); in cpsw_probe()
2513 cpdma_chan_destroy(priv->rxch); in cpsw_probe()
2514 cpdma_ctlr_destroy(priv->dma); in cpsw_probe()
2518 free_netdev(priv->ndev); in cpsw_probe()
2534 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_remove() local
2536 if (priv->data.dual_emac) in cpsw_remove()
2537 unregister_netdev(cpsw_get_slave_ndev(priv, 1)); in cpsw_remove()
2540 cpsw_ale_destroy(priv->ale); in cpsw_remove()
2541 cpdma_chan_destroy(priv->txch); in cpsw_remove()
2542 cpdma_chan_destroy(priv->rxch); in cpsw_remove()
2543 cpdma_ctlr_destroy(priv->dma); in cpsw_remove()
2546 if (priv->data.dual_emac) in cpsw_remove()
2547 free_netdev(cpsw_get_slave_ndev(priv, 1)); in cpsw_remove()
2557 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_suspend() local
2559 if (priv->data.dual_emac) { in cpsw_suspend()
2562 for (i = 0; i < priv->data.slaves; i++) { in cpsw_suspend()
2563 if (netif_running(priv->slaves[i].ndev)) in cpsw_suspend()
2564 cpsw_ndo_stop(priv->slaves[i].ndev); in cpsw_suspend()
2565 soft_reset_slave(priv->slaves + i); in cpsw_suspend()
2570 for_each_slave(priv, soft_reset_slave); in cpsw_suspend()
2585 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_resume() local
2592 if (priv->data.dual_emac) { in cpsw_resume()
2595 for (i = 0; i < priv->data.slaves; i++) { in cpsw_resume()
2596 if (netif_running(priv->slaves[i].ndev)) in cpsw_resume()
2597 cpsw_ndo_open(priv->slaves[i].ndev); in cpsw_resume()