Commit 0e396ee4 authored by Linus Torvalds's avatar Linus Torvalds

Manual merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git

This is a fixed-up version of the broken "upstream-2.6.13" branch, where
I re-did the manual merge of drivers/net/r8169.c by hand, and made sure
the history is all good.
parents b8112df7 2089a0d3
Generic HDLC layer Generic HDLC layer
Krzysztof Halasa <khc@pm.waw.pl> Krzysztof Halasa <khc@pm.waw.pl>
January, 2003
Generic HDLC layer currently supports: Generic HDLC layer currently supports:
- Frame Relay (ANSI, CCITT and no LMI), with ARP support (no InARP). 1. Frame Relay (ANSI, CCITT, Cisco and no LMI).
Normal (routed) and Ethernet-bridged (Ethernet device emulation) - Normal (routed) and Ethernet-bridged (Ethernet device emulation)
interfaces can share a single PVC. interfaces can share a single PVC.
- raw HDLC - either IP (IPv4) interface or Ethernet device emulation. - ARP support (no InARP support in the kernel - there is an
- Cisco HDLC, experimental InARP user-space daemon available on:
- PPP (uses syncppp.c), http://www.kernel.org/pub/linux/utils/net/hdlc/).
- X.25 (uses X.25 routines). 2. raw HDLC - either IP (IPv4) interface or Ethernet device emulation.
3. Cisco HDLC.
There are hardware drivers for the following cards: 4. PPP (uses syncppp.c).
- C101 by Moxa Technologies Co., Ltd. 5. X.25 (uses X.25 routines).
- RISCom/N2 by SDL Communications Inc.
- and others, some not in the official kernel. Generic HDLC is a protocol driver only - it needs a low-level driver
for your particular hardware.
Ethernet device emulation (using HDLC or Frame-Relay PVC) is compatible Ethernet device emulation (using HDLC or Frame-Relay PVC) is compatible
with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging). with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging).
...@@ -24,7 +24,7 @@ with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging). ...@@ -24,7 +24,7 @@ with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging).
Make sure the hdlc.o and the hardware driver are loaded. It should Make sure the hdlc.o and the hardware driver are loaded. It should
create a number of "hdlc" (hdlc0 etc) network devices, one for each create a number of "hdlc" (hdlc0 etc) network devices, one for each
WAN port. You'll need the "sethdlc" utility, get it from: WAN port. You'll need the "sethdlc" utility, get it from:
http://hq.pm.waw.pl/hdlc/ http://www.kernel.org/pub/linux/utils/net/hdlc/
Compile sethdlc.c utility: Compile sethdlc.c utility:
gcc -O2 -Wall -o sethdlc sethdlc.c gcc -O2 -Wall -o sethdlc sethdlc.c
...@@ -52,12 +52,12 @@ Setting interface: ...@@ -52,12 +52,12 @@ Setting interface:
* v35 | rs232 | x21 | t1 | e1 - sets physical interface for a given port * v35 | rs232 | x21 | t1 | e1 - sets physical interface for a given port
if the card has software-selectable interfaces if the card has software-selectable interfaces
loopback - activate hardware loopback (for testing only) loopback - activate hardware loopback (for testing only)
* clock ext - external clock (uses DTE RX and TX clock) * clock ext - both RX clock and TX clock external
* clock int - internal clock (provides clock signal on DCE clock output) * clock int - both RX clock and TX clock internal
* clock txint - TX internal, RX external (provides TX clock on DCE output) * clock txint - RX clock external, TX clock internal
* clock txfromrx - TX clock derived from RX clock (TX clock on DCE output) * clock txfromrx - RX clock external, TX clock derived from RX clock
* rate - sets clock rate in bps (not required for external clock or * rate - sets clock rate in bps (for "int" or "txint" clock only)
for txfromrx)
Setting protocol: Setting protocol:
...@@ -79,7 +79,7 @@ Setting protocol: ...@@ -79,7 +79,7 @@ Setting protocol:
* x25 - sets X.25 mode * x25 - sets X.25 mode
* fr - Frame Relay mode * fr - Frame Relay mode
lmi ansi / ccitt / none - LMI (link management) type lmi ansi / ccitt / cisco / none - LMI (link management) type
dce - Frame Relay DCE (network) side LMI instead of default DTE (user). dce - Frame Relay DCE (network) side LMI instead of default DTE (user).
It has nothing to do with clocks! It has nothing to do with clocks!
t391 - link integrity verification polling timer (in seconds) - user t391 - link integrity verification polling timer (in seconds) - user
...@@ -119,13 +119,14 @@ or ...@@ -119,13 +119,14 @@ or
If you have a problem with N2 or C101 card, you can issue the "private" If you have a problem with N2, C101 or PLX200SYN card, you can issue the
command to see port's packet descriptor rings (in kernel logs): "private" command to see port's packet descriptor rings (in kernel logs):
sethdlc hdlc0 private sethdlc hdlc0 private
The hardware driver has to be build with CONFIG_HDLC_DEBUG_RINGS. The hardware driver has to be build with #define DEBUG_RINGS.
Attaching this info to bug reports would be helpful. Anyway, let me know Attaching this info to bug reports would be helpful. Anyway, let me know
if you have problems using this. if you have problems using this.
For patches and other info look at http://hq.pm.waw.pl/hdlc/ For patches and other info look at:
<http://www.kernel.org/pub/linux/utils/net/hdlc/>.
...@@ -47,7 +47,6 @@ ni52 <------------------ Buggy ------------------> ...@@ -47,7 +47,6 @@ ni52 <------------------ Buggy ------------------>
ni65 YES YES YES Software(#) ni65 YES YES YES Software(#)
seeq NO NO NO N/A seeq NO NO NO N/A
sgiseek <------------------ Buggy ------------------> sgiseek <------------------ Buggy ------------------>
sk_g16 NO NO YES N/A
smc-ultra YES YES YES Hardware smc-ultra YES YES YES Hardware
sunlance YES YES YES Hardware sunlance YES YES YES Hardware
tulip YES YES YES Hardware tulip YES YES YES Hardware
......
...@@ -284,9 +284,6 @@ ppp.c: ...@@ -284,9 +284,6 @@ ppp.c:
seeq8005.c: *Not modularized* seeq8005.c: *Not modularized*
(Probes ports: 0x300, 0x320, 0x340, 0x360) (Probes ports: 0x300, 0x320, 0x340, 0x360)
sk_g16.c: *Not modularized*
(Probes ports: 0x100, 0x180, 0x208, 0x220m 0x288, 0x320, 0x328, 0x390)
skeleton.c: *Skeleton* skeleton.c: *Skeleton*
slhc.c: slhc.c:
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
...@@ -91,16 +92,17 @@ KERN_INFO DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ...@@ -91,16 +92,17 @@ KERN_INFO DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE
MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>"); MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>");
MODULE_DESCRIPTION("RealTek RTL-8139C+ series 10/100 PCI Ethernet driver"); MODULE_DESCRIPTION("RealTek RTL-8139C+ series 10/100 PCI Ethernet driver");
MODULE_VERSION(DRV_VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int debug = -1; static int debug = -1;
MODULE_PARM (debug, "i"); module_param(debug, int, 0);
MODULE_PARM_DESC (debug, "8139cp: bitmapped message enable number"); MODULE_PARM_DESC (debug, "8139cp: bitmapped message enable number");
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
The RTL chips use a 64 element hash table based on the Ethernet CRC. */ The RTL chips use a 64 element hash table based on the Ethernet CRC. */
static int multicast_filter_limit = 32; static int multicast_filter_limit = 32;
MODULE_PARM (multicast_filter_limit, "i"); module_param(multicast_filter_limit, int, 0);
MODULE_PARM_DESC (multicast_filter_limit, "8139cp: maximum number of filtered multicast addresses"); MODULE_PARM_DESC (multicast_filter_limit, "8139cp: maximum number of filtered multicast addresses");
#define PFX DRV_NAME ": " #define PFX DRV_NAME ": "
...@@ -186,6 +188,9 @@ enum { ...@@ -186,6 +188,9 @@ enum {
RingEnd = (1 << 30), /* End of descriptor ring */ RingEnd = (1 << 30), /* End of descriptor ring */
FirstFrag = (1 << 29), /* First segment of a packet */ FirstFrag = (1 << 29), /* First segment of a packet */
LastFrag = (1 << 28), /* Final segment of a packet */ LastFrag = (1 << 28), /* Final segment of a packet */
LargeSend = (1 << 27), /* TCP Large Send Offload (TSO) */
MSSShift = 16, /* MSS value position */
MSSMask = 0xfff, /* MSS value: 11 bits */
TxError = (1 << 23), /* Tx error summary */ TxError = (1 << 23), /* Tx error summary */
RxError = (1 << 20), /* Rx error summary */ RxError = (1 << 20), /* Rx error summary */
IPCS = (1 << 18), /* Calculate IP checksum */ IPCS = (1 << 18), /* Calculate IP checksum */
...@@ -312,7 +317,7 @@ struct cp_desc { ...@@ -312,7 +317,7 @@ struct cp_desc {
struct ring_info { struct ring_info {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t mapping; dma_addr_t mapping;
unsigned frag; u32 len;
}; };
struct cp_dma_stats { struct cp_dma_stats {
...@@ -394,6 +399,9 @@ struct cp_private { ...@@ -394,6 +399,9 @@ struct cp_private {
static void __cp_set_rx_mode (struct net_device *dev); static void __cp_set_rx_mode (struct net_device *dev);
static void cp_tx (struct cp_private *cp); static void cp_tx (struct cp_private *cp);
static void cp_clean_rings (struct cp_private *cp); static void cp_clean_rings (struct cp_private *cp);
#ifdef CONFIG_NET_POLL_CONTROLLER
static void cp_poll_controller(struct net_device *dev);
#endif
static struct pci_device_id cp_pci_tbl[] = { static struct pci_device_id cp_pci_tbl[] = {
{ PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139, { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139,
...@@ -688,6 +696,19 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs) ...@@ -688,6 +696,19 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
#ifdef CONFIG_NET_POLL_CONTROLLER
/*
* Polling receive - used by netconsole and other diagnostic tools
* to allow network i/o with interrupts disabled.
*/
static void cp_poll_controller(struct net_device *dev)
{
disable_irq(dev->irq);
cp_interrupt(dev->irq, dev, NULL);
enable_irq(dev->irq);
}
#endif
static void cp_tx (struct cp_private *cp) static void cp_tx (struct cp_private *cp)
{ {
unsigned tx_head = cp->tx_head; unsigned tx_head = cp->tx_head;
...@@ -707,7 +728,7 @@ static void cp_tx (struct cp_private *cp) ...@@ -707,7 +728,7 @@ static void cp_tx (struct cp_private *cp)
BUG(); BUG();
pci_unmap_single(cp->pdev, cp->tx_skb[tx_tail].mapping, pci_unmap_single(cp->pdev, cp->tx_skb[tx_tail].mapping,
skb->len, PCI_DMA_TODEVICE); cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE);
if (status & LastFrag) { if (status & LastFrag) {
if (status & (TxError | TxFIFOUnder)) { if (status & (TxError | TxFIFOUnder)) {
...@@ -749,10 +770,11 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -749,10 +770,11 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
{ {
struct cp_private *cp = netdev_priv(dev); struct cp_private *cp = netdev_priv(dev);
unsigned entry; unsigned entry;
u32 eor; u32 eor, flags;
#if CP_VLAN_TAG_USED #if CP_VLAN_TAG_USED
u32 vlan_tag = 0; u32 vlan_tag = 0;
#endif #endif
int mss = 0;
spin_lock_irq(&cp->lock); spin_lock_irq(&cp->lock);
...@@ -772,6 +794,9 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -772,6 +794,9 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
entry = cp->tx_head; entry = cp->tx_head;
eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
if (dev->features & NETIF_F_TSO)
mss = skb_shinfo(skb)->tso_size;
if (skb_shinfo(skb)->nr_frags == 0) { if (skb_shinfo(skb)->nr_frags == 0) {
struct cp_desc *txd = &cp->tx_ring[entry]; struct cp_desc *txd = &cp->tx_ring[entry];
u32 len; u32 len;
...@@ -783,26 +808,26 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -783,26 +808,26 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
txd->addr = cpu_to_le64(mapping); txd->addr = cpu_to_le64(mapping);
wmb(); wmb();
if (skb->ip_summed == CHECKSUM_HW) { flags = eor | len | DescOwn | FirstFrag | LastFrag;
if (mss)
flags |= LargeSend | ((mss & MSSMask) << MSSShift);
else if (skb->ip_summed == CHECKSUM_HW) {
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = skb->nh.iph;
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
txd->opts1 = cpu_to_le32(eor | len | DescOwn | flags |= IPCS | TCPCS;
FirstFrag | LastFrag |
IPCS | TCPCS);
else if (ip->protocol == IPPROTO_UDP) else if (ip->protocol == IPPROTO_UDP)
txd->opts1 = cpu_to_le32(eor | len | DescOwn | flags |= IPCS | UDPCS;
FirstFrag | LastFrag |
IPCS | UDPCS);
else else
BUG(); WARN_ON(1); /* we need a WARN() */
} else }
txd->opts1 = cpu_to_le32(eor | len | DescOwn |
FirstFrag | LastFrag); txd->opts1 = cpu_to_le32(flags);
wmb(); wmb();
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = mapping; cp->tx_skb[entry].mapping = mapping;
cp->tx_skb[entry].frag = 0; cp->tx_skb[entry].len = len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
} else { } else {
struct cp_desc *txd; struct cp_desc *txd;
...@@ -820,7 +845,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -820,7 +845,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
first_len, PCI_DMA_TODEVICE); first_len, PCI_DMA_TODEVICE);
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = first_mapping; cp->tx_skb[entry].mapping = first_mapping;
cp->tx_skb[entry].frag = 1; cp->tx_skb[entry].len = first_len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
...@@ -836,16 +861,19 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -836,16 +861,19 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
len, PCI_DMA_TODEVICE); len, PCI_DMA_TODEVICE);
eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
if (skb->ip_summed == CHECKSUM_HW) { ctrl = eor | len | DescOwn;
ctrl = eor | len | DescOwn | IPCS;
if (mss)
ctrl |= LargeSend |
((mss & MSSMask) << MSSShift);
else if (skb->ip_summed == CHECKSUM_HW) {
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
ctrl |= TCPCS; ctrl |= IPCS | TCPCS;
else if (ip->protocol == IPPROTO_UDP) else if (ip->protocol == IPPROTO_UDP)
ctrl |= UDPCS; ctrl |= IPCS | UDPCS;
else else
BUG(); BUG();
} else }
ctrl = eor | len | DescOwn;
if (frag == skb_shinfo(skb)->nr_frags - 1) if (frag == skb_shinfo(skb)->nr_frags - 1)
ctrl |= LastFrag; ctrl |= LastFrag;
...@@ -860,7 +888,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -860,7 +888,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = mapping; cp->tx_skb[entry].mapping = mapping;
cp->tx_skb[entry].frag = frag + 2; cp->tx_skb[entry].len = len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
} }
...@@ -1074,7 +1102,6 @@ static int cp_refill_rx (struct cp_private *cp) ...@@ -1074,7 +1102,6 @@ static int cp_refill_rx (struct cp_private *cp)
cp->rx_skb[i].mapping = pci_map_single(cp->pdev, cp->rx_skb[i].mapping = pci_map_single(cp->pdev,
skb->tail, cp->rx_buf_sz, PCI_DMA_FROMDEVICE); skb->tail, cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
cp->rx_skb[i].skb = skb; cp->rx_skb[i].skb = skb;
cp->rx_skb[i].frag = 0;
cp->rx_ring[i].opts2 = 0; cp->rx_ring[i].opts2 = 0;
cp->rx_ring[i].addr = cpu_to_le64(cp->rx_skb[i].mapping); cp->rx_ring[i].addr = cpu_to_le64(cp->rx_skb[i].mapping);
...@@ -1126,9 +1153,6 @@ static void cp_clean_rings (struct cp_private *cp) ...@@ -1126,9 +1153,6 @@ static void cp_clean_rings (struct cp_private *cp)
{ {
unsigned i; unsigned i;
memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
for (i = 0; i < CP_RX_RING_SIZE; i++) { for (i = 0; i < CP_RX_RING_SIZE; i++) {
if (cp->rx_skb[i].skb) { if (cp->rx_skb[i].skb) {
pci_unmap_single(cp->pdev, cp->rx_skb[i].mapping, pci_unmap_single(cp->pdev, cp->rx_skb[i].mapping,
...@@ -1140,13 +1164,18 @@ static void cp_clean_rings (struct cp_private *cp) ...@@ -1140,13 +1164,18 @@ static void cp_clean_rings (struct cp_private *cp)
for (i = 0; i < CP_TX_RING_SIZE; i++) { for (i = 0; i < CP_TX_RING_SIZE; i++) {
if (cp->tx_skb[i].skb) { if (cp->tx_skb[i].skb) {
struct sk_buff *skb = cp->tx_skb[i].skb; struct sk_buff *skb = cp->tx_skb[i].skb;
pci_unmap_single(cp->pdev, cp->tx_skb[i].mapping, pci_unmap_single(cp->pdev, cp->tx_skb[i].mapping,
skb->len, PCI_DMA_TODEVICE); cp->tx_skb[i].len, PCI_DMA_TODEVICE);
dev_kfree_skb(skb); if (le32_to_cpu(cp->tx_ring[i].opts1) & LastFrag)
dev_kfree_skb(skb);
cp->net_stats.tx_dropped++; cp->net_stats.tx_dropped++;
} }
} }
memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
memset(&cp->rx_skb, 0, sizeof(struct ring_info) * CP_RX_RING_SIZE); memset(&cp->rx_skb, 0, sizeof(struct ring_info) * CP_RX_RING_SIZE);
memset(&cp->tx_skb, 0, sizeof(struct ring_info) * CP_TX_RING_SIZE); memset(&cp->tx_skb, 0, sizeof(struct ring_info) * CP_TX_RING_SIZE);
} }
...@@ -1538,6 +1567,8 @@ static struct ethtool_ops cp_ethtool_ops = { ...@@ -1538,6 +1567,8 @@ static struct ethtool_ops cp_ethtool_ops = {
.set_tx_csum = ethtool_op_set_tx_csum, /* local! */ .set_tx_csum = ethtool_op_set_tx_csum, /* local! */
.get_sg = ethtool_op_get_sg, .get_sg = ethtool_op_get_sg,
.set_sg = ethtool_op_set_sg, .set_sg = ethtool_op_set_sg,
.get_tso = ethtool_op_get_tso,
.set_tso = ethtool_op_set_tso,
.get_regs = cp_get_regs, .get_regs = cp_get_regs,
.get_wol = cp_get_wol, .get_wol = cp_get_wol,
.set_wol = cp_set_wol, .set_wol = cp_set_wol,
...@@ -1749,6 +1780,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1749,6 +1780,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
dev->get_stats = cp_get_stats; dev->get_stats = cp_get_stats;
dev->do_ioctl = cp_ioctl; dev->do_ioctl = cp_ioctl;
dev->poll = cp_rx_poll; dev->poll = cp_rx_poll;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = cp_poll_controller;
#endif
dev->weight = 16; /* arbitrary? from NAPI_HOWTO.txt. */ dev->weight = 16; /* arbitrary? from NAPI_HOWTO.txt. */
#ifdef BROKEN #ifdef BROKEN
dev->change_mtu = cp_change_mtu; dev->change_mtu = cp_change_mtu;
...@@ -1768,6 +1802,10 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1768,6 +1802,10 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if (pci_using_dac) if (pci_using_dac)
dev->features |= NETIF_F_HIGHDMA; dev->features |= NETIF_F_HIGHDMA;
#if 0 /* disabled by default until verified */
dev->features |= NETIF_F_TSO;
#endif
dev->irq = pdev->irq; dev->irq = pdev->irq;
rc = register_netdev(dev); rc = register_netdev(dev);
......
This diff is collapsed.
...@@ -824,6 +824,18 @@ config SMC9194 ...@@ -824,6 +824,18 @@ config SMC9194
<file:Documentation/networking/net-modules.txt>. The module <file:Documentation/networking/net-modules.txt>. The module
will be called smc9194. will be called smc9194.
config DM9000
tristate "DM9000 support"
depends on ARM && NET_ETHERNET
select CRC32
select MII
---help---
Support for DM9000 chipset.
To compile this driver as a module, choose M here and read
<file:Documentation/networking/net-modules.txt>. The module will be
called dm9000.
config NET_VENDOR_RACAL config NET_VENDOR_RACAL
bool "Racal-Interlan (Micom) NI cards" bool "Racal-Interlan (Micom) NI cards"
depends on NET_ETHERNET && ISA depends on NET_ETHERNET && ISA
...@@ -989,21 +1001,6 @@ config EEXPRESS_PRO ...@@ -989,21 +1001,6 @@ config EEXPRESS_PRO
<file:Documentation/networking/net-modules.txt>. The module <file:Documentation/networking/net-modules.txt>. The module
will be called eepro. will be called eepro.
config FMV18X
tristate "FMV-181/182/183/184 support (OBSOLETE)"
depends on NET_ISA && OBSOLETE
---help---
If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
say Y and read the Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto>.
If you use an FMV-183 or FMV-184 and it is not working, you may need
to disable Plug & Play mode of the card.
To compile this driver as a module, choose M here and read
<file:Documentation/networking/net-modules.txt>. The module
will be called fmv18x.
config HPLAN_PLUS config HPLAN_PLUS
tristate "HP PCLAN+ (27247B and 27252A) support" tristate "HP PCLAN+ (27247B and 27252A) support"
depends on NET_ISA depends on NET_ISA
...@@ -1092,14 +1089,6 @@ config SEEQ8005 ...@@ -1092,14 +1089,6 @@ config SEEQ8005
<file:Documentation/networking/net-modules.txt>. The module <file:Documentation/networking/net-modules.txt>. The module
will be called seeq8005. will be called seeq8005.
config SK_G16
tristate "SK_G16 support (OBSOLETE)"
depends on NET_ISA && OBSOLETE
help
If you have a network (Ethernet) card of this type, say Y and read
the Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto>.
config SKMC config SKMC
tristate "SKnet MCA support" tristate "SKnet MCA support"
depends on NET_ETHERNET && MCA && BROKEN depends on NET_ETHERNET && MCA && BROKEN
...@@ -1932,6 +1921,18 @@ config R8169_VLAN ...@@ -1932,6 +1921,18 @@ config R8169_VLAN
If in doubt, say Y. If in doubt, say Y.
config SKGE
tristate "New SysKonnect GigaEthernet support (EXPERIMENTAL)"
depends on PCI && EXPERIMENTAL
select CRC32
---help---
This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx
and related Gigabit Ethernet adapters. It is a new smaller driver
driver with better performance and more complete ethtool support.
It does not support the link failover and network management
features that "portable" vendor supplied sk98lin driver does.
config SK98LIN config SK98LIN
tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support" tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
depends on PCI depends on PCI
......
...@@ -53,6 +53,7 @@ obj-$(CONFIG_FEALNX) += fealnx.o ...@@ -53,6 +53,7 @@ obj-$(CONFIG_FEALNX) += fealnx.o
obj-$(CONFIG_TIGON3) += tg3.o obj-$(CONFIG_TIGON3) += tg3.o
obj-$(CONFIG_BNX2) += bnx2.o obj-$(CONFIG_BNX2) += bnx2.o
obj-$(CONFIG_TC35815) += tc35815.o obj-$(CONFIG_TC35815) += tc35815.o
obj-$(CONFIG_SKGE) += skge.o
obj-$(CONFIG_SK98LIN) += sk98lin/ obj-$(CONFIG_SK98LIN) += sk98lin/
obj-$(CONFIG_SKFP) += skfp/ obj-$(CONFIG_SKFP) += skfp/
obj-$(CONFIG_VIA_RHINE) += via-rhine.o obj-$(CONFIG_VIA_RHINE) += via-rhine.o
...@@ -74,7 +75,6 @@ obj-$(CONFIG_MAC8390) += mac8390.o 8390.o ...@@ -74,7 +75,6 @@ obj-$(CONFIG_MAC8390) += mac8390.o 8390.o
obj-$(CONFIG_APNE) += apne.o 8390.o obj-$(CONFIG_APNE) += apne.o 8390.o
obj-$(CONFIG_PCMCIA_PCNET) += 8390.o obj-$(CONFIG_PCMCIA_PCNET) += 8390.o
obj-$(CONFIG_SHAPER) += shaper.o obj-$(CONFIG_SHAPER) += shaper.o
obj-$(CONFIG_SK_G16) += sk_g16.o
obj-$(CONFIG_HP100) += hp100.o obj-$(CONFIG_HP100) += hp100.o
obj-$(CONFIG_SMC9194) += smc9194.o obj-$(CONFIG_SMC9194) += smc9194.o
obj-$(CONFIG_FEC) += fec.o obj-$(CONFIG_FEC) += fec.o
...@@ -122,7 +122,6 @@ obj-$(CONFIG_DEFXX) += defxx.o ...@@ -122,7 +122,6 @@ obj-$(CONFIG_DEFXX) += defxx.o
obj-$(CONFIG_SGISEEQ) += sgiseeq.o obj-$(CONFIG_SGISEEQ) += sgiseeq.o
obj-$(CONFIG_SGI_O2MACE_ETH) += meth.o obj-$(CONFIG_SGI_O2MACE_ETH) += meth.o
obj-$(CONFIG_AT1700) += at1700.o obj-$(CONFIG_AT1700) += at1700.o
obj-$(CONFIG_FMV18X) += fmv18x.o
obj-$(CONFIG_EL1) += 3c501.o obj-$(CONFIG_EL1) += 3c501.o
obj-$(CONFIG_EL16) += 3c507.o obj-$(CONFIG_EL16) += 3c507.o
obj-$(CONFIG_ELMC) += 3c523.o obj-$(CONFIG_ELMC) += 3c523.o
...@@ -180,6 +179,7 @@ obj-$(CONFIG_AMD8111_ETH) += amd8111e.o ...@@ -180,6 +179,7 @@ obj-$(CONFIG_AMD8111_ETH) += amd8111e.o
obj-$(CONFIG_IBMVETH) += ibmveth.o obj-$(CONFIG_IBMVETH) += ibmveth.o
obj-$(CONFIG_S2IO) += s2io.o obj-$(CONFIG_S2IO) += s2io.o
obj-$(CONFIG_SMC91X) += smc91x.o obj-$(CONFIG_SMC91X) += smc91x.o
obj-$(CONFIG_DM9000) += dm9000.o
obj-$(CONFIG_FEC_8XX) += fec_8xx/ obj-$(CONFIG_FEC_8XX) += fec_8xx/
obj-$(CONFIG_ARM) += arm/ obj-$(CONFIG_ARM) += arm/
......
...@@ -210,9 +210,6 @@ static struct devprobe2 isa_probes[] __initdata = { ...@@ -210,9 +210,6 @@ static struct devprobe2 isa_probes[] __initdata = {
#ifdef CONFIG_AT1700 #ifdef CONFIG_AT1700
{at1700_probe, 0}, {at1700_probe, 0},
#endif #endif
#ifdef CONFIG_FMV18X /* Fujitsu FMV-181/182 */
{fmv18x_probe, 0},
#endif
#ifdef CONFIG_ETH16I #ifdef CONFIG_ETH16I
{eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */ {eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */
#endif #endif
...@@ -243,9 +240,6 @@ static struct devprobe2 isa_probes[] __initdata = { ...@@ -243,9 +240,6 @@ static struct devprobe2 isa_probes[] __initdata = {
#ifdef CONFIG_ELPLUS /* 3c505 */ #ifdef CONFIG_ELPLUS /* 3c505 */
{elplus_probe, 0}, {elplus_probe, 0},
#endif #endif
#ifdef CONFIG_SK_G16
{SK_init, 0},
#endif
#ifdef CONFIG_NI5010 #ifdef CONFIG_NI5010
{ni5010_probe, 0}, {ni5010_probe, 0},
#endif #endif
......
...@@ -68,6 +68,7 @@ struct etherh_priv { ...@@ -68,6 +68,7 @@ struct etherh_priv {
void __iomem *dma_base; void __iomem *dma_base;
unsigned int id; unsigned int id;
void __iomem *ctrl_port; void __iomem *ctrl_port;
void __iomem *base;
unsigned char ctrl; unsigned char ctrl;
u32 supported; u32 supported;
}; };
...@@ -177,7 +178,7 @@ etherh_setif(struct net_device *dev) ...@@ -177,7 +178,7 @@ etherh_setif(struct net_device *dev)
switch (etherh_priv(dev)->id) { switch (etherh_priv(dev)->id) {
case PROD_I3_ETHERLAN600: case PROD_I3_ETHERLAN600:
case PROD_I3_ETHERLAN600A: case PROD_I3_ETHERLAN600A:
addr = (void *)dev->base_addr + EN0_RCNTHI; addr = etherh_priv(dev)->base + EN0_RCNTHI;
switch (dev->if_port) { switch (dev->if_port) {
case IF_PORT_10BASE2: case IF_PORT_10BASE2:
...@@ -218,7 +219,7 @@ etherh_getifstat(struct net_device *dev) ...@@ -218,7 +219,7 @@ etherh_getifstat(struct net_device *dev)
switch (etherh_priv(dev)->id) { switch (etherh_priv(dev)->id) {
case PROD_I3_ETHERLAN600: case PROD_I3_ETHERLAN600:
case PROD_I3_ETHERLAN600A: case PROD_I3_ETHERLAN600A:
addr = (void *)dev->base_addr + EN0_RCNTHI; addr = etherh_priv(dev)->base + EN0_RCNTHI;
switch (dev->if_port) { switch (dev->if_port) {
case IF_PORT_10BASE2: case IF_PORT_10BASE2:
stat = 1; stat = 1;
...@@ -281,7 +282,7 @@ static void ...@@ -281,7 +282,7 @@ static void
etherh_reset(struct net_device *dev) etherh_reset(struct net_device *dev)
{ {
struct ei_device *ei_local = netdev_priv(dev); struct ei_device *ei_local = netdev_priv(dev);
void __iomem *addr = (void *)dev->base_addr; void __iomem *addr = etherh_priv(dev)->base;
writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, addr); writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, addr);
...@@ -327,7 +328,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf ...@@ -327,7 +328,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf
ei_local->dmaing = 1; ei_local->dmaing = 1;
addr = (void *)dev->base_addr; addr = etherh_priv(dev)->base;
dma_base = etherh_priv(dev)->dma_base; dma_base = etherh_priv(dev)->dma_base;
count = (count + 1) & ~1; count = (count + 1) & ~1;
...@@ -387,7 +388,7 @@ etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ...@@ -387,7 +388,7 @@ etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int
ei_local->dmaing = 1; ei_local->dmaing = 1;
addr = (void *)dev->base_addr; addr = etherh_priv(dev)->base;
dma_base = etherh_priv(dev)->dma_base; dma_base = etherh_priv(dev)->dma_base;
buf = skb->data; buf = skb->data;
...@@ -427,7 +428,7 @@ etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_p ...@@ -427,7 +428,7 @@ etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_p
ei_local->dmaing = 1; ei_local->dmaing = 1;
addr = (void *)dev->base_addr; addr = etherh_priv(dev)->base;
dma_base = etherh_priv(dev)->dma_base; dma_base = etherh_priv(dev)->dma_base;
writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD); writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
...@@ -696,7 +697,8 @@ etherh_probe(struct expansion_card *ec, const struct ecard_id *id) ...@@ -696,7 +697,8 @@ etherh_probe(struct expansion_card *ec, const struct ecard_id *id)
eh->ctrl_port = eh->ioc_fast; eh->ctrl_port = eh->ioc_fast;
} }
dev->base_addr = (unsigned long)eh->memc + data->ns8390_offset; eh->base = eh->memc + data->ns8390_offset;
dev->base_addr = (unsigned long)eh->base;
eh->dma_base = eh->memc + data->dataport_offset; eh->dma_base = eh->memc + data->dataport_offset;
eh->ctrl_port += data->ctrlport_offset; eh->ctrl_port += data->ctrlport_offset;
......
...@@ -1681,10 +1681,6 @@ static int au1000_init(struct net_device *dev) ...@@ -1681,10 +1681,6 @@ static int au1000_init(struct net_device *dev)
control |= MAC_FULL_DUPLEX; control |= MAC_FULL_DUPLEX;
} }
/* fix for startup without cable */
if (!link)
dev->flags &= ~IFF_RUNNING;
aup->mac->control = control; aup->mac->control = control;
aup->mac->vlan1_tag = 0x8100; /* activate vlan support */ aup->mac->vlan1_tag = 0x8100; /* activate vlan support */
au_sync(); au_sync();
...@@ -1709,16 +1705,14 @@ static void au1000_timer(unsigned long data) ...@@ -1709,16 +1705,14 @@ static void au1000_timer(unsigned long data)
if_port = dev->if_port; if_port = dev->if_port;
if (aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed) == 0) { if (aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed) == 0) {
if (link) { if (link) {
if (!(dev->flags & IFF_RUNNING)) { if (!netif_carrier_ok(dev)) {
netif_carrier_on(dev); netif_carrier_on(dev);
dev->flags |= IFF_RUNNING;
printk(KERN_INFO "%s: link up\n", dev->name); printk(KERN_INFO "%s: link up\n", dev->name);
} }
} }
else { else {
if (dev->flags & IFF_RUNNING) { if (netif_carrier_ok(dev)) {
netif_carrier_off(dev); netif_carrier_off(dev);
dev->flags &= ~IFF_RUNNING;
dev->if_port = 0; dev->if_port = 0;
printk(KERN_INFO "%s: link down\n", dev->name); printk(KERN_INFO "%s: link down\n", dev->name);
} }
......
...@@ -1412,7 +1412,6 @@ static int bmac_open(struct net_device *dev) ...@@ -1412,7 +1412,6 @@ static int bmac_open(struct net_device *dev)
bp->opened = 1; bp->opened = 1;
bmac_reset_and_enable(dev); bmac_reset_and_enable(dev);
enable_irq(dev->irq); enable_irq(dev->irq);
dev->flags |= IFF_RUNNING;
return 0; return 0;
} }
...@@ -1425,7 +1424,6 @@ static int bmac_close(struct net_device *dev) ...@@ -1425,7 +1424,6 @@ static int bmac_close(struct net_device *dev)
int i; int i;
bp->sleeping = 1; bp->sleeping = 1;
dev->flags &= ~(IFF_UP | IFF_RUNNING);
/* disable rx and tx */ /* disable rx and tx */
config = bmread(dev, RXCFG); config = bmread(dev, RXCFG);
......
This diff is collapsed.
/*
* dm9000 Ethernet
*/
#ifndef _DM9000X_H_
#define _DM9000X_H_
#define DM9000_ID 0x90000A46
/* although the registers are 16 bit, they are 32-bit aligned.
*/
#define DM9000_NCR 0x00
#define DM9000_NSR 0x01
#define DM9000_TCR 0x02
#define DM9000_TSR1 0x03
#define DM9000_TSR2 0x04
#define DM9000_RCR 0x05
#define DM9000_RSR 0x06
#define DM9000_ROCR 0x07
#define DM9000_BPTR 0x08
#define DM9000_FCTR 0x09
#define DM9000_FCR 0x0A
#define DM9000_EPCR 0x0B
#define DM9000_EPAR 0x0C
#define DM9000_EPDRL 0x0D
#define DM9000_EPDRH 0x0E
#define DM9000_WCR 0x0F
#define DM9000_PAR 0x10
#define DM9000_MAR 0x16
#define DM9000_GPCR 0x1e
#define DM9000_GPR 0x1f
#define DM9000_TRPAL 0x22
#define DM9000_TRPAH 0x23
#define DM9000_RWPAL 0x24
#define DM9000_RWPAH 0x25
#define DM9000_VIDL 0x28
#define DM9000_VIDH 0x29
#define DM9000_PIDL 0x2A
#define DM9000_PIDH 0x2B
#define DM9000_CHIPR 0x2C
#define DM9000_SMCR 0x2F
#define DM9000_MRCMDX 0xF0
#define DM9000_MRCMD 0xF2
#define DM9000_MRRL 0xF4
#define DM9000_MRRH 0xF5
#define DM9000_MWCMDX 0xF6
#define DM9000_MWCMD 0xF8
#define DM9000_MWRL 0xFA
#define DM9000_MWRH 0xFB
#define DM9000_TXPLL 0xFC
#define DM9000_TXPLH 0xFD
#define DM9000_ISR 0xFE
#define DM9000_IMR 0xFF
#define NCR_EXT_PHY (1<<7)
#define NCR_WAKEEN (1<<6)
#define NCR_FCOL (1<<4)
#define NCR_FDX (1<<3)
#define NCR_LBK (3<<1)
#define NCR_RST (1<<0)
#define NSR_SPEED (1<<7)
#define NSR_LINKST (1<<6)
#define NSR_WAKEST (1<<5)
#define NSR_TX2END (1<<3)
#define NSR_TX1END (1<<2)
#define NSR_RXOV (1<<1)
#define TCR_TJDIS (1<<6)
#define TCR_EXCECM (1<<5)
#define TCR_PAD_DIS2 (1<<4)
#define TCR_CRC_DIS2 (1<<3)
#define TCR_PAD_DIS1 (1<<2)
#define TCR_CRC_DIS1 (1<<1)
#define TCR_TXREQ (1<<0)
#define TSR_TJTO (1<<7)
#define TSR_LC (1<<6)
#define TSR_NC (1<<5)
#define TSR_LCOL (1<<4)
#define TSR_COL (1<<3)
#define TSR_EC (1<<2)
#define RCR_WTDIS (1<<6)
#define RCR_DIS_LONG (1<<5)
#define RCR_DIS_CRC (1<<4)
#define RCR_ALL (1<<3)
#define RCR_RUNT (1<<2)
#define RCR_PRMSC (1<<1)
#define RCR_RXEN (1<<0)
#define RSR_RF (1<<7)
#define RSR_MF (1<<6)
#define RSR_LCS (1<<5)
#define RSR_RWTO (1<<4)
#define RSR_PLE (1<<3)
#define RSR_AE (1<<2)
#define RSR_CE (1<<1)
#define RSR_FOE (1<<0)
#define FCTR_HWOT(ot) (( ot & 0xf ) << 4 )
#define FCTR_LWOT(ot) ( ot & 0xf )
#define IMR_PAR (1<<7)
#define IMR_ROOM (1<<3)
#define IMR_ROM (1<<2)
#define IMR_PTM (1<<1)
#define IMR_PRM (1<<0)
#define ISR_ROOS (1<<3)
#define ISR_ROS (1<<2)
#define ISR_PTS (1<<1)
#define ISR_PRS (1<<0)
#define ISR_CLR_STATUS (ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS)
#define EPCR_REEP (1<<5)
#define EPCR_WEP (1<<4)
#define EPCR_EPOS (1<<3)
#define EPCR_ERPRR (1<<2)
#define EPCR_ERPRW (1<<1)
#define EPCR_ERRE (1<<0)
#define GPCR_GEP_CNTL (1<<0)
#define DM9000_PKT_RDY 0x01 /* Packet ready to receive */
#define DM9000_PKT_MAX 1536 /* Received packet max size */
#endif /* _DM9000X_H_ */
This diff is collapsed.
...@@ -1537,20 +1537,20 @@ static void shmem_get_8390_hdr(struct net_device *dev, ...@@ -1537,20 +1537,20 @@ static void shmem_get_8390_hdr(struct net_device *dev,
static void shmem_block_input(struct net_device *dev, int count, static void shmem_block_input(struct net_device *dev, int count,
struct sk_buff *skb, int ring_offset) struct sk_buff *skb, int ring_offset)
{ {
void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8) void __iomem *base = ei_status.mem;
+ ring_offset unsigned long offset = (TX_PAGES<<8) + ring_offset
- (ei_status.rx_start_page << 8); - (ei_status.rx_start_page << 8);
char *buf = skb->data; char *buf = skb->data;
if (xfer_start + count > (void __iomem *)ei_status.rmem_end) { if (offset + count > ei_status.priv) {
/* We must wrap the input move. */ /* We must wrap the input move. */
int semi_count = (void __iomem *)ei_status.rmem_end - xfer_start; int semi_count = ei_status.priv - offset;
copyin(buf, xfer_start, semi_count); copyin(buf, base + offset, semi_count);
buf += semi_count; buf += semi_count;
xfer_start = ei_status.mem + (TX_PAGES<<8); offset = TX_PAGES<<8;
count -= semi_count; count -= semi_count;
} }
copyin(buf, xfer_start, count); copyin(buf, base + offset, count);
} }
/*====================================================================*/ /*====================================================================*/
...@@ -1611,8 +1611,9 @@ static int setup_shmem_window(dev_link_t *link, int start_pg, ...@@ -1611,8 +1611,9 @@ static int setup_shmem_window(dev_link_t *link, int start_pg,
} }
ei_status.mem = info->base + offset; ei_status.mem = info->base + offset;
ei_status.priv = req.Size;
dev->mem_start = (u_long)ei_status.mem; dev->mem_start = (u_long)ei_status.mem;
dev->mem_end = ei_status.rmem_end = (u_long)info->base + req.Size; dev->mem_end = dev->mem_start + req.Size;
ei_status.tx_start_page = start_pg; ei_status.tx_start_page = start_pg;
ei_status.rx_start_page = start_pg + TX_PAGES; ei_status.rx_start_page = start_pg + TX_PAGES;
......
...@@ -1217,36 +1217,43 @@ ppp_push(struct ppp *ppp) ...@@ -1217,36 +1217,43 @@ ppp_push(struct ppp *ppp)
*/ */
static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
{ {
int nch, len, fragsize; int len, fragsize;
int i, bits, hdrlen, mtu; int i, bits, hdrlen, mtu;
int flen, fnb; int flen;
int navail, nfree;
int nbigger;
unsigned char *p, *q; unsigned char *p, *q;
struct list_head *list; struct list_head *list;
struct channel *pch; struct channel *pch;
struct sk_buff *frag; struct sk_buff *frag;
struct ppp_channel *chan; struct ppp_channel *chan;
nch = 0; nfree = 0; /* # channels which have no packet already queued */
navail = 0; /* total # of usable channels (not deregistered) */
hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
i = 0;
list = &ppp->channels; list = &ppp->channels;
while ((list = list->next) != &ppp->channels) { while ((list = list->next) != &ppp->channels) {
pch = list_entry(list, struct channel, clist); pch = list_entry(list, struct channel, clist);
nch += pch->avail = (skb_queue_len(&pch->file.xq) == 0); navail += pch->avail = (pch->chan != NULL);
/* if (pch->avail) {
* If a channel hasn't had a fragment yet, it has to get if (skb_queue_len(&pch->file.xq) == 0
* one before we send any fragments on later channels. || !pch->had_frag) {
* If it can't take a fragment now, don't give any pch->avail = 2;
* to subsequent channels. ++nfree;
*/
if (!pch->had_frag && !pch->avail) {
while ((list = list->next) != &ppp->channels) {
pch = list_entry(list, struct channel, clist);
pch->avail = 0;
} }
break; if (!pch->had_frag && i < ppp->nxchan)
ppp->nxchan = i;
} }
++i;
} }
if (nch == 0)
/*
* Don't start sending this packet unless at least half of
* the channels are free. This gives much better TCP
* performance if we have a lot of channels.
*/
if (nfree == 0 || nfree < navail / 2)
return 0; /* can't take now, leave it in xmit_pending */ return 0; /* can't take now, leave it in xmit_pending */
/* Do protocol field compression (XXX this should be optional) */ /* Do protocol field compression (XXX this should be optional) */
...@@ -1257,14 +1264,19 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) ...@@ -1257,14 +1264,19 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
--len; --len;
} }
/* decide on fragment size */ /*
* Decide on fragment size.
* We create a fragment for each free channel regardless of
* how small they are (i.e. even 0 length) in order to minimize
* the time that it will take to detect when a channel drops
* a fragment.
*/
fragsize = len; fragsize = len;
if (nch > 1) { if (nfree > 1)
int maxch = ROUNDUP(len, MIN_FRAG_SIZE); fragsize = ROUNDUP(fragsize, nfree);
if (nch > maxch) /* nbigger channels get fragsize bytes, the rest get fragsize-1,
nch = maxch; except if nbigger==0, then they all get fragsize. */
fragsize = ROUNDUP(fragsize, nch); nbigger = len % nfree;
}
/* skip to the channel after the one we last used /* skip to the channel after the one we last used
and start at that one */ and start at that one */
...@@ -1278,7 +1290,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) ...@@ -1278,7 +1290,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
/* create a fragment for each channel */ /* create a fragment for each channel */
bits = B; bits = B;
do { while (nfree > 0 || len > 0) {
list = list->next; list = list->next;
if (list == &ppp->channels) { if (list == &ppp->channels) {
i = 0; i = 0;
...@@ -1289,61 +1301,92 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) ...@@ -1289,61 +1301,92 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
if (!pch->avail) if (!pch->avail)
continue; continue;
/*
* Skip this channel if it has a fragment pending already and
* we haven't given a fragment to all of the free channels.
*/
if (pch->avail == 1) {
if (nfree > 0)
continue;
} else {
--nfree;
pch->avail = 1;
}
/* check the channel's mtu and whether it is still attached. */ /* check the channel's mtu and whether it is still attached. */
spin_lock_bh(&pch->downl); spin_lock_bh(&pch->downl);
if (pch->chan == 0 || (mtu = pch->chan->mtu) < hdrlen) { if (pch->chan == NULL) {
/* can't use this channel */ /* can't use this channel, it's being deregistered */
spin_unlock_bh(&pch->downl); spin_unlock_bh(&pch->downl);
pch->avail = 0; pch->avail = 0;
if (--nch == 0) if (--navail == 0)
break; break;
continue; continue;
} }
/* /*
* We have to create multiple fragments for this channel * Create a fragment for this channel of
* if fragsize is greater than the channel's mtu. * min(max(mtu+2-hdrlen, 4), fragsize, len) bytes.
* If mtu+2-hdrlen < 4, that is a ridiculously small
* MTU, so we use mtu = 2 + hdrlen.
*/ */
if (fragsize > len) if (fragsize > len)
fragsize = len; fragsize = len;
for (flen = fragsize; flen > 0; flen -= fnb) { flen = fragsize;
fnb = flen; mtu = pch->chan->mtu + 2 - hdrlen;
if (fnb > mtu + 2 - hdrlen) if (mtu < 4)
fnb = mtu + 2 - hdrlen; mtu = 4;
if (fnb >= len) if (flen > mtu)
bits |= E; flen = mtu;
frag = alloc_skb(fnb + hdrlen, GFP_ATOMIC); if (flen == len && nfree == 0)
if (frag == 0) bits |= E;
goto noskb; frag = alloc_skb(flen + hdrlen + (flen == 0), GFP_ATOMIC);
q = skb_put(frag, fnb + hdrlen); if (frag == 0)
/* make the MP header */ goto noskb;
q[0] = PPP_MP >> 8; q = skb_put(frag, flen + hdrlen);
q[1] = PPP_MP;
if (ppp->flags & SC_MP_XSHORTSEQ) { /* make the MP header */
q[2] = bits + ((ppp->nxseq >> 8) & 0xf); q[0] = PPP_MP >> 8;
q[3] = ppp->nxseq; q[1] = PPP_MP;
} else { if (ppp->flags & SC_MP_XSHORTSEQ) {
q[2] = bits; q[2] = bits + ((ppp->nxseq >> 8) & 0xf);
q[3] = ppp->nxseq >> 16; q[3] = ppp->nxseq;
q[4] = ppp->nxseq >> 8; } else {
q[5] = ppp->nxseq; q[2] = bits;
} q[3] = ppp->nxseq >> 16;
q[4] = ppp->nxseq >> 8;
/* copy the data in */ q[5] = ppp->nxseq;
memcpy(q + hdrlen, p, fnb);
/* try to send it down the channel */
chan = pch->chan;
if (!chan->ops->start_xmit(chan, frag))
skb_queue_tail(&pch->file.xq, frag);
pch->had_frag = 1;
p += fnb;
len -= fnb;
++ppp->nxseq;
bits = 0;
} }
/*
* Copy the data in.
* Unfortunately there is a bug in older versions of
* the Linux PPP multilink reconstruction code where it
* drops 0-length fragments. Therefore we make sure the
* fragment has at least one byte of data. Any bytes
* we add in this situation will end up as padding on the
* end of the reconstructed packet.
*/
if (flen == 0)
*skb_put(frag, 1) = 0;
else
memcpy(q + hdrlen, p, flen);
/* try to send it down the channel */
chan = pch->chan;
if (skb_queue_len(&pch->file.xq)
|| !chan->ops->start_xmit(chan, frag))
skb_queue_tail(&pch->file.xq, frag);
pch->had_frag = 1;
p += flen;
len -= flen;
++ppp->nxseq;
bits = 0;
spin_unlock_bh(&pch->downl); spin_unlock_bh(&pch->downl);
} while (len > 0);
if (--nbigger == 0 && fragsize > 0)
--fragsize;
}
ppp->nxchan = i; ppp->nxchan = i;
return 1; return 1;
...@@ -1422,7 +1465,7 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb) ...@@ -1422,7 +1465,7 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb)
kfree_skb(skb); kfree_skb(skb);
return; return;
} }
proto = PPP_PROTO(skb); proto = PPP_PROTO(skb);
read_lock_bh(&pch->upl); read_lock_bh(&pch->upl);
if (pch->ppp == 0 || proto >= 0xc000 || proto == PPP_CCPFRAG) { if (pch->ppp == 0 || proto >= 0xc000 || proto == PPP_CCPFRAG) {
...@@ -1691,7 +1734,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) ...@@ -1691,7 +1734,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
struct list_head *l; struct list_head *l;
int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) if (!pskb_may_pull(skb, mphdrlen) || ppp->mrru == 0)
goto err; /* no good, throw it away */ goto err; /* no good, throw it away */
/* Decode sequence number and begin/end bits */ /* Decode sequence number and begin/end bits */
......
This diff is collapsed.
...@@ -4212,7 +4212,7 @@ SK_BOOL DualNet; ...@@ -4212,7 +4212,7 @@ SK_BOOL DualNet;
Flags); Flags);
SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST); SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING; netif_carrier_off(pAC->dev[Param.Para32[0]]);
spin_unlock_irqrestore( spin_unlock_irqrestore(
&pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
Flags); Flags);
...@@ -4355,7 +4355,7 @@ SK_BOOL DualNet; ...@@ -4355,7 +4355,7 @@ SK_BOOL DualNet;
} }
/* Inform the world that link protocol is up. */ /* Inform the world that link protocol is up. */
pAC->dev[Param.Para32[0]]->flags |= IFF_RUNNING; netif_carrier_on(pAC->dev[Param.Para32[0]]);
break; break;
case SK_DRV_NET_DOWN: /* SK_U32 Reason */ case SK_DRV_NET_DOWN: /* SK_U32 Reason */
...@@ -4368,7 +4368,7 @@ SK_BOOL DualNet; ...@@ -4368,7 +4368,7 @@ SK_BOOL DualNet;
} else { } else {
DoPrintInterfaceChange = SK_TRUE; DoPrintInterfaceChange = SK_TRUE;
} }
pAC->dev[Param.Para32[1]]->flags &= ~IFF_RUNNING; netif_carrier_off(pAC->dev[Param.Para32[1]]);
break; break;
case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */ case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
...@@ -4961,7 +4961,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev, ...@@ -4961,7 +4961,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = &SkGePollController; dev->poll_controller = &SkGePollController;
#endif #endif
dev->flags &= ~IFF_RUNNING;
SET_NETDEV_DEV(dev, &pdev->dev); SET_NETDEV_DEV(dev, &pdev->dev);
SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
...@@ -5035,7 +5034,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev, ...@@ -5035,7 +5034,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
dev->set_mac_address = &SkGeSetMacAddr; dev->set_mac_address = &SkGeSetMacAddr;
dev->do_ioctl = &SkGeIoctl; dev->do_ioctl = &SkGeIoctl;
dev->change_mtu = &SkGeChangeMtu; dev->change_mtu = &SkGeChangeMtu;
dev->flags &= ~IFF_RUNNING;
SET_NETDEV_DEV(dev, &pdev->dev); SET_NETDEV_DEV(dev, &pdev->dev);
SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
......
This diff is collapsed.
/*-
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*
* Module : sk_g16.h
* Version : $Revision$
*
* Author : M.Hipp (mhipp@student.uni-tuebingen.de)
* changes by : Patrick J.D. Weichmann
*
* Date Created : 94/05/25
*
* Description : In here are all necessary definitions of
* the am7990 (LANCE) chip used for writing a
* network device driver which uses this chip
*
* $Log$
-*/
#ifndef SK_G16_H
#define SK_G16_H
/*
* Control and Status Register 0 (CSR0) bit definitions
*
* (R=Readable) (W=Writeable) (S=Set on write) (C-Clear on write)
*
*/
#define CSR0_ERR 0x8000 /* Error summary (R) */
#define CSR0_BABL 0x4000 /* Babble transmitter timeout error (RC) */
#define CSR0_CERR 0x2000 /* Collision Error (RC) */
#define CSR0_MISS 0x1000 /* Missed packet (RC) */
#define CSR0_MERR 0x0800 /* Memory Error (RC) */
#define CSR0_RINT 0x0400 /* Receiver Interrupt (RC) */
#define CSR0_TINT 0x0200 /* Transmit Interrupt (RC) */
#define CSR0_IDON 0x0100 /* Initialization Done (RC) */
#define CSR0_INTR 0x0080 /* Interrupt Flag (R) */
#define CSR0_INEA 0x0040 /* Interrupt Enable (RW) */
#define CSR0_RXON 0x0020 /* Receiver on (R) */
#define CSR0_TXON 0x0010 /* Transmitter on (R) */
#define CSR0_TDMD 0x0008 /* Transmit Demand (RS) */
#define CSR0_STOP 0x0004 /* Stop (RS) */
#define CSR0_STRT 0x0002 /* Start (RS) */
#define CSR0_INIT 0x0001 /* Initialize (RS) */
#define CSR0_CLRALL 0x7f00 /* mask for all clearable bits */
/*
* Control and Status Register 3 (CSR3) bit definitions
*
*/
#define CSR3_BSWAP 0x0004 /* Byte Swap (RW) */
#define CSR3_ACON 0x0002 /* ALE Control (RW) */
#define CSR3_BCON 0x0001 /* Byte Control (RW) */
/*
* Initialization Block Mode operation Bit Definitions.
*/
#define MODE_PROM 0x8000 /* Promiscuous Mode */
#define MODE_INTL 0x0040 /* Internal Loopback */
#define MODE_DRTY 0x0020 /* Disable Retry */
#define MODE_COLL 0x0010 /* Force Collision */
#define MODE_DTCR 0x0008 /* Disable Transmit CRC) */
#define MODE_LOOP 0x0004 /* Loopback */
#define MODE_DTX 0x0002 /* Disable the Transmitter */
#define MODE_DRX 0x0001 /* Disable the Receiver */
#define MODE_NORMAL 0x0000 /* Normal operation mode */
/*
* Receive message descriptor status bit definitions.
*/
#define RX_OWN 0x80 /* Owner bit 0 = host, 1 = lance */
#define RX_ERR 0x40 /* Error Summary */
#define RX_FRAM 0x20 /* Framing Error */
#define RX_OFLO 0x10 /* Overflow Error */
#define RX_CRC 0x08 /* CRC Error */
#define RX_BUFF 0x04 /* Buffer Error */
#define RX_STP 0x02 /* Start of Packet */
#define RX_ENP 0x01 /* End of Packet */
/*
* Transmit message descriptor status bit definitions.
*/
#define TX_OWN 0x80 /* Owner bit 0 = host, 1 = lance */
#define TX_ERR 0x40 /* Error Summary */
#define TX_MORE 0x10 /* More the 1 retry needed to Xmit */
#define TX_ONE 0x08 /* One retry needed to Xmit */
#define TX_DEF 0x04 /* Deferred */
#define TX_STP 0x02 /* Start of Packet */
#define TX_ENP 0x01 /* End of Packet */
/*
* Transmit status (2) (valid if TX_ERR == 1)
*/
#define TX_BUFF 0x8000 /* Buffering error (no ENP) */
#define TX_UFLO 0x4000 /* Underflow (late memory) */
#define TX_LCOL 0x1000 /* Late collision */
#define TX_LCAR 0x0400 /* Loss of Carrier */
#define TX_RTRY 0x0200 /* Failed after 16 retransmissions */
#define TX_TDR 0x003f /* Time-domain-reflectometer-value */
/*
* Structures used for Communication with the LANCE
*/
/* LANCE Initialize Block */
struct init_block
{
unsigned short mode; /* Mode Register */
unsigned char paddr[6]; /* Physical Address (MAC) */
unsigned char laddr[8]; /* Logical Filter Address (not used) */
unsigned int rdrp; /* Receive Descriptor Ring pointer */
unsigned int tdrp; /* Transmit Descriptor Ring pointer */
};
/* Receive Message Descriptor Entry */
struct rmd
{
union
{
unsigned long buffer; /* Address of buffer */
struct
{
unsigned char unused[3];
unsigned volatile char status; /* Status Bits */
} s;
} u;
volatile short blen; /* Buffer Length (two's complement) */
unsigned short mlen; /* Message Byte Count */
};
/* Transmit Message Descriptor Entry */
struct tmd
{
union
{
unsigned long buffer; /* Address of buffer */
struct
{
unsigned char unused[3];
unsigned volatile char status; /* Status Bits */
} s;
} u;
unsigned short blen; /* Buffer Length (two's complement) */
unsigned volatile short status2; /* Error Status Bits */
};
#endif /* End of SK_G16_H */
This diff is collapsed.
This diff is collapsed.
...@@ -129,7 +129,7 @@ MODULE_PARM_DESC(nowait, "set to 1 for no wait state"); ...@@ -129,7 +129,7 @@ MODULE_PARM_DESC(nowait, "set to 1 for no wait state");
/* /*
* Transmit timeout, default 5 seconds. * Transmit timeout, default 5 seconds.
*/ */
static int watchdog = 5000; static int watchdog = 1000;
module_param(watchdog, int, 0400); module_param(watchdog, int, 0400);
MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds"); MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
...@@ -660,15 +660,14 @@ static void smc_hardware_send_pkt(unsigned long data) ...@@ -660,15 +660,14 @@ static void smc_hardware_send_pkt(unsigned long data)
SMC_outw(((len & 1) ? (0x2000 | buf[len-1]) : 0), ioaddr, DATA_REG); SMC_outw(((len & 1) ? (0x2000 | buf[len-1]) : 0), ioaddr, DATA_REG);
/* /*
* If THROTTLE_TX_PKTS is set, we look at the TX_EMPTY flag * If THROTTLE_TX_PKTS is set, we stop the queue here. This will
* before queueing this packet for TX, and if it's clear then * have the effect of having at most one packet queued for TX
* we stop the queue here. This will have the effect of * in the chip's memory at all time.
* having at most 2 packets queued for TX in the chip's memory *
* at all time. If THROTTLE_TX_PKTS is not set then the queue * If THROTTLE_TX_PKTS is not set then the queue is stopped only
* is stopped only when memory allocation (MC_ALLOC) does not * when memory allocation (MC_ALLOC) does not succeed right away.
* succeed right away.
*/ */
if (THROTTLE_TX_PKTS && !(SMC_GET_INT() & IM_TX_EMPTY_INT)) if (THROTTLE_TX_PKTS)
netif_stop_queue(dev); netif_stop_queue(dev);
/* queue the packet for TX */ /* queue the packet for TX */
...@@ -792,17 +791,20 @@ static void smc_tx(struct net_device *dev) ...@@ -792,17 +791,20 @@ static void smc_tx(struct net_device *dev)
DBG(2, "%s: TX STATUS 0x%04x PNR 0x%02x\n", DBG(2, "%s: TX STATUS 0x%04x PNR 0x%02x\n",
dev->name, tx_status, packet_no); dev->name, tx_status, packet_no);
if (!(tx_status & TS_SUCCESS)) if (!(tx_status & ES_TX_SUC))
lp->stats.tx_errors++; lp->stats.tx_errors++;
if (tx_status & TS_LOSTCAR)
if (tx_status & ES_LOSTCARR)
lp->stats.tx_carrier_errors++; lp->stats.tx_carrier_errors++;
if (tx_status & TS_LATCOL) { if (tx_status & (ES_LATCOL | ES_16COL)) {
PRINTK("%s: late collision occurred on last xmit\n", dev->name); PRINTK("%s: %s occurred on last xmit\n", dev->name,
(tx_status & ES_LATCOL) ?
"late collision" : "too many collisions");
lp->stats.tx_window_errors++; lp->stats.tx_window_errors++;
if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) { if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) {
printk(KERN_INFO "%s: unexpectedly large numbers of " printk(KERN_INFO "%s: unexpectedly large number of "
"late collisions. Please check duplex " "bad collisions. Please check duplex "
"setting.\n", dev->name); "setting.\n", dev->name);
} }
} }
...@@ -1236,7 +1238,7 @@ static void smc_10bt_check_media(struct net_device *dev, int init) ...@@ -1236,7 +1238,7 @@ static void smc_10bt_check_media(struct net_device *dev, int init)
old_carrier = netif_carrier_ok(dev) ? 1 : 0; old_carrier = netif_carrier_ok(dev) ? 1 : 0;
SMC_SELECT_BANK(0); SMC_SELECT_BANK(0);
new_carrier = SMC_inw(ioaddr, EPH_STATUS_REG) & ES_LINK_OK ? 1 : 0; new_carrier = (SMC_GET_EPH_STATUS() & ES_LINK_OK) ? 1 : 0;
SMC_SELECT_BANK(2); SMC_SELECT_BANK(2);
if (init || (old_carrier != new_carrier)) { if (init || (old_carrier != new_carrier)) {
...@@ -1308,15 +1310,16 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1308,15 +1310,16 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (!status) if (!status)
break; break;
if (status & IM_RCV_INT) { if (status & IM_TX_INT) {
DBG(3, "%s: RX irq\n", dev->name); /* do this before RX as it will free memory quickly */
smc_rcv(dev);
} else if (status & IM_TX_INT) {
DBG(3, "%s: TX int\n", dev->name); DBG(3, "%s: TX int\n", dev->name);
smc_tx(dev); smc_tx(dev);
SMC_ACK_INT(IM_TX_INT); SMC_ACK_INT(IM_TX_INT);
if (THROTTLE_TX_PKTS) if (THROTTLE_TX_PKTS)
netif_wake_queue(dev); netif_wake_queue(dev);
} else if (status & IM_RCV_INT) {
DBG(3, "%s: RX irq\n", dev->name);
smc_rcv(dev);
} else if (status & IM_ALLOC_INT) { } else if (status & IM_ALLOC_INT) {
DBG(3, "%s: Allocation irq\n", dev->name); DBG(3, "%s: Allocation irq\n", dev->name);
tasklet_hi_schedule(&lp->tx_task); tasklet_hi_schedule(&lp->tx_task);
...@@ -1337,7 +1340,10 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1337,7 +1340,10 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
/* multiple collisions */ /* multiple collisions */
lp->stats.collisions += card_stats & 0xF; lp->stats.collisions += card_stats & 0xF;
} else if (status & IM_RX_OVRN_INT) { } else if (status & IM_RX_OVRN_INT) {
DBG(1, "%s: RX overrun\n", dev->name); DBG(1, "%s: RX overrun (EPH_ST 0x%04x)\n", dev->name,
({ int eph_st; SMC_SELECT_BANK(0);
eph_st = SMC_GET_EPH_STATUS();
SMC_SELECT_BANK(2); eph_st; }) );
SMC_ACK_INT(IM_RX_OVRN_INT); SMC_ACK_INT(IM_RX_OVRN_INT);
lp->stats.rx_errors++; lp->stats.rx_errors++;
lp->stats.rx_fifo_errors++; lp->stats.rx_fifo_errors++;
...@@ -1389,7 +1395,7 @@ static void smc_timeout(struct net_device *dev) ...@@ -1389,7 +1395,7 @@ static void smc_timeout(struct net_device *dev)
{ {
struct smc_local *lp = netdev_priv(dev); struct smc_local *lp = netdev_priv(dev);
void __iomem *ioaddr = lp->base; void __iomem *ioaddr = lp->base;
int status, mask, meminfo, fifo; int status, mask, eph_st, meminfo, fifo;
DBG(2, "%s: %s\n", dev->name, __FUNCTION__); DBG(2, "%s: %s\n", dev->name, __FUNCTION__);
...@@ -1398,11 +1404,13 @@ static void smc_timeout(struct net_device *dev) ...@@ -1398,11 +1404,13 @@ static void smc_timeout(struct net_device *dev)
mask = SMC_GET_INT_MASK(); mask = SMC_GET_INT_MASK();
fifo = SMC_GET_FIFO(); fifo = SMC_GET_FIFO();
SMC_SELECT_BANK(0); SMC_SELECT_BANK(0);
eph_st = SMC_GET_EPH_STATUS();
meminfo = SMC_GET_MIR(); meminfo = SMC_GET_MIR();
SMC_SELECT_BANK(2); SMC_SELECT_BANK(2);
spin_unlock_irq(&lp->lock); spin_unlock_irq(&lp->lock);
PRINTK( "%s: INT 0x%02x MASK 0x%02x MEM 0x%04x FIFO 0x%04x\n", PRINTK( "%s: TX timeout (INT 0x%02x INTMASK 0x%02x "
dev->name, status, mask, meminfo, fifo ); "MEM 0x%04x FIFO 0x%04x EPH_ST 0x%04x)\n",
dev->name, status, mask, meminfo, fifo, eph_st );
smc_reset(dev); smc_reset(dev);
smc_enable(dev); smc_enable(dev);
...@@ -1863,7 +1871,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr) ...@@ -1863,7 +1871,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
SMC_SELECT_BANK(1); SMC_SELECT_BANK(1);
val = SMC_GET_BASE(); val = SMC_GET_BASE();
val = ((val & 0x1F00) >> 3) << SMC_IO_SHIFT; val = ((val & 0x1F00) >> 3) << SMC_IO_SHIFT;
if (((unsigned long)ioaddr & ((PAGE_SIZE-1)<<SMC_IO_SHIFT)) != val) { /*XXX: WTF? */ if (((unsigned int)ioaddr & (0x3e0 << SMC_IO_SHIFT)) != val) {
printk("%s: IOADDR %p doesn't match configuration (%x).\n", printk("%s: IOADDR %p doesn't match configuration (%x).\n",
CARDNAME, ioaddr, val); CARDNAME, ioaddr, val);
} }
......
...@@ -151,7 +151,7 @@ ...@@ -151,7 +151,7 @@
/* We actually can't write halfwords properly if not word aligned */ /* We actually can't write halfwords properly if not word aligned */
static inline void static inline void
SMC_outw(u16 val, unsigned long ioaddr, int reg) SMC_outw(u16 val, void __iomem *ioaddr, int reg)
{ {
if (reg & 2) { if (reg & 2) {
unsigned int v = val << 16; unsigned int v = val << 16;
...@@ -317,7 +317,7 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) ...@@ -317,7 +317,7 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l)
#define SMC_insl(a, r, p, l) \ #define SMC_insl(a, r, p, l) \
smc_pxa_dma_insl(a, lp->physaddr, r, dev->dma, p, l) smc_pxa_dma_insl(a, lp->physaddr, r, dev->dma, p, l)
static inline void static inline void
smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma, smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma,
u_char *buf, int len) u_char *buf, int len)
{ {
dma_addr_t dmabuf; dma_addr_t dmabuf;
...@@ -355,7 +355,7 @@ smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma, ...@@ -355,7 +355,7 @@ smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma,
#define SMC_insw(a, r, p, l) \ #define SMC_insw(a, r, p, l) \
smc_pxa_dma_insw(a, lp->physaddr, r, dev->dma, p, l) smc_pxa_dma_insw(a, lp->physaddr, r, dev->dma, p, l)
static inline void static inline void
smc_pxa_dma_insw(u_long ioaddr, u_long physaddr, int reg, int dma, smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma,
u_char *buf, int len) u_char *buf, int len)
{ {
dma_addr_t dmabuf; dma_addr_t dmabuf;
...@@ -680,14 +680,6 @@ static const char * chip_ids[ 16 ] = { ...@@ -680,14 +680,6 @@ static const char * chip_ids[ 16 ] = {
NULL, NULL, NULL}; NULL, NULL, NULL};
/*
. Transmit status bits
*/
#define TS_SUCCESS 0x0001
#define TS_LOSTCAR 0x0400
#define TS_LATCOL 0x0200
#define TS_16COL 0x0010
/* /*
. Receive status bits . Receive status bits
*/ */
...@@ -845,6 +837,7 @@ static const char * chip_ids[ 16 ] = { ...@@ -845,6 +837,7 @@ static const char * chip_ids[ 16 ] = {
#define SMC_GET_FIFO() SMC_inw( ioaddr, FIFO_REG ) #define SMC_GET_FIFO() SMC_inw( ioaddr, FIFO_REG )
#define SMC_GET_PTR() SMC_inw( ioaddr, PTR_REG ) #define SMC_GET_PTR() SMC_inw( ioaddr, PTR_REG )
#define SMC_SET_PTR(x) SMC_outw( x, ioaddr, PTR_REG ) #define SMC_SET_PTR(x) SMC_outw( x, ioaddr, PTR_REG )
#define SMC_GET_EPH_STATUS() SMC_inw( ioaddr, EPH_STATUS_REG )
#define SMC_GET_RCR() SMC_inw( ioaddr, RCR_REG ) #define SMC_GET_RCR() SMC_inw( ioaddr, RCR_REG )
#define SMC_SET_RCR(x) SMC_outw( x, ioaddr, RCR_REG ) #define SMC_SET_RCR(x) SMC_outw( x, ioaddr, RCR_REG )
#define SMC_GET_REV() SMC_inw( ioaddr, REV_REG ) #define SMC_GET_REV() SMC_inw( ioaddr, REV_REG )
......
This diff is collapsed.
This diff is collapsed.
...@@ -2819,7 +2819,7 @@ void TLan_PhyMonitor( struct net_device *dev ) ...@@ -2819,7 +2819,7 @@ void TLan_PhyMonitor( struct net_device *dev )
if (priv->link) { if (priv->link) {
priv->link = 0; priv->link = 0;
printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name); printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name);
dev->flags &= ~IFF_RUNNING; netif_carrier_off(dev);
TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT ); TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
return; return;
} }
...@@ -2829,7 +2829,7 @@ void TLan_PhyMonitor( struct net_device *dev ) ...@@ -2829,7 +2829,7 @@ void TLan_PhyMonitor( struct net_device *dev )
if ((phy_status & MII_GS_LINK) && !priv->link) { if ((phy_status & MII_GS_LINK) && !priv->link) {
priv->link = 1; priv->link = 1;
printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name); printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name);
dev->flags |= IFF_RUNNING; netif_carrier_on(dev);
} }
/* Setup a new monitor */ /* Setup a new monitor */
......
...@@ -888,11 +888,6 @@ static int tok_open(struct net_device *dev) ...@@ -888,11 +888,6 @@ static int tok_open(struct net_device *dev)
ti->sap_status = CLOSED; /* CLOSED or OPEN */ ti->sap_status = CLOSED; /* CLOSED or OPEN */
ti->open_failure = NO; /* NO or YES */ ti->open_failure = NO; /* NO or YES */
ti->open_mode = MANUAL; /* MANUAL or AUTOMATIC */ ti->open_mode = MANUAL; /* MANUAL or AUTOMATIC */
/* 12/2000 not typical Linux, but we can use RUNNING to let us know when
the network has crapped out or cables are disconnected. Useful because
the IFF_UP flag stays up the whole time, until ifconfig tr0 down.
*/
dev->flags &= ~IFF_RUNNING;
ti->sram_phys &= ~1; /* to reverse what we do in tok_close */ ti->sram_phys &= ~1; /* to reverse what we do in tok_close */
/* init the spinlock */ /* init the spinlock */
...@@ -1242,7 +1237,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1242,7 +1237,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
ti->open_status = CLOSED; ti->open_status = CLOSED;
ti->sap_status = CLOSED; ti->sap_status = CLOSED;
ti->open_mode = AUTOMATIC; ti->open_mode = AUTOMATIC;
dev->flags &= ~IFF_RUNNING; netif_carrier_off(dev);
netif_stop_queue(dev); netif_stop_queue(dev);
ti->open_action = RESTART; ti->open_action = RESTART;
outb(0, dev->base_addr + ADAPTRESET); outb(0, dev->base_addr + ADAPTRESET);
...@@ -1323,7 +1318,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1323,7 +1318,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
break; break;
} }
netif_wake_queue(dev); netif_wake_queue(dev);
dev->flags |= IFF_RUNNING;/*BMS 12/2000*/ netif_carrier_on(dev);
break; break;
case DIR_INTERRUPT: case DIR_INTERRUPT:
case DIR_MOD_OPEN_PARAMS: case DIR_MOD_OPEN_PARAMS:
...@@ -1427,7 +1422,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1427,7 +1422,7 @@ irqreturn_t tok_interrupt(int irq, void *dev_id, struct pt_regs *regs)
ring_status); ring_status);
if(ring_status& (REMOVE_RECV|AUTO_REMOVAL|LOBE_FAULT)){ if(ring_status& (REMOVE_RECV|AUTO_REMOVAL|LOBE_FAULT)){
netif_stop_queue(dev); netif_stop_queue(dev);
dev->flags &= ~IFF_RUNNING;/*not typical Linux*/ netif_carrier_off(dev);
DPRINTK("Remove received, or Auto-removal error" DPRINTK("Remove received, or Auto-removal error"
", or Lobe fault\n"); ", or Lobe fault\n");
DPRINTK("We'll try to reopen the closed adapter" DPRINTK("We'll try to reopen the closed adapter"
......
This diff is collapsed.
/* /*
* Generic HDLC support routines for Linux * Generic HDLC support routines for Linux
* *
* Copyright (C) 1999 - 2003 Krzysztof Halasa <khc@pm.waw.pl> * Copyright (C) 1999 - 2005 Krzysztof Halasa <khc@pm.waw.pl>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License * under the terms of version 2 of the GNU General Public License
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include <linux/hdlc.h> #include <linux/hdlc.h>
static const char* version = "HDLC support module revision 1.17"; static const char* version = "HDLC support module revision 1.18";
#undef DEBUG_LINK #undef DEBUG_LINK
...@@ -126,10 +126,13 @@ void hdlc_set_carrier(int on, struct net_device *dev) ...@@ -126,10 +126,13 @@ void hdlc_set_carrier(int on, struct net_device *dev)
if (!hdlc->open) if (!hdlc->open)
goto carrier_exit; goto carrier_exit;
if (hdlc->carrier) if (hdlc->carrier) {
printk(KERN_INFO "%s: Carrier detected\n", dev->name);
__hdlc_set_carrier_on(dev); __hdlc_set_carrier_on(dev);
else } else {
printk(KERN_INFO "%s: Carrier lost\n", dev->name);
__hdlc_set_carrier_off(dev); __hdlc_set_carrier_off(dev);
}
carrier_exit: carrier_exit:
spin_unlock_irqrestore(&hdlc->state_lock, flags); spin_unlock_irqrestore(&hdlc->state_lock, flags);
...@@ -157,8 +160,11 @@ int hdlc_open(struct net_device *dev) ...@@ -157,8 +160,11 @@ int hdlc_open(struct net_device *dev)
spin_lock_irq(&hdlc->state_lock); spin_lock_irq(&hdlc->state_lock);
if (hdlc->carrier) if (hdlc->carrier) {
printk(KERN_INFO "%s: Carrier detected\n", dev->name);
__hdlc_set_carrier_on(dev); __hdlc_set_carrier_on(dev);
} else
printk(KERN_INFO "%s: No carrier\n", dev->name);
hdlc->open = 1; hdlc->open = 1;
......
...@@ -723,7 +723,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/ ...@@ -723,7 +723,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/
/* lmc_reset (sc); Why reset??? The link can go down ok */ /* lmc_reset (sc); Why reset??? The link can go down ok */
/* Inform the world that link has been lost */ /* Inform the world that link has been lost */
dev->flags &= ~IFF_RUNNING; netif_carrier_off(dev);
} }
/* /*
...@@ -736,7 +736,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/ ...@@ -736,7 +736,7 @@ static void lmc_watchdog (unsigned long data) /*fold00*/
/* lmc_reset (sc); Again why reset??? */ /* lmc_reset (sc); Again why reset??? */
/* Inform the world that link protocol is back up. */ /* Inform the world that link protocol is back up. */
dev->flags |= IFF_RUNNING; netif_carrier_on(dev);
/* Now we have to tell the syncppp that we had an outage /* Now we have to tell the syncppp that we had an outage
* and that it should deal. Calling sppp_reopen here * and that it should deal. Calling sppp_reopen here
...@@ -1168,8 +1168,6 @@ static void lmc_running_reset (struct net_device *dev) /*fold00*/ ...@@ -1168,8 +1168,6 @@ static void lmc_running_reset (struct net_device *dev) /*fold00*/
sc->lmc_media->set_link_status (sc, 1); sc->lmc_media->set_link_status (sc, 1);
sc->lmc_media->set_status (sc, NULL); sc->lmc_media->set_status (sc, NULL);
//dev->flags |= IFF_RUNNING;
netif_wake_queue(dev); netif_wake_queue(dev);
sc->lmc_txfull = 0; sc->lmc_txfull = 0;
...@@ -1233,8 +1231,6 @@ static int lmc_ifdown (struct net_device *dev) /*fold00*/ ...@@ -1233,8 +1231,6 @@ static int lmc_ifdown (struct net_device *dev) /*fold00*/
csr6 &= ~LMC_DEC_SR; /* Turn off the Receive bit */ csr6 &= ~LMC_DEC_SR; /* Turn off the Receive bit */
LMC_CSR_WRITE (sc, csr_command, csr6); LMC_CSR_WRITE (sc, csr_command, csr6);
dev->flags &= ~IFF_RUNNING;
sc->stats.rx_missed_errors += sc->stats.rx_missed_errors +=
LMC_CSR_READ (sc, csr_missed_frames) & 0xffff; LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;
......
This diff is collapsed.
...@@ -119,7 +119,6 @@ extern struct net_device *alloc_orinocodev(int sizeof_card, ...@@ -119,7 +119,6 @@ extern struct net_device *alloc_orinocodev(int sizeof_card,
extern void free_orinocodev(struct net_device *dev); extern void free_orinocodev(struct net_device *dev);
extern int __orinoco_up(struct net_device *dev); extern int __orinoco_up(struct net_device *dev);
extern int __orinoco_down(struct net_device *dev); extern int __orinoco_down(struct net_device *dev);
extern int orinoco_stop(struct net_device *dev);
extern int orinoco_reinit_firmware(struct net_device *dev); extern int orinoco_reinit_firmware(struct net_device *dev);
extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs); extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs);
......
/* include/linux/dm9000.h
*
* Copyright (c) 2004 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* Header file for dm9000 platform data
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#ifndef __DM9000_PLATFORM_DATA
#define __DM9000_PLATFORM_DATA __FILE__
/* IO control flags */
#define DM9000_PLATF_8BITONLY (0x0001)
#define DM9000_PLATF_16BITONLY (0x0002)
#define DM9000_PLATF_32BITONLY (0x0004)
/* platfrom data for platfrom device structure's platfrom_data field */
struct dm9000_plat_data {
unsigned int flags;
/* allow replacement IO routines */
void (*inblk)(void __iomem *reg, void *data, int len);
void (*outblk)(void __iomem *reg, void *data, int len);
void (*dumpblk)(void __iomem *reg, int len);
};
#endif /* __DM9000_PLATFORM_DATA */
/* /*
* Generic HDLC support routines for Linux * Generic HDLC support routines for Linux
* *
* Copyright (C) 1999-2003 Krzysztof Halasa <khc@pm.waw.pl> * Copyright (C) 1999-2005 Krzysztof Halasa <khc@pm.waw.pl>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License * under the terms of version 2 of the GNU General Public License
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#define LMI_NONE 1 /* No LMI, all PVCs are static */ #define LMI_NONE 1 /* No LMI, all PVCs are static */
#define LMI_ANSI 2 /* ANSI Annex D */ #define LMI_ANSI 2 /* ANSI Annex D */
#define LMI_CCITT 3 /* ITU-T Annex A */ #define LMI_CCITT 3 /* ITU-T Annex A */
#define LMI_CISCO 4 /* The "original" LMI, aka Gang of Four */
#define HDLC_MAX_MTU 1500 /* Ethernet 1500 bytes */ #define HDLC_MAX_MTU 1500 /* Ethernet 1500 bytes */
#define HDLC_MAX_MRU (HDLC_MAX_MTU + 10 + 14 + 4) /* for ETH+VLAN over FR */ #define HDLC_MAX_MRU (HDLC_MAX_MTU + 10 + 14 + 4) /* for ETH+VLAN over FR */
...@@ -89,6 +90,7 @@ typedef struct pvc_device_struct { ...@@ -89,6 +90,7 @@ typedef struct pvc_device_struct {
unsigned int deleted: 1; unsigned int deleted: 1;
unsigned int fecn: 1; unsigned int fecn: 1;
unsigned int becn: 1; unsigned int becn: 1;
unsigned int bandwidth; /* Cisco LMI reporting only */
}state; }state;
}pvc_device; }pvc_device;
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#define IFF_LOOPBACK 0x8 /* is a loopback net */ #define IFF_LOOPBACK 0x8 /* is a loopback net */
#define IFF_POINTOPOINT 0x10 /* interface is has p-p link */ #define IFF_POINTOPOINT 0x10 /* interface is has p-p link */
#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
#define IFF_RUNNING 0x40 /* resources allocated */ #define IFF_RUNNING 0x40 /* interface running and carrier ok */
#define IFF_NOARP 0x80 /* no ARP protocol */ #define IFF_NOARP 0x80 /* no ARP protocol */
#define IFF_PROMISC 0x100 /* receive all packets */ #define IFF_PROMISC 0x100 /* receive all packets */
#define IFF_ALLMULTI 0x200 /* receive all multicast packets*/ #define IFF_ALLMULTI 0x200 /* receive all multicast packets*/
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* This file implement the Wireless Extensions APIs. * This file implement the Wireless Extensions APIs.
* *
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com> * Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
* Copyright (c) 1997-2004 Jean Tourrilhes, All Rights Reserved. * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
* *
* (As all part of the Linux kernel, this file is GPL) * (As all part of the Linux kernel, this file is GPL)
*/ */
...@@ -187,6 +187,12 @@ static const struct iw_ioctl_description standard_ioctl[] = { ...@@ -187,6 +187,12 @@ static const struct iw_ioctl_description standard_ioctl[] = {
.header_type = IW_HEADER_TYPE_ADDR, .header_type = IW_HEADER_TYPE_ADDR,
.flags = IW_DESCR_FLAG_DUMP, .flags = IW_DESCR_FLAG_DUMP,
}, },
[SIOCSIWMLME - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.min_tokens = sizeof(struct iw_mlme),
.max_tokens = sizeof(struct iw_mlme),
},
[SIOCGIWAPLIST - SIOCIWFIRST] = { [SIOCGIWAPLIST - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT, .header_type = IW_HEADER_TYPE_POINT,
.token_size = sizeof(struct sockaddr) + .token_size = sizeof(struct sockaddr) +
...@@ -195,7 +201,10 @@ static const struct iw_ioctl_description standard_ioctl[] = { ...@@ -195,7 +201,10 @@ static const struct iw_ioctl_description standard_ioctl[] = {
.flags = IW_DESCR_FLAG_NOMAX, .flags = IW_DESCR_FLAG_NOMAX,
}, },
[SIOCSIWSCAN - SIOCIWFIRST] = { [SIOCSIWSCAN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM, .header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.min_tokens = 0,
.max_tokens = sizeof(struct iw_scan_req),
}, },
[SIOCGIWSCAN - SIOCIWFIRST] = { [SIOCGIWSCAN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT, .header_type = IW_HEADER_TYPE_POINT,
...@@ -273,6 +282,42 @@ static const struct iw_ioctl_description standard_ioctl[] = { ...@@ -273,6 +282,42 @@ static const struct iw_ioctl_description standard_ioctl[] = {
[SIOCGIWPOWER - SIOCIWFIRST] = { [SIOCGIWPOWER - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM, .header_type = IW_HEADER_TYPE_PARAM,
}, },
[SIOCSIWGENIE - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[SIOCGIWGENIE - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[SIOCSIWAUTH - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM,
},
[SIOCGIWAUTH - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM,
},
[SIOCSIWENCODEEXT - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.min_tokens = sizeof(struct iw_encode_ext),
.max_tokens = sizeof(struct iw_encode_ext) +
IW_ENCODING_TOKEN_MAX,
},
[SIOCGIWENCODEEXT - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.min_tokens = sizeof(struct iw_encode_ext),
.max_tokens = sizeof(struct iw_encode_ext) +
IW_ENCODING_TOKEN_MAX,
},
[SIOCSIWPMKSA - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.min_tokens = sizeof(struct iw_pmksa),
.max_tokens = sizeof(struct iw_pmksa),
},
}; };
static const int standard_ioctl_num = (sizeof(standard_ioctl) / static const int standard_ioctl_num = (sizeof(standard_ioctl) /
sizeof(struct iw_ioctl_description)); sizeof(struct iw_ioctl_description));
...@@ -299,6 +344,31 @@ static const struct iw_ioctl_description standard_event[] = { ...@@ -299,6 +344,31 @@ static const struct iw_ioctl_description standard_event[] = {
[IWEVEXPIRED - IWEVFIRST] = { [IWEVEXPIRED - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_ADDR, .header_type = IW_HEADER_TYPE_ADDR,
}, },
[IWEVGENIE - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[IWEVMICHAELMICFAILURE - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = sizeof(struct iw_michaelmicfailure),
},
[IWEVASSOCREQIE - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[IWEVASSOCRESPIE - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[IWEVPMKIDCAND - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = sizeof(struct iw_pmkid_cand),
},
}; };
static const int standard_event_num = (sizeof(standard_event) / static const int standard_event_num = (sizeof(standard_event) /
sizeof(struct iw_ioctl_description)); sizeof(struct iw_ioctl_description));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment