Re: [PATCH 1/5] forcedeth: restart tx/rx

2008-02-06 Thread Jeff Garzik

Ayaz Abdulla wrote:
This patch fixes the issue where the transmitter and receiver must be 
restarted when applying new changes to certain registers.


Signed-off-by: Ayaz Abdulla <[EMAIL PROTECTED]>


applied


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/5] forcedeth: restart tx/rx

2008-02-05 Thread Ayaz Abdulla
This patch fixes the issue where the transmitter and receiver must be 
restarted when applying new changes to certain registers.


Signed-off-by: Ayaz Abdulla <[EMAIL PROTECTED]>

--- old/drivers/net/forcedeth.c 2008-01-15 17:41:00.0 -0500
+++ new/drivers/net/forcedeth.c 2008-01-15 17:41:02.0 -0500
@@ -624,6 +624,9 @@
 #define NV_MSI_X_VECTOR_TX0x1
 #define NV_MSI_X_VECTOR_OTHER 0x2
 
+#define NV_RESTART_TX 0x1
+#define NV_RESTART_RX 0x2
+
 /* statistics */
 struct nv_ethtool_str {
char name[ETH_GSTRING_LEN];
@@ -2767,6 +2770,7 @@
int mii_status;
int retval = 0;
u32 control_1000, status_1000, phyreg, pause_flags, txreg;
+   u32 txrxFlags = 0;
 
/* BMSR_LSTATUS is latched, read it twice:
 * we want the current value.
@@ -2862,6 +2866,16 @@
np->duplex = newdup;
np->linkspeed = newls;
 
+   /* The transmitter and receiver must be restarted for safe update */
+   if (readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_START) {
+   txrxFlags |= NV_RESTART_TX;
+   nv_stop_tx(dev);
+   }
+   if (readl(base + NvRegReceiverControl) & NVREG_RCVCTL_START) {
+   txrxFlags |= NV_RESTART_RX;
+   nv_stop_rx(dev);
+   }
+
if (np->gigabit == PHY_GIGABIT) {
phyreg = readl(base + NvRegRandomSeed);
phyreg &= ~(0x3FF00);
@@ -2950,6 +2964,11 @@
}
nv_update_pause(dev, pause_flags);
 
+   if (txrxFlags & NV_RESTART_TX)
+   nv_start_tx(dev);
+   if (txrxFlags & NV_RESTART_RX)
+   nv_start_rx(dev);
+
return retval;
 }