Lines Matching defs:dtsec
68 /* dtsec timestamp event bits */
477 static int check_init_parameters(struct fman_mac *dtsec)
479 if ((dtsec->dtsec_drv_param)->rx_prepend >
485 if (((dtsec->dtsec_drv_param)->non_back_to_back_ipg1 >
487 ((dtsec->dtsec_drv_param)->non_back_to_back_ipg2 >
489 ((dtsec->dtsec_drv_param)->back_to_back_ipg >
495 if ((dtsec->dtsec_drv_param)->halfdup_retransmit >
501 if ((dtsec->dtsec_drv_param)->halfdup_coll_window >
510 if (!dtsec->exception_cb) {
514 if (!dtsec->event_cb) {
580 static u16 dtsec_get_max_frame_length(struct fman_mac *dtsec)
582 struct dtsec_regs __iomem *regs = dtsec->regs;
589 struct fman_mac *dtsec = (struct fman_mac *)handle;
590 struct dtsec_regs __iomem *regs = dtsec->regs;
602 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_BAB_RX);
604 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_RX_CTL);
606 dtsec->exception_cb(dtsec->dev_id,
609 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_BAB_TX);
611 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_TX_CTL);
613 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_TX_ERR);
615 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_LATE_COL);
617 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_COL_RET_LMT);
621 if (dtsec->fm_rev_info.major == 2) {
642 (dtsec_get_max_frame_length(dtsec) *
645 (dtsec) * 16 / 1000, 1) + 1));
690 fman_reset_mac(dtsec->fm, dtsec->mac_id);
701 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_TX_FIFO_UNDRN);
704 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_MAG_PCKT);
706 dtsec->exception_cb(dtsec->dev_id,
709 dtsec->exception_cb(dtsec->dev_id, FM_MAC_EX_1G_DATA_ERR);
711 dtsec->exception_cb(dtsec->dev_id, FM_MAC_1G_RX_DATA_ERR);
720 struct fman_mac *dtsec = (struct fman_mac *)handle;
721 struct dtsec_regs __iomem *regs = dtsec->regs;
724 if (dtsec->ptp_tsu_enabled) {
731 dtsec->exception_cb(dtsec->dev_id,
737 static void free_init_resources(struct fman_mac *dtsec)
739 fman_unregister_intr(dtsec->fm, FMAN_MOD_MAC, dtsec->mac_id,
741 fman_unregister_intr(dtsec->fm, FMAN_MOD_MAC, dtsec->mac_id,
745 free_hash_table(dtsec->multicast_addr_hash);
746 dtsec->multicast_addr_hash = NULL;
749 free_hash_table(dtsec->unicast_addr_hash);
750 dtsec->unicast_addr_hash = NULL;
761 struct fman_mac *dtsec = pcs_to_dtsec(pcs);
763 phylink_mii_c22_pcs_get_state(dtsec->tbidev, neg_mode, state);
771 struct fman_mac *dtsec = pcs_to_dtsec(pcs);
773 return phylink_mii_c22_pcs_config(dtsec->tbidev, interface,
779 struct fman_mac *dtsec = pcs_to_dtsec(pcs);
781 phylink_mii_c22_pcs_an_restart(dtsec->tbidev);
790 static void graceful_start(struct fman_mac *dtsec)
792 struct dtsec_regs __iomem *regs = dtsec->regs;
798 static void graceful_stop(struct fman_mac *dtsec)
800 struct dtsec_regs __iomem *regs = dtsec->regs;
807 if (dtsec->fm_rev_info.major == 2) {
816 if (dtsec->fm_rev_info.major == 2) {
828 static int dtsec_enable(struct fman_mac *dtsec)
833 static void dtsec_disable(struct fman_mac *dtsec)
837 static int dtsec_set_tx_pause_frames(struct fman_mac *dtsec,
842 struct dtsec_regs __iomem *regs = dtsec->regs;
847 if (dtsec->fm_rev_info.major == 2 && pause_time <= 320) {
868 static int dtsec_accept_rx_pause_frames(struct fman_mac *dtsec, bool en)
870 struct dtsec_regs __iomem *regs = dtsec->regs;
886 struct fman_mac *dtsec = fman_config_to_mac(config)->fman_mac;
892 return &dtsec->pcs;
934 struct fman_mac *dtsec = mac_dev->fman_mac;
935 struct dtsec_regs __iomem *regs = dtsec->regs;
940 dtsec_set_tx_pause_frames(dtsec, 0, pause_time, 0);
941 dtsec_accept_rx_pause_frames(dtsec, rx_pause);
970 graceful_start(dtsec);
976 struct fman_mac *dtsec = fman_config_to_mac(config)->fman_mac;
977 struct dtsec_regs __iomem *regs = dtsec->regs;
981 graceful_stop(dtsec);
995 static int dtsec_modify_mac_address(struct fman_mac *dtsec,
998 graceful_stop(dtsec);
1003 dtsec->addr = ENET_ADDR_TO_UINT64(*enet_addr);
1004 set_mac_address(dtsec->regs, (const u8 *)(*enet_addr));
1006 graceful_start(dtsec);
1011 static int dtsec_add_hash_mac_address(struct fman_mac *dtsec,
1014 struct dtsec_regs __iomem *regs = dtsec->regs;
1055 set_bucket(dtsec->regs, bucket, true);
1067 &dtsec->multicast_addr_hash->lsts[bucket]);
1070 &dtsec->unicast_addr_hash->lsts[bucket]);
1075 static int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable)
1078 struct dtsec_regs __iomem *regs = dtsec->regs;
1091 static int dtsec_set_tstamp(struct fman_mac *dtsec, bool enable)
1093 struct dtsec_regs __iomem *regs = dtsec->regs;
1113 static int dtsec_del_hash_mac_address(struct fman_mac *dtsec,
1116 struct dtsec_regs __iomem *regs = dtsec->regs;
1151 &dtsec->multicast_addr_hash->lsts[bucket]) {
1159 if (list_empty(&dtsec->multicast_addr_hash->lsts[bucket]))
1160 set_bucket(dtsec->regs, bucket, false);
1164 &dtsec->unicast_addr_hash->lsts[bucket]) {
1172 if (list_empty(&dtsec->unicast_addr_hash->lsts[bucket]))
1173 set_bucket(dtsec->regs, bucket, false);
1182 static int dtsec_set_promiscuous(struct fman_mac *dtsec, bool new_val)
1184 struct dtsec_regs __iomem *regs = dtsec->regs;
1208 static int dtsec_set_exception(struct fman_mac *dtsec,
1211 struct dtsec_regs __iomem *regs = dtsec->regs;
1218 dtsec->exceptions |= bit_mask;
1220 dtsec->exceptions &= ~bit_mask;
1232 if (!dtsec->ptp_tsu_enabled) {
1239 dtsec->en_tsu_err_exception = true;
1244 dtsec->en_tsu_err_exception = false;
1259 static int dtsec_init(struct fman_mac *dtsec)
1261 struct dtsec_regs __iomem *regs = dtsec->regs;
1267 (fman_reset_mac(dtsec->fm, dtsec->mac_id) != 0)) {
1272 err = check_init_parameters(dtsec);
1276 dtsec_drv_param = dtsec->dtsec_drv_param;
1278 err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if,
1279 dtsec->max_speed, dtsec->addr, dtsec->exceptions,
1280 dtsec->tbidev->addr);
1282 free_init_resources(dtsec);
1289 mdiodev_write(dtsec->tbidev, MII_TBICON, tbicon);
1292 mdiodev_write(dtsec->tbidev, MII_TBICON, tbicon);
1296 err = fman_set_mac_max_frame(dtsec->fm, dtsec->mac_id, max_frm_ln);
1299 free_init_resources(dtsec);
1303 dtsec->multicast_addr_hash =
1305 if (!dtsec->multicast_addr_hash) {
1306 free_init_resources(dtsec);
1311 dtsec->unicast_addr_hash = alloc_hash_table(DTSEC_HASH_TABLE_SIZE);
1312 if (!dtsec->unicast_addr_hash) {
1313 free_init_resources(dtsec);
1318 /* register err intr handler for dtsec to FPM (err) */
1319 fman_register_intr(dtsec->fm, FMAN_MOD_MAC, dtsec->mac_id,
1320 FMAN_INTR_TYPE_ERR, dtsec_isr, dtsec);
1322 fman_register_intr(dtsec->fm, FMAN_MOD_MAC, dtsec->mac_id,
1323 FMAN_INTR_TYPE_NORMAL, dtsec_1588_isr, dtsec);
1326 dtsec->dtsec_drv_param = NULL;
1331 static int dtsec_free(struct fman_mac *dtsec)
1333 free_init_resources(dtsec);
1335 kfree(dtsec->dtsec_drv_param);
1336 dtsec->dtsec_drv_param = NULL;
1337 if (!IS_ERR_OR_NULL(dtsec->tbidev))
1338 put_device(&dtsec->tbidev->dev);
1339 kfree(dtsec);
1347 struct fman_mac *dtsec;
1351 dtsec = kzalloc(sizeof(*dtsec), GFP_KERNEL);
1352 if (!dtsec)
1361 dtsec->dtsec_drv_param = dtsec_drv_param;
1365 dtsec->regs = mac_dev->vaddr;
1366 dtsec->addr = ENET_ADDR_TO_UINT64(mac_dev->addr);
1367 dtsec->phy_if = mac_dev->phy_if;
1368 dtsec->mac_id = params->mac_id;
1369 dtsec->exceptions = (DTSEC_IMASK_BREN |
1382 dtsec->exception_cb = params->exception_cb;
1383 dtsec->event_cb = params->event_cb;
1384 dtsec->dev_id = mac_dev;
1385 dtsec->ptp_tsu_enabled = dtsec->dtsec_drv_param->ptp_tsu_en;
1386 dtsec->en_tsu_err_exception = dtsec->dtsec_drv_param->ptp_exception_en;
1388 dtsec->fm = params->fm;
1391 fman_get_revision(dtsec->fm, &dtsec->fm_rev_info);
1393 return dtsec;
1396 kfree(dtsec);
1405 struct fman_mac *dtsec;
1427 dtsec = mac_dev->fman_mac;
1428 dtsec->dtsec_drv_param->maximum_frame = fman_get_max_frm();
1429 dtsec->dtsec_drv_param->tx_pad_crc = true;
1440 dtsec->tbidev = of_mdio_find_device(phy_node);
1442 if (!dtsec->tbidev) {
1448 dtsec->pcs.ops = &dtsec_pcs_ops;
1449 dtsec->pcs.poll = true;
1465 if (!(ioread32be(&dtsec->regs->tsec_id2) & DTSEC_ID2_INT_REDUCED_OFF)) {
1483 err = dtsec_init(dtsec);
1488 err = dtsec_set_exception(dtsec, FM_MAC_EX_1G_RX_MIB_CNT_OVFL, false);
1493 ioread32be(&dtsec->regs->tsec_id));
1498 dtsec_free(dtsec);