diff options
Diffstat (limited to 'drivers/net/iseries_veth.c')
| -rw-r--r-- | drivers/net/iseries_veth.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c index f0f04be989d6..93394d76587a 100644 --- a/drivers/net/iseries_veth.c +++ b/drivers/net/iseries_veth.c | |||
| @@ -69,6 +69,7 @@ | |||
| 69 | #include <linux/delay.h> | 69 | #include <linux/delay.h> |
| 70 | #include <linux/mm.h> | 70 | #include <linux/mm.h> |
| 71 | #include <linux/ethtool.h> | 71 | #include <linux/ethtool.h> |
| 72 | #include <linux/if_ether.h> | ||
| 72 | 73 | ||
| 73 | #include <asm/abs_addr.h> | 74 | #include <asm/abs_addr.h> |
| 74 | #include <asm/iseries/mf.h> | 75 | #include <asm/iseries/mf.h> |
| @@ -1035,11 +1036,22 @@ static struct ethtool_ops ops = { | |||
| 1035 | .get_link = veth_get_link, | 1036 | .get_link = veth_get_link, |
| 1036 | }; | 1037 | }; |
| 1037 | 1038 | ||
| 1038 | static struct net_device * __init veth_probe_one(int vlan, struct device *vdev) | 1039 | static struct net_device * __init veth_probe_one(int vlan, |
| 1040 | struct vio_dev *vio_dev) | ||
| 1039 | { | 1041 | { |
| 1040 | struct net_device *dev; | 1042 | struct net_device *dev; |
| 1041 | struct veth_port *port; | 1043 | struct veth_port *port; |
| 1044 | struct device *vdev = &vio_dev->dev; | ||
| 1042 | int i, rc; | 1045 | int i, rc; |
| 1046 | const unsigned char *mac_addr; | ||
| 1047 | |||
| 1048 | mac_addr = vio_get_attribute(vio_dev, "local-mac-address", NULL); | ||
| 1049 | if (mac_addr == NULL) | ||
| 1050 | mac_addr = vio_get_attribute(vio_dev, "mac-address", NULL); | ||
| 1051 | if (mac_addr == NULL) { | ||
| 1052 | veth_error("Unable to fetch MAC address from device tree.\n"); | ||
| 1053 | return NULL; | ||
| 1054 | } | ||
| 1043 | 1055 | ||
| 1044 | dev = alloc_etherdev(sizeof (struct veth_port)); | 1056 | dev = alloc_etherdev(sizeof (struct veth_port)); |
| 1045 | if (! dev) { | 1057 | if (! dev) { |
| @@ -1064,16 +1076,11 @@ static struct net_device * __init veth_probe_one(int vlan, struct device *vdev) | |||
| 1064 | } | 1076 | } |
| 1065 | port->dev = vdev; | 1077 | port->dev = vdev; |
| 1066 | 1078 | ||
| 1067 | dev->dev_addr[0] = 0x02; | 1079 | memcpy(dev->dev_addr, mac_addr, ETH_ALEN); |
| 1068 | dev->dev_addr[1] = 0x01; | ||
| 1069 | dev->dev_addr[2] = 0xff; | ||
| 1070 | dev->dev_addr[3] = vlan; | ||
| 1071 | dev->dev_addr[4] = 0xff; | ||
| 1072 | dev->dev_addr[5] = this_lp; | ||
| 1073 | 1080 | ||
| 1074 | dev->mtu = VETH_MAX_MTU; | 1081 | dev->mtu = VETH_MAX_MTU; |
| 1075 | 1082 | ||
| 1076 | memcpy(&port->mac_addr, dev->dev_addr, 6); | 1083 | memcpy(&port->mac_addr, mac_addr, ETH_ALEN); |
| 1077 | 1084 | ||
| 1078 | dev->open = veth_open; | 1085 | dev->open = veth_open; |
| 1079 | dev->hard_start_xmit = veth_start_xmit; | 1086 | dev->hard_start_xmit = veth_start_xmit; |
| @@ -1608,7 +1615,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id) | |||
| 1608 | struct net_device *dev; | 1615 | struct net_device *dev; |
| 1609 | struct veth_port *port; | 1616 | struct veth_port *port; |
| 1610 | 1617 | ||
| 1611 | dev = veth_probe_one(i, &vdev->dev); | 1618 | dev = veth_probe_one(i, vdev); |
| 1612 | if (dev == NULL) { | 1619 | if (dev == NULL) { |
| 1613 | veth_remove(vdev); | 1620 | veth_remove(vdev); |
| 1614 | return 1; | 1621 | return 1; |
| @@ -1641,7 +1648,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id) | |||
| 1641 | * support. | 1648 | * support. |
| 1642 | */ | 1649 | */ |
| 1643 | static struct vio_device_id veth_device_table[] __devinitdata = { | 1650 | static struct vio_device_id veth_device_table[] __devinitdata = { |
| 1644 | { "vlan", "" }, | 1651 | { "network", "IBM,iSeries-l-lan" }, |
| 1645 | { "", "" } | 1652 | { "", "" } |
| 1646 | }; | 1653 | }; |
| 1647 | MODULE_DEVICE_TABLE(vio, veth_device_table); | 1654 | MODULE_DEVICE_TABLE(vio, veth_device_table); |
