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 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (48 commits) LIB82596: correct data types for hardware addresses via-velocity: don't oops on MTU change (resend) Stop phy code from returning success to unknown ioctls. SET_NETDEV_DEV() in fec_mpc52xx.c net: smc911x: only enable for mpr2 on sh. e1000: Fix NAPI state bug when Rx complete sky2: turn of dynamic Tx watermark workaround (FE+ only) sky2: don't use AER routines sky2: revert to access PCI config via device space cxgb - fix stats cxgb - fix NAPI cxgb - fix T2 GSO ucc_geth: handle passing of RX-only and TX-only internal delay PHY connection type parameters phylib: marvell: add support for TX-only and RX-only Internal Delay phylib: add PHY interface modes for internal delay for tx and rx only skge: MTU changing fix skge: serial mode register values skge version 1.13 skge: increase TX threshold for Jumbo skge: fiber link up/down fix ...
This commit is contained in:
+2
-2
@@ -888,7 +888,7 @@ config SMC91X
|
||||
tristate "SMC 91C9x/91C1xxx support"
|
||||
select CRC32
|
||||
select MII
|
||||
depends on ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00 || BFIN
|
||||
depends on ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00 || BLACKFIN
|
||||
help
|
||||
This is a driver for SMC's 91x series of Ethernet chipsets,
|
||||
including the SMC91C94 and the SMC91C111. Say Y if you want it
|
||||
@@ -926,7 +926,7 @@ config SMC911X
|
||||
tristate "SMSC LAN911[5678] support"
|
||||
select CRC32
|
||||
select MII
|
||||
depends on ARCH_PXA || SUPERH
|
||||
depends on ARCH_PXA || SH_MAGIC_PANEL_R2
|
||||
help
|
||||
This is a driver for SMSC's LAN911x series of Ethernet chipsets
|
||||
including the new LAN9115, LAN9116, LAN9117, and LAN9118.
|
||||
|
||||
@@ -1340,7 +1340,9 @@ static int amd8111e_close(struct net_device * dev)
|
||||
struct amd8111e_priv *lp = netdev_priv(dev);
|
||||
netif_stop_queue(dev);
|
||||
|
||||
#ifdef CONFIG_AMD8111E_NAPI
|
||||
napi_disable(&lp->napi);
|
||||
#endif
|
||||
|
||||
spin_lock_irq(&lp->lock);
|
||||
|
||||
@@ -1372,7 +1374,9 @@ static int amd8111e_open(struct net_device * dev )
|
||||
dev->name, dev))
|
||||
return -EAGAIN;
|
||||
|
||||
#ifdef CONFIG_AMD8111E_NAPI
|
||||
napi_enable(&lp->napi);
|
||||
#endif
|
||||
|
||||
spin_lock_irq(&lp->lock);
|
||||
|
||||
@@ -1380,7 +1384,9 @@ static int amd8111e_open(struct net_device * dev )
|
||||
|
||||
if(amd8111e_restart(dev)){
|
||||
spin_unlock_irq(&lp->lock);
|
||||
#ifdef CONFIG_AMD8111E_NAPI
|
||||
napi_disable(&lp->napi);
|
||||
#endif
|
||||
if (dev->irq)
|
||||
free_irq(dev->irq, dev);
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -676,7 +676,7 @@ static void bf537mac_rx(struct net_device *dev)
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
#if defined(BFIN_MAC_CSUM_OFFLOAD)
|
||||
skb->csum = current_rx_ptr->status.ip_payload_csum;
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
#endif
|
||||
|
||||
netif_rx(skb);
|
||||
|
||||
Regular → Executable
+54
-18
@@ -374,7 +374,9 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
|
||||
"TxInternalMACXmitError",
|
||||
"TxFramesWithExcessiveDeferral",
|
||||
"TxFCSErrors",
|
||||
|
||||
"TxJumboFramesOk",
|
||||
"TxJumboOctetsOk",
|
||||
|
||||
"RxOctetsOK",
|
||||
"RxOctetsBad",
|
||||
"RxUnicastFramesOK",
|
||||
@@ -392,16 +394,17 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
|
||||
"RxInRangeLengthErrors",
|
||||
"RxOutOfRangeLengthField",
|
||||
"RxFrameTooLongErrors",
|
||||
"RxJumboFramesOk",
|
||||
"RxJumboOctetsOk",
|
||||
|
||||
/* Port stats */
|
||||
"RxPackets",
|
||||
"RxCsumGood",
|
||||
"TxPackets",
|
||||
"TxCsumOffload",
|
||||
"TxTso",
|
||||
"RxVlan",
|
||||
"TxVlan",
|
||||
|
||||
"TxNeedHeadroom",
|
||||
|
||||
/* Interrupt stats */
|
||||
"rx drops",
|
||||
"pure_rsps",
|
||||
@@ -463,23 +466,56 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
|
||||
const struct cmac_statistics *s;
|
||||
const struct sge_intr_counts *t;
|
||||
struct sge_port_stats ss;
|
||||
unsigned int len;
|
||||
|
||||
s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
|
||||
|
||||
len = sizeof(u64)*(&s->TxFCSErrors + 1 - &s->TxOctetsOK);
|
||||
memcpy(data, &s->TxOctetsOK, len);
|
||||
data += len;
|
||||
|
||||
len = sizeof(u64)*(&s->RxFrameTooLongErrors + 1 - &s->RxOctetsOK);
|
||||
memcpy(data, &s->RxOctetsOK, len);
|
||||
data += len;
|
||||
|
||||
t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
|
||||
memcpy(data, &ss, sizeof(ss));
|
||||
data += sizeof(ss);
|
||||
|
||||
t = t1_sge_get_intr_counts(adapter->sge);
|
||||
t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
|
||||
|
||||
*data++ = s->TxOctetsOK;
|
||||
*data++ = s->TxOctetsBad;
|
||||
*data++ = s->TxUnicastFramesOK;
|
||||
*data++ = s->TxMulticastFramesOK;
|
||||
*data++ = s->TxBroadcastFramesOK;
|
||||
*data++ = s->TxPauseFrames;
|
||||
*data++ = s->TxFramesWithDeferredXmissions;
|
||||
*data++ = s->TxLateCollisions;
|
||||
*data++ = s->TxTotalCollisions;
|
||||
*data++ = s->TxFramesAbortedDueToXSCollisions;
|
||||
*data++ = s->TxUnderrun;
|
||||
*data++ = s->TxLengthErrors;
|
||||
*data++ = s->TxInternalMACXmitError;
|
||||
*data++ = s->TxFramesWithExcessiveDeferral;
|
||||
*data++ = s->TxFCSErrors;
|
||||
*data++ = s->TxJumboFramesOK;
|
||||
*data++ = s->TxJumboOctetsOK;
|
||||
|
||||
*data++ = s->RxOctetsOK;
|
||||
*data++ = s->RxOctetsBad;
|
||||
*data++ = s->RxUnicastFramesOK;
|
||||
*data++ = s->RxMulticastFramesOK;
|
||||
*data++ = s->RxBroadcastFramesOK;
|
||||
*data++ = s->RxPauseFrames;
|
||||
*data++ = s->RxFCSErrors;
|
||||
*data++ = s->RxAlignErrors;
|
||||
*data++ = s->RxSymbolErrors;
|
||||
*data++ = s->RxDataErrors;
|
||||
*data++ = s->RxSequenceErrors;
|
||||
*data++ = s->RxRuntErrors;
|
||||
*data++ = s->RxJabberErrors;
|
||||
*data++ = s->RxInternalMACRcvError;
|
||||
*data++ = s->RxInRangeLengthErrors;
|
||||
*data++ = s->RxOutOfRangeLengthField;
|
||||
*data++ = s->RxFrameTooLongErrors;
|
||||
*data++ = s->RxJumboFramesOK;
|
||||
*data++ = s->RxJumboOctetsOK;
|
||||
|
||||
*data++ = ss.rx_cso_good;
|
||||
*data++ = ss.tx_cso;
|
||||
*data++ = ss.tx_tso;
|
||||
*data++ = ss.vlan_xtract;
|
||||
*data++ = ss.vlan_insert;
|
||||
*data++ = ss.tx_need_hdrroom;
|
||||
|
||||
*data++ = t->rx_drops;
|
||||
*data++ = t->pure_rsps;
|
||||
*data++ = t->unhandled_irqs;
|
||||
|
||||
Regular → Executable
+44
-66
@@ -45,7 +45,7 @@
|
||||
|
||||
#include <linux/crc32.h>
|
||||
|
||||
#define OFFSET(REG_ADDR) (REG_ADDR << 2)
|
||||
#define OFFSET(REG_ADDR) ((REG_ADDR) << 2)
|
||||
|
||||
/* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */
|
||||
#define MAX_FRAME_SIZE 9600
|
||||
@@ -428,69 +428,26 @@ static int pm3393_set_speed_duplex_fc(struct cmac *cmac, int speed, int duplex,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pm3393_rmon_update(struct adapter *adapter, u32 offs, u64 *val,
|
||||
int over)
|
||||
{
|
||||
u32 val0, val1, val2;
|
||||
|
||||
t1_tpi_read(adapter, offs, &val0);
|
||||
t1_tpi_read(adapter, offs + 4, &val1);
|
||||
t1_tpi_read(adapter, offs + 8, &val2);
|
||||
|
||||
*val &= ~0ull << 40;
|
||||
*val |= val0 & 0xffff;
|
||||
*val |= (val1 & 0xffff) << 16;
|
||||
*val |= (u64)(val2 & 0xff) << 32;
|
||||
|
||||
if (over)
|
||||
*val += 1ull << 40;
|
||||
#define RMON_UPDATE(mac, name, stat_name) \
|
||||
{ \
|
||||
t1_tpi_read((mac)->adapter, OFFSET(name), &val0); \
|
||||
t1_tpi_read((mac)->adapter, OFFSET((name)+1), &val1); \
|
||||
t1_tpi_read((mac)->adapter, OFFSET((name)+2), &val2); \
|
||||
(mac)->stats.stat_name = (u64)(val0 & 0xffff) | \
|
||||
((u64)(val1 & 0xffff) << 16) | \
|
||||
((u64)(val2 & 0xff) << 32) | \
|
||||
((mac)->stats.stat_name & \
|
||||
0xffffff0000000000ULL); \
|
||||
if (ro & \
|
||||
(1ULL << ((name - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW) >> 2))) \
|
||||
(mac)->stats.stat_name += 1ULL << 40; \
|
||||
}
|
||||
|
||||
static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
|
||||
int flag)
|
||||
{
|
||||
static struct {
|
||||
unsigned int reg;
|
||||
unsigned int offset;
|
||||
} hw_stats [] = {
|
||||
|
||||
#define HW_STAT(name, stat_name) \
|
||||
{ name, (&((struct cmac_statistics *)NULL)->stat_name) - (u64 *)NULL }
|
||||
|
||||
/* Rx stats */
|
||||
HW_STAT(RxOctetsReceivedOK, RxOctetsOK),
|
||||
HW_STAT(RxUnicastFramesReceivedOK, RxUnicastFramesOK),
|
||||
HW_STAT(RxMulticastFramesReceivedOK, RxMulticastFramesOK),
|
||||
HW_STAT(RxBroadcastFramesReceivedOK, RxBroadcastFramesOK),
|
||||
HW_STAT(RxPAUSEMACCtrlFramesReceived, RxPauseFrames),
|
||||
HW_STAT(RxFrameCheckSequenceErrors, RxFCSErrors),
|
||||
HW_STAT(RxFramesLostDueToInternalMACErrors,
|
||||
RxInternalMACRcvError),
|
||||
HW_STAT(RxSymbolErrors, RxSymbolErrors),
|
||||
HW_STAT(RxInRangeLengthErrors, RxInRangeLengthErrors),
|
||||
HW_STAT(RxFramesTooLongErrors , RxFrameTooLongErrors),
|
||||
HW_STAT(RxJabbers, RxJabberErrors),
|
||||
HW_STAT(RxFragments, RxRuntErrors),
|
||||
HW_STAT(RxUndersizedFrames, RxRuntErrors),
|
||||
HW_STAT(RxJumboFramesReceivedOK, RxJumboFramesOK),
|
||||
HW_STAT(RxJumboOctetsReceivedOK, RxJumboOctetsOK),
|
||||
|
||||
/* Tx stats */
|
||||
HW_STAT(TxOctetsTransmittedOK, TxOctetsOK),
|
||||
HW_STAT(TxFramesLostDueToInternalMACTransmissionError,
|
||||
TxInternalMACXmitError),
|
||||
HW_STAT(TxTransmitSystemError, TxFCSErrors),
|
||||
HW_STAT(TxUnicastFramesTransmittedOK, TxUnicastFramesOK),
|
||||
HW_STAT(TxMulticastFramesTransmittedOK, TxMulticastFramesOK),
|
||||
HW_STAT(TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK),
|
||||
HW_STAT(TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames),
|
||||
HW_STAT(TxJumboFramesReceivedOK, TxJumboFramesOK),
|
||||
HW_STAT(TxJumboOctetsReceivedOK, TxJumboOctetsOK)
|
||||
}, *p = hw_stats;
|
||||
u64 ro;
|
||||
u32 val0, val1, val2, val3;
|
||||
u64 *stats = (u64 *) &mac->stats;
|
||||
unsigned int i;
|
||||
u64 ro;
|
||||
u32 val0, val1, val2, val3;
|
||||
|
||||
/* Snap the counters */
|
||||
pmwrite(mac, SUNI1x10GEXP_REG_MSTAT_CONTROL,
|
||||
@@ -504,14 +461,35 @@ static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
|
||||
ro = ((u64)val0 & 0xffff) | (((u64)val1 & 0xffff) << 16) |
|
||||
(((u64)val2 & 0xffff) << 32) | (((u64)val3 & 0xffff) << 48);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hw_stats); i++) {
|
||||
unsigned reg = p->reg - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW;
|
||||
|
||||
pm3393_rmon_update((mac)->adapter, OFFSET(p->reg),
|
||||
stats + p->offset, ro & (reg >> 2));
|
||||
}
|
||||
|
||||
/* Rx stats */
|
||||
RMON_UPDATE(mac, RxOctetsReceivedOK, RxOctetsOK);
|
||||
RMON_UPDATE(mac, RxUnicastFramesReceivedOK, RxUnicastFramesOK);
|
||||
RMON_UPDATE(mac, RxMulticastFramesReceivedOK, RxMulticastFramesOK);
|
||||
RMON_UPDATE(mac, RxBroadcastFramesReceivedOK, RxBroadcastFramesOK);
|
||||
RMON_UPDATE(mac, RxPAUSEMACCtrlFramesReceived, RxPauseFrames);
|
||||
RMON_UPDATE(mac, RxFrameCheckSequenceErrors, RxFCSErrors);
|
||||
RMON_UPDATE(mac, RxFramesLostDueToInternalMACErrors,
|
||||
RxInternalMACRcvError);
|
||||
RMON_UPDATE(mac, RxSymbolErrors, RxSymbolErrors);
|
||||
RMON_UPDATE(mac, RxInRangeLengthErrors, RxInRangeLengthErrors);
|
||||
RMON_UPDATE(mac, RxFramesTooLongErrors , RxFrameTooLongErrors);
|
||||
RMON_UPDATE(mac, RxJabbers, RxJabberErrors);
|
||||
RMON_UPDATE(mac, RxFragments, RxRuntErrors);
|
||||
RMON_UPDATE(mac, RxUndersizedFrames, RxRuntErrors);
|
||||
RMON_UPDATE(mac, RxJumboFramesReceivedOK, RxJumboFramesOK);
|
||||
RMON_UPDATE(mac, RxJumboOctetsReceivedOK, RxJumboOctetsOK);
|
||||
|
||||
/* Tx stats */
|
||||
RMON_UPDATE(mac, TxOctetsTransmittedOK, TxOctetsOK);
|
||||
RMON_UPDATE(mac, TxFramesLostDueToInternalMACTransmissionError,
|
||||
TxInternalMACXmitError);
|
||||
RMON_UPDATE(mac, TxTransmitSystemError, TxFCSErrors);
|
||||
RMON_UPDATE(mac, TxUnicastFramesTransmittedOK, TxUnicastFramesOK);
|
||||
RMON_UPDATE(mac, TxMulticastFramesTransmittedOK, TxMulticastFramesOK);
|
||||
RMON_UPDATE(mac, TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK);
|
||||
RMON_UPDATE(mac, TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames);
|
||||
RMON_UPDATE(mac, TxJumboFramesReceivedOK, TxJumboFramesOK);
|
||||
RMON_UPDATE(mac, TxJumboOctetsReceivedOK, TxJumboOctetsOK);
|
||||
|
||||
return &mac->stats;
|
||||
}
|
||||
|
||||
Regular → Executable
+17
-27
@@ -986,11 +986,10 @@ void t1_sge_get_port_stats(const struct sge *sge, int port,
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[port], cpu);
|
||||
|
||||
ss->rx_packets += st->rx_packets;
|
||||
ss->rx_cso_good += st->rx_cso_good;
|
||||
ss->tx_packets += st->tx_packets;
|
||||
ss->tx_cso += st->tx_cso;
|
||||
ss->tx_tso += st->tx_tso;
|
||||
ss->tx_need_hdrroom += st->tx_need_hdrroom;
|
||||
ss->vlan_xtract += st->vlan_xtract;
|
||||
ss->vlan_insert += st->vlan_insert;
|
||||
}
|
||||
@@ -1380,7 +1379,6 @@ static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len)
|
||||
__skb_pull(skb, sizeof(*p));
|
||||
|
||||
st = per_cpu_ptr(sge->port_stats[p->iff], smp_processor_id());
|
||||
st->rx_packets++;
|
||||
|
||||
skb->protocol = eth_type_trans(skb, adapter->port[p->iff].dev);
|
||||
skb->dev->last_rx = jiffies;
|
||||
@@ -1624,11 +1622,9 @@ int t1_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct adapter *adapter = container_of(napi, struct adapter, napi);
|
||||
struct net_device *dev = adapter->port[0].dev;
|
||||
int work_done;
|
||||
int work_done = process_responses(adapter, budget);
|
||||
|
||||
work_done = process_responses(adapter, budget);
|
||||
|
||||
if (likely(!responses_pending(adapter))) {
|
||||
if (likely(work_done < budget)) {
|
||||
netif_rx_complete(dev, napi);
|
||||
writel(adapter->sge->respQ.cidx,
|
||||
adapter->regs + A_SG_SLEEPING);
|
||||
@@ -1848,7 +1844,8 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct adapter *adapter = dev->priv;
|
||||
struct sge *sge = adapter->sge;
|
||||
struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[dev->if_port], smp_processor_id());
|
||||
struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[dev->if_port],
|
||||
smp_processor_id());
|
||||
struct cpl_tx_pkt *cpl;
|
||||
struct sk_buff *orig_skb = skb;
|
||||
int ret;
|
||||
@@ -1856,6 +1853,18 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if (skb->protocol == htons(ETH_P_CPL5))
|
||||
goto send;
|
||||
|
||||
/*
|
||||
* We are using a non-standard hard_header_len.
|
||||
* Allocate more header room in the rare cases it is not big enough.
|
||||
*/
|
||||
if (unlikely(skb_headroom(skb) < dev->hard_header_len - ETH_HLEN)) {
|
||||
skb = skb_realloc_headroom(skb, sizeof(struct cpl_tx_pkt_lso));
|
||||
++st->tx_need_hdrroom;
|
||||
dev_kfree_skb_any(orig_skb);
|
||||
if (!skb)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (skb_shinfo(skb)->gso_size) {
|
||||
int eth_type;
|
||||
struct cpl_tx_pkt_lso *hdr;
|
||||
@@ -1889,24 +1898,6 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* We are using a non-standard hard_header_len and some kernel
|
||||
* components, such as pktgen, do not handle it right.
|
||||
* Complain when this happens but try to fix things up.
|
||||
*/
|
||||
if (unlikely(skb_headroom(skb) < dev->hard_header_len - ETH_HLEN)) {
|
||||
pr_debug("%s: headroom %d header_len %d\n", dev->name,
|
||||
skb_headroom(skb), dev->hard_header_len);
|
||||
|
||||
if (net_ratelimit())
|
||||
printk(KERN_ERR "%s: inadequate headroom in "
|
||||
"Tx packet\n", dev->name);
|
||||
skb = skb_realloc_headroom(skb, sizeof(*cpl));
|
||||
dev_kfree_skb_any(orig_skb);
|
||||
if (!skb)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (!(adapter->flags & UDP_CSUM_CAPABLE) &&
|
||||
skb->ip_summed == CHECKSUM_PARTIAL &&
|
||||
ip_hdr(skb)->protocol == IPPROTO_UDP) {
|
||||
@@ -1952,7 +1943,6 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
cpl->vlan_valid = 0;
|
||||
|
||||
send:
|
||||
st->tx_packets++;
|
||||
dev->trans_start = jiffies;
|
||||
ret = t1_sge_tx(skb, adapter, 0, dev);
|
||||
|
||||
|
||||
Regular → Executable
+1
-2
@@ -57,13 +57,12 @@ struct sge_intr_counts {
|
||||
};
|
||||
|
||||
struct sge_port_stats {
|
||||
u64 rx_packets; /* # of Ethernet packets received */
|
||||
u64 rx_cso_good; /* # of successful RX csum offloads */
|
||||
u64 tx_packets; /* # of TX packets */
|
||||
u64 tx_cso; /* # of TX checksum offloads */
|
||||
u64 tx_tso; /* # of TSO requests */
|
||||
u64 vlan_xtract; /* # of VLAN tag extractions */
|
||||
u64 vlan_insert; /* # of VLAN tag insertions */
|
||||
u64 tx_need_hdrroom; /* # of TX skbs in need of more header room */
|
||||
};
|
||||
|
||||
struct sk_buff;
|
||||
|
||||
@@ -3942,7 +3942,7 @@ e1000_clean(struct napi_struct *napi, int budget)
|
||||
&work_done, budget);
|
||||
|
||||
/* If no Tx and not enough Rx work done, exit the polling mode */
|
||||
if ((!tx_cleaned && (work_done < budget)) ||
|
||||
if ((!tx_cleaned && (work_done == 0)) ||
|
||||
!netif_running(poll_dev)) {
|
||||
quit_polling:
|
||||
if (likely(adapter->itr_setting & 3))
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "ehea"
|
||||
#define DRV_VERSION "EHEA_0080"
|
||||
#define DRV_VERSION "EHEA_0083"
|
||||
|
||||
/* eHEA capability flags */
|
||||
#define DLPAR_PORT_ADD_REM 1
|
||||
|
||||
@@ -136,7 +136,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev)
|
||||
struct ehea_port *port = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &port->stats;
|
||||
struct hcp_ehea_port_cb2 *cb2;
|
||||
u64 hret, rx_packets;
|
||||
u64 hret, rx_packets, tx_packets;
|
||||
int i;
|
||||
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
@@ -162,7 +162,11 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev)
|
||||
for (i = 0; i < port->num_def_qps; i++)
|
||||
rx_packets += port->port_res[i].rx_packets;
|
||||
|
||||
stats->tx_packets = cb2->txucp + cb2->txmcp + cb2->txbcp;
|
||||
tx_packets = 0;
|
||||
for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++)
|
||||
tx_packets += port->port_res[i].tx_packets;
|
||||
|
||||
stats->tx_packets = tx_packets;
|
||||
stats->multicast = cb2->rxmcp;
|
||||
stats->rx_errors = cb2->rxuerr;
|
||||
stats->rx_bytes = cb2->rxo;
|
||||
@@ -406,11 +410,6 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
|
||||
if (cqe->status & EHEA_CQE_STAT_ERR_CRC)
|
||||
pr->p_stats.err_frame_crc++;
|
||||
|
||||
if (netif_msg_rx_err(pr->port)) {
|
||||
ehea_error("CQE Error for QP %d", pr->qp->init_attr.qp_nr);
|
||||
ehea_dump(cqe, sizeof(*cqe), "CQE");
|
||||
}
|
||||
|
||||
if (rq == 2) {
|
||||
*processed_rq2 += 1;
|
||||
skb = get_skb_by_index(pr->rq2_skba.arr, pr->rq2_skba.len, cqe);
|
||||
@@ -422,7 +421,11 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
|
||||
}
|
||||
|
||||
if (cqe->status & EHEA_CQE_STAT_FAT_ERR_MASK) {
|
||||
ehea_error("Critical receive error. Resetting port.");
|
||||
if (netif_msg_rx_err(pr->port)) {
|
||||
ehea_error("Critical receive error for QP %d. "
|
||||
"Resetting port.", pr->qp->init_attr.qp_nr);
|
||||
ehea_dump(cqe, sizeof(*cqe), "CQE");
|
||||
}
|
||||
schedule_work(&pr->port->reset_task);
|
||||
return 1;
|
||||
}
|
||||
@@ -2000,6 +2003,7 @@ static int ehea_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
|
||||
ehea_post_swqe(pr->qp, swqe);
|
||||
pr->tx_packets++;
|
||||
|
||||
if (unlikely(atomic_read(&pr->swqe_avail) <= 1)) {
|
||||
spin_lock_irqsave(&pr->netif_queue, flags);
|
||||
|
||||
@@ -145,8 +145,8 @@ struct ehea_rwqe {
|
||||
#define EHEA_CQE_VLAN_TAG_XTRACT 0x0400
|
||||
|
||||
#define EHEA_CQE_TYPE_RQ 0x60
|
||||
#define EHEA_CQE_STAT_ERR_MASK 0x720F
|
||||
#define EHEA_CQE_STAT_FAT_ERR_MASK 0x1F
|
||||
#define EHEA_CQE_STAT_ERR_MASK 0x700F
|
||||
#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF
|
||||
#define EHEA_CQE_STAT_ERR_TCP 0x4000
|
||||
#define EHEA_CQE_STAT_ERR_IP 0x2000
|
||||
#define EHEA_CQE_STAT_ERR_CRC 0x1000
|
||||
|
||||
@@ -971,6 +971,8 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match)
|
||||
|
||||
mpc52xx_fec_reset_stats(ndev);
|
||||
|
||||
SET_NETDEV_DEV(ndev, &op->dev);
|
||||
|
||||
/* Register the new network device */
|
||||
rv = register_netdev(ndev);
|
||||
if (rv < 0)
|
||||
|
||||
+25
-13
@@ -5286,19 +5286,15 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
if (readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_PHY_INIT) {
|
||||
np->mac_in_use = readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_MGMT_ST;
|
||||
dprintk(KERN_INFO "%s: mgmt unit is running. mac in use %x.\n", pci_name(pci_dev), np->mac_in_use);
|
||||
for (i = 0; i < 5000; i++) {
|
||||
msleep(1);
|
||||
if (nv_mgmt_acquire_sema(dev)) {
|
||||
/* management unit setup the phy already? */
|
||||
if ((readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_MASK) ==
|
||||
NVREG_XMITCTL_SYNC_PHY_INIT) {
|
||||
/* phy is inited by mgmt unit */
|
||||
phyinitialized = 1;
|
||||
dprintk(KERN_INFO "%s: Phy already initialized by mgmt unit.\n", pci_name(pci_dev));
|
||||
} else {
|
||||
/* we need to init the phy */
|
||||
}
|
||||
break;
|
||||
if (nv_mgmt_acquire_sema(dev)) {
|
||||
/* management unit setup the phy already? */
|
||||
if ((readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_MASK) ==
|
||||
NVREG_XMITCTL_SYNC_PHY_INIT) {
|
||||
/* phy is inited by mgmt unit */
|
||||
phyinitialized = 1;
|
||||
dprintk(KERN_INFO "%s: Phy already initialized by mgmt unit.\n", pci_name(pci_dev));
|
||||
} else {
|
||||
/* we need to init the phy */
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5613,6 +5609,22 @@ static struct pci_device_id pci_tbl[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
|
||||
},
|
||||
{ /* MCP79 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
|
||||
},
|
||||
{ /* MCP79 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
|
||||
},
|
||||
{ /* MCP79 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
|
||||
},
|
||||
{ /* MCP79 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
|
||||
},
|
||||
{0,},
|
||||
};
|
||||
|
||||
|
||||
@@ -642,9 +642,11 @@ static void emac_reset_work(struct work_struct *work)
|
||||
DBG(dev, "reset_work" NL);
|
||||
|
||||
mutex_lock(&dev->link_lock);
|
||||
emac_netif_stop(dev);
|
||||
emac_full_tx_reset(dev);
|
||||
emac_netif_start(dev);
|
||||
if (dev->opened) {
|
||||
emac_netif_stop(dev);
|
||||
emac_full_tx_reset(dev);
|
||||
emac_netif_start(dev);
|
||||
}
|
||||
mutex_unlock(&dev->link_lock);
|
||||
}
|
||||
|
||||
@@ -1063,10 +1065,9 @@ static int emac_open(struct net_device *ndev)
|
||||
dev->rx_sg_skb = NULL;
|
||||
|
||||
mutex_lock(&dev->link_lock);
|
||||
dev->opened = 1;
|
||||
|
||||
/* XXX Start PHY polling now. Shouldn't wr do like sungem instead and
|
||||
* always poll the PHY even when the iface is down ? That would allow
|
||||
* things like laptop-net to work. --BenH
|
||||
/* Start PHY polling now.
|
||||
*/
|
||||
if (dev->phy.address >= 0) {
|
||||
int link_poll_interval;
|
||||
@@ -1145,9 +1146,11 @@ static void emac_link_timer(struct work_struct *work)
|
||||
int link_poll_interval;
|
||||
|
||||
mutex_lock(&dev->link_lock);
|
||||
|
||||
DBG2(dev, "link timer" NL);
|
||||
|
||||
if (!dev->opened)
|
||||
goto bail;
|
||||
|
||||
if (dev->phy.def->ops->poll_link(&dev->phy)) {
|
||||
if (!netif_carrier_ok(dev->ndev)) {
|
||||
/* Get new link parameters */
|
||||
@@ -1170,13 +1173,14 @@ static void emac_link_timer(struct work_struct *work)
|
||||
link_poll_interval = PHY_POLL_LINK_OFF;
|
||||
}
|
||||
schedule_delayed_work(&dev->link_work, link_poll_interval);
|
||||
|
||||
bail:
|
||||
mutex_unlock(&dev->link_lock);
|
||||
}
|
||||
|
||||
static void emac_force_link_update(struct emac_instance *dev)
|
||||
{
|
||||
netif_carrier_off(dev->ndev);
|
||||
smp_rmb();
|
||||
if (dev->link_polling) {
|
||||
cancel_rearming_delayed_work(&dev->link_work);
|
||||
if (dev->link_polling)
|
||||
@@ -1191,11 +1195,14 @@ static int emac_close(struct net_device *ndev)
|
||||
|
||||
DBG(dev, "close" NL);
|
||||
|
||||
if (dev->phy.address >= 0)
|
||||
if (dev->phy.address >= 0) {
|
||||
dev->link_polling = 0;
|
||||
cancel_rearming_delayed_work(&dev->link_work);
|
||||
|
||||
}
|
||||
mutex_lock(&dev->link_lock);
|
||||
emac_netif_stop(dev);
|
||||
flush_scheduled_work();
|
||||
dev->opened = 0;
|
||||
mutex_unlock(&dev->link_lock);
|
||||
|
||||
emac_rx_disable(dev);
|
||||
emac_tx_disable(dev);
|
||||
@@ -2756,6 +2763,8 @@ static int __devexit emac_remove(struct of_device *ofdev)
|
||||
|
||||
unregister_netdev(dev->ndev);
|
||||
|
||||
flush_scheduled_work();
|
||||
|
||||
if (emac_has_feature(dev, EMAC_FTR_HAS_TAH))
|
||||
tah_detach(dev->tah_dev, dev->tah_port);
|
||||
if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII))
|
||||
|
||||
@@ -258,6 +258,7 @@ struct emac_instance {
|
||||
int stop_timeout; /* in us */
|
||||
int no_mcast;
|
||||
int mcast_pending;
|
||||
int opened;
|
||||
struct work_struct reset_work;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
+25
-25
@@ -176,8 +176,8 @@ struct i596_reg {
|
||||
struct i596_tbd {
|
||||
unsigned short size;
|
||||
unsigned short pad;
|
||||
dma_addr_t next;
|
||||
dma_addr_t data;
|
||||
u32 next;
|
||||
u32 data;
|
||||
u32 cache_pad[5]; /* Total 32 bytes... */
|
||||
};
|
||||
|
||||
@@ -195,12 +195,12 @@ struct i596_cmd {
|
||||
struct i596_cmd *v_next; /* Address from CPUs viewpoint */
|
||||
unsigned short status;
|
||||
unsigned short command;
|
||||
dma_addr_t b_next; /* Address from i596 viewpoint */
|
||||
u32 b_next; /* Address from i596 viewpoint */
|
||||
};
|
||||
|
||||
struct tx_cmd {
|
||||
struct i596_cmd cmd;
|
||||
dma_addr_t tbd;
|
||||
u32 tbd;
|
||||
unsigned short size;
|
||||
unsigned short pad;
|
||||
struct sk_buff *skb; /* So we can free it after tx */
|
||||
@@ -237,8 +237,8 @@ struct cf_cmd {
|
||||
struct i596_rfd {
|
||||
unsigned short stat;
|
||||
unsigned short cmd;
|
||||
dma_addr_t b_next; /* Address from i596 viewpoint */
|
||||
dma_addr_t rbd;
|
||||
u32 b_next; /* Address from i596 viewpoint */
|
||||
u32 rbd;
|
||||
unsigned short count;
|
||||
unsigned short size;
|
||||
struct i596_rfd *v_next; /* Address from CPUs viewpoint */
|
||||
@@ -249,18 +249,18 @@ struct i596_rfd {
|
||||
};
|
||||
|
||||
struct i596_rbd {
|
||||
/* hardware data */
|
||||
unsigned short count;
|
||||
unsigned short zero1;
|
||||
dma_addr_t b_next;
|
||||
dma_addr_t b_data; /* Address from i596 viewpoint */
|
||||
unsigned short size;
|
||||
unsigned short zero2;
|
||||
/* driver data */
|
||||
struct sk_buff *skb;
|
||||
struct i596_rbd *v_next;
|
||||
dma_addr_t b_addr; /* This rbd addr from i596 view */
|
||||
unsigned char *v_data; /* Address from CPUs viewpoint */
|
||||
/* hardware data */
|
||||
unsigned short count;
|
||||
unsigned short zero1;
|
||||
u32 b_next;
|
||||
u32 b_data; /* Address from i596 viewpoint */
|
||||
unsigned short size;
|
||||
unsigned short zero2;
|
||||
/* driver data */
|
||||
struct sk_buff *skb;
|
||||
struct i596_rbd *v_next;
|
||||
u32 b_addr; /* This rbd addr from i596 view */
|
||||
unsigned char *v_data; /* Address from CPUs viewpoint */
|
||||
/* Total 32 bytes... */
|
||||
#ifdef __LP64__
|
||||
u32 cache_pad[4];
|
||||
@@ -275,8 +275,8 @@ struct i596_rbd {
|
||||
struct i596_scb {
|
||||
unsigned short status;
|
||||
unsigned short command;
|
||||
dma_addr_t cmd;
|
||||
dma_addr_t rfd;
|
||||
u32 cmd;
|
||||
u32 rfd;
|
||||
u32 crc_err;
|
||||
u32 align_err;
|
||||
u32 resource_err;
|
||||
@@ -288,14 +288,14 @@ struct i596_scb {
|
||||
};
|
||||
|
||||
struct i596_iscp {
|
||||
u32 stat;
|
||||
dma_addr_t scb;
|
||||
u32 stat;
|
||||
u32 scb;
|
||||
};
|
||||
|
||||
struct i596_scp {
|
||||
u32 sysbus;
|
||||
u32 pad;
|
||||
dma_addr_t iscp;
|
||||
u32 sysbus;
|
||||
u32 pad;
|
||||
u32 iscp;
|
||||
};
|
||||
|
||||
struct i596_dma {
|
||||
|
||||
@@ -143,21 +143,29 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
||||
int err;
|
||||
|
||||
if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)) {
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
|
||||
int temp;
|
||||
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
|
||||
if (temp < 0)
|
||||
return temp;
|
||||
|
||||
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
|
||||
if (temp < 0)
|
||||
return temp;
|
||||
|
||||
temp |= (MII_M1111_RX_DELAY | MII_M1111_TX_DELAY);
|
||||
|
||||
err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
|
||||
if (err < 0)
|
||||
return err;
|
||||
} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
|
||||
temp &= ~MII_M1111_TX_DELAY;
|
||||
temp |= MII_M1111_RX_DELAY;
|
||||
} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
|
||||
temp &= ~MII_M1111_RX_DELAY;
|
||||
temp |= MII_M1111_TX_DELAY;
|
||||
}
|
||||
|
||||
err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
|
||||
if (temp < 0)
|
||||
return temp;
|
||||
|
||||
@@ -406,6 +406,9 @@ int phy_mii_ioctl(struct phy_device *phydev,
|
||||
&& phydev->drv->config_init)
|
||||
phydev->drv->config_init(phydev);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+23
-9
@@ -1081,7 +1081,7 @@ static int init_nic(struct s2io_nic *nic)
|
||||
/* to set the swapper controle on the card */
|
||||
if(s2io_set_swapper(nic)) {
|
||||
DBG_PRINT(ERR_DBG,"ERROR: Setting Swapper failed\n");
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1503,7 +1503,7 @@ static int init_nic(struct s2io_nic *nic)
|
||||
DBG_PRINT(ERR_DBG, "%s: failed rts ds steering",
|
||||
dev->name);
|
||||
DBG_PRINT(ERR_DBG, "set on codepoint %d\n", i);
|
||||
return FAILURE;
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1570,7 +1570,7 @@ static int init_nic(struct s2io_nic *nic)
|
||||
if (time > 10) {
|
||||
DBG_PRINT(ERR_DBG, "%s: TTI init Failed\n",
|
||||
dev->name);
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
msleep(50);
|
||||
time++;
|
||||
@@ -1623,7 +1623,7 @@ static int init_nic(struct s2io_nic *nic)
|
||||
if (time > 10) {
|
||||
DBG_PRINT(ERR_DBG, "%s: RTI init Failed\n",
|
||||
dev->name);
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
time++;
|
||||
msleep(50);
|
||||
@@ -3914,6 +3914,12 @@ static int s2io_close(struct net_device *dev)
|
||||
{
|
||||
struct s2io_nic *sp = dev->priv;
|
||||
|
||||
/* Return if the device is already closed *
|
||||
* Can happen when s2io_card_up failed in change_mtu *
|
||||
*/
|
||||
if (!is_s2io_card_up(sp))
|
||||
return 0;
|
||||
|
||||
netif_stop_queue(dev);
|
||||
napi_disable(&sp->napi);
|
||||
/* Reset card, kill tasklet and free Tx and Rx buffers. */
|
||||
@@ -6355,6 +6361,7 @@ static int s2io_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
static int s2io_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
struct s2io_nic *sp = dev->priv;
|
||||
int ret = 0;
|
||||
|
||||
if ((new_mtu < MIN_MTU) || (new_mtu > S2IO_JUMBO_SIZE)) {
|
||||
DBG_PRINT(ERR_DBG, "%s: MTU size is invalid.\n",
|
||||
@@ -6366,9 +6373,11 @@ static int s2io_change_mtu(struct net_device *dev, int new_mtu)
|
||||
if (netif_running(dev)) {
|
||||
s2io_card_down(sp);
|
||||
netif_stop_queue(dev);
|
||||
if (s2io_card_up(sp)) {
|
||||
ret = s2io_card_up(sp);
|
||||
if (ret) {
|
||||
DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n",
|
||||
__FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
if (netif_queue_stopped(dev))
|
||||
netif_wake_queue(dev);
|
||||
@@ -6379,7 +6388,7 @@ static int s2io_change_mtu(struct net_device *dev, int new_mtu)
|
||||
writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -6777,6 +6786,9 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io)
|
||||
unsigned long flags;
|
||||
register u64 val64 = 0;
|
||||
|
||||
if (!is_s2io_card_up(sp))
|
||||
return;
|
||||
|
||||
del_timer_sync(&sp->alarm_timer);
|
||||
/* If s2io_set_link task is executing, wait till it completes. */
|
||||
while (test_and_set_bit(__S2IO_STATE_LINK_TASK, &(sp->state))) {
|
||||
@@ -6850,11 +6862,13 @@ static int s2io_card_up(struct s2io_nic * sp)
|
||||
u16 interruptible;
|
||||
|
||||
/* Initialize the H/W I/O registers */
|
||||
if (init_nic(sp) != 0) {
|
||||
ret = init_nic(sp);
|
||||
if (ret != 0) {
|
||||
DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n",
|
||||
dev->name);
|
||||
s2io_reset(sp);
|
||||
return -ENODEV;
|
||||
if (ret != -EIO)
|
||||
s2io_reset(sp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+38
-70
@@ -44,7 +44,7 @@
|
||||
#include "skge.h"
|
||||
|
||||
#define DRV_NAME "skge"
|
||||
#define DRV_VERSION "1.12"
|
||||
#define DRV_VERSION "1.13"
|
||||
#define PFX DRV_NAME " "
|
||||
|
||||
#define DEFAULT_TX_RING_SIZE 128
|
||||
@@ -1095,16 +1095,9 @@ static void xm_link_down(struct skge_hw *hw, int port)
|
||||
{
|
||||
struct net_device *dev = hw->dev[port];
|
||||
struct skge_port *skge = netdev_priv(dev);
|
||||
u16 cmd = xm_read16(hw, port, XM_MMU_CMD);
|
||||
|
||||
xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE);
|
||||
|
||||
cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
|
||||
xm_write16(hw, port, XM_MMU_CMD, cmd);
|
||||
|
||||
/* dummy read to ensure writing */
|
||||
xm_read16(hw, port, XM_MMU_CMD);
|
||||
|
||||
if (netif_carrier_ok(dev))
|
||||
skge_link_down(skge);
|
||||
}
|
||||
@@ -1194,6 +1187,7 @@ static void genesis_init(struct skge_hw *hw)
|
||||
static void genesis_reset(struct skge_hw *hw, int port)
|
||||
{
|
||||
const u8 zero[8] = { 0 };
|
||||
u32 reg;
|
||||
|
||||
skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
|
||||
|
||||
@@ -1209,6 +1203,11 @@ static void genesis_reset(struct skge_hw *hw, int port)
|
||||
xm_write16(hw, port, PHY_BCOM_INT_MASK, 0xffff);
|
||||
|
||||
xm_outhash(hw, port, XM_HSM, zero);
|
||||
|
||||
/* Flush TX and RX fifo */
|
||||
reg = xm_read32(hw, port, XM_MODE);
|
||||
xm_write32(hw, port, XM_MODE, reg | XM_MD_FTF);
|
||||
xm_write32(hw, port, XM_MODE, reg | XM_MD_FRF);
|
||||
}
|
||||
|
||||
|
||||
@@ -1634,15 +1633,14 @@ static void genesis_mac_init(struct skge_hw *hw, int port)
|
||||
}
|
||||
xm_write16(hw, port, XM_RX_CMD, r);
|
||||
|
||||
|
||||
/* We want short frames padded to 60 bytes. */
|
||||
xm_write16(hw, port, XM_TX_CMD, XM_TX_AUTO_PAD);
|
||||
|
||||
/*
|
||||
* Bump up the transmit threshold. This helps hold off transmit
|
||||
* underruns when we're blasting traffic from both ports at once.
|
||||
*/
|
||||
xm_write16(hw, port, XM_TX_THR, 512);
|
||||
/* Increase threshold for jumbo frames on dual port */
|
||||
if (hw->ports > 1 && jumbo)
|
||||
xm_write16(hw, port, XM_TX_THR, 1020);
|
||||
else
|
||||
xm_write16(hw, port, XM_TX_THR, 512);
|
||||
|
||||
/*
|
||||
* Enable the reception of all error frames. This is is
|
||||
@@ -1713,7 +1711,13 @@ static void genesis_stop(struct skge_port *skge)
|
||||
{
|
||||
struct skge_hw *hw = skge->hw;
|
||||
int port = skge->port;
|
||||
u32 reg;
|
||||
unsigned retries = 1000;
|
||||
u16 cmd;
|
||||
|
||||
/* Disable Tx and Rx */
|
||||
cmd = xm_read16(hw, port, XM_MMU_CMD);
|
||||
cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
|
||||
xm_write16(hw, port, XM_MMU_CMD, cmd);
|
||||
|
||||
genesis_reset(hw, port);
|
||||
|
||||
@@ -1721,20 +1725,17 @@ static void genesis_stop(struct skge_port *skge)
|
||||
skge_write16(hw, B3_PA_CTRL,
|
||||
port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2);
|
||||
|
||||
/*
|
||||
* If the transfer sticks at the MAC the STOP command will not
|
||||
* terminate if we don't flush the XMAC's transmit FIFO !
|
||||
*/
|
||||
xm_write32(hw, port, XM_MODE,
|
||||
xm_read32(hw, port, XM_MODE)|XM_MD_FTF);
|
||||
|
||||
|
||||
/* Reset the MAC */
|
||||
skge_write16(hw, SK_REG(port, TX_MFF_CTRL1), MFF_SET_MAC_RST);
|
||||
skge_write16(hw, SK_REG(port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
|
||||
do {
|
||||
skge_write16(hw, SK_REG(port, TX_MFF_CTRL1), MFF_SET_MAC_RST);
|
||||
if (!(skge_read16(hw, SK_REG(port, TX_MFF_CTRL1)) & MFF_SET_MAC_RST))
|
||||
break;
|
||||
} while (--retries > 0);
|
||||
|
||||
/* For external PHYs there must be special handling */
|
||||
if (hw->phy_type != SK_PHY_XMAC) {
|
||||
reg = skge_read32(hw, B2_GP_IO);
|
||||
u32 reg = skge_read32(hw, B2_GP_IO);
|
||||
if (port == 0) {
|
||||
reg |= GP_DIR_0;
|
||||
reg &= ~GP_IO_0;
|
||||
@@ -1801,11 +1802,6 @@ static void genesis_mac_intr(struct skge_hw *hw, int port)
|
||||
xm_write32(hw, port, XM_MODE, XM_MD_FTF);
|
||||
++dev->stats.tx_fifo_errors;
|
||||
}
|
||||
|
||||
if (status & XM_IS_RXF_OV) {
|
||||
xm_write32(hw, port, XM_MODE, XM_MD_FRF);
|
||||
++dev->stats.rx_fifo_errors;
|
||||
}
|
||||
}
|
||||
|
||||
static void genesis_link_up(struct skge_port *skge)
|
||||
@@ -1862,9 +1858,9 @@ static void genesis_link_up(struct skge_port *skge)
|
||||
|
||||
xm_write32(hw, port, XM_MODE, mode);
|
||||
|
||||
/* Turn on detection of Tx underrun, Rx overrun */
|
||||
/* Turn on detection of Tx underrun */
|
||||
msk = xm_read16(hw, port, XM_IMSK);
|
||||
msk &= ~(XM_IS_RXF_OV | XM_IS_TXF_UR);
|
||||
msk &= ~XM_IS_TXF_UR;
|
||||
xm_write16(hw, port, XM_IMSK, msk);
|
||||
|
||||
xm_read16(hw, port, XM_ISRC);
|
||||
@@ -2194,9 +2190,12 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
|
||||
TX_JAM_IPG_VAL(TX_JAM_IPG_DEF) |
|
||||
TX_IPG_JAM_DATA(TX_IPG_JAM_DEF));
|
||||
|
||||
/* serial mode register */
|
||||
reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
|
||||
if (hw->dev[port]->mtu > 1500)
|
||||
/* configure the Serial Mode Register */
|
||||
reg = DATA_BLIND_VAL(DATA_BLIND_DEF)
|
||||
| GM_SMOD_VLAN_ENA
|
||||
| IPG_DATA_VAL(IPG_DATA_DEF);
|
||||
|
||||
if (hw->dev[port]->mtu > ETH_DATA_LEN)
|
||||
reg |= GM_SMOD_JUMBO_ENA;
|
||||
|
||||
gma_write16(hw, port, GM_SERIAL_MODE, reg);
|
||||
@@ -2619,8 +2618,8 @@ static int skge_up(struct net_device *dev)
|
||||
yukon_mac_init(hw, port);
|
||||
spin_unlock_bh(&hw->phy_lock);
|
||||
|
||||
/* Configure RAMbuffers */
|
||||
chunk = hw->ram_size / ((hw->ports + 1)*2);
|
||||
/* Configure RAMbuffers - equally between ports and tx/rx */
|
||||
chunk = (hw->ram_size - hw->ram_offset) / (hw->ports * 2);
|
||||
ram_addr = hw->ram_offset + 2 * chunk * port;
|
||||
|
||||
skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
|
||||
@@ -2897,11 +2896,7 @@ static void skge_tx_timeout(struct net_device *dev)
|
||||
|
||||
static int skge_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
struct skge_port *skge = netdev_priv(dev);
|
||||
struct skge_hw *hw = skge->hw;
|
||||
int port = skge->port;
|
||||
int err;
|
||||
u16 ctl, reg;
|
||||
|
||||
if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
|
||||
return -EINVAL;
|
||||
@@ -2911,40 +2906,13 @@ static int skge_change_mtu(struct net_device *dev, int new_mtu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
skge_write32(hw, B0_IMSK, 0);
|
||||
dev->trans_start = jiffies; /* prevent tx timeout */
|
||||
netif_stop_queue(dev);
|
||||
napi_disable(&skge->napi);
|
||||
|
||||
ctl = gma_read16(hw, port, GM_GP_CTRL);
|
||||
gma_write16(hw, port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
|
||||
|
||||
skge_rx_clean(skge);
|
||||
skge_rx_stop(hw, port);
|
||||
skge_down(dev);
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
|
||||
reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
|
||||
if (new_mtu > 1500)
|
||||
reg |= GM_SMOD_JUMBO_ENA;
|
||||
gma_write16(hw, port, GM_SERIAL_MODE, reg);
|
||||
|
||||
skge_write8(hw, RB_ADDR(rxqaddr[port], RB_CTRL), RB_ENA_OP_MD);
|
||||
|
||||
err = skge_rx_fill(dev);
|
||||
wmb();
|
||||
if (!err)
|
||||
skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
|
||||
skge_write32(hw, B0_IMSK, hw->intr_mask);
|
||||
|
||||
err = skge_up(dev);
|
||||
if (err)
|
||||
dev_close(dev);
|
||||
else {
|
||||
gma_write16(hw, port, GM_GP_CTRL, ctl);
|
||||
|
||||
napi_enable(&skge->napi);
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user