QE UEC: Add MII Commands
PATCH 1/1 QE UEC: Add MII Commands
Add MII commands to the UEC driver. Note that once a UEC device is selected, any device on its MDIO bus can be addressed.
drivers/qe/uec.c +53 -0
@@ -29,6 +29,7 @@#include "uccf.h" #include "uec.h" #include "uec_phy.h" +#include "miiphy.h" #if defined(CONFIG_QE )
@@ -88,6 +89,17 @@ static uec_info_t eth3_uec_info = { };#endif +#define MAXCONTROLLERS (4) + +static struct eth_device *devlist[MAXCONTROLLERS ]; + +static int uec_miiphy_read (char *devname,unsigned char addr, +unsigned char reg,unsigned short *value); +static int uec_miiphy_write (char *devname,unsigned char addr, +unsigned char reg,unsigned short value); +u16 phy_read (struct uec_mii_info *mii_info,u16 regnum); +void phy_write (struct uec_mii_info *mii_info,u16 regnum,u16 val); +static int uec_mac_enable (uec_private_t *uec,comm_dir_e mode) {uec_t *uec_regs;
@@ -1267,6 +1279,8 @@ int uec_initialize(int index)return -EINVAL ; } + devlist[index] = dev; + uec->uec_info = uec_info;sprintf (dev->name,"FSL UEC%d" , index);
@@ -1297,6 +1311,45 @@ int uec_initialize(int index)phy_change (dev); +#if defined(CONFIG_MII ) || defined(CONFIG_CMD_MII ) \ + && !defined(BITBANGMII ) +miiphy_register (dev->name, uec_miiphy_read, uec_miiphy_write); +#endif + return 1; } + +#if defined(CONFIG_MII ) || defined(CONFIG_CMD_MII ) \ + && !defined(BITBANGMII ) + +/* +* Read a MII PHY register. +* +* Returns: +* 0 on success +*/ +static int uec_miiphy_read (char *devname,unsigned char addr, +unsigned char reg,unsigned short *value) +{ + *value =uec_read_phy_reg (devlist[0 ], addr, reg); + +return 0 ; +} + +/* +* Write a MII PHY register. +* +* Returns: +* 0 on success +*/ +static int uec_miiphy_write (char *devname,unsigned char addr, +unsigned char reg,unsigned short value) +{ +uec_write_phy_reg (devlist[0 ], addr, reg, value); + +return 0 ; +} + +#endif +#endif /* CONFIG_QE */
PATCH 1/1 QE UEC: Add MII Commands
Hi David,
Quoted 3 lines · David Saada
Add MII commands to the UEC driver. Note that once a UEC device is selected, any device on its MDIO bus can be addressed.
Long ago I did something like that too (quite useful for playing with MII registers ;-).
Though, I've done it in different way: I modified miiphyutil.c's miiphy_register() to accept eth_device instead of device name, thus no need of devlist hack in the UEC driver...
Unfortunately I didn't find time to convert every user of the miiphy_register() and submit the patch. So.. while you're at it, maybe something like this would be better approach?
common/miiphyutil.c +10 -7
@@ -48,10 +48,11 @@struct mii_dev {struct list_head link; +struct eth_device *edev;char *name; -int (*read) (char *devname,unsigned char addr, +int (*read) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short *value); -int (*write) (char *devname,unsigned char addr, +int (*write) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short value); };
@@ -72,12 +73,13 @@ void miiphy_init ()* * Register read and write MII access routines for the device <name>. */ -void miiphy_register (char *name, -int (*read) (char *devname,unsigned char addr, +void miiphy_register (struct eth_device *edev, +int (*read) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short *value), -int (*write) (char *devname,unsigned char addr, +int (*write) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short value)) { +char *name = edev->name;struct list_head *entry;struct mii_dev *new_dev;struct mii_dev *miidev;
@@ -109,6 +111,7 @@ void miiphy_register (char *name,INIT_LIST_HEAD (&new_dev->link); new_dev->read = read; new_dev->write = write; + new_dev->edev = edev; new_dev->name = (char *)(new_dev +1 );strncpy (new_dev->name, name, name_len); new_dev->name[name_len] ='\0' ;
@@ -175,7 +178,7 @@ int miiphy_read (char *devname, unsigned char addr, unsigned char reg,if (strcmp (devname, dev->name) ==0 ) { found_dev =1 ; - read_ret = dev->read (devname, addr, reg, value); + read_ret = dev->read (dev->edev, addr, reg, value);break ; } }
@@ -212,7 +215,7 @@ int miiphy_write (char *devname, unsigned char addr, unsigned char reg,if (strcmp (devname, dev->name) ==0 ) { found_dev =1 ; - write_ret = dev->write (devname, addr, reg, value); + write_ret = dev->write (dev->edev, addr, reg, value);break ; } }
drivers/qe/uec.c +3 -0
@@ -1296,6 +1296,9 @@ int uec_initialize(int index)phy_change (dev); +if (index ==1 ) +uec_mmiphy_register (dev); + return 1; }#endif /* CONFIG_QE */
drivers/qe/uec_phy.c +24 -0
@@ -681,4 +681,28 @@ void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode)marvell_phy_interface_mode (dev, mode); #endif } + + +#if defined(CONFIG_MII ) || defined(CONFIG_CMD_MII ) \ + && !defined(BITBANGMII ) +static int uec_miiphy_read (struct eth_device *dev,unsigned char addr, +unsigned char reg,unsigned short *value) +{ + *value =uec_read_phy_reg (dev, addr, reg); +return 0 ; +} + +static int uec_miiphy_write (struct eth_device *dev,unsigned char addr, +unsigned char reg,unsigned short value) +{ +uec_write_phy_reg (dev, addr, reg, value); +return 0 ; +} + +void uec_mmiphy_register (struct eth_device *dev) +{ +miiphy_register (dev, uec_miiphy_read, uec_miiphy_write); +} +#endif +#endif /* CONFIG_QE */
drivers/qe/uec_phy.h +1 -0
@@ -261,4 +261,5 @@ int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum);void mii_clear_phy_interrupt (struct uec_mii_info *mii_info);void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,u32 interrupts); +void uec_mmiphy_register (struct eth_device *dev);#endif /* __UEC_PHY_H__ */
include/miiphy.h +3 -3
@@ -48,10 +48,10 @@ int miiphy_link (char *devname, unsigned char addr);void miiphy_init (void ); -void miiphy_register (char *devname, -int (*read) (char *devname,unsigned char addr, +void miiphy_register (struct eth_device *edev, +int (*read) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short *value), -int (*write) (char *devname,unsigned char addr, +int (*write) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short value));int miiphy_set_current_dev (char *devname);
PATCH 1/1 QE UEC: Add MII Commands
Quoted 38 lines
Hi David,
Quoted 3 lines · David Saada
Add MII commands to the UEC driver. Note that once a UEC device is selected, any device on its MDIO bus can be addressed.
Long ago I did something like that too (quite useful for playing with MII registers ;-).
Though, I've done it in different way: I modified miiphyutil.c's
miiphy_register()to accepteth_deviceinstead of device name, thus no need of devlist hack in the UEC driver...Unfortunately I didn't find time to convert every user of the
miiphy_register()and submit the patch. So.. while you're at it, maybe something like this would be better approach?common/miiphyutil.c +3
-2@@ -48,10 +48,11 @@struct mii_dev {struct list_head link; +struct eth_device *edev;char *name; -int (*read) (char *devname,unsigned char addr, +int (*read) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short *value); -int (*write) (char *devname,unsigned char addr, +int (*write) (struct eth_device *edev,unsigned char addr,unsigned char reg,unsigned short value); };
common/miiphyutil.c void miiphy_init () · line 77
Quoted 7 lines
common/miiphyutil.c +2
-2@@ -72,12 +73,13 @@ void miiphy_init ()* * Register read and write MII access routines for the device <name>. */ -void miiphy_register (char *name, - int (*read) (char *devname, unsigned char addr, +void miiphy_register (struct eth_device *edev, + int (*read) (struct eth_device *edev, unsigned
char
common/miiphyutil.c void miiphy_init () · line 79
Quoted 2 lines
common/miiphyutil.c +0
-0addr, unsigned char reg, unsigned short
*value),
common/miiphyutil.c void miiphy_init () · line 80
Quoted 2 lines
common/miiphyutil.c +1
-1- int (*write) (char *devname, unsigned char addr, + int (*write) (struct eth_device *edev, unsigned
char
common/miiphyutil.c void miiphy_init () · line 82
Quoted 2 lines
common/miiphyutil.c +0
-0addr, unsigned char reg, unsigned short
value))
common/miiphyutil.c int miiphy_read (char *devname, unsigned char
Quoted 14 lines
common/miiphyutil.c +1
-0{ +char *name = edev->name;struct list_head *entry;common/miiphyutil.c +1
-0struct mii_dev *new_dev;struct mii_dev *miidev;@@ -109,6 +111,7 @@ void miiphy_register (char *name,INIT_LIST_HEAD (&new_dev->link); new_dev->read = read; new_dev->write = write; + new_dev->edev = edev; new_dev->name = (char *)(new_dev +1 );strncpy (new_dev->name, name, name_len); new_dev->name[name_len] ='\0' ;@@ -175,7 +178,7 @@ int miiphy_read (char *devname, unsigned char
addr,
common/miiphyutil.c int miiphy_read (char *devname, unsigned char addr, unsigned char reg,
Quoted 5 lines
common/miiphyutil.c +0
-1unsigned char reg, if (strcmp (devname, dev->name) == 0) { found_dev =1 ; - read_ret = dev->read (devname, addr, reg,
value);
common/miiphyutil.c int miiphy_read (char *devname, unsigned char · line 182
Quoted 1 line
common/miiphyutil.c +1
-0+ read_ret = dev->read (dev->edev, addr, reg,
value);
common/miiphyutil.c int miiphy_write (char *devname, unsigned char
Quoted 4 lines
common/miiphyutil.c +0
-0break ; }common/miiphyutil.c +0
-0}@@ -212,7 +215,7 @@ int miiphy_write (char *devname, unsigned char
addr,
common/miiphyutil.c int miiphy_read (char *devname, unsigned char addr, unsigned char reg,
Quoted 5 lines
common/miiphyutil.c +0
-1unsigned char reg, if (strcmp (devname, dev->name) == 0) { found_dev =1 ; - write_ret = dev->write (devname, addr, reg,
value);
common/miiphyutil.c int miiphy_write (char *devname, unsigned char · line 219
Quoted 1 line
common/miiphyutil.c +1
-0+ write_ret = dev->write (dev->edev, addr, reg,
value);
Quoted 22 lines
common/miiphyutil.c +0
-0break ; }common/miiphyutil.c +0
-0}drivers/qe/uec.c +3
-0@@ -1296,6 +1296,9 @@ int uec_initialize(int index)phy_change (dev); +if (index ==1 ) +uec_mmiphy_register (dev); + return 1; }#endif /* CONFIG_QE */ drivers/qe/uec_phy.c +0
-0
drivers/qe/uec_phy.c void change_phy_interface_mode (struct eth_device · line 689
Quoted 9 lines
drivers/qe/uec_phy.c +5
-0@@ -681,4 +681,28 @@ void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode)marvell_phy_interface_mode (dev, mode);#endif } + + +#if defined(CONFIG_MII ) || defined(CONFIG_CMD_MII ) \ + && !defined(BITBANGMII ) +static int uec_miiphy_read(struct eth_device *dev, unsigned char
addr,
drivers/qe/uec_phy.c void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode)
Quoted 7 lines
drivers/qe/uec_phy.c +7
-0+ unsigned char reg, unsigned short *value) +{ + *value =uec_read_phy_reg (dev, addr, reg); +return 0 ; +} + +static int uec_miiphy_write(struct eth_device *dev, unsigned char
addr,
include/miiphy.h int miiphy_link (char *devname, unsigned char
Quoted 29 lines
drivers/qe/uec_phy.c +12
-0+ unsigned char reg, unsigned short value) +{ +uec_write_phy_reg (dev ,addr ,reg ,value ); +return 0 ; +} + +void uec_mmiphy_register (struct eth_device *dev) +{ +miiphy_register (dev, uec_miiphy_read, uec_miiphy_write); +} +#endif +#endif /*
CONFIG_QE*/drivers/qe/uec_phy.h +1
-0@@ -261,4 +261,5 @@ int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum);void mii_clear_phy_interrupt (struct uec_mii_info *mii_info);void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,u32 interrupts); +void uec_mmiphy_register (struct eth_device *dev);#endif /*
__UEC_PHY_H__*/include/miiphy.h +0
-0@@ -48,10 +48,10 @@ int miiphy_link (char *devname, unsigned char
addr);
include/miiphy.h int miiphy_link (char *devname, unsigned char addr);
Quoted 7 lines
include/miiphy.h +2
-2void miiphy_init (void ); -void miiphy_register (char *devname, - int (*read) (char *devname, unsigned char addr, +void miiphy_register (struct eth_device *edev, + int (*read) (struct eth_device *edev, unsigned
char
include/miiphy.h int miiphy_link (char *devname, unsigned char · line 53
Quoted 2 lines
include/miiphy.h +0
-0addr, unsigned char reg, unsigned short
*value),
include/miiphy.h int miiphy_link (char *devname, unsigned char · line 54
Quoted 2 lines
include/miiphy.h +1
-1- int (*write) (char *devname, unsigned char addr, + int (*write) (struct eth_device *edev, unsigned
char
include/miiphy.h int miiphy_link (char *devname, unsigned char · line 56
Quoted 2 lines
include/miiphy.h +0
-0addr, unsigned char reg, unsigned short
value));
include/miiphy.h int miiphy_link (char *devname, unsigned char addr); · line 57
Quoted 2 lines
include/miiphy.h +0
-0int miiphy_set_current_dev (char *devname);
Hi Anton,
Your approach is better of course, as it deals with this problem in a more structural way than mine. However, there are talks about a more general PHY library coming our way, and I suggest whoever implements it (likely Ben) to consider including your patch there.
David.