Lines Matching refs:priv

53 #define cpsw_info(priv, type, format, ...)		\  argument
55 if (netif_msg_##type(priv) && net_ratelimit()) \
56 dev_info(priv->dev, format, ## __VA_ARGS__); \
59 #define cpsw_err(priv, type, format, ...) \ argument
61 if (netif_msg_##type(priv) && net_ratelimit()) \
62 dev_err(priv->dev, format, ## __VA_ARGS__); \
65 #define cpsw_dbg(priv, type, format, ...) \ argument
67 if (netif_msg_##type(priv) && net_ratelimit()) \
68 dev_dbg(priv->dev, format, ## __VA_ARGS__); \
71 #define cpsw_notice(priv, type, format, ...) \ argument
73 if (netif_msg_##type(priv) && net_ratelimit()) \
74 dev_notice(priv->dev, format, ## __VA_ARGS__); \
141 #define cpsw_enable_irq(priv) \ argument
144 for (i = 0; i < priv->num_irqs; i++) \
145 enable_irq(priv->irqs_table[i]); \
147 #define cpsw_disable_irq(priv) \ argument
150 for (i = 0; i < priv->num_irqs; i++) \
151 disable_irq_nosync(priv->irqs_table[i]); \
154 #define cpsw_slave_index(priv) \ argument
155 ((priv->data.dual_emac) ? priv->emac_port : \
156 priv->data.active_slave)
499 #define for_each_slave(priv, func, arg...) \ argument
503 if (priv->data.dual_emac) \
504 (func)((priv)->slaves + priv->emac_port, ##arg);\
506 for (n = (priv)->data.slaves, \
507 slave = (priv)->slaves; \
511 #define cpsw_get_slave_ndev(priv, __slave_no__) \ argument
512 (priv->slaves[__slave_no__].ndev)
513 #define cpsw_get_slave_priv(priv, __slave_no__) \ argument
514 ((priv->slaves[__slave_no__].ndev) ? \
515 netdev_priv(priv->slaves[__slave_no__].ndev) : NULL) \
517 #define cpsw_dual_emac_src_port_detect(status, priv, ndev, skb) \ argument
519 if (!priv->data.dual_emac) \
522 ndev = cpsw_get_slave_ndev(priv, 0); \
523 priv = netdev_priv(ndev); \
526 ndev = cpsw_get_slave_ndev(priv, 1); \
527 priv = netdev_priv(ndev); \
531 #define cpsw_add_mcast(priv, addr) \ argument
533 if (priv->data.dual_emac) { \
534 struct cpsw_slave *slave = priv->slaves + \
535 priv->emac_port; \
536 int slave_port = cpsw_get_slave_port(priv, \
538 cpsw_ale_add_mcast(priv->ale, addr, \
539 1 << slave_port | 1 << priv->host_port, \
542 cpsw_ale_add_mcast(priv->ale, addr, \
543 ALE_ALL_PORTS << priv->host_port, \
548 static inline int cpsw_get_slave_port(struct cpsw_priv *priv, u32 slave_num) in cpsw_get_slave_port() argument
550 if (priv->host_port == 0) in cpsw_get_slave_port()
558 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_promiscious() local
559 struct cpsw_ale *ale = priv->ale; in cpsw_set_promiscious()
562 if (priv->data.dual_emac) { in cpsw_set_promiscious()
569 for (i = 0; i < priv->data.slaves; i++) in cpsw_set_promiscious()
570 if (priv->slaves[i].ndev->flags & IFF_PROMISC) in cpsw_set_promiscious()
593 for (i = 0; i <= priv->data.slaves; i++) { in cpsw_set_promiscious()
611 priv->host_port, -1); in cpsw_set_promiscious()
621 for (i = 0; i <= priv->data.slaves; i++) { in cpsw_set_promiscious()
634 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_set_rx_mode() local
637 if (priv->data.dual_emac) in cpsw_ndo_set_rx_mode()
638 vid = priv->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_rx_mode()
640 vid = priv->data.default_vlan; in cpsw_ndo_set_rx_mode()
645 cpsw_ale_set_allmulti(priv->ale, IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
653 cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); in cpsw_ndo_set_rx_mode()
656 cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port, in cpsw_ndo_set_rx_mode()
664 cpsw_add_mcast(priv, (u8 *)ha->addr); in cpsw_ndo_set_rx_mode()
669 static void cpsw_intr_enable(struct cpsw_priv *priv) in cpsw_intr_enable() argument
671 __raw_writel(0xFF, &priv->wr_regs->tx_en); in cpsw_intr_enable()
672 __raw_writel(0xFF, &priv->wr_regs->rx_en); in cpsw_intr_enable()
674 cpdma_ctlr_int_ctrl(priv->dma, true); in cpsw_intr_enable()
678 static void cpsw_intr_disable(struct cpsw_priv *priv) in cpsw_intr_disable() argument
680 __raw_writel(0, &priv->wr_regs->tx_en); in cpsw_intr_disable()
681 __raw_writel(0, &priv->wr_regs->rx_en); in cpsw_intr_disable()
683 cpdma_ctlr_int_ctrl(priv->dma, false); in cpsw_intr_disable()
691 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_tx_handler() local
698 cpts_tx_timestamp(priv->cpts, skb); in cpsw_tx_handler()
709 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_rx_handler() local
712 cpsw_dual_emac_src_port_detect(status, priv, ndev, skb); in cpsw_rx_handler()
716 struct cpsw_slave *slave = priv->slaves; in cpsw_rx_handler()
719 if (priv->data.dual_emac) { in cpsw_rx_handler()
721 for (n = priv->data.slaves; n; n--, slave++) in cpsw_rx_handler()
742 new_skb = netdev_alloc_skb_ip_align(ndev, priv->rx_packet_max); in cpsw_rx_handler()
745 cpts_rx_timestamp(priv->cpts, skb); in cpsw_rx_handler()
756 ret = cpdma_chan_submit(priv->rxch, new_skb, new_skb->data, in cpsw_rx_handler()
764 struct cpsw_priv *priv = dev_id; in cpsw_tx_interrupt() local
766 cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); in cpsw_tx_interrupt()
767 cpdma_chan_process(priv->txch, 128); in cpsw_tx_interrupt()
769 priv = cpsw_get_slave_priv(priv, 1); in cpsw_tx_interrupt()
770 if (priv) in cpsw_tx_interrupt()
771 cpdma_chan_process(priv->txch, 128); in cpsw_tx_interrupt()
778 struct cpsw_priv *priv = dev_id; in cpsw_rx_interrupt() local
780 cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); in cpsw_rx_interrupt()
782 cpsw_intr_disable(priv); in cpsw_rx_interrupt()
783 if (priv->irq_enabled == true) { in cpsw_rx_interrupt()
784 cpsw_disable_irq(priv); in cpsw_rx_interrupt()
785 priv->irq_enabled = false; in cpsw_rx_interrupt()
788 if (netif_running(priv->ndev)) { in cpsw_rx_interrupt()
789 napi_schedule(&priv->napi); in cpsw_rx_interrupt()
793 priv = cpsw_get_slave_priv(priv, 1); in cpsw_rx_interrupt()
794 if (!priv) in cpsw_rx_interrupt()
797 if (netif_running(priv->ndev)) { in cpsw_rx_interrupt()
798 napi_schedule(&priv->napi); in cpsw_rx_interrupt()
806 struct cpsw_priv *priv = napi_to_priv(napi); in cpsw_poll() local
809 num_tx = cpdma_chan_process(priv->txch, 128); in cpsw_poll()
811 num_rx = cpdma_chan_process(priv->rxch, budget); in cpsw_poll()
816 cpsw_intr_enable(priv); in cpsw_poll()
817 prim_cpsw = cpsw_get_slave_priv(priv, 0); in cpsw_poll()
820 cpsw_enable_irq(priv); in cpsw_poll()
825 cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n", in cpsw_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 slave->phy = phy_connect(priv->ndev, slave->data->phy_id, in cpsw_slave_open()
1154 dev_err(priv->dev, "phy %s not found on slave %d\n", in cpsw_slave_open()
1158 dev_info(priv->dev, "phy found : id is : 0x%x\n", in cpsw_slave_open()
1163 cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface, in cpsw_slave_open()
1168 static inline void cpsw_add_default_vlan(struct cpsw_priv *priv) in cpsw_add_default_vlan() argument
1170 const int vlan = priv->data.default_vlan; in cpsw_add_default_vlan()
1171 const int port = priv->host_port; in cpsw_add_default_vlan()
1176 reg = (priv->version == CPSW_VERSION_1) ? CPSW1_PORT_VLAN : in cpsw_add_default_vlan()
1179 writel(vlan, &priv->host_port_regs->port_vlan); in cpsw_add_default_vlan()
1181 for (i = 0; i < priv->data.slaves; i++) in cpsw_add_default_vlan()
1182 slave_write(priv->slaves + i, vlan, reg); in cpsw_add_default_vlan()
1184 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_default_vlan()
1189 cpsw_ale_add_vlan(priv->ale, vlan, ALE_ALL_PORTS << port, in cpsw_add_default_vlan()
1194 static void cpsw_init_host_port(struct cpsw_priv *priv) in cpsw_init_host_port() argument
1200 soft_reset("cpsw", &priv->regs->soft_reset); in cpsw_init_host_port()
1201 cpsw_ale_start(priv->ale); in cpsw_init_host_port()
1204 cpsw_ale_control_set(priv->ale, priv->host_port, ALE_VLAN_AWARE, in cpsw_init_host_port()
1206 control_reg = readl(&priv->regs->control); in cpsw_init_host_port()
1208 writel(control_reg, &priv->regs->control); in cpsw_init_host_port()
1209 fifo_mode = (priv->data.dual_emac) ? CPSW_FIFO_DUAL_MAC_MODE : in cpsw_init_host_port()
1211 writel(fifo_mode, &priv->host_port_regs->tx_in_ctl); in cpsw_init_host_port()
1215 &priv->host_port_regs->cpdma_tx_pri_map); in cpsw_init_host_port()
1216 __raw_writel(0, &priv->host_port_regs->cpdma_rx_chan_map); in cpsw_init_host_port()
1218 cpsw_ale_control_set(priv->ale, priv->host_port, in cpsw_init_host_port()
1221 if (!priv->data.dual_emac) { in cpsw_init_host_port()
1222 cpsw_ale_add_ucast(priv->ale, priv->mac_addr, priv->host_port, in cpsw_init_host_port()
1224 cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_init_host_port()
1225 1 << priv->host_port, 0, 0, ALE_MCAST_FWD_2); in cpsw_init_host_port()
1229 static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_priv *priv) in cpsw_slave_stop() argument
1233 slave_port = cpsw_get_slave_port(priv, slave->slave_num); in cpsw_slave_stop()
1240 cpsw_ale_control_set(priv->ale, slave_port, in cpsw_slave_stop()
1246 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_open() local
1251 if (!cpsw_common_res_usage_state(priv)) in cpsw_ndo_open()
1252 cpsw_intr_disable(priv); in cpsw_ndo_open()
1255 pm_runtime_get_sync(&priv->pdev->dev); in cpsw_ndo_open()
1257 reg = priv->version; in cpsw_ndo_open()
1259 dev_info(priv->dev, "initializing cpsw version %d.%d (%d)\n", in cpsw_ndo_open()
1264 if (!cpsw_common_res_usage_state(priv)) in cpsw_ndo_open()
1265 cpsw_init_host_port(priv); in cpsw_ndo_open()
1266 for_each_slave(priv, cpsw_slave_open, priv); in cpsw_ndo_open()
1269 if (!priv->data.dual_emac) in cpsw_ndo_open()
1270 cpsw_add_default_vlan(priv); in cpsw_ndo_open()
1272 cpsw_ale_add_vlan(priv->ale, priv->data.default_vlan, in cpsw_ndo_open()
1273 ALE_ALL_PORTS << priv->host_port, in cpsw_ndo_open()
1274 ALE_ALL_PORTS << priv->host_port, 0, 0); in cpsw_ndo_open()
1276 if (!cpsw_common_res_usage_state(priv)) { in cpsw_ndo_open()
1278 cpdma_control_set(priv->dma, CPDMA_TX_PRIO_FIXED, 1); in cpsw_ndo_open()
1279 cpdma_control_set(priv->dma, CPDMA_RX_BUFFER_OFFSET, 0); in cpsw_ndo_open()
1282 __raw_writel(0, &priv->regs->ptype); in cpsw_ndo_open()
1285 __raw_writel(0x7, &priv->regs->stat_port_en); in cpsw_ndo_open()
1288 writel(0x7, &priv->regs->flow_control); in cpsw_ndo_open()
1290 if (WARN_ON(!priv->data.rx_descs)) in cpsw_ndo_open()
1291 priv->data.rx_descs = 128; in cpsw_ndo_open()
1293 for (i = 0; i < priv->data.rx_descs; i++) { in cpsw_ndo_open()
1297 skb = __netdev_alloc_skb_ip_align(priv->ndev, in cpsw_ndo_open()
1298 priv->rx_packet_max, GFP_KERNEL); in cpsw_ndo_open()
1301 ret = cpdma_chan_submit(priv->rxch, skb, skb->data, in cpsw_ndo_open()
1311 cpsw_info(priv, ifup, "submitted %d rx descriptors\n", i); in cpsw_ndo_open()
1313 if (cpts_register(&priv->pdev->dev, priv->cpts, in cpsw_ndo_open()
1314 priv->data.cpts_clock_mult, in cpsw_ndo_open()
1315 priv->data.cpts_clock_shift)) in cpsw_ndo_open()
1316 dev_err(priv->dev, "error registering cpts device\n"); in cpsw_ndo_open()
1321 if (priv->coal_intvl != 0) { in cpsw_ndo_open()
1324 coal.rx_coalesce_usecs = (priv->coal_intvl << 4); in cpsw_ndo_open()
1328 napi_enable(&priv->napi); in cpsw_ndo_open()
1329 cpdma_ctlr_start(priv->dma); in cpsw_ndo_open()
1330 cpsw_intr_enable(priv); in cpsw_ndo_open()
1332 prim_cpsw = cpsw_get_slave_priv(priv, 0); in cpsw_ndo_open()
1334 if ((priv == prim_cpsw) || !netif_running(prim_cpsw->ndev)) { in cpsw_ndo_open()
1340 if (priv->data.dual_emac) in cpsw_ndo_open()
1341 priv->slaves[priv->emac_port].open_stat = true; in cpsw_ndo_open()
1345 cpdma_ctlr_stop(priv->dma); in cpsw_ndo_open()
1346 for_each_slave(priv, cpsw_slave_stop, priv); in cpsw_ndo_open()
1347 pm_runtime_put_sync(&priv->pdev->dev); in cpsw_ndo_open()
1348 netif_carrier_off(priv->ndev); in cpsw_ndo_open()
1354 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_stop() local
1356 cpsw_info(priv, ifdown, "shutting down cpsw device\n"); in cpsw_ndo_stop()
1357 netif_stop_queue(priv->ndev); in cpsw_ndo_stop()
1358 napi_disable(&priv->napi); in cpsw_ndo_stop()
1359 netif_carrier_off(priv->ndev); in cpsw_ndo_stop()
1361 if (cpsw_common_res_usage_state(priv) <= 1) { in cpsw_ndo_stop()
1362 cpts_unregister(priv->cpts); in cpsw_ndo_stop()
1363 cpsw_intr_disable(priv); in cpsw_ndo_stop()
1364 cpdma_ctlr_int_ctrl(priv->dma, false); in cpsw_ndo_stop()
1365 cpdma_ctlr_stop(priv->dma); in cpsw_ndo_stop()
1366 cpsw_ale_stop(priv->ale); in cpsw_ndo_stop()
1368 for_each_slave(priv, cpsw_slave_stop, priv); in cpsw_ndo_stop()
1369 pm_runtime_put_sync(&priv->pdev->dev); in cpsw_ndo_stop()
1370 if (priv->data.dual_emac) in cpsw_ndo_stop()
1371 priv->slaves[priv->emac_port].open_stat = false; in cpsw_ndo_stop()
1378 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_start_xmit() local
1384 cpsw_err(priv, tx_err, "packet pad failed\n"); in cpsw_ndo_start_xmit()
1390 priv->cpts->tx_enable) in cpsw_ndo_start_xmit()
1395 ret = cpsw_tx_packet_submit(ndev, priv, skb); in cpsw_ndo_start_xmit()
1397 cpsw_err(priv, tx_err, "desc submit failed\n"); in cpsw_ndo_start_xmit()
1404 if (unlikely(!cpdma_check_free_tx_desc(priv->txch))) in cpsw_ndo_start_xmit()
1416 static void cpsw_hwtstamp_v1(struct cpsw_priv *priv) in cpsw_hwtstamp_v1() argument
1418 struct cpsw_slave *slave = &priv->slaves[priv->data.active_slave]; in cpsw_hwtstamp_v1()
1421 if (!priv->cpts->tx_enable && !priv->cpts->rx_enable) { in cpsw_hwtstamp_v1()
1429 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v1()
1432 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v1()
1439 static void cpsw_hwtstamp_v2(struct cpsw_priv *priv) in cpsw_hwtstamp_v2() argument
1444 if (priv->data.dual_emac) in cpsw_hwtstamp_v2()
1445 slave = &priv->slaves[priv->emac_port]; in cpsw_hwtstamp_v2()
1447 slave = &priv->slaves[priv->data.active_slave]; in cpsw_hwtstamp_v2()
1450 switch (priv->version) { in cpsw_hwtstamp_v2()
1454 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v2()
1457 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v2()
1464 if (priv->cpts->tx_enable) in cpsw_hwtstamp_v2()
1467 if (priv->cpts->rx_enable) in cpsw_hwtstamp_v2()
1476 __raw_writel(ETH_P_1588, &priv->regs->ts_ltype); in cpsw_hwtstamp_v2()
1481 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_hwtstamp_set() local
1482 struct cpts *cpts = priv->cpts; in cpsw_hwtstamp_set()
1485 if (priv->version != CPSW_VERSION_1 && in cpsw_hwtstamp_set()
1486 priv->version != CPSW_VERSION_2 && in cpsw_hwtstamp_set()
1487 priv->version != CPSW_VERSION_3) in cpsw_hwtstamp_set()
1527 switch (priv->version) { in cpsw_hwtstamp_set()
1529 cpsw_hwtstamp_v1(priv); in cpsw_hwtstamp_set()
1533 cpsw_hwtstamp_v2(priv); in cpsw_hwtstamp_set()
1544 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_hwtstamp_get() local
1545 struct cpts *cpts = priv->cpts; in cpsw_hwtstamp_get()
1548 if (priv->version != CPSW_VERSION_1 && in cpsw_hwtstamp_get()
1549 priv->version != CPSW_VERSION_2 && in cpsw_hwtstamp_get()
1550 priv->version != CPSW_VERSION_3) in cpsw_hwtstamp_get()
1565 struct cpsw_priv *priv = netdev_priv(dev); in cpsw_ndo_ioctl() local
1566 int slave_no = cpsw_slave_index(priv); in cpsw_ndo_ioctl()
1580 if (!priv->slaves[slave_no].phy) in cpsw_ndo_ioctl()
1582 return phy_mii_ioctl(priv->slaves[slave_no].phy, req, cmd); in cpsw_ndo_ioctl()
1587 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_tx_timeout() local
1589 cpsw_err(priv, tx_err, "transmit timeout, restarting dma\n"); in cpsw_ndo_tx_timeout()
1591 cpsw_intr_disable(priv); in cpsw_ndo_tx_timeout()
1592 cpdma_ctlr_int_ctrl(priv->dma, false); in cpsw_ndo_tx_timeout()
1593 cpdma_chan_stop(priv->txch); in cpsw_ndo_tx_timeout()
1594 cpdma_chan_start(priv->txch); in cpsw_ndo_tx_timeout()
1595 cpdma_ctlr_int_ctrl(priv->dma, true); in cpsw_ndo_tx_timeout()
1596 cpsw_intr_enable(priv); in cpsw_ndo_tx_timeout()
1601 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_set_mac_address() local
1609 if (priv->data.dual_emac) { in cpsw_ndo_set_mac_address()
1610 vid = priv->slaves[priv->emac_port].port_vlan; in cpsw_ndo_set_mac_address()
1614 cpsw_ale_del_ucast(priv->ale, priv->mac_addr, priv->host_port, in cpsw_ndo_set_mac_address()
1616 cpsw_ale_add_ucast(priv->ale, addr->sa_data, priv->host_port, in cpsw_ndo_set_mac_address()
1619 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in cpsw_ndo_set_mac_address()
1620 memcpy(ndev->dev_addr, priv->mac_addr, ETH_ALEN); in cpsw_ndo_set_mac_address()
1621 for_each_slave(priv, cpsw_set_slave_mac, priv); in cpsw_ndo_set_mac_address()
1629 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_poll_controller() local
1631 cpsw_intr_disable(priv); in cpsw_ndo_poll_controller()
1632 cpdma_ctlr_int_ctrl(priv->dma, false); in cpsw_ndo_poll_controller()
1633 cpsw_rx_interrupt(priv->irqs_table[0], priv); in cpsw_ndo_poll_controller()
1634 cpsw_tx_interrupt(priv->irqs_table[1], priv); in cpsw_ndo_poll_controller()
1635 cpdma_ctlr_int_ctrl(priv->dma, true); in cpsw_ndo_poll_controller()
1636 cpsw_intr_enable(priv); in cpsw_ndo_poll_controller()
1640 static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, in cpsw_add_vlan_ale_entry() argument
1647 if (priv->data.dual_emac) { in cpsw_add_vlan_ale_entry()
1648 port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST; in cpsw_add_vlan_ale_entry()
1650 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_vlan_ale_entry()
1655 if (priv->ndev->flags & IFF_ALLMULTI) in cpsw_add_vlan_ale_entry()
1661 ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask, in cpsw_add_vlan_ale_entry()
1662 unreg_mcast_mask << priv->host_port); in cpsw_add_vlan_ale_entry()
1666 ret = cpsw_ale_add_ucast(priv->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
1667 priv->host_port, ALE_VLAN, vid); in cpsw_add_vlan_ale_entry()
1671 ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, in cpsw_add_vlan_ale_entry()
1678 cpsw_ale_del_ucast(priv->ale, priv->mac_addr, in cpsw_add_vlan_ale_entry()
1679 priv->host_port, ALE_VLAN, vid); in cpsw_add_vlan_ale_entry()
1681 cpsw_ale_del_vlan(priv->ale, vid, 0); in cpsw_add_vlan_ale_entry()
1688 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_vlan_rx_add_vid() local
1690 if (vid == priv->data.default_vlan) in cpsw_ndo_vlan_rx_add_vid()
1693 if (priv->data.dual_emac) { in cpsw_ndo_vlan_rx_add_vid()
1700 for (i = 0; i < priv->data.slaves; i++) { in cpsw_ndo_vlan_rx_add_vid()
1701 if (vid == priv->slaves[i].port_vlan) in cpsw_ndo_vlan_rx_add_vid()
1706 dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); in cpsw_ndo_vlan_rx_add_vid()
1707 return cpsw_add_vlan_ale_entry(priv, vid); in cpsw_ndo_vlan_rx_add_vid()
1713 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_ndo_vlan_rx_kill_vid() local
1716 if (vid == priv->data.default_vlan) in cpsw_ndo_vlan_rx_kill_vid()
1719 if (priv->data.dual_emac) { in cpsw_ndo_vlan_rx_kill_vid()
1722 for (i = 0; i < priv->data.slaves; i++) { in cpsw_ndo_vlan_rx_kill_vid()
1723 if (vid == priv->slaves[i].port_vlan) in cpsw_ndo_vlan_rx_kill_vid()
1728 dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); in cpsw_ndo_vlan_rx_kill_vid()
1729 ret = cpsw_ale_del_vlan(priv->ale, vid, 0); in cpsw_ndo_vlan_rx_kill_vid()
1733 ret = cpsw_ale_del_ucast(priv->ale, priv->mac_addr, in cpsw_ndo_vlan_rx_kill_vid()
1734 priv->host_port, ALE_VLAN, vid); in cpsw_ndo_vlan_rx_kill_vid()
1738 return cpsw_ale_del_mcast(priv->ale, priv->ndev->broadcast, in cpsw_ndo_vlan_rx_kill_vid()
1761 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_regs_len() local
1763 return priv->data.ale_entries * ALE_ENTRY_WORDS * sizeof(u32); in cpsw_get_regs_len()
1769 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_regs() local
1773 regs->version = priv->version; in cpsw_get_regs()
1775 cpsw_ale_dump(priv->ale, reg); in cpsw_get_regs()
1781 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_drvinfo() local
1785 strlcpy(info->bus_info, priv->pdev->name, sizeof(info->bus_info)); in cpsw_get_drvinfo()
1791 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_msglevel() local
1792 return priv->msg_enable; in cpsw_get_msglevel()
1797 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_msglevel() local
1798 priv->msg_enable = value; in cpsw_set_msglevel()
1805 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_ts_info() local
1814 info->phc_index = priv->cpts->phc_index; in cpsw_get_ts_info()
1836 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_settings() local
1837 int slave_no = cpsw_slave_index(priv); in cpsw_get_settings()
1839 if (priv->slaves[slave_no].phy) in cpsw_get_settings()
1840 return phy_ethtool_gset(priv->slaves[slave_no].phy, ecmd); in cpsw_get_settings()
1847 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_settings() local
1848 int slave_no = cpsw_slave_index(priv); in cpsw_set_settings()
1850 if (priv->slaves[slave_no].phy) in cpsw_set_settings()
1851 return phy_ethtool_sset(priv->slaves[slave_no].phy, ecmd); in cpsw_set_settings()
1858 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_wol() local
1859 int slave_no = cpsw_slave_index(priv); in cpsw_get_wol()
1864 if (priv->slaves[slave_no].phy) in cpsw_get_wol()
1865 phy_ethtool_get_wol(priv->slaves[slave_no].phy, wol); in cpsw_get_wol()
1870 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_wol() local
1871 int slave_no = cpsw_slave_index(priv); in cpsw_set_wol()
1873 if (priv->slaves[slave_no].phy) in cpsw_set_wol()
1874 return phy_ethtool_set_wol(priv->slaves[slave_no].phy, wol); in cpsw_set_wol()
1882 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_get_pauseparam() local
1885 pause->rx_pause = priv->rx_pause ? true : false; in cpsw_get_pauseparam()
1886 pause->tx_pause = priv->tx_pause ? true : false; in cpsw_get_pauseparam()
1892 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_set_pauseparam() local
1895 priv->rx_pause = pause->rx_pause ? true : false; in cpsw_set_pauseparam()
1896 priv->tx_pause = pause->tx_pause ? true : false; in cpsw_set_pauseparam()
1898 for_each_slave(priv, _cpsw_adjust_link, priv, &link); in cpsw_set_pauseparam()
1924 static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_priv *priv, in cpsw_slave_init() argument
1927 void __iomem *regs = priv->regs; in cpsw_slave_init()
1929 struct cpsw_slave_data *data = priv->data.slave_data + slave_num; in cpsw_slave_init()
2089 struct cpsw_priv *priv) in cpsw_probe_dual_emac() argument
2091 struct cpsw_platform_data *data = &priv->data; in cpsw_probe_dual_emac()
2121 priv_sl2->slaves = priv->slaves; in cpsw_probe_dual_emac()
2122 priv_sl2->clk = priv->clk; in cpsw_probe_dual_emac()
2125 priv_sl2->bus_freq_mhz = priv->bus_freq_mhz; in cpsw_probe_dual_emac()
2127 priv_sl2->regs = priv->regs; in cpsw_probe_dual_emac()
2128 priv_sl2->host_port = priv->host_port; in cpsw_probe_dual_emac()
2129 priv_sl2->host_port_regs = priv->host_port_regs; in cpsw_probe_dual_emac()
2130 priv_sl2->wr_regs = priv->wr_regs; in cpsw_probe_dual_emac()
2131 priv_sl2->hw_stats = priv->hw_stats; in cpsw_probe_dual_emac()
2132 priv_sl2->dma = priv->dma; in cpsw_probe_dual_emac()
2133 priv_sl2->txch = priv->txch; in cpsw_probe_dual_emac()
2134 priv_sl2->rxch = priv->rxch; in cpsw_probe_dual_emac()
2135 priv_sl2->ale = priv->ale; in cpsw_probe_dual_emac()
2137 priv->slaves[1].ndev = ndev; in cpsw_probe_dual_emac()
2138 priv_sl2->cpts = priv->cpts; in cpsw_probe_dual_emac()
2139 priv_sl2->version = priv->version; in cpsw_probe_dual_emac()
2141 for (i = 0; i < priv->num_irqs; i++) { in cpsw_probe_dual_emac()
2142 priv_sl2->irqs_table[i] = priv->irqs_table[i]; in cpsw_probe_dual_emac()
2143 priv_sl2->num_irqs = priv->num_irqs; in cpsw_probe_dual_emac()
2167 struct cpsw_priv *priv; in cpsw_probe() local
2183 priv = netdev_priv(ndev); in cpsw_probe()
2184 spin_lock_init(&priv->lock); in cpsw_probe()
2185 priv->pdev = pdev; in cpsw_probe()
2186 priv->ndev = ndev; in cpsw_probe()
2187 priv->dev = &ndev->dev; in cpsw_probe()
2188 priv->msg_enable = netif_msg_init(debug_level, CPSW_DEBUG); in cpsw_probe()
2189 priv->rx_packet_max = max(rx_packet_max, 128); in cpsw_probe()
2190 priv->cpts = devm_kzalloc(&pdev->dev, sizeof(struct cpts), GFP_KERNEL); in cpsw_probe()
2191 priv->irq_enabled = true; in cpsw_probe()
2192 if (!priv->cpts) { in cpsw_probe()
2206 if (cpsw_probe_dt(&priv->data, pdev)) { in cpsw_probe()
2211 data = &priv->data; in cpsw_probe()
2214 memcpy(priv->mac_addr, data->slave_data[0].mac_addr, ETH_ALEN); in cpsw_probe()
2215 dev_info(&pdev->dev, "Detected MACID = %pM\n", priv->mac_addr); in cpsw_probe()
2217 eth_random_addr(priv->mac_addr); in cpsw_probe()
2218 dev_info(&pdev->dev, "Random MACID = %pM\n", priv->mac_addr); in cpsw_probe()
2221 memcpy(ndev->dev_addr, priv->mac_addr, ETH_ALEN); in cpsw_probe()
2223 priv->slaves = devm_kzalloc(&pdev->dev, in cpsw_probe()
2226 if (!priv->slaves) { in cpsw_probe()
2231 priv->slaves[i].slave_num = i; in cpsw_probe()
2233 priv->slaves[0].ndev = ndev; in cpsw_probe()
2234 priv->emac_port = 0; in cpsw_probe()
2236 priv->clk = devm_clk_get(&pdev->dev, "fck"); in cpsw_probe()
2237 if (IS_ERR(priv->clk)) { in cpsw_probe()
2238 dev_err(priv->dev, "fck is not found\n"); in cpsw_probe()
2242 priv->coal_intvl = 0; in cpsw_probe()
2243 priv->bus_freq_mhz = clk_get_rate(priv->clk) / 1000000; in cpsw_probe()
2251 priv->regs = ss_regs; in cpsw_probe()
2252 priv->host_port = HOST_PORT_NUM; in cpsw_probe()
2258 priv->version = readl(&priv->regs->id_ver); in cpsw_probe()
2262 priv->wr_regs = devm_ioremap_resource(&pdev->dev, res); in cpsw_probe()
2263 if (IS_ERR(priv->wr_regs)) { in cpsw_probe()
2264 ret = PTR_ERR(priv->wr_regs); in cpsw_probe()
2271 switch (priv->version) { in cpsw_probe()
2273 priv->host_port_regs = ss_regs + CPSW1_HOST_PORT_OFFSET; in cpsw_probe()
2274 priv->cpts->reg = ss_regs + CPSW1_CPTS_OFFSET; in cpsw_probe()
2275 priv->hw_stats = ss_regs + CPSW1_HW_STATS; in cpsw_probe()
2287 priv->host_port_regs = ss_regs + CPSW2_HOST_PORT_OFFSET; in cpsw_probe()
2288 priv->cpts->reg = ss_regs + CPSW2_CPTS_OFFSET; in cpsw_probe()
2289 priv->hw_stats = ss_regs + CPSW2_HW_STATS; in cpsw_probe()
2300 dev_err(priv->dev, "unknown version 0x%08x\n", priv->version); in cpsw_probe()
2304 for (i = 0; i < priv->data.slaves; i++) { in cpsw_probe()
2305 struct cpsw_slave *slave = &priv->slaves[i]; in cpsw_probe()
2306 cpsw_slave_init(slave, priv, slave_offset, sliver_offset); in cpsw_probe()
2326 priv->dma = cpdma_ctlr_create(&dma_params); in cpsw_probe()
2327 if (!priv->dma) { in cpsw_probe()
2328 dev_err(priv->dev, "error initializing dma\n"); in cpsw_probe()
2333 priv->txch = cpdma_chan_create(priv->dma, tx_chan_num(0), in cpsw_probe()
2335 priv->rxch = cpdma_chan_create(priv->dma, rx_chan_num(0), in cpsw_probe()
2338 if (WARN_ON(!priv->txch || !priv->rxch)) { in cpsw_probe()
2339 dev_err(priv->dev, "error initializing dma channels\n"); in cpsw_probe()
2349 priv->ale = cpsw_ale_create(&ale_params); in cpsw_probe()
2350 if (!priv->ale) { in cpsw_probe()
2351 dev_err(priv->dev, "error initializing ale engine\n"); in cpsw_probe()
2358 dev_err(priv->dev, "error getting irq resource\n"); in cpsw_probe()
2376 priv->irqs_table[0] = irq; in cpsw_probe()
2378 0, dev_name(&pdev->dev), priv); in cpsw_probe()
2380 dev_err(priv->dev, "error attaching irq (%d)\n", ret); in cpsw_probe()
2389 priv->irqs_table[1] = irq; in cpsw_probe()
2391 0, dev_name(&pdev->dev), priv); in cpsw_probe()
2393 dev_err(priv->dev, "error attaching irq (%d)\n", ret); in cpsw_probe()
2396 priv->num_irqs = 2; in cpsw_probe()
2402 netif_napi_add(ndev, &priv->napi, cpsw_poll, CPSW_POLL_WEIGHT); in cpsw_probe()
2408 dev_err(priv->dev, "error registering net device\n"); in cpsw_probe()
2413 cpsw_notice(priv, probe, "initialized device (regs %pa, irq %d)\n", in cpsw_probe()
2416 if (priv->data.dual_emac) { in cpsw_probe()
2417 ret = cpsw_probe_dual_emac(pdev, priv); in cpsw_probe()
2419 cpsw_err(priv, probe, "error probe slave 2 emac interface\n"); in cpsw_probe()
2427 cpsw_ale_destroy(priv->ale); in cpsw_probe()
2429 cpdma_chan_destroy(priv->txch); in cpsw_probe()
2430 cpdma_chan_destroy(priv->rxch); in cpsw_probe()
2431 cpdma_ctlr_destroy(priv->dma); in cpsw_probe()
2435 free_netdev(priv->ndev); in cpsw_probe()
2451 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_remove() local
2453 if (priv->data.dual_emac) in cpsw_remove()
2454 unregister_netdev(cpsw_get_slave_ndev(priv, 1)); in cpsw_remove()
2457 cpsw_ale_destroy(priv->ale); in cpsw_remove()
2458 cpdma_chan_destroy(priv->txch); in cpsw_remove()
2459 cpdma_chan_destroy(priv->rxch); in cpsw_remove()
2460 cpdma_ctlr_destroy(priv->dma); in cpsw_remove()
2463 if (priv->data.dual_emac) in cpsw_remove()
2464 free_netdev(cpsw_get_slave_ndev(priv, 1)); in cpsw_remove()
2474 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_suspend() local
2476 if (priv->data.dual_emac) { in cpsw_suspend()
2479 for (i = 0; i < priv->data.slaves; i++) { in cpsw_suspend()
2480 if (netif_running(priv->slaves[i].ndev)) in cpsw_suspend()
2481 cpsw_ndo_stop(priv->slaves[i].ndev); in cpsw_suspend()
2482 soft_reset_slave(priv->slaves + i); in cpsw_suspend()
2487 for_each_slave(priv, soft_reset_slave); in cpsw_suspend()
2502 struct cpsw_priv *priv = netdev_priv(ndev); in cpsw_resume() local
2509 if (priv->data.dual_emac) { in cpsw_resume()
2512 for (i = 0; i < priv->data.slaves; i++) { in cpsw_resume()
2513 if (netif_running(priv->slaves[i].ndev)) in cpsw_resume()
2514 cpsw_ndo_open(priv->slaves[i].ndev); in cpsw_resume()