public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Ben Warren <biggerbadderben@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] TSEC Ethernet driver patch - RFC
Date: Tue, 15 Jan 2008 10:36:04 -0500	[thread overview]
Message-ID: <478CD2E4.3070709@gmail.com> (raw)
In-Reply-To: <36D7B34A3A79F84F82FA0C154F299F250668BE7C@E03MVX1-UKDY.domain1.systemhost.net>

michael.firth at bt.com wrote:
>> -----Original Message-----
>> From: u-boot-users-bounces at lists.sourceforge.net 
>> [mailto:u-boot-users-bounces at lists.sourceforge.net] On Behalf 
>> Of michael.firth at bt.com
>> Sent: 09 January 2008 20:26
>> To: biggerbadderben at gmail.com
>> Cc: u-boot-users at lists.sourceforge.net
>> Subject: Re: [U-Boot-Users] TSEC Ethernet driver patch - RFC
>>
>>
>>     
>>> -----Original Message-----
>>> From: Ben Warren [mailto:biggerbadderben at gmail.com]
>>> Sent: 08 January 2008 16:42
>>> To: Firth,MJC,Michael,DMM R
>>> Cc: u-boot-users at lists.sourceforge.net
>>> Subject: Re: [U-Boot-Users] Possible TSEC Ethernet driver patch
>>>
>>> michael.firth at bt.com wrote:
>>>       
>>>> While debugging a board recently I found that the MDIO
>>>>         
>>> (mii) command
>>>       
>>>> support in the TSEC Ethernet driver is somewhat unhelpful.
>>>>
>>>> Currently, even though there is a comment in the code that
>>>>         
>>> "For now,
>>>       
>>>> only TSEC1 (index 0) has access to the PHYs, so all of 
>>>>         
>> the entries 
>>     
>>>> have '0'", all MDIO commands are processed by searching 
>>>>         
>> for a TSEC 
>>     
>>>> instance that has the requested MDIO address associated
>>>>         
>>> with it, and
>>>       
>>>> then using that instance to run the command, even though,
>>>>         
>>> because of
>>>       
>>>> the aforementioned comment, all instances process MDIO commands 
>>>> through the same port.
>>>>
>>>> This means that it is only possible to communicate with
>>>>         
>>> MDIO addresses
>>>       
>>>> that have a TSEC instance associated with them, even though the 
>>>> hardware is capable of accessing any address. It also means
>>>>         
>>> that there
>>>       
>>>> is a list search that isn't needed.
>>>>
>>>> I have patched the 1.3.1 U-Boot code to remove this 
>>>>         
>> search, and to 
>>     
>>>> interrogate the requested PHY directly. This means that it
>>>>         
>>> is possible
>>>       
>>>> to directly access all 32 PHY addresses.
>>>>
>>>> Is this a change that would be more generally useful to 
>>>>         
>> the U-Boot 
>>     
>>>> community, and, if so, how should I submit a more general 
>>>>         
>> patch for 
>>     
>>>> this?
>>>>
>>>>   
>>>>         
>>> Why don't you post what you have, clearly label it as 'RFC' 
>>> and we'll have a look. In my spare time (very spare indeed) 
>>>       
>> I'm trying 
>>     
>>> to decouple PHYs from MACs, but time is hard to find and meanwhile 
>>> things need to work.
>>>
>>> regards,
>>> Ben
>>>
>>>       
>> Patch below.
>>
>> The main area I wasn't sure on how to handle was how to 
>> replace the other calls to 'read_phy_reg' and 'write_phy_reg' 
>> in the code. Currently I've used a #define to map these on to 
>> the modified functions that take the phy address as a parameter.
>>
>> --- u-boot-1.3.1-orig/drivers/net/tsec.c	2007-12-06
>> 09:21:19.000000000 +0000
>> +++ u-boot-1.3.1/drivers/net/tsec.c	2008-01-09 20:19:36.000000000
>> +0000
>> @@ -241,10 +244,9 @@
>>   * It will wait for the write to be done (or for a timeout to
>>   * expire) before exiting
>>   */
>> -void write_phy_reg(struct tsec_private *priv, uint regnum, 
>> uint value)
>> +void write_any_phy_reg(struct tsec_private *priv, uint phyid, uint
>> regnum, uint value)
>>  {
>>  	volatile tsec_t *regbase = priv->phyregs;
>> -	uint phyid = priv->phyaddr;
>>  	int timeout = 1000000;
>>  
>>  	regbase->miimadd = (phyid << 8) | regnum; @@ -255,17 +257,19 @@
>>  	while ((regbase->miimind & MIIMIND_BUSY) && timeout--) ;  }
>>  
>> +/* #define to provide old write_phy_reg functionality without
>> duplicating code */
>> +#define write_phy_reg(priv, regnum, value)
>> write_any_phy_reg(priv,priv->phyaddr,regnum,value)
>> +
>>  /* Reads register regnum on the device's PHY through the
>>   * registers specified in priv.	 It lowers and raises the read
>>   * command, and waits for the data to become valid (miimind
>>   * notvalid bit cleared), and the bus to cease activity (miimind
>>   * busy bit cleared), and then returns the value
>>   */
>> -uint read_phy_reg(struct tsec_private *priv, uint regnum)
>> +uint read_any_phy_reg(struct tsec_private *priv, uint phyid, uint
>> regnum)
>>  {
>>  	uint value;
>>  	volatile tsec_t *regbase = priv->phyregs;
>> -	uint phyid = priv->phyaddr;
>>  
>>  	/* Put the address of the phy, and the register
>>  	 * number into MIIMADD */
>> @@ -288,6 +292,9 @@
>>  	return value;
>>  }
>>  
>> +/* #define to provide old read_phy_reg functionality without
>> duplicating code */
>> +#define read_phy_reg(priv,regnum)
>> read_any_phy_reg(priv,priv->phyaddr,regnum)
>> +
>>  /* Discover which PHY is attached to the device, and configure it
>>   * properly.  If the PHY is not recognized, then return 0
>>   * (failure).  Otherwise, return 1
>> @@ -1487,18 +1494,6 @@
>>  #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) \
>>  	&& !defined(BITBANGMII)
>>  
>> -struct tsec_private *get_priv_for_phy(unsigned char phyaddr) -{
>> -	int i;
>> -
>> -	for (i = 0; i < MAXCONTROLLERS; i++) {
>> -		if (privlist[i]->phyaddr == phyaddr)
>> -			return privlist[i];
>> -	}
>> -
>> -	return NULL;
>> -}
>> -
>>  /*
>>   * Read a MII PHY register.
>>   *
>> @@ -1509,14 +1504,14 @@
>>  			    unsigned char reg, unsigned short *value)  {
>>  	unsigned short ret;
>> -	struct tsec_private *priv = get_priv_for_phy(addr);
>> +	struct tsec_private *priv = privlist[0];
>>  
>>  	if (NULL == priv) {
>>  		printf("Can't read PHY at address %d\n", addr);
>>  		return -1;
>>  	}
>>  
>> -	ret = (unsigned short)read_phy_reg(priv, reg);
>> +	ret = (unsigned short)read_any_phy_reg(priv, addr, reg);
>>  	*value = ret;
>>  
>>  	return 0;
>> @@ -1531,14 +1526,14 @@
>>  static int tsec_miiphy_write(char *devname, unsigned char addr,
>>  			     unsigned char reg, unsigned short value)  {
>> -	struct tsec_private *priv = get_priv_for_phy(addr);
>> +	struct tsec_private *priv = privlist[0];
>>  
>>  	if (NULL == priv) {
>>  		printf("Can't write PHY at address %d\n", addr);
>>  		return -1;
>>  	}
>>  
>> -	write_phy_reg(priv, reg, value);
>> +	write_any_phy_reg(priv, addr, reg, value);
>>  
>>  	return 0;
>>  }
>>
>> Signed-off-by: Michael Firth <michael.firth@bt.com>
>>
>>     
> Does the lack of comments on this mean that people are happy with it, 
> or that they haven't had a chance to consider it yet?
>
>   
More the latter than the former, I'm afraid.  I'll hopefully have a look 
today.

regards,
Ben

  parent reply	other threads:[~2008-01-15 15:36 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-08 16:18 [U-Boot-Users] Possible TSEC Ethernet driver patch michael.firth at bt.com
2008-01-08 16:42 ` Ben Warren
2008-01-09 20:26   ` [U-Boot-Users] TSEC Ethernet driver patch - RFC michael.firth at bt.com
2008-01-15  9:59     ` michael.firth at bt.com
2008-01-15 13:03       ` David Saada
2008-01-15 15:36       ` Ben Warren [this message]
2008-01-15 16:56     ` Andy Fleming
2008-01-15 21:14       ` michael.firth at bt.com
2008-01-16  3:48         ` Ben Warren
2008-01-08 16:48 ` [U-Boot-Users] Possible TSEC Ethernet driver patch David Saada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=478CD2E4.3070709@gmail.com \
    --to=biggerbadderben@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox