You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'davem-next' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+9
-50
@@ -1694,26 +1694,6 @@ config VIA_RHINE_MMIO
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config VIA_RHINE_NAPI
|
||||
bool "Use Rx Polling (NAPI)"
|
||||
depends on VIA_RHINE
|
||||
help
|
||||
NAPI is a new driver API designed to reduce CPU and interrupt load
|
||||
when the driver is receiving lots of packets from the card.
|
||||
|
||||
If your estimated Rx load is 10kpps or more, or if the card will be
|
||||
deployed on potentially unfriendly networks (e.g. in a firewall),
|
||||
then say Y here.
|
||||
|
||||
config LAN_SAA9730
|
||||
bool "Philips SAA9730 Ethernet support"
|
||||
depends on NET_PCI && PCI && MIPS_ATLAS
|
||||
help
|
||||
The SAA9730 is a combined multimedia and peripheral controller used
|
||||
in thin clients, Internet access terminals, and diskless
|
||||
workstations.
|
||||
See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.
|
||||
|
||||
config SC92031
|
||||
tristate "Silan SC92031 PCI Fast Ethernet Adapter driver (EXPERIMENTAL)"
|
||||
depends on NET_PCI && PCI && EXPERIMENTAL
|
||||
@@ -2029,6 +2009,15 @@ config IGB
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called igb.
|
||||
|
||||
config IGB_LRO
|
||||
bool "Use software LRO"
|
||||
depends on IGB && INET
|
||||
select INET_LRO
|
||||
---help---
|
||||
Say Y here if you want to use large receive offload.
|
||||
|
||||
If in doubt, say N.
|
||||
|
||||
source "drivers/net/ixp2000/Kconfig"
|
||||
|
||||
config MYRI_SBUS
|
||||
@@ -2273,10 +2262,6 @@ config GIANFAR
|
||||
This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx,
|
||||
and MPC86xx family of chips, and the FEC on the 8540.
|
||||
|
||||
config GFAR_NAPI
|
||||
bool "Use Rx Polling (NAPI)"
|
||||
depends on GIANFAR
|
||||
|
||||
config UCC_GETH
|
||||
tristate "Freescale QE Gigabit Ethernet"
|
||||
depends on QUICC_ENGINE
|
||||
@@ -2285,10 +2270,6 @@ config UCC_GETH
|
||||
This driver supports the Gigabit Ethernet mode of the QUICC Engine,
|
||||
which is available on some Freescale SOCs.
|
||||
|
||||
config UGETH_NAPI
|
||||
bool "Use Rx Polling (NAPI)"
|
||||
depends on UCC_GETH
|
||||
|
||||
config UGETH_MAGIC_PACKET
|
||||
bool "Magic Packet detection support"
|
||||
depends on UCC_GETH
|
||||
@@ -2378,14 +2359,6 @@ config CHELSIO_T1_1G
|
||||
Enables support for Chelsio's gigabit Ethernet PCI cards. If you
|
||||
are using only 10G cards say 'N' here.
|
||||
|
||||
config CHELSIO_T1_NAPI
|
||||
bool "Use Rx Polling (NAPI)"
|
||||
depends on CHELSIO_T1
|
||||
default y
|
||||
help
|
||||
NAPI is a driver API designed to reduce CPU and interrupt load
|
||||
when the driver is receiving lots of packets from the card.
|
||||
|
||||
config CHELSIO_T3
|
||||
tristate "Chelsio Communications T3 10Gb Ethernet support"
|
||||
depends on PCI && INET
|
||||
@@ -2457,20 +2430,6 @@ config IXGB
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called ixgb.
|
||||
|
||||
config IXGB_NAPI
|
||||
bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
|
||||
depends on IXGB && EXPERIMENTAL
|
||||
help
|
||||
NAPI is a new driver API designed to reduce CPU and interrupt load
|
||||
when the driver is receiving lots of packets from the card. It is
|
||||
still somewhat experimental and thus not yet enabled by default.
|
||||
|
||||
If your estimated Rx load is 10kpps or more, or if the card will be
|
||||
deployed on potentially unfriendly networks (e.g. in a firewall),
|
||||
then say Y here.
|
||||
|
||||
If in doubt, say N.
|
||||
|
||||
config S2IO
|
||||
tristate "S2IO 10Gbe XFrame NIC"
|
||||
depends on PCI
|
||||
|
||||
@@ -166,7 +166,6 @@ obj-$(CONFIG_EEXPRESS_PRO) += eepro.o
|
||||
obj-$(CONFIG_8139CP) += 8139cp.o
|
||||
obj-$(CONFIG_8139TOO) += 8139too.o
|
||||
obj-$(CONFIG_ZNET) += znet.o
|
||||
obj-$(CONFIG_LAN_SAA9730) += saa9730.o
|
||||
obj-$(CONFIG_CPMAC) += cpmac.o
|
||||
obj-$(CONFIG_DEPCA) += depca.o
|
||||
obj-$(CONFIG_EWRK3) += ewrk3.o
|
||||
|
||||
@@ -1153,9 +1153,7 @@ static int __devinit init_one(struct pci_dev *pdev,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
netdev->poll_controller = t1_netpoll;
|
||||
#endif
|
||||
#ifdef CONFIG_CHELSIO_T1_NAPI
|
||||
netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
|
||||
#endif
|
||||
|
||||
SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
|
||||
}
|
||||
|
||||
@@ -1396,20 +1396,10 @@ static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len)
|
||||
|
||||
if (unlikely(adapter->vlan_grp && p->vlan_valid)) {
|
||||
st->vlan_xtract++;
|
||||
#ifdef CONFIG_CHELSIO_T1_NAPI
|
||||
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp,
|
||||
ntohs(p->vlan));
|
||||
#else
|
||||
vlan_hwaccel_rx(skb, adapter->vlan_grp,
|
||||
ntohs(p->vlan));
|
||||
#endif
|
||||
} else {
|
||||
#ifdef CONFIG_CHELSIO_T1_NAPI
|
||||
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp,
|
||||
ntohs(p->vlan));
|
||||
} else
|
||||
netif_receive_skb(skb);
|
||||
#else
|
||||
netif_rx(skb);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1568,7 +1558,6 @@ static inline int responses_pending(const struct adapter *adapter)
|
||||
return (e->GenerationBit == Q->genbit);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CHELSIO_T1_NAPI
|
||||
/*
|
||||
* A simpler version of process_responses() that handles only pure (i.e.,
|
||||
* non data-carrying) responses. Such respones are too light-weight to justify
|
||||
@@ -1636,9 +1625,6 @@ int t1_poll(struct napi_struct *napi, int budget)
|
||||
return work_done;
|
||||
}
|
||||
|
||||
/*
|
||||
* NAPI version of the main interrupt handler.
|
||||
*/
|
||||
irqreturn_t t1_interrupt(int irq, void *data)
|
||||
{
|
||||
struct adapter *adapter = data;
|
||||
@@ -1656,7 +1642,8 @@ irqreturn_t t1_interrupt(int irq, void *data)
|
||||
else {
|
||||
/* no data, no NAPI needed */
|
||||
writel(sge->respQ.cidx, adapter->regs + A_SG_SLEEPING);
|
||||
napi_enable(&adapter->napi); /* undo schedule_prep */
|
||||
/* undo schedule_prep */
|
||||
napi_enable(&adapter->napi);
|
||||
}
|
||||
}
|
||||
return IRQ_HANDLED;
|
||||
@@ -1672,53 +1659,6 @@ irqreturn_t t1_interrupt(int irq, void *data)
|
||||
return IRQ_RETVAL(handled != 0);
|
||||
}
|
||||
|
||||
#else
|
||||
/*
|
||||
* Main interrupt handler, optimized assuming that we took a 'DATA'
|
||||
* interrupt.
|
||||
*
|
||||
* 1. Clear the interrupt
|
||||
* 2. Loop while we find valid descriptors and process them; accumulate
|
||||
* information that can be processed after the loop
|
||||
* 3. Tell the SGE at which index we stopped processing descriptors
|
||||
* 4. Bookkeeping; free TX buffers, ring doorbell if there are any
|
||||
* outstanding TX buffers waiting, replenish RX buffers, potentially
|
||||
* reenable upper layers if they were turned off due to lack of TX
|
||||
* resources which are available again.
|
||||
* 5. If we took an interrupt, but no valid respQ descriptors was found we
|
||||
* let the slow_intr_handler run and do error handling.
|
||||
*/
|
||||
irqreturn_t t1_interrupt(int irq, void *cookie)
|
||||
{
|
||||
int work_done;
|
||||
struct adapter *adapter = cookie;
|
||||
struct respQ *Q = &adapter->sge->respQ;
|
||||
|
||||
spin_lock(&adapter->async_lock);
|
||||
|
||||
writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE);
|
||||
|
||||
if (likely(responses_pending(adapter)))
|
||||
work_done = process_responses(adapter, -1);
|
||||
else
|
||||
work_done = t1_slow_intr_handler(adapter);
|
||||
|
||||
/*
|
||||
* The unconditional clearing of the PL_CAUSE above may have raced
|
||||
* with DMA completion and the corresponding generation of a response
|
||||
* to cause us to miss the resulting data interrupt. The next write
|
||||
* is also unconditional to recover the missed interrupt and render
|
||||
* this race harmless.
|
||||
*/
|
||||
writel(Q->cidx, adapter->regs + A_SG_SLEEPING);
|
||||
|
||||
if (!work_done)
|
||||
adapter->sge->stats.unhandled_irqs++;
|
||||
spin_unlock(&adapter->async_lock);
|
||||
return IRQ_RETVAL(work_done != 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enqueues the sk_buff onto the cmdQ[qid] and has hardware fetch it.
|
||||
*
|
||||
|
||||
@@ -110,10 +110,7 @@ struct ulp_iscsi_info {
|
||||
unsigned int llimit;
|
||||
unsigned int ulimit;
|
||||
unsigned int tagmask;
|
||||
unsigned int pgsz3;
|
||||
unsigned int pgsz2;
|
||||
unsigned int pgsz1;
|
||||
unsigned int pgsz0;
|
||||
u8 pgsz_factor[4];
|
||||
unsigned int max_rxsz;
|
||||
unsigned int max_txsz;
|
||||
struct pci_dev *pdev;
|
||||
|
||||
@@ -207,6 +207,17 @@ static int cxgb_ulp_iscsi_ctl(struct adapter *adapter, unsigned int req,
|
||||
break;
|
||||
case ULP_ISCSI_SET_PARAMS:
|
||||
t3_write_reg(adapter, A_ULPRX_ISCSI_TAGMASK, uiip->tagmask);
|
||||
/* set MaxRxData and MaxCoalesceSize to 16224 */
|
||||
t3_write_reg(adapter, A_TP_PARA_REG2, 0x3f603f60);
|
||||
/* program the ddp page sizes */
|
||||
{
|
||||
int i;
|
||||
unsigned int val = 0;
|
||||
for (i = 0; i < 4; i++)
|
||||
val |= (uiip->pgsz_factor[i] & 0xF) << (8 * i);
|
||||
if (val)
|
||||
t3_write_reg(adapter, A_ULPRX_ISCSI_PSZ, val);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
|
||||
@@ -1517,16 +1517,18 @@
|
||||
|
||||
#define A_ULPRX_ISCSI_TAGMASK 0x514
|
||||
|
||||
#define S_HPZ0 0
|
||||
#define M_HPZ0 0xf
|
||||
#define V_HPZ0(x) ((x) << S_HPZ0)
|
||||
#define G_HPZ0(x) (((x) >> S_HPZ0) & M_HPZ0)
|
||||
#define A_ULPRX_ISCSI_PSZ 0x518
|
||||
|
||||
#define A_ULPRX_TDDP_LLIMIT 0x51c
|
||||
|
||||
#define A_ULPRX_TDDP_ULIMIT 0x520
|
||||
#define A_ULPRX_TDDP_PSZ 0x528
|
||||
|
||||
#define S_HPZ0 0
|
||||
#define M_HPZ0 0xf
|
||||
#define V_HPZ0(x) ((x) << S_HPZ0)
|
||||
#define G_HPZ0(x) (((x) >> S_HPZ0) & M_HPZ0)
|
||||
|
||||
#define A_ULPRX_STAG_LLIMIT 0x52c
|
||||
|
||||
#define A_ULPRX_STAG_ULIMIT 0x530
|
||||
|
||||
@@ -191,6 +191,9 @@ union opcode_tid {
|
||||
#define G_OPCODE(x) (((x) >> S_OPCODE) & 0xFF)
|
||||
#define G_TID(x) ((x) & 0xFFFFFF)
|
||||
|
||||
#define S_QNUM 0
|
||||
#define G_QNUM(x) (((x) >> S_QNUM) & 0xFFFF)
|
||||
|
||||
#define S_HASHTYPE 22
|
||||
#define M_HASHTYPE 0x3
|
||||
#define G_HASHTYPE(x) (((x) >> S_HASHTYPE) & M_HASHTYPE)
|
||||
@@ -779,6 +782,12 @@ struct tx_data_wr {
|
||||
__be32 param;
|
||||
};
|
||||
|
||||
/* tx_data_wr.flags fields */
|
||||
#define S_TX_ACK_PAGES 21
|
||||
#define M_TX_ACK_PAGES 0x7
|
||||
#define V_TX_ACK_PAGES(x) ((x) << S_TX_ACK_PAGES)
|
||||
#define G_TX_ACK_PAGES(x) (((x) >> S_TX_ACK_PAGES) & M_TX_ACK_PAGES)
|
||||
|
||||
/* tx_data_wr.param fields */
|
||||
#define S_TX_PORT 0
|
||||
#define M_TX_PORT 0x7
|
||||
@@ -1452,4 +1461,35 @@ struct cpl_rdma_terminate {
|
||||
#define M_TERM_TID 0xFFFFF
|
||||
#define V_TERM_TID(x) ((x) << S_TERM_TID)
|
||||
#define G_TERM_TID(x) (((x) >> S_TERM_TID) & M_TERM_TID)
|
||||
|
||||
/* ULP_TX opcodes */
|
||||
enum { ULP_MEM_READ = 2, ULP_MEM_WRITE = 3, ULP_TXPKT = 4 };
|
||||
|
||||
#define S_ULPTX_CMD 28
|
||||
#define M_ULPTX_CMD 0xF
|
||||
#define V_ULPTX_CMD(x) ((x) << S_ULPTX_CMD)
|
||||
|
||||
#define S_ULPTX_NFLITS 0
|
||||
#define M_ULPTX_NFLITS 0xFF
|
||||
#define V_ULPTX_NFLITS(x) ((x) << S_ULPTX_NFLITS)
|
||||
|
||||
struct ulp_mem_io {
|
||||
WR_HDR;
|
||||
__be32 cmd_lock_addr;
|
||||
__be32 len;
|
||||
};
|
||||
|
||||
/* ulp_mem_io.cmd_lock_addr fields */
|
||||
#define S_ULP_MEMIO_ADDR 0
|
||||
#define M_ULP_MEMIO_ADDR 0x7FFFFFF
|
||||
#define V_ULP_MEMIO_ADDR(x) ((x) << S_ULP_MEMIO_ADDR)
|
||||
#define S_ULP_MEMIO_LOCK 27
|
||||
#define V_ULP_MEMIO_LOCK(x) ((x) << S_ULP_MEMIO_LOCK)
|
||||
#define F_ULP_MEMIO_LOCK V_ULP_MEMIO_LOCK(1U)
|
||||
|
||||
/* ulp_mem_io.len fields */
|
||||
#define S_ULP_MEMIO_DATA_LEN 28
|
||||
#define M_ULP_MEMIO_DATA_LEN 0xF
|
||||
#define V_ULP_MEMIO_DATA_LEN(x) ((x) << S_ULP_MEMIO_DATA_LEN)
|
||||
|
||||
#endif /* T3_CPL_H */
|
||||
|
||||
@@ -64,6 +64,7 @@ struct t3cdev {
|
||||
void *l3opt; /* optional layer 3 data */
|
||||
void *l4opt; /* optional layer 4 data */
|
||||
void *ulp; /* ulp stuff */
|
||||
void *ulp_iscsi; /* ulp iscsi */
|
||||
};
|
||||
|
||||
#endif /* _T3CDEV_H_ */
|
||||
|
||||
+6
-70
@@ -44,8 +44,7 @@
|
||||
* happen immediately, but will wait until either a set number
|
||||
* of frames or amount of time have passed). In NAPI, the
|
||||
* interrupt handler will signal there is work to be done, and
|
||||
* exit. Without NAPI, the packet(s) will be handled
|
||||
* immediately. Both methods will start at the last known empty
|
||||
* exit. This method will start at the last known empty
|
||||
* descriptor, and process every subsequent descriptor until there
|
||||
* are none left with data (NAPI will stop after a set number of
|
||||
* packets to give time to other tasks, but will eventually
|
||||
@@ -101,12 +100,6 @@
|
||||
#undef BRIEF_GFAR_ERRORS
|
||||
#undef VERBOSE_GFAR_ERRORS
|
||||
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
#define RECEIVE(x) netif_receive_skb(x)
|
||||
#else
|
||||
#define RECEIVE(x) netif_rx(x)
|
||||
#endif
|
||||
|
||||
const char gfar_driver_name[] = "Gianfar Ethernet";
|
||||
const char gfar_driver_version[] = "1.3";
|
||||
|
||||
@@ -131,9 +124,7 @@ static void free_skb_resources(struct gfar_private *priv);
|
||||
static void gfar_set_multi(struct net_device *dev);
|
||||
static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr);
|
||||
static void gfar_configure_serdes(struct net_device *dev);
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
static int gfar_poll(struct napi_struct *napi, int budget);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void gfar_netpoll(struct net_device *dev);
|
||||
#endif
|
||||
@@ -260,9 +251,7 @@ static int gfar_probe(struct platform_device *pdev)
|
||||
dev->hard_start_xmit = gfar_start_xmit;
|
||||
dev->tx_timeout = gfar_timeout;
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
netif_napi_add(dev, &priv->napi, gfar_poll, GFAR_DEV_WEIGHT);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
dev->poll_controller = gfar_netpoll;
|
||||
#endif
|
||||
@@ -363,11 +352,7 @@ static int gfar_probe(struct platform_device *pdev)
|
||||
|
||||
/* Even more device info helps when determining which kernel */
|
||||
/* provided which set of benchmarks. */
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
|
||||
#else
|
||||
printk(KERN_INFO "%s: Running with NAPI disabled\n", dev->name);
|
||||
#endif
|
||||
printk(KERN_INFO "%s: %d/%d RX/TX BD ring size\n",
|
||||
dev->name, priv->rx_ring_size, priv->tx_ring_size);
|
||||
|
||||
@@ -945,14 +930,10 @@ tx_skb_fail:
|
||||
/* Returns 0 for success. */
|
||||
static int gfar_enet_open(struct net_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
#endif
|
||||
int err;
|
||||
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
napi_enable(&priv->napi);
|
||||
#endif
|
||||
|
||||
/* Initialize a bunch of registers */
|
||||
init_registers(dev);
|
||||
@@ -962,17 +943,13 @@ static int gfar_enet_open(struct net_device *dev)
|
||||
err = init_phy(dev);
|
||||
|
||||
if(err) {
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
napi_disable(&priv->napi);
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
err = startup_gfar(dev);
|
||||
if (err) {
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
napi_disable(&priv->napi);
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1128,9 +1105,7 @@ static int gfar_close(struct net_device *dev)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
napi_disable(&priv->napi);
|
||||
#endif
|
||||
|
||||
stop_gfar(dev);
|
||||
|
||||
@@ -1427,14 +1402,9 @@ irqreturn_t gfar_receive(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *) dev_id;
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
u32 tempval;
|
||||
#else
|
||||
unsigned long flags;
|
||||
#endif
|
||||
|
||||
/* support NAPI */
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
/* Clear IEVENT, so interrupts aren't called again
|
||||
* because of the packets that have already arrived */
|
||||
gfar_write(&priv->regs->ievent, IEVENT_RTX_MASK);
|
||||
@@ -1451,38 +1421,10 @@ irqreturn_t gfar_receive(int irq, void *dev_id)
|
||||
dev->name, gfar_read(&priv->regs->ievent),
|
||||
gfar_read(&priv->regs->imask));
|
||||
}
|
||||
#else
|
||||
/* Clear IEVENT, so rx interrupt isn't called again
|
||||
* because of this interrupt */
|
||||
gfar_write(&priv->regs->ievent, IEVENT_RX_MASK);
|
||||
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
gfar_clean_rx_ring(dev, priv->rx_ring_size);
|
||||
|
||||
/* If we are coalescing interrupts, update the timer */
|
||||
/* Otherwise, clear it */
|
||||
if (likely(priv->rxcoalescing)) {
|
||||
gfar_write(&priv->regs->rxic, 0);
|
||||
gfar_write(&priv->regs->rxic,
|
||||
mk_ic_value(priv->rxcount, priv->rxtime));
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
#endif
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static inline int gfar_rx_vlan(struct sk_buff *skb,
|
||||
struct vlan_group *vlgrp, unsigned short vlctl)
|
||||
{
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
return vlan_hwaccel_receive_skb(skb, vlgrp, vlctl);
|
||||
#else
|
||||
return vlan_hwaccel_rx(skb, vlgrp, vlctl);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
|
||||
{
|
||||
/* If valid headers were found, and valid sums
|
||||
@@ -1539,10 +1481,11 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
/* Send the packet up the stack */
|
||||
if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN)))
|
||||
ret = gfar_rx_vlan(skb, priv->vlgrp, fcb->vlctl);
|
||||
else
|
||||
ret = RECEIVE(skb);
|
||||
if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN))) {
|
||||
ret = vlan_hwaccel_receive_skb(skb, priv->vlgrp,
|
||||
fcb->vlctl);
|
||||
} else
|
||||
ret = netif_receive_skb(skb);
|
||||
|
||||
if (NET_RX_DROP == ret)
|
||||
priv->extra_stats.kernel_dropped++;
|
||||
@@ -1629,7 +1572,6 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
||||
return howmany;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
static int gfar_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct gfar_private *priv = container_of(napi, struct gfar_private, napi);
|
||||
@@ -1664,7 +1606,6 @@ static int gfar_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
return howmany;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
/*
|
||||
@@ -2003,11 +1944,6 @@ static irqreturn_t gfar_error(int irq, void *dev_id)
|
||||
|
||||
gfar_receive(irq, dev_id);
|
||||
|
||||
#ifndef CONFIG_GFAR_NAPI
|
||||
/* Clear the halt bit in RSTAT */
|
||||
gfar_write(&priv->regs->rstat, RSTAT_CLEAR_RHALT);
|
||||
#endif
|
||||
|
||||
if (netif_msg_rx_err(priv))
|
||||
printk(KERN_DEBUG "%s: busy error (rstat: %x)\n",
|
||||
dev->name, gfar_read(&priv->regs->rstat));
|
||||
|
||||
@@ -77,13 +77,8 @@ extern const char gfar_driver_name[];
|
||||
extern const char gfar_driver_version[];
|
||||
|
||||
/* These need to be powers of 2 for this driver */
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
#define DEFAULT_TX_RING_SIZE 256
|
||||
#define DEFAULT_RX_RING_SIZE 256
|
||||
#else
|
||||
#define DEFAULT_TX_RING_SIZE 64
|
||||
#define DEFAULT_RX_RING_SIZE 64
|
||||
#endif
|
||||
|
||||
#define GFAR_RX_MAX_RING_SIZE 256
|
||||
#define GFAR_TX_MAX_RING_SIZE 256
|
||||
@@ -128,14 +123,8 @@ extern const char gfar_driver_version[];
|
||||
|
||||
#define DEFAULT_RXTIME 21
|
||||
|
||||
/* Non NAPI Case */
|
||||
#ifndef CONFIG_GFAR_NAPI
|
||||
#define DEFAULT_RX_COALESCE 1
|
||||
#define DEFAULT_RXCOUNT 16
|
||||
#else
|
||||
#define DEFAULT_RX_COALESCE 0
|
||||
#define DEFAULT_RXCOUNT 0
|
||||
#endif /* CONFIG_GFAR_NAPI */
|
||||
|
||||
#define MIIMCFG_INIT_VALUE 0x00000007
|
||||
#define MIIMCFG_RESET 0x80000000
|
||||
|
||||
+195
-13
@@ -31,6 +31,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/if_ether.h>
|
||||
|
||||
#include "e1000_mac.h"
|
||||
#include "e1000_82575.h"
|
||||
@@ -45,7 +46,6 @@ static s32 igb_get_cfg_done_82575(struct e1000_hw *);
|
||||
static s32 igb_init_hw_82575(struct e1000_hw *);
|
||||
static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *);
|
||||
static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16 *);
|
||||
static void igb_rar_set_82575(struct e1000_hw *, u8 *, u32);
|
||||
static s32 igb_reset_hw_82575(struct e1000_hw *);
|
||||
static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *, bool);
|
||||
static s32 igb_setup_copper_link_82575(struct e1000_hw *);
|
||||
@@ -84,6 +84,12 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
||||
case E1000_DEV_ID_82575GB_QUAD_COPPER:
|
||||
mac->type = e1000_82575;
|
||||
break;
|
||||
case E1000_DEV_ID_82576:
|
||||
case E1000_DEV_ID_82576_FIBER:
|
||||
case E1000_DEV_ID_82576_SERDES:
|
||||
case E1000_DEV_ID_82576_QUAD_COPPER:
|
||||
mac->type = e1000_82576;
|
||||
break;
|
||||
default:
|
||||
return -E1000_ERR_MAC_INIT;
|
||||
break;
|
||||
@@ -128,6 +134,8 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
||||
mac->mta_reg_count = 128;
|
||||
/* Set rar entry count */
|
||||
mac->rar_entry_count = E1000_RAR_ENTRIES_82575;
|
||||
if (mac->type == e1000_82576)
|
||||
mac->rar_entry_count = E1000_RAR_ENTRIES_82576;
|
||||
/* Set if part includes ASF firmware */
|
||||
mac->asf_firmware_present = true;
|
||||
/* Set if manageability features are enabled. */
|
||||
@@ -694,13 +702,12 @@ static s32 igb_check_for_link_82575(struct e1000_hw *hw)
|
||||
if ((hw->phy.media_type != e1000_media_type_copper) ||
|
||||
(igb_sgmii_active_82575(hw)))
|
||||
ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed,
|
||||
&duplex);
|
||||
&duplex);
|
||||
else
|
||||
ret_val = igb_check_for_copper_link(hw);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_get_pcs_speed_and_duplex_82575 - Retrieve current speed/duplex
|
||||
* @hw: pointer to the HW structure
|
||||
@@ -757,18 +764,129 @@ static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed,
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_rar_set_82575 - Set receive address register
|
||||
* igb_init_rx_addrs_82575 - Initialize receive address's
|
||||
* @hw: pointer to the HW structure
|
||||
* @addr: pointer to the receive address
|
||||
* @index: receive address array register
|
||||
* @rar_count: receive address registers
|
||||
*
|
||||
* Sets the receive address array register at index to the address passed
|
||||
* in by addr.
|
||||
* Setups the receive address registers by setting the base receive address
|
||||
* register to the devices MAC address and clearing all the other receive
|
||||
* address registers to 0.
|
||||
**/
|
||||
static void igb_rar_set_82575(struct e1000_hw *hw, u8 *addr, u32 index)
|
||||
static void igb_init_rx_addrs_82575(struct e1000_hw *hw, u16 rar_count)
|
||||
{
|
||||
if (index < E1000_RAR_ENTRIES_82575)
|
||||
igb_rar_set(hw, addr, index);
|
||||
u32 i;
|
||||
u8 addr[6] = {0,0,0,0,0,0};
|
||||
/*
|
||||
* This function is essentially the same as that of
|
||||
* e1000_init_rx_addrs_generic. However it also takes care
|
||||
* of the special case where the register offset of the
|
||||
* second set of RARs begins elsewhere. This is implicitly taken care by
|
||||
* function e1000_rar_set_generic.
|
||||
*/
|
||||
|
||||
hw_dbg("e1000_init_rx_addrs_82575");
|
||||
|
||||
/* Setup the receive address */
|
||||
hw_dbg("Programming MAC Address into RAR[0]\n");
|
||||
hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
|
||||
|
||||
/* Zero out the other (rar_entry_count - 1) receive addresses */
|
||||
hw_dbg("Clearing RAR[1-%u]\n", rar_count-1);
|
||||
for (i = 1; i < rar_count; i++)
|
||||
hw->mac.ops.rar_set(hw, addr, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_update_mc_addr_list_82575 - Update Multicast addresses
|
||||
* @hw: pointer to the HW structure
|
||||
* @mc_addr_list: array of multicast addresses to program
|
||||
* @mc_addr_count: number of multicast addresses to program
|
||||
* @rar_used_count: the first RAR register free to program
|
||||
* @rar_count: total number of supported Receive Address Registers
|
||||
*
|
||||
* Updates the Receive Address Registers and Multicast Table Array.
|
||||
* The caller must have a packed mc_addr_list of multicast addresses.
|
||||
* The parameter rar_count will usually be hw->mac.rar_entry_count
|
||||
* unless there are workarounds that change this.
|
||||
**/
|
||||
void igb_update_mc_addr_list_82575(struct e1000_hw *hw,
|
||||
u8 *mc_addr_list, u32 mc_addr_count,
|
||||
u32 rar_used_count, u32 rar_count)
|
||||
{
|
||||
u32 hash_value;
|
||||
u32 i;
|
||||
u8 addr[6] = {0,0,0,0,0,0};
|
||||
/*
|
||||
* This function is essentially the same as that of
|
||||
* igb_update_mc_addr_list_generic. However it also takes care
|
||||
* of the special case where the register offset of the
|
||||
* second set of RARs begins elsewhere. This is implicitly taken care by
|
||||
* function e1000_rar_set_generic.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Load the first set of multicast addresses into the exact
|
||||
* filters (RAR). If there are not enough to fill the RAR
|
||||
* array, clear the filters.
|
||||
*/
|
||||
for (i = rar_used_count; i < rar_count; i++) {
|
||||
if (mc_addr_count) {
|
||||
igb_rar_set(hw, mc_addr_list, i);
|
||||
mc_addr_count--;
|
||||
mc_addr_list += ETH_ALEN;
|
||||
} else {
|
||||
igb_rar_set(hw, addr, i);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear the old settings from the MTA */
|
||||
hw_dbg("Clearing MTA\n");
|
||||
for (i = 0; i < hw->mac.mta_reg_count; i++) {
|
||||
array_wr32(E1000_MTA, i, 0);
|
||||
wrfl();
|
||||
}
|
||||
|
||||
/* Load any remaining multicast addresses into the hash table. */
|
||||
for (; mc_addr_count > 0; mc_addr_count--) {
|
||||
hash_value = igb_hash_mc_addr(hw, mc_addr_list);
|
||||
hw_dbg("Hash value = 0x%03X\n", hash_value);
|
||||
hw->mac.ops.mta_set(hw, hash_value);
|
||||
mc_addr_list += ETH_ALEN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_shutdown_fiber_serdes_link_82575 - Remove link during power down
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* In the case of fiber serdes, shut down optics and PCS on driver unload
|
||||
* when management pass thru is not enabled.
|
||||
**/
|
||||
void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
if (hw->mac.type != e1000_82576 ||
|
||||
(hw->phy.media_type != e1000_media_type_fiber &&
|
||||
hw->phy.media_type != e1000_media_type_internal_serdes))
|
||||
return;
|
||||
|
||||
/* if the management interface is not enabled, then power down */
|
||||
if (!igb_enable_mng_pass_thru(hw)) {
|
||||
/* Disable PCS to turn off link */
|
||||
reg = rd32(E1000_PCS_CFG0);
|
||||
reg &= ~E1000_PCS_CFG_PCS_EN;
|
||||
wr32(E1000_PCS_CFG0, reg);
|
||||
|
||||
/* shutdown the laser */
|
||||
reg = rd32(E1000_CTRL_EXT);
|
||||
reg |= E1000_CTRL_EXT_SDP7_DATA;
|
||||
wr32(E1000_CTRL_EXT, reg);
|
||||
|
||||
/* flush the write to verify completion */
|
||||
wrfl();
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -854,7 +972,7 @@ static s32 igb_init_hw_82575(struct e1000_hw *hw)
|
||||
igb_clear_vfta(hw);
|
||||
|
||||
/* Setup the receive address */
|
||||
igb_init_rx_addrs(hw, rar_count);
|
||||
igb_init_rx_addrs_82575(hw, rar_count);
|
||||
/* Zero out the Multicast HASH table */
|
||||
hw_dbg("Zeroing the MTA\n");
|
||||
for (i = 0; i < mac->mta_reg_count; i++)
|
||||
@@ -1113,6 +1231,70 @@ out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_translate_register_82576 - Translate the proper register offset
|
||||
* @reg: e1000 register to be read
|
||||
*
|
||||
* Registers in 82576 are located in different offsets than other adapters
|
||||
* even though they function in the same manner. This function takes in
|
||||
* the name of the register to read and returns the correct offset for
|
||||
* 82576 silicon.
|
||||
**/
|
||||
u32 igb_translate_register_82576(u32 reg)
|
||||
{
|
||||
/*
|
||||
* Some of the Kawela registers are located at different
|
||||
* offsets than they are in older adapters.
|
||||
* Despite the difference in location, the registers
|
||||
* function in the same manner.
|
||||
*/
|
||||
switch (reg) {
|
||||
case E1000_TDBAL(0):
|
||||
reg = 0x0E000;
|
||||
break;
|
||||
case E1000_TDBAH(0):
|
||||
reg = 0x0E004;
|
||||
break;
|
||||
case E1000_TDLEN(0):
|
||||
reg = 0x0E008;
|
||||
break;
|
||||
case E1000_TDH(0):
|
||||
reg = 0x0E010;
|
||||
break;
|
||||
case E1000_TDT(0):
|
||||
reg = 0x0E018;
|
||||
break;
|
||||
case E1000_TXDCTL(0):
|
||||
reg = 0x0E028;
|
||||
break;
|
||||
case E1000_RDBAL(0):
|
||||
reg = 0x0C000;
|
||||
break;
|
||||
case E1000_RDBAH(0):
|
||||
reg = 0x0C004;
|
||||
break;
|
||||
case E1000_RDLEN(0):
|
||||
reg = 0x0C008;
|
||||
break;
|
||||
case E1000_RDH(0):
|
||||
reg = 0x0C010;
|
||||
break;
|
||||
case E1000_RDT(0):
|
||||
reg = 0x0C018;
|
||||
break;
|
||||
case E1000_RXDCTL(0):
|
||||
reg = 0x0C028;
|
||||
break;
|
||||
case E1000_SRRCTL(0):
|
||||
reg = 0x0C00C;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return reg;
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_reset_init_script_82575 - Inits HW defaults after reset
|
||||
* @hw: pointer to the HW structure
|
||||
@@ -1304,7 +1486,7 @@ static struct e1000_mac_operations e1000_mac_ops_82575 = {
|
||||
.reset_hw = igb_reset_hw_82575,
|
||||
.init_hw = igb_init_hw_82575,
|
||||
.check_for_link = igb_check_for_link_82575,
|
||||
.rar_set = igb_rar_set_82575,
|
||||
.rar_set = igb_rar_set,
|
||||
.read_mac_addr = igb_read_mac_addr_82575,
|
||||
.get_speed_and_duplex = igb_get_speed_and_duplex_copper,
|
||||
};
|
||||
|
||||
@@ -28,9 +28,13 @@
|
||||
#ifndef _E1000_82575_H_
|
||||
#define _E1000_82575_H_
|
||||
|
||||
u32 igb_translate_register_82576(u32 reg);
|
||||
void igb_update_mc_addr_list_82575(struct e1000_hw*, u8*, u32, u32, u32);
|
||||
extern void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw);
|
||||
extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw);
|
||||
|
||||
#define E1000_RAR_ENTRIES_82575 16
|
||||
#define E1000_RAR_ENTRIES_82576 24
|
||||
|
||||
/* SRRCTL bit definitions */
|
||||
#define E1000_SRRCTL_BSIZEPKT_SHIFT 10 /* Shift _right_ */
|
||||
@@ -95,6 +99,8 @@ union e1000_adv_rx_desc {
|
||||
/* RSS Hash results */
|
||||
|
||||
/* RSS Packet Types as indicated in the receive descriptor */
|
||||
#define E1000_RXDADV_PKTTYPE_IPV4 0x00000010 /* IPV4 hdr present */
|
||||
#define E1000_RXDADV_PKTTYPE_TCP 0x00000100 /* TCP hdr present */
|
||||
|
||||
/* Transmit Descriptor - Advanced */
|
||||
union e1000_adv_tx_desc {
|
||||
@@ -144,9 +150,25 @@ struct e1000_adv_tx_context_desc {
|
||||
#define E1000_RXDCTL_QUEUE_ENABLE 0x02000000 /* Enable specific Rx Queue */
|
||||
|
||||
/* Direct Cache Access (DCA) definitions */
|
||||
#define E1000_DCA_CTRL_DCA_ENABLE 0x00000000 /* DCA Enable */
|
||||
#define E1000_DCA_CTRL_DCA_DISABLE 0x00000001 /* DCA Disable */
|
||||
|
||||
#define E1000_DCA_CTRL_DCA_MODE_CB1 0x00 /* DCA Mode CB1 */
|
||||
#define E1000_DCA_CTRL_DCA_MODE_CB2 0x02 /* DCA Mode CB2 */
|
||||
|
||||
#define E1000_DCA_RXCTRL_CPUID_MASK 0x0000001F /* Rx CPUID Mask */
|
||||
#define E1000_DCA_RXCTRL_DESC_DCA_EN (1 << 5) /* DCA Rx Desc enable */
|
||||
#define E1000_DCA_RXCTRL_HEAD_DCA_EN (1 << 6) /* DCA Rx Desc header enable */
|
||||
#define E1000_DCA_RXCTRL_DATA_DCA_EN (1 << 7) /* DCA Rx Desc payload enable */
|
||||
|
||||
#define E1000_DCA_TXCTRL_CPUID_MASK 0x0000001F /* Tx CPUID Mask */
|
||||
#define E1000_DCA_TXCTRL_DESC_DCA_EN (1 << 5) /* DCA Tx Desc enable */
|
||||
#define E1000_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */
|
||||
|
||||
/* Additional DCA related definitions, note change in position of CPUID */
|
||||
#define E1000_DCA_TXCTRL_CPUID_MASK_82576 0xFF000000 /* Tx CPUID Mask */
|
||||
#define E1000_DCA_RXCTRL_CPUID_MASK_82576 0xFF000000 /* Rx CPUID Mask */
|
||||
#define E1000_DCA_TXCTRL_CPUID_SHIFT 24 /* Tx CPUID now in the last byte */
|
||||
#define E1000_DCA_RXCTRL_CPUID_SHIFT 24 /* Rx CPUID now in the last byte */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -90,6 +90,11 @@
|
||||
#define E1000_I2CCMD_ERROR 0x80000000
|
||||
#define E1000_MAX_SGMII_PHY_REG_ADDR 255
|
||||
#define E1000_I2CCMD_PHY_TIMEOUT 200
|
||||
#define E1000_IVAR_VALID 0x80
|
||||
#define E1000_GPIE_NSICR 0x00000001
|
||||
#define E1000_GPIE_MSIX_MODE 0x00000010
|
||||
#define E1000_GPIE_EIAME 0x40000000
|
||||
#define E1000_GPIE_PBA 0x80000000
|
||||
|
||||
/* Receive Descriptor bit definitions */
|
||||
#define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */
|
||||
@@ -213,6 +218,7 @@
|
||||
/* Device Control */
|
||||
#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */
|
||||
#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */
|
||||
#define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */
|
||||
#define E1000_CTRL_ASDE 0x00000020 /* Auto-speed detect enable */
|
||||
#define E1000_CTRL_SLU 0x00000040 /* Set link up (Force Link) */
|
||||
#define E1000_CTRL_ILOS 0x00000080 /* Invert Loss-Of Signal */
|
||||
@@ -244,6 +250,7 @@
|
||||
*/
|
||||
|
||||
#define E1000_CONNSW_ENRGSRC 0x4
|
||||
#define E1000_PCS_CFG_PCS_EN 8
|
||||
#define E1000_PCS_LCTL_FLV_LINK_UP 1
|
||||
#define E1000_PCS_LCTL_FSV_100 2
|
||||
#define E1000_PCS_LCTL_FSV_1000 4
|
||||
@@ -253,6 +260,7 @@
|
||||
#define E1000_PCS_LCTL_AN_ENABLE 0x10000
|
||||
#define E1000_PCS_LCTL_AN_RESTART 0x20000
|
||||
#define E1000_PCS_LCTL_AN_TIMEOUT 0x40000
|
||||
#define E1000_ENABLE_SERDES_LOOPBACK 0x0410
|
||||
|
||||
#define E1000_PCS_LSTS_LINK_OK 1
|
||||
#define E1000_PCS_LSTS_SPEED_100 2
|
||||
@@ -360,6 +368,7 @@
|
||||
#define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */
|
||||
#define E1000_PBA_24K 0x0018
|
||||
#define E1000_PBA_34K 0x0022
|
||||
#define E1000_PBA_64K 0x0040 /* 64KB */
|
||||
|
||||
#define IFS_MAX 80
|
||||
#define IFS_MIN 40
|
||||
@@ -528,6 +537,7 @@
|
||||
/* PHY Control Register */
|
||||
#define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */
|
||||
#define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */
|
||||
#define MII_CR_POWER_DOWN 0x0800 /* Power down */
|
||||
#define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */
|
||||
#define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */
|
||||
#define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
|
||||
struct e1000_hw;
|
||||
|
||||
#define E1000_DEV_ID_82576 0x10C9
|
||||
#define E1000_DEV_ID_82576_FIBER 0x10E6
|
||||
#define E1000_DEV_ID_82576_SERDES 0x10E7
|
||||
#define E1000_DEV_ID_82576_QUAD_COPPER 0x10E8
|
||||
#define E1000_DEV_ID_82575EB_COPPER 0x10A7
|
||||
#define E1000_DEV_ID_82575EB_FIBER_SERDES 0x10A9
|
||||
#define E1000_DEV_ID_82575GB_QUAD_COPPER 0x10D6
|
||||
@@ -50,6 +54,7 @@ struct e1000_hw;
|
||||
enum e1000_mac_type {
|
||||
e1000_undefined = 0,
|
||||
e1000_82575,
|
||||
e1000_82576,
|
||||
e1000_num_macs /* List is 1-based, so subtract 1 for true count. */
|
||||
};
|
||||
|
||||
@@ -410,14 +415,17 @@ struct e1000_mac_operations {
|
||||
s32 (*check_for_link)(struct e1000_hw *);
|
||||
s32 (*reset_hw)(struct e1000_hw *);
|
||||
s32 (*init_hw)(struct e1000_hw *);
|
||||
bool (*check_mng_mode)(struct e1000_hw *);
|
||||
s32 (*setup_physical_interface)(struct e1000_hw *);
|
||||
void (*rar_set)(struct e1000_hw *, u8 *, u32);
|
||||
s32 (*read_mac_addr)(struct e1000_hw *);
|
||||
s32 (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *);
|
||||
void (*mta_set)(struct e1000_hw *, u32);
|
||||
};
|
||||
|
||||
struct e1000_phy_operations {
|
||||
s32 (*acquire_phy)(struct e1000_hw *);
|
||||
s32 (*check_reset_block)(struct e1000_hw *);
|
||||
s32 (*force_speed_duplex)(struct e1000_hw *);
|
||||
s32 (*get_cfg_done)(struct e1000_hw *hw);
|
||||
s32 (*get_cable_length)(struct e1000_hw *);
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
|
||||
static s32 igb_set_default_fc(struct e1000_hw *hw);
|
||||
static s32 igb_set_fc_watermarks(struct e1000_hw *hw);
|
||||
static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr);
|
||||
|
||||
/**
|
||||
* igb_remove_device - Free device specific structure
|
||||
@@ -360,7 +359,7 @@ void igb_update_mc_addr_list(struct e1000_hw *hw,
|
||||
* the multicast filter table array address and new table value. See
|
||||
* igb_mta_set()
|
||||
**/
|
||||
static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
|
||||
u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
|
||||
{
|
||||
u32 hash_value, hash_mask;
|
||||
u8 bit_shift = 0;
|
||||
|
||||
@@ -94,5 +94,6 @@ enum e1000_mng_mode {
|
||||
#define E1000_HICR_C 0x02
|
||||
|
||||
extern void e1000_init_function_pointers_82575(struct e1000_hw *hw);
|
||||
extern u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
#define E1000_EIMC 0x01528 /* Ext. Interrupt Mask Clear - WO */
|
||||
#define E1000_EIAC 0x0152C /* Ext. Interrupt Auto Clear - RW */
|
||||
#define E1000_EIAM 0x01530 /* Ext. Interrupt Ack Auto Clear Mask - RW */
|
||||
#define E1000_GPIE 0x01514 /* General Purpose Interrupt Enable - RW */
|
||||
#define E1000_IVAR0 0x01700 /* Interrupt Vector Allocation (array) - RW */
|
||||
#define E1000_IVAR_MISC 0x01740 /* IVAR for "other" causes - RW */
|
||||
#define E1000_TCTL 0x00400 /* TX Control - RW */
|
||||
#define E1000_TCTL_EXT 0x00404 /* Extended TX Control - RW */
|
||||
#define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */
|
||||
@@ -217,6 +220,7 @@
|
||||
#define E1000_RFCTL 0x05008 /* Receive Filter Control*/
|
||||
#define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */
|
||||
#define E1000_RA 0x05400 /* Receive Address - RW Array */
|
||||
#define E1000_RA2 0x054E0 /* 2nd half of receive address array - RW Array */
|
||||
#define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */
|
||||
#define E1000_VMD_CTL 0x0581C /* VMDq Control - RW */
|
||||
#define E1000_WUC 0x05800 /* Wakeup Control - RW */
|
||||
@@ -235,6 +239,8 @@
|
||||
#define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */
|
||||
#define E1000_SWSM 0x05B50 /* SW Semaphore */
|
||||
#define E1000_FWSM 0x05B54 /* FW Semaphore */
|
||||
#define E1000_DCA_ID 0x05B70 /* DCA Requester ID Information - RO */
|
||||
#define E1000_DCA_CTRL 0x05B74 /* DCA Control - RW */
|
||||
#define E1000_HICR 0x08F00 /* Host Inteface Control */
|
||||
|
||||
/* RSS registers */
|
||||
@@ -256,7 +262,8 @@
|
||||
#define E1000_RETA(_i) (0x05C00 + ((_i) * 4))
|
||||
#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW Array */
|
||||
|
||||
#define E1000_REGISTER(a, reg) reg
|
||||
#define E1000_REGISTER(a, reg) (((a)->mac.type < e1000_82576) \
|
||||
? reg : e1000_translate_register_82576(reg))
|
||||
|
||||
#define wr32(reg, value) (writel(value, hw->hw_addr + reg))
|
||||
#define rd32(reg) (readl(hw->hw_addr + reg))
|
||||
|
||||
+37
-10
@@ -36,12 +36,20 @@
|
||||
|
||||
struct igb_adapter;
|
||||
|
||||
#ifdef CONFIG_IGB_LRO
|
||||
#include <linux/inet_lro.h>
|
||||
#define MAX_LRO_AGGR 32
|
||||
#define MAX_LRO_DESCRIPTORS 8
|
||||
#endif
|
||||
|
||||
/* Interrupt defines */
|
||||
#define IGB_MAX_TX_CLEAN 72
|
||||
|
||||
#define IGB_MIN_DYN_ITR 3000
|
||||
#define IGB_MAX_DYN_ITR 96000
|
||||
#define IGB_START_ITR 6000
|
||||
|
||||
/* ((1000000000ns / (6000ints/s * 1024ns)) << 2 = 648 */
|
||||
#define IGB_START_ITR 648
|
||||
|
||||
#define IGB_DYN_ITR_PACKET_THRESHOLD 2
|
||||
#define IGB_DYN_ITR_LENGTH_LOW 200
|
||||
@@ -62,6 +70,7 @@ struct igb_adapter;
|
||||
|
||||
/* Transmit and receive queues */
|
||||
#define IGB_MAX_RX_QUEUES 4
|
||||
#define IGB_MAX_TX_QUEUES 4
|
||||
|
||||
/* RX descriptor control thresholds.
|
||||
* PTHRESH - MAC will consider prefetch if it has fewer than this number of
|
||||
@@ -124,6 +133,7 @@ struct igb_buffer {
|
||||
struct {
|
||||
struct page *page;
|
||||
u64 page_dma;
|
||||
unsigned int page_offset;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -157,18 +167,19 @@ struct igb_ring {
|
||||
union {
|
||||
/* TX */
|
||||
struct {
|
||||
spinlock_t tx_clean_lock;
|
||||
spinlock_t tx_lock;
|
||||
struct igb_queue_stats tx_stats;
|
||||
bool detect_tx_hung;
|
||||
};
|
||||
/* RX */
|
||||
struct {
|
||||
/* arrays of page information for packet split */
|
||||
struct sk_buff *pending_skb;
|
||||
int pending_skb_page;
|
||||
int no_itr_adjust;
|
||||
struct igb_queue_stats rx_stats;
|
||||
struct napi_struct napi;
|
||||
int set_itr;
|
||||
struct igb_ring *buddy;
|
||||
#ifdef CONFIG_IGB_LRO
|
||||
struct net_lro_mgr lro_mgr;
|
||||
bool lro_used;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
@@ -211,7 +222,6 @@ struct igb_adapter {
|
||||
u32 itr_setting;
|
||||
u16 tx_itr;
|
||||
u16 rx_itr;
|
||||
int set_itr;
|
||||
|
||||
struct work_struct reset_task;
|
||||
struct work_struct watchdog_task;
|
||||
@@ -270,15 +280,32 @@ struct igb_adapter {
|
||||
|
||||
/* to not mess up cache alignment, always add to the bottom */
|
||||
unsigned long state;
|
||||
unsigned int msi_enabled;
|
||||
|
||||
unsigned int flags;
|
||||
u32 eeprom_wol;
|
||||
|
||||
/* for ioport free */
|
||||
int bars;
|
||||
int need_ioport;
|
||||
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
struct igb_ring *multi_tx_table[IGB_MAX_TX_QUEUES];
|
||||
#endif /* CONFIG_NETDEVICES_MULTIQUEUE */
|
||||
#ifdef CONFIG_IGB_LRO
|
||||
unsigned int lro_max_aggr;
|
||||
unsigned int lro_aggregated;
|
||||
unsigned int lro_flushed;
|
||||
unsigned int lro_no_desc;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define IGB_FLAG_HAS_MSI (1 << 0)
|
||||
#define IGB_FLAG_MSI_ENABLE (1 << 1)
|
||||
#define IGB_FLAG_HAS_DCA (1 << 2)
|
||||
#define IGB_FLAG_DCA_ENABLED (1 << 3)
|
||||
#define IGB_FLAG_IN_NETPOLL (1 << 5)
|
||||
#define IGB_FLAG_QUAD_PORT_A (1 << 6)
|
||||
#define IGB_FLAG_NEED_CTX_IDX (1 << 7)
|
||||
|
||||
enum e1000_state_t {
|
||||
__IGB_TESTING,
|
||||
__IGB_RESETTING,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user