Commit 73da2ff6 authored by Jeff Garzik's avatar Jeff Garzik

[netdrvr via-rhine] Fix MII phy scanning

Noticed by Roger Luethi, via-rhine maintainer.
parent 1e785100
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
Linux kernel version history: Linux kernel version history:
LK1.1.0: LK1.1.0:
- Jeff Garzik: softnet 'n stuff - Jeff Garzik: softnet 'n stuff
LK1.1.1: LK1.1.1:
- Justin Guyett: softnet and locking fixes - Justin Guyett: softnet and locking fixes
- Jeff Garzik: use PCI interface - Jeff Garzik: use PCI interface
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
LK1.1.6: LK1.1.6:
- Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio) - Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio)
set netif_running_on/off on startup, del_timer_sync set netif_running_on/off on startup, del_timer_sync
LK1.1.7: LK1.1.7:
- Manfred Spraul: added reset into tx_timeout - Manfred Spraul: added reset into tx_timeout
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
LK1.1.13 (jgarzik): LK1.1.13 (jgarzik):
- Add ethtool support - Add ethtool support
- Replace some MII-related magic numbers with constants - Replace some MII-related magic numbers with constants
LK1.1.14 (Ivan G.): LK1.1.14 (Ivan G.):
- fixes comments for Rhine-III - fixes comments for Rhine-III
- removes W_MAX_TIMEOUT (unused) - removes W_MAX_TIMEOUT (unused)
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
- sends chip_id as a parameter to wait_for_reset since np is not - sends chip_id as a parameter to wait_for_reset since np is not
initialized on first call initialized on first call
- changes mmio "else if (chip_id==VT6102)" to "else" so it will work - changes mmio "else if (chip_id==VT6102)" to "else" so it will work
for Rhine-III's (documentation says same bit is correct) for Rhine-III's (documentation says same bit is correct)
- transmit frame queue message is off by one - fixed - transmit frame queue message is off by one - fixed
- adds IntrNormalSummary to "Something Wicked" exclusion list - adds IntrNormalSummary to "Something Wicked" exclusion list
so normal interrupts will not trigger the message (src: Donald Becker) so normal interrupts will not trigger the message (src: Donald Becker)
...@@ -316,10 +316,10 @@ IIId. Synchronization ...@@ -316,10 +316,10 @@ IIId. Synchronization
The driver runs as two independent, single-threaded flows of control. One The driver runs as two independent, single-threaded flows of control. One
is the send-packet routine, which enforces single-threaded use by the is the send-packet routine, which enforces single-threaded use by the
dev->priv->lock spinlock. The other thread is the interrupt handler, which dev->priv->lock spinlock. The other thread is the interrupt handler, which
is single threaded by the hardware and interrupt handling software. is single threaded by the hardware and interrupt handling software.
The send packet thread has partial control over the Tx ring. It locks the The send packet thread has partial control over the Tx ring. It locks the
dev->priv->lock whenever it's queuing a Tx packet. If the next slot in the ring dev->priv->lock whenever it's queuing a Tx packet. If the next slot in the ring
is not available it stops the transmit queue by calling netif_stop_queue. is not available it stops the transmit queue by calling netif_stop_queue.
...@@ -639,7 +639,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev, ...@@ -639,7 +639,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev,
#ifdef USE_MEM #ifdef USE_MEM
long ioaddr0; long ioaddr0;
#endif #endif
/* when built into the kernel, we only print version if device is found */ /* when built into the kernel, we only print version if device is found */
#ifndef MODULE #ifndef MODULE
static int printed_version; static int printed_version;
...@@ -660,7 +660,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev, ...@@ -660,7 +660,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev,
printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n"); printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n");
goto err_out; goto err_out;
} }
/* sanity check */ /* sanity check */
if ((pci_resource_len (pdev, 0) < io_size) || if ((pci_resource_len (pdev, 0) < io_size) ||
(pci_resource_len (pdev, 1) < io_size)) { (pci_resource_len (pdev, 1) < io_size)) {
...@@ -681,7 +681,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev, ...@@ -681,7 +681,7 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev,
} }
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
SET_NETDEV_DEV(dev, &pdev->dev); SET_NETDEV_DEV(dev, &pdev->dev);
if (pci_request_regions(pdev, shortname)) if (pci_request_regions(pdev, shortname))
goto err_out_free_netdev; goto err_out_free_netdev;
...@@ -847,6 +847,8 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev, ...@@ -847,6 +847,8 @@ static int __devinit via_rhine_init_one (struct pci_dev *pdev,
netif_carrier_on(dev); netif_carrier_on(dev);
else else
netif_carrier_off(dev); netif_carrier_off(dev);
break;
} }
} }
np->mii_cnt = phy_idx; np->mii_cnt = phy_idx;
...@@ -891,7 +893,7 @@ static int alloc_ring(struct net_device* dev) ...@@ -891,7 +893,7 @@ static int alloc_ring(struct net_device* dev)
void *ring; void *ring;
dma_addr_t ring_dma; dma_addr_t ring_dma;
ring = pci_alloc_consistent(np->pdev, ring = pci_alloc_consistent(np->pdev,
RX_RING_SIZE * sizeof(struct rx_desc) + RX_RING_SIZE * sizeof(struct rx_desc) +
TX_RING_SIZE * sizeof(struct tx_desc), TX_RING_SIZE * sizeof(struct tx_desc),
&ring_dma); &ring_dma);
...@@ -903,7 +905,7 @@ static int alloc_ring(struct net_device* dev) ...@@ -903,7 +905,7 @@ static int alloc_ring(struct net_device* dev)
np->tx_bufs = pci_alloc_consistent(np->pdev, PKT_BUF_SZ * TX_RING_SIZE, np->tx_bufs = pci_alloc_consistent(np->pdev, PKT_BUF_SZ * TX_RING_SIZE,
&np->tx_bufs_dma); &np->tx_bufs_dma);
if (np->tx_bufs == NULL) { if (np->tx_bufs == NULL) {
pci_free_consistent(np->pdev, pci_free_consistent(np->pdev,
RX_RING_SIZE * sizeof(struct rx_desc) + RX_RING_SIZE * sizeof(struct rx_desc) +
TX_RING_SIZE * sizeof(struct tx_desc), TX_RING_SIZE * sizeof(struct tx_desc),
ring, ring_dma); ring, ring_dma);
...@@ -923,7 +925,7 @@ void free_ring(struct net_device* dev) ...@@ -923,7 +925,7 @@ void free_ring(struct net_device* dev)
{ {
struct netdev_private *np = dev->priv; struct netdev_private *np = dev->priv;
pci_free_consistent(np->pdev, pci_free_consistent(np->pdev,
RX_RING_SIZE * sizeof(struct rx_desc) + RX_RING_SIZE * sizeof(struct rx_desc) +
TX_RING_SIZE * sizeof(struct tx_desc), TX_RING_SIZE * sizeof(struct tx_desc),
np->rx_ring, np->rx_ring_dma); np->rx_ring, np->rx_ring_dma);
...@@ -948,7 +950,7 @@ static void alloc_rbufs(struct net_device *dev) ...@@ -948,7 +950,7 @@ static void alloc_rbufs(struct net_device *dev)
np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
np->rx_head_desc = &np->rx_ring[0]; np->rx_head_desc = &np->rx_ring[0];
next = np->rx_ring_dma; next = np->rx_ring_dma;
/* Init the ring entries */ /* Init the ring entries */
for (i = 0; i < RX_RING_SIZE; i++) { for (i = 0; i < RX_RING_SIZE; i++) {
np->rx_ring[i].rx_status = 0; np->rx_ring[i].rx_status = 0;
...@@ -1151,7 +1153,7 @@ static int via_rhine_open(struct net_device *dev) ...@@ -1151,7 +1153,7 @@ static int via_rhine_open(struct net_device *dev)
if (debug > 1) if (debug > 1)
printk(KERN_DEBUG "%s: via_rhine_open() irq %d.\n", printk(KERN_DEBUG "%s: via_rhine_open() irq %d.\n",
dev->name, np->pdev->irq); dev->name, np->pdev->irq);
i = alloc_ring(dev); i = alloc_ring(dev);
if (i) if (i)
return i; return i;
...@@ -1266,7 +1268,7 @@ static void via_rhine_tx_timeout (struct net_device *dev) ...@@ -1266,7 +1268,7 @@ static void via_rhine_tx_timeout (struct net_device *dev)
/* Reinitialize the hardware. */ /* Reinitialize the hardware. */
wait_for_reset(dev, np->chip_id, dev->name); wait_for_reset(dev, np->chip_id, dev->name);
init_registers(dev); init_registers(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
enable_irq(np->pdev->irq); enable_irq(np->pdev->irq);
...@@ -1316,7 +1318,7 @@ static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev) ...@@ -1316,7 +1318,7 @@ static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
np->tx_ring[entry].addr = cpu_to_le32(np->tx_skbuff_dma[entry]); np->tx_ring[entry].addr = cpu_to_le32(np->tx_skbuff_dma[entry]);
} }
np->tx_ring[entry].desc_length = np->tx_ring[entry].desc_length =
cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
/* lock eth irq */ /* lock eth irq */
...@@ -1364,7 +1366,7 @@ static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_re ...@@ -1364,7 +1366,7 @@ static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_re
int handled = 0; int handled = 0;
ioaddr = dev->base_addr; ioaddr = dev->base_addr;
while ((intr_status = get_intr_status(dev))) { while ((intr_status = get_intr_status(dev))) {
handled = 1; handled = 1;
...@@ -1584,7 +1586,7 @@ static void via_rhine_rx(struct net_device *dev) ...@@ -1584,7 +1586,7 @@ static void via_rhine_rx(struct net_device *dev)
break; /* Better luck next round. */ break; /* Better luck next round. */
skb->dev = dev; /* Mark as being used by this device. */ skb->dev = dev; /* Mark as being used by this device. */
np->rx_skbuff_dma[entry] = np->rx_skbuff_dma[entry] =
pci_map_single(np->pdev, skb->tail, np->rx_buf_sz, pci_map_single(np->pdev, skb->tail, np->rx_buf_sz,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
np->rx_ring[entry].addr = cpu_to_le32(np->rx_skbuff_dma[entry]); np->rx_ring[entry].addr = cpu_to_le32(np->rx_skbuff_dma[entry]);
} }
...@@ -1892,7 +1894,7 @@ static int via_rhine_close(struct net_device *dev) ...@@ -1892,7 +1894,7 @@ static int via_rhine_close(struct net_device *dev)
static void __devexit via_rhine_remove_one (struct pci_dev *pdev) static void __devexit via_rhine_remove_one (struct pci_dev *pdev)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
unregister_netdev(dev); unregister_netdev(dev);
pci_release_regions(pdev); pci_release_regions(pdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment