diff options
author | Ursula Braun <ursula.braun@de.ibm.com> | 2010-05-16 17:15:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-05-18 01:42:55 -0400 |
commit | 5113fec0984276836cb6f0677f7cb53586ec3451 (patch) | |
tree | bfce3e11a7f16c2b393c4e663414248e18ecb4b9 /drivers | |
parent | ae57b20a0a1d3aa6cc35b51355949177de94aece (diff) |
qeth: support the new OSA CHPID types OSX and OSM
The qeth driver is enabled to support the new OSA CHPID types OSX
and OSM.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/s390/net/qeth_core.h | 28 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 224 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_mpc.h | 10 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_sys.c | 3 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 34 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 6 |
6 files changed, 194 insertions, 111 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index af661cd527df..7a44c38aaf65 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
@@ -179,25 +179,23 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa, | |||
179 | ((prot == QETH_PROT_IPV6) ? \ | 179 | ((prot == QETH_PROT_IPV6) ? \ |
180 | qeth_is_enabled6(c, f) : qeth_is_enabled(c, f)) | 180 | qeth_is_enabled6(c, f) : qeth_is_enabled(c, f)) |
181 | 181 | ||
182 | #define QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT 0x0101 | 182 | #define QETH_IDX_FUNC_LEVEL_OSD 0x0101 |
183 | #define QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT 0x0101 | ||
184 | #define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108 | 183 | #define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108 |
185 | #define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108 | 184 | #define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108 |
186 | 185 | ||
187 | #define QETH_MODELLIST_ARRAY \ | 186 | #define QETH_MODELLIST_ARRAY \ |
188 | {{0x1731, 0x01, 0x1732, 0x01, QETH_CARD_TYPE_OSAE, 1, \ | 187 | {{0x1731, 0x01, 0x1732, QETH_CARD_TYPE_OSD, QETH_MAX_QUEUES, 0}, \ |
189 | QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \ | 188 | {0x1731, 0x05, 0x1732, QETH_CARD_TYPE_IQD, QETH_MAX_QUEUES, 0x103}, \ |
190 | QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \ | 189 | {0x1731, 0x06, 0x1732, QETH_CARD_TYPE_OSN, QETH_MAX_QUEUES, 0}, \ |
191 | QETH_MAX_QUEUES, 0}, \ | 190 | {0x1731, 0x02, 0x1732, QETH_CARD_TYPE_OSM, QETH_MAX_QUEUES, 0}, \ |
192 | {0x1731, 0x05, 0x1732, 0x05, QETH_CARD_TYPE_IQD, 0, \ | 191 | {0x1731, 0x02, 0x1732, QETH_CARD_TYPE_OSX, QETH_MAX_QUEUES, 0}, \ |
193 | QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT, \ | 192 | {0, 0, 0, 0, 0, 0} } |
194 | QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT, \ | 193 | #define QETH_CU_TYPE_IND 0 |
195 | QETH_MAX_QUEUES, 0x103}, \ | 194 | #define QETH_CU_MODEL_IND 1 |
196 | {0x1731, 0x06, 0x1732, 0x06, QETH_CARD_TYPE_OSN, 0, \ | 195 | #define QETH_DEV_TYPE_IND 2 |
197 | QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \ | 196 | #define QETH_DEV_MODEL_IND 3 |
198 | QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \ | 197 | #define QETH_QUEUE_NO_IND 4 |
199 | QETH_MAX_QUEUES, 0}, \ | 198 | #define QETH_MULTICAST_IND 5 |
200 | {0, 0, 0, 0, 0, 0, 0, 0, 0} } | ||
201 | 199 | ||
202 | #define QETH_REAL_CARD 1 | 200 | #define QETH_REAL_CARD 1 |
203 | #define QETH_VLAN_CARD 2 | 201 | #define QETH_VLAN_CARD 2 |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index e862c2d8e5c0..01fe405da9fd 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -53,7 +53,7 @@ struct kmem_cache *qeth_core_header_cache; | |||
53 | EXPORT_SYMBOL_GPL(qeth_core_header_cache); | 53 | EXPORT_SYMBOL_GPL(qeth_core_header_cache); |
54 | 54 | ||
55 | static struct device *qeth_core_root_dev; | 55 | static struct device *qeth_core_root_dev; |
56 | static unsigned int known_devices[][10] = QETH_MODELLIST_ARRAY; | 56 | static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY; |
57 | static struct lock_class_key qdio_out_skb_queue_key; | 57 | static struct lock_class_key qdio_out_skb_queue_key; |
58 | 58 | ||
59 | static void qeth_send_control_data_cb(struct qeth_channel *, | 59 | static void qeth_send_control_data_cb(struct qeth_channel *, |
@@ -111,21 +111,29 @@ static inline const char *qeth_get_cardname(struct qeth_card *card) | |||
111 | { | 111 | { |
112 | if (card->info.guestlan) { | 112 | if (card->info.guestlan) { |
113 | switch (card->info.type) { | 113 | switch (card->info.type) { |
114 | case QETH_CARD_TYPE_OSAE: | 114 | case QETH_CARD_TYPE_OSD: |
115 | return " Guest LAN QDIO"; | 115 | return " Guest LAN QDIO"; |
116 | case QETH_CARD_TYPE_IQD: | 116 | case QETH_CARD_TYPE_IQD: |
117 | return " Guest LAN Hiper"; | 117 | return " Guest LAN Hiper"; |
118 | case QETH_CARD_TYPE_OSM: | ||
119 | return " Guest LAN QDIO - OSM"; | ||
120 | case QETH_CARD_TYPE_OSX: | ||
121 | return " Guest LAN QDIO - OSX"; | ||
118 | default: | 122 | default: |
119 | return " unknown"; | 123 | return " unknown"; |
120 | } | 124 | } |
121 | } else { | 125 | } else { |
122 | switch (card->info.type) { | 126 | switch (card->info.type) { |
123 | case QETH_CARD_TYPE_OSAE: | 127 | case QETH_CARD_TYPE_OSD: |
124 | return " OSD Express"; | 128 | return " OSD Express"; |
125 | case QETH_CARD_TYPE_IQD: | 129 | case QETH_CARD_TYPE_IQD: |
126 | return " HiperSockets"; | 130 | return " HiperSockets"; |
127 | case QETH_CARD_TYPE_OSN: | 131 | case QETH_CARD_TYPE_OSN: |
128 | return " OSN QDIO"; | 132 | return " OSN QDIO"; |
133 | case QETH_CARD_TYPE_OSM: | ||
134 | return " OSM QDIO"; | ||
135 | case QETH_CARD_TYPE_OSX: | ||
136 | return " OSX QDIO"; | ||
129 | default: | 137 | default: |
130 | return " unknown"; | 138 | return " unknown"; |
131 | } | 139 | } |
@@ -138,16 +146,20 @@ const char *qeth_get_cardname_short(struct qeth_card *card) | |||
138 | { | 146 | { |
139 | if (card->info.guestlan) { | 147 | if (card->info.guestlan) { |
140 | switch (card->info.type) { | 148 | switch (card->info.type) { |
141 | case QETH_CARD_TYPE_OSAE: | 149 | case QETH_CARD_TYPE_OSD: |
142 | return "GuestLAN QDIO"; | 150 | return "GuestLAN QDIO"; |
143 | case QETH_CARD_TYPE_IQD: | 151 | case QETH_CARD_TYPE_IQD: |
144 | return "GuestLAN Hiper"; | 152 | return "GuestLAN Hiper"; |
153 | case QETH_CARD_TYPE_OSM: | ||
154 | return "GuestLAN OSM"; | ||
155 | case QETH_CARD_TYPE_OSX: | ||
156 | return "GuestLAN OSX"; | ||
145 | default: | 157 | default: |
146 | return "unknown"; | 158 | return "unknown"; |
147 | } | 159 | } |
148 | } else { | 160 | } else { |
149 | switch (card->info.type) { | 161 | switch (card->info.type) { |
150 | case QETH_CARD_TYPE_OSAE: | 162 | case QETH_CARD_TYPE_OSD: |
151 | switch (card->info.link_type) { | 163 | switch (card->info.link_type) { |
152 | case QETH_LINK_TYPE_FAST_ETH: | 164 | case QETH_LINK_TYPE_FAST_ETH: |
153 | return "OSD_100"; | 165 | return "OSD_100"; |
@@ -172,6 +184,10 @@ const char *qeth_get_cardname_short(struct qeth_card *card) | |||
172 | return "HiperSockets"; | 184 | return "HiperSockets"; |
173 | case QETH_CARD_TYPE_OSN: | 185 | case QETH_CARD_TYPE_OSN: |
174 | return "OSN"; | 186 | return "OSN"; |
187 | case QETH_CARD_TYPE_OSM: | ||
188 | return "OSM_1000"; | ||
189 | case QETH_CARD_TYPE_OSX: | ||
190 | return "OSX_10GIG"; | ||
175 | default: | 191 | default: |
176 | return "unknown"; | 192 | return "unknown"; |
177 | } | 193 | } |
@@ -419,7 +435,8 @@ void qeth_clear_ipacmd_list(struct qeth_card *card) | |||
419 | } | 435 | } |
420 | EXPORT_SYMBOL_GPL(qeth_clear_ipacmd_list); | 436 | EXPORT_SYMBOL_GPL(qeth_clear_ipacmd_list); |
421 | 437 | ||
422 | static int qeth_check_idx_response(unsigned char *buffer) | 438 | static int qeth_check_idx_response(struct qeth_card *card, |
439 | unsigned char *buffer) | ||
423 | { | 440 | { |
424 | if (!buffer) | 441 | if (!buffer) |
425 | return 0; | 442 | return 0; |
@@ -434,6 +451,12 @@ static int qeth_check_idx_response(unsigned char *buffer) | |||
434 | QETH_DBF_TEXT(TRACE, 2, "ckidxres"); | 451 | QETH_DBF_TEXT(TRACE, 2, "ckidxres"); |
435 | QETH_DBF_TEXT(TRACE, 2, " idxterm"); | 452 | QETH_DBF_TEXT(TRACE, 2, " idxterm"); |
436 | QETH_DBF_TEXT_(TRACE, 2, " rc%d", -EIO); | 453 | QETH_DBF_TEXT_(TRACE, 2, " rc%d", -EIO); |
454 | if (buffer[4] == 0xf6) { | ||
455 | dev_err(&card->gdev->dev, | ||
456 | "The qeth device is not configured " | ||
457 | "for the OSI layer required by z/VM\n"); | ||
458 | return -EPERM; | ||
459 | } | ||
437 | return -EIO; | 460 | return -EIO; |
438 | } | 461 | } |
439 | return 0; | 462 | return 0; |
@@ -528,18 +551,19 @@ static void qeth_send_control_data_cb(struct qeth_channel *channel, | |||
528 | struct qeth_ipa_cmd *cmd; | 551 | struct qeth_ipa_cmd *cmd; |
529 | unsigned long flags; | 552 | unsigned long flags; |
530 | int keep_reply; | 553 | int keep_reply; |
554 | int rc = 0; | ||
531 | 555 | ||
532 | QETH_DBF_TEXT(TRACE, 4, "sndctlcb"); | 556 | QETH_DBF_TEXT(TRACE, 4, "sndctlcb"); |
533 | 557 | ||
534 | card = CARD_FROM_CDEV(channel->ccwdev); | 558 | card = CARD_FROM_CDEV(channel->ccwdev); |
535 | if (qeth_check_idx_response(iob->data)) { | 559 | rc = qeth_check_idx_response(card, iob->data); |
560 | switch (rc) { | ||
561 | case 0: | ||
562 | break; | ||
563 | case -EIO: | ||
536 | qeth_clear_ipacmd_list(card); | 564 | qeth_clear_ipacmd_list(card); |
537 | if (((iob->data[2] & 0xc0) == 0xc0) && iob->data[4] == 0xf6) | 565 | qeth_schedule_recovery(card); |
538 | dev_err(&card->gdev->dev, | 566 | default: |
539 | "The qeth device is not configured " | ||
540 | "for the OSI layer required by z/VM\n"); | ||
541 | else | ||
542 | qeth_schedule_recovery(card); | ||
543 | goto out; | 567 | goto out; |
544 | } | 568 | } |
545 | 569 | ||
@@ -719,7 +743,7 @@ static int qeth_get_problem(struct ccw_device *cdev, struct irb *irb) | |||
719 | QETH_DBF_TEXT(TRACE, 2, "CGENCHK"); | 743 | QETH_DBF_TEXT(TRACE, 2, "CGENCHK"); |
720 | dev_warn(&cdev->dev, "The qeth device driver " | 744 | dev_warn(&cdev->dev, "The qeth device driver " |
721 | "failed to recover an error on the device\n"); | 745 | "failed to recover an error on the device\n"); |
722 | QETH_DBF_MESSAGE(2, "%s check on device dstat=x%x, cstat=x%x ", | 746 | QETH_DBF_MESSAGE(2, "%s check on device dstat=x%x, cstat=x%x\n", |
723 | dev_name(&cdev->dev), dstat, cstat); | 747 | dev_name(&cdev->dev), dstat, cstat); |
724 | print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET, | 748 | print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET, |
725 | 16, 1, irb, 64, 1); | 749 | 16, 1, irb, 64, 1); |
@@ -998,9 +1022,8 @@ static void qeth_clean_channel(struct qeth_channel *channel) | |||
998 | kfree(channel->iob[cnt].data); | 1022 | kfree(channel->iob[cnt].data); |
999 | } | 1023 | } |
1000 | 1024 | ||
1001 | static int qeth_is_1920_device(struct qeth_card *card) | 1025 | static void qeth_get_channel_path_desc(struct qeth_card *card) |
1002 | { | 1026 | { |
1003 | int single_queue = 0; | ||
1004 | struct ccw_device *ccwdev; | 1027 | struct ccw_device *ccwdev; |
1005 | struct channelPath_dsc { | 1028 | struct channelPath_dsc { |
1006 | u8 flags; | 1029 | u8 flags; |
@@ -1013,17 +1036,25 @@ static int qeth_is_1920_device(struct qeth_card *card) | |||
1013 | u8 chpp; | 1036 | u8 chpp; |
1014 | } *chp_dsc; | 1037 | } *chp_dsc; |
1015 | 1038 | ||
1016 | QETH_DBF_TEXT(SETUP, 2, "chk_1920"); | 1039 | QETH_DBF_TEXT(SETUP, 2, "chp_desc"); |
1017 | 1040 | ||
1018 | ccwdev = card->data.ccwdev; | 1041 | ccwdev = card->data.ccwdev; |
1019 | chp_dsc = (struct channelPath_dsc *)ccw_device_get_chp_desc(ccwdev, 0); | 1042 | chp_dsc = (struct channelPath_dsc *)ccw_device_get_chp_desc(ccwdev, 0); |
1020 | if (chp_dsc != NULL) { | 1043 | if (chp_dsc != NULL) { |
1021 | /* CHPP field bit 6 == 1 -> single queue */ | 1044 | /* CHPP field bit 6 == 1 -> single queue */ |
1022 | single_queue = ((chp_dsc->chpp & 0x02) == 0x02); | 1045 | if ((chp_dsc->chpp & 0x02) == 0x02) |
1046 | card->qdio.no_out_queues = 1; | ||
1047 | card->info.func_level = 0x4100 + chp_dsc->desc; | ||
1023 | kfree(chp_dsc); | 1048 | kfree(chp_dsc); |
1024 | } | 1049 | } |
1025 | QETH_DBF_TEXT_(SETUP, 2, "rc:%x", single_queue); | 1050 | if (card->qdio.no_out_queues == 1) { |
1026 | return single_queue; | 1051 | card->qdio.default_out_queue = 0; |
1052 | dev_info(&card->gdev->dev, | ||
1053 | "Priority Queueing not supported\n"); | ||
1054 | } | ||
1055 | QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues); | ||
1056 | QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level); | ||
1057 | return; | ||
1027 | } | 1058 | } |
1028 | 1059 | ||
1029 | static void qeth_init_qdio_info(struct qeth_card *card) | 1060 | static void qeth_init_qdio_info(struct qeth_card *card) |
@@ -1171,18 +1202,17 @@ static int qeth_determine_card_type(struct qeth_card *card) | |||
1171 | 1202 | ||
1172 | card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; | 1203 | card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; |
1173 | card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; | 1204 | card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; |
1174 | while (known_devices[i][4]) { | 1205 | while (known_devices[i][QETH_DEV_MODEL_IND]) { |
1175 | if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) && | 1206 | if ((CARD_RDEV(card)->id.dev_type == |
1176 | (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) { | 1207 | known_devices[i][QETH_DEV_TYPE_IND]) && |
1177 | card->info.type = known_devices[i][4]; | 1208 | (CARD_RDEV(card)->id.dev_model == |
1178 | card->qdio.no_out_queues = known_devices[i][8]; | 1209 | known_devices[i][QETH_DEV_MODEL_IND])) { |
1179 | card->info.is_multicast_different = known_devices[i][9]; | 1210 | card->info.type = known_devices[i][QETH_DEV_MODEL_IND]; |
1180 | if (qeth_is_1920_device(card)) { | 1211 | card->qdio.no_out_queues = |
1181 | dev_info(&card->gdev->dev, | 1212 | known_devices[i][QETH_QUEUE_NO_IND]; |
1182 | "Priority Queueing not supported\n"); | 1213 | card->info.is_multicast_different = |
1183 | card->qdio.no_out_queues = 1; | 1214 | known_devices[i][QETH_MULTICAST_IND]; |
1184 | card->qdio.default_out_queue = 0; | 1215 | qeth_get_channel_path_desc(card); |
1185 | } | ||
1186 | return 0; | 1216 | return 0; |
1187 | } | 1217 | } |
1188 | i++; | 1218 | i++; |
@@ -1399,22 +1429,20 @@ static void qeth_init_tokens(struct qeth_card *card) | |||
1399 | 1429 | ||
1400 | static void qeth_init_func_level(struct qeth_card *card) | 1430 | static void qeth_init_func_level(struct qeth_card *card) |
1401 | { | 1431 | { |
1402 | if (card->ipato.enabled) { | 1432 | switch (card->info.type) { |
1403 | if (card->info.type == QETH_CARD_TYPE_IQD) | 1433 | case QETH_CARD_TYPE_IQD: |
1404 | card->info.func_level = | 1434 | if (card->ipato.enabled) |
1405 | QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT; | ||
1406 | else | ||
1407 | card->info.func_level = | ||
1408 | QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT; | ||
1409 | } else { | ||
1410 | if (card->info.type == QETH_CARD_TYPE_IQD) | ||
1411 | /*FIXME:why do we have same values for dis and ena for | ||
1412 | osae??? */ | ||
1413 | card->info.func_level = | 1435 | card->info.func_level = |
1414 | QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT; | 1436 | QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT; |
1415 | else | 1437 | else |
1416 | card->info.func_level = | 1438 | card->info.func_level = |
1417 | QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT; | 1439 | QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT; |
1440 | break; | ||
1441 | case QETH_CARD_TYPE_OSD: | ||
1442 | card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD; | ||
1443 | break; | ||
1444 | default: | ||
1445 | break; | ||
1418 | } | 1446 | } |
1419 | } | 1447 | } |
1420 | 1448 | ||
@@ -1561,7 +1589,7 @@ static void qeth_idx_write_cb(struct qeth_channel *channel, | |||
1561 | card = CARD_FROM_CDEV(channel->ccwdev); | 1589 | card = CARD_FROM_CDEV(channel->ccwdev); |
1562 | 1590 | ||
1563 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { | 1591 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { |
1564 | if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == 0x19) | 1592 | if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == QETH_IDX_ACT_ERR_EXCL) |
1565 | dev_err(&card->write.ccwdev->dev, | 1593 | dev_err(&card->write.ccwdev->dev, |
1566 | "The adapter is used exclusively by another " | 1594 | "The adapter is used exclusively by another " |
1567 | "host\n"); | 1595 | "host\n"); |
@@ -1597,27 +1625,35 @@ static void qeth_idx_read_cb(struct qeth_channel *channel, | |||
1597 | } | 1625 | } |
1598 | 1626 | ||
1599 | card = CARD_FROM_CDEV(channel->ccwdev); | 1627 | card = CARD_FROM_CDEV(channel->ccwdev); |
1600 | if (qeth_check_idx_response(iob->data)) | 1628 | if (qeth_check_idx_response(card, iob->data)) |
1601 | goto out; | 1629 | goto out; |
1602 | 1630 | ||
1603 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { | 1631 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { |
1604 | if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == 0x19) | 1632 | switch (QETH_IDX_ACT_CAUSE_CODE(iob->data)) { |
1633 | case QETH_IDX_ACT_ERR_EXCL: | ||
1605 | dev_err(&card->write.ccwdev->dev, | 1634 | dev_err(&card->write.ccwdev->dev, |
1606 | "The adapter is used exclusively by another " | 1635 | "The adapter is used exclusively by another " |
1607 | "host\n"); | 1636 | "host\n"); |
1608 | else | 1637 | break; |
1638 | case QETH_IDX_ACT_ERR_AUTH: | ||
1639 | dev_err(&card->read.ccwdev->dev, | ||
1640 | "Setting the device online failed because of " | ||
1641 | "insufficient LPAR authorization\n"); | ||
1642 | break; | ||
1643 | default: | ||
1609 | QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel:" | 1644 | QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel:" |
1610 | " negative reply\n", | 1645 | " negative reply\n", |
1611 | dev_name(&card->read.ccwdev->dev)); | 1646 | dev_name(&card->read.ccwdev->dev)); |
1647 | } | ||
1612 | goto out; | 1648 | goto out; |
1613 | } | 1649 | } |
1614 | 1650 | ||
1615 | /** | 1651 | /** |
1616 | * temporary fix for microcode bug | 1652 | * * temporary fix for microcode bug |
1617 | * to revert it,replace OR by AND | 1653 | * * to revert it,replace OR by AND |
1618 | */ | 1654 | * */ |
1619 | if ((!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) || | 1655 | if ((!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) || |
1620 | (card->info.type == QETH_CARD_TYPE_OSAE)) | 1656 | (card->info.type == QETH_CARD_TYPE_OSD)) |
1621 | card->info.portname_required = 1; | 1657 | card->info.portname_required = 1; |
1622 | 1658 | ||
1623 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); | 1659 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); |
@@ -1826,7 +1862,7 @@ static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card) | |||
1826 | return 1500; | 1862 | return 1500; |
1827 | case QETH_CARD_TYPE_IQD: | 1863 | case QETH_CARD_TYPE_IQD: |
1828 | return card->info.max_mtu; | 1864 | return card->info.max_mtu; |
1829 | case QETH_CARD_TYPE_OSAE: | 1865 | case QETH_CARD_TYPE_OSD: |
1830 | switch (card->info.link_type) { | 1866 | switch (card->info.link_type) { |
1831 | case QETH_LINK_TYPE_HSTR: | 1867 | case QETH_LINK_TYPE_HSTR: |
1832 | case QETH_LINK_TYPE_LANE_TR: | 1868 | case QETH_LINK_TYPE_LANE_TR: |
@@ -1834,6 +1870,9 @@ static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card) | |||
1834 | default: | 1870 | default: |
1835 | return 1492; | 1871 | return 1492; |
1836 | } | 1872 | } |
1873 | case QETH_CARD_TYPE_OSM: | ||
1874 | case QETH_CARD_TYPE_OSX: | ||
1875 | return 1492; | ||
1837 | default: | 1876 | default: |
1838 | return 1500; | 1877 | return 1500; |
1839 | } | 1878 | } |
@@ -1844,8 +1883,10 @@ static inline int qeth_get_max_mtu_for_card(int cardtype) | |||
1844 | switch (cardtype) { | 1883 | switch (cardtype) { |
1845 | 1884 | ||
1846 | case QETH_CARD_TYPE_UNKNOWN: | 1885 | case QETH_CARD_TYPE_UNKNOWN: |
1847 | case QETH_CARD_TYPE_OSAE: | 1886 | case QETH_CARD_TYPE_OSD: |
1848 | case QETH_CARD_TYPE_OSN: | 1887 | case QETH_CARD_TYPE_OSN: |
1888 | case QETH_CARD_TYPE_OSM: | ||
1889 | case QETH_CARD_TYPE_OSX: | ||
1849 | return 61440; | 1890 | return 61440; |
1850 | case QETH_CARD_TYPE_IQD: | 1891 | case QETH_CARD_TYPE_IQD: |
1851 | return 57344; | 1892 | return 57344; |
@@ -1883,7 +1924,9 @@ static inline int qeth_get_mtu_outof_framesize(int framesize) | |||
1883 | static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu) | 1924 | static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu) |
1884 | { | 1925 | { |
1885 | switch (card->info.type) { | 1926 | switch (card->info.type) { |
1886 | case QETH_CARD_TYPE_OSAE: | 1927 | case QETH_CARD_TYPE_OSD: |
1928 | case QETH_CARD_TYPE_OSM: | ||
1929 | case QETH_CARD_TYPE_OSX: | ||
1887 | return ((mtu >= 576) && (mtu <= 61440)); | 1930 | return ((mtu >= 576) && (mtu <= 61440)); |
1888 | case QETH_CARD_TYPE_IQD: | 1931 | case QETH_CARD_TYPE_IQD: |
1889 | return ((mtu >= 576) && | 1932 | return ((mtu >= 576) && |
@@ -1934,6 +1977,7 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply, | |||
1934 | card->info.link_type = link_type; | 1977 | card->info.link_type = link_type; |
1935 | } else | 1978 | } else |
1936 | card->info.link_type = 0; | 1979 | card->info.link_type = 0; |
1980 | QETH_DBF_TEXT_(SETUP, 2, "link%d", link_type); | ||
1937 | QETH_DBF_TEXT_(SETUP, 2, " rc%d", iob->rc); | 1981 | QETH_DBF_TEXT_(SETUP, 2, " rc%d", iob->rc); |
1938 | return 0; | 1982 | return 0; |
1939 | } | 1983 | } |
@@ -2246,7 +2290,9 @@ static void qeth_print_status_no_portname(struct qeth_card *card) | |||
2246 | void qeth_print_status_message(struct qeth_card *card) | 2290 | void qeth_print_status_message(struct qeth_card *card) |
2247 | { | 2291 | { |
2248 | switch (card->info.type) { | 2292 | switch (card->info.type) { |
2249 | case QETH_CARD_TYPE_OSAE: | 2293 | case QETH_CARD_TYPE_OSD: |
2294 | case QETH_CARD_TYPE_OSM: | ||
2295 | case QETH_CARD_TYPE_OSX: | ||
2250 | /* VM will use a non-zero first character | 2296 | /* VM will use a non-zero first character |
2251 | * to indicate a HiperSockets like reporting | 2297 | * to indicate a HiperSockets like reporting |
2252 | * of the level OSA sets the first character to zero | 2298 | * of the level OSA sets the first character to zero |
@@ -2553,9 +2599,11 @@ static int qeth_query_setadapterparms_cb(struct qeth_card *card, | |||
2553 | QETH_DBF_TEXT(TRACE, 3, "quyadpcb"); | 2599 | QETH_DBF_TEXT(TRACE, 3, "quyadpcb"); |
2554 | 2600 | ||
2555 | cmd = (struct qeth_ipa_cmd *) data; | 2601 | cmd = (struct qeth_ipa_cmd *) data; |
2556 | if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) | 2602 | if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) { |
2557 | card->info.link_type = | 2603 | card->info.link_type = |
2558 | cmd->data.setadapterparms.data.query_cmds_supp.lan_type; | 2604 | cmd->data.setadapterparms.data.query_cmds_supp.lan_type; |
2605 | QETH_DBF_TEXT_(SETUP, 2, "lnk %d", card->info.link_type); | ||
2606 | } | ||
2559 | card->options.adp.supported_funcs = | 2607 | card->options.adp.supported_funcs = |
2560 | cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds; | 2608 | cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds; |
2561 | return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); | 2609 | return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); |
@@ -2945,7 +2993,8 @@ EXPORT_SYMBOL_GPL(qeth_qdio_output_handler); | |||
2945 | int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb, | 2993 | int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb, |
2946 | int ipv, int cast_type) | 2994 | int ipv, int cast_type) |
2947 | { | 2995 | { |
2948 | if (!ipv && (card->info.type == QETH_CARD_TYPE_OSAE)) | 2996 | if (!ipv && (card->info.type == QETH_CARD_TYPE_OSD || |
2997 | card->info.type == QETH_CARD_TYPE_OSX)) | ||
2949 | return card->qdio.default_out_queue; | 2998 | return card->qdio.default_out_queue; |
2950 | switch (card->qdio.no_out_queues) { | 2999 | switch (card->qdio.no_out_queues) { |
2951 | case 4: | 3000 | case 4: |
@@ -3507,13 +3556,14 @@ int qeth_set_access_ctrl_online(struct qeth_card *card) | |||
3507 | 3556 | ||
3508 | QETH_DBF_TEXT(TRACE, 4, "setactlo"); | 3557 | QETH_DBF_TEXT(TRACE, 4, "setactlo"); |
3509 | 3558 | ||
3510 | if (card->info.type == QETH_CARD_TYPE_OSAE && | 3559 | if ((card->info.type == QETH_CARD_TYPE_OSD || |
3511 | qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) { | 3560 | card->info.type == QETH_CARD_TYPE_OSX) && |
3561 | qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) { | ||
3512 | rc = qeth_setadpparms_set_access_ctrl(card, | 3562 | rc = qeth_setadpparms_set_access_ctrl(card, |
3513 | card->options.isolation); | 3563 | card->options.isolation); |
3514 | if (rc) { | 3564 | if (rc) { |
3515 | QETH_DBF_MESSAGE(3, | 3565 | QETH_DBF_MESSAGE(3, |
3516 | "IPA(SET_ACCESS_CTRL,%s,%d) sent failed", | 3566 | "IPA(SET_ACCESS_CTRL,%s,%d) sent failed\n", |
3517 | card->gdev->dev.kobj.name, | 3567 | card->gdev->dev.kobj.name, |
3518 | rc); | 3568 | rc); |
3519 | } | 3569 | } |
@@ -3845,9 +3895,16 @@ static void qeth_core_free_card(struct qeth_card *card) | |||
3845 | } | 3895 | } |
3846 | 3896 | ||
3847 | static struct ccw_device_id qeth_ids[] = { | 3897 | static struct ccw_device_id qeth_ids[] = { |
3848 | {CCW_DEVICE(0x1731, 0x01), .driver_info = QETH_CARD_TYPE_OSAE}, | 3898 | {CCW_DEVICE_DEVTYPE(0x1731, 0x01, 0x1732, 0x01), |
3849 | {CCW_DEVICE(0x1731, 0x05), .driver_info = QETH_CARD_TYPE_IQD}, | 3899 | .driver_info = QETH_CARD_TYPE_OSD}, |
3850 | {CCW_DEVICE(0x1731, 0x06), .driver_info = QETH_CARD_TYPE_OSN}, | 3900 | {CCW_DEVICE_DEVTYPE(0x1731, 0x05, 0x1732, 0x05), |
3901 | .driver_info = QETH_CARD_TYPE_IQD}, | ||
3902 | {CCW_DEVICE_DEVTYPE(0x1731, 0x06, 0x1732, 0x06), | ||
3903 | .driver_info = QETH_CARD_TYPE_OSN}, | ||
3904 | {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x03), | ||
3905 | .driver_info = QETH_CARD_TYPE_OSM}, | ||
3906 | {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x02), | ||
3907 | .driver_info = QETH_CARD_TYPE_OSX}, | ||
3851 | {}, | 3908 | {}, |
3852 | }; | 3909 | }; |
3853 | MODULE_DEVICE_TABLE(ccw, qeth_ids); | 3910 | MODULE_DEVICE_TABLE(ccw, qeth_ids); |
@@ -4251,25 +4308,25 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
4251 | goto err_card; | 4308 | goto err_card; |
4252 | } | 4309 | } |
4253 | 4310 | ||
4254 | if (card->info.type == QETH_CARD_TYPE_OSN) { | 4311 | if (card->info.type == QETH_CARD_TYPE_OSN) |
4255 | rc = qeth_core_create_osn_attributes(dev); | 4312 | rc = qeth_core_create_osn_attributes(dev); |
4256 | if (rc) | 4313 | else |
4257 | goto err_card; | 4314 | rc = qeth_core_create_device_attributes(dev); |
4315 | if (rc) | ||
4316 | goto err_card; | ||
4317 | switch (card->info.type) { | ||
4318 | case QETH_CARD_TYPE_OSN: | ||
4319 | case QETH_CARD_TYPE_OSM: | ||
4258 | rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); | 4320 | rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); |
4259 | if (rc) { | 4321 | if (rc) |
4260 | qeth_core_remove_osn_attributes(dev); | 4322 | goto err_attr; |
4261 | goto err_card; | ||
4262 | } | ||
4263 | rc = card->discipline.ccwgdriver->probe(card->gdev); | 4323 | rc = card->discipline.ccwgdriver->probe(card->gdev); |
4264 | if (rc) { | ||
4265 | qeth_core_free_discipline(card); | ||
4266 | qeth_core_remove_osn_attributes(dev); | ||
4267 | goto err_card; | ||
4268 | } | ||
4269 | } else { | ||
4270 | rc = qeth_core_create_device_attributes(dev); | ||
4271 | if (rc) | 4324 | if (rc) |
4272 | goto err_card; | 4325 | goto err_disc; |
4326 | case QETH_CARD_TYPE_OSD: | ||
4327 | case QETH_CARD_TYPE_OSX: | ||
4328 | default: | ||
4329 | break; | ||
4273 | } | 4330 | } |
4274 | 4331 | ||
4275 | write_lock_irqsave(&qeth_core_card_list.rwlock, flags); | 4332 | write_lock_irqsave(&qeth_core_card_list.rwlock, flags); |
@@ -4279,6 +4336,13 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
4279 | qeth_determine_capabilities(card); | 4336 | qeth_determine_capabilities(card); |
4280 | return 0; | 4337 | return 0; |
4281 | 4338 | ||
4339 | err_disc: | ||
4340 | qeth_core_free_discipline(card); | ||
4341 | err_attr: | ||
4342 | if (card->info.type == QETH_CARD_TYPE_OSN) | ||
4343 | qeth_core_remove_osn_attributes(dev); | ||
4344 | else | ||
4345 | qeth_core_remove_device_attributes(dev); | ||
4282 | err_card: | 4346 | err_card: |
4283 | qeth_core_free_card(card); | 4347 | qeth_core_free_card(card); |
4284 | err_dev: | 4348 | err_dev: |
diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h index 104a3351e02b..f9ed24de7514 100644 --- a/drivers/s390/net/qeth_core_mpc.h +++ b/drivers/s390/net/qeth_core_mpc.h | |||
@@ -48,9 +48,11 @@ extern unsigned char IPA_PDU_HEADER[]; | |||
48 | 48 | ||
49 | enum qeth_card_types { | 49 | enum qeth_card_types { |
50 | QETH_CARD_TYPE_UNKNOWN = 0, | 50 | QETH_CARD_TYPE_UNKNOWN = 0, |
51 | QETH_CARD_TYPE_OSAE = 10, | 51 | QETH_CARD_TYPE_OSD = 1, |
52 | QETH_CARD_TYPE_IQD = 1234, | 52 | QETH_CARD_TYPE_IQD = 5, |
53 | QETH_CARD_TYPE_OSN = 11, | 53 | QETH_CARD_TYPE_OSN = 6, |
54 | QETH_CARD_TYPE_OSM = 3, | ||
55 | QETH_CARD_TYPE_OSX = 2, | ||
54 | }; | 56 | }; |
55 | 57 | ||
56 | #define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18 | 58 | #define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18 |
@@ -614,6 +616,8 @@ extern unsigned char IDX_ACTIVATE_WRITE[]; | |||
614 | #define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08] & 3) == 2) | 616 | #define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08] & 3) == 2) |
615 | #define QETH_IDX_REPLY_LEVEL(buffer) (buffer + 0x12) | 617 | #define QETH_IDX_REPLY_LEVEL(buffer) (buffer + 0x12) |
616 | #define QETH_IDX_ACT_CAUSE_CODE(buffer) (buffer)[0x09] | 618 | #define QETH_IDX_ACT_CAUSE_CODE(buffer) (buffer)[0x09] |
619 | #define QETH_IDX_ACT_ERR_EXCL 0x19 | ||
620 | #define QETH_IDX_ACT_ERR_AUTH 0x1E | ||
617 | 621 | ||
618 | #define PDU_ENCAPSULATION(buffer) \ | 622 | #define PDU_ENCAPSULATION(buffer) \ |
619 | (buffer + *(buffer + (*(buffer + 0x0b)) + \ | 623 | (buffer + *(buffer + (*(buffer + 0x0b)) + \ |
diff --git a/drivers/s390/net/qeth_core_sys.c b/drivers/s390/net/qeth_core_sys.c index cbac4050afb2..2eb022ff2610 100644 --- a/drivers/s390/net/qeth_core_sys.c +++ b/drivers/s390/net/qeth_core_sys.c | |||
@@ -490,7 +490,8 @@ static ssize_t qeth_dev_isolation_store(struct device *dev, | |||
490 | 490 | ||
491 | mutex_lock(&card->conf_mutex); | 491 | mutex_lock(&card->conf_mutex); |
492 | /* check for unknown, too, in case we do not yet know who we are */ | 492 | /* check for unknown, too, in case we do not yet know who we are */ |
493 | if (card->info.type != QETH_CARD_TYPE_OSAE && | 493 | if (card->info.type != QETH_CARD_TYPE_OSD && |
494 | card->info.type != QETH_CARD_TYPE_OSX && | ||
494 | card->info.type != QETH_CARD_TYPE_UNKNOWN) { | 495 | card->info.type != QETH_CARD_TYPE_UNKNOWN) { |
495 | rc = -EOPNOTSUPP; | 496 | rc = -EOPNOTSUPP; |
496 | dev_err(&card->gdev->dev, "Adapter does not " | 497 | dev_err(&card->gdev->dev, "Adapter does not " |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index b447e1998c6b..d43f57a4ac66 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -56,7 +56,9 @@ static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
56 | rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); | 56 | rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); |
57 | break; | 57 | break; |
58 | case SIOC_QETH_GET_CARD_TYPE: | 58 | case SIOC_QETH_GET_CARD_TYPE: |
59 | if ((card->info.type == QETH_CARD_TYPE_OSAE) && | 59 | if ((card->info.type == QETH_CARD_TYPE_OSD || |
60 | card->info.type == QETH_CARD_TYPE_OSM || | ||
61 | card->info.type == QETH_CARD_TYPE_OSX) && | ||
60 | !card->info.guestlan) | 62 | !card->info.guestlan) |
61 | return 1; | 63 | return 1; |
62 | return 0; | 64 | return 0; |
@@ -309,6 +311,10 @@ static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | |||
309 | struct qeth_vlan_vid *id; | 311 | struct qeth_vlan_vid *id; |
310 | 312 | ||
311 | QETH_DBF_TEXT_(TRACE, 4, "aid:%d", vid); | 313 | QETH_DBF_TEXT_(TRACE, 4, "aid:%d", vid); |
314 | if (card->info.type == QETH_CARD_TYPE_OSM) { | ||
315 | QETH_DBF_TEXT(TRACE, 3, "aidOSM"); | ||
316 | return; | ||
317 | } | ||
312 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | 318 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { |
313 | QETH_DBF_TEXT(TRACE, 3, "aidREC"); | 319 | QETH_DBF_TEXT(TRACE, 3, "aidREC"); |
314 | return; | 320 | return; |
@@ -329,6 +335,10 @@ static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
329 | struct qeth_card *card = dev->ml_priv; | 335 | struct qeth_card *card = dev->ml_priv; |
330 | 336 | ||
331 | QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid); | 337 | QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid); |
338 | if (card->info.type == QETH_CARD_TYPE_OSM) { | ||
339 | QETH_DBF_TEXT(TRACE, 3, "kidOSM"); | ||
340 | return; | ||
341 | } | ||
332 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | 342 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { |
333 | QETH_DBF_TEXT(TRACE, 3, "kidREC"); | 343 | QETH_DBF_TEXT(TRACE, 3, "kidREC"); |
334 | return; | 344 | return; |
@@ -559,8 +569,10 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
559 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 569 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
560 | } | 570 | } |
561 | 571 | ||
562 | if ((card->info.type == QETH_CARD_TYPE_IQD) || | 572 | if (card->info.type == QETH_CARD_TYPE_IQD || |
563 | (card->info.guestlan)) { | 573 | card->info.type == QETH_CARD_TYPE_OSM || |
574 | card->info.type == QETH_CARD_TYPE_OSX || | ||
575 | card->info.guestlan) { | ||
564 | rc = qeth_setadpparms_change_macaddr(card); | 576 | rc = qeth_setadpparms_change_macaddr(card); |
565 | if (rc) { | 577 | if (rc) { |
566 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " | 578 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " |
@@ -589,8 +601,10 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
589 | return -EOPNOTSUPP; | 601 | return -EOPNOTSUPP; |
590 | } | 602 | } |
591 | 603 | ||
592 | if (card->info.type == QETH_CARD_TYPE_OSN) { | 604 | if (card->info.type == QETH_CARD_TYPE_OSN || |
593 | QETH_DBF_TEXT(TRACE, 3, "setmcOSN"); | 605 | card->info.type == QETH_CARD_TYPE_OSM || |
606 | card->info.type == QETH_CARD_TYPE_OSX) { | ||
607 | QETH_DBF_TEXT(TRACE, 3, "setmcTYP"); | ||
594 | return -EOPNOTSUPP; | 608 | return -EOPNOTSUPP; |
595 | } | 609 | } |
596 | QETH_DBF_TEXT_(TRACE, 3, "%s", CARD_BUS_ID(card)); | 610 | QETH_DBF_TEXT_(TRACE, 3, "%s", CARD_BUS_ID(card)); |
@@ -885,9 +899,6 @@ static const struct net_device_ops qeth_l2_netdev_ops = { | |||
885 | static int qeth_l2_setup_netdev(struct qeth_card *card) | 899 | static int qeth_l2_setup_netdev(struct qeth_card *card) |
886 | { | 900 | { |
887 | switch (card->info.type) { | 901 | switch (card->info.type) { |
888 | case QETH_CARD_TYPE_OSAE: | ||
889 | card->dev = alloc_etherdev(0); | ||
890 | break; | ||
891 | case QETH_CARD_TYPE_IQD: | 902 | case QETH_CARD_TYPE_IQD: |
892 | card->dev = alloc_netdev(0, "hsi%d", ether_setup); | 903 | card->dev = alloc_netdev(0, "hsi%d", ether_setup); |
893 | break; | 904 | break; |
@@ -964,11 +975,14 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
964 | } else | 975 | } else |
965 | card->lan_online = 1; | 976 | card->lan_online = 1; |
966 | 977 | ||
967 | if (card->info.type != QETH_CARD_TYPE_OSN) { | 978 | if ((card->info.type == QETH_CARD_TYPE_OSD) || |
979 | (card->info.type == QETH_CARD_TYPE_OSX)) | ||
968 | /* configure isolation level */ | 980 | /* configure isolation level */ |
969 | qeth_set_access_ctrl_online(card); | 981 | qeth_set_access_ctrl_online(card); |
982 | |||
983 | if (card->info.type != QETH_CARD_TYPE_OSN && | ||
984 | card->info.type != QETH_CARD_TYPE_OSM) | ||
970 | qeth_l2_process_vlans(card, 0); | 985 | qeth_l2_process_vlans(card, 0); |
971 | } | ||
972 | 986 | ||
973 | netif_tx_disable(card->dev); | 987 | netif_tx_disable(card->dev); |
974 | 988 | ||
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 83c7f9444c4f..61adae21a464 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -2711,7 +2711,8 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
2711 | rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); | 2711 | rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); |
2712 | break; | 2712 | break; |
2713 | case SIOC_QETH_GET_CARD_TYPE: | 2713 | case SIOC_QETH_GET_CARD_TYPE: |
2714 | if ((card->info.type == QETH_CARD_TYPE_OSAE) && | 2714 | if ((card->info.type == QETH_CARD_TYPE_OSD || |
2715 | card->info.type == QETH_CARD_TYPE_OSX) && | ||
2715 | !card->info.guestlan) | 2716 | !card->info.guestlan) |
2716 | return 1; | 2717 | return 1; |
2717 | return 0; | 2718 | return 0; |
@@ -3248,7 +3249,8 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { | |||
3248 | 3249 | ||
3249 | static int qeth_l3_setup_netdev(struct qeth_card *card) | 3250 | static int qeth_l3_setup_netdev(struct qeth_card *card) |
3250 | { | 3251 | { |
3251 | if (card->info.type == QETH_CARD_TYPE_OSAE) { | 3252 | if (card->info.type == QETH_CARD_TYPE_OSD || |
3253 | card->info.type == QETH_CARD_TYPE_OSX) { | ||
3252 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || | 3254 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || |
3253 | (card->info.link_type == QETH_LINK_TYPE_HSTR)) { | 3255 | (card->info.link_type == QETH_LINK_TYPE_HSTR)) { |
3254 | #ifdef CONFIG_TR | 3256 | #ifdef CONFIG_TR |