forked from Minki/linux
Merge branch 'davem-next' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
commit
332e4af80d
167
Documentation/networking/dm9000.txt
Normal file
167
Documentation/networking/dm9000.txt
Normal file
@ -0,0 +1,167 @@
|
||||
DM9000 Network driver
|
||||
=====================
|
||||
|
||||
Copyright 2008 Simtec Electronics,
|
||||
Ben Dooks <ben@simtec.co.uk> <ben-linux@fluff.org>
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This file describes how to use the DM9000 platform-device based network driver
|
||||
that is contained in the files drivers/net/dm9000.c and drivers/net/dm9000.h.
|
||||
|
||||
The driver supports three DM9000 variants, the DM9000E which is the first chip
|
||||
supported as well as the newer DM9000A and DM9000B devices. It is currently
|
||||
maintained and tested by Ben Dooks, who should be CC: to any patches for this
|
||||
driver.
|
||||
|
||||
|
||||
Defining the platform device
|
||||
----------------------------
|
||||
|
||||
The minimum set of resources attached to the platform device are as follows:
|
||||
|
||||
1) The physical address of the address register
|
||||
2) The physical address of the data register
|
||||
3) The IRQ line the device's interrupt pin is connected to.
|
||||
|
||||
These resources should be specified in that order, as the ordering of the
|
||||
two address regions is important (the driver expects these to be address
|
||||
and then data).
|
||||
|
||||
An example from arch/arm/mach-s3c2410/mach-bast.c is:
|
||||
|
||||
static struct resource bast_dm9k_resource[] = {
|
||||
[0] = {
|
||||
.start = S3C2410_CS5 + BAST_PA_DM9000,
|
||||
.end = S3C2410_CS5 + BAST_PA_DM9000 + 3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
|
||||
.end = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_DM9000,
|
||||
.end = IRQ_DM9000,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device bast_device_dm9k = {
|
||||
.name = "dm9000",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
||||
.resource = bast_dm9k_resource,
|
||||
};
|
||||
|
||||
Note the setting of the IRQ trigger flag in bast_dm9k_resource[2].flags,
|
||||
as this will generate a warning if it is not present. The trigger from
|
||||
the flags field will be passed to request_irq() when registering the IRQ
|
||||
handler to ensure that the IRQ is setup correctly.
|
||||
|
||||
This shows a typical platform device, without the optional configuration
|
||||
platform data supplied. The next example uses the same resources, but adds
|
||||
the optional platform data to pass extra configuration data:
|
||||
|
||||
static struct dm9000_plat_data bast_dm9k_platdata = {
|
||||
.flags = DM9000_PLATF_16BITONLY,
|
||||
};
|
||||
|
||||
static struct platform_device bast_device_dm9k = {
|
||||
.name = "dm9000",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
||||
.resource = bast_dm9k_resource,
|
||||
.dev = {
|
||||
.platform_data = &bast_dm9k_platdata,
|
||||
}
|
||||
};
|
||||
|
||||
The platform data is defined in include/linux/dm9000.h and described below.
|
||||
|
||||
|
||||
Platform data
|
||||
-------------
|
||||
|
||||
Extra platform data for the DM9000 can describe the IO bus width to the
|
||||
device, whether or not an external PHY is attached to the device and
|
||||
the availability of an external configuration EEPROM.
|
||||
|
||||
The flags for the platform data .flags field are as follows:
|
||||
|
||||
DM9000_PLATF_8BITONLY
|
||||
|
||||
The IO should be done with 8bit operations.
|
||||
|
||||
DM9000_PLATF_16BITONLY
|
||||
|
||||
The IO should be done with 16bit operations.
|
||||
|
||||
DM9000_PLATF_32BITONLY
|
||||
|
||||
The IO should be done with 32bit operations.
|
||||
|
||||
DM9000_PLATF_EXT_PHY
|
||||
|
||||
The chip is connected to an external PHY.
|
||||
|
||||
DM9000_PLATF_NO_EEPROM
|
||||
|
||||
This can be used to signify that the board does not have an
|
||||
EEPROM, or that the EEPROM should be hidden from the user.
|
||||
|
||||
DM9000_PLATF_SIMPLE_PHY
|
||||
|
||||
Switch to using the simpler PHY polling method which does not
|
||||
try and read the MII PHY state regularly. This is only available
|
||||
when using the internal PHY. See the section on link state polling
|
||||
for more information.
|
||||
|
||||
The config symbol DM9000_FORCE_SIMPLE_PHY_POLL, Kconfig entry
|
||||
"Force simple NSR based PHY polling" allows this flag to be
|
||||
forced on at build time.
|
||||
|
||||
|
||||
PHY Link state polling
|
||||
----------------------
|
||||
|
||||
The driver keeps track of the link state and informs the network core
|
||||
about link (carrier) availablilty. This is managed by several methods
|
||||
depending on the version of the chip and on which PHY is being used.
|
||||
|
||||
For the internal PHY, the original (and currently default) method is
|
||||
to read the MII state, either when the status changes if we have the
|
||||
necessary interrupt support in the chip or every two seconds via a
|
||||
periodic timer.
|
||||
|
||||
To reduce the overhead for the internal PHY, there is now the option
|
||||
of using the DM9000_FORCE_SIMPLE_PHY_POLL config, or DM9000_PLATF_SIMPLE_PHY
|
||||
platform data option to read the summary information without the
|
||||
expensive MII accesses. This method is faster, but does not print
|
||||
as much information.
|
||||
|
||||
When using an external PHY, the driver currently has to poll the MII
|
||||
link status as there is no method for getting an interrupt on link change.
|
||||
|
||||
|
||||
DM9000A / DM9000B
|
||||
-----------------
|
||||
|
||||
These chips are functionally similar to the DM9000E and are supported easily
|
||||
by the same driver. The features are:
|
||||
|
||||
1) Interrupt on internal PHY state change. This means that the periodic
|
||||
polling of the PHY status may be disabled on these devices when using
|
||||
the internal PHY.
|
||||
|
||||
2) TCP/UDP checksum offloading, which the driver does not currently support.
|
||||
|
||||
|
||||
ethtool
|
||||
-------
|
||||
|
||||
The driver supports the ethtool interface for access to the driver
|
||||
state information, the PHY state and the EEPROM.
|
@ -323,10 +323,15 @@ static struct platform_device smc91x_device = {
|
||||
static struct resource dm9000_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x203FB800,
|
||||
.end = 0x203FB800 + 8,
|
||||
.end = 0x203FB800 + 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 0x203FB800 + 4,
|
||||
.end = 0x203FB800 + 5,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_PF9,
|
||||
.end = IRQ_PF9,
|
||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||
|
@ -65,10 +65,15 @@ static struct platform_device rtc_device = {
|
||||
static struct resource dm9000_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x20300000,
|
||||
.end = 0x20300000 + 8,
|
||||
.end = 0x20300000 + 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 0x20300000 + 4,
|
||||
.end = 0x20300000 + 5,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_PF10,
|
||||
.end = IRQ_PF10,
|
||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||
|
@ -166,10 +166,15 @@ static struct platform_device smc91x_device = {
|
||||
static struct resource dm9000_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x203FB800,
|
||||
.end = 0x203FB800 + 8,
|
||||
.end = 0x203FB800 + 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 0x203FB800 + 4,
|
||||
.end = 0x203FB800 + 5,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_PF9,
|
||||
.end = IRQ_PF9,
|
||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||
|
@ -1213,7 +1213,6 @@ static int cp_close (struct net_device *dev)
|
||||
|
||||
spin_unlock_irqrestore(&cp->lock, flags);
|
||||
|
||||
synchronize_irq(dev->irq);
|
||||
free_irq(dev->irq, dev);
|
||||
|
||||
cp_free_rings(cp);
|
||||
|
@ -107,8 +107,8 @@
|
||||
#include <linux/mii.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#define RTL8139_DRIVER_NAME DRV_NAME " Fast Ethernet driver " DRV_VERSION
|
||||
@ -134,7 +134,7 @@
|
||||
|
||||
#if RTL8139_DEBUG
|
||||
/* note: prints function name for you */
|
||||
# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
|
||||
# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
|
||||
#else
|
||||
# define DPRINTK(fmt, args...)
|
||||
#endif
|
||||
@ -145,7 +145,7 @@
|
||||
# define assert(expr) \
|
||||
if(unlikely(!(expr))) { \
|
||||
printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
|
||||
#expr,__FILE__,__FUNCTION__,__LINE__); \
|
||||
#expr, __FILE__, __func__, __LINE__); \
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -219,7 +219,7 @@ enum {
|
||||
#define RTL8139B_IO_SIZE 256
|
||||
|
||||
#define RTL8129_CAPS HAS_MII_XCVR
|
||||
#define RTL8139_CAPS HAS_CHIP_XCVR|HAS_LNK_CHNG
|
||||
#define RTL8139_CAPS (HAS_CHIP_XCVR|HAS_LNK_CHNG)
|
||||
|
||||
typedef enum {
|
||||
RTL8139 = 0,
|
||||
@ -1889,7 +1889,7 @@ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
|
||||
}
|
||||
|
||||
#if RX_BUF_IDX == 3
|
||||
static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
|
||||
static inline void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
|
||||
u32 offset, unsigned int size)
|
||||
{
|
||||
u32 left = RX_BUF_LEN - offset;
|
||||
@ -2231,7 +2231,6 @@ static int rtl8139_close (struct net_device *dev)
|
||||
|
||||
spin_unlock_irqrestore (&tp->lock, flags);
|
||||
|
||||
synchronize_irq (dev->irq); /* racy, but that's ok here */
|
||||
free_irq (dev->irq, dev);
|
||||
|
||||
rtl8139_tx_clear (tp);
|
||||
|
@ -938,6 +938,23 @@ config DM9000
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called dm9000.
|
||||
|
||||
config DM9000_DEBUGLEVEL
|
||||
int "DM9000 maximum debug level"
|
||||
depends on DM9000
|
||||
default 4
|
||||
help
|
||||
The maximum level of debugging code compiled into the DM9000
|
||||
driver.
|
||||
|
||||
config DM9000_FORCE_SIMPLE_PHY_POLL
|
||||
bool "Force simple NSR based PHY polling"
|
||||
depends on DM9000
|
||||
---help---
|
||||
This configuration forces the DM9000 to use the NSR's LinkStatus
|
||||
bit to determine if the link is up or down instead of the more
|
||||
costly MII PHY reads. Note, this will not work if the chip is
|
||||
operating with an external PHY.
|
||||
|
||||
config ENC28J60
|
||||
tristate "ENC28J60 support"
|
||||
depends on EXPERIMENTAL && SPI && NET_ETHERNET
|
||||
@ -955,14 +972,6 @@ config ENC28J60_WRITEVERIFY
|
||||
Enable the verify after the buffer write useful for debugging purpose.
|
||||
If unsure, say N.
|
||||
|
||||
config DM9000_DEBUGLEVEL
|
||||
int "DM9000 maximum debug level"
|
||||
depends on DM9000
|
||||
default 4
|
||||
help
|
||||
The maximum level of debugging code compiled into the DM9000
|
||||
driver.
|
||||
|
||||
config SMC911X
|
||||
tristate "SMSC LAN911[5678] support"
|
||||
select CRC32
|
||||
@ -2025,9 +2034,6 @@ config E1000E
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called e1000e.
|
||||
|
||||
config E1000E_ENABLED
|
||||
def_bool E1000E != n
|
||||
|
||||
config IP1000
|
||||
tristate "IP1000 Gigabit Ethernet support"
|
||||
depends on PCI && EXPERIMENTAL
|
||||
@ -2462,7 +2468,8 @@ config EHEA
|
||||
|
||||
config IXGBE
|
||||
tristate "Intel(R) 10GbE PCI Express adapters support"
|
||||
depends on PCI
|
||||
depends on PCI && INET
|
||||
select INET_LRO
|
||||
---help---
|
||||
This driver supports Intel(R) 10GbE PCI Express family of
|
||||
adapters. For more information on how to identify your adapter, go
|
||||
|
@ -1248,6 +1248,25 @@ static inline void unregister_tdev(struct t3cdev *tdev)
|
||||
mutex_unlock(&cxgb3_db_lock);
|
||||
}
|
||||
|
||||
static inline int adap2type(struct adapter *adapter)
|
||||
{
|
||||
int type = 0;
|
||||
|
||||
switch (adapter->params.rev) {
|
||||
case T3_REV_A:
|
||||
type = T3A;
|
||||
break;
|
||||
case T3_REV_B:
|
||||
case T3_REV_B2:
|
||||
type = T3B;
|
||||
break;
|
||||
case T3_REV_C:
|
||||
type = T3C;
|
||||
break;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
|
||||
{
|
||||
struct t3cdev *tdev = &adapter->tdev;
|
||||
@ -1257,7 +1276,7 @@ void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
|
||||
cxgb3_set_dummy_ops(tdev);
|
||||
tdev->send = t3_offload_tx;
|
||||
tdev->ctl = cxgb_offload_ctl;
|
||||
tdev->type = adapter->params.rev == 0 ? T3A : T3B;
|
||||
tdev->type = adap2type(adapter);
|
||||
|
||||
register_tdev(tdev);
|
||||
}
|
||||
|
@ -45,7 +45,8 @@ struct cxgb3_client;
|
||||
|
||||
enum t3ctype {
|
||||
T3A = 0,
|
||||
T3B
|
||||
T3B,
|
||||
T3C,
|
||||
};
|
||||
|
||||
struct t3cdev {
|
||||
|
@ -1753,7 +1753,7 @@ rio_close (struct net_device *dev)
|
||||
|
||||
/* Stop Tx and Rx logics */
|
||||
writel (TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl);
|
||||
synchronize_irq (dev->irq);
|
||||
|
||||
free_irq (dev->irq, dev);
|
||||
del_timer_sync (&np->timer);
|
||||
|
||||
|
1225
drivers/net/dm9000.c
1225
drivers/net/dm9000.c
File diff suppressed because it is too large
Load Diff
@ -45,6 +45,9 @@
|
||||
#define DM9000_CHIPR 0x2C
|
||||
#define DM9000_SMCR 0x2F
|
||||
|
||||
#define CHIPR_DM9000A 0x19
|
||||
#define CHIPR_DM9000B 0x1B
|
||||
|
||||
#define DM9000_MRCMDX 0xF0
|
||||
#define DM9000_MRCMD 0xF2
|
||||
#define DM9000_MRRL 0xF4
|
||||
@ -131,5 +134,13 @@
|
||||
#define DM9000_PKT_RDY 0x01 /* Packet ready to receive */
|
||||
#define DM9000_PKT_MAX 1536 /* Received packet max size */
|
||||
|
||||
/* DM9000A / DM9000B definitions */
|
||||
|
||||
#define IMR_LNKCHNG (1<<5)
|
||||
#define IMR_UNDERRUN (1<<4)
|
||||
|
||||
#define ISR_LNKCHNG (1<<5)
|
||||
#define ISR_UNDERRUN (1<<4)
|
||||
|
||||
#endif /* _DM9000X_H_ */
|
||||
|
||||
|
@ -47,12 +47,6 @@ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation
|
||||
* Macro expands to...
|
||||
* {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
|
||||
*/
|
||||
#ifdef CONFIG_E1000E_ENABLED
|
||||
#define PCIE(x)
|
||||
#else
|
||||
#define PCIE(x) x,
|
||||
#endif
|
||||
|
||||
static struct pci_device_id e1000_pci_tbl[] = {
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1000),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1001),
|
||||
@ -79,14 +73,6 @@ static struct pci_device_id e1000_pci_tbl[] = {
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1026),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1027),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1028),
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1049))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104A))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104B))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104C))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x104D))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x105E))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x105F))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1060))
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1075),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1076),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1077),
|
||||
@ -95,28 +81,9 @@ PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1060))
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x107A),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x107B),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x107C),
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107D))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107E))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x107F))
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x108A),
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x108B))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x108C))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1096))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x1098))
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1099),
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x109A))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10A4))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10A5))
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B5),
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10B9))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BA))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BB))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10BC))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10C4))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10C5))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10D5))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10D9))
|
||||
PCIE( INTEL_E1000_ETHERNET_DEVICE(0x10DA))
|
||||
/* required last entry */
|
||||
{0,}
|
||||
};
|
||||
@ -5284,7 +5251,6 @@ e1000_netpoll(struct net_device *netdev)
|
||||
|
||||
disable_irq(adapter->pdev->irq);
|
||||
e1000_intr(adapter->pdev->irq, netdev);
|
||||
e1000_clean_tx_irq(adapter, adapter->tx_ring);
|
||||
#ifndef CONFIG_E1000_NAPI
|
||||
adapter->clean_rx(adapter, adapter->rx_ring);
|
||||
#endif
|
||||
|
@ -283,6 +283,10 @@ struct e1000_adapter {
|
||||
unsigned long led_status;
|
||||
|
||||
unsigned int flags;
|
||||
|
||||
/* for ioport free */
|
||||
int bars;
|
||||
int need_ioport;
|
||||
};
|
||||
|
||||
struct e1000_info {
|
||||
|
@ -4003,7 +4003,11 @@ static int e1000_resume(struct pci_dev *pdev)
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
pci_restore_state(pdev);
|
||||
e1000e_disable_l1aspm(pdev);
|
||||
err = pci_enable_device(pdev);
|
||||
|
||||
if (adapter->need_ioport)
|
||||
err = pci_enable_device(pdev);
|
||||
else
|
||||
err = pci_enable_device_mem(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot enable PCI device from suspend\n");
|
||||
@ -4104,9 +4108,14 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int err;
|
||||
|
||||
e1000e_disable_l1aspm(pdev);
|
||||
if (pci_enable_device(pdev)) {
|
||||
if (adapter->need_ioport)
|
||||
err = pci_enable_device(pdev);
|
||||
else
|
||||
err = pci_enable_device_mem(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot re-enable PCI device after reset.\n");
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
@ -4184,6 +4193,21 @@ static void e1000_print_device_info(struct e1000_adapter *adapter)
|
||||
(pba_num >> 8), (pba_num & 0xff));
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000e_is_need_ioport - determine if an adapter needs ioport resources or not
|
||||
* @pdev: PCI device information struct
|
||||
*
|
||||
* Returns true if an adapters needs ioport resources
|
||||
**/
|
||||
static int e1000e_is_need_ioport(struct pci_dev *pdev)
|
||||
{
|
||||
switch (pdev->device) {
|
||||
/* Currently there are no adapters that need ioport resources */
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_probe - Device Initialization Routine
|
||||
* @pdev: PCI device information struct
|
||||
@ -4209,9 +4233,19 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
int i, err, pci_using_dac;
|
||||
u16 eeprom_data = 0;
|
||||
u16 eeprom_apme_mask = E1000_EEPROM_APME;
|
||||
int bars, need_ioport;
|
||||
|
||||
e1000e_disable_l1aspm(pdev);
|
||||
err = pci_enable_device(pdev);
|
||||
|
||||
/* do not allocate ioport bars when not needed */
|
||||
need_ioport = e1000e_is_need_ioport(pdev);
|
||||
if (need_ioport) {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
|
||||
err = pci_enable_device(pdev);
|
||||
} else {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
||||
err = pci_enable_device_mem(pdev);
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -4234,7 +4268,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
err = pci_request_regions(pdev, e1000e_driver_name);
|
||||
err = pci_request_selected_regions(pdev, bars, e1000e_driver_name);
|
||||
if (err)
|
||||
goto err_pci_reg;
|
||||
|
||||
@ -4259,6 +4293,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
adapter->hw.adapter = adapter;
|
||||
adapter->hw.mac.type = ei->mac;
|
||||
adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
|
||||
adapter->bars = bars;
|
||||
adapter->need_ioport = need_ioport;
|
||||
|
||||
mmio_start = pci_resource_start(pdev, 0);
|
||||
mmio_len = pci_resource_len(pdev, 0);
|
||||
@ -4498,7 +4534,7 @@ err_sw_init:
|
||||
err_ioremap:
|
||||
free_netdev(netdev);
|
||||
err_alloc_etherdev:
|
||||
pci_release_regions(pdev);
|
||||
pci_release_selected_regions(pdev, bars);
|
||||
err_pci_reg:
|
||||
err_dma:
|
||||
pci_disable_device(pdev);
|
||||
@ -4546,7 +4582,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
pci_release_regions(pdev);
|
||||
pci_release_selected_regions(pdev, adapter->bars);
|
||||
|
||||
free_netdev(netdev);
|
||||
|
||||
|
@ -90,6 +90,7 @@ static int full_duplex[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
|
||||
#include <asm/processor.h> /* Processor type for cache alignment. */
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/* These identify the driver base version and may not be removed. */
|
||||
static char version[] =
|
||||
@ -861,40 +862,20 @@ static int netdev_open(struct net_device *dev)
|
||||
Wait the specified 50 PCI cycles after a reset by initializing
|
||||
Tx and Rx queues and the address filter list.
|
||||
FIXME (Ueimor): optimistic for alpha + posted writes ? */
|
||||
#if defined(__powerpc__) || defined(__sparc__)
|
||||
// 89/9/1 modify,
|
||||
// np->bcrvalue=0x04 | 0x0x38; /* big-endian, 256 burst length */
|
||||
np->bcrvalue = 0x04 | 0x10; /* big-endian, tx 8 burst length */
|
||||
np->crvalue = 0xe00; /* rx 128 burst length */
|
||||
#elif defined(__alpha__) || defined(__x86_64__)
|
||||
// 89/9/1 modify,
|
||||
// np->bcrvalue=0x38; /* little-endian, 256 burst length */
|
||||
|
||||
np->bcrvalue = 0x10; /* little-endian, 8 burst length */
|
||||
np->crvalue = 0xe00; /* rx 128 burst length */
|
||||
#elif defined(__i386__)
|
||||
#if defined(MODULE)
|
||||
// 89/9/1 modify,
|
||||
// np->bcrvalue=0x38; /* little-endian, 256 burst length */
|
||||
np->bcrvalue = 0x10; /* little-endian, 8 burst length */
|
||||
np->crvalue = 0xe00; /* rx 128 burst length */
|
||||
#else
|
||||
/* When not a module we can work around broken '486 PCI boards. */
|
||||
#define x86 boot_cpu_data.x86
|
||||
// 89/9/1 modify,
|
||||
// np->bcrvalue=(x86 <= 4 ? 0x10 : 0x38);
|
||||
np->bcrvalue = 0x10;
|
||||
np->crvalue = (x86 <= 4 ? 0xa00 : 0xe00);
|
||||
if (x86 <= 4)
|
||||
printk(KERN_INFO "%s: This is a 386/486 PCI system, setting burst "
|
||||
"length to %x.\n", dev->name, (x86 <= 4 ? 0x10 : 0x38));
|
||||
#ifdef __BIG_ENDIAN
|
||||
np->bcrvalue |= 0x04; /* big-endian */
|
||||
#endif
|
||||
#else
|
||||
// 89/9/1 modify,
|
||||
// np->bcrvalue=0x38;
|
||||
np->bcrvalue = 0x10;
|
||||
np->crvalue = 0xe00; /* rx 128 burst length */
|
||||
#warning Processor architecture undefined!
|
||||
|
||||
#if defined(__i386__) && !defined(MODULE)
|
||||
if (boot_cpu_data.x86 <= 4)
|
||||
np->crvalue = 0xa00;
|
||||
else
|
||||
#endif
|
||||
np->crvalue = 0xe00; /* rx 128 burst length */
|
||||
|
||||
|
||||
// 89/12/29 add,
|
||||
// 90/1/16 modify,
|
||||
// np->imrvalue=FBE|TUNF|CNTOVF|RBU|TI|RI;
|
||||
|
@ -5559,6 +5559,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
/* set mac address */
|
||||
nv_copy_mac_to_hw(dev);
|
||||
|
||||
/* Workaround current PCI init glitch: wakeup bits aren't
|
||||
* being set from PCI PM capability.
|
||||
*/
|
||||
device_init_wakeup(&pci_dev->dev, 1);
|
||||
|
||||
/* disable WOL */
|
||||
writel(0, base + NvRegWakeUpFlags);
|
||||
np->wolenabled = 0;
|
||||
|
@ -271,6 +271,10 @@ struct igb_adapter {
|
||||
unsigned int msi_enabled;
|
||||
|
||||
u32 eeprom_wol;
|
||||
|
||||
/* for ioport free */
|
||||
int bars;
|
||||
int need_ioport;
|
||||
};
|
||||
|
||||
enum e1000_state_t {
|
||||
|
@ -820,6 +820,21 @@ void igb_reset(struct igb_adapter *adapter)
|
||||
adapter->hw.phy.ops.get_phy_info(&adapter->hw);
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_is_need_ioport - determine if an adapter needs ioport resources or not
|
||||
* @pdev: PCI device information struct
|
||||
*
|
||||
* Returns true if an adapter needs ioport resources
|
||||
**/
|
||||
static int igb_is_need_ioport(struct pci_dev *pdev)
|
||||
{
|
||||
switch (pdev->device) {
|
||||
/* Currently there are no adapters that need ioport resources */
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_probe - Device Initialization Routine
|
||||
* @pdev: PCI device information struct
|
||||
@ -844,8 +859,17 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
||||
u16 eeprom_data = 0;
|
||||
u16 eeprom_apme_mask = IGB_EEPROM_APME;
|
||||
u32 part_num;
|
||||
int bars, need_ioport;
|
||||
|
||||
err = pci_enable_device(pdev);
|
||||
/* do not allocate ioport bars when not needed */
|
||||
need_ioport = igb_is_need_ioport(pdev);
|
||||
if (need_ioport) {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
|
||||
err = pci_enable_device(pdev);
|
||||
} else {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
||||
err = pci_enable_device_mem(pdev);
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -867,7 +891,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
err = pci_request_regions(pdev, igb_driver_name);
|
||||
err = pci_request_selected_regions(pdev, bars, igb_driver_name);
|
||||
if (err)
|
||||
goto err_pci_reg;
|
||||
|
||||
@ -888,6 +912,8 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
||||
hw = &adapter->hw;
|
||||
hw->back = adapter;
|
||||
adapter->msg_enable = NETIF_MSG_DRV | NETIF_MSG_PROBE;
|
||||
adapter->bars = bars;
|
||||
adapter->need_ioport = need_ioport;
|
||||
|
||||
mmio_start = pci_resource_start(pdev, 0);
|
||||
mmio_len = pci_resource_len(pdev, 0);
|
||||
@ -1128,7 +1154,7 @@ err_hw_init:
|
||||
err_ioremap:
|
||||
free_netdev(netdev);
|
||||
err_alloc_etherdev:
|
||||
pci_release_regions(pdev);
|
||||
pci_release_selected_regions(pdev, bars);
|
||||
err_pci_reg:
|
||||
err_dma:
|
||||
pci_disable_device(pdev);
|
||||
@ -1175,7 +1201,7 @@ static void __devexit igb_remove(struct pci_dev *pdev)
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
pci_release_regions(pdev);
|
||||
pci_release_selected_regions(pdev, adapter->bars);
|
||||
|
||||
free_netdev(netdev);
|
||||
|
||||
@ -3976,7 +4002,11 @@ static int igb_resume(struct pci_dev *pdev)
|
||||
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
pci_restore_state(pdev);
|
||||
err = pci_enable_device(pdev);
|
||||
|
||||
if (adapter->need_ioport)
|
||||
err = pci_enable_device(pdev);
|
||||
else
|
||||
err = pci_enable_device_mem(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev,
|
||||
"igb: Cannot enable PCI device from suspend\n");
|
||||
@ -4079,8 +4109,13 @@ static pci_ers_result_t igb_io_slot_reset(struct pci_dev *pdev)
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int err;
|
||||
|
||||
if (pci_enable_device(pdev)) {
|
||||
if (adapter->need_ioport)
|
||||
err = pci_enable_device(pdev);
|
||||
else
|
||||
err = pci_enable_device_mem(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev,
|
||||
"Cannot re-enable PCI device after reset.\n");
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/inet_lro.h>
|
||||
|
||||
#include "ixgbe_type.h"
|
||||
#include "ixgbe_common.h"
|
||||
@ -100,6 +101,9 @@
|
||||
#define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000
|
||||
#define IXGBE_TX_FLAGS_VLAN_SHIFT 16
|
||||
|
||||
#define IXGBE_MAX_LRO_DESCRIPTORS 8
|
||||
#define IXGBE_MAX_LRO_AGGREGATE 32
|
||||
|
||||
/* wrapper around a pointer to a socket buffer,
|
||||
* so a DMA handle can be stored along with the buffer */
|
||||
struct ixgbe_tx_buffer {
|
||||
@ -150,6 +154,8 @@ struct ixgbe_ring {
|
||||
/* cpu for tx queue */
|
||||
int cpu;
|
||||
#endif
|
||||
struct net_lro_mgr lro_mgr;
|
||||
bool lro_used;
|
||||
struct ixgbe_queue_stats stats;
|
||||
u8 v_idx; /* maps directly to the index for this ring in the hardware
|
||||
* vector array, can also be used for finding the bit in EICR
|
||||
@ -287,6 +293,9 @@ struct ixgbe_adapter {
|
||||
|
||||
unsigned long state;
|
||||
u64 tx_busy;
|
||||
u64 lro_aggregated;
|
||||
u64 lro_flushed;
|
||||
u64 lro_no_desc;
|
||||
};
|
||||
|
||||
enum ixbge_state_t {
|
||||
|
@ -90,6 +90,8 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = {
|
||||
{"rx_header_split", IXGBE_STAT(rx_hdr_split)},
|
||||
{"alloc_rx_page_failed", IXGBE_STAT(alloc_rx_page_failed)},
|
||||
{"alloc_rx_buff_failed", IXGBE_STAT(alloc_rx_buff_failed)},
|
||||
{"lro_aggregated", IXGBE_STAT(lro_aggregated)},
|
||||
{"lro_flushed", IXGBE_STAT(lro_flushed)},
|
||||
};
|
||||
|
||||
#define IXGBE_QUEUE_STATS_LEN \
|
||||
@ -787,6 +789,7 @@ static void ixgbe_get_ethtool_stats(struct net_device *netdev,
|
||||
int stat_count = sizeof(struct ixgbe_queue_stats) / sizeof(u64);
|
||||
int j, k;
|
||||
int i;
|
||||
u64 aggregated = 0, flushed = 0, no_desc = 0;
|
||||
|
||||
ixgbe_update_stats(adapter);
|
||||
for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
|
||||
@ -801,11 +804,17 @@ static void ixgbe_get_ethtool_stats(struct net_device *netdev,
|
||||
i += k;
|
||||
}
|
||||
for (j = 0; j < adapter->num_rx_queues; j++) {
|
||||
aggregated += adapter->rx_ring[j].lro_mgr.stats.aggregated;
|
||||
flushed += adapter->rx_ring[j].lro_mgr.stats.flushed;
|
||||
no_desc += adapter->rx_ring[j].lro_mgr.stats.no_desc;
|
||||
queue_stat = (u64 *)&adapter->rx_ring[j].stats;
|
||||
for (k = 0; k < stat_count; k++)
|
||||
data[i + k] = queue_stat[k];
|
||||
i += k;
|
||||
}
|
||||
adapter->lro_aggregated = aggregated;
|
||||
adapter->lro_flushed = flushed;
|
||||
adapter->lro_no_desc = no_desc;
|
||||
}
|
||||
|
||||
static void ixgbe_get_strings(struct net_device *netdev, u32 stringset,
|
||||
@ -973,6 +982,8 @@ static struct ethtool_ops ixgbe_ethtool_ops = {
|
||||
.get_ethtool_stats = ixgbe_get_ethtool_stats,
|
||||
.get_coalesce = ixgbe_get_coalesce,
|
||||
.set_coalesce = ixgbe_set_coalesce,
|
||||
.get_flags = ethtool_op_get_flags,
|
||||
.set_flags = ethtool_op_set_flags,
|
||||
};
|
||||
|
||||
void ixgbe_set_ethtool_ops(struct net_device *netdev)
|
||||
|
@ -389,24 +389,39 @@ static int __ixgbe_notify_dca(struct device *dev, void *data)
|
||||
* ixgbe_receive_skb - Send a completed packet up the stack
|
||||
* @adapter: board private structure
|
||||
* @skb: packet to send up
|
||||
* @is_vlan: packet has a VLAN tag
|
||||
* @tag: VLAN tag from descriptor
|
||||
* @status: hardware indication of status of receive
|
||||
* @rx_ring: rx descriptor ring (for a specific queue) to setup
|
||||
* @rx_desc: rx descriptor
|
||||
**/
|
||||
static void ixgbe_receive_skb(struct ixgbe_adapter *adapter,
|
||||
struct sk_buff *skb, bool is_vlan,
|
||||
u16 tag)
|
||||
struct sk_buff *skb, u8 status,
|
||||
struct ixgbe_ring *ring,
|
||||
union ixgbe_adv_rx_desc *rx_desc)
|
||||
{
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, tag);
|
||||
else
|
||||
netif_receive_skb(skb);
|
||||
} else {
|
||||
bool is_vlan = (status & IXGBE_RXD_STAT_VP);
|
||||
u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
|
||||
|
||||
if (adapter->netdev->features & NETIF_F_LRO &&
|
||||
skb->ip_summed == CHECKSUM_UNNECESSARY) {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
|
||||
lro_vlan_hwaccel_receive_skb(&ring->lro_mgr, skb,
|
||||
adapter->vlgrp, tag,
|
||||
rx_desc);
|
||||
else
|
||||
netif_rx(skb);
|
||||
lro_receive_skb(&ring->lro_mgr, skb, rx_desc);
|
||||
ring->lro_used = true;
|
||||
} else {
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, tag);
|
||||
else
|
||||
netif_receive_skb(skb);
|
||||
} else {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
|
||||
else
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -546,8 +561,8 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_adapter *adapter,
|
||||
struct sk_buff *skb;
|
||||
unsigned int i;
|
||||
u32 upper_len, len, staterr;
|
||||
u16 hdr_info, vlan_tag;
|
||||
bool is_vlan, cleaned = false;
|
||||
u16 hdr_info;
|
||||
bool cleaned = false;
|
||||
int cleaned_count = 0;
|
||||
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
||||
|
||||
@ -556,8 +571,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_adapter *adapter,
|
||||
rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i);
|
||||
staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
|
||||
rx_buffer_info = &rx_ring->rx_buffer_info[i];
|
||||
is_vlan = (staterr & IXGBE_RXD_STAT_VP);
|
||||
vlan_tag = le16_to_cpu(rx_desc->wb.upper.vlan);
|
||||
|
||||
while (staterr & IXGBE_RXD_STAT_DD) {
|
||||
if (*work_done >= work_to_do)
|
||||
@ -635,7 +648,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_adapter *adapter,
|
||||
total_rx_packets++;
|
||||
|
||||
skb->protocol = eth_type_trans(skb, netdev);
|
||||
ixgbe_receive_skb(adapter, skb, is_vlan, vlan_tag);
|
||||
ixgbe_receive_skb(adapter, skb, staterr, rx_ring, rx_desc);
|
||||
netdev->last_rx = jiffies;
|
||||
|
||||
next_desc:
|
||||
@ -652,8 +665,11 @@ next_desc:
|
||||
rx_buffer_info = next_buffer;
|
||||
|
||||
staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
|
||||
is_vlan = (staterr & IXGBE_RXD_STAT_VP);
|
||||
vlan_tag = le16_to_cpu(rx_desc->wb.upper.vlan);
|
||||
}
|
||||
|
||||
if (rx_ring->lro_used) {
|
||||
lro_flush_all(&rx_ring->lro_mgr);
|
||||
rx_ring->lro_used = false;
|
||||
}
|
||||
|
||||
rx_ring->next_to_clean = i;
|
||||
@ -1381,6 +1397,33 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
|
||||
(((S) & (PAGE_SIZE - 1)) ? 1 : 0))
|
||||
|
||||
#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
|
||||
/**
|
||||
* ixgbe_get_skb_hdr - helper function for LRO header processing
|
||||
* @skb: pointer to sk_buff to be added to LRO packet
|
||||
* @iphdr: pointer to tcp header structure
|
||||
* @tcph: pointer to tcp header structure
|
||||
* @hdr_flags: pointer to header flags
|
||||
* @priv: private data
|
||||
**/
|
||||
static int ixgbe_get_skb_hdr(struct sk_buff *skb, void **iphdr, void **tcph,
|
||||
u64 *hdr_flags, void *priv)
|
||||
{
|
||||
union ixgbe_adv_rx_desc *rx_desc = priv;
|
||||
|
||||
/* Verify that this is a valid IPv4 TCP packet */
|
||||
if (!(rx_desc->wb.lower.lo_dword.pkt_info &
|
||||
(IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)))
|
||||
return -1;
|
||||
|
||||
/* Set network headers */
|
||||
skb_reset_network_header(skb);
|
||||
skb_set_transport_header(skb, ip_hdrlen(skb));
|
||||
*iphdr = ip_hdr(skb);
|
||||
*tcph = tcp_hdr(skb);
|
||||
*hdr_flags = LRO_IPV4 | LRO_TCP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_configure_rx - Configure 8254x Receive Unit after Reset
|
||||
* @adapter: board private structure
|
||||
@ -1470,6 +1513,17 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
||||
adapter->rx_ring[i].tail = IXGBE_RDT(i);
|
||||
}
|
||||
|
||||
/* Intitial LRO Settings */
|
||||
adapter->rx_ring[i].lro_mgr.max_aggr = IXGBE_MAX_LRO_AGGREGATE;
|
||||
adapter->rx_ring[i].lro_mgr.max_desc = IXGBE_MAX_LRO_DESCRIPTORS;
|
||||
adapter->rx_ring[i].lro_mgr.get_skb_header = ixgbe_get_skb_hdr;
|
||||
adapter->rx_ring[i].lro_mgr.features = LRO_F_EXTRACT_VLAN_ID;
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL))
|
||||
adapter->rx_ring[i].lro_mgr.features |= LRO_F_NAPI;
|
||||
adapter->rx_ring[i].lro_mgr.dev = adapter->netdev;
|
||||
adapter->rx_ring[i].lro_mgr.ip_summed = CHECKSUM_UNNECESSARY;
|
||||
adapter->rx_ring[i].lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
|
||||
/* Fill out redirection table */
|
||||
for (i = 0, j = 0; i < 128; i++, j++) {
|
||||
@ -2490,12 +2544,18 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
int size;
|
||||
|
||||
size = sizeof(struct net_lro_desc) * IXGBE_MAX_LRO_DESCRIPTORS;
|
||||
rxdr->lro_mgr.lro_arr = vmalloc(size);
|
||||
if (!rxdr->lro_mgr.lro_arr)
|
||||
return -ENOMEM;
|
||||
memset(rxdr->lro_mgr.lro_arr, 0, size);
|
||||
|
||||
size = sizeof(struct ixgbe_rx_buffer) * rxdr->count;
|
||||
rxdr->rx_buffer_info = vmalloc(size);
|
||||
if (!rxdr->rx_buffer_info) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"vmalloc allocation failed for the rx desc ring\n");
|
||||
return -ENOMEM;
|
||||
goto alloc_failed;
|
||||
}
|
||||
memset(rxdr->rx_buffer_info, 0, size);
|
||||
|
||||
@ -2509,13 +2569,18 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Memory allocation failed for the rx desc ring\n");
|
||||
vfree(rxdr->rx_buffer_info);
|
||||
return -ENOMEM;
|
||||
goto alloc_failed;
|
||||
}
|
||||
|
||||
rxdr->next_to_clean = 0;
|
||||
rxdr->next_to_use = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
alloc_failed:
|
||||
vfree(rxdr->lro_mgr.lro_arr);
|
||||
rxdr->lro_mgr.lro_arr = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2566,6 +2631,9 @@ static void ixgbe_free_rx_resources(struct ixgbe_adapter *adapter,
|
||||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
vfree(rx_ring->lro_mgr.lro_arr);
|
||||
rx_ring->lro_mgr.lro_arr = NULL;
|
||||
|
||||
ixgbe_clean_rx_ring(adapter, rx_ring);
|
||||
|
||||
vfree(rx_ring->rx_buffer_info);
|
||||
@ -3518,6 +3586,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
||||
NETIF_F_HW_VLAN_RX |
|
||||
NETIF_F_HW_VLAN_FILTER;
|
||||
|
||||
netdev->features |= NETIF_F_LRO;
|
||||
netdev->features |= NETIF_F_TSO;
|
||||
netdev->features |= NETIF_F_TSO6;
|
||||
|
||||
|
@ -1739,7 +1739,6 @@ static int netdrv_close (struct net_device *dev)
|
||||
|
||||
spin_unlock_irqrestore (&tp->lock, flags);
|
||||
|
||||
synchronize_irq (dev->irq);
|
||||
free_irq (dev->irq, dev);
|
||||
|
||||
netdrv_tx_clear (dev);
|
||||
|
@ -322,7 +322,7 @@ static int sh_eth_dev_init(struct net_device *ndev)
|
||||
ctrl_outl((FIFO_SIZE_T | FIFO_SIZE_R), ioaddr + FDR);
|
||||
ctrl_outl(0, ioaddr + TFTR);
|
||||
|
||||
ctrl_outl(RMCR_RST, ioaddr + RMCR);
|
||||
ctrl_outl(0, ioaddr + RMCR);
|
||||
|
||||
rx_int_var = mdp->rx_int_var = DESC_I_RINT8 | DESC_I_RINT5;
|
||||
tx_int_var = mdp->tx_int_var = DESC_I_TINT2;
|
||||
@ -994,7 +994,7 @@ static int sh_mdio_init(struct net_device *ndev, int id)
|
||||
/* Hook up MII support for ethtool */
|
||||
mdp->mii_bus->name = "sh_mii";
|
||||
mdp->mii_bus->dev = &ndev->dev;
|
||||
mdp->mii_bus->id = id;
|
||||
mdp->mii_bus->id[0] = id;
|
||||
|
||||
/* PHY IRQ */
|
||||
mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
|
||||
|
@ -40,8 +40,6 @@
|
||||
#define PKT_BUF_SZ 1538
|
||||
|
||||
/* Chip Base Address */
|
||||
#define SH_ETH0_BASE 0xA7000000
|
||||
#define SH_ETH1_BASE 0xA7000400
|
||||
#define SH_TSU_ADDR 0xA7000804
|
||||
|
||||
/* Chip Registers */
|
||||
@ -462,3 +460,5 @@ static void swaps(char *src, int len)
|
||||
*p = swab32(*p);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1437,7 +1437,6 @@ static int tsi108_close(struct net_device *dev)
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
synchronize_irq(data->irq_num);
|
||||
free_irq(data->irq_num, dev);
|
||||
|
||||
/* Discard the RX ring. */
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/21142.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,9 +8,8 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
|
||||
for more information on this driver.
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
|
@ -124,8 +124,6 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
|
||||
/* Time in jiffies before concluding the transmitter is hung. */
|
||||
#define TX_TIMEOUT (6*HZ)
|
||||
|
||||
#define DE_UNALIGNED_16(a) (u16)(get_unaligned((u16 *)(a)))
|
||||
|
||||
/* This is a mysterious value that can be written to CSR11 in the 21040 (only)
|
||||
to support a pre-NWay full-duplex signaling mechanism using short frames.
|
||||
No one knows what it should be, but if left at its default value some
|
||||
@ -1811,7 +1809,7 @@ static void __devinit de21041_get_srom_info (struct de_private *de)
|
||||
goto bad_srom;
|
||||
|
||||
/* get default media type */
|
||||
switch (DE_UNALIGNED_16(&il->default_media)) {
|
||||
switch (get_unaligned(&il->default_media)) {
|
||||
case 0x0001: de->media_type = DE_MEDIA_BNC; break;
|
||||
case 0x0002: de->media_type = DE_MEDIA_AUI; break;
|
||||
case 0x0204: de->media_type = DE_MEDIA_TP_FD; break;
|
||||
@ -1875,9 +1873,9 @@ static void __devinit de21041_get_srom_info (struct de_private *de)
|
||||
bufp += sizeof (ib->opts);
|
||||
|
||||
if (ib->opts & MediaCustomCSRs) {
|
||||
de->media[idx].csr13 = DE_UNALIGNED_16(&ib->csr13);
|
||||
de->media[idx].csr14 = DE_UNALIGNED_16(&ib->csr14);
|
||||
de->media[idx].csr15 = DE_UNALIGNED_16(&ib->csr15);
|
||||
de->media[idx].csr13 = get_unaligned(&ib->csr13);
|
||||
de->media[idx].csr14 = get_unaligned(&ib->csr14);
|
||||
de->media[idx].csr15 = get_unaligned(&ib->csr15);
|
||||
bufp += sizeof(ib->csr13) + sizeof(ib->csr14) +
|
||||
sizeof(ib->csr15);
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/eeprom.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,9 +8,8 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
|
||||
for more information on this driver.
|
||||
Please submit bug reports to http://bugzilla.kernel.org/.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/interrupt.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,8 +8,8 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
|
||||
*/
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/media.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,9 +8,9 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/pnic.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,9 +8,9 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/pnic2.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
Modified to hep support PNIC_II by Kevin B. Hendricks
|
||||
@ -10,9 +9,9 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
/*
|
||||
drivers/net/tulip/timer.c
|
||||
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,11 +8,12 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
|
||||
#include "tulip.h"
|
||||
|
||||
|
||||
|
@ -8,9 +8,9 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
#ifndef __NET_TULIP_H__
|
||||
|
@ -1,7 +1,5 @@
|
||||
/* tulip_core.c: A DEC 21x4x-family ethernet driver for Linux. */
|
||||
/* tulip_core.c: A DEC 21x4x-family ethernet driver for Linux.
|
||||
|
||||
/*
|
||||
Maintained by Valerie Henson <val_henson@linux.intel.com>
|
||||
Copyright 2000,2001 The Linux Kernel Team
|
||||
Written/copyright 1994-2001 by Donald Becker.
|
||||
|
||||
@ -9,9 +7,9 @@
|
||||
of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
||||
for more information on this driver, or visit the project
|
||||
Web page at http://sourceforge.net/projects/tulip/
|
||||
for more information on this driver.
|
||||
|
||||
Please submit bugs to http://bugzilla.kernel.org/ .
|
||||
*/
|
||||
|
||||
|
||||
|
@ -334,8 +334,6 @@ enum state_values {
|
||||
#define TYPHOON_RESET_TIMEOUT_NOSLEEP ((6 * 1000000) / TYPHOON_UDELAY)
|
||||
#define TYPHOON_WAIT_TIMEOUT ((1000000 / 2) / TYPHOON_UDELAY)
|
||||
|
||||
#define typhoon_synchronize_irq(x) synchronize_irq(x)
|
||||
|
||||
#if defined(NETIF_F_TSO)
|
||||
#define skb_tso_size(x) (skb_shinfo(x)->gso_size)
|
||||
#define TSO_NUM_DESCRIPTORS 2
|
||||
@ -2143,7 +2141,6 @@ typhoon_close(struct net_device *dev)
|
||||
printk(KERN_ERR "%s: unable to stop runtime\n", dev->name);
|
||||
|
||||
/* Make sure there is no irq handler running on a different CPU. */
|
||||
typhoon_synchronize_irq(dev->irq);
|
||||
free_irq(dev->irq, dev);
|
||||
|
||||
typhoon_free_rx_rings(tp);
|
||||
|
@ -74,7 +74,7 @@ EXPORT_SYMBOL_GPL(rndis_status);
|
||||
* Call context is likely probe(), before interface name is known,
|
||||
* which is why we won't try to use it in the diagnostics.
|
||||
*/
|
||||
int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
|
||||
int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
|
||||
{
|
||||
struct cdc_state *info = (void *) &dev->data;
|
||||
int master_ifnum;
|
||||
@ -121,7 +121,7 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
|
||||
USB_CDC_GET_ENCAPSULATED_RESPONSE,
|
||||
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
0, master_ifnum,
|
||||
buf, CONTROL_BUFFER_SIZE,
|
||||
buf, buflen,
|
||||
RNDIS_CONTROL_TIMEOUT_MS);
|
||||
if (likely(retval >= 8)) {
|
||||
msg_len = le32_to_cpu(buf->msg_len);
|
||||
@ -239,7 +239,7 @@ static int rndis_query(struct usbnet *dev, struct usb_interface *intf,
|
||||
u.get->len = cpu_to_le32(in_len);
|
||||
u.get->offset = ccpu2(20);
|
||||
|
||||
retval = rndis_command(dev, u.header);
|
||||
retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
|
||||
if (unlikely(retval < 0)) {
|
||||
dev_err(&intf->dev, "RNDIS_MSG_QUERY(0x%08x) failed, %d\n",
|
||||
oid, retval);
|
||||
@ -328,7 +328,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
|
||||
u.init->max_transfer_size = cpu_to_le32(dev->rx_urb_size);
|
||||
|
||||
net->change_mtu = NULL;
|
||||
retval = rndis_command(dev, u.header);
|
||||
retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
|
||||
if (unlikely(retval < 0)) {
|
||||
/* it might not even be an RNDIS device!! */
|
||||
dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
|
||||
@ -409,7 +409,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
|
||||
u.set->offset = ccpu2((sizeof *u.set) - 8);
|
||||
*(__le32 *)(u.buf + sizeof *u.set) = RNDIS_DEFAULT_FILTER;
|
||||
|
||||
retval = rndis_command(dev, u.header);
|
||||
retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
|
||||
if (unlikely(retval < 0)) {
|
||||
dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
|
||||
goto halt_fail_and_release;
|
||||
@ -424,7 +424,7 @@ halt_fail_and_release:
|
||||
memset(u.halt, 0, sizeof *u.halt);
|
||||
u.halt->msg_type = RNDIS_MSG_HALT;
|
||||
u.halt->msg_len = ccpu2(sizeof *u.halt);
|
||||
(void) rndis_command(dev, (void *)u.halt);
|
||||
(void) rndis_command(dev, (void *)u.halt, CONTROL_BUFFER_SIZE);
|
||||
fail_and_release:
|
||||
usb_set_intfdata(info->data, NULL);
|
||||
usb_driver_release_interface(driver_of(intf), info->data);
|
||||
@ -449,7 +449,7 @@ void rndis_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
if (halt) {
|
||||
halt->msg_type = RNDIS_MSG_HALT;
|
||||
halt->msg_len = ccpu2(sizeof *halt);
|
||||
(void) rndis_command(dev, (void *)halt);
|
||||
(void) rndis_command(dev, (void *)halt, CONTROL_BUFFER_SIZE);
|
||||
kfree(halt);
|
||||
}
|
||||
|
||||
|
@ -448,7 +448,7 @@ static int rndis_query_oid(struct usbnet *dev, __le32 oid, void *data, int *len)
|
||||
u.get->msg_len = ccpu2(sizeof *u.get);
|
||||
u.get->oid = oid;
|
||||
|
||||
ret = rndis_command(dev, u.header);
|
||||
ret = rndis_command(dev, u.header, buflen);
|
||||
if (ret == 0) {
|
||||
ret = le32_to_cpu(u.get_c->len);
|
||||
*len = (*len > ret) ? ret : *len;
|
||||
@ -498,7 +498,7 @@ static int rndis_set_oid(struct usbnet *dev, __le32 oid, void *data, int len)
|
||||
u.set->handle = ccpu2(0);
|
||||
memcpy(u.buf + sizeof(*u.set), data, len);
|
||||
|
||||
ret = rndis_command(dev, u.header);
|
||||
ret = rndis_command(dev, u.header, buflen);
|
||||
if (ret == 0)
|
||||
ret = rndis_error_status(u.set_c->status);
|
||||
|
||||
|
@ -315,6 +315,25 @@ static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev,
|
||||
}
|
||||
return PCI_POWER_ERROR;
|
||||
}
|
||||
|
||||
static int acpi_platform_enable_wakeup(struct device *dev, int is_on)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
int status;
|
||||
|
||||
if (!device_can_wakeup(dev))
|
||||
return -EINVAL;
|
||||
|
||||
if (is_on && !device_may_wakeup(dev))
|
||||
return -EINVAL;
|
||||
|
||||
status = acpi_bus_get_device(DEVICE_ACPI_HANDLE(dev), &adev);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
adev->wakeup.state.enabled = !!is_on;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
@ -399,6 +418,7 @@ static int __init acpi_pci_init(void)
|
||||
return 0;
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
platform_pci_choose_state = acpi_pci_choose_state;
|
||||
platform_enable_wakeup = acpi_platform_enable_wakeup;
|
||||
#endif
|
||||
platform_pci_set_power_state = acpi_pci_set_power_state;
|
||||
return 0;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define DM9000_PLATF_32BITONLY (0x0004)
|
||||
#define DM9000_PLATF_EXT_PHY (0x0008)
|
||||
#define DM9000_PLATF_NO_EEPROM (0x0010)
|
||||
#define DM9000_PLATF_SIMPLE_PHY (0x0020) /* Use NSR to find LinkStatus */
|
||||
|
||||
/* platfrom data for platfrom device structure's platfrom_data field */
|
||||
|
||||
|
@ -260,7 +260,8 @@ struct rndis_keepalive_c { /* IN (optionally OUT) */
|
||||
|
||||
|
||||
extern void rndis_status(struct usbnet *dev, struct urb *urb);
|
||||
extern int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf);
|
||||
extern int
|
||||
rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen);
|
||||
extern int
|
||||
generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags);
|
||||
extern void rndis_unbind(struct usbnet *dev, struct usb_interface *intf);
|
||||
|
Loading…
Reference in New Issue
Block a user