Source
2461
2461
vsc9953_port_all_vlan_aware_set(1);
2462
2462
vsc9953_port_all_vlan_pvid_set(1);
2463
2463
vsc9953_port_all_vlan_poncnt_set(1);
2464
2464
vsc9953_vlan_table_membership_all_set(1, 1);
2465
2465
vsc9953_vlan_ingr_fltr_learn_drop(1);
2466
2466
vsc9953_port_all_vlan_egress_untagged_set(EGRESS_UNTAG_PVID_AND_ZERO);
2467
2467
if (vsc9953_aggr_code_set(AGGR_CODE_ALL))
2468
2468
debug("VSC9953: failed to set default aggregation code mode\n");
2469
2469
}
2470
2470
2471
+
static void vcap_entry2cache_init(u32 target, u32 entry_words)
2472
+
{
2473
+
int i;
2474
+
2475
+
for (i = 0; i < entry_words; i++) {
2476
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2477
+
VSC9953_VCAP_CACHE_ENTRY_DAT(target, i)), 0x00);
2478
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2479
+
VSC9953_VCAP_CACHE_MASK_DAT(target, i)), 0xFF);
2480
+
}
2481
+
2482
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2483
+
VSC9953_VCAP_CACHE_TG_DAT(target)), 0x00);
2484
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2485
+
VSC9953_VCAP_CFG_MV_CFG(target)),
2486
+
VSC9953_VCAP_CFG_MV_CFG_SIZE(entry_words));
2487
+
}
2488
+
2489
+
static void vcap_action2cache_init(u32 target, u32 action_words,
2490
+
u32 counter_words)
2491
+
{
2492
+
int i;
2493
+
2494
+
for (i = 0; i < action_words; i++)
2495
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2496
+
VSC9953_VCAP_CACHE_ACTION_DAT(target, i)), 0x00);
2497
+
2498
+
for (i = 0; i < counter_words; i++)
2499
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2500
+
VSC9953_VCAP_CACHE_CNT_DAT(target, i)), 0x00);
2501
+
}
2502
+
2503
+
static int vcap_cmd(u32 target, u16 ix, int cmd, int sel, int entry_count)
2504
+
{
2505
+
u32 tgt = target;
2506
+
u32 value = (VSC9953_VCAP_UPDATE_CTRL_UPDATE_CMD(cmd) |
2507
+
VSC9953_VCAP_UPDATE_CTRL_UPDATE_ADDR(ix) |
2508
+
VSC9953_VCAP_UPDATE_CTRL_UPDATE_SHOT);
2509
+
2510
+
if ((sel & TCAM_SEL_ENTRY) && ix >= entry_count)
2511
+
return CMD_RET_FAILURE;
2512
+
2513
+
if (!(sel & TCAM_SEL_ENTRY))
2514
+
value |= VSC9953_VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS;
2515
+
2516
+
if (!(sel & TCAM_SEL_ACTION))
2517
+
value |= VSC9953_VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS;
2518
+
2519
+
if (!(sel & TCAM_SEL_COUNTER))
2520
+
value |= VSC9953_VCAP_UPDATE_CTRL_UPDATE_CNT_DIS;
2521
+
2522
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2523
+
VSC9953_VCAP_CFG_UPDATE_CTRL(tgt)), value);
2524
+
2525
+
do {
2526
+
value = in_le32((unsigned int *)(VSC9953_OFFSET +
2527
+
VSC9953_VCAP_CFG_UPDATE_CTRL(tgt)));
2528
+
2529
+
} while (value & VSC9953_VCAP_UPDATE_CTRL_UPDATE_SHOT);
2530
+
2531
+
return CMD_RET_SUCCESS;
2532
+
}
2533
+
2534
+
static void vsc9953_vcap_init(void)
2535
+
{
2536
+
u32 tgt = VSC9953_ES0;
2537
+
int cmd_ret;
2538
+
2539
+
/* write entries */
2540
+
vcap_entry2cache_init(tgt, ENTRY_WORDS_ES0);
2541
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE, TCAM_SEL_ENTRY,
2542
+
ENTRY_WORDS_ES0);
2543
+
if (cmd_ret != CMD_RET_SUCCESS)
2544
+
debug("VSC9953:%d invalid TCAM_SEL_ENTRY\n",
2545
+
__LINE__);
2546
+
2547
+
/* write actions and counters */
2548
+
vcap_action2cache_init(tgt, BITS_TO_DWORD(ES0_ACT_WIDTH),
2549
+
BITS_TO_DWORD(ES0_CNT_WIDTH));
2550
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2551
+
VSC9953_VCAP_CFG_MV_CFG(tgt)),
2552
+
VSC9953_VCAP_CFG_MV_CFG_SIZE(ES0_ACT_COUNT));
2553
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE,
2554
+
TCAM_SEL_ACTION | TCAM_SEL_COUNTER, ENTRY_WORDS_ES0);
2555
+
if (cmd_ret != CMD_RET_SUCCESS)
2556
+
debug("VSC9953:%d invalid TCAM_SEL_ACTION | TCAM_SEL_COUNTER\n",
2557
+
__LINE__);
2558
+
2559
+
tgt = VSC9953_IS1;
2560
+
2561
+
/* write entries */
2562
+
vcap_entry2cache_init(tgt, ENTRY_WORDS_IS1);
2563
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE, TCAM_SEL_ENTRY,
2564
+
ENTRY_WORDS_IS1);
2565
+
if (cmd_ret != CMD_RET_SUCCESS)
2566
+
debug("VSC9953:%d invalid TCAM_SEL_ENTRY\n",
2567
+
__LINE__);
2568
+
2569
+
/* write actions and counters */
2570
+
vcap_action2cache_init(tgt, BITS_TO_DWORD(IS1_ACT_WIDTH),
2571
+
BITS_TO_DWORD(IS1_CNT_WIDTH));
2572
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2573
+
VSC9953_VCAP_CFG_MV_CFG(tgt)),
2574
+
VSC9953_VCAP_CFG_MV_CFG_SIZE(IS1_ACT_COUNT));
2575
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE,
2576
+
TCAM_SEL_ACTION | TCAM_SEL_COUNTER, ENTRY_WORDS_IS1);
2577
+
if (cmd_ret != CMD_RET_SUCCESS)
2578
+
debug("VSC9953:%d invalid TCAM_SEL_ACTION | TCAM_SEL_COUNTER\n",
2579
+
__LINE__);
2580
+
2581
+
tgt = VSC9953_IS2;
2582
+
2583
+
/* write entries */
2584
+
vcap_entry2cache_init(tgt, ENTRY_WORDS_IS2);
2585
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE, TCAM_SEL_ENTRY,
2586
+
ENTRY_WORDS_IS2);
2587
+
if (cmd_ret != CMD_RET_SUCCESS)
2588
+
debug("VSC9953:%d invalid selection: TCAM_SEL_ENTRY\n",
2589
+
__LINE__);
2590
+
2591
+
/* write actions and counters */
2592
+
vcap_action2cache_init(tgt, BITS_TO_DWORD(IS2_ACT_WIDTH),
2593
+
BITS_TO_DWORD(IS2_CNT_WIDTH));
2594
+
out_le32((unsigned int *)(VSC9953_OFFSET +
2595
+
VSC9953_VCAP_CFG_MV_CFG(tgt)),
2596
+
VSC9953_VCAP_CFG_MV_CFG_SIZE(IS2_ACT_COUNT));
2597
+
cmd_ret = vcap_cmd(tgt, 0, TCAM_CMD_INITIALIZE,
2598
+
TCAM_SEL_ACTION | TCAM_SEL_COUNTER, ENTRY_WORDS_IS2);
2599
+
if (cmd_ret != CMD_RET_SUCCESS)
2600
+
debug("VSC9953:%d invalid TCAM_SEL_ACTION | TCAM_SEL_COUNTER\n",
2601
+
__LINE__);
2602
+
}
2603
+
2471
2604
void vsc9953_init(bd_t *bis)
2472
2605
{
2473
2606
u32 i;
2474
2607
u32 hdx_cfg = 0;
2475
2608
u32 phy_addr = 0;
2476
2609
int timeout;
2477
2610
struct vsc9953_system_reg *l2sys_reg;
2478
2611
struct vsc9953_qsys_reg *l2qsys_reg;
2479
2612
struct vsc9953_dev_gmii *l2dev_gmii_reg;
2480
2613
struct vsc9953_analyzer *l2ana_reg;
2597
2730
2598
2731
timeout = 50000;
2599
2732
while ((vsc9953_mdio_read(&l2dev_gcb->mii_mng[0],
2600
2733
phy_addr, 0x01) & 0x0020) && --timeout)
2601
2734
udelay(1); /* wait for AN to complete */
2602
2735
if (timeout == 0)
2603
2736
debug("Timeout waiting for AN to complete\n");
2604
2737
}
2605
2738
}
2606
2739
2740
+
vsc9953_vcap_init();
2607
2741
vsc9953_default_configuration();
2608
2742
2609
2743
#ifdef CONFIG_CMD_ETHSW
2610
2744
if (ethsw_define_functions(&vsc9953_cmd_func) < 0)
2611
2745
debug("Unable to use \"ethsw\" commands\n");
2612
2746
#endif
2613
2747
2614
2748
printf("VSC9953 L2 switch initialized\n");
2615
2749
return;
2616
2750
}