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 git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (166 commits) Revert "ax25: zero length frame filtering in AX25" Revert "netrom: zero length frame filtering in NetRom" cfg80211: default CONFIG_WIRELESS_OLD_REGULATORY to n mac80211/iwlwifi: move virtual A-MDPU queue bookkeeping to iwlwifi mac80211: fix aggregation to not require queue stop mac80211: add skb length sanity checking mac80211: unify and fix TX aggregation start mac80211: clean up __ieee80211_tx args mac80211: rework the pending packets code mac80211: fix A-MPDU queue assignment mac80211: rewrite fragmentation iwlwifi: show current driver status in user readable format b43: Add BCM4307 PCI-ID cfg80211: fix locking in nl80211_set_wiphy mac80211: fix RX path ath5k: properly drop packets from ops->tx ar9170: single module build ath9k: fix dma mapping leak of rx buffer upon rmmod rt2x00: New USB ID for rt73usb ath5k: warn and correct rate for unknown hw rate indexes ...
This commit is contained in:
@@ -227,6 +227,12 @@ usage should require reading the full document.
|
||||
!Pinclude/net/mac80211.h Powersave support
|
||||
</chapter>
|
||||
|
||||
<chapter id="beacon-filter">
|
||||
<title>Beacon filter support</title>
|
||||
!Pinclude/net/mac80211.h Beacon filter support
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_loss
|
||||
</chapter>
|
||||
|
||||
<chapter id="qos">
|
||||
<title>Multiple queues and QoS support</title>
|
||||
<para>TBD</para>
|
||||
|
||||
@@ -6,20 +6,47 @@ be removed from this file.
|
||||
|
||||
---------------------------
|
||||
|
||||
What: old static regulatory information and ieee80211_regdom module parameter
|
||||
When: 2.6.29
|
||||
What: The ieee80211_regdom module parameter
|
||||
When: March 2010 / desktop catchup
|
||||
|
||||
Why: This was inherited by the CONFIG_WIRELESS_OLD_REGULATORY code,
|
||||
and currently serves as an option for users to define an
|
||||
ISO / IEC 3166 alpha2 code for the country they are currently
|
||||
present in. Although there are userspace API replacements for this
|
||||
through nl80211 distributions haven't yet caught up with implementing
|
||||
decent alternatives through standard GUIs. Although available as an
|
||||
option through iw or wpa_supplicant its just a matter of time before
|
||||
distributions pick up good GUI options for this. The ideal solution
|
||||
would actually consist of intelligent designs which would do this for
|
||||
the user automatically even when travelling through different countries.
|
||||
Until then we leave this module parameter as a compromise.
|
||||
|
||||
When userspace improves with reasonable widely-available alternatives for
|
||||
this we will no longer need this module parameter. This entry hopes that
|
||||
by the super-futuristically looking date of "March 2010" we will have
|
||||
such replacements widely available.
|
||||
|
||||
Who: Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: CONFIG_WIRELESS_OLD_REGULATORY - old static regulatory information
|
||||
When: March 2010 / desktop catchup
|
||||
|
||||
Why: The old regulatory infrastructure has been replaced with a new one
|
||||
which does not require statically defined regulatory domains. We do
|
||||
not want to keep static regulatory domains in the kernel due to the
|
||||
the dynamic nature of regulatory law and localization. We kept around
|
||||
the old static definitions for the regulatory domains of:
|
||||
|
||||
* US
|
||||
* JP
|
||||
* EU
|
||||
|
||||
and used by default the US when CONFIG_WIRELESS_OLD_REGULATORY was
|
||||
set. We also kept around the ieee80211_regdom module parameter in case
|
||||
some applications were relying on it. Changing regulatory domains
|
||||
can now be done instead by using nl80211, as is done with iw.
|
||||
set. We will remove this option once the standard Linux desktop catches
|
||||
up with the new userspace APIs we have implemented.
|
||||
|
||||
Who: Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
+9
-1
@@ -765,6 +765,14 @@ L: linux-wireless@vger.kernel.org
|
||||
L: ath9k-devel@lists.ath9k.org
|
||||
S: Supported
|
||||
|
||||
ATHEROS AR9170 WIRELESS DRIVER
|
||||
P: Christian Lamparter
|
||||
M: chunkeey@web.de
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org/en/users/Drivers/ar9170
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/ar9170/
|
||||
|
||||
ATI_REMOTE2 DRIVER
|
||||
P: Ville Syrjala
|
||||
M: syrjala@sci.fi
|
||||
@@ -3602,7 +3610,7 @@ S: Maintained
|
||||
RALINK RT2X00 WIRELESS LAN DRIVER
|
||||
P: rt2x00 project
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: rt2400-devel@lists.sourceforge.net
|
||||
L: users@rt2x00.serialmonkey.com
|
||||
W: http://rt2x00.serialmonkey.com/
|
||||
S: Maintained
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/ivd/rt2x00.git
|
||||
|
||||
+19
-20
@@ -86,7 +86,7 @@ static int uml_net_rx(struct net_device *dev)
|
||||
drop_skb->dev = dev;
|
||||
/* Read a packet into drop_skb and don't do anything with it. */
|
||||
(*lp->read)(lp->fd, drop_skb, lp);
|
||||
lp->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -99,8 +99,8 @@ static int uml_net_rx(struct net_device *dev)
|
||||
skb_trim(skb, pkt_len);
|
||||
skb->protocol = (*lp->protocol)(skb);
|
||||
|
||||
lp->stats.rx_bytes += skb->len;
|
||||
lp->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += skb->len;
|
||||
dev->stats.rx_packets++;
|
||||
netif_rx(skb);
|
||||
return pkt_len;
|
||||
}
|
||||
@@ -224,8 +224,8 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
len = (*lp->write)(lp->fd, skb, lp);
|
||||
|
||||
if (len == skb->len) {
|
||||
lp->stats.tx_packets++;
|
||||
lp->stats.tx_bytes += skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
dev->trans_start = jiffies;
|
||||
netif_start_queue(dev);
|
||||
|
||||
@@ -234,7 +234,7 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
else if (len == 0) {
|
||||
netif_start_queue(dev);
|
||||
lp->stats.tx_dropped++;
|
||||
dev->stats.tx_dropped++;
|
||||
}
|
||||
else {
|
||||
netif_start_queue(dev);
|
||||
@@ -248,12 +248,6 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct net_device_stats *uml_net_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct uml_net_private *lp = netdev_priv(dev);
|
||||
return &lp->stats;
|
||||
}
|
||||
|
||||
static void uml_net_set_multicast_list(struct net_device *dev)
|
||||
{
|
||||
return;
|
||||
@@ -377,6 +371,18 @@ static void net_device_release(struct device *dev)
|
||||
free_netdev(netdev);
|
||||
}
|
||||
|
||||
static const struct net_device_ops uml_netdev_ops = {
|
||||
.ndo_open = uml_net_open,
|
||||
.ndo_stop = uml_net_close,
|
||||
.ndo_start_xmit = uml_net_start_xmit,
|
||||
.ndo_set_multicast_list = uml_net_set_multicast_list,
|
||||
.ndo_tx_timeout = uml_net_tx_timeout,
|
||||
.ndo_set_mac_address = uml_net_set_mac,
|
||||
.ndo_change_mtu = uml_net_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
/*
|
||||
* Ensures that platform_driver_register is called only once by
|
||||
* eth_configure. Will be set in an initcall.
|
||||
@@ -473,14 +479,7 @@ static void eth_configure(int n, void *init, char *mac,
|
||||
|
||||
set_ether_mac(dev, device->mac);
|
||||
dev->mtu = transport->user->mtu;
|
||||
dev->open = uml_net_open;
|
||||
dev->hard_start_xmit = uml_net_start_xmit;
|
||||
dev->stop = uml_net_close;
|
||||
dev->get_stats = uml_net_get_stats;
|
||||
dev->set_multicast_list = uml_net_set_multicast_list;
|
||||
dev->tx_timeout = uml_net_tx_timeout;
|
||||
dev->set_mac_address = uml_net_set_mac;
|
||||
dev->change_mtu = uml_net_change_mtu;
|
||||
dev->netdev_ops = ¨_netdev_ops;
|
||||
dev->ethtool_ops = ¨_net_ethtool_ops;
|
||||
dev->watchdog_timeo = (HZ >> 1);
|
||||
dev->irq = UM_ETH_IRQ;
|
||||
|
||||
@@ -26,7 +26,7 @@ struct uml_net_private {
|
||||
spinlock_t lock;
|
||||
struct net_device *dev;
|
||||
struct timer_list tl;
|
||||
struct net_device_stats stats;
|
||||
|
||||
struct work_struct work;
|
||||
int fd;
|
||||
unsigned char mac[ETH_ALEN];
|
||||
|
||||
@@ -353,9 +353,6 @@ el2_probe1(struct net_device *dev, int ioaddr)
|
||||
|
||||
dev->netdev_ops = &el2_netdev_ops;
|
||||
dev->ethtool_ops = &netdev_ethtool_ops;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
dev->poll_controller = eip_poll;
|
||||
#endif
|
||||
|
||||
retval = register_netdev(dev);
|
||||
if (retval)
|
||||
|
||||
@@ -972,6 +972,14 @@ config ENC28J60_WRITEVERIFY
|
||||
Enable the verify after the buffer write useful for debugging purpose.
|
||||
If unsure, say N.
|
||||
|
||||
config ETHOC
|
||||
tristate "OpenCores 10/100 Mbps Ethernet MAC support"
|
||||
depends on NET_ETHERNET
|
||||
select MII
|
||||
select PHYLIB
|
||||
help
|
||||
Say Y here if you want to use the OpenCores 10/100 Mbps Ethernet MAC.
|
||||
|
||||
config SMC911X
|
||||
tristate "SMSC LAN911[5678] support"
|
||||
select CRC32
|
||||
|
||||
@@ -230,6 +230,7 @@ obj-$(CONFIG_PASEMI_MAC) += pasemi_mac_driver.o
|
||||
pasemi_mac_driver-objs := pasemi_mac.o pasemi_mac_ethtool.o
|
||||
obj-$(CONFIG_MLX4_CORE) += mlx4/
|
||||
obj-$(CONFIG_ENC28J60) += enc28j60.o
|
||||
obj-$(CONFIG_ETHOC) += ethoc.o
|
||||
|
||||
obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o
|
||||
|
||||
|
||||
+17
-5
@@ -143,6 +143,22 @@ out:
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct net_device_ops ac_netdev_ops = {
|
||||
.ndo_open = ac_open,
|
||||
.ndo_stop = ac_close_card,
|
||||
|
||||
.ndo_start_xmit = ei_start_xmit,
|
||||
.ndo_tx_timeout = ei_tx_timeout,
|
||||
.ndo_get_stats = ei_get_stats,
|
||||
.ndo_set_multicast_list = ei_set_multicast_list,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = ei_poll,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init ac_probe1(int ioaddr, struct net_device *dev)
|
||||
{
|
||||
int i, retval;
|
||||
@@ -253,11 +269,7 @@ static int __init ac_probe1(int ioaddr, struct net_device *dev)
|
||||
ei_status.block_output = &ac_block_output;
|
||||
ei_status.get_8390_hdr = &ac_get_8390_hdr;
|
||||
|
||||
dev->open = &ac_open;
|
||||
dev->stop = &ac_close_card;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
dev->poll_controller = ei_poll;
|
||||
#endif
|
||||
dev->netdev_ops = &ac_netdev_ops;
|
||||
NS8390_init(dev, 0);
|
||||
|
||||
retval = register_netdev(dev);
|
||||
|
||||
@@ -171,7 +171,6 @@ static unsigned int cops_debug = COPS_DEBUG;
|
||||
|
||||
struct cops_local
|
||||
{
|
||||
struct net_device_stats stats;
|
||||
int board; /* Holds what board type is. */
|
||||
int nodeid; /* Set to 1 once have nodeid. */
|
||||
unsigned char node_acquire; /* Node ID when acquired. */
|
||||
@@ -197,7 +196,6 @@ static int cops_send_packet (struct sk_buff *skb, struct net_device *dev);
|
||||
static void set_multicast_list (struct net_device *dev);
|
||||
static int cops_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);
|
||||
static int cops_close (struct net_device *dev);
|
||||
static struct net_device_stats *cops_get_stats (struct net_device *dev);
|
||||
|
||||
static void cleanup_card(struct net_device *dev)
|
||||
{
|
||||
@@ -260,6 +258,15 @@ out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static const struct net_device_ops cops_netdev_ops = {
|
||||
.ndo_open = cops_open,
|
||||
.ndo_stop = cops_close,
|
||||
.ndo_start_xmit = cops_send_packet,
|
||||
.ndo_tx_timeout = cops_timeout,
|
||||
.ndo_do_ioctl = cops_ioctl,
|
||||
.ndo_set_multicast_list = set_multicast_list,
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the real probe routine. Linux has a history of friendly device
|
||||
* probes on the ISA bus. A good device probes avoids doing writes, and
|
||||
@@ -333,16 +340,9 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr)
|
||||
/* Copy local board variable to lp struct. */
|
||||
lp->board = board;
|
||||
|
||||
dev->hard_start_xmit = cops_send_packet;
|
||||
dev->tx_timeout = cops_timeout;
|
||||
dev->netdev_ops = &cops_netdev_ops;
|
||||
dev->watchdog_timeo = HZ * 2;
|
||||
|
||||
dev->get_stats = cops_get_stats;
|
||||
dev->open = cops_open;
|
||||
dev->stop = cops_close;
|
||||
dev->do_ioctl = cops_ioctl;
|
||||
dev->set_multicast_list = set_multicast_list;
|
||||
dev->mc_list = NULL;
|
||||
|
||||
/* Tell the user where the card is and what mode we're in. */
|
||||
if(board==DAYNA)
|
||||
@@ -797,7 +797,7 @@ static void cops_rx(struct net_device *dev)
|
||||
{
|
||||
printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n",
|
||||
dev->name);
|
||||
lp->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
while(pkt_len--) /* Discard packet */
|
||||
inb(ioaddr);
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
@@ -819,7 +819,7 @@ static void cops_rx(struct net_device *dev)
|
||||
{
|
||||
printk(KERN_WARNING "%s: Bad packet length of %d bytes.\n",
|
||||
dev->name, pkt_len);
|
||||
lp->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
@@ -836,7 +836,7 @@ static void cops_rx(struct net_device *dev)
|
||||
if(rsp_type != LAP_RESPONSE)
|
||||
{
|
||||
printk(KERN_WARNING "%s: Bad packet type %d.\n", dev->name, rsp_type);
|
||||
lp->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
@@ -846,8 +846,8 @@ static void cops_rx(struct net_device *dev)
|
||||
skb_reset_transport_header(skb); /* Point to data (Skip header). */
|
||||
|
||||
/* Update the counters. */
|
||||
lp->stats.rx_packets++;
|
||||
lp->stats.rx_bytes += skb->len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += skb->len;
|
||||
|
||||
/* Send packet to a higher place. */
|
||||
netif_rx(skb);
|
||||
@@ -858,7 +858,7 @@ static void cops_timeout(struct net_device *dev)
|
||||
struct cops_local *lp = netdev_priv(dev);
|
||||
int ioaddr = dev->base_addr;
|
||||
|
||||
lp->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
if(lp->board==TANGENT)
|
||||
{
|
||||
if((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0)
|
||||
@@ -916,8 +916,8 @@ static int cops_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */
|
||||
|
||||
/* Done sending packet, update counters and cleanup. */
|
||||
lp->stats.tx_packets++;
|
||||
lp->stats.tx_bytes += skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
dev->trans_start = jiffies;
|
||||
dev_kfree_skb (skb);
|
||||
return 0;
|
||||
@@ -986,15 +986,6 @@ static int cops_close(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current statistics.
|
||||
* This may be called with the card open or closed.
|
||||
*/
|
||||
static struct net_device_stats *cops_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct cops_local *lp = netdev_priv(dev);
|
||||
return &lp->stats;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
static struct net_device *cops_dev;
|
||||
|
||||
@@ -261,7 +261,6 @@ static unsigned char *ltdmacbuf;
|
||||
|
||||
struct ltpc_private
|
||||
{
|
||||
struct net_device_stats stats;
|
||||
struct atalk_addr my_addr;
|
||||
};
|
||||
|
||||
@@ -699,7 +698,6 @@ static int do_read(struct net_device *dev, void *cbuf, int cbuflen,
|
||||
static struct timer_list ltpc_timer;
|
||||
|
||||
static int ltpc_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
static struct net_device_stats *ltpc_get_stats(struct net_device *dev);
|
||||
|
||||
static int read_30 ( struct net_device *dev)
|
||||
{
|
||||
@@ -726,8 +724,6 @@ static int sendup_buffer (struct net_device *dev)
|
||||
int dnode, snode, llaptype, len;
|
||||
int sklen;
|
||||
struct sk_buff *skb;
|
||||
struct ltpc_private *ltpc_priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = <pc_priv->stats;
|
||||
struct lt_rcvlap *ltc = (struct lt_rcvlap *) ltdmacbuf;
|
||||
|
||||
if (ltc->command != LT_RCVLAP) {
|
||||
@@ -779,8 +775,8 @@ static int sendup_buffer (struct net_device *dev)
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes+=skb->len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += skb->len;
|
||||
|
||||
/* toss it onwards */
|
||||
netif_rx(skb);
|
||||
@@ -904,10 +900,6 @@ static int ltpc_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
/* in kernel 1.3.xx, on entry skb->data points to ddp header,
|
||||
* and skb->len is the length of the ddp data + ddp header
|
||||
*/
|
||||
|
||||
struct ltpc_private *ltpc_priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = <pc_priv->stats;
|
||||
|
||||
int i;
|
||||
struct lt_sendlap cbuf;
|
||||
unsigned char *hdr;
|
||||
@@ -936,20 +928,13 @@ static int ltpc_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes+=skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct net_device_stats *ltpc_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct ltpc_private *ltpc_priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = <pc_priv->stats;
|
||||
return stats;
|
||||
}
|
||||
|
||||
/* initialization stuff */
|
||||
|
||||
static int __init ltpc_probe_dma(int base, int dma)
|
||||
@@ -1027,6 +1012,12 @@ static int __init ltpc_probe_dma(int base, int dma)
|
||||
return (want & 2) ? 3 : 1;
|
||||
}
|
||||
|
||||
static const struct net_device_ops ltpc_netdev = {
|
||||
.ndo_start_xmit = ltpc_xmit,
|
||||
.ndo_do_ioctl = ltpc_ioctl,
|
||||
.ndo_set_multicast_list = set_multicast_list,
|
||||
};
|
||||
|
||||
struct net_device * __init ltpc_probe(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
@@ -1133,14 +1124,7 @@ struct net_device * __init ltpc_probe(void)
|
||||
else
|
||||
printk(KERN_INFO "Apple/Farallon LocalTalk-PC card at %03x, DMA%d. Using polled mode.\n",io,dma);
|
||||
|
||||
/* Fill in the fields of the device structure with ethernet-generic values. */
|
||||
dev->hard_start_xmit = ltpc_xmit;
|
||||
dev->get_stats = ltpc_get_stats;
|
||||
|
||||
/* add the ltpc-specific things */
|
||||
dev->do_ioctl = <pc_ioctl;
|
||||
|
||||
dev->set_multicast_list = &set_multicast_list;
|
||||
dev->netdev_ops = <pc_netdev;
|
||||
dev->mc_list = NULL;
|
||||
dev->base_addr = io;
|
||||
dev->irq = irq;
|
||||
|
||||
+12
-7
@@ -249,6 +249,17 @@ out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static const struct net_device_ops at1700_netdev_ops = {
|
||||
.ndo_open = net_open,
|
||||
.ndo_stop = net_close,
|
||||
.ndo_start_xmit = net_send_packet,
|
||||
.ndo_set_multicast_list = set_rx_mode,
|
||||
.ndo_tx_timeout = net_tx_timeout,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
|
||||
"signature", the default bit pattern after a reset. This *doesn't* work --
|
||||
there is no way to reset the bus interface without a complete power-cycle!
|
||||
@@ -448,13 +459,7 @@ found:
|
||||
if (net_debug)
|
||||
printk(version);
|
||||
|
||||
memset(lp, 0, sizeof(struct net_local));
|
||||
|
||||
dev->open = net_open;
|
||||
dev->stop = net_close;
|
||||
dev->hard_start_xmit = net_send_packet;
|
||||
dev->set_multicast_list = &set_rx_mode;
|
||||
dev->tx_timeout = net_tx_timeout;
|
||||
dev->netdev_ops = &at1700_netdev_ops;
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
|
||||
spin_lock_init(&lp->lock);
|
||||
|
||||
+18
-10
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "be.h"
|
||||
#include <asm/div64.h>
|
||||
|
||||
MODULE_VERSION(DRV_VER);
|
||||
MODULE_DEVICE_TABLE(pci, be_dev_ids);
|
||||
@@ -290,6 +291,17 @@ static struct net_device_stats *be_get_stats(struct net_device *dev)
|
||||
return &adapter->stats.net_stats;
|
||||
}
|
||||
|
||||
static u32 be_calc_rate(u64 bytes, unsigned long ticks)
|
||||
{
|
||||
u64 rate = bytes;
|
||||
|
||||
do_div(rate, ticks / HZ);
|
||||
rate <<= 3; /* bytes/sec -> bits/sec */
|
||||
do_div(rate, 1000000ul); /* MB/Sec */
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
static void be_tx_rate_update(struct be_adapter *adapter)
|
||||
{
|
||||
struct be_drvr_stats *stats = drvr_stats(adapter);
|
||||
@@ -303,11 +315,9 @@ static void be_tx_rate_update(struct be_adapter *adapter)
|
||||
|
||||
/* Update tx rate once in two seconds */
|
||||
if ((now - stats->be_tx_jiffies) > 2 * HZ) {
|
||||
u32 r;
|
||||
r = (stats->be_tx_bytes - stats->be_tx_bytes_prev) /
|
||||
((now - stats->be_tx_jiffies) / HZ);
|
||||
r = r / 1000000; /* M bytes/s */
|
||||
stats->be_tx_rate = r * 8; /* M bits/s */
|
||||
stats->be_tx_rate = be_calc_rate(stats->be_tx_bytes
|
||||
- stats->be_tx_bytes_prev,
|
||||
now - stats->be_tx_jiffies);
|
||||
stats->be_tx_jiffies = now;
|
||||
stats->be_tx_bytes_prev = stats->be_tx_bytes;
|
||||
}
|
||||
@@ -599,7 +609,6 @@ static void be_rx_rate_update(struct be_adapter *adapter)
|
||||
{
|
||||
struct be_drvr_stats *stats = drvr_stats(adapter);
|
||||
ulong now = jiffies;
|
||||
u32 rate;
|
||||
|
||||
/* Wrapped around */
|
||||
if (time_before(now, stats->be_rx_jiffies)) {
|
||||
@@ -611,10 +620,9 @@ static void be_rx_rate_update(struct be_adapter *adapter)
|
||||
if ((now - stats->be_rx_jiffies) < 2 * HZ)
|
||||
return;
|
||||
|
||||
rate = (stats->be_rx_bytes - stats->be_rx_bytes_prev) /
|
||||
((now - stats->be_rx_jiffies) / HZ);
|
||||
rate = rate / 1000000; /* MB/Sec */
|
||||
stats->be_rx_rate = rate * 8; /* Mega Bits/Sec */
|
||||
stats->be_rx_rate = be_calc_rate(stats->be_rx_bytes
|
||||
- stats->be_rx_bytes_prev,
|
||||
now - stats->be_rx_jiffies);
|
||||
stats->be_rx_jiffies = now;
|
||||
stats->be_rx_bytes_prev = stats->be_rx_bytes;
|
||||
}
|
||||
|
||||
+17
-11
@@ -501,6 +501,21 @@ static void net_poll_controller(struct net_device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct net_device_ops net_ops = {
|
||||
.ndo_open = net_open,
|
||||
.ndo_stop = net_close,
|
||||
.ndo_tx_timeout = net_timeout,
|
||||
.ndo_start_xmit = net_send_packet,
|
||||
.ndo_get_stats = net_get_stats,
|
||||
.ndo_set_multicast_list = set_multicast_list,
|
||||
.ndo_set_mac_address = set_mac_address,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = net_poll_controller,
|
||||
#endif
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
/* This is the real probe routine. Linux has a history of friendly device
|
||||
probes on the ISA bus. A good device probes avoids doing writes, and
|
||||
verifies that the correct device exists and functions.
|
||||
@@ -843,17 +858,8 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
|
||||
/* print the ethernet address. */
|
||||
printk(", MAC %pM", dev->dev_addr);
|
||||
|
||||
dev->open = net_open;
|
||||
dev->stop = net_close;
|
||||
dev->tx_timeout = net_timeout;
|
||||
dev->watchdog_timeo = HZ;
|
||||
dev->hard_start_xmit = net_send_packet;
|
||||
dev->get_stats = net_get_stats;
|
||||
dev->set_multicast_list = set_multicast_list;
|
||||
dev->set_mac_address = set_mac_address;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
dev->poll_controller = net_poll_controller;
|
||||
#endif
|
||||
dev->netdev_ops = &net_ops;
|
||||
dev->watchdog_timeo = HZ;
|
||||
|
||||
printk("\n");
|
||||
if (net_debug)
|
||||
|
||||
@@ -85,6 +85,8 @@ struct fl_pg_chunk {
|
||||
struct page *page;
|
||||
void *va;
|
||||
unsigned int offset;
|
||||
u64 *p_cnt;
|
||||
DECLARE_PCI_UNMAP_ADDR(mapping);
|
||||
};
|
||||
|
||||
struct rx_desc;
|
||||
@@ -101,6 +103,7 @@ struct sge_fl { /* SGE per free-buffer list state */
|
||||
struct fl_pg_chunk pg_chunk;/* page chunk cache */
|
||||
unsigned int use_pages; /* whether FL uses pages or sk_buffs */
|
||||
unsigned int order; /* order of page allocations */
|
||||
unsigned int alloc_size; /* size of allocated buffer */
|
||||
struct rx_desc *desc; /* address of HW Rx descriptor ring */
|
||||
struct rx_sw_desc *sdesc; /* address of SW Rx descriptor ring */
|
||||
dma_addr_t phys_addr; /* physical address of HW ring start */
|
||||
@@ -291,6 +294,7 @@ void t3_os_link_fault_handler(struct adapter *adapter, int port_id);
|
||||
|
||||
void t3_sge_start(struct adapter *adap);
|
||||
void t3_sge_stop(struct adapter *adap);
|
||||
void t3_start_sge_timers(struct adapter *adap);
|
||||
void t3_stop_sge_timers(struct adapter *adap);
|
||||
void t3_free_sge_resources(struct adapter *adap);
|
||||
void t3_sge_err_intr_handler(struct adapter *adapter);
|
||||
|
||||
@@ -191,7 +191,8 @@ struct mdio_ops {
|
||||
};
|
||||
|
||||
struct adapter_info {
|
||||
unsigned char nports; /* # of ports */
|
||||
unsigned char nports0; /* # of ports on channel 0 */
|
||||
unsigned char nports1; /* # of ports on channel 1 */
|
||||
unsigned char phy_base_addr; /* MDIO PHY base address */
|
||||
unsigned int gpio_out; /* GPIO output settings */
|
||||
unsigned char gpio_intr[MAX_NPORTS]; /* GPIO PHY IRQ pins */
|
||||
@@ -422,6 +423,7 @@ struct adapter_params {
|
||||
unsigned short b_wnd[NCCTRL_WIN];
|
||||
|
||||
unsigned int nports; /* # of ethernet ports */
|
||||
unsigned int chan_map; /* bitmap of in-use Tx channels */
|
||||
unsigned int stats_update_period; /* MAC stats accumulation period */
|
||||
unsigned int linkpoll_period; /* link poll period in 0.1s */
|
||||
unsigned int rev; /* chip revision */
|
||||
|
||||
@@ -602,7 +602,6 @@ static int setup_sge_qsets(struct adapter *adap)
|
||||
&adap->params.sge.qset[qset_idx], ntxq, dev,
|
||||
netdev_get_tx_queue(dev, j));
|
||||
if (err) {
|
||||
t3_stop_sge_timers(adap);
|
||||
t3_free_sge_resources(adap);
|
||||
return err;
|
||||
}
|
||||
@@ -1046,6 +1045,8 @@ static int cxgb_up(struct adapter *adap)
|
||||
setup_rss(adap);
|
||||
if (!(adap->flags & NAPI_INIT))
|
||||
init_napi(adap);
|
||||
|
||||
t3_start_sge_timers(adap);
|
||||
adap->flags |= FULL_INIT_DONE;
|
||||
}
|
||||
|
||||
@@ -2870,6 +2871,9 @@ static void t3_io_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct adapter *adapter = pci_get_drvdata(pdev);
|
||||
|
||||
CH_ALERT(adapter, "adapter recovering, PEX ERR 0x%x\n",
|
||||
t3_read_reg(adapter, A_PCIE_PEX_ERR));
|
||||
|
||||
t3_resume_ports(adapter);
|
||||
}
|
||||
|
||||
@@ -3002,7 +3006,7 @@ static int __devinit init_one(struct pci_dev *pdev,
|
||||
static int version_printed;
|
||||
|
||||
int i, err, pci_using_dac = 0;
|
||||
unsigned long mmio_start, mmio_len;
|
||||
resource_size_t mmio_start, mmio_len;
|
||||
const struct adapter_info *ai;
|
||||
struct adapter *adapter = NULL;
|
||||
struct port_info *pi;
|
||||
@@ -3082,7 +3086,7 @@ static int __devinit init_one(struct pci_dev *pdev,
|
||||
INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task);
|
||||
INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task);
|
||||
|
||||
for (i = 0; i < ai->nports; ++i) {
|
||||
for (i = 0; i < ai->nports0 + ai->nports1; ++i) {
|
||||
struct net_device *netdev;
|
||||
|
||||
netdev = alloc_etherdev_mq(sizeof(struct port_info), SGE_QSETS);
|
||||
@@ -3172,7 +3176,7 @@ static int __devinit init_one(struct pci_dev *pdev,
|
||||
|
||||
out_free_dev:
|
||||
iounmap(adapter->regs);
|
||||
for (i = ai->nports - 1; i >= 0; --i)
|
||||
for (i = ai->nports0 + ai->nports1 - 1; i >= 0; --i)
|
||||
if (adapter->port[i])
|
||||
free_netdev(adapter->port[i]);
|
||||
|
||||
|
||||
+126
-40
@@ -50,6 +50,7 @@
|
||||
#define SGE_RX_COPY_THRES 256
|
||||
#define SGE_RX_PULL_LEN 128
|
||||
|
||||
#define SGE_PG_RSVD SMP_CACHE_BYTES
|
||||
/*
|
||||
* Page chunk size for FL0 buffers if FL0 is to be populated with page chunks.
|
||||
* It must be a divisor of PAGE_SIZE. If set to 0 FL0 will use sk_buffs
|
||||
@@ -57,8 +58,10 @@
|
||||
*/
|
||||
#define FL0_PG_CHUNK_SIZE 2048
|
||||
#define FL0_PG_ORDER 0
|
||||
#define FL0_PG_ALLOC_SIZE (PAGE_SIZE << FL0_PG_ORDER)
|
||||
#define FL1_PG_CHUNK_SIZE (PAGE_SIZE > 8192 ? 16384 : 8192)
|
||||
#define FL1_PG_ORDER (PAGE_SIZE > 8192 ? 0 : 1)
|
||||
#define FL1_PG_ALLOC_SIZE (PAGE_SIZE << FL1_PG_ORDER)
|
||||
|
||||
#define SGE_RX_DROP_THRES 16
|
||||
#define RX_RECLAIM_PERIOD (HZ/4)
|
||||
@@ -345,13 +348,21 @@ static inline int should_restart_tx(const struct sge_txq *q)
|
||||
return q->in_use - r < (q->size >> 1);
|
||||
}
|
||||
|
||||
static void clear_rx_desc(const struct sge_fl *q, struct rx_sw_desc *d)
|
||||
static void clear_rx_desc(struct pci_dev *pdev, const struct sge_fl *q,
|
||||
struct rx_sw_desc *d)
|
||||
{
|
||||
if (q->use_pages) {
|
||||
if (d->pg_chunk.page)
|
||||
put_page(d->pg_chunk.page);
|
||||
if (q->use_pages && d->pg_chunk.page) {
|
||||
(*d->pg_chunk.p_cnt)--;
|
||||
if (!*d->pg_chunk.p_cnt)
|
||||
pci_unmap_page(pdev,
|
||||
pci_unmap_addr(&d->pg_chunk, mapping),
|
||||
q->alloc_size, PCI_DMA_FROMDEVICE);
|
||||
|
||||
put_page(d->pg_chunk.page);
|
||||
d->pg_chunk.page = NULL;
|
||||
} else {
|
||||
pci_unmap_single(pdev, pci_unmap_addr(d, dma_addr),
|
||||
q->buf_size, PCI_DMA_FROMDEVICE);
|
||||
kfree_skb(d->skb);
|
||||
d->skb = NULL;
|
||||
}
|
||||
@@ -372,9 +383,8 @@ static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
|
||||
while (q->credits--) {
|
||||
struct rx_sw_desc *d = &q->sdesc[cidx];
|
||||
|
||||
pci_unmap_single(pdev, pci_unmap_addr(d, dma_addr),
|
||||
q->buf_size, PCI_DMA_FROMDEVICE);
|
||||
clear_rx_desc(q, d);
|
||||
|
||||
clear_rx_desc(pdev, q, d);
|
||||
if (++cidx == q->size)
|
||||
cidx = 0;
|
||||
}
|
||||
@@ -417,18 +427,39 @@ static inline int add_one_rx_buf(void *va, unsigned int len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp,
|
||||
static inline int add_one_rx_chunk(dma_addr_t mapping, struct rx_desc *d,
|
||||
unsigned int gen)
|
||||
{
|
||||
d->addr_lo = cpu_to_be32(mapping);
|
||||
d->addr_hi = cpu_to_be32((u64) mapping >> 32);
|
||||
wmb();
|
||||
d->len_gen = cpu_to_be32(V_FLD_GEN1(gen));
|
||||
d->gen2 = cpu_to_be32(V_FLD_GEN2(gen));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q,
|
||||
struct rx_sw_desc *sd, gfp_t gfp,
|
||||
unsigned int order)
|
||||
{
|
||||
if (!q->pg_chunk.page) {
|
||||
dma_addr_t mapping;
|
||||
|
||||
q->pg_chunk.page = alloc_pages(gfp, order);
|
||||
if (unlikely(!q->pg_chunk.page))
|
||||
return -ENOMEM;
|
||||
q->pg_chunk.va = page_address(q->pg_chunk.page);
|
||||
q->pg_chunk.p_cnt = q->pg_chunk.va + (PAGE_SIZE << order) -
|
||||
SGE_PG_RSVD;
|
||||
q->pg_chunk.offset = 0;
|
||||
mapping = pci_map_page(adapter->pdev, q->pg_chunk.page,
|
||||
0, q->alloc_size, PCI_DMA_FROMDEVICE);
|
||||
pci_unmap_addr_set(&q->pg_chunk, mapping, mapping);
|
||||
}
|
||||
sd->pg_chunk = q->pg_chunk;
|
||||
|
||||
prefetch(sd->pg_chunk.p_cnt);
|
||||
|
||||
q->pg_chunk.offset += q->buf_size;
|
||||
if (q->pg_chunk.offset == (PAGE_SIZE << order))
|
||||
q->pg_chunk.page = NULL;
|
||||
@@ -436,6 +467,12 @@ static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp,
|
||||
q->pg_chunk.va += q->buf_size;
|
||||
get_page(q->pg_chunk.page);
|
||||
}
|
||||
|
||||
if (sd->pg_chunk.offset == 0)
|
||||
*sd->pg_chunk.p_cnt = 1;
|
||||
else
|
||||
*sd->pg_chunk.p_cnt += 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -460,35 +497,43 @@ static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
|
||||
*/
|
||||
static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
|
||||
{
|
||||
void *buf_start;
|
||||
struct rx_sw_desc *sd = &q->sdesc[q->pidx];
|
||||
struct rx_desc *d = &q->desc[q->pidx];
|
||||
unsigned int count = 0;
|
||||
|
||||
while (n--) {
|
||||
dma_addr_t mapping;
|
||||
int err;
|
||||
|
||||
if (q->use_pages) {
|
||||
if (unlikely(alloc_pg_chunk(q, sd, gfp, q->order))) {
|
||||
if (unlikely(alloc_pg_chunk(adap, q, sd, gfp,
|
||||
q->order))) {
|
||||
nomem: q->alloc_failed++;
|
||||
break;
|
||||
}
|
||||
buf_start = sd->pg_chunk.va;
|
||||
} else {
|
||||
struct sk_buff *skb = alloc_skb(q->buf_size, gfp);
|
||||
mapping = pci_unmap_addr(&sd->pg_chunk, mapping) +
|
||||
sd->pg_chunk.offset;
|
||||
pci_unmap_addr_set(sd, dma_addr, mapping);
|
||||
|
||||
add_one_rx_chunk(mapping, d, q->gen);
|
||||
pci_dma_sync_single_for_device(adap->pdev, mapping,
|
||||
q->buf_size - SGE_PG_RSVD,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
} else {
|
||||
void *buf_start;
|
||||
|
||||
struct sk_buff *skb = alloc_skb(q->buf_size, gfp);
|
||||
if (!skb)
|
||||
goto nomem;
|
||||
|
||||
sd->skb = skb;
|
||||
buf_start = skb->data;
|
||||
}
|
||||
|
||||
err = add_one_rx_buf(buf_start, q->buf_size, d, sd, q->gen,
|
||||
adap->pdev);
|
||||
if (unlikely(err)) {
|
||||
clear_rx_desc(q, sd);
|
||||
break;
|
||||
err = add_one_rx_buf(buf_start, q->buf_size, d, sd,
|
||||
q->gen, adap->pdev);
|
||||
if (unlikely(err)) {
|
||||
clear_rx_desc(adap->pdev, q, sd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
d++;
|
||||
@@ -795,19 +840,19 @@ static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
|
||||
struct sk_buff *newskb, *skb;
|
||||
struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
|
||||
|
||||
newskb = skb = q->pg_skb;
|
||||
dma_addr_t dma_addr = pci_unmap_addr(sd, dma_addr);
|
||||
|
||||
newskb = skb = q->pg_skb;
|
||||
if (!skb && (len <= SGE_RX_COPY_THRES)) {
|
||||
newskb = alloc_skb(len, GFP_ATOMIC);
|
||||
if (likely(newskb != NULL)) {
|
||||
__skb_put(newskb, len);
|
||||
pci_dma_sync_single_for_cpu(adap->pdev,
|
||||
pci_unmap_addr(sd, dma_addr), len,
|
||||
pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
memcpy(newskb->data, sd->pg_chunk.va, len);
|
||||
pci_dma_sync_single_for_device(adap->pdev,
|
||||
pci_unmap_addr(sd, dma_addr), len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pci_dma_sync_single_for_device(adap->pdev, dma_addr,
|
||||
len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
} else if (!drop_thres)
|
||||
return NULL;
|
||||
recycle:
|
||||
@@ -820,16 +865,25 @@ recycle:
|
||||
if (unlikely(q->rx_recycle_buf || (!skb && fl->credits <= drop_thres)))
|
||||
goto recycle;
|
||||
|
||||
prefetch(sd->pg_chunk.p_cnt);
|
||||
|
||||
if (!skb)
|
||||
newskb = alloc_skb(SGE_RX_PULL_LEN, GFP_ATOMIC);
|
||||
|
||||
if (unlikely(!newskb)) {
|
||||
if (!drop_thres)
|
||||
return NULL;
|
||||
goto recycle;
|
||||
}
|
||||
|
||||
pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
|
||||
fl->buf_size, PCI_DMA_FROMDEVICE);
|
||||
pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
(*sd->pg_chunk.p_cnt)--;
|
||||
if (!*sd->pg_chunk.p_cnt)
|
||||
pci_unmap_page(adap->pdev,
|
||||
pci_unmap_addr(&sd->pg_chunk, mapping),
|
||||
fl->alloc_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (!skb) {
|
||||
__skb_put(newskb, SGE_RX_PULL_LEN);
|
||||
memcpy(newskb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
|
||||
@@ -1089,7 +1143,7 @@ static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
|
||||
struct tx_desc *d = &q->desc[pidx];
|
||||
struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)d;
|
||||
|
||||
cpl->len = htonl(skb->len | 0x80000000);
|
||||
cpl->len = htonl(skb->len);
|
||||
cntrl = V_TXPKT_INTF(pi->port_id);
|
||||
|
||||
if (vlan_tx_tag_present(skb) && pi->vlan_grp)
|
||||
@@ -1958,8 +2012,8 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
|
||||
skb_pull(skb, sizeof(*p) + pad);
|
||||
skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
|
||||
pi = netdev_priv(skb->dev);
|
||||
if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid && p->csum == htons(0xffff) &&
|
||||
!p->fragment) {
|
||||
if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid &&
|
||||
p->csum == htons(0xffff) && !p->fragment) {
|
||||
qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
} else
|
||||
@@ -2034,10 +2088,19 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
|
||||
fl->credits--;
|
||||
|
||||
len -= offset;
|
||||
pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
|
||||
fl->buf_size, PCI_DMA_FROMDEVICE);
|
||||
pci_dma_sync_single_for_cpu(adap->pdev,
|
||||
pci_unmap_addr(sd, dma_addr),
|
||||
fl->buf_size - SGE_PG_RSVD,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
|
||||
prefetch(&qs->lro_frag_tbl);
|
||||
(*sd->pg_chunk.p_cnt)--;
|
||||
if (!*sd->pg_chunk.p_cnt)
|
||||
pci_unmap_page(adap->pdev,
|
||||
pci_unmap_addr(&sd->pg_chunk, mapping),
|
||||
fl->alloc_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
|
||||
prefetch(qs->lro_va);
|
||||
|
||||
rx_frag += nr_frags;
|
||||
rx_frag->page = sd->pg_chunk.page;
|
||||
@@ -2047,6 +2110,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
|
||||
qs->lro_frag_tbl.nr_frags++;
|
||||
qs->lro_frag_tbl.len = frag_len;
|
||||
|
||||
|
||||
if (!complete)
|
||||
return;
|
||||
|
||||
@@ -2236,6 +2300,8 @@ no_mem:
|
||||
if (fl->use_pages) {
|
||||
void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
|
||||
|
||||
prefetch(&qs->lro_frag_tbl);
|
||||
|
||||
prefetch(addr);
|
||||
#if L1_CACHE_BYTES < 128
|
||||
prefetch(addr + L1_CACHE_BYTES);
|
||||
@@ -2972,21 +3038,23 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
||||
q->fl[1].use_pages = FL1_PG_CHUNK_SIZE > 0;
|
||||
q->fl[0].order = FL0_PG_ORDER;
|
||||
q->fl[1].order = FL1_PG_ORDER;
|
||||
q->fl[0].alloc_size = FL0_PG_ALLOC_SIZE;
|
||||
q->fl[1].alloc_size = FL1_PG_ALLOC_SIZE;
|
||||
|
||||
spin_lock_irq(&adapter->sge.reg_lock);
|
||||
|
||||
/* FL threshold comparison uses < */
|
||||
ret = t3_sge_init_rspcntxt(adapter, q->rspq.cntxt_id, irq_vec_idx,
|
||||
q->rspq.phys_addr, q->rspq.size,
|
||||
q->fl[0].buf_size, 1, 0);
|
||||
q->fl[0].buf_size - SGE_PG_RSVD, 1, 0);
|
||||
if (ret)
|
||||
goto err_unlock;
|
||||
|
||||
for (i = 0; i < SGE_RXQ_PER_SET; ++i) {
|
||||
ret = t3_sge_init_flcntxt(adapter, q->fl[i].cntxt_id, 0,
|
||||
q->fl[i].phys_addr, q->fl[i].size,
|
||||
q->fl[i].buf_size, p->cong_thres, 1,
|
||||
0);
|
||||
q->fl[i].buf_size - SGE_PG_RSVD,
|
||||
p->cong_thres, 1, 0);
|
||||
if (ret)
|
||||
goto err_unlock;
|
||||
}
|
||||
@@ -3044,9 +3112,6 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
||||
t3_write_reg(adapter, A_SG_GTS, V_RSPQ(q->rspq.cntxt_id) |
|
||||
V_NEWTIMER(q->rspq.holdoff_tmr));
|
||||
|
||||
mod_timer(&q->tx_reclaim_timer, jiffies + TX_RECLAIM_PERIOD);
|
||||
mod_timer(&q->rx_reclaim_timer, jiffies + RX_RECLAIM_PERIOD);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unlock:
|
||||
@@ -3056,6 +3121,27 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_start_sge_timers - start SGE timer call backs
|
||||
* @adap: the adapter
|
||||
*
|
||||
* Starts each SGE queue set's timer call back
|
||||
*/
|
||||
void t3_start_sge_timers(struct adapter *adap)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < SGE_QSETS; ++i) {
|
||||
struct sge_qset *q = &adap->sge.qs[i];
|
||||
|
||||
if (q->tx_reclaim_timer.function)
|
||||
mod_timer(&q->tx_reclaim_timer, jiffies + TX_RECLAIM_PERIOD);
|
||||
|
||||
if (q->rx_reclaim_timer.function)
|
||||
mod_timer(&q->rx_reclaim_timer, jiffies + RX_RECLAIM_PERIOD);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_stop_sge_timers - stop SGE timer call backs
|
||||
* @adap: the adapter
|
||||
|
||||
+57
-23
@@ -493,20 +493,20 @@ int t3_phy_lasi_intr_handler(struct cphy *phy)
|
||||
}
|
||||
|
||||
static const struct adapter_info t3_adap_info[] = {
|
||||
{2, 0,
|
||||
{1, 1, 0,
|
||||
F_GPIO2_OEN | F_GPIO4_OEN |
|
||||
F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, { S_GPIO3, S_GPIO5 }, 0,
|
||||
&mi1_mdio_ops, "Chelsio PE9000"},
|
||||
{2, 0,
|
||||
{1, 1, 0,
|
||||
F_GPIO2_OEN | F_GPIO4_OEN |
|
||||
F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, { S_GPIO3, S_GPIO5 }, 0,
|
||||
&mi1_mdio_ops, "Chelsio T302"},
|
||||
{1, 0,
|
||||
{1, 0, 0,
|
||||
F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN |
|
||||
F_GPIO11_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
|
||||
{ 0 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
||||
&mi1_mdio_ext_ops, "Chelsio T310"},
|
||||
{2, 0,
|
||||
{1, 1, 0,
|
||||
F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN |
|
||||
F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL |
|
||||
F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
|
||||
@@ -514,7 +514,7 @@ static const struct adapter_info t3_adap_info[] = {
|
||||
&mi1_mdio_ext_ops, "Chelsio T320"},
|
||||
{},
|
||||
{},
|
||||
{1, 0,
|
||||
{1, 0, 0,
|
||||
F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO6_OEN | F_GPIO7_OEN |
|
||||
F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
|
||||
{ S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
||||
@@ -2128,16 +2128,40 @@ void t3_port_intr_clear(struct adapter *adapter, int idx)
|
||||
static int t3_sge_write_context(struct adapter *adapter, unsigned int id,
|
||||
unsigned int type)
|
||||
{
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
|
||||
if (type == F_RESPONSEQ) {
|
||||
/*
|
||||
* Can't write the Response Queue Context bits for
|
||||
* Interrupt Armed or the Reserve bits after the chip
|
||||
* has been initialized out of reset. Writing to these
|
||||
* bits can confuse the hardware.
|
||||
*/
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0x17ffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
|
||||
} else {
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff);
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff);
|
||||
}
|
||||
t3_write_reg(adapter, A_SG_CONTEXT_CMD,
|
||||
V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
|
||||
return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
|
||||
0, SG_CONTEXT_CMD_ATTEMPTS, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* clear_sge_ctxt - completely clear an SGE context
|
||||
* @adapter: the adapter
|
||||
* @id: the context id
|
||||
* @type: the context type
|
||||
*
|
||||
* Completely clear an SGE context. Used predominantly at post-reset
|
||||
* initialization. Note in particular that we don't skip writing to any
|
||||
* "sensitive bits" in the contexts the way that t3_sge_write_context()
|
||||
* does ...
|
||||
*/
|
||||
static int clear_sge_ctxt(struct adapter *adap, unsigned int id,
|
||||
unsigned int type)
|
||||
{
|
||||
@@ -2145,7 +2169,14 @@ static int clear_sge_ctxt(struct adapter *adap, unsigned int id,
|
||||
t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0);
|
||||
return t3_sge_write_context(adap, id, type);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_MASK0, 0xffffffff);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_MASK1, 0xffffffff);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_MASK2, 0xffffffff);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_MASK3, 0xffffffff);
|
||||
t3_write_reg(adap, A_SG_CONTEXT_CMD,
|
||||
V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id));
|
||||
return t3_wait_op_done(adap, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY,
|
||||
0, SG_CONTEXT_CMD_ATTEMPTS, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2729,10 +2760,10 @@ static void tp_config(struct adapter *adap, const struct tp_params *p)
|
||||
F_TCPCHECKSUMOFFLOAD | V_IPTTL(64));
|
||||
t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) |
|
||||
F_MTUENABLE | V_WINDOWSCALEMODE(1) |
|
||||
V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1));
|
||||
V_TIMESTAMPSMODE(1) | V_SACKMODE(1) | V_SACKRX(1));
|
||||
t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) |
|
||||
V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
|
||||
V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) |
|
||||
V_BYTETHRESHOLD(26880) | V_MSSTHRESHOLD(2) |
|
||||
F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1));
|
||||
t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO,
|
||||
F_IPV6ENABLE | F_NICMODE);
|
||||
@@ -3196,20 +3227,22 @@ int t3_mps_set_active_ports(struct adapter *adap, unsigned int port_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the bits of HW initialization that are dependent on the number
|
||||
* of available ports.
|
||||
* Perform the bits of HW initialization that are dependent on the Tx
|
||||
* channels being used.
|
||||
*/
|
||||
static void init_hw_for_avail_ports(struct adapter *adap, int nports)
|
||||
static void chan_init_hw(struct adapter *adap, unsigned int chan_map)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (nports == 1) {
|
||||
if (chan_map != 3) { /* one channel */
|
||||
t3_set_reg_field(adap, A_ULPRX_CTL, F_ROUND_ROBIN, 0);
|
||||
t3_set_reg_field(adap, A_ULPTX_CONFIG, F_CFG_RR_ARB, 0);
|
||||
t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_TPTXPORT0EN |
|
||||
F_PORT0ACTIVE | F_ENFORCEPKT);
|
||||
t3_write_reg(adap, A_PM1_TX_CFG, 0xffffffff);
|
||||
} else {
|
||||
t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_ENFORCEPKT |
|
||||
(chan_map == 1 ? F_TPTXPORT0EN | F_PORT0ACTIVE :
|
||||
F_TPTXPORT1EN | F_PORT1ACTIVE));
|
||||
t3_write_reg(adap, A_PM1_TX_CFG,
|
||||
chan_map == 1 ? 0xffffffff : 0);
|
||||
} else { /* two channels */
|
||||
t3_set_reg_field(adap, A_ULPRX_CTL, 0, F_ROUND_ROBIN);
|
||||
t3_set_reg_field(adap, A_ULPTX_CONFIG, 0, F_CFG_RR_ARB);
|
||||
t3_write_reg(adap, A_ULPTX_DMA_WEIGHT,
|
||||
@@ -3517,7 +3550,7 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params)
|
||||
t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff);
|
||||
t3_write_reg(adapter, A_PM1_RX_MODE, 0);
|
||||
t3_write_reg(adapter, A_PM1_TX_MODE, 0);
|
||||
init_hw_for_avail_ports(adapter, adapter->params.nports);
|
||||
chan_init_hw(adapter, adapter->params.chan_map);
|
||||
t3_sge_init(adapter, &adapter->params.sge);
|
||||
|
||||
t3_write_reg(adapter, A_T3DBG_GPIO_ACT_LOW, calc_gpio_intr(adapter));
|
||||
@@ -3754,7 +3787,8 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
|
||||
get_pci_mode(adapter, &adapter->params.pci);
|
||||
|
||||
adapter->params.info = ai;
|
||||
adapter->params.nports = ai->nports;
|
||||
adapter->params.nports = ai->nports0 + ai->nports1;
|
||||
adapter->params.chan_map = !!ai->nports0 | (!!ai->nports1 << 1);
|
||||
adapter->params.rev = t3_read_reg(adapter, A_PL_REV);
|
||||
/*
|
||||
* We used to only run the "adapter check task" once a second if
|
||||
@@ -3785,7 +3819,7 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
|
||||
mc7_prep(adapter, &adapter->pmtx, MC7_PMTX_BASE_ADDR, "PMTX");
|
||||
mc7_prep(adapter, &adapter->cm, MC7_CM_BASE_ADDR, "CM");
|
||||
|
||||
p->nchan = ai->nports;
|
||||
p->nchan = adapter->params.chan_map == 3 ? 2 : 1;
|
||||
p->pmrx_size = t3_mc7_size(&adapter->pmrx);
|
||||
p->pmtx_size = t3_mc7_size(&adapter->pmtx);
|
||||
p->cm_size = t3_mc7_size(&adapter->cm);
|
||||
|
||||
+13
-6
@@ -566,6 +566,18 @@ MODULE_LICENSE("GPL");
|
||||
outw(CSR0, DEPCA_ADDR);\
|
||||
outw(STOP, DEPCA_DATA)
|
||||
|
||||
static const struct net_device_ops depca_netdev_ops = {
|
||||
.ndo_open = depca_open,
|
||||
.ndo_start_xmit = depca_start_xmit,
|
||||
.ndo_stop = depca_close,
|
||||
.ndo_set_multicast_list = set_multicast_list,
|
||||
.ndo_do_ioctl = depca_ioctl,
|
||||
.ndo_tx_timeout = depca_tx_timeout,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
static int __init depca_hw_init (struct net_device *dev, struct device *device)
|
||||
{
|
||||
struct depca_private *lp;
|
||||
@@ -793,12 +805,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device)
|
||||
}
|
||||
|
||||
/* The DEPCA-specific entries in the device structure. */
|
||||
dev->open = &depca_open;
|
||||
dev->hard_start_xmit = &depca_start_xmit;
|
||||
dev->stop = &depca_close;
|
||||
dev->set_multicast_list = &set_multicast_list;
|
||||
dev->do_ioctl = &depca_ioctl;
|
||||
dev->tx_timeout = depca_tx_timeout;
|
||||
dev->netdev_ops = &depca_netdev_ops;
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
|
||||
dev->mem_start = 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user