@@ -142,6 +142,11 @@ int ksz8_reset_switch(struct ksz_device *dev)
142
142
KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET , true);
143
143
ksz_cfg (dev , KSZ8863_REG_SW_RESET ,
144
144
KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET , false);
145
+ } else if (ksz_is_ksz8463 (dev )) {
146
+ ksz_cfg (dev , KSZ8463_REG_SW_RESET ,
147
+ KSZ8463_GLOBAL_SOFTWARE_RESET , true);
148
+ ksz_cfg (dev , KSZ8463_REG_SW_RESET ,
149
+ KSZ8463_GLOBAL_SOFTWARE_RESET , false);
145
150
} else {
146
151
/* reset switch */
147
152
ksz_write8 (dev , REG_POWER_MANAGEMENT_1 ,
@@ -230,6 +235,11 @@ static int ksz8_port_queue_split(struct ksz_device *dev, int port, int queues)
230
235
WEIGHTED_FAIR_QUEUE_ENABLE );
231
236
if (ret )
232
237
return ret ;
238
+ } else if (ksz_is_ksz8463 (dev )) {
239
+ mask_4q = KSZ8873_PORT_4QUEUE_SPLIT_EN ;
240
+ mask_2q = KSZ8873_PORT_2QUEUE_SPLIT_EN ;
241
+ reg_4q = P1CR1 ;
242
+ reg_2q = P1CR1 + 1 ;
233
243
} else {
234
244
mask_4q = KSZ8795_PORT_4QUEUE_SPLIT_EN ;
235
245
mask_2q = KSZ8795_PORT_2QUEUE_SPLIT_EN ;
@@ -1268,19 +1278,24 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
1268
1278
1269
1279
void ksz8_cfg_port_member (struct ksz_device * dev , int port , u8 member )
1270
1280
{
1281
+ int offset = P_MIRROR_CTRL ;
1271
1282
u8 data ;
1272
1283
1273
- ksz_pread8 (dev , port , P_MIRROR_CTRL , & data );
1274
- data &= ~PORT_VLAN_MEMBERSHIP ;
1284
+ if (ksz_is_ksz8463 (dev ))
1285
+ offset = P1CR2 ;
1286
+ ksz_pread8 (dev , port , offset , & data );
1287
+ data &= ~dev -> port_mask ;
1275
1288
data |= (member & dev -> port_mask );
1276
- ksz_pwrite8 (dev , port , P_MIRROR_CTRL , data );
1289
+ ksz_pwrite8 (dev , port , offset , data );
1277
1290
}
1278
1291
1279
1292
void ksz8_flush_dyn_mac_table (struct ksz_device * dev , int port )
1280
1293
{
1281
1294
u8 learn [DSA_MAX_PORTS ];
1282
1295
int first , index , cnt ;
1283
1296
const u16 * regs ;
1297
+ int reg = S_FLUSH_TABLE_CTRL ;
1298
+ int mask = SW_FLUSH_DYN_MAC_TABLE ;
1284
1299
1285
1300
regs = dev -> info -> regs ;
1286
1301
@@ -1298,7 +1313,11 @@ void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
1298
1313
ksz_pwrite8 (dev , index , regs [P_STP_CTRL ],
1299
1314
learn [index ] | PORT_LEARN_DISABLE );
1300
1315
}
1301
- ksz_cfg (dev , S_FLUSH_TABLE_CTRL , SW_FLUSH_DYN_MAC_TABLE , true);
1316
+ if (ksz_is_ksz8463 (dev )) {
1317
+ reg = KSZ8463_FLUSH_TABLE_CTRL ;
1318
+ mask = KSZ8463_FLUSH_DYN_MAC_TABLE ;
1319
+ }
1320
+ ksz_cfg (dev , reg , mask , true);
1302
1321
for (index = first ; index < cnt ; index ++ ) {
1303
1322
if (!(learn [index ] & PORT_LEARN_DISABLE ))
1304
1323
ksz_pwrite8 (dev , index , regs [P_STP_CTRL ], learn [index ]);
@@ -1437,7 +1456,7 @@ int ksz8_fdb_del(struct ksz_device *dev, int port, const unsigned char *addr,
1437
1456
int ksz8_port_vlan_filtering (struct ksz_device * dev , int port , bool flag ,
1438
1457
struct netlink_ext_ack * extack )
1439
1458
{
1440
- if (ksz_is_ksz88x3 (dev ))
1459
+ if (ksz_is_ksz88x3 (dev ) || ksz_is_ksz8463 ( dev ) )
1441
1460
return - ENOTSUPP ;
1442
1461
1443
1462
/* Discard packets with VID not enabled on the switch */
@@ -1453,9 +1472,12 @@ int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag,
1453
1472
1454
1473
static void ksz8_port_enable_pvid (struct ksz_device * dev , int port , bool state )
1455
1474
{
1456
- if (ksz_is_ksz88x3 (dev )) {
1457
- ksz_cfg (dev , REG_SW_INSERT_SRC_PVID ,
1458
- 0x03 << (4 - 2 * port ), state );
1475
+ if (ksz_is_ksz88x3 (dev ) || ksz_is_ksz8463 (dev )) {
1476
+ int reg = REG_SW_INSERT_SRC_PVID ;
1477
+
1478
+ if (ksz_is_ksz8463 (dev ))
1479
+ reg = KSZ8463_REG_SW_CTRL_9 ;
1480
+ ksz_cfg (dev , reg , 0x03 << (4 - 2 * port ), state );
1459
1481
} else {
1460
1482
ksz_pwrite8 (dev , port , REG_PORT_CTRL_12 , state ? 0x0f : 0x00 );
1461
1483
}
@@ -1470,7 +1492,7 @@ int ksz8_port_vlan_add(struct ksz_device *dev, int port,
1470
1492
u16 data , new_pvid = 0 ;
1471
1493
u8 fid , member , valid ;
1472
1494
1473
- if (ksz_is_ksz88x3 (dev ))
1495
+ if (ksz_is_ksz88x3 (dev ) || ksz_is_ksz8463 ( dev ) )
1474
1496
return - ENOTSUPP ;
1475
1497
1476
1498
/* If a VLAN is added with untagged flag different from the
@@ -1539,7 +1561,7 @@ int ksz8_port_vlan_del(struct ksz_device *dev, int port,
1539
1561
u16 data , pvid ;
1540
1562
u8 fid , member , valid ;
1541
1563
1542
- if (ksz_is_ksz88x3 (dev ))
1564
+ if (ksz_is_ksz88x3 (dev ) || ksz_is_ksz8463 ( dev ) )
1543
1565
return - ENOTSUPP ;
1544
1566
1545
1567
ksz_pread16 (dev , port , REG_PORT_CTRL_VID , & pvid );
@@ -1569,19 +1591,23 @@ int ksz8_port_mirror_add(struct ksz_device *dev, int port,
1569
1591
struct dsa_mall_mirror_tc_entry * mirror ,
1570
1592
bool ingress , struct netlink_ext_ack * extack )
1571
1593
{
1594
+ int offset = P_MIRROR_CTRL ;
1595
+
1596
+ if (ksz_is_ksz8463 (dev ))
1597
+ offset = P1CR2 ;
1572
1598
if (ingress ) {
1573
- ksz_port_cfg (dev , port , P_MIRROR_CTRL , PORT_MIRROR_RX , true);
1599
+ ksz_port_cfg (dev , port , offset , PORT_MIRROR_RX , true);
1574
1600
dev -> mirror_rx |= BIT (port );
1575
1601
} else {
1576
- ksz_port_cfg (dev , port , P_MIRROR_CTRL , PORT_MIRROR_TX , true);
1602
+ ksz_port_cfg (dev , port , offset , PORT_MIRROR_TX , true);
1577
1603
dev -> mirror_tx |= BIT (port );
1578
1604
}
1579
1605
1580
- ksz_port_cfg (dev , port , P_MIRROR_CTRL , PORT_MIRROR_SNIFFER , false);
1606
+ ksz_port_cfg (dev , port , offset , PORT_MIRROR_SNIFFER , false);
1581
1607
1582
1608
/* configure mirror port */
1583
1609
if (dev -> mirror_rx || dev -> mirror_tx )
1584
- ksz_port_cfg (dev , mirror -> to_local_port , P_MIRROR_CTRL ,
1610
+ ksz_port_cfg (dev , mirror -> to_local_port , offset ,
1585
1611
PORT_MIRROR_SNIFFER , true);
1586
1612
1587
1613
return 0 ;
@@ -1590,20 +1616,23 @@ int ksz8_port_mirror_add(struct ksz_device *dev, int port,
1590
1616
void ksz8_port_mirror_del (struct ksz_device * dev , int port ,
1591
1617
struct dsa_mall_mirror_tc_entry * mirror )
1592
1618
{
1619
+ int offset = P_MIRROR_CTRL ;
1593
1620
u8 data ;
1594
1621
1622
+ if (ksz_is_ksz8463 (dev ))
1623
+ offset = P1CR2 ;
1595
1624
if (mirror -> ingress ) {
1596
- ksz_port_cfg (dev , port , P_MIRROR_CTRL , PORT_MIRROR_RX , false);
1625
+ ksz_port_cfg (dev , port , offset , PORT_MIRROR_RX , false);
1597
1626
dev -> mirror_rx &= ~BIT (port );
1598
1627
} else {
1599
- ksz_port_cfg (dev , port , P_MIRROR_CTRL , PORT_MIRROR_TX , false);
1628
+ ksz_port_cfg (dev , port , offset , PORT_MIRROR_TX , false);
1600
1629
dev -> mirror_tx &= ~BIT (port );
1601
1630
}
1602
1631
1603
- ksz_pread8 (dev , port , P_MIRROR_CTRL , & data );
1632
+ ksz_pread8 (dev , port , offset , & data );
1604
1633
1605
1634
if (!dev -> mirror_rx && !dev -> mirror_tx )
1606
- ksz_port_cfg (dev , mirror -> to_local_port , P_MIRROR_CTRL ,
1635
+ ksz_port_cfg (dev , mirror -> to_local_port , offset ,
1607
1636
PORT_MIRROR_SNIFFER , false);
1608
1637
}
1609
1638
@@ -1628,17 +1657,24 @@ void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
1628
1657
const u16 * regs = dev -> info -> regs ;
1629
1658
struct dsa_switch * ds = dev -> ds ;
1630
1659
const u32 * masks ;
1660
+ int offset ;
1631
1661
u8 member ;
1632
1662
1633
1663
masks = dev -> info -> masks ;
1634
1664
1635
1665
/* enable broadcast storm limit */
1636
- ksz_port_cfg (dev , port , P_BCAST_STORM_CTRL , PORT_BROADCAST_STORM , true);
1666
+ offset = P_BCAST_STORM_CTRL ;
1667
+ if (ksz_is_ksz8463 (dev ))
1668
+ offset = P1CR1 ;
1669
+ ksz_port_cfg (dev , port , offset , PORT_BROADCAST_STORM , true);
1637
1670
1638
1671
ksz8_port_queue_split (dev , port , dev -> info -> num_tx_queues );
1639
1672
1640
1673
/* replace priority */
1641
- ksz_port_cfg (dev , port , P_802_1P_CTRL ,
1674
+ offset = P_802_1P_CTRL ;
1675
+ if (ksz_is_ksz8463 (dev ))
1676
+ offset = P1CR2 ;
1677
+ ksz_port_cfg (dev , port , offset ,
1642
1678
masks [PORT_802_1P_REMAPPING ], false);
1643
1679
1644
1680
if (cpu_port )
@@ -1904,7 +1940,7 @@ int ksz8_setup(struct dsa_switch *ds)
1904
1940
1905
1941
ksz_cfg (dev , S_MIRROR_CTRL , SW_MIRROR_RX_TX , false);
1906
1942
1907
- if (!ksz_is_ksz88x3 (dev ))
1943
+ if (!ksz_is_ksz88x3 (dev ) && ! ksz_is_ksz8463 ( dev ) )
1908
1944
ksz_cfg (dev , REG_SW_CTRL_19 , SW_INS_TAG_ENABLE , true);
1909
1945
1910
1946
for (i = 0 ; i < (dev -> info -> num_vlans / 4 ); i ++ )
0 commit comments