Commit f6b765c0 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://gkernel.bkbits.net/net-drivers-2.5

into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux
parents 078f18a9 03789917
/* 8139cp.c: A Linux PCI Ethernet driver for the RealTek 8139C+ chips. */ /* 8139cp.c: A Linux PCI Ethernet driver for the RealTek 8139C+ chips. */
/* /*
Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com> Copyright 2001,2002 Jeff Garzik <jgarzik@mandrakesoft.com>
Copyright (C) 2000, 2001 David S. Miller (davem@redhat.com) [sungem.c] Copyright (C) 2000, 2001 David S. Miller (davem@redhat.com) [sungem.c]
Copyright 2001 Manfred Spraul [natsemi.c] Copyright 2001 Manfred Spraul [natsemi.c]
...@@ -32,19 +32,20 @@ ...@@ -32,19 +32,20 @@
* Rx checksumming * Rx checksumming
* Tx checksumming * Tx checksumming
* ETHTOOL_GREGS, ETHTOOL_[GS]WOL, * ETHTOOL_GREGS, ETHTOOL_[GS]WOL,
* Jumbo frames / dev->change_mtu
* Investigate using skb->priority with h/w VLAN priority * Investigate using skb->priority with h/w VLAN priority
* Investigate using High Priority Tx Queue with skb->priority * Investigate using High Priority Tx Queue with skb->priority
* Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error * Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error
* Adjust Tx FIFO threshold and Max Tx DMA burst on Tx FIFO error * Adjust Tx FIFO threshold and Max Tx DMA burst on Tx FIFO error
* Implement Tx software interrupt mitigation via * Implement Tx software interrupt mitigation via
Tx descriptor bit Tx descriptor bit
* Determine correct value for CP_{MIN,MAX}_MTU, instead of
using conservative guesses.
*/ */
#define DRV_NAME "8139cp" #define DRV_NAME "8139cp"
#define DRV_VERSION "0.0.6cvs" #define DRV_VERSION "0.0.7"
#define DRV_RELDATE "Nov 19, 2001" #define DRV_RELDATE "Feb 27, 2002"
#include <linux/module.h> #include <linux/module.h>
...@@ -55,7 +56,6 @@ ...@@ -55,7 +56,6 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/crc32.h>
#include <linux/mii.h> #include <linux/mii.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -109,6 +109,9 @@ MODULE_PARM_DESC (multicast_filter_limit, "8139cp maximum number of filtered mul ...@@ -109,6 +109,9 @@ MODULE_PARM_DESC (multicast_filter_limit, "8139cp maximum number of filtered mul
/* Time in jiffies before concluding the transmitter is hung. */ /* Time in jiffies before concluding the transmitter is hung. */
#define TX_TIMEOUT (6*HZ) #define TX_TIMEOUT (6*HZ)
/* hardware minimum and maximum for a single frame's data payload */
#define CP_MIN_MTU 60 /* FIXME: this is a guess */
#define CP_MAX_MTU 1500 /* FIXME: this is a guess */
enum { enum {
/* NIC register offsets */ /* NIC register offsets */
...@@ -321,6 +324,17 @@ static struct pci_device_id cp_pci_tbl[] __devinitdata = { ...@@ -321,6 +324,17 @@ static struct pci_device_id cp_pci_tbl[] __devinitdata = {
}; };
MODULE_DEVICE_TABLE(pci, cp_pci_tbl); MODULE_DEVICE_TABLE(pci, cp_pci_tbl);
static inline void cp_set_rxbufsize (struct cp_private *cp)
{
unsigned int mtu = cp->dev->mtu;
if (mtu > ETH_DATA_LEN)
/* MTU + ethernet header + FCS + optional VLAN tag */
cp->rx_buf_sz = mtu + ETH_HLEN + 8;
else
cp->rx_buf_sz = PKT_BUF_SZ;
}
static inline void cp_rx_skb (struct cp_private *cp, struct sk_buff *skb) static inline void cp_rx_skb (struct cp_private *cp, struct sk_buff *skb)
{ {
skb->protocol = eth_type_trans (skb, cp->dev); skb->protocol = eth_type_trans (skb, cp->dev);
...@@ -705,9 +719,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -705,9 +719,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
return 0; return 0;
} }
/* Set or clear the multicast filter for this adaptor.
This routine is not state sensitive and need not be SMP locked. */
static void __cp_set_rx_mode (struct net_device *dev) static void __cp_set_rx_mode (struct net_device *dev)
{ {
struct cp_private *cp = dev->priv; struct cp_private *cp = dev->priv;
...@@ -812,6 +823,12 @@ static void cp_reset_hw (struct cp_private *cp) ...@@ -812,6 +823,12 @@ static void cp_reset_hw (struct cp_private *cp)
printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name); printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name);
} }
static inline void cp_start_hw (struct cp_private *cp)
{
cpw8(Cmd, RxOn | TxOn);
cpw16(CpCmd, PCIMulRW | CpRxOn | CpTxOn);
}
static void cp_init_hw (struct cp_private *cp) static void cp_init_hw (struct cp_private *cp)
{ {
struct net_device *dev = cp->dev; struct net_device *dev = cp->dev;
...@@ -824,8 +841,7 @@ static void cp_init_hw (struct cp_private *cp) ...@@ -824,8 +841,7 @@ static void cp_init_hw (struct cp_private *cp)
cpw32_f (MAC0 + 0, cpu_to_le32 (*(u32 *) (dev->dev_addr + 0))); cpw32_f (MAC0 + 0, cpu_to_le32 (*(u32 *) (dev->dev_addr + 0)));
cpw32_f (MAC0 + 4, cpu_to_le32 (*(u32 *) (dev->dev_addr + 4))); cpw32_f (MAC0 + 4, cpu_to_le32 (*(u32 *) (dev->dev_addr + 4)));
cpw8(Cmd, RxOn | TxOn); cp_start_hw(cp);
cpw16(CpCmd, PCIMulRW | CpRxOn | CpTxOn);
cpw8(TxThresh, 0x06); /* XXX convert magic num to a constant */ cpw8(TxThresh, 0x06); /* XXX convert magic num to a constant */
__cp_set_rx_mode(dev); __cp_set_rx_mode(dev);
...@@ -957,8 +973,6 @@ static int cp_open (struct net_device *dev) ...@@ -957,8 +973,6 @@ static int cp_open (struct net_device *dev)
if (netif_msg_ifup(cp)) if (netif_msg_ifup(cp))
printk(KERN_DEBUG "%s: enabling interface\n", dev->name); printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
cp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
rc = cp_alloc_rings(cp); rc = cp_alloc_rings(cp);
if (rc) if (rc)
return rc; return rc;
...@@ -993,6 +1007,36 @@ static int cp_close (struct net_device *dev) ...@@ -993,6 +1007,36 @@ static int cp_close (struct net_device *dev)
return 0; return 0;
} }
static int cp_change_mtu(struct net_device *dev, int new_mtu)
{
struct cp_private *cp = dev->priv;
int rc;
/* check for invalid MTU, according to hardware limits */
if (new_mtu < CP_MIN_MTU || new_mtu > CP_MAX_MTU)
return -EINVAL;
/* if network interface not up, no need for complexity */
if (!netif_running(dev)) {
cp_set_rxbufsize(cp); /* set new rx buf size */
return 0;
}
spin_lock_irq(&cp->lock);
cp_stop_hw(cp); /* stop h/w and free rings */
cp_clean_rings(cp);
cp_set_rxbufsize(cp); /* set new rx buf size */
rc = cp_init_rings(cp); /* realloc and restart h/w */
cp_start_hw(cp);
spin_unlock_irq(&cp->lock);
return rc;
}
static char mii_2_8139_map[8] = { static char mii_2_8139_map[8] = {
BasicModeCtrl, BasicModeCtrl,
BasicModeStatus, BasicModeStatus,
...@@ -1231,6 +1275,7 @@ static int __devinit cp_init_one (struct pci_dev *pdev, ...@@ -1231,6 +1275,7 @@ static int __devinit cp_init_one (struct pci_dev *pdev,
cp->mii_if.mdio_read = mdio_read; cp->mii_if.mdio_read = mdio_read;
cp->mii_if.mdio_write = mdio_write; cp->mii_if.mdio_write = mdio_write;
cp->mii_if.phy_id = CP_INTERNAL_PHY; cp->mii_if.phy_id = CP_INTERNAL_PHY;
cp_set_rxbufsize(cp);
rc = pci_enable_device(pdev); rc = pci_enable_device(pdev);
if (rc) if (rc)
...@@ -1284,6 +1329,7 @@ static int __devinit cp_init_one (struct pci_dev *pdev, ...@@ -1284,6 +1329,7 @@ static int __devinit cp_init_one (struct pci_dev *pdev,
dev->hard_start_xmit = cp_start_xmit; dev->hard_start_xmit = cp_start_xmit;
dev->get_stats = cp_get_stats; dev->get_stats = cp_get_stats;
dev->do_ioctl = cp_ioctl; dev->do_ioctl = cp_ioctl;
dev->change_mtu = cp_change_mtu;
#if 0 #if 0
dev->tx_timeout = cp_tx_timeout; dev->tx_timeout = cp_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
......
...@@ -117,9 +117,6 @@ struct e1000_adapter; ...@@ -117,9 +117,6 @@ struct e1000_adapter;
#define BAR_0 0 #define BAR_0 0
/* Advertise that we can DMA from any address location */
#define E1000_DMA_MASK (~0x0UL)
#if DBG #if DBG
#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args) #define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
#else #else
......
...@@ -79,7 +79,7 @@ char e1000_driver_name[] = "e1000"; ...@@ -79,7 +79,7 @@ char e1000_driver_name[] = "e1000";
char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
char e1000_driver_version[] = "4.2.4-k1"; char e1000_driver_version[] = "4.2.4-k2";
char e1000_copyright[] = "Copyright (c) 1999-2002 Intel Corporation."; char e1000_copyright[] = "Copyright (c) 1999-2002 Intel Corporation.";
...@@ -368,13 +368,21 @@ e1000_probe(struct pci_dev *pdev, ...@@ -368,13 +368,21 @@ e1000_probe(struct pci_dev *pdev,
static int cards_found = 0; static int cards_found = 0;
unsigned long mmio_start; unsigned long mmio_start;
int mmio_len; int mmio_len;
int pci_using_dac;
int i; int i;
if((i = pci_enable_device(pdev))) if((i = pci_enable_device(pdev)))
return i; return i;
if((i = pci_set_dma_mask(pdev, E1000_DMA_MASK))) if(!(i = pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff))) {
pci_using_dac = 1;
} else {
if((i = pci_set_dma_mask(pdev, (u64) 0xffffffff))) {
E1000_ERR("No usable DMA configuration, aborting\n");
return i; return i;
}
pci_using_dac = 0;
}
if((i = pci_request_regions(pdev, e1000_driver_name))) if((i = pci_request_regions(pdev, e1000_driver_name)))
return i; return i;
...@@ -422,13 +430,14 @@ e1000_probe(struct pci_dev *pdev, ...@@ -422,13 +430,14 @@ e1000_probe(struct pci_dev *pdev,
e1000_sw_init(adapter); e1000_sw_init(adapter);
if(adapter->shared.mac_type >= e1000_82543) { if(adapter->shared.mac_type >= e1000_82543) {
netdev->features = NETIF_F_SG | netdev->features = NETIF_F_SG | NETIF_F_HW_CSUM;
NETIF_F_IP_CSUM |
NETIF_F_HIGHDMA;
} else { } else {
netdev->features = NETIF_F_SG | NETIF_F_HIGHDMA; netdev->features = NETIF_F_SG;
} }
if(pci_using_dac)
netdev->features |= NETIF_F_HIGHDMA;
/* make sure the EEPROM is good */ /* make sure the EEPROM is good */
if(!e1000_validate_eeprom_checksum(&adapter->shared)) if(!e1000_validate_eeprom_checksum(&adapter->shared))
...@@ -783,12 +792,6 @@ e1000_configure_tx(struct e1000_adapter *adapter) ...@@ -783,12 +792,6 @@ e1000_configure_tx(struct e1000_adapter *adapter)
E1000_WRITE_REG(&adapter->shared, TCTL, tctl); E1000_WRITE_REG(&adapter->shared, TCTL, tctl);
#ifdef CONFIG_PPC
if(adapter->shared.mac_type >= e1000_82543) {
E1000_WRITE_REG(&adapter->shared, TXDCTL, 0x00020000);
}
#endif
/* Setup Transmit Descriptor Settings for this adapter */ /* Setup Transmit Descriptor Settings for this adapter */
adapter->txd_cmd = E1000_TXD_CMD_IFCS; adapter->txd_cmd = E1000_TXD_CMD_IFCS;
...@@ -927,12 +930,6 @@ e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -927,12 +930,6 @@ e1000_configure_rx(struct e1000_adapter *adapter)
E1000_WRITE_REG(&adapter->shared, RXCSUM, rxcsum); E1000_WRITE_REG(&adapter->shared, RXCSUM, rxcsum);
} }
#ifdef CONFIG_PPC
if(adapter->shared.mac_type >= e1000_82543) {
E1000_WRITE_REG(&adapter->shared, RXDCTL, 0x00020000);
}
#endif
/* Enable Receives */ /* Enable Receives */
E1000_WRITE_REG(&adapter->shared, RCTL, rctl); E1000_WRITE_REG(&adapter->shared, RCTL, rctl);
......
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