提交 ccad637b 编写于 作者: S Stephen Hemminger 提交者: David S. Miller

netdev: expose ethernet address primitives

When ethernet devices are converted, the function pointer setup
by eth_setup() need to be done during intialization.
Signed-off-by: NStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 eeda3fd6
...@@ -146,7 +146,7 @@ static inline int qlen(struct usb_gadget *gadget) ...@@ -146,7 +146,7 @@ static inline int qlen(struct usb_gadget *gadget)
/* NETWORK DRIVER HOOKUP (to the layer above this driver) */ /* NETWORK DRIVER HOOKUP (to the layer above this driver) */
static int eth_change_mtu(struct net_device *net, int new_mtu) static int ueth_change_mtu(struct net_device *net, int new_mtu)
{ {
struct eth_dev *dev = netdev_priv(net); struct eth_dev *dev = netdev_priv(net);
unsigned long flags; unsigned long flags;
...@@ -764,7 +764,7 @@ int __init gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]) ...@@ -764,7 +764,7 @@ int __init gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
if (ethaddr) if (ethaddr)
memcpy(ethaddr, dev->host_mac, ETH_ALEN); memcpy(ethaddr, dev->host_mac, ETH_ALEN);
net->change_mtu = eth_change_mtu; net->change_mtu = ueth_change_mtu;
net->hard_start_xmit = eth_start_xmit; net->hard_start_xmit = eth_start_xmit;
net->open = eth_open; net->open = eth_open;
net->stop = eth_stop; net->stop = eth_stop;
......
...@@ -41,6 +41,10 @@ extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh); ...@@ -41,6 +41,10 @@ extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh);
extern void eth_header_cache_update(struct hh_cache *hh, extern void eth_header_cache_update(struct hh_cache *hh,
const struct net_device *dev, const struct net_device *dev,
const unsigned char *haddr); const unsigned char *haddr);
extern int eth_mac_addr(struct net_device *dev, void *p);
extern int eth_change_mtu(struct net_device *dev, int new_mtu);
extern int eth_validate_addr(struct net_device *dev);
extern struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count); extern struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count);
......
...@@ -282,7 +282,7 @@ EXPORT_SYMBOL(eth_header_cache_update); ...@@ -282,7 +282,7 @@ EXPORT_SYMBOL(eth_header_cache_update);
* This doesn't change hardware matching, so needs to be overridden * This doesn't change hardware matching, so needs to be overridden
* for most real devices. * for most real devices.
*/ */
static int eth_mac_addr(struct net_device *dev, void *p) int eth_mac_addr(struct net_device *dev, void *p)
{ {
struct sockaddr *addr = p; struct sockaddr *addr = p;
...@@ -293,6 +293,7 @@ static int eth_mac_addr(struct net_device *dev, void *p) ...@@ -293,6 +293,7 @@ static int eth_mac_addr(struct net_device *dev, void *p)
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
return 0; return 0;
} }
EXPORT_SYMBOL(eth_mac_addr);
/** /**
* eth_change_mtu - set new MTU size * eth_change_mtu - set new MTU size
...@@ -302,21 +303,23 @@ static int eth_mac_addr(struct net_device *dev, void *p) ...@@ -302,21 +303,23 @@ static int eth_mac_addr(struct net_device *dev, void *p)
* Allow changing MTU size. Needs to be overridden for devices * Allow changing MTU size. Needs to be overridden for devices
* supporting jumbo frames. * supporting jumbo frames.
*/ */
static int eth_change_mtu(struct net_device *dev, int new_mtu) int eth_change_mtu(struct net_device *dev, int new_mtu)
{ {
if (new_mtu < 68 || new_mtu > ETH_DATA_LEN) if (new_mtu < 68 || new_mtu > ETH_DATA_LEN)
return -EINVAL; return -EINVAL;
dev->mtu = new_mtu; dev->mtu = new_mtu;
return 0; return 0;
} }
EXPORT_SYMBOL(eth_change_mtu);
static int eth_validate_addr(struct net_device *dev) int eth_validate_addr(struct net_device *dev)
{ {
if (!is_valid_ether_addr(dev->dev_addr)) if (!is_valid_ether_addr(dev->dev_addr))
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
return 0; return 0;
} }
EXPORT_SYMBOL(eth_validate_addr);
const struct header_ops eth_header_ops ____cacheline_aligned = { const struct header_ops eth_header_ops ____cacheline_aligned = {
.create = eth_header, .create = eth_header,
...@@ -334,11 +337,11 @@ const struct header_ops eth_header_ops ____cacheline_aligned = { ...@@ -334,11 +337,11 @@ const struct header_ops eth_header_ops ____cacheline_aligned = {
void ether_setup(struct net_device *dev) void ether_setup(struct net_device *dev)
{ {
dev->header_ops = &eth_header_ops; dev->header_ops = &eth_header_ops;
#ifdef CONFIG_COMPAT_NET_DEV_OPS
dev->change_mtu = eth_change_mtu; dev->change_mtu = eth_change_mtu;
dev->set_mac_address = eth_mac_addr; dev->set_mac_address = eth_mac_addr;
dev->validate_addr = eth_validate_addr; dev->validate_addr = eth_validate_addr;
#endif
dev->type = ARPHRD_ETHER; dev->type = ARPHRD_ETHER;
dev->hard_header_len = ETH_HLEN; dev->hard_header_len = ETH_HLEN;
dev->mtu = ETH_DATA_LEN; dev->mtu = ETH_DATA_LEN;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册