Re: [PATCH] forcedeth: sideband management fix

2007-01-08 Thread Jeff Garzik

Ayaz Abdulla wrote:
This patch contains a fix that implements proper communication with the 
sideband management unit. Also, it makes sure that the speed is 
correctly set for gigabit phys in the case where sideband mgmt unit 
initialized the phy. Refer to bug #7684 for more details.


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] forcedeth: sideband management fix

2007-01-03 Thread Ayaz Abdulla
This patch contains a fix that implements proper communication with the 
sideband management unit. Also, it makes sure that the speed is 
correctly set for gigabit phys in the case where sideband mgmt unit 
initialized the phy. Refer to bug #7684 for more details.


Signed-Off-By: Ayaz Abdulla [EMAIL PROTECTED]

--- orig-2.6/drivers/net/forcedeth.c2003-02-20 02:47:09.0 -0500
+++ new-2.6/drivers/net/forcedeth.c 2003-02-20 02:47:18.0 -0500
@@ -234,6 +234,7 @@
 #define NVREG_XMITCTL_HOST_SEMA_MASK   0xf000
 #define NVREG_XMITCTL_HOST_SEMA_ACQ0xf000
 #define NVREG_XMITCTL_HOST_LOADED  0x4000
+#define NVREG_XMITCTL_TX_PATH_EN   0x0100
NvRegTransmitterStatus = 0x088,
 #define NVREG_XMITSTAT_BUSY0x01
 
@@ -249,6 +250,7 @@
 #define NVREG_OFFLOAD_NORMAL   RX_NIC_BUFSIZE
NvRegReceiverControl = 0x094,
 #define NVREG_RCVCTL_START 0x01
+#define NVREG_RCVCTL_RX_PATH_EN0x0100
NvRegReceiverStatus = 0x98,
 #define NVREG_RCVSTAT_BUSY 0x01
 
@@ -1169,16 +1171,21 @@
 {
struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
+   u32 rx_ctrl = readl(base + NvRegReceiverControl);
 
dprintk(KERN_DEBUG %s: nv_start_rx\n, dev-name);
/* Already running? Stop it. */
-   if (readl(base + NvRegReceiverControl)  NVREG_RCVCTL_START) {
-   writel(0, base + NvRegReceiverControl);
+   if ((readl(base + NvRegReceiverControl)  NVREG_RCVCTL_START)  
!np-mac_in_use) {
+   rx_ctrl = ~NVREG_RCVCTL_START;
+   writel(rx_ctrl, base + NvRegReceiverControl);
pci_push(base);
}
writel(np-linkspeed, base + NvRegLinkSpeed);
pci_push(base);
-   writel(NVREG_RCVCTL_START, base + NvRegReceiverControl);
+rx_ctrl |= NVREG_RCVCTL_START;
+if (np-mac_in_use)
+   rx_ctrl = ~NVREG_RCVCTL_RX_PATH_EN;
+   writel(rx_ctrl, base + NvRegReceiverControl);
dprintk(KERN_DEBUG %s: nv_start_rx to duplex %d, speed 0x%08x.\n,
dev-name, np-duplex, np-linkspeed);
pci_push(base);
@@ -1186,39 +1193,59 @@
 
 static void nv_stop_rx(struct net_device *dev)
 {
+   struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
+   u32 rx_ctrl = readl(base + NvRegReceiverControl);
 
dprintk(KERN_DEBUG %s: nv_stop_rx\n, dev-name);
-   writel(0, base + NvRegReceiverControl);
+   if (!np-mac_in_use)
+   rx_ctrl = ~NVREG_RCVCTL_START;
+   else
+   rx_ctrl |= NVREG_RCVCTL_RX_PATH_EN;
+   writel(rx_ctrl, base + NvRegReceiverControl);
reg_delay(dev, NvRegReceiverStatus, NVREG_RCVSTAT_BUSY, 0,
NV_RXSTOP_DELAY1, NV_RXSTOP_DELAY1MAX,
KERN_INFO nv_stop_rx: ReceiverStatus remained busy);
 
udelay(NV_RXSTOP_DELAY2);
-   writel(0, base + NvRegLinkSpeed);
+   if (!np-mac_in_use)
+   writel(0, base + NvRegLinkSpeed);
 }
 
 static void nv_start_tx(struct net_device *dev)
 {
+   struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
+   u32 tx_ctrl = readl(base + NvRegTransmitterControl);
 
dprintk(KERN_DEBUG %s: nv_start_tx\n, dev-name);
-   writel(NVREG_XMITCTL_START, base + NvRegTransmitterControl);
+   tx_ctrl |= NVREG_XMITCTL_START;
+   if (np-mac_in_use)
+   tx_ctrl = ~NVREG_XMITCTL_TX_PATH_EN;
+   writel(tx_ctrl, base + NvRegTransmitterControl);
pci_push(base);
 }
 
 static void nv_stop_tx(struct net_device *dev)
 {
+   struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
+   u32 tx_ctrl = readl(base + NvRegTransmitterControl);
 
dprintk(KERN_DEBUG %s: nv_stop_tx\n, dev-name);
-   writel(0, base + NvRegTransmitterControl);
+   if (!np-mac_in_use)
+   tx_ctrl = ~NVREG_XMITCTL_START;
+   else
+   tx_ctrl |= NVREG_XMITCTL_TX_PATH_EN;
+   writel(tx_ctrl, base + NvRegTransmitterControl);
reg_delay(dev, NvRegTransmitterStatus, NVREG_XMITSTAT_BUSY, 0,
NV_TXSTOP_DELAY1, NV_TXSTOP_DELAY1MAX,
KERN_INFO nv_stop_tx: TransmitterStatus remained 
busy);
 
udelay(NV_TXSTOP_DELAY2);
-   writel(readl(base + NvRegTransmitPoll)  
NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll);
+   if (!np-mac_in_use)
+   writel(readl(base + NvRegTransmitPoll)  
NVREG_TRANSMITPOLL_MAC_ADDR_REV,
+  base + NvRegTransmitPoll);
 }
 
 static void nv_txrx_reset(struct net_device *dev)
@@ -4146,20 +4173,6 @@
return 0;
 }
 
-/* Indicate to mgmt unit whether driver is loaded or not */
-static void nv_mgmt_driver_loaded(struct net_device *dev, int loaded)
-{
-   u8 __iomem *base = get_hwbase(dev);
-   u32 tx_ctrl;
-
-   tx_ctrl = readl(base + NvRegTransmitterControl);
-