All of lore.kernel.org
 help / color / mirror / Atom feed
* bitrot in drivers/net/au1000_eth.c
@ 2005-01-28 14:01 Ulrich Eckhardt
  2005-01-28 17:01 ` Pete Popov
  2005-01-30 11:50 ` Ulrich Eckhardt
  0 siblings, 2 replies; 6+ messages in thread
From: Ulrich Eckhardt @ 2005-01-28 14:01 UTC (permalink / raw)
  To: linux-mips

Hi!

I've been debugging a problem in above mentioned file and found several cases 
of redundant, unused or even buggy code in the handling of the MII there. 
Also, there is a comment that suggests that I'm not the only one: 
 * FIXME
 * All of the PHY code really should be detached from the MAC
 * code.

An important point there is that much of the code is in fact not even specific 
to the au1x00 ethernet adapters. I found driver code for the MII I wanted to 
drive in sis900.c, and it looked almost similar to the code in au1x00.c. 
Simply adding the device/vendor IDs to a map and choosing the first of the 
drivers there got my ethernet running.

Now, question is how to proceed. There are basically three ways I would go:
1. Leave it like it is, because someone else is working on it. I'd just post a 
mini-patch that binds my device to an existing driver.
2. Remove the dead/unused parts from au1x00.c, try to restructure and document 
the code so it is easier to maintain in the future.
3. Split off the MII handling code or, better, reuse the facility already 
provided by drivers/net/mii.c. This would mean a significant rewrite of 
au1x00.c, including probably breaking things on the way.

Uli

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: bitrot in drivers/net/au1000_eth.c
  2005-01-28 14:01 bitrot in drivers/net/au1000_eth.c Ulrich Eckhardt
@ 2005-01-28 17:01 ` Pete Popov
  2005-01-28 17:20   ` Matt Porter
  2005-01-30 11:50 ` Ulrich Eckhardt
  1 sibling, 1 reply; 6+ messages in thread
From: Pete Popov @ 2005-01-28 17:01 UTC (permalink / raw)
  To: Ulrich Eckhardt; +Cc: linux-mips

Ulrich Eckhardt wrote:
> Hi!
> 
> I've been debugging a problem in above mentioned file and found several cases 
> of redundant, unused or even buggy code in the handling of the MII there. 
> Also, there is a comment that suggests that I'm not the only one: 
>  * FIXME
>  * All of the PHY code really should be detached from the MAC
>  * code.

Yes, I put that in over four years ago. There was no mii code at 
all, that I could find, at that time. I wanted to separate the mii 
code out of the mac driver but it never happened.

> An important point there is that much of the code is in fact not even specific 
> to the au1x00 ethernet adapters. I found driver code for the MII I wanted to 
> drive in sis900.c, and it looked almost similar to the code in au1x00.c. 
> Simply adding the device/vendor IDs to a map and choosing the first of the 
> drivers there got my ethernet running.
> 
> Now, question is how to proceed. There are basically three ways I would go:
> 1. Leave it like it is, because someone else is working on it. I'd just post a 
> mini-patch that binds my device to an existing driver.

For 2.6, I was told someone is working on something ...

> 2. Remove the dead/unused parts from au1x00.c, try to restructure and document 
> the code so it is easier to maintain in the future.
> 3. Split off the MII handling code or, better, reuse the facility already 
> provided by drivers/net/mii.c. This would mean a significant rewrite of 
> au1x00.c, including probably breaking things on the way.

That's a possibility too but more code needs to be added to mii.c. I 
actually revisited the code yesterday and was trying to figure out 
how to clean it up. But someone told me that there is 2.6 work in 
progress to do this so I decided to just wait. Maybe someone knows 
more about it.

Pete

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: bitrot in drivers/net/au1000_eth.c
  2005-01-28 17:01 ` Pete Popov
@ 2005-01-28 17:20   ` Matt Porter
  2005-01-28 18:15     ` Pete Popov
  2005-01-29 10:04     ` Ulrich Eckhardt
  0 siblings, 2 replies; 6+ messages in thread
From: Matt Porter @ 2005-01-28 17:20 UTC (permalink / raw)
  To: Pete Popov; +Cc: Ulrich Eckhardt, linux-mips

On Fri, Jan 28, 2005 at 09:01:36AM -0800, Pete Popov wrote:
> Ulrich Eckhardt wrote:

<snip>

> > 3. Split off the MII handling code or, better, reuse the facility already 
> > provided by drivers/net/mii.c. This would mean a significant rewrite of 
> > au1x00.c, including probably breaking things on the way.
> 
> That's a possibility too but more code needs to be added to mii.c. I 
> actually revisited the code yesterday and was trying to figure out 
> how to clean it up. But someone told me that there is 2.6 work in 
> progress to do this so I decided to just wait. Maybe someone knows 
> more about it.

I suggest everyone take a look at the effort posted to netdev:

http://oss.sgi.com/archives/netdev/2004-12/msg00643.html

It's an attempt at a phy abstraction layer that goes the next
logical step after the minimal support provided in mii.h.

It's evolved out of the in-driver abstraction that is currently
used in the sungem, ibm_emac, and gianfar drivers in 2.6. It
was just a matter of time before somebody got tired of copying
the same PHY mgmt bits into every driver. :)

-Matt

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: bitrot in drivers/net/au1000_eth.c
  2005-01-28 17:20   ` Matt Porter
@ 2005-01-28 18:15     ` Pete Popov
  2005-01-29 10:04     ` Ulrich Eckhardt
  1 sibling, 0 replies; 6+ messages in thread
From: Pete Popov @ 2005-01-28 18:15 UTC (permalink / raw)
  To: Matt Porter; +Cc: Ulrich Eckhardt, linux-mips


> I suggest everyone take a look at the effort posted to netdev:
> 
> http://oss.sgi.com/archives/netdev/2004-12/msg00643.html

That's the work Dan told me about. Now we just have to update the 
au1x driver :)

Pete


> It's an attempt at a phy abstraction layer that goes the next
> logical step after the minimal support provided in mii.h.
> 
> It's evolved out of the in-driver abstraction that is currently
> used in the sungem, ibm_emac, and gianfar drivers in 2.6. It
> was just a matter of time before somebody got tired of copying
> the same PHY mgmt bits into every driver. :)
> 
> -Matt
> 
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: bitrot in drivers/net/au1000_eth.c
  2005-01-28 17:20   ` Matt Porter
  2005-01-28 18:15     ` Pete Popov
@ 2005-01-29 10:04     ` Ulrich Eckhardt
  1 sibling, 0 replies; 6+ messages in thread
From: Ulrich Eckhardt @ 2005-01-29 10:04 UTC (permalink / raw)
  To: linux-mips

On Friday 28 January 2005 18:20, Matt Porter wrote:
> I suggest everyone take a look at the effort posted to netdev:
>
> http://oss.sgi.com/archives/netdev/2004-12/msg00643.html
>
> It's an attempt at a phy abstraction layer that goes the next
> logical step after the minimal support provided in mii.h.

Ok, this is a major enhancement to the current ad-hoc MII handling and 
probably the way to go in the future. My main concern is if/when this patch 
will be applied to the kernel, but until then I'll probably stick with the 
current code, keeping it alive as good as possible.

Is anyone aware of the acceptance/state of that patch or have further info?

Uli

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: bitrot in drivers/net/au1000_eth.c
  2005-01-28 14:01 bitrot in drivers/net/au1000_eth.c Ulrich Eckhardt
  2005-01-28 17:01 ` Pete Popov
@ 2005-01-30 11:50 ` Ulrich Eckhardt
  1 sibling, 0 replies; 6+ messages in thread
From: Ulrich Eckhardt @ 2005-01-30 11:50 UTC (permalink / raw)
  To: linux-mips

I received a private reply from Herbert Valerio Riedel with a patch that falls 
into category

> 3. Split off the MII handling code or, better, reuse the facility already
> provided by drivers/net/mii.c. 

with the permission to forward the patch here. Here comes the code and some 
comments by him...

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

there's a nasty bug in the code, which triggers a kernel freeze when
performing MII ioctl's w/ mii-tool on a device which is down;

the following code fixes that, and uses the generic mii ioctl helper in
order to use proven code...

hope it's welcomed or useful :-)


Index: drivers/net/au1000_eth.c
===================================================================
--- drivers/net/au1000_eth.c (revision 25)
+++ drivers/net/au1000_eth.c (working copy)
@@ -91,7 +91,7 @@
 static void au1000_timer(unsigned long);
 static int au1000_ioctl(struct net_device *, struct ifreq *, int);
 static int mdio_read(struct net_device *, int, int);
-static void mdio_write(struct net_device *, int, int, u16);
+static void mdio_write(struct net_device *, int, int, int);
 static void dump_mii(struct net_device *dev, int phy_id);
 
 // externs
@@ -846,7 +846,7 @@
  return (int)*mii_data_reg;
 }
 
-static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 
value)
+static void mdio_write(struct net_device *dev, int phy_id, int reg, int 
value)
 {
  struct au1000_private *aup = (struct au1000_private *) dev->priv;
  volatile u32 *mii_control_reg;
@@ -951,6 +951,10 @@
     aup->phy_ops = mii_chip_table[i].phy_ops;
     aup->phy_ops->phy_init(dev,phy_addr);
 
+    aup->mii_if.phy_id = phy_addr;
+    aup->mii_if.phy_id_mask = 0x1f;    
+    aup->mii_if.reg_num_mask = 0x1f;
+
     // Check for dual-phy and then store required 
     // values and set indicators. We need to do 
     // this now since mdio_{read,write} need the 
@@ -1544,6 +1548,10 @@
  aup->mii->mii_control_reg = 0;
  aup->mii->mii_data_reg = 0;
 
+        aup->mii_if.dev = dev;
+        aup->mii_if.mdio_read = mdio_read;
+        aup->mii_if.mdio_write = mdio_write;
+
  if (mii_probe(dev) != 0) {
   goto err_out;
  }
@@ -1592,6 +1600,7 @@
  dev->tx_timeout = au1000_tx_timeout;
  dev->watchdog_timeo = ETH_TX_TIMEOUT;
 
+
  /* 
   * The boot code uses the ethernet controller, so reset it to start 
   * fresh.  au1000_init() expects that the device is in reset state.
@@ -2127,24 +2136,17 @@
 
 static int au1000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
- struct au1000_private *aup = (struct au1000_private *)dev->priv;
- u16 *data = (u16 *)&rq->ifr_ifru;
+ struct au1000_private *const aup = netdev_priv(dev);
+ int rc;
+ unsigned long flags;
 
- switch(cmd) { 
- case SIOCGMIIPHY:
-  data[0] = aup->phy_addr;
-  /* Fall through */
- case SIOCGMIIREG:
-  data[3] = mdio_read(dev, aup->phy_addr, data[1]);
-  return 0;
- case SIOCSMIIREG:
-  if (!capable(CAP_NET_ADMIN))
-   return -EPERM;
-  mdio_write(dev, aup->phy_addr, data[1], data[2]);
-  return 0;
- default:
-  return -EOPNOTSUPP;
- }
+ if (!netif_running(dev))
+  return -EINVAL;
+
+ spin_lock_irqsave(&aup->lock, flags);
+        rc = generic_mii_ioctl(&aup->mii_if, if_mii(rq), cmd, NULL);
+        spin_unlock_irqrestore(&aup->lock, flags);
+        return rc;
 }
 
 
Index: drivers/net/au1000_eth.h
===================================================================
--- drivers/net/au1000_eth.h (revision 25)
+++ drivers/net/au1000_eth.h (working copy)
@@ -214,6 +214,7 @@
  int mac_id;
  mii_phy_t *mii;
  struct phy_ops *phy_ops;
+ struct mii_if_info mii_if;
  
  /* These variables are just for quick access to certain regs addresses. */
  volatile mac_reg_t *mac;  /* mac registers                      */   
Index: drivers/net/Kconfig
===================================================================
--- drivers/net/Kconfig (revision 25)
+++ drivers/net/Kconfig (working copy)
@@ -467,6 +467,7 @@
  bool "MIPS AU1000 Ethernet support"
  depends on NET_ETHERNET && SOC_AU1X00
  select CRC32
+ select MII
  help
    If you have an Alchemy Semi AU1X00 based system
    say Y.  Otherwise, say N.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-01-30 11:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-28 14:01 bitrot in drivers/net/au1000_eth.c Ulrich Eckhardt
2005-01-28 17:01 ` Pete Popov
2005-01-28 17:20   ` Matt Porter
2005-01-28 18:15     ` Pete Popov
2005-01-29 10:04     ` Ulrich Eckhardt
2005-01-30 11:50 ` Ulrich Eckhardt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.