diff options
Diffstat (limited to 'drivers/net/sunvnet.c')
-rw-r--r-- | drivers/net/sunvnet.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/net/sunvnet.c b/drivers/net/sunvnet.c index d764e4ccba56..8a667c13faef 100644 --- a/drivers/net/sunvnet.c +++ b/drivers/net/sunvnet.c | |||
@@ -892,7 +892,7 @@ const char *remote_macaddr_prop = "remote-mac-address"; | |||
892 | static int __devinit vnet_port_probe(struct vio_dev *vdev, | 892 | static int __devinit vnet_port_probe(struct vio_dev *vdev, |
893 | const struct vio_device_id *id) | 893 | const struct vio_device_id *id) |
894 | { | 894 | { |
895 | struct mdesc_node *endp; | 895 | struct mdesc_handle *hp; |
896 | struct vnet_port *port; | 896 | struct vnet_port *port; |
897 | unsigned long flags; | 897 | unsigned long flags; |
898 | struct vnet *vp; | 898 | struct vnet *vp; |
@@ -905,23 +905,21 @@ static int __devinit vnet_port_probe(struct vio_dev *vdev, | |||
905 | return -ENODEV; | 905 | return -ENODEV; |
906 | } | 906 | } |
907 | 907 | ||
908 | rmac = md_get_property(vdev->mp, remote_macaddr_prop, &len); | 908 | hp = mdesc_grab(); |
909 | |||
910 | rmac = mdesc_get_property(hp, vdev->mp, remote_macaddr_prop, &len); | ||
911 | err = -ENODEV; | ||
909 | if (!rmac) { | 912 | if (!rmac) { |
910 | printk(KERN_ERR PFX "Port lacks %s property.\n", | 913 | printk(KERN_ERR PFX "Port lacks %s property.\n", |
911 | remote_macaddr_prop); | 914 | remote_macaddr_prop); |
912 | return -ENODEV; | 915 | goto err_out_put_mdesc; |
913 | } | ||
914 | |||
915 | endp = vio_find_endpoint(vdev); | ||
916 | if (!endp) { | ||
917 | printk(KERN_ERR PFX "Port lacks channel-endpoint.\n"); | ||
918 | return -ENODEV; | ||
919 | } | 916 | } |
920 | 917 | ||
921 | port = kzalloc(sizeof(*port), GFP_KERNEL); | 918 | port = kzalloc(sizeof(*port), GFP_KERNEL); |
919 | err = -ENOMEM; | ||
922 | if (!port) { | 920 | if (!port) { |
923 | printk(KERN_ERR PFX "Cannot allocate vnet_port.\n"); | 921 | printk(KERN_ERR PFX "Cannot allocate vnet_port.\n"); |
924 | return -ENOMEM; | 922 | goto err_out_put_mdesc; |
925 | } | 923 | } |
926 | 924 | ||
927 | for (i = 0; i < ETH_ALEN; i++) | 925 | for (i = 0; i < ETH_ALEN; i++) |
@@ -929,7 +927,7 @@ static int __devinit vnet_port_probe(struct vio_dev *vdev, | |||
929 | 927 | ||
930 | port->vp = vp; | 928 | port->vp = vp; |
931 | 929 | ||
932 | err = vio_driver_init(&port->vio, vdev, VDEV_NETWORK, endp, | 930 | err = vio_driver_init(&port->vio, vdev, VDEV_NETWORK, |
933 | vnet_versions, ARRAY_SIZE(vnet_versions), | 931 | vnet_versions, ARRAY_SIZE(vnet_versions), |
934 | &vnet_vio_ops, vp->dev->name); | 932 | &vnet_vio_ops, vp->dev->name); |
935 | if (err) | 933 | if (err) |
@@ -947,7 +945,7 @@ static int __devinit vnet_port_probe(struct vio_dev *vdev, | |||
947 | INIT_LIST_HEAD(&port->list); | 945 | INIT_LIST_HEAD(&port->list); |
948 | 946 | ||
949 | switch_port = 0; | 947 | switch_port = 0; |
950 | if (md_get_property(vdev->mp, "switch-port", NULL) != NULL) | 948 | if (mdesc_get_property(hp, vdev->mp, "switch-port", NULL) != NULL) |
951 | switch_port = 1; | 949 | switch_port = 1; |
952 | 950 | ||
953 | spin_lock_irqsave(&vp->lock, flags); | 951 | spin_lock_irqsave(&vp->lock, flags); |
@@ -969,6 +967,8 @@ static int __devinit vnet_port_probe(struct vio_dev *vdev, | |||
969 | 967 | ||
970 | vio_port_up(&port->vio); | 968 | vio_port_up(&port->vio); |
971 | 969 | ||
970 | mdesc_release(hp); | ||
971 | |||
972 | return 0; | 972 | return 0; |
973 | 973 | ||
974 | err_out_free_ldc: | 974 | err_out_free_ldc: |
@@ -977,6 +977,8 @@ err_out_free_ldc: | |||
977 | err_out_free_port: | 977 | err_out_free_port: |
978 | kfree(port); | 978 | kfree(port); |
979 | 979 | ||
980 | err_out_put_mdesc: | ||
981 | mdesc_release(hp); | ||
980 | return err; | 982 | return err; |
981 | } | 983 | } |
982 | 984 | ||
@@ -1029,6 +1031,7 @@ static int __devinit vnet_probe(struct vio_dev *vdev, | |||
1029 | const struct vio_device_id *id) | 1031 | const struct vio_device_id *id) |
1030 | { | 1032 | { |
1031 | static int vnet_version_printed; | 1033 | static int vnet_version_printed; |
1034 | struct mdesc_handle *hp; | ||
1032 | struct net_device *dev; | 1035 | struct net_device *dev; |
1033 | struct vnet *vp; | 1036 | struct vnet *vp; |
1034 | const u64 *mac; | 1037 | const u64 *mac; |
@@ -1037,7 +1040,9 @@ static int __devinit vnet_probe(struct vio_dev *vdev, | |||
1037 | if (vnet_version_printed++ == 0) | 1040 | if (vnet_version_printed++ == 0) |
1038 | printk(KERN_INFO "%s", version); | 1041 | printk(KERN_INFO "%s", version); |
1039 | 1042 | ||
1040 | mac = md_get_property(vdev->mp, local_mac_prop, &len); | 1043 | hp = mdesc_grab(); |
1044 | |||
1045 | mac = mdesc_get_property(hp, vdev->mp, local_mac_prop, &len); | ||
1041 | if (!mac) { | 1046 | if (!mac) { |
1042 | printk(KERN_ERR PFX "vnet lacks %s property.\n", | 1047 | printk(KERN_ERR PFX "vnet lacks %s property.\n", |
1043 | local_mac_prop); | 1048 | local_mac_prop); |
@@ -1093,12 +1098,15 @@ static int __devinit vnet_probe(struct vio_dev *vdev, | |||
1093 | 1098 | ||
1094 | dev_set_drvdata(&vdev->dev, vp); | 1099 | dev_set_drvdata(&vdev->dev, vp); |
1095 | 1100 | ||
1101 | mdesc_release(hp); | ||
1102 | |||
1096 | return 0; | 1103 | return 0; |
1097 | 1104 | ||
1098 | err_out_free_dev: | 1105 | err_out_free_dev: |
1099 | free_netdev(dev); | 1106 | free_netdev(dev); |
1100 | 1107 | ||
1101 | err_out: | 1108 | err_out: |
1109 | mdesc_release(hp); | ||
1102 | return err; | 1110 | return err; |
1103 | } | 1111 | } |
1104 | 1112 | ||