Various 802.1Q VLAN driver patches.

From: Ben Greear (greearb@candelatech.com)
Date: Fri Mar 01 2002 - 11:11:06 EST


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

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Mar 07 2002 - 21:00:16 EST