From: Rask Ingemann Lambertsen <rask@sygehus.dk>
To: netdev@oss.sgi.com, linux-net@vger.kernel.org
Subject: Re: [PATCH] [EXPERIMENTAL] 2.6: de2104x.c jumbo frames, take two
Date: Sat, 10 Jan 2004 14:47:38 +0100 [thread overview]
Message-ID: <20040110144738.A1385@sygehus.dk> (raw)
In-Reply-To: <20040110003304.A3788@sygehus.dk>; from rask@sygehus.dk on Sat, Jan 10, 2004 at 12:33:07AM +0100
[-- Attachment #1: Type: text/plain, Size: 237 bytes --]
On Sat, Jan 10, 2004 at 12:33:07AM +0100, Rask Ingemann Lambertsen wrote:
> Hi.
>
> Attached is a patch which enables jumbo frames on DS2104x based boards.
And then I forgot to include the patch. :-(
Regards,
Rask Ingemann Lambertsen
[-- Attachment #2: de2104x-mtu.patch --]
[-- Type: text/plain, Size: 6622 bytes --]
--- linux-2.6.0/drivers/net/tulip/de2104x.c-før-mtu Sun Dec 21 14:31:04 2003
+++ linux-2.6.0/drivers/net/tulip/de2104x.c Mon Jan 5 02:01:15 2004
@@ -19,7 +19,6 @@
like dl2k.c/sundance.c
* Constants (module parms?) for Rx work limit
* Complete reset on PciErr
- * Jumbo frames / dev->change_mtu
* Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error
* Adjust Tx FIFO threshold and Max Tx DMA burst on Tx FIFO error
* Implement Tx software interrupt mitigation via
@@ -36,6 +35,7 @@
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
+#include <linux/if_vlan.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/delay.h>
@@ -67,11 +67,15 @@ static int debug = -1;
MODULE_PARM (debug, "i");
MODULE_PARM_DESC (debug, "de2104x bitmapped message enable number");
+/* Each descriptor has two buffers. */
+#define DESC_BUF_SZ_MAX 2044
+#define PKT_BUF_SZ_MAX 4088 /* Maximum Rx buffer size. */
+
/* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) \
|| defined(__sparc_) || defined(__ia64__) \
|| defined(__sh__) || defined(__mips__)
-static int rx_copybreak = 1518;
+static int rx_copybreak = PKT_BUF_SZ_MAX;
#else
static int rx_copybreak = 100;
#endif
@@ -356,12 +360,12 @@ static const char * const media_name[DE_
* TP AUTO(unused), BNC(unused), AUI, TP, TP FD*/
static u16 t21040_csr13[] = { 0, 0, 0x8F09, 0x8F01, 0x8F01, };
static u16 t21040_csr14[] = { 0, 0, 0x0705, 0xFFFF, 0xFFFD, };
-static u16 t21040_csr15[] = { 0, 0, 0x0006, 0x0000, 0x0000, };
+static u16 t21040_csr15[] = { 0, 0, 0x0017, 0x0011, 0x0011, };
/* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
-static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
+static u16 t21041_csr15[] = { 0x0019, 0x0017, 0x001F, 0x0019, 0x0019, };
static inline unsigned long
@@ -374,6 +378,12 @@ msec_to_jiffies(unsigned long ms)
#define dr32(reg) readl(de->regs + (reg))
#define dw32(reg,val) writel((val), de->regs + (reg))
+static inline u32 opts2_sizes (uint total_size)
+{
+ if (total_size <= DESC_BUF_SZ_MAX)
+ return (total_size);
+ return (((total_size - DESC_BUF_SZ_MAX) << 11) | DESC_BUF_SZ_MAX);
+}
static void de_rx_err_acct (struct de_private *de, unsigned rx_tail,
u32 status, u32 len)
@@ -422,7 +432,9 @@ static void de_rx (struct de_private *de
if (status & DescOwn)
break;
- len = ((status >> 16) & 0x7ff) - 4;
+ len = ((status >> 16) & 0x3fff) - 4;
+ if ((len <= 1514) && (status & RxErrLong))
+ len += 2048;
mapping = de->rx_skb[rx_tail].mapping;
if (unlikely(drop)) {
@@ -430,7 +442,7 @@ static void de_rx (struct de_private *de
goto rx_next;
}
- if (unlikely((status & 0x38008300) != 0x0300)) {
+ if (unlikely((status & 0x38004b53) != 0x0300)) {
de_rx_err_acct(de, rx_tail, status, len);
goto rx_next;
}
@@ -483,11 +495,13 @@ static void de_rx (struct de_private *de
rx_next:
de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
if (rx_tail == (DE_RX_RING_SIZE - 1))
- de->rx_ring[rx_tail].opts2 =
- cpu_to_le32(RingEnd | de->rx_buf_sz);
+ de->rx_ring[rx_tail].opts2 = cpu_to_le32(
+ RingEnd | opts2_sizes (de->rx_buf_sz));
else
- de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
+ de->rx_ring[rx_tail].opts2 = cpu_to_le32(
+ opts2_sizes (de->rx_buf_sz));
de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
+ de->rx_ring[rx_tail].addr2 = cpu_to_le32(mapping + DESC_BUF_SZ_MAX);
rx_tail = NEXT_RX(rx_tail);
}
@@ -632,9 +646,10 @@ static int de_start_xmit (struct sk_buff
flags |= RingEnd;
if (!tx_free || (tx_free == (DE_TX_RING_SIZE / 2)))
flags |= TxSwInt;
- flags |= len;
+ flags |= opts2_sizes (len);
txd->opts2 = cpu_to_le32(flags);
txd->addr1 = cpu_to_le32(mapping);
+ txd->addr2 = cpu_to_le32(mapping + DESC_BUF_SZ_MAX);
de->tx_skb[entry].skb = skb;
de->tx_skb[entry].mapping = mapping;
@@ -770,6 +785,7 @@ static void __de_set_rx_mode (struct net
dummy_txd->opts2 = (entry == (DE_TX_RING_SIZE - 1)) ?
cpu_to_le32(RingEnd) : 0;
dummy_txd->addr1 = 0;
+ dummy_txd->addr2 = 0;
/* Must set DescOwned later to avoid race with chip */
@@ -788,6 +804,7 @@ static void __de_set_rx_mode (struct net
else
txd->opts2 = cpu_to_le32(SetupFrame | sizeof (de->setup_frame));
txd->addr1 = cpu_to_le32(mapping);
+ txd->addr2 = cpu_to_le32(0);
wmb();
txd->opts1 = cpu_to_le32(DescOwn);
@@ -1277,7 +1294,9 @@ static int de_init_hw (struct de_private
static int de_refill_rx (struct de_private *de)
{
unsigned i;
+ u32 opts2;
+ opts2 = opts2_sizes (de->rx_buf_sz);
for (i = 0; i < DE_RX_RING_SIZE; i++) {
struct sk_buff *skb;
@@ -1294,11 +1313,11 @@ static int de_refill_rx (struct de_priva
de->rx_ring[i].opts1 = cpu_to_le32(DescOwn);
if (i == (DE_RX_RING_SIZE - 1))
de->rx_ring[i].opts2 =
- cpu_to_le32(RingEnd | de->rx_buf_sz);
+ cpu_to_le32(RingEnd | opts2);
else
- de->rx_ring[i].opts2 = cpu_to_le32(de->rx_buf_sz);
+ de->rx_ring[i].opts2 = cpu_to_le32(opts2);
de->rx_ring[i].addr1 = cpu_to_le32(de->rx_skb[i].mapping);
- de->rx_ring[i].addr2 = 0;
+ de->rx_ring[i].addr2 = cpu_to_le32(de->rx_skb[i].mapping + DESC_BUF_SZ_MAX);
}
return 0;
@@ -1386,6 +1405,8 @@ static int de_open (struct net_device *d
printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
de->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
+ if (de->rx_buf_sz > PKT_BUF_SZ_MAX)
+ de->rx_buf_sz = PKT_BUF_SZ_MAX;
rc = de_alloc_rings(de);
if (rc) {
@@ -1476,6 +1497,18 @@ static void de_tx_timeout (struct net_de
netif_wake_queue(dev);
}
+static int de_change_mtu (struct net_device *dev, int mtu)
+{
+ if (netif_running (dev))
+ return (-EBUSY);
+
+ if (mtu < 0 || mtu > PKT_BUF_SZ_MAX - VLAN_ETH_HLEN - 4)
+ return (-EINVAL);
+
+ dev->mtu = mtu;
+ return (0);
+}
+
static void __de_get_regs(struct de_private *de, u8 *buf)
{
int i;
@@ -1980,6 +2013,7 @@ static int __devinit de_init_one (struct
dev->ethtool_ops = &de_ethtool_ops;
dev->tx_timeout = de_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT;
+ dev->change_mtu = de_change_mtu;
dev->irq = pdev->irq;
prev parent reply other threads:[~2004-01-10 13:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-09 23:33 [PATCH] [EXPERIMENTAL] 2.6: de2104x.c jumbo frames, take two Rask Ingemann Lambertsen
2004-01-10 13:47 ` Rask Ingemann Lambertsen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040110144738.A1385@sygehus.dk \
--to=rask@sygehus.dk \
--cc=linux-net@vger.kernel.org \
--cc=netdev@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).