Lines Matching defs:hellcreek
26 #include "hellcreek.h"
95 static u16 hellcreek_read(struct hellcreek *hellcreek, unsigned int offset)
97 return readw(hellcreek->base + offset);
100 static u16 hellcreek_read_ctrl(struct hellcreek *hellcreek)
102 return readw(hellcreek->base + HR_CTRL_C);
105 static u16 hellcreek_read_stat(struct hellcreek *hellcreek)
107 return readw(hellcreek->base + HR_SWSTAT);
110 static void hellcreek_write(struct hellcreek *hellcreek, u16 data,
113 writew(data, hellcreek->base + offset);
116 static void hellcreek_select_port(struct hellcreek *hellcreek, int port)
120 hellcreek_write(hellcreek, val, HR_PSEL);
123 static void hellcreek_select_prio(struct hellcreek *hellcreek, int prio)
127 hellcreek_write(hellcreek, val, HR_PSEL);
130 static void hellcreek_select_port_prio(struct hellcreek *hellcreek, int port,
137 hellcreek_write(hellcreek, val, HR_PSEL);
140 static void hellcreek_select_counter(struct hellcreek *hellcreek, int counter)
144 hellcreek_write(hellcreek, val, HR_CSEL);
150 static void hellcreek_select_vlan(struct hellcreek *hellcreek, int vid,
158 hellcreek_write(hellcreek, val, HR_VIDCFG);
162 hellcreek_write(hellcreek, val, HR_VIDCFG);
165 static void hellcreek_select_tgd(struct hellcreek *hellcreek, int port)
169 hellcreek_write(hellcreek, val, TR_TGDSEL);
172 static int hellcreek_wait_until_ready(struct hellcreek *hellcreek)
177 return readx_poll_timeout(hellcreek_read_ctrl, hellcreek,
182 static int hellcreek_wait_until_transitioned(struct hellcreek *hellcreek)
186 return readx_poll_timeout_atomic(hellcreek_read_ctrl, hellcreek,
191 static int hellcreek_wait_fdb_ready(struct hellcreek *hellcreek)
195 return readx_poll_timeout_atomic(hellcreek_read_stat, hellcreek,
200 static int hellcreek_detect(struct hellcreek *hellcreek)
206 id = hellcreek_read(hellcreek, HR_MODID_C);
207 rel_low = hellcreek_read(hellcreek, HR_REL_L_C);
208 rel_high = hellcreek_read(hellcreek, HR_REL_H_C);
209 date_low = hellcreek_read(hellcreek, HR_BLD_L_C);
210 date_high = hellcreek_read(hellcreek, HR_BLD_H_C);
211 tgd_ver = hellcreek_read(hellcreek, TR_TGDVER);
213 if (id != hellcreek->pdata->module_id)
221 dev_info(hellcreek->dev, "Module ID=%02x Release=%04x Date=%04x TGD Version=%02x.%02x\n",
227 static void hellcreek_feature_detect(struct hellcreek *hellcreek)
231 features = hellcreek_read(hellcreek, HR_FEABITS0);
236 hellcreek->fdb_entries = ((features & HR_FEABITS0_FDBBINS_MASK) >>
250 struct hellcreek *hellcreek = ds->priv;
254 hellcreek_port = &hellcreek->ports[port];
256 dev_dbg(hellcreek->dev, "Enable port %d\n", port);
258 mutex_lock(&hellcreek->reg_lock);
260 hellcreek_select_port(hellcreek, port);
263 hellcreek_write(hellcreek, val, HR_PTCFG);
266 mutex_unlock(&hellcreek->reg_lock);
273 struct hellcreek *hellcreek = ds->priv;
277 hellcreek_port = &hellcreek->ports[port];
279 dev_dbg(hellcreek->dev, "Disable port %d\n", port);
281 mutex_lock(&hellcreek->reg_lock);
283 hellcreek_select_port(hellcreek, port);
286 hellcreek_write(hellcreek, val, HR_PTCFG);
289 mutex_unlock(&hellcreek->reg_lock);
316 struct hellcreek *hellcreek = ds->priv;
320 hellcreek_port = &hellcreek->ports[port];
328 mutex_lock(&hellcreek->reg_lock);
330 hellcreek_select_counter(hellcreek, offset);
336 high = hellcreek_read(hellcreek, HR_CRDH);
337 low = hellcreek_read(hellcreek, HR_CRDL);
343 mutex_unlock(&hellcreek->reg_lock);
356 struct hellcreek *hellcreek = ds->priv;
359 dev_dbg(hellcreek->dev, "VLAN prepare for port %d\n", port);
365 for (i = 0; i < hellcreek->pdata->num_ports; ++i) {
380 static void hellcreek_select_vlan_params(struct hellcreek *hellcreek, int port,
402 dev_err(hellcreek->dev, "Unknown port %d selected!\n", port);
406 static void hellcreek_apply_vlan(struct hellcreek *hellcreek, int port, u16 vid,
412 dev_dbg(hellcreek->dev, "Apply VLAN: port=%d vid=%u pvid=%d untagged=%d",
415 mutex_lock(&hellcreek->reg_lock);
417 hellcreek_select_port(hellcreek, port);
418 hellcreek_select_vlan(hellcreek, vid, pvid);
421 hellcreek_select_vlan_params(hellcreek, port, &shift, &mask);
422 val = hellcreek->vidmbrcfg[vid];
429 hellcreek_write(hellcreek, val, HR_VIDMBRCFG);
430 hellcreek->vidmbrcfg[vid] = val;
432 mutex_unlock(&hellcreek->reg_lock);
435 static void hellcreek_unapply_vlan(struct hellcreek *hellcreek, int port,
441 dev_dbg(hellcreek->dev, "Unapply VLAN: port=%d vid=%u\n", port, vid);
443 mutex_lock(&hellcreek->reg_lock);
445 hellcreek_select_vlan(hellcreek, vid, false);
448 hellcreek_select_vlan_params(hellcreek, port, &shift, &mask);
449 val = hellcreek->vidmbrcfg[vid];
453 hellcreek_write(hellcreek, val, HR_VIDMBRCFG);
454 hellcreek->vidmbrcfg[vid] = val;
456 mutex_unlock(&hellcreek->reg_lock);
465 struct hellcreek *hellcreek = ds->priv;
472 dev_dbg(hellcreek->dev, "Add VLAN %d on port %d, %s, %s\n",
476 hellcreek_apply_vlan(hellcreek, port, vlan->vid, pvid, untagged);
484 struct hellcreek *hellcreek = ds->priv;
486 dev_dbg(hellcreek->dev, "Remove VLAN %d on port %d\n", vlan->vid, port);
488 hellcreek_unapply_vlan(hellcreek, port, vlan->vid);
496 struct hellcreek *hellcreek = ds->priv;
501 mutex_lock(&hellcreek->reg_lock);
503 hellcreek_port = &hellcreek->ports[port];
536 hellcreek_select_port(hellcreek, port);
537 hellcreek_write(hellcreek, val, HR_PTCFG);
540 mutex_unlock(&hellcreek->reg_lock);
542 dev_dbg(hellcreek->dev, "Configured STP state for port %d: %s\n",
546 static void hellcreek_setup_ingressflt(struct hellcreek *hellcreek, int port,
549 struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
552 mutex_lock(&hellcreek->reg_lock);
561 hellcreek_select_port(hellcreek, port);
562 hellcreek_write(hellcreek, ptcfg, HR_PTCFG);
565 mutex_unlock(&hellcreek->reg_lock);
568 static void hellcreek_setup_vlan_awareness(struct hellcreek *hellcreek,
573 mutex_lock(&hellcreek->reg_lock);
575 swcfg = hellcreek->swcfg;
582 hellcreek_write(hellcreek, swcfg, HR_SWCFG);
584 mutex_unlock(&hellcreek->reg_lock);
593 struct hellcreek *hellcreek = ds->priv;
597 hellcreek_apply_vlan(hellcreek, port, vid, true, true);
599 hellcreek_unapply_vlan(hellcreek, port, vid);
603 hellcreek_apply_vlan(hellcreek, upstream, vid, false, true);
605 hellcreek_unapply_vlan(hellcreek, upstream, vid);
608 static void hellcreek_port_set_ucast_flood(struct hellcreek *hellcreek,
614 hellcreek_port = &hellcreek->ports[port];
616 dev_dbg(hellcreek->dev, "%s unicast flooding on port %d\n",
619 mutex_lock(&hellcreek->reg_lock);
621 hellcreek_select_port(hellcreek, port);
627 hellcreek_write(hellcreek, val, HR_PTCFG);
630 mutex_unlock(&hellcreek->reg_lock);
633 static void hellcreek_port_set_mcast_flood(struct hellcreek *hellcreek,
639 hellcreek_port = &hellcreek->ports[port];
641 dev_dbg(hellcreek->dev, "%s multicast flooding on port %d\n",
644 mutex_lock(&hellcreek->reg_lock);
646 hellcreek_select_port(hellcreek, port);
652 hellcreek_write(hellcreek, val, HR_PTCFG);
655 mutex_unlock(&hellcreek->reg_lock);
672 struct hellcreek *hellcreek = ds->priv;
675 hellcreek_port_set_ucast_flood(hellcreek, port,
679 hellcreek_port_set_mcast_flood(hellcreek, port,
690 struct hellcreek *hellcreek = ds->priv;
692 dev_dbg(hellcreek->dev, "Port %d joins a bridge\n", port);
696 hellcreek_setup_vlan_awareness(hellcreek, false);
707 struct hellcreek *hellcreek = ds->priv;
709 dev_dbg(hellcreek->dev, "Port %d leaves a bridge\n", port);
712 hellcreek_setup_vlan_awareness(hellcreek, true);
718 static int __hellcreek_fdb_add(struct hellcreek *hellcreek,
723 dev_dbg(hellcreek->dev, "Add static FDB entry: MAC=%pM, MASK=0x%02x, "
729 hellcreek_write(hellcreek, entry->mac[1] | (entry->mac[0] << 8), HR_FDBWDH);
730 hellcreek_write(hellcreek, entry->mac[3] | (entry->mac[2] << 8), HR_FDBWDM);
731 hellcreek_write(hellcreek, entry->mac[5] | (entry->mac[4] << 8), HR_FDBWDL);
743 hellcreek_write(hellcreek, meta, HR_FDBWRM0);
746 hellcreek_write(hellcreek, 0x00, HR_FDBWRCMD);
749 return hellcreek_wait_fdb_ready(hellcreek);
752 static int __hellcreek_fdb_del(struct hellcreek *hellcreek,
755 dev_dbg(hellcreek->dev, "Delete FDB entry: MAC=%pM!\n", entry->mac);
758 hellcreek_write(hellcreek, entry->idx | HR_FDBWRCMD_FDBDEL, HR_FDBWRCMD);
761 return hellcreek_wait_fdb_ready(hellcreek);
764 static void hellcreek_populate_fdb_entry(struct hellcreek *hellcreek,
772 meta = hellcreek_read(hellcreek, HR_FDBMDRD);
773 mac = hellcreek_read(hellcreek, HR_FDBRDL);
776 mac = hellcreek_read(hellcreek, HR_FDBRDM);
779 mac = hellcreek_read(hellcreek, HR_FDBRDH);
802 static int hellcreek_fdb_get(struct hellcreek *hellcreek,
812 hellcreek_read(hellcreek, HR_FDBMAX);
813 hellcreek_write(hellcreek, 0x00, HR_FDBMAX);
818 for (i = 0; i < hellcreek->fdb_entries; ++i) {
822 hellcreek_populate_fdb_entry(hellcreek, &tmp, i);
825 hellcreek_write(hellcreek, 0x00, HR_FDBRDH);
844 struct hellcreek *hellcreek = ds->priv;
847 dev_dbg(hellcreek->dev, "Add FDB entry for MAC=%pM\n", addr);
849 mutex_lock(&hellcreek->reg_lock);
851 ret = hellcreek_fdb_get(hellcreek, addr, &entry);
857 ret = __hellcreek_fdb_add(hellcreek, &entry);
859 dev_err(hellcreek->dev, "Failed to add FDB entry!\n");
864 ret = __hellcreek_fdb_del(hellcreek, &entry);
866 dev_err(hellcreek->dev, "Failed to delete FDB entry!\n");
872 ret = __hellcreek_fdb_add(hellcreek, &entry);
874 dev_err(hellcreek->dev, "Failed to add FDB entry!\n");
880 mutex_unlock(&hellcreek->reg_lock);
890 struct hellcreek *hellcreek = ds->priv;
893 dev_dbg(hellcreek->dev, "Delete FDB entry for MAC=%pM\n", addr);
895 mutex_lock(&hellcreek->reg_lock);
897 ret = hellcreek_fdb_get(hellcreek, addr, &entry);
900 dev_err(hellcreek->dev, "FDB entry for deletion not found!\n");
903 ret = __hellcreek_fdb_del(hellcreek, &entry);
905 dev_err(hellcreek->dev, "Failed to delete FDB entry!\n");
912 ret = __hellcreek_fdb_add(hellcreek, &entry);
914 dev_err(hellcreek->dev, "Failed to add FDB entry!\n");
921 mutex_unlock(&hellcreek->reg_lock);
929 struct hellcreek *hellcreek = ds->priv;
934 mutex_lock(&hellcreek->reg_lock);
940 entries = hellcreek_read(hellcreek, HR_FDBMAX);
941 hellcreek_write(hellcreek, 0x00, HR_FDBMAX);
943 dev_dbg(hellcreek->dev, "FDB dump for port %d, entries=%d!\n", port, entries);
946 for (i = 0; i < hellcreek->fdb_entries; ++i) {
950 hellcreek_populate_fdb_entry(hellcreek, &entry, i);
953 hellcreek_write(hellcreek, 0x00, HR_FDBRDH);
968 mutex_unlock(&hellcreek->reg_lock);
977 struct hellcreek *hellcreek = ds->priv;
979 dev_dbg(hellcreek->dev, "%s VLAN filtering on port %d\n",
983 hellcreek_setup_ingressflt(hellcreek, port, vlan_filtering);
988 hellcreek_setup_vlan_awareness(hellcreek, vlan_filtering);
993 static int hellcreek_enable_ip_core(struct hellcreek *hellcreek)
998 mutex_lock(&hellcreek->reg_lock);
1000 val = hellcreek_read(hellcreek, HR_CTRL_C);
1002 hellcreek_write(hellcreek, val, HR_CTRL_C);
1003 ret = hellcreek_wait_until_transitioned(hellcreek);
1005 mutex_unlock(&hellcreek->reg_lock);
1010 static void hellcreek_setup_cpu_and_tunnel_port(struct hellcreek *hellcreek)
1012 struct hellcreek_port *tunnel_port = &hellcreek->ports[TUNNEL_PORT];
1013 struct hellcreek_port *cpu_port = &hellcreek->ports[CPU_PORT];
1018 mutex_lock(&hellcreek->reg_lock);
1020 hellcreek_select_port(hellcreek, CPU_PORT);
1021 hellcreek_write(hellcreek, ptcfg, HR_PTCFG);
1023 hellcreek_select_port(hellcreek, TUNNEL_PORT);
1024 hellcreek_write(hellcreek, ptcfg, HR_PTCFG);
1029 mutex_unlock(&hellcreek->reg_lock);
1032 static void hellcreek_setup_tc_identity_mapping(struct hellcreek *hellcreek)
1055 mutex_lock(&hellcreek->reg_lock);
1057 hellcreek_select_prio(hellcreek, i);
1058 hellcreek_write(hellcreek,
1062 mutex_unlock(&hellcreek->reg_lock);
1066 static int hellcreek_setup_fdb(struct hellcreek *hellcreek)
1147 mutex_lock(&hellcreek->reg_lock);
1148 ret = __hellcreek_fdb_add(hellcreek, &l2_ptp);
1151 ret = __hellcreek_fdb_add(hellcreek, &udp4_ptp);
1154 ret = __hellcreek_fdb_add(hellcreek, &udp6_ptp);
1157 ret = __hellcreek_fdb_add(hellcreek, &l2_p2p);
1160 ret = __hellcreek_fdb_add(hellcreek, &udp4_p2p);
1163 ret = __hellcreek_fdb_add(hellcreek, &udp6_p2p);
1166 ret = __hellcreek_fdb_add(hellcreek, &stp);
1168 mutex_unlock(&hellcreek->reg_lock);
1177 struct hellcreek *hellcreek = ds->priv;
1181 hellcreek->pdata->name);
1186 struct hellcreek *hellcreek = priv;
1190 mutex_lock(&hellcreek->reg_lock);
1192 if (hellcreek->vidmbrcfg[i])
1194 mutex_unlock(&hellcreek->reg_lock);
1201 struct hellcreek *hellcreek = priv;
1207 mutex_lock(&hellcreek->reg_lock);
1208 count = hellcreek_read(hellcreek, HR_FDBMAX);
1209 mutex_unlock(&hellcreek->reg_lock);
1218 struct hellcreek *hellcreek = ds->priv;
1226 hellcreek->fdb_entries,
1227 hellcreek->fdb_entries,
1237 err = dsa_devlink_resource_register(ds, "FDB", hellcreek->fdb_entries,
1247 hellcreek);
1252 hellcreek);
1269 struct hellcreek *hellcreek = ds->priv;
1278 mutex_lock(&hellcreek->reg_lock);
1280 entry->member = hellcreek->vidmbrcfg[i];
1283 mutex_unlock(&hellcreek->reg_lock);
1297 struct hellcreek *hellcreek = ds->priv;
1300 table = kcalloc(hellcreek->fdb_entries, sizeof(*entry), GFP_KERNEL);
1306 mutex_lock(&hellcreek->reg_lock);
1309 hellcreek_read(hellcreek, HR_FDBMAX);
1310 hellcreek_write(hellcreek, 0x00, HR_FDBMAX);
1312 for (i = 0; i < hellcreek->fdb_entries; ++i, ++entry) {
1314 hellcreek_populate_fdb_entry(hellcreek, entry, i);
1317 hellcreek_write(hellcreek, 0x00, HR_FDBRDH);
1320 mutex_unlock(&hellcreek->reg_lock);
1341 struct hellcreek *hellcreek = ds->priv;
1355 hellcreek->vlan_region = region;
1358 size = hellcreek->fdb_entries * sizeof(struct hellcreek_fdb_entry);
1367 hellcreek->fdb_region = region;
1372 dsa_devlink_region_destroy(hellcreek->vlan_region);
1379 struct hellcreek *hellcreek = ds->priv;
1381 dsa_devlink_region_destroy(hellcreek->fdb_region);
1382 dsa_devlink_region_destroy(hellcreek->vlan_region);
1387 struct hellcreek *hellcreek = ds->priv;
1391 dev_dbg(hellcreek->dev, "Set up the switch\n");
1394 ret = hellcreek_enable_ip_core(hellcreek);
1396 dev_err(hellcreek->dev, "Failed to enable IP core!\n");
1401 hellcreek_setup_cpu_and_tunnel_port(hellcreek);
1411 hellcreek->swcfg = swcfg;
1412 hellcreek_write(hellcreek, swcfg, HR_SWCFG);
1423 hellcreek_setup_tc_identity_mapping(hellcreek);
1432 ret = hellcreek_setup_fdb(hellcreek);
1434 dev_err(hellcreek->dev,
1442 dev_err(hellcreek->dev,
1449 dev_err(hellcreek->dev,
1471 struct hellcreek *hellcreek = ds->priv;
1487 if (hellcreek->pdata->is_100_mbits)
1497 struct hellcreek *hellcreek = ds->priv;
1503 dev_dbg(hellcreek->dev, "Pre change upper for port %d\n", port);
1519 mutex_lock(&hellcreek->vlan_lock);
1520 for (i = 0; i < hellcreek->pdata->num_ports; ++i) {
1527 used = used && test_bit(vid, hellcreek->ports[i].vlan_dev_bitmap);
1534 set_bit(vid, hellcreek->ports[port].vlan_dev_bitmap);
1539 mutex_unlock(&hellcreek->vlan_lock);
1544 static void hellcreek_setup_maxsdu(struct hellcreek *hellcreek, int port,
1556 dev_dbg(hellcreek->dev, "Configure max-sdu %u for tc %d on port %d\n",
1559 hellcreek_select_port_prio(hellcreek, port, tc);
1563 hellcreek_write(hellcreek, val, HR_PTPRTCCFG);
1567 static void hellcreek_reset_maxsdu(struct hellcreek *hellcreek, int port)
1574 hellcreek_select_port_prio(hellcreek, port, tc);
1579 hellcreek_write(hellcreek, val, HR_PTPRTCCFG);
1583 static void hellcreek_setup_gcl(struct hellcreek *hellcreek, int port,
1609 hellcreek_write(hellcreek, data, TR_GCLDAT);
1612 hellcreek_write(hellcreek,
1615 hellcreek_write(hellcreek,
1623 hellcreek_write(hellcreek, data, TR_GCLCMD);
1630 static void hellcreek_set_cycle_time(struct hellcreek *hellcreek,
1635 hellcreek_write(hellcreek, cycle_time & 0x0000ffff, TR_CTWRL);
1636 hellcreek_write(hellcreek, (cycle_time & 0xffff0000) >> 16, TR_CTWRH);
1639 static void hellcreek_switch_schedule(struct hellcreek *hellcreek,
1645 hellcreek_write(hellcreek, ts.tv_nsec & 0x0000ffff, TR_ESTWRL);
1646 hellcreek_write(hellcreek, (ts.tv_nsec & 0xffff0000) >> 16, TR_ESTWRH);
1649 hellcreek_write(hellcreek, TR_ESTCMD_ESTARM | TR_ESTCMD_ESTSWCFG |
1654 static bool hellcreek_schedule_startable(struct hellcreek *hellcreek, int port)
1656 struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
1667 mutex_lock(&hellcreek->ptp_lock);
1668 current_ns = hellcreek->seconds * NSEC_PER_SEC + hellcreek->last_ts;
1669 mutex_unlock(&hellcreek->ptp_lock);
1677 static void hellcreek_start_schedule(struct hellcreek *hellcreek, int port)
1679 struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
1685 hellcreek_select_tgd(hellcreek, port);
1688 mutex_lock(&hellcreek->ptp_lock);
1689 current_ns = hellcreek->seconds * NSEC_PER_SEC + hellcreek->last_ts;
1690 mutex_unlock(&hellcreek->ptp_lock);
1705 hellcreek_switch_schedule(hellcreek, base_time);
1710 dev_dbg(hellcreek->dev, "Armed EST timer for port %d\n",
1718 struct hellcreek *hellcreek;
1722 hellcreek = hellcreek_port->hellcreek;
1724 mutex_lock(&hellcreek->reg_lock);
1727 startable = hellcreek_schedule_startable(hellcreek,
1730 hellcreek_start_schedule(hellcreek, hellcreek_port->port);
1731 mutex_unlock(&hellcreek->reg_lock);
1735 mutex_unlock(&hellcreek->reg_lock);
1745 struct hellcreek *hellcreek = ds->priv;
1750 hellcreek_port = &hellcreek->ports[port];
1752 dev_dbg(hellcreek->dev, "Configure traffic schedule on port %d\n",
1758 mutex_lock(&hellcreek->reg_lock);
1767 hellcreek_setup_maxsdu(hellcreek, port, hellcreek_port->current_schedule);
1770 hellcreek_select_tgd(hellcreek, port);
1774 hellcreek_write(hellcreek, ctrl, TR_TGDCTRL);
1777 hellcreek_write(hellcreek, 0x00, TR_ESTCMD);
1780 hellcreek_setup_gcl(hellcreek, port, hellcreek_port->current_schedule);
1783 hellcreek_set_cycle_time(hellcreek, hellcreek_port->current_schedule);
1786 startable = hellcreek_schedule_startable(hellcreek, port);
1788 hellcreek_start_schedule(hellcreek, port);
1789 mutex_unlock(&hellcreek->reg_lock);
1793 mutex_unlock(&hellcreek->reg_lock);
1804 struct hellcreek *hellcreek = ds->priv;
1807 hellcreek_port = &hellcreek->ports[port];
1809 dev_dbg(hellcreek->dev, "Remove traffic schedule on port %d\n", port);
1814 mutex_lock(&hellcreek->reg_lock);
1822 hellcreek_reset_maxsdu(hellcreek, port);
1825 hellcreek_select_tgd(hellcreek, port);
1828 hellcreek_write(hellcreek, 0xff << TR_TGDCTRL_ADMINGATESTATES_SHIFT,
1831 mutex_unlock(&hellcreek->reg_lock);
1836 static bool hellcreek_validate_schedule(struct hellcreek *hellcreek,
1841 /* Does this hellcreek version support Qbv in hardware? */
1842 if (!hellcreek->pdata->qbv_support)
1879 struct hellcreek *hellcreek = ds->priv;
1889 if (!hellcreek_validate_schedule(hellcreek, taprio))
1938 struct hellcreek *hellcreek;
1942 hellcreek = devm_kzalloc(dev, sizeof(*hellcreek), GFP_KERNEL);
1943 if (!hellcreek)
1946 hellcreek->vidmbrcfg = devm_kcalloc(dev, VLAN_N_VID,
1947 sizeof(*hellcreek->vidmbrcfg),
1949 if (!hellcreek->vidmbrcfg)
1952 hellcreek->pdata = of_device_get_match_data(dev);
1954 hellcreek->ports = devm_kcalloc(dev, hellcreek->pdata->num_ports,
1955 sizeof(*hellcreek->ports),
1957 if (!hellcreek->ports)
1960 for (i = 0; i < hellcreek->pdata->num_ports; ++i) {
1961 struct hellcreek_port *port = &hellcreek->ports[i];
1976 port->hellcreek = hellcreek;
1983 mutex_init(&hellcreek->reg_lock);
1984 mutex_init(&hellcreek->vlan_lock);
1985 mutex_init(&hellcreek->ptp_lock);
1987 hellcreek->dev = dev;
1995 hellcreek->base = devm_ioremap_resource(dev, res);
1996 if (IS_ERR(hellcreek->base))
1997 return PTR_ERR(hellcreek->base);
2005 hellcreek->ptp_base = devm_ioremap_resource(dev, res);
2006 if (IS_ERR(hellcreek->ptp_base))
2007 return PTR_ERR(hellcreek->ptp_base);
2009 ret = hellcreek_detect(hellcreek);
2015 ret = hellcreek_wait_until_ready(hellcreek);
2021 hellcreek_feature_detect(hellcreek);
2023 hellcreek->ds = devm_kzalloc(dev, sizeof(*hellcreek->ds), GFP_KERNEL);
2024 if (!hellcreek->ds)
2027 hellcreek->ds->dev = dev;
2028 hellcreek->ds->priv = hellcreek;
2029 hellcreek->ds->ops = &hellcreek_ds_ops;
2030 hellcreek->ds->num_ports = hellcreek->pdata->num_ports;
2031 hellcreek->ds->num_tx_queues = HELLCREEK_NUM_EGRESS_QUEUES;
2033 ret = dsa_register_switch(hellcreek->ds);
2039 ret = hellcreek_ptp_setup(hellcreek);
2045 ret = hellcreek_hwtstamp_setup(hellcreek);
2051 platform_set_drvdata(pdev, hellcreek);
2056 hellcreek_ptp_free(hellcreek);
2058 dsa_unregister_switch(hellcreek->ds);
2065 struct hellcreek *hellcreek = platform_get_drvdata(pdev);
2067 if (!hellcreek)
2070 hellcreek_hwtstamp_free(hellcreek);
2071 hellcreek_ptp_free(hellcreek);
2072 dsa_unregister_switch(hellcreek->ds);
2079 struct hellcreek *hellcreek = platform_get_drvdata(pdev);
2081 if (!hellcreek)
2084 dsa_switch_shutdown(hellcreek->ds);
2101 .compatible = "hirschmann,hellcreek-de1soc-r1",
2113 .name = "hellcreek",