Commit 532f4aee934cf26f1905fae101ac9f0ba3087f21

Authored by Pekka Enberg
Committed by Jeff Garzik
1 parent da02b23192

ipg: run-time configurable jumbo frame support

Make jumbo frame support configurable via ifconfig mtu option as suggested by
Stephen Hemminger.

Cc: Stephen Hemminger <stephen.hemminger@vyatta.com>
Tested-by: Andrew Savchenko <Bircoph@list.ru>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

Showing 2 changed files with 32 additions and 95 deletions Side-by-side Diff

... ... @@ -42,7 +42,6 @@
42 42 #define ipg_r16(reg) ioread16(ioaddr + (reg))
43 43 #define ipg_r8(reg) ioread8(ioaddr + (reg))
44 44  
45   -#define JUMBO_FRAME_4k_ONLY
46 45 enum {
47 46 netdev_io_size = 128
48 47 };
... ... @@ -55,6 +54,14 @@
55 54 MODULE_LICENSE("GPL");
56 55  
57 56 /*
  57 + * Defaults
  58 + */
  59 +#define IPG_MAX_RXFRAME_SIZE 0x0600
  60 +#define IPG_RXFRAG_SIZE 0x0600
  61 +#define IPG_RXSUPPORT_SIZE 0x0600
  62 +#define IPG_IS_JUMBO false
  63 +
  64 +/*
58 65 * Variable record -- index by leading revision/length
59 66 * Revision/Length(=N*4), Address1, Data1, Address2, Data2,...,AddressN,DataN
60 67 */
... ... @@ -1805,9 +1812,6 @@
1805 1812 sp->jumbo.current_size = 0;
1806 1813 sp->jumbo.skb = NULL;
1807 1814  
1808   - if (IPG_TXFRAG_SIZE)
1809   - dev->mtu = IPG_TXFRAG_SIZE;
1810   -
1811 1815 /* Enable transmit and receive operation of the IPG. */
1812 1816 ipg_w32((ipg_r32(MAC_CTRL) | IPG_MC_RX_ENABLE | IPG_MC_TX_ENABLE) &
1813 1817 IPG_MC_RSVD_MASK, MAC_CTRL);
... ... @@ -2116,6 +2120,7 @@
2116 2120 static int ipg_nic_change_mtu(struct net_device *dev, int new_mtu)
2117 2121 {
2118 2122 struct ipg_nic_private *sp = netdev_priv(dev);
  2123 + int err;
2119 2124  
2120 2125 /* Function to accomodate changes to Maximum Transfer Unit
2121 2126 * (or MTU) of IPG NIC. Cannot use default function since
2122 2127  
2123 2128  
2124 2129  
... ... @@ -2124,16 +2129,33 @@
2124 2129  
2125 2130 IPG_DEBUG_MSG("_nic_change_mtu\n");
2126 2131  
2127   - /* Check that the new MTU value is between 68 (14 byte header, 46
2128   - * byte payload, 4 byte FCS) and IPG_MAX_RXFRAME_SIZE, which
2129   - * corresponds to the MAXFRAMESIZE register in the IPG.
  2132 + /*
  2133 + * Check that the new MTU value is between 68 (14 byte header, 46 byte
  2134 + * payload, 4 byte FCS) and 10 KB, which is the largest supported MTU.
2130 2135 */
2131   - if ((new_mtu < 68) || (new_mtu > sp->max_rxframe_size))
  2136 + if (new_mtu < 68 || new_mtu > 10240)
2132 2137 return -EINVAL;
2133 2138  
  2139 + err = ipg_nic_stop(dev);
  2140 + if (err)
  2141 + return err;
  2142 +
2134 2143 dev->mtu = new_mtu;
2135 2144  
2136   - return 0;
  2145 + sp->max_rxframe_size = new_mtu;
  2146 +
  2147 + sp->rxfrag_size = new_mtu;
  2148 + if (sp->rxfrag_size > 4088)
  2149 + sp->rxfrag_size = 4088;
  2150 +
  2151 + sp->rxsupport_size = sp->max_rxframe_size;
  2152 +
  2153 + if (new_mtu > 0x0600)
  2154 + sp->is_jumbo = true;
  2155 + else
  2156 + sp->is_jumbo = false;
  2157 +
  2158 + return ipg_nic_open(dev);
2137 2159 }
2138 2160  
2139 2161 static int ipg_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
... ... @@ -2238,7 +2260,7 @@
2238 2260 spin_lock_init(&sp->lock);
2239 2261 mutex_init(&sp->mii_mutex);
2240 2262  
2241   - sp->is_jumbo = IPG_JUMBO;
  2263 + sp->is_jumbo = IPG_IS_JUMBO;
2242 2264 sp->rxfrag_size = IPG_RXFRAG_SIZE;
2243 2265 sp->rxsupport_size = IPG_RXSUPPORT_SIZE;
2244 2266 sp->max_rxframe_size = IPG_MAX_RXFRAME_SIZE;
... ... @@ -536,91 +536,6 @@
536 536 */
537 537 #define IPG_FRAMESBETWEENTXDMACOMPLETES 0x1
538 538  
539   -#ifdef JUMBO_FRAME
540   -# define IPG_JUMBO true
541   -#else
542   -# define IPG_JUMBO false
543   -#endif
544   -
545   -#ifdef JUMBO_FRAME
546   -
547   -# ifdef JUMBO_FRAME_SIZE_2K
548   -# define JUMBO_FRAME_SIZE 2048
549   -# define __IPG_RXFRAG_SIZE 2048
550   -# else
551   -# ifdef JUMBO_FRAME_SIZE_3K
552   -# define JUMBO_FRAME_SIZE 3072
553   -# define __IPG_RXFRAG_SIZE 3072
554   -# else
555   -# ifdef JUMBO_FRAME_SIZE_4K
556   -# define JUMBO_FRAME_SIZE 4096
557   -# define __IPG_RXFRAG_SIZE 4088
558   -# else
559   -# ifdef JUMBO_FRAME_SIZE_5K
560   -# define JUMBO_FRAME_SIZE 5120
561   -# define __IPG_RXFRAG_SIZE 4088
562   -# else
563   -# ifdef JUMBO_FRAME_SIZE_6K
564   -# define JUMBO_FRAME_SIZE 6144
565   -# define __IPG_RXFRAG_SIZE 4088
566   -# else
567   -# ifdef JUMBO_FRAME_SIZE_7K
568   -# define JUMBO_FRAME_SIZE 7168
569   -# define __IPG_RXFRAG_SIZE 4088
570   -# else
571   -# ifdef JUMBO_FRAME_SIZE_8K
572   -# define JUMBO_FRAME_SIZE 8192
573   -# define __IPG_RXFRAG_SIZE 4088
574   -# else
575   -# ifdef JUMBO_FRAME_SIZE_9K
576   -# define JUMBO_FRAME_SIZE 9216
577   -# define __IPG_RXFRAG_SIZE 4088
578   -# else
579   -# ifdef JUMBO_FRAME_SIZE_10K
580   -# define JUMBO_FRAME_SIZE 10240
581   -# define __IPG_RXFRAG_SIZE 4088
582   -# else
583   -# define JUMBO_FRAME_SIZE 4096
584   -# endif
585   -# endif
586   -# endif
587   -# endif
588   -# endif
589   -# endif
590   -# endif
591   -# endif
592   -# endif
593   -#endif
594   -
595   -/* Size of allocated received buffers. Nominally 0x0600.
596   - * Define larger if expecting jumbo frames.
597   - */
598   -#ifdef JUMBO_FRAME
599   -/* IPG_TXFRAG_SIZE must <= 0x2b00, or TX will crash */
600   -#define IPG_TXFRAG_SIZE JUMBO_FRAME_SIZE
601   -#else
602   -#define IPG_TXFRAG_SIZE 0 /* use default MTU */
603   -#endif
604   -
605   -/* Size of allocated received buffers. Nominally 0x0600.
606   - * Define larger if expecting jumbo frames.
607   - */
608   -#ifdef JUMBO_FRAME
609   -/* 4088 = 4096 - 8 */
610   -#define IPG_RXFRAG_SIZE __IPG_RXFRAG_SIZE
611   -#define IPG_RXSUPPORT_SIZE IPG_MAX_RXFRAME_SIZE
612   -#else
613   -#define IPG_RXFRAG_SIZE 0x0600
614   -#define IPG_RXSUPPORT_SIZE IPG_RXFRAG_SIZE
615   -#endif
616   -
617   -/* IPG_MAX_RXFRAME_SIZE <= IPG_RXFRAG_SIZE */
618   -#ifdef JUMBO_FRAME
619   -#define IPG_MAX_RXFRAME_SIZE JUMBO_FRAME_SIZE
620   -#else
621   -#define IPG_MAX_RXFRAME_SIZE 0x0600
622   -#endif
623   -
624 539 #define IPG_RFDLIST_LENGTH 0x100
625 540  
626 541 /* Maximum number of RFDs to process per interrupt.