Beispiel #1
0
int rtl8367_switch_init_pre(void)
{
	u32 data;
	rtk_api_ret_t retVal;

	data = le32_to_cpu(*(volatile u32 *)(RALINK_REG_GPIOMODE));

	/* Configure I2C pin as GPIO mode or I2C mode */
	if (SMI_SCK == 2 || SMI_SDA == 1)
		data |= RALINK_GPIOMODE_I2C;
	else
		data &= ~RALINK_GPIOMODE_I2C;

	/* Configure MDC/MDIO pin as GPIO mode or MDIO mode */
	if (SMI_SCK == 23 || SMI_SDA == 22)
		data |= RALINK_GPIOMODE_MDIO;
	else
		data &= ~RALINK_GPIOMODE_MDIO;

	*((volatile uint32_t *)(RALINK_REG_GPIOMODE)) = cpu_to_le32(data);

	smi_init(SMI_SCK, SMI_SDA);

	printf("\n Init RTL8367 external switch...");

	/* wait min 200ms after power-on-reset */
	mdelay(200);
	test_smi_signal_and_wait();

	/* main switch init */
	retVal = rtk_switch_init();
	if (retVal != RT_ERR_OK) {
		printf("FAILED! (code: %d)\n", retVal);
		return retVal;
	}

	/* power down all ports (prevent spoofing) */
	rtl8367_port_power(RTL8367_PORT_WAN, 0);
	rtl8367_port_power(RTL8367_PORT_LAN4, 0);
	rtl8367_port_power(RTL8367_PORT_LAN3, 0);
	rtl8367_port_power(RTL8367_PORT_LAN2, 0);
	rtl8367_port_power(RTL8367_PORT_LAN1, 0);

	printf("SUCCESS!\n");

	return RT_ERR_OK;
}
Beispiel #2
0
int
rtl8367r_switch_init_pre()
{
	rtk_api_ret_t retVal;
	unsigned long gpiomode;

	set_mdc_to_gpio_mode();

	smi_reset();	

	// after reset, switch need to delay 1 ms
	// if not, SMI may send out unknown data
	udelay(1000);

	smi_init();

	test_smi_signal_and_wait();

	retVal = rtk_switch_init();
	printf("rtk_switch_init(): return %d\n", retVal);
	if (retVal != RT_ERR_OK) return retVal;

//
// RALINK uses RGMII to connect switch IC directly
// we need to set the MDIO mode here
//
	rtk_port_mac_ability_t mac_cfg;
	mac_cfg.forcemode = MAC_FORCE; 
	mac_cfg.speed = SPD_1000M; 
	mac_cfg.duplex = FULL_DUPLEX; 
	mac_cfg.link = PORT_LINKUP;
	mac_cfg.nway = DISABLED; 
	mac_cfg.txpause = ENABLED; 
	mac_cfg.rxpause = ENABLED; 
	retVal = rtk_port_macForceLinkExt_set (1, MODE_EXT_RGMII,&mac_cfg);
	printf("rtk_port_macForceLinkExt_set(): return %d\n", retVal);	

	int input_txDelay = 1;
	int input_rxDelay = 2;

	printf("input_txDelay:%d, input_rxDelay:%d\n", input_txDelay, input_rxDelay);
	retVal = rtk_port_rgmiiDelayExt_set(1, input_txDelay, input_rxDelay);
	printf("rtk_port_rgmiiDelayExt_set(): return %d\n", retVal);
	

	// power down all LAN ports
	// this is to force DHCP IP address new when PC cable connects to LAN port
	
	rtk_port_phy_data_t pData;
	
	rtk_port_phyReg_get(1, PHY_CONTROL_REG, &pData);
	printf("** rtk_port_phyReg_get = %x\n", pData);		
	pData |= CONTROL_REG_PORT_POWER_BIT;
	rtk_port_phyReg_set(1, PHY_CONTROL_REG, pData);
	
	rtk_port_phyReg_get(2, PHY_CONTROL_REG, &pData);
	printf("** rtk_port_phyReg_get = %x\n", pData);		
	pData |= CONTROL_REG_PORT_POWER_BIT;
	rtk_port_phyReg_set(2, PHY_CONTROL_REG, pData);

	rtk_port_phyReg_get(3, PHY_CONTROL_REG, &pData);
	printf("** rtk_port_phyReg_get = %x\n", pData);		
	pData |= CONTROL_REG_PORT_POWER_BIT;
	rtk_port_phyReg_set(3, PHY_CONTROL_REG, pData);

	rtk_port_phyReg_get(4, PHY_CONTROL_REG, &pData);
	printf("** rtk_port_phyReg_get = %x\n", pData);		
	pData |= CONTROL_REG_PORT_POWER_BIT;
	rtk_port_phyReg_set(4, PHY_CONTROL_REG, pData);

/*
{
int i;
for (i=0; i<8; i++)
{
	rtk_port_phy_data_t pData;
	rtk_port_phyReg_get(i, 1, &pData);
	printf("** %d rtk_port_phyReg_get = %x\n", i, pData); 	
}
}
*/

/*
{
// read EXT MAC status
// seems not works
    rtk_uint32 data;
    rtk_api_ret_t retVal;

    if((retVal = rtl8367b_getAsicReg(0x1305, &data)) != RT_ERR_OK)
    {
        printf("error = %d\n", retVal);
    }
    printf("data = %x\n", data);

	if((retVal = rtl8367b_getAsicReg(0x1311, &data)) != RT_ERR_OK)
	{
		printf("error = %d\n", retVal);
	}
	printf("data = %x\n", data);

//data 1305 = c010
//data 1311 = 1076                
}
*/

	rtl8367r_switch_inited = 1;
	return RT_ERR_OK;
}