diff options
author | Pekka Enberg <penberg@cs.helsinki.fi> | 2008-06-23 07:36:56 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-07-04 08:46:54 -0400 |
commit | 532f4aee934cf26f1905fae101ac9f0ba3087f21 (patch) | |
tree | e90f06c06dd86f6168961e09f21655a51d08ed25 /drivers/net/ipg.c | |
parent | da02b23192e8c1dc6830fc38840ea1c5e416a43c (diff) |
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>
Diffstat (limited to 'drivers/net/ipg.c')
-rw-r--r-- | drivers/net/ipg.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 57395b9587dc..7373dafbb3f7 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #define ipg_r16(reg) ioread16(ioaddr + (reg)) | 42 | #define ipg_r16(reg) ioread16(ioaddr + (reg)) |
43 | #define ipg_r8(reg) ioread8(ioaddr + (reg)) | 43 | #define ipg_r8(reg) ioread8(ioaddr + (reg)) |
44 | 44 | ||
45 | #define JUMBO_FRAME_4k_ONLY | ||
46 | enum { | 45 | enum { |
47 | netdev_io_size = 128 | 46 | netdev_io_size = 128 |
48 | }; | 47 | }; |
@@ -55,6 +54,14 @@ MODULE_DESCRIPTION("IC Plus IP1000 Gigabit Ethernet Adapter Linux Driver"); | |||
55 | MODULE_LICENSE("GPL"); | 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 | * Variable record -- index by leading revision/length | 65 | * Variable record -- index by leading revision/length |
59 | * Revision/Length(=N*4), Address1, Data1, Address2, Data2,...,AddressN,DataN | 66 | * Revision/Length(=N*4), Address1, Data1, Address2, Data2,...,AddressN,DataN |
60 | */ | 67 | */ |
@@ -1805,9 +1812,6 @@ static int ipg_nic_open(struct net_device *dev) | |||
1805 | sp->jumbo.current_size = 0; | 1812 | sp->jumbo.current_size = 0; |
1806 | sp->jumbo.skb = NULL; | 1813 | sp->jumbo.skb = NULL; |
1807 | 1814 | ||
1808 | if (IPG_TXFRAG_SIZE) | ||
1809 | dev->mtu = IPG_TXFRAG_SIZE; | ||
1810 | |||
1811 | /* Enable transmit and receive operation of the IPG. */ | 1815 | /* Enable transmit and receive operation of the IPG. */ |
1812 | ipg_w32((ipg_r32(MAC_CTRL) | IPG_MC_RX_ENABLE | IPG_MC_TX_ENABLE) & | 1816 | ipg_w32((ipg_r32(MAC_CTRL) | IPG_MC_RX_ENABLE | IPG_MC_TX_ENABLE) & |
1813 | IPG_MC_RSVD_MASK, MAC_CTRL); | 1817 | IPG_MC_RSVD_MASK, MAC_CTRL); |
@@ -2116,6 +2120,7 @@ static int ipg_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
2116 | static int ipg_nic_change_mtu(struct net_device *dev, int new_mtu) | 2120 | static int ipg_nic_change_mtu(struct net_device *dev, int new_mtu) |
2117 | { | 2121 | { |
2118 | struct ipg_nic_private *sp = netdev_priv(dev); | 2122 | struct ipg_nic_private *sp = netdev_priv(dev); |
2123 | int err; | ||
2119 | 2124 | ||
2120 | /* Function to accomodate changes to Maximum Transfer Unit | 2125 | /* Function to accomodate changes to Maximum Transfer Unit |
2121 | * (or MTU) of IPG NIC. Cannot use default function since | 2126 | * (or MTU) of IPG NIC. Cannot use default function since |
@@ -2124,16 +2129,33 @@ static int ipg_nic_change_mtu(struct net_device *dev, int new_mtu) | |||
2124 | 2129 | ||
2125 | IPG_DEBUG_MSG("_nic_change_mtu\n"); | 2130 | IPG_DEBUG_MSG("_nic_change_mtu\n"); |
2126 | 2131 | ||
2127 | /* Check that the new MTU value is between 68 (14 byte header, 46 | 2132 | /* |
2128 | * byte payload, 4 byte FCS) and IPG_MAX_RXFRAME_SIZE, which | 2133 | * Check that the new MTU value is between 68 (14 byte header, 46 byte |
2129 | * corresponds to the MAXFRAMESIZE register in the IPG. | 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 | return -EINVAL; | 2137 | return -EINVAL; |
2133 | 2138 | ||
2139 | err = ipg_nic_stop(dev); | ||
2140 | if (err) | ||
2141 | return err; | ||
2142 | |||
2134 | dev->mtu = new_mtu; | 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 | static int ipg_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) | 2161 | static int ipg_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) |
@@ -2238,7 +2260,7 @@ static int __devinit ipg_probe(struct pci_dev *pdev, | |||
2238 | spin_lock_init(&sp->lock); | 2260 | spin_lock_init(&sp->lock); |
2239 | mutex_init(&sp->mii_mutex); | 2261 | mutex_init(&sp->mii_mutex); |
2240 | 2262 | ||
2241 | sp->is_jumbo = IPG_JUMBO; | 2263 | sp->is_jumbo = IPG_IS_JUMBO; |
2242 | sp->rxfrag_size = IPG_RXFRAG_SIZE; | 2264 | sp->rxfrag_size = IPG_RXFRAG_SIZE; |
2243 | sp->rxsupport_size = IPG_RXSUPPORT_SIZE; | 2265 | sp->rxsupport_size = IPG_RXSUPPORT_SIZE; |
2244 | sp->max_rxframe_size = IPG_MAX_RXFRAME_SIZE; | 2266 | sp->max_rxframe_size = IPG_MAX_RXFRAME_SIZE; |