Various 802.1Q VLAN driver patches.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



While you guys are fixing up the drivers and the VLAN code,
please consider some of these other driver patches:

(I haven't tested these personally, but they have been sent
to me and/or the VLAN mailing list by folks who have been
using VLAN with their various drivers.)


diff -urN linux-2.4.16/drivers/net/eepro100.c linux/drivers/net/eepro100.c
--- linux-2.4.16/drivers/net/eepro100.c Mon Nov 12 18:47:18 2001
+++ linux/drivers/net/eepro100.c        Tue Dec 18 11:36:11 2001
@@ -510,12 +510,12 @@
  static const char i82557_config_cmd[CONFIG_DATA_SIZE] = {
         22, 0x08, 0, 0,  0, 0, 0x32, 0x03,  1, /* 1=Use MII  0=Use AUI */
         0, 0x2E, 0,  0x60, 0,
-       0xf2, 0x48,   0, 0x40, 0xf2, 0x80,              /* 0x40=Force full-duplex */
+       0xf2, 0x48,   0, 0x40, 0xfa, 0x80,              /* 0x40=Force full-duplex */
         0x3f, 0x05, };
  static const char i82558_config_cmd[CONFIG_DATA_SIZE] = {
         22, 0x08, 0, 1,  0, 0, 0x22, 0x03,  1, /* 1=Use MII  0=Use AUI */
         0, 0x2E, 0,  0x60, 0x08, 0x88,
-       0x68, 0, 0x40, 0xf2, 0x84,              /* Disable FC */
+       0x68, 0, 0x40, 0xfa, 0x84,              /* Disable FC */
         0x31, 0x05, };

  /* PHY media interface chips. */




--- linux.orig/drivers/net/3c59x.c	Sun Sep 30 21:26:06 2001
+++ linux/drivers/net/3c59x.c	Wed Oct 24 21:52:10 2001
@@ -308,6 +308,9 @@
     code size of a per-interface flag is not worthwhile. */
  static char mii_preamble_required;

+/* The Ethernet Type used for 802.1q tagged frames */
+#define VLAN_ETHER_TYPE 0x8100
+
  #define PFX DRV_NAME ": "


@@ -651,7 +654,7 @@
  	Wn2_ResetOptions=12,
  };
  enum Window3 {			/* Window 3: MAC/config bits. */
- 
Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
+ 
Wn3_Config=0, Wn3_MaxPktSize=4, Wn3_MAC_Ctrl=6, Wn3_Options=8,
  };

  #define BFEXT(value, offset, bitcount)  \
@@ -679,7 +682,8 @@
  	Media_LnkBeat = 0x0800,
  };
  enum Window7 {					/* Window 7: Bus Master control. */
- 
Wn7_MasterAddr = 0, Wn7_MasterLen = 6, Wn7_MasterStatus = 12,
+ 
Wn7_MasterAddr = 0, Wn7_VlanEtherType=4, Wn7_MasterLen = 6,
+ 
Wn7_MasterStatus = 12,
  };
  /* Boomerang bus master control registers. */
  enum MasterCtrl {
@@ -776,7 +780,8 @@
  		pm_state_valid:1, 
			/* power_state[] has sane contents */
  		open:1,
  		medialock:1,
- 
	must_free_region:1;				/* Flag: if zero, Cardbus owns the I/O region */
+ 
	must_free_region:1,				/* Flag: if zero, Cardbus owns the I/O region */
+ 
	large_frames:1;			/* accept large frames */
  	int drv_flags;
  	u16 status_enable;
  	u16 intr_enable;
@@ -844,6 +849,9 @@
  static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
  static void vortex_tx_timeout(struct net_device *dev);
  static void acpi_set_WOL(struct net_device *dev);
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+static void set_8021q_mode(struct net_device *dev, int enable);
+#endif
  
  /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
  /* Option count limit only -- unlimited interfaces are supported. */
@@ -1030,6 +1038,7 @@
  	dev->base_addr = ioaddr;
  	dev->irq = irq;
  	dev->mtu = mtu;
+ 
vp->large_frames = mtu > 1500;
  	vp->drv_flags = vci->drv_flags;
  	vp->has_nway = (vci->drv_flags & HAS_NWAY) ? 1 : 0;
  	vp->io_size = vci->io_size;
@@ -1461,7 +1470,7 @@

  	/* Set the full-duplex bit. */
  	outw(	((vp->info1 & 0x8000) || vp->full_duplex ? 0x20 : 0) |
- 
	 
	(dev->mtu > 1500 ? 0x40 : 0) |
+ 
	 
	(vp->large_frames ? 0x40 : 0) |
  	 
	((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ? 0x100 : 0),
  	 
	ioaddr + Wn3_MAC_Ctrl);

@@ -1545,6 +1554,10 @@
  	}
  	/* Set receiver mode: presumably accept b-case and phys addr only. */
  	set_rx_mode(dev);
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+ 
/* enable 802.1q tagged frames */
+ 
set_8021q_mode(dev, 1);
+#endif
  	outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */

  //	issue_and_wait(dev, SetTxStart|0x07ff);
@@ -1680,7 +1693,7 @@
  	 
				/* Set the full-duplex bit. */
  	 
				EL3WINDOW(3);
  	 
				outw(	(vp->full_duplex ? 0x20 : 0) |
- 
							(dev->mtu > 1500 ? 0x40 : 0) |
+ 
							(vp->large_frames ? 0x40 : 0) |
  	 
						((vp->full_duplex && vp->flow_ctrl && vp->partner_flow_ctrl) ? 0x100 : 0),
  	 
						ioaddr + Wn3_MAC_Ctrl);
  	 
				if (vortex_debug > 1)
@@ -1900,6 +1913,10 @@
  	 
	issue_and_wait(dev, RxReset|0x07);
  	 
	/* Set the Rx filter to the current state. */
  	 
	set_rx_mode(dev);
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+ 
		/* enable 802.1q VLAN tagged frames */
+ 
		set_8021q_mode(dev, 1);
+#endif
  	 
	outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
  	 
	outw(AckIntr | HostError, ioaddr + EL3_CMD);
  		}
@@ -2497,6 +2514,11 @@
  	outw(RxDisable, ioaddr + EL3_CMD);
  	outw(TxDisable, ioaddr + EL3_CMD);

+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+ 
/* Disable receiving 802.1q tagged frames */
+ 
set_8021q_mode(dev, 0);
+#endif
+
  	if (dev->if_port == XCVR_10base2)
  		/* Turn off thinnet power.  Green! */
  		outw(StopCoax, ioaddr + EL3_CMD);
@@ -2760,6 +2782,50 @@

  	outw(new_mode, ioaddr + EL3_CMD);
  }
+
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+/* Setup the card so that it can receive frames with an 802.1q VLAN tag.
+   Note that this must be done after each RxReset due to some backwards
+   compatibility logic in the Cyclone and Tornado ASICs */
+static void set_8021q_mode(struct net_device *dev, int enable)
+{
+ 
struct vortex_private *vp = (struct vortex_private *)dev->priv;
+ 
long ioaddr = dev->base_addr;
+ 
int old_window = inw(ioaddr + EL3_CMD);
+ 
int mac_ctrl;
+ 

+ 
if (vp->drv_flags&IS_CYCLONE || vp->drv_flags&IS_TORNADO) {
+ 
	/* cyclone and tornado chipsets can recognize 802.1q
+ 
	 * tagged frames and treat them correctly */
+
+ 
	int max_pkt_size = dev->mtu+14;	/* MTU+Ethernet header */
+ 
	if (enable)
+ 
		max_pkt_size += 4;	/* 802.1Q VLAN tag */
+
+ 
	EL3WINDOW(3);
+ 
	outw(max_pkt_size, ioaddr+Wn3_MaxPktSize);
+
+ 
	/* set VlanEtherType to let the hardware checksumming
+ 
	   treat tagged frames correctly */
+ 
	EL3WINDOW(7);
+ 
	outw(VLAN_ETHER_TYPE, ioaddr+Wn7_VlanEtherType);
+ 
} else {
+ 
	/* on older cards we have to enable large frames */
+
+ 
	vp->large_frames = dev->mtu > 1500 || enable;
+
+ 
	EL3WINDOW(3);
+ 
	mac_ctrl = inw(ioaddr+Wn3_MAC_Ctrl);
+ 
	if (vp->large_frames)
+ 
		mac_ctrl |= 0x40;
+ 
	else
+ 
		mac_ctrl &= ~0x40;
+ 
	outw(mac_ctrl, ioaddr+Wn3_MAC_Ctrl);
+ 
}
+
+ 
EL3WINDOW(old_window);
+}
+#endif

  /* MII transceiver control section.
     Read and write the MII registers using software-generated serial



diff -u --recursive --new-file linux/drivers/net/tulip/interrupt.c linux.dev/drivers/net/tulip/interrupt.c
--- linux/drivers/net/tulip/interrupt.c	Fri Nov  9 22:45:35 2001
+++ linux.dev/drivers/net/tulip/interrupt.c	Tue Dec 11 09:24:36 2001
@@ -128,8 +128,8 @@
  	 
		   dev->name, entry, status);
  		if (--rx_work_limit < 0)
  	 
	break;
- 
	if ((status & 0x38008300) != 0x0300) {
- 
		if ((status & 0x38000300) != 0x0300) {
+ 
	if ((status & (0x38000000 | RxDescFatalErr | RxWholePkt)) != RxWholePkt) {
+ 
		if ((status & (0x38000000 | RxWholePkt)) != RxWholePkt) {
  	 
		/* Ingore earlier buffers. */
  	 
		if ((status & 0xffff) != 0x7fff) {
  	 
			if (tulip_debug > 1)
@@ -155,10 +155,10 @@
  	 
	struct sk_buff *skb;

  #ifndef final_version
- 
		if (pkt_len > 1518) {
+ 
		if (pkt_len > 1522) {
  	 
		printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n",
  	 
			   dev->name, pkt_len, pkt_len);
- 
			pkt_len = 1518;
+ 
			pkt_len = 1522;
  	 
		tp->stats.rx_length_errors++;
  	 
	}
  #endif
diff -u --recursive --new-file linux/drivers/net/tulip/tulip.h linux.dev/drivers/net/tulip/tulip.h
--- linux/drivers/net/tulip/tulip.h	Fri Nov  9 22:45:35 2001
+++ linux.dev/drivers/net/tulip/tulip.h	Tue Dec 11 09:24:36 2001
@@ -186,7 +186,7 @@

  enum desc_status_bits {
  	DescOwned = 0x80000000,
- 
RxDescFatalErr = 0x8000,
+ 
RxDescFatalErr = 0x4842,
  	RxWholePkt = 0x0300,
  };

diff -u --recursive --new-file linux/drivers/net/tulip/tulip_core.c linux.dev/drivers/net/tulip/tulip_core.c
--- linux/drivers/net/tulip/tulip_core.c	Tue Nov 20 00:19:42 2001
+++ linux.dev/drivers/net/tulip/tulip_core.c	Tue Dec 11 09:24:36 2001
@@ -63,7 +63,7 @@
  #if defined(__alpha__) || defined(__arm__) || defined(__hppa__) \
  	|| defined(__sparc_) || defined(__ia64__) \
  	|| defined(__sh__) || defined(__mips__)
-static int rx_copybreak = 1518;
+static int rx_copybreak = 1522;
  #else
  static int rx_copybreak = 100;
  #endif


-- 
Ben Greear <greearb@candelatech.com>       <Ben_Greear AT excite.com>
President of Candela Technologies Inc      http://www.candelatech.com
ScryMUD:  http://scry.wanfear.com     http://scry.wanfear.com/~greear


-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux