powerpc/85xx: fix null pointer dereference when init the SGMII TBI PHY
Function dtsec_configure_serdes() needs to know where the TBI PHY registers are in order to configure SGMII for proper SerDes operation. During SGMII initialzation, fm_eth_init_mac() passing NULL for 'phyregs' when it called init_dtsec(), because it was believed that phyregs was not used. In fact, it is used by dtsec_configure_serdes() to configure the TBI PHY registers. We also need to define the PHY registers in struct fm_mdio. Signed-off-by: Timur Tabi <timur@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
parent
712cf7ab0b
commit
3038171628
|
@ -405,7 +405,14 @@ typedef struct fm_dtesc {
|
|||
} fm_dtsec_t;
|
||||
|
||||
typedef struct fm_mdio {
|
||||
u8 res[4*1024];
|
||||
u8 res0[0x120];
|
||||
u32 miimcfg; /* MII management configuration reg */
|
||||
u32 miimcom; /* MII management command reg */
|
||||
u32 miimadd; /* MII management address reg */
|
||||
u32 miimcon; /* MII management control reg */
|
||||
u32 miimstat; /* MII management status reg */
|
||||
u32 miimind; /* MII management indication reg */
|
||||
u8 res1[0x1000 - 0x138];
|
||||
} fm_mdio_t;
|
||||
|
||||
typedef struct fm_10gec {
|
||||
|
|
|
@ -171,7 +171,7 @@ void init_dtsec(struct fsl_enet_mac *mac, void *base,
|
|||
void *phyregs, int max_rx_len)
|
||||
{
|
||||
mac->base = base;
|
||||
mac->phyregs = NULL;
|
||||
mac->phyregs = phyregs;
|
||||
mac->max_rx_len = max_rx_len;
|
||||
mac->init_mac = dtsec_init_mac;
|
||||
mac->enable_mac = dtsec_enable_mac;
|
||||
|
|
|
@ -537,6 +537,7 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg)
|
|||
/* Get the mac registers base address */
|
||||
if (fm_eth->type == FM_ETH_1G_E) {
|
||||
base = ®->mac_1g[num].fm_dtesc;
|
||||
phyregs = ®->mac_1g[num].fm_mdio.miimcfg;
|
||||
} else {
|
||||
base = ®->mac_10g[num].fm_10gec;
|
||||
phyregs = ®->mac_10g[num].fm_10gec_mdio;
|
||||
|
@ -552,7 +553,7 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg)
|
|||
fm_eth->mac = mac;
|
||||
|
||||
if (fm_eth->type == FM_ETH_1G_E)
|
||||
init_dtsec(mac, base, NULL, MAX_RXBUF_LEN);
|
||||
init_dtsec(mac, base, phyregs, MAX_RXBUF_LEN);
|
||||
else
|
||||
init_tgec(mac, base, phyregs, MAX_RXBUF_LEN);
|
||||
|
||||
|
|
Loading…
Reference in New Issue