diff options
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 23aaf373f631..2914a1a69f83 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -146,11 +146,11 @@ static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac) | |||
146 | QETH_CARD_TEXT(card, 2, "L2Wmac"); | 146 | QETH_CARD_TEXT(card, 2, "L2Wmac"); |
147 | rc = qeth_l2_send_setdelmac(card, mac, cmd); | 147 | rc = qeth_l2_send_setdelmac(card, mac, cmd); |
148 | if (rc == -EEXIST) | 148 | if (rc == -EEXIST) |
149 | QETH_DBF_MESSAGE(2, "MAC %pM already registered on %s\n", | 149 | QETH_DBF_MESSAGE(2, "MAC already registered on device %x\n", |
150 | mac, QETH_CARD_IFNAME(card)); | 150 | CARD_DEVID(card)); |
151 | else if (rc) | 151 | else if (rc) |
152 | QETH_DBF_MESSAGE(2, "Failed to register MAC %pM on %s: %d\n", | 152 | QETH_DBF_MESSAGE(2, "Failed to register MAC on device %x: %d\n", |
153 | mac, QETH_CARD_IFNAME(card), rc); | 153 | CARD_DEVID(card), rc); |
154 | return rc; | 154 | return rc; |
155 | } | 155 | } |
156 | 156 | ||
@@ -163,8 +163,8 @@ static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac) | |||
163 | QETH_CARD_TEXT(card, 2, "L2Rmac"); | 163 | QETH_CARD_TEXT(card, 2, "L2Rmac"); |
164 | rc = qeth_l2_send_setdelmac(card, mac, cmd); | 164 | rc = qeth_l2_send_setdelmac(card, mac, cmd); |
165 | if (rc) | 165 | if (rc) |
166 | QETH_DBF_MESSAGE(2, "Failed to delete MAC %pM on %s: %d\n", | 166 | QETH_DBF_MESSAGE(2, "Failed to delete MAC on device %u: %d\n", |
167 | mac, QETH_CARD_IFNAME(card), rc); | 167 | CARD_DEVID(card), rc); |
168 | return rc; | 168 | return rc; |
169 | } | 169 | } |
170 | 170 | ||
@@ -260,9 +260,9 @@ static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, | |||
260 | 260 | ||
261 | QETH_CARD_TEXT(card, 2, "L2sdvcb"); | 261 | QETH_CARD_TEXT(card, 2, "L2sdvcb"); |
262 | if (cmd->hdr.return_code) { | 262 | if (cmd->hdr.return_code) { |
263 | QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x.\n", | 263 | QETH_DBF_MESSAGE(2, "Error in processing VLAN %u on device %x: %#x.\n", |
264 | cmd->data.setdelvlan.vlan_id, | 264 | cmd->data.setdelvlan.vlan_id, |
265 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 265 | CARD_DEVID(card), cmd->hdr.return_code); |
266 | QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); | 266 | QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); |
267 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); | 267 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); |
268 | } | 268 | } |
@@ -455,8 +455,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
455 | rc = qeth_vm_request_mac(card); | 455 | rc = qeth_vm_request_mac(card); |
456 | if (!rc) | 456 | if (!rc) |
457 | goto out; | 457 | goto out; |
458 | QETH_DBF_MESSAGE(2, "z/VM MAC Service failed on device %s: x%x\n", | 458 | QETH_DBF_MESSAGE(2, "z/VM MAC Service failed on device %x: %#x\n", |
459 | CARD_BUS_ID(card), rc); | 459 | CARD_DEVID(card), rc); |
460 | QETH_DBF_TEXT_(SETUP, 2, "err%04x", rc); | 460 | QETH_DBF_TEXT_(SETUP, 2, "err%04x", rc); |
461 | /* fall back to alternative mechanism: */ | 461 | /* fall back to alternative mechanism: */ |
462 | } | 462 | } |
@@ -468,8 +468,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
468 | rc = qeth_setadpparms_change_macaddr(card); | 468 | rc = qeth_setadpparms_change_macaddr(card); |
469 | if (!rc) | 469 | if (!rc) |
470 | goto out; | 470 | goto out; |
471 | QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %s: x%x\n", | 471 | QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %x: %#x\n", |
472 | CARD_BUS_ID(card), rc); | 472 | CARD_DEVID(card), rc); |
473 | QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); | 473 | QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); |
474 | /* fall back once more: */ | 474 | /* fall back once more: */ |
475 | } | 475 | } |
@@ -826,7 +826,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev) | |||
826 | 826 | ||
827 | if (cgdev->state == CCWGROUP_ONLINE) | 827 | if (cgdev->state == CCWGROUP_ONLINE) |
828 | qeth_l2_set_offline(cgdev); | 828 | qeth_l2_set_offline(cgdev); |
829 | unregister_netdev(card->dev); | 829 | if (qeth_netdev_is_registered(card->dev)) |
830 | unregister_netdev(card->dev); | ||
830 | } | 831 | } |
831 | 832 | ||
832 | static const struct ethtool_ops qeth_l2_ethtool_ops = { | 833 | static const struct ethtool_ops qeth_l2_ethtool_ops = { |
@@ -862,11 +863,11 @@ static const struct net_device_ops qeth_l2_netdev_ops = { | |||
862 | .ndo_set_features = qeth_set_features | 863 | .ndo_set_features = qeth_set_features |
863 | }; | 864 | }; |
864 | 865 | ||
865 | static int qeth_l2_setup_netdev(struct qeth_card *card) | 866 | static int qeth_l2_setup_netdev(struct qeth_card *card, bool carrier_ok) |
866 | { | 867 | { |
867 | int rc; | 868 | int rc; |
868 | 869 | ||
869 | if (card->dev->netdev_ops) | 870 | if (qeth_netdev_is_registered(card->dev)) |
870 | return 0; | 871 | return 0; |
871 | 872 | ||
872 | card->dev->priv_flags |= IFF_UNICAST_FLT; | 873 | card->dev->priv_flags |= IFF_UNICAST_FLT; |
@@ -919,6 +920,9 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) | |||
919 | qeth_l2_request_initial_mac(card); | 920 | qeth_l2_request_initial_mac(card); |
920 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); | 921 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); |
921 | rc = register_netdev(card->dev); | 922 | rc = register_netdev(card->dev); |
923 | if (!rc && carrier_ok) | ||
924 | netif_carrier_on(card->dev); | ||
925 | |||
922 | if (rc) | 926 | if (rc) |
923 | card->dev->netdev_ops = NULL; | 927 | card->dev->netdev_ops = NULL; |
924 | return rc; | 928 | return rc; |
@@ -949,6 +953,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
949 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); | 953 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
950 | int rc = 0; | 954 | int rc = 0; |
951 | enum qeth_card_states recover_flag; | 955 | enum qeth_card_states recover_flag; |
956 | bool carrier_ok; | ||
952 | 957 | ||
953 | mutex_lock(&card->discipline_mutex); | 958 | mutex_lock(&card->discipline_mutex); |
954 | mutex_lock(&card->conf_mutex); | 959 | mutex_lock(&card->conf_mutex); |
@@ -956,7 +961,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
956 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 961 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
957 | 962 | ||
958 | recover_flag = card->state; | 963 | recover_flag = card->state; |
959 | rc = qeth_core_hardsetup_card(card); | 964 | rc = qeth_core_hardsetup_card(card, &carrier_ok); |
960 | if (rc) { | 965 | if (rc) { |
961 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); | 966 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
962 | rc = -ENODEV; | 967 | rc = -ENODEV; |
@@ -967,7 +972,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
967 | dev_info(&card->gdev->dev, | 972 | dev_info(&card->gdev->dev, |
968 | "The device represents a Bridge Capable Port\n"); | 973 | "The device represents a Bridge Capable Port\n"); |
969 | 974 | ||
970 | rc = qeth_l2_setup_netdev(card); | 975 | rc = qeth_l2_setup_netdev(card, carrier_ok); |
971 | if (rc) | 976 | if (rc) |
972 | goto out_remove; | 977 | goto out_remove; |
973 | 978 | ||