diff options
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 80 |
1 files changed, 28 insertions, 52 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index f4f3ca1393b2..6a801dc3bf8e 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/slab.h> | ||
19 | #include <linux/etherdevice.h> | 20 | #include <linux/etherdevice.h> |
20 | #include <linux/mii.h> | 21 | #include <linux/mii.h> |
21 | #include <linux/ip.h> | 22 | #include <linux/ip.h> |
@@ -486,22 +487,14 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card, | |||
486 | case IPA_RC_L2_DUP_MAC: | 487 | case IPA_RC_L2_DUP_MAC: |
487 | case IPA_RC_L2_DUP_LAYER3_MAC: | 488 | case IPA_RC_L2_DUP_LAYER3_MAC: |
488 | dev_warn(&card->gdev->dev, | 489 | dev_warn(&card->gdev->dev, |
489 | "MAC address " | 490 | "MAC address %pM already exists\n", |
490 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " | 491 | card->dev->dev_addr); |
491 | "already exists\n", | ||
492 | card->dev->dev_addr[0], card->dev->dev_addr[1], | ||
493 | card->dev->dev_addr[2], card->dev->dev_addr[3], | ||
494 | card->dev->dev_addr[4], card->dev->dev_addr[5]); | ||
495 | break; | 492 | break; |
496 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | 493 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: |
497 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | 494 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: |
498 | dev_warn(&card->gdev->dev, | 495 | dev_warn(&card->gdev->dev, |
499 | "MAC address " | 496 | "MAC address %pM is not authorized\n", |
500 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " | 497 | card->dev->dev_addr); |
501 | "is not authorized\n", | ||
502 | card->dev->dev_addr[0], card->dev->dev_addr[1], | ||
503 | card->dev->dev_addr[2], card->dev->dev_addr[3], | ||
504 | card->dev->dev_addr[4], card->dev->dev_addr[5]); | ||
505 | break; | 498 | break; |
506 | default: | 499 | default: |
507 | break; | 500 | break; |
@@ -512,12 +505,8 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card, | |||
512 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, | 505 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, |
513 | OSA_ADDR_LEN); | 506 | OSA_ADDR_LEN); |
514 | dev_info(&card->gdev->dev, | 507 | dev_info(&card->gdev->dev, |
515 | "MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " | 508 | "MAC address %pM successfully registered on device %s\n", |
516 | "successfully registered on device %s\n", | 509 | card->dev->dev_addr, card->dev->name); |
517 | card->dev->dev_addr[0], card->dev->dev_addr[1], | ||
518 | card->dev->dev_addr[2], card->dev->dev_addr[3], | ||
519 | card->dev->dev_addr[4], card->dev->dev_addr[5], | ||
520 | card->dev->name); | ||
521 | } | 510 | } |
522 | return 0; | 511 | return 0; |
523 | } | 512 | } |
@@ -634,7 +623,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev) | |||
634 | for (dm = dev->mc_list; dm; dm = dm->next) | 623 | for (dm = dev->mc_list; dm; dm = dm->next) |
635 | qeth_l2_add_mc(card, dm->da_addr, 0); | 624 | qeth_l2_add_mc(card, dm->da_addr, 0); |
636 | 625 | ||
637 | list_for_each_entry(ha, &dev->uc.list, list) | 626 | netdev_for_each_uc_addr(ha, dev) |
638 | qeth_l2_add_mc(card, ha->addr, 1); | 627 | qeth_l2_add_mc(card, ha->addr, 1); |
639 | 628 | ||
640 | spin_unlock_bh(&card->mclock); | 629 | spin_unlock_bh(&card->mclock); |
@@ -781,7 +770,8 @@ static void qeth_l2_qdio_input_handler(struct ccw_device *ccwdev, | |||
781 | index = i % QDIO_MAX_BUFFERS_PER_Q; | 770 | index = i % QDIO_MAX_BUFFERS_PER_Q; |
782 | buffer = &card->qdio.in_q->bufs[index]; | 771 | buffer = &card->qdio.in_q->bufs[index]; |
783 | if (!(qdio_err && | 772 | if (!(qdio_err && |
784 | qeth_check_qdio_errors(buffer->buffer, qdio_err, "qinerr"))) | 773 | qeth_check_qdio_errors(card, buffer->buffer, qdio_err, |
774 | "qinerr"))) | ||
785 | qeth_l2_process_inbound_buffer(card, buffer, index); | 775 | qeth_l2_process_inbound_buffer(card, buffer, index); |
786 | /* clear buffer and give back to hardware */ | 776 | /* clear buffer and give back to hardware */ |
787 | qeth_put_buffer_pool_entry(card, buffer->pool_entry); | 777 | qeth_put_buffer_pool_entry(card, buffer->pool_entry); |
@@ -866,7 +856,7 @@ static const struct ethtool_ops qeth_l2_ethtool_ops = { | |||
866 | .get_link = ethtool_op_get_link, | 856 | .get_link = ethtool_op_get_link, |
867 | .get_strings = qeth_core_get_strings, | 857 | .get_strings = qeth_core_get_strings, |
868 | .get_ethtool_stats = qeth_core_get_ethtool_stats, | 858 | .get_ethtool_stats = qeth_core_get_ethtool_stats, |
869 | .get_stats_count = qeth_core_get_stats_count, | 859 | .get_sset_count = qeth_core_get_sset_count, |
870 | .get_drvinfo = qeth_core_get_drvinfo, | 860 | .get_drvinfo = qeth_core_get_drvinfo, |
871 | .get_settings = qeth_core_ethtool_get_settings, | 861 | .get_settings = qeth_core_ethtool_get_settings, |
872 | }; | 862 | }; |
@@ -874,7 +864,7 @@ static const struct ethtool_ops qeth_l2_ethtool_ops = { | |||
874 | static const struct ethtool_ops qeth_l2_osn_ops = { | 864 | static const struct ethtool_ops qeth_l2_osn_ops = { |
875 | .get_strings = qeth_core_get_strings, | 865 | .get_strings = qeth_core_get_strings, |
876 | .get_ethtool_stats = qeth_core_get_ethtool_stats, | 866 | .get_ethtool_stats = qeth_core_get_ethtool_stats, |
877 | .get_stats_count = qeth_core_get_stats_count, | 867 | .get_sset_count = qeth_core_get_sset_count, |
878 | .get_drvinfo = qeth_core_get_drvinfo, | 868 | .get_drvinfo = qeth_core_get_drvinfo, |
879 | }; | 869 | }; |
880 | 870 | ||
@@ -938,32 +928,18 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
938 | QETH_DBF_TEXT(SETUP, 2, "setonlin"); | 928 | QETH_DBF_TEXT(SETUP, 2, "setonlin"); |
939 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 929 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
940 | 930 | ||
941 | qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1); | ||
942 | recover_flag = card->state; | 931 | recover_flag = card->state; |
943 | rc = ccw_device_set_online(CARD_RDEV(card)); | ||
944 | if (rc) { | ||
945 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | ||
946 | return -EIO; | ||
947 | } | ||
948 | rc = ccw_device_set_online(CARD_WDEV(card)); | ||
949 | if (rc) { | ||
950 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | ||
951 | return -EIO; | ||
952 | } | ||
953 | rc = ccw_device_set_online(CARD_DDEV(card)); | ||
954 | if (rc) { | ||
955 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | ||
956 | return -EIO; | ||
957 | } | ||
958 | |||
959 | rc = qeth_core_hardsetup_card(card); | 932 | rc = qeth_core_hardsetup_card(card); |
960 | if (rc) { | 933 | if (rc) { |
961 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 934 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); |
935 | rc = -ENODEV; | ||
962 | goto out_remove; | 936 | goto out_remove; |
963 | } | 937 | } |
964 | 938 | ||
965 | if (!card->dev && qeth_l2_setup_netdev(card)) | 939 | if (!card->dev && qeth_l2_setup_netdev(card)) { |
940 | rc = -ENODEV; | ||
966 | goto out_remove; | 941 | goto out_remove; |
942 | } | ||
967 | 943 | ||
968 | if (card->info.type != QETH_CARD_TYPE_OSN) | 944 | if (card->info.type != QETH_CARD_TYPE_OSN) |
969 | qeth_l2_send_setmac(card, &card->dev->dev_addr[0]); | 945 | qeth_l2_send_setmac(card, &card->dev->dev_addr[0]); |
@@ -983,12 +959,14 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
983 | card->lan_online = 0; | 959 | card->lan_online = 0; |
984 | return 0; | 960 | return 0; |
985 | } | 961 | } |
962 | rc = -ENODEV; | ||
986 | goto out_remove; | 963 | goto out_remove; |
987 | } else | 964 | } else |
988 | card->lan_online = 1; | 965 | card->lan_online = 1; |
989 | 966 | ||
990 | if (card->info.type != QETH_CARD_TYPE_OSN) { | 967 | if (card->info.type != QETH_CARD_TYPE_OSN) { |
991 | qeth_set_large_send(card, card->options.large_send); | 968 | /* configure isolation level */ |
969 | qeth_set_access_ctrl_online(card); | ||
992 | qeth_l2_process_vlans(card, 0); | 970 | qeth_l2_process_vlans(card, 0); |
993 | } | 971 | } |
994 | 972 | ||
@@ -997,6 +975,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
997 | rc = qeth_init_qdio_queues(card); | 975 | rc = qeth_init_qdio_queues(card); |
998 | if (rc) { | 976 | if (rc) { |
999 | QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); | 977 | QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); |
978 | rc = -ENODEV; | ||
1000 | goto out_remove; | 979 | goto out_remove; |
1001 | } | 980 | } |
1002 | card->state = CARD_STATE_SOFTSETUP; | 981 | card->state = CARD_STATE_SOFTSETUP; |
@@ -1018,6 +997,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
1018 | /* let user_space know that device is online */ | 997 | /* let user_space know that device is online */ |
1019 | kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); | 998 | kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); |
1020 | return 0; | 999 | return 0; |
1000 | |||
1021 | out_remove: | 1001 | out_remove: |
1022 | card->use_hard_stop = 1; | 1002 | card->use_hard_stop = 1; |
1023 | qeth_l2_stop_card(card, 0); | 1003 | qeth_l2_stop_card(card, 0); |
@@ -1028,7 +1008,7 @@ out_remove: | |||
1028 | card->state = CARD_STATE_RECOVER; | 1008 | card->state = CARD_STATE_RECOVER; |
1029 | else | 1009 | else |
1030 | card->state = CARD_STATE_DOWN; | 1010 | card->state = CARD_STATE_DOWN; |
1031 | return -ENODEV; | 1011 | return rc; |
1032 | } | 1012 | } |
1033 | 1013 | ||
1034 | static int qeth_l2_set_online(struct ccwgroup_device *gdev) | 1014 | static int qeth_l2_set_online(struct ccwgroup_device *gdev) |
@@ -1092,11 +1072,9 @@ static int qeth_l2_recover(void *ptr) | |||
1092 | dev_info(&card->gdev->dev, | 1072 | dev_info(&card->gdev->dev, |
1093 | "Device successfully recovered!\n"); | 1073 | "Device successfully recovered!\n"); |
1094 | else { | 1074 | else { |
1095 | if (card->dev) { | 1075 | rtnl_lock(); |
1096 | rtnl_lock(); | 1076 | dev_close(card->dev); |
1097 | dev_close(card->dev); | 1077 | rtnl_unlock(); |
1098 | rtnl_unlock(); | ||
1099 | } | ||
1100 | dev_warn(&card->gdev->dev, "The qeth device driver " | 1078 | dev_warn(&card->gdev->dev, "The qeth device driver " |
1101 | "failed to recover an error on the device\n"); | 1079 | "failed to recover an error on the device\n"); |
1102 | } | 1080 | } |
@@ -1150,11 +1128,9 @@ static int qeth_l2_pm_resume(struct ccwgroup_device *gdev) | |||
1150 | if (card->state == CARD_STATE_RECOVER) { | 1128 | if (card->state == CARD_STATE_RECOVER) { |
1151 | rc = __qeth_l2_set_online(card->gdev, 1); | 1129 | rc = __qeth_l2_set_online(card->gdev, 1); |
1152 | if (rc) { | 1130 | if (rc) { |
1153 | if (card->dev) { | 1131 | rtnl_lock(); |
1154 | rtnl_lock(); | 1132 | dev_close(card->dev); |
1155 | dev_close(card->dev); | 1133 | rtnl_unlock(); |
1156 | rtnl_unlock(); | ||
1157 | } | ||
1158 | } | 1134 | } |
1159 | } else | 1135 | } else |
1160 | rc = __qeth_l2_set_online(card->gdev, 0); | 1136 | rc = __qeth_l2_set_online(card->gdev, 0); |