summaryrefslogtreecommitdiff
path: root/sys/dev/vge
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2009-12-20 19:45:46 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2009-12-20 19:45:46 +0000
commit33a0d70b864a6b53fe640f05c796fc78b4f0c267 (patch)
tree05fd98c71ba8173fc6710b7c2e424db0f50547d1 /sys/dev/vge
parent564340e7cf57a82382df8774612e01ba80478efc (diff)
Notes
Diffstat (limited to 'sys/dev/vge')
-rw-r--r--sys/dev/vge/if_vge.c15
-rw-r--r--sys/dev/vge/if_vgevar.h1
2 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c
index 5ad6ed8456f0..fa54bbe3fc1c 100644
--- a/sys/dev/vge/if_vge.c
+++ b/sys/dev/vge/if_vge.c
@@ -1013,7 +1013,8 @@ vge_attach(device_t dev)
if (pci_find_extcap(dev, PCIY_EXPRESS, &cap) == 0) {
sc->vge_flags |= VGE_FLAG_PCIE;
sc->vge_expcap = cap;
- }
+ } else
+ sc->vge_flags |= VGE_FLAG_JUMBO;
if (pci_find_extcap(dev, PCIY_PMG, &cap) == 0) {
sc->vge_flags |= VGE_FLAG_PMCAP;
sc->vge_pmcap = cap;
@@ -2221,9 +2222,17 @@ vge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
switch (command) {
case SIOCSIFMTU:
- if (ifr->ifr_mtu > VGE_JUMBO_MTU)
+ VGE_LOCK(sc);
+ if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > VGE_JUMBO_MTU)
error = EINVAL;
- ifp->if_mtu = ifr->ifr_mtu;
+ else if (ifp->if_mtu != ifr->ifr_mtu) {
+ if (ifr->ifr_mtu > ETHERMTU &&
+ (sc->vge_flags & VGE_FLAG_JUMBO) == 0)
+ error = EINVAL;
+ else
+ ifp->if_mtu = ifr->ifr_mtu;
+ }
+ VGE_UNLOCK(sc);
break;
case SIOCSIFFLAGS:
VGE_LOCK(sc);
diff --git a/sys/dev/vge/if_vgevar.h b/sys/dev/vge/if_vgevar.h
index da8f6c51c86b..ca899cc5fc0a 100644
--- a/sys/dev/vge/if_vgevar.h
+++ b/sys/dev/vge/if_vgevar.h
@@ -187,6 +187,7 @@ struct vge_softc {
#define VGE_FLAG_PCIE 0x0001
#define VGE_FLAG_MSI 0x0002
#define VGE_FLAG_PMCAP 0x0004
+#define VGE_FLAG_JUMBO 0x0008
#define VGE_FLAG_SUSPENDED 0x4000
#define VGE_FLAG_LINK 0x8000
int vge_expcap;