aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_l2_main.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/s390/net/qeth_l2_main.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
-rw-r--r--drivers/s390/net/qeth_l2_main.c80
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 = {
874static const struct ethtool_ops qeth_l2_osn_ops = { 864static 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
1021out_remove: 1001out_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
1034static int qeth_l2_set_online(struct ccwgroup_device *gdev) 1014static 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);