Lines Matching refs:priv

248 #define for_active_slave(slave, priv) \  argument
249 slave = (priv)->slaves + (priv)->data.active_slave; if (slave)
250 #define for_each_slave(slave, priv) \ argument
251 for (slave = (priv)->slaves; slave != (priv)->slaves + \
252 (priv)->data.slaves; slave++)
338 static int cpsw_ale_read(struct cpsw_priv *priv, int idx, u32 *ale_entry) in cpsw_ale_read() argument
342 __raw_writel(idx, priv->ale_regs + ALE_TABLE_CONTROL); in cpsw_ale_read()
345 ale_entry[i] = __raw_readl(priv->ale_regs + ALE_TABLE + 4 * i); in cpsw_ale_read()
350 static int cpsw_ale_write(struct cpsw_priv *priv, int idx, u32 *ale_entry) in cpsw_ale_write() argument
355 __raw_writel(ale_entry[i], priv->ale_regs + ALE_TABLE + 4 * i); in cpsw_ale_write()
357 __raw_writel(idx | ALE_TABLE_WRITE, priv->ale_regs + ALE_TABLE_CONTROL); in cpsw_ale_write()
362 static int cpsw_ale_match_addr(struct cpsw_priv *priv, const u8 *addr) in cpsw_ale_match_addr() argument
367 for (idx = 0; idx < priv->data.ale_entries; idx++) { in cpsw_ale_match_addr()
370 cpsw_ale_read(priv, idx, ale_entry); in cpsw_ale_match_addr()
381 static int cpsw_ale_match_free(struct cpsw_priv *priv) in cpsw_ale_match_free() argument
386 for (idx = 0; idx < priv->data.ale_entries; idx++) { in cpsw_ale_match_free()
387 cpsw_ale_read(priv, idx, ale_entry); in cpsw_ale_match_free()
395 static int cpsw_ale_find_ageable(struct cpsw_priv *priv) in cpsw_ale_find_ageable() argument
400 for (idx = 0; idx < priv->data.ale_entries; idx++) { in cpsw_ale_find_ageable()
401 cpsw_ale_read(priv, idx, ale_entry); in cpsw_ale_find_ageable()
415 static int cpsw_ale_add_ucast(struct cpsw_priv *priv, const u8 *addr, in cpsw_ale_add_ucast() argument
428 idx = cpsw_ale_match_addr(priv, addr); in cpsw_ale_add_ucast()
430 idx = cpsw_ale_match_free(priv); in cpsw_ale_add_ucast()
432 idx = cpsw_ale_find_ageable(priv); in cpsw_ale_add_ucast()
436 cpsw_ale_write(priv, idx, ale_entry); in cpsw_ale_add_ucast()
440 static int cpsw_ale_add_mcast(struct cpsw_priv *priv, const u8 *addr, in cpsw_ale_add_mcast() argument
446 idx = cpsw_ale_match_addr(priv, addr); in cpsw_ale_add_mcast()
448 cpsw_ale_read(priv, idx, ale_entry); in cpsw_ale_add_mcast()
459 idx = cpsw_ale_match_free(priv); in cpsw_ale_add_mcast()
461 idx = cpsw_ale_find_ageable(priv); in cpsw_ale_add_mcast()
465 cpsw_ale_write(priv, idx, ale_entry); in cpsw_ale_add_mcast()
469 static inline void cpsw_ale_control(struct cpsw_priv *priv, int bit, int val) in cpsw_ale_control() argument
473 tmp = __raw_readl(priv->ale_regs + ALE_CONTROL); in cpsw_ale_control()
476 __raw_writel(tmp, priv->ale_regs + ALE_CONTROL); in cpsw_ale_control()
479 #define cpsw_ale_enable(priv, val) cpsw_ale_control(priv, 31, val) argument
480 #define cpsw_ale_clear(priv, val) cpsw_ale_control(priv, 30, val) argument
481 #define cpsw_ale_vlan_aware(priv, val) cpsw_ale_control(priv, 2, val) argument
483 static inline void cpsw_ale_port_state(struct cpsw_priv *priv, int port, in cpsw_ale_port_state() argument
489 tmp = __raw_readl(priv->ale_regs + offset); in cpsw_ale_port_state()
492 __raw_writel(tmp, priv->ale_regs + offset); in cpsw_ale_port_state()
602 struct cpsw_priv *priv) in cpsw_set_slave_mac() argument
605 struct eth_pdata *pdata = dev_get_platdata(priv->dev); in cpsw_set_slave_mac()
610 __raw_writel(mac_hi(priv->dev->enetaddr), &slave->regs->sa_hi); in cpsw_set_slave_mac()
611 __raw_writel(mac_lo(priv->dev->enetaddr), &slave->regs->sa_lo); in cpsw_set_slave_mac()
616 struct cpsw_priv *priv, int *link) in cpsw_slave_update_link() argument
622 phy = priv->phydev; in cpsw_slave_update_link()
634 mac_control = priv->data.mac_control; in cpsw_slave_update_link()
661 static int cpsw_update_link(struct cpsw_priv *priv) in cpsw_update_link() argument
666 for_active_slave(slave, priv) in cpsw_update_link()
667 ret = cpsw_slave_update_link(slave, priv, NULL); in cpsw_update_link()
672 static inline u32 cpsw_get_slave_port(struct cpsw_priv *priv, u32 slave_num) in cpsw_get_slave_port() argument
674 if (priv->host_port == 0) in cpsw_get_slave_port()
680 static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_priv *priv) in cpsw_slave_init() argument
692 cpsw_set_slave_mac(slave, priv); in cpsw_slave_init()
697 slave_port = cpsw_get_slave_port(priv, slave->slave_num); in cpsw_slave_init()
698 cpsw_ale_port_state(priv, slave_port, ALE_PORT_STATE_FORWARD); in cpsw_slave_init()
700 cpsw_ale_add_mcast(priv, net_bcast_ethaddr, 1 << slave_port); in cpsw_slave_init()
702 priv->phy_mask |= 1 << slave->data->phy_addr; in cpsw_slave_init()
705 static struct cpdma_desc *cpdma_desc_alloc(struct cpsw_priv *priv) in cpdma_desc_alloc() argument
707 struct cpdma_desc *desc = priv->desc_free; in cpdma_desc_alloc()
710 priv->desc_free = desc_read_ptr(desc, hw_next); in cpdma_desc_alloc()
714 static void cpdma_desc_free(struct cpsw_priv *priv, struct cpdma_desc *desc) in cpdma_desc_free() argument
717 desc_write(desc, hw_next, priv->desc_free); in cpdma_desc_free()
718 priv->desc_free = desc; in cpdma_desc_free()
722 static int cpdma_submit(struct cpsw_priv *priv, struct cpdma_chan *chan, in cpdma_submit() argument
728 desc = cpdma_desc_alloc(priv); in cpdma_submit()
767 static int cpdma_process(struct cpsw_priv *priv, struct cpdma_chan *chan, in cpdma_process() argument
796 cpdma_desc_free(priv, desc); in cpdma_process()
800 static int _cpsw_init(struct cpsw_priv *priv, u8 *enetaddr) in _cpsw_init() argument
806 setbit_and_wait_for_clear32(&priv->regs->soft_reset); in _cpsw_init()
809 cpsw_ale_enable(priv, 1); in _cpsw_init()
810 cpsw_ale_clear(priv, 1); in _cpsw_init()
811 cpsw_ale_vlan_aware(priv, 0); /* vlan unaware mode */ in _cpsw_init()
814 __raw_writel(0x76543210, &priv->host_port_regs->cpdma_tx_pri_map); in _cpsw_init()
815 __raw_writel(0, &priv->host_port_regs->cpdma_rx_chan_map); in _cpsw_init()
818 __raw_writel(0, &priv->regs->ptype); in _cpsw_init()
821 __raw_writel(BIT(priv->host_port), &priv->regs->stat_port_en); in _cpsw_init()
822 __raw_writel(0x7, &priv->regs->stat_port_en); in _cpsw_init()
824 cpsw_ale_port_state(priv, priv->host_port, ALE_PORT_STATE_FORWARD); in _cpsw_init()
826 cpsw_ale_add_ucast(priv, enetaddr, priv->host_port, ALE_SECURE); in _cpsw_init()
827 cpsw_ale_add_mcast(priv, net_bcast_ethaddr, 1 << priv->host_port); in _cpsw_init()
829 for_active_slave(slave, priv) in _cpsw_init()
830 cpsw_slave_init(slave, priv); in _cpsw_init()
832 ret = cpsw_update_link(priv); in _cpsw_init()
838 desc_write(&priv->descs[i], hw_next, in _cpsw_init()
839 (i == (NUM_DESCS - 1)) ? 0 : &priv->descs[i+1]); in _cpsw_init()
841 priv->desc_free = &priv->descs[0]; in _cpsw_init()
844 if (priv->data.version == CPSW_CTRL_VERSION_2) { in _cpsw_init()
845 memset(&priv->rx_chan, 0, sizeof(struct cpdma_chan)); in _cpsw_init()
846 priv->rx_chan.hdp = priv->dma_regs + CPDMA_RXHDP_VER2; in _cpsw_init()
847 priv->rx_chan.cp = priv->dma_regs + CPDMA_RXCP_VER2; in _cpsw_init()
848 priv->rx_chan.rxfree = priv->dma_regs + CPDMA_RXFREE; in _cpsw_init()
850 memset(&priv->tx_chan, 0, sizeof(struct cpdma_chan)); in _cpsw_init()
851 priv->tx_chan.hdp = priv->dma_regs + CPDMA_TXHDP_VER2; in _cpsw_init()
852 priv->tx_chan.cp = priv->dma_regs + CPDMA_TXCP_VER2; in _cpsw_init()
854 memset(&priv->rx_chan, 0, sizeof(struct cpdma_chan)); in _cpsw_init()
855 priv->rx_chan.hdp = priv->dma_regs + CPDMA_RXHDP_VER1; in _cpsw_init()
856 priv->rx_chan.cp = priv->dma_regs + CPDMA_RXCP_VER1; in _cpsw_init()
857 priv->rx_chan.rxfree = priv->dma_regs + CPDMA_RXFREE; in _cpsw_init()
859 memset(&priv->tx_chan, 0, sizeof(struct cpdma_chan)); in _cpsw_init()
860 priv->tx_chan.hdp = priv->dma_regs + CPDMA_TXHDP_VER1; in _cpsw_init()
861 priv->tx_chan.cp = priv->dma_regs + CPDMA_TXCP_VER1; in _cpsw_init()
865 setbit_and_wait_for_clear32(priv->dma_regs + CPDMA_SOFTRESET); in _cpsw_init()
867 if (priv->data.version == CPSW_CTRL_VERSION_2) { in _cpsw_init()
868 for (i = 0; i < priv->data.channels; i++) { in _cpsw_init()
869 __raw_writel(0, priv->dma_regs + CPDMA_RXHDP_VER2 + 4 in _cpsw_init()
871 __raw_writel(0, priv->dma_regs + CPDMA_RXFREE + 4 in _cpsw_init()
873 __raw_writel(0, priv->dma_regs + CPDMA_RXCP_VER2 + 4 in _cpsw_init()
875 __raw_writel(0, priv->dma_regs + CPDMA_TXHDP_VER2 + 4 in _cpsw_init()
877 __raw_writel(0, priv->dma_regs + CPDMA_TXCP_VER2 + 4 in _cpsw_init()
881 for (i = 0; i < priv->data.channels; i++) { in _cpsw_init()
882 __raw_writel(0, priv->dma_regs + CPDMA_RXHDP_VER1 + 4 in _cpsw_init()
884 __raw_writel(0, priv->dma_regs + CPDMA_RXFREE + 4 in _cpsw_init()
886 __raw_writel(0, priv->dma_regs + CPDMA_RXCP_VER1 + 4 in _cpsw_init()
888 __raw_writel(0, priv->dma_regs + CPDMA_TXHDP_VER1 + 4 in _cpsw_init()
890 __raw_writel(0, priv->dma_regs + CPDMA_TXCP_VER1 + 4 in _cpsw_init()
896 __raw_writel(1, priv->dma_regs + CPDMA_TXCONTROL); in _cpsw_init()
897 __raw_writel(1, priv->dma_regs + CPDMA_RXCONTROL); in _cpsw_init()
901 ret = cpdma_submit(priv, &priv->rx_chan, net_rx_packets[i], in _cpsw_init()
913 static void _cpsw_halt(struct cpsw_priv *priv) in _cpsw_halt() argument
915 writel(0, priv->dma_regs + CPDMA_TXCONTROL); in _cpsw_halt()
916 writel(0, priv->dma_regs + CPDMA_RXCONTROL); in _cpsw_halt()
919 setbit_and_wait_for_clear32(&priv->regs->soft_reset); in _cpsw_halt()
922 setbit_and_wait_for_clear32(priv->dma_regs + CPDMA_SOFTRESET); in _cpsw_halt()
926 static int _cpsw_send(struct cpsw_priv *priv, void *packet, int length) in _cpsw_send() argument
937 (cpdma_process(priv, &priv->tx_chan, &buffer, &len) >= 0)) in _cpsw_send()
945 return cpdma_submit(priv, &priv->tx_chan, packet, length); in _cpsw_send()
948 static int _cpsw_recv(struct cpsw_priv *priv, uchar **pkt) in _cpsw_recv() argument
954 ret = cpdma_process(priv, &priv->rx_chan, &buffer, &len); in _cpsw_recv()
966 struct cpsw_priv *priv) in cpsw_slave_setup() argument
968 void *regs = priv->regs; in cpsw_slave_setup()
969 struct cpsw_slave_data *data = priv->data.slave_data + slave_num; in cpsw_slave_setup()
976 static int cpsw_phy_init(struct cpsw_priv *priv, struct cpsw_slave *slave) in cpsw_phy_init() argument
981 phydev = phy_connect(priv->bus, in cpsw_phy_init()
983 priv->dev, in cpsw_phy_init()
997 priv->phydev = phydev; in cpsw_phy_init()
1003 int _cpsw_register(struct cpsw_priv *priv) in _cpsw_register() argument
1006 struct cpsw_platform_data *data = &priv->data; in _cpsw_register()
1009 priv->slaves = malloc(sizeof(struct cpsw_slave) * data->slaves); in _cpsw_register()
1010 if (!priv->slaves) { in _cpsw_register()
1014 priv->host_port = data->host_port_num; in _cpsw_register()
1015 priv->regs = regs; in _cpsw_register()
1016 priv->host_port_regs = regs + data->host_port_reg_ofs; in _cpsw_register()
1017 priv->dma_regs = regs + data->cpdma_reg_ofs; in _cpsw_register()
1018 priv->ale_regs = regs + data->ale_reg_ofs; in _cpsw_register()
1019 priv->descs = (void *)regs + data->bd_ram_ofs; in _cpsw_register()
1023 for_each_slave(slave, priv) { in _cpsw_register()
1024 cpsw_slave_setup(slave, idx, priv); in _cpsw_register()
1028 cpsw_mdio_init(priv->dev->name, data->mdio_base, data->mdio_div); in _cpsw_register()
1029 priv->bus = miiphy_get_dev_by_name(priv->dev->name); in _cpsw_register()
1030 for_active_slave(slave, priv) in _cpsw_register()
1031 cpsw_phy_init(priv, slave); in _cpsw_register()
1039 struct cpsw_priv *priv = dev->priv; in cpsw_init() local
1041 return _cpsw_init(priv, dev->enetaddr); in cpsw_init()
1046 struct cpsw_priv *priv = dev->priv; in cpsw_halt() local
1048 return _cpsw_halt(priv); in cpsw_halt()
1053 struct cpsw_priv *priv = dev->priv; in cpsw_send() local
1055 return _cpsw_send(priv, packet, length); in cpsw_send()
1060 struct cpsw_priv *priv = dev->priv; in cpsw_recv() local
1064 len = _cpsw_recv(priv, &pkt); in cpsw_recv()
1068 cpdma_submit(priv, &priv->rx_chan, pkt, PKTSIZE); in cpsw_recv()
1076 struct cpsw_priv *priv; in cpsw_register() local
1084 priv = calloc(sizeof(*priv), 1); in cpsw_register()
1085 if (!priv) { in cpsw_register()
1090 priv->dev = dev; in cpsw_register()
1091 priv->data = *data; in cpsw_register()
1099 dev->priv = priv; in cpsw_register()
1103 ret = _cpsw_register(priv); in cpsw_register()
1107 free(priv); in cpsw_register()
1117 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_start() local
1119 return _cpsw_init(priv, pdata->enetaddr); in cpsw_eth_start()
1124 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_send() local
1126 return _cpsw_send(priv, packet, length); in cpsw_eth_send()
1131 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_recv() local
1133 return _cpsw_recv(priv, packetp); in cpsw_eth_recv()
1139 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_free_pkt() local
1141 return cpdma_submit(priv, &priv->rx_chan, packet, PKTSIZE); in cpsw_eth_free_pkt()
1146 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_stop() local
1148 return _cpsw_halt(priv); in cpsw_eth_stop()
1154 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_probe() local
1156 priv->dev = dev; in cpsw_eth_probe()
1158 return _cpsw_register(priv); in cpsw_eth_probe()
1175 static void cpsw_gmii_sel_am3352(struct cpsw_priv *priv, in cpsw_gmii_sel_am3352() argument
1182 int slave = priv->data.active_slave; in cpsw_gmii_sel_am3352()
1184 reg = readl(priv->data.gmii_sel); in cpsw_gmii_sel_am3352()
1210 if (priv->data.rmii_clock_external) { in cpsw_gmii_sel_am3352()
1227 writel(reg, priv->data.gmii_sel); in cpsw_gmii_sel_am3352()
1230 static void cpsw_gmii_sel_dra7xx(struct cpsw_priv *priv, in cpsw_gmii_sel_dra7xx() argument
1236 int slave = priv->data.active_slave; in cpsw_gmii_sel_dra7xx()
1238 reg = readl(priv->data.gmii_sel); in cpsw_gmii_sel_dra7xx()
1267 dev_err(priv->dev, "invalid slave number...\n"); in cpsw_gmii_sel_dra7xx()
1271 if (priv->data.rmii_clock_external) in cpsw_gmii_sel_dra7xx()
1272 dev_err(priv->dev, "RMII External clock is not supported\n"); in cpsw_gmii_sel_dra7xx()
1277 writel(reg, priv->data.gmii_sel); in cpsw_gmii_sel_dra7xx()
1280 static void cpsw_phy_sel(struct cpsw_priv *priv, const char *compat, in cpsw_phy_sel() argument
1284 cpsw_gmii_sel_am3352(priv, phy_mode); in cpsw_phy_sel()
1286 cpsw_gmii_sel_am3352(priv, phy_mode); in cpsw_phy_sel()
1288 cpsw_gmii_sel_dra7xx(priv, phy_mode); in cpsw_phy_sel()
1294 struct cpsw_priv *priv = dev_get_priv(dev); in cpsw_eth_ofdata_to_platdata() local
1307 priv->data.version = CPSW_CTRL_VERSION_2; in cpsw_eth_ofdata_to_platdata()
1308 priv->data.bd_ram_ofs = CPSW_BD_OFFSET; in cpsw_eth_ofdata_to_platdata()
1309 priv->data.ale_reg_ofs = CPSW_ALE_OFFSET; in cpsw_eth_ofdata_to_platdata()
1310 priv->data.cpdma_reg_ofs = CPSW_CPDMA_OFFSET; in cpsw_eth_ofdata_to_platdata()
1311 priv->data.mdio_div = CPSW_MDIO_DIV; in cpsw_eth_ofdata_to_platdata()
1312 priv->data.host_port_reg_ofs = CPSW_HOST_PORT_OFFSET, in cpsw_eth_ofdata_to_platdata()
1316 priv->data.cpsw_base = pdata->iobase; in cpsw_eth_ofdata_to_platdata()
1317 priv->data.channels = fdtdec_get_int(fdt, node, "cpdma_channels", -1); in cpsw_eth_ofdata_to_platdata()
1318 if (priv->data.channels <= 0) { in cpsw_eth_ofdata_to_platdata()
1323 priv->data.slaves = fdtdec_get_int(fdt, node, "slaves", -1); in cpsw_eth_ofdata_to_platdata()
1324 if (priv->data.slaves <= 0) { in cpsw_eth_ofdata_to_platdata()
1328 priv->data.slave_data = malloc(sizeof(struct cpsw_slave_data) * in cpsw_eth_ofdata_to_platdata()
1329 priv->data.slaves); in cpsw_eth_ofdata_to_platdata()
1331 priv->data.ale_entries = fdtdec_get_int(fdt, node, "ale_entries", -1); in cpsw_eth_ofdata_to_platdata()
1332 if (priv->data.ale_entries <= 0) { in cpsw_eth_ofdata_to_platdata()
1337 priv->data.bd_ram_ofs = fdtdec_get_int(fdt, node, "bd_ram_size", -1); in cpsw_eth_ofdata_to_platdata()
1338 if (priv->data.bd_ram_ofs <= 0) { in cpsw_eth_ofdata_to_platdata()
1343 priv->data.mac_control = fdtdec_get_int(fdt, node, "mac_control", -1); in cpsw_eth_ofdata_to_platdata()
1344 if (priv->data.mac_control <= 0) { in cpsw_eth_ofdata_to_platdata()
1359 priv->data.active_slave = active_slave; in cpsw_eth_ofdata_to_platdata()
1374 priv->data.mdio_base = mdio_base; in cpsw_eth_ofdata_to_platdata()
1380 if (slave_index >= priv->data.slaves) in cpsw_eth_ofdata_to_platdata()
1384 priv->data.slave_data[slave_index].phy_if = in cpsw_eth_ofdata_to_platdata()
1387 priv->data.slave_data[slave_index].phy_of_handle = in cpsw_eth_ofdata_to_platdata()
1391 if (priv->data.slave_data[slave_index].phy_of_handle >= 0) { in cpsw_eth_ofdata_to_platdata()
1392 priv->data.slave_data[slave_index].phy_addr = in cpsw_eth_ofdata_to_platdata()
1394 priv->data.slave_data[slave_index].phy_of_handle, in cpsw_eth_ofdata_to_platdata()
1399 priv->data.slave_data[slave_index].phy_addr = in cpsw_eth_ofdata_to_platdata()
1406 priv->data.gmii_sel = cpsw_get_addr_by_node(fdt, in cpsw_eth_ofdata_to_platdata()
1409 if (priv->data.gmii_sel == FDT_ADDR_T_NONE) { in cpsw_eth_ofdata_to_platdata()
1416 priv->data.rmii_clock_external = true; in cpsw_eth_ofdata_to_platdata()
1427 priv->data.slave_data[0].slave_reg_ofs = CPSW_SLAVE0_OFFSET; in cpsw_eth_ofdata_to_platdata()
1428 priv->data.slave_data[0].sliver_reg_ofs = CPSW_SLIVER0_OFFSET; in cpsw_eth_ofdata_to_platdata()
1430 if (priv->data.slaves == 2) { in cpsw_eth_ofdata_to_platdata()
1431 priv->data.slave_data[1].slave_reg_ofs = CPSW_SLAVE1_OFFSET; in cpsw_eth_ofdata_to_platdata()
1432 priv->data.slave_data[1].sliver_reg_ofs = CPSW_SLIVER1_OFFSET; in cpsw_eth_ofdata_to_platdata()
1441 pdata->phy_interface = priv->data.slave_data[active_slave].phy_if; in cpsw_eth_ofdata_to_platdata()
1448 cpsw_phy_sel(priv, phy_sel_compat, pdata->phy_interface); in cpsw_eth_ofdata_to_platdata()