aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-16 19:29:25 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-16 19:29:25 -0400
commit7a6362800cb7d1d618a697a650c7aaed3eb39320 (patch)
tree087f9bc6c13ef1fad4b392c5cf9325cd28fa8523 /drivers/s390
parent6445ced8670f37cfc2c5e24a9de9b413dbfc788d (diff)
parentceda86a108671294052cbf51660097b6534672f5 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1480 commits) bonding: enable netpoll without checking link status xfrm: Refcount destination entry on xfrm_lookup net: introduce rx_handler results and logic around that bonding: get rid of IFF_SLAVE_INACTIVE netdev->priv_flag bonding: wrap slave state work net: get rid of multiple bond-related netdevice->priv_flags bonding: register slave pointer for rx_handler be2net: Bump up the version number be2net: Copyright notice change. Update to Emulex instead of ServerEngines e1000e: fix kconfig for crc32 dependency netfilter ebtables: fix xt_AUDIT to work with ebtables xen network backend driver bonding: Improve syslog message at device creation time bonding: Call netif_carrier_off after register_netdevice bonding: Incorrect TX queue offset net_sched: fix ip_tos2prio xfrm: fix __xfrm_route_forward() be2net: Fix UDP packet detected status in RX compl Phonet: fix aligned-mode pipe socket buffer header reserve netxen: support for GbE port settings ... Fix up conflicts in drivers/staging/brcm80211/brcmsmac/wl_mac80211.c with the staging updates.
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/net/qeth_core.h4
-rw-r--r--drivers/s390/net/qeth_core_main.c57
-rw-r--r--drivers/s390/net/qeth_l2_main.c45
-rw-r--r--drivers/s390/net/qeth_l3_main.c60
4 files changed, 44 insertions, 122 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index f47a714538db..af3f7b095647 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -225,7 +225,8 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
225/*****************************************************************************/ 225/*****************************************************************************/
226#define QETH_MAX_QUEUES 4 226#define QETH_MAX_QUEUES 4
227#define QETH_IN_BUF_SIZE_DEFAULT 65536 227#define QETH_IN_BUF_SIZE_DEFAULT 65536
228#define QETH_IN_BUF_COUNT_DEFAULT 16 228#define QETH_IN_BUF_COUNT_DEFAULT 64
229#define QETH_IN_BUF_COUNT_HSDEFAULT 128
229#define QETH_IN_BUF_COUNT_MIN 8 230#define QETH_IN_BUF_COUNT_MIN 8
230#define QETH_IN_BUF_COUNT_MAX 128 231#define QETH_IN_BUF_COUNT_MAX 128
231#define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12) 232#define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12)
@@ -741,7 +742,6 @@ struct qeth_card {
741 /* QDIO buffer handling */ 742 /* QDIO buffer handling */
742 struct qeth_qdio_info qdio; 743 struct qeth_qdio_info qdio;
743 struct qeth_perf_stats perf_stats; 744 struct qeth_perf_stats perf_stats;
744 int use_hard_stop;
745 int read_or_write_problem; 745 int read_or_write_problem;
746 struct qeth_osn_info osn_info; 746 struct qeth_osn_info osn_info;
747 struct qeth_discipline discipline; 747 struct qeth_discipline discipline;
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 019ae58ab913..25eef304bd47 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -302,12 +302,15 @@ static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
302 int com = cmd->hdr.command; 302 int com = cmd->hdr.command;
303 ipa_name = qeth_get_ipa_cmd_name(com); 303 ipa_name = qeth_get_ipa_cmd_name(com);
304 if (rc) 304 if (rc)
305 QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s returned x%X \"%s\"\n", 305 QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned "
306 ipa_name, com, QETH_CARD_IFNAME(card), 306 "x%X \"%s\"\n",
307 rc, qeth_get_ipa_msg(rc)); 307 ipa_name, com, dev_name(&card->gdev->dev),
308 QETH_CARD_IFNAME(card), rc,
309 qeth_get_ipa_msg(rc));
308 else 310 else
309 QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s succeeded\n", 311 QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n",
310 ipa_name, com, QETH_CARD_IFNAME(card)); 312 ipa_name, com, dev_name(&card->gdev->dev),
313 QETH_CARD_IFNAME(card));
311} 314}
312 315
313static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, 316static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
@@ -1023,7 +1026,10 @@ static void qeth_init_qdio_info(struct qeth_card *card)
1023 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); 1026 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
1024 /* inbound */ 1027 /* inbound */
1025 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; 1028 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1026 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; 1029 if (card->info.type == QETH_CARD_TYPE_IQD)
1030 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT;
1031 else
1032 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
1027 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count; 1033 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
1028 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list); 1034 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
1029 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list); 1035 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
@@ -1083,7 +1089,6 @@ static int qeth_setup_card(struct qeth_card *card)
1083 card->data.state = CH_STATE_DOWN; 1089 card->data.state = CH_STATE_DOWN;
1084 card->state = CARD_STATE_DOWN; 1090 card->state = CARD_STATE_DOWN;
1085 card->lan_online = 0; 1091 card->lan_online = 0;
1086 card->use_hard_stop = 0;
1087 card->read_or_write_problem = 0; 1092 card->read_or_write_problem = 0;
1088 card->dev = NULL; 1093 card->dev = NULL;
1089 spin_lock_init(&card->vlanlock); 1094 spin_lock_init(&card->vlanlock);
@@ -1732,20 +1737,22 @@ int qeth_send_control_data(struct qeth_card *card, int len,
1732 }; 1737 };
1733 } 1738 }
1734 1739
1740 if (reply->rc == -EIO)
1741 goto error;
1735 rc = reply->rc; 1742 rc = reply->rc;
1736 qeth_put_reply(reply); 1743 qeth_put_reply(reply);
1737 return rc; 1744 return rc;
1738 1745
1739time_err: 1746time_err:
1747 reply->rc = -ETIME;
1740 spin_lock_irqsave(&reply->card->lock, flags); 1748 spin_lock_irqsave(&reply->card->lock, flags);
1741 list_del_init(&reply->list); 1749 list_del_init(&reply->list);
1742 spin_unlock_irqrestore(&reply->card->lock, flags); 1750 spin_unlock_irqrestore(&reply->card->lock, flags);
1743 reply->rc = -ETIME;
1744 atomic_inc(&reply->received); 1751 atomic_inc(&reply->received);
1752error:
1745 atomic_set(&card->write.irq_pending, 0); 1753 atomic_set(&card->write.irq_pending, 0);
1746 qeth_release_buffer(iob->channel, iob); 1754 qeth_release_buffer(iob->channel, iob);
1747 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO; 1755 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
1748 wake_up(&reply->wait_q);
1749 rc = reply->rc; 1756 rc = reply->rc;
1750 qeth_put_reply(reply); 1757 qeth_put_reply(reply);
1751 return rc; 1758 return rc;
@@ -2490,45 +2497,19 @@ int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2490} 2497}
2491EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd); 2498EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
2492 2499
2493static int qeth_send_startstoplan(struct qeth_card *card,
2494 enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot)
2495{
2496 int rc;
2497 struct qeth_cmd_buffer *iob;
2498
2499 iob = qeth_get_ipacmd_buffer(card, ipacmd, prot);
2500 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2501
2502 return rc;
2503}
2504
2505int qeth_send_startlan(struct qeth_card *card) 2500int qeth_send_startlan(struct qeth_card *card)
2506{ 2501{
2507 int rc; 2502 int rc;
2503 struct qeth_cmd_buffer *iob;
2508 2504
2509 QETH_DBF_TEXT(SETUP, 2, "strtlan"); 2505 QETH_DBF_TEXT(SETUP, 2, "strtlan");
2510 2506
2511 rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0); 2507 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2508 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2512 return rc; 2509 return rc;
2513} 2510}
2514EXPORT_SYMBOL_GPL(qeth_send_startlan); 2511EXPORT_SYMBOL_GPL(qeth_send_startlan);
2515 2512
2516int qeth_send_stoplan(struct qeth_card *card)
2517{
2518 int rc = 0;
2519
2520 /*
2521 * TODO: according to the IPA format document page 14,
2522 * TCP/IP (we!) never issue a STOPLAN
2523 * is this right ?!?
2524 */
2525 QETH_DBF_TEXT(SETUP, 2, "stoplan");
2526
2527 rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 0);
2528 return rc;
2529}
2530EXPORT_SYMBOL_GPL(qeth_send_stoplan);
2531
2532int qeth_default_setadapterparms_cb(struct qeth_card *card, 2513int qeth_default_setadapterparms_cb(struct qeth_card *card,
2533 struct qeth_reply *reply, unsigned long data) 2514 struct qeth_reply *reply, unsigned long data)
2534{ 2515{
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index ada0fe782373..6fbaacb21943 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -202,17 +202,19 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
202 kfree(mc); 202 kfree(mc);
203} 203}
204 204
205static void qeth_l2_del_all_mc(struct qeth_card *card) 205static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
206{ 206{
207 struct qeth_mc_mac *mc, *tmp; 207 struct qeth_mc_mac *mc, *tmp;
208 208
209 spin_lock_bh(&card->mclock); 209 spin_lock_bh(&card->mclock);
210 list_for_each_entry_safe(mc, tmp, &card->mc_list, list) { 210 list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
211 if (mc->is_vmac) 211 if (del) {
212 qeth_l2_send_setdelmac(card, mc->mc_addr, 212 if (mc->is_vmac)
213 qeth_l2_send_setdelmac(card, mc->mc_addr,
213 IPA_CMD_DELVMAC, NULL); 214 IPA_CMD_DELVMAC, NULL);
214 else 215 else
215 qeth_l2_send_delgroupmac(card, mc->mc_addr); 216 qeth_l2_send_delgroupmac(card, mc->mc_addr);
217 }
216 list_del(&mc->list); 218 list_del(&mc->list);
217 kfree(mc); 219 kfree(mc);
218 } 220 }
@@ -288,18 +290,13 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
288 qeth_l2_send_setdelvlan_cb, NULL); 290 qeth_l2_send_setdelvlan_cb, NULL);
289} 291}
290 292
291static void qeth_l2_process_vlans(struct qeth_card *card, int clear) 293static void qeth_l2_process_vlans(struct qeth_card *card)
292{ 294{
293 struct qeth_vlan_vid *id; 295 struct qeth_vlan_vid *id;
294 QETH_CARD_TEXT(card, 3, "L2prcvln"); 296 QETH_CARD_TEXT(card, 3, "L2prcvln");
295 spin_lock_bh(&card->vlanlock); 297 spin_lock_bh(&card->vlanlock);
296 list_for_each_entry(id, &card->vid_list, list) { 298 list_for_each_entry(id, &card->vid_list, list) {
297 if (clear) 299 qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
298 qeth_l2_send_setdelvlan(card, id->vid,
299 IPA_CMD_DELVLAN);
300 else
301 qeth_l2_send_setdelvlan(card, id->vid,
302 IPA_CMD_SETVLAN);
303 } 300 }
304 spin_unlock_bh(&card->vlanlock); 301 spin_unlock_bh(&card->vlanlock);
305} 302}
@@ -379,19 +376,11 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
379 dev_close(card->dev); 376 dev_close(card->dev);
380 rtnl_unlock(); 377 rtnl_unlock();
381 } 378 }
382 if (!card->use_hard_stop || 379 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
383 recovery_mode) {
384 __u8 *mac = &card->dev->dev_addr[0];
385 rc = qeth_l2_send_delmac(card, mac);
386 QETH_DBF_TEXT_(SETUP, 2, "Lerr%d", rc);
387 }
388 card->state = CARD_STATE_SOFTSETUP; 380 card->state = CARD_STATE_SOFTSETUP;
389 } 381 }
390 if (card->state == CARD_STATE_SOFTSETUP) { 382 if (card->state == CARD_STATE_SOFTSETUP) {
391 qeth_l2_process_vlans(card, 1); 383 qeth_l2_del_all_mc(card, 0);
392 if (!card->use_hard_stop ||
393 recovery_mode)
394 qeth_l2_del_all_mc(card);
395 qeth_clear_ipacmd_list(card); 384 qeth_clear_ipacmd_list(card);
396 card->state = CARD_STATE_HARDSETUP; 385 card->state = CARD_STATE_HARDSETUP;
397 } 386 }
@@ -405,7 +394,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
405 qeth_clear_cmd_buffers(&card->read); 394 qeth_clear_cmd_buffers(&card->read);
406 qeth_clear_cmd_buffers(&card->write); 395 qeth_clear_cmd_buffers(&card->write);
407 } 396 }
408 card->use_hard_stop = 0;
409 return rc; 397 return rc;
410} 398}
411 399
@@ -705,7 +693,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev)
705 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && 693 if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
706 (card->state != CARD_STATE_UP)) 694 (card->state != CARD_STATE_UP))
707 return; 695 return;
708 qeth_l2_del_all_mc(card); 696 qeth_l2_del_all_mc(card, 1);
709 spin_lock_bh(&card->mclock); 697 spin_lock_bh(&card->mclock);
710 netdev_for_each_mc_addr(ha, dev) 698 netdev_for_each_mc_addr(ha, dev)
711 qeth_l2_add_mc(card, ha->addr, 0); 699 qeth_l2_add_mc(card, ha->addr, 0);
@@ -907,10 +895,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
907 qeth_set_allowed_threads(card, 0, 1); 895 qeth_set_allowed_threads(card, 0, 1);
908 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 896 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
909 897
910 if (cgdev->state == CCWGROUP_ONLINE) { 898 if (cgdev->state == CCWGROUP_ONLINE)
911 card->use_hard_stop = 1;
912 qeth_l2_set_offline(cgdev); 899 qeth_l2_set_offline(cgdev);
913 }
914 900
915 if (card->dev) { 901 if (card->dev) {
916 unregister_netdev(card->dev); 902 unregister_netdev(card->dev);
@@ -1040,7 +1026,7 @@ contin:
1040 1026
1041 if (card->info.type != QETH_CARD_TYPE_OSN && 1027 if (card->info.type != QETH_CARD_TYPE_OSN &&
1042 card->info.type != QETH_CARD_TYPE_OSM) 1028 card->info.type != QETH_CARD_TYPE_OSM)
1043 qeth_l2_process_vlans(card, 0); 1029 qeth_l2_process_vlans(card);
1044 1030
1045 netif_tx_disable(card->dev); 1031 netif_tx_disable(card->dev);
1046 1032
@@ -1076,7 +1062,6 @@ contin:
1076 return 0; 1062 return 0;
1077 1063
1078out_remove: 1064out_remove:
1079 card->use_hard_stop = 1;
1080 qeth_l2_stop_card(card, 0); 1065 qeth_l2_stop_card(card, 0);
1081 ccw_device_set_offline(CARD_DDEV(card)); 1066 ccw_device_set_offline(CARD_DDEV(card));
1082 ccw_device_set_offline(CARD_WDEV(card)); 1067 ccw_device_set_offline(CARD_WDEV(card));
@@ -1144,7 +1129,6 @@ static int qeth_l2_recover(void *ptr)
1144 QETH_CARD_TEXT(card, 2, "recover2"); 1129 QETH_CARD_TEXT(card, 2, "recover2");
1145 dev_warn(&card->gdev->dev, 1130 dev_warn(&card->gdev->dev,
1146 "A recovery process has been started for the device\n"); 1131 "A recovery process has been started for the device\n");
1147 card->use_hard_stop = 1;
1148 __qeth_l2_set_offline(card->gdev, 1); 1132 __qeth_l2_set_offline(card->gdev, 1);
1149 rc = __qeth_l2_set_online(card->gdev, 1); 1133 rc = __qeth_l2_set_online(card->gdev, 1);
1150 if (!rc) 1134 if (!rc)
@@ -1191,7 +1175,6 @@ static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1191 if (gdev->state == CCWGROUP_OFFLINE) 1175 if (gdev->state == CCWGROUP_OFFLINE)
1192 return 0; 1176 return 0;
1193 if (card->state == CARD_STATE_UP) { 1177 if (card->state == CARD_STATE_UP) {
1194 card->use_hard_stop = 1;
1195 __qeth_l2_set_offline(card->gdev, 1); 1178 __qeth_l2_set_offline(card->gdev, 1);
1196 } else 1179 } else
1197 __qeth_l2_set_offline(card->gdev, 0); 1180 __qeth_l2_set_offline(card->gdev, 0);
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index d09b0c44fc3d..142e5f6ef4f3 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -510,8 +510,7 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
510 kfree(tbd_list); 510 kfree(tbd_list);
511} 511}
512 512
513static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean, 513static void qeth_l3_clear_ip_list(struct qeth_card *card, int recover)
514 int recover)
515{ 514{
516 struct qeth_ipaddr *addr, *tmp; 515 struct qeth_ipaddr *addr, *tmp;
517 unsigned long flags; 516 unsigned long flags;
@@ -530,11 +529,6 @@ static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean,
530 addr = list_entry(card->ip_list.next, 529 addr = list_entry(card->ip_list.next,
531 struct qeth_ipaddr, entry); 530 struct qeth_ipaddr, entry);
532 list_del_init(&addr->entry); 531 list_del_init(&addr->entry);
533 if (clean) {
534 spin_unlock_irqrestore(&card->ip_lock, flags);
535 qeth_l3_deregister_addr_entry(card, addr);
536 spin_lock_irqsave(&card->ip_lock, flags);
537 }
538 if (!recover || addr->is_multicast) { 532 if (!recover || addr->is_multicast) {
539 kfree(addr); 533 kfree(addr);
540 continue; 534 continue;
@@ -1611,29 +1605,6 @@ static int qeth_l3_start_ipassists(struct qeth_card *card)
1611 return 0; 1605 return 0;
1612} 1606}
1613 1607
1614static int qeth_l3_put_unique_id(struct qeth_card *card)
1615{
1616
1617 int rc = 0;
1618 struct qeth_cmd_buffer *iob;
1619 struct qeth_ipa_cmd *cmd;
1620
1621 QETH_CARD_TEXT(card, 2, "puniqeid");
1622
1623 if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
1624 UNIQUE_ID_NOT_BY_CARD)
1625 return -1;
1626 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR,
1627 QETH_PROT_IPV6);
1628 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1629 *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
1630 card->info.unique_id;
1631 memcpy(&cmd->data.create_destroy_addr.unique_id[0],
1632 card->dev->dev_addr, OSA_ADDR_LEN);
1633 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
1634 return rc;
1635}
1636
1637static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, 1608static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card,
1638 struct qeth_reply *reply, unsigned long data) 1609 struct qeth_reply *reply, unsigned long data)
1639{ 1610{
@@ -2324,25 +2295,14 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
2324 dev_close(card->dev); 2295 dev_close(card->dev);
2325 rtnl_unlock(); 2296 rtnl_unlock();
2326 } 2297 }
2327 if (!card->use_hard_stop) {
2328 rc = qeth_send_stoplan(card);
2329 if (rc)
2330 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
2331 }
2332 card->state = CARD_STATE_SOFTSETUP; 2298 card->state = CARD_STATE_SOFTSETUP;
2333 } 2299 }
2334 if (card->state == CARD_STATE_SOFTSETUP) { 2300 if (card->state == CARD_STATE_SOFTSETUP) {
2335 qeth_l3_clear_ip_list(card, !card->use_hard_stop, 1); 2301 qeth_l3_clear_ip_list(card, 1);
2336 qeth_clear_ipacmd_list(card); 2302 qeth_clear_ipacmd_list(card);
2337 card->state = CARD_STATE_HARDSETUP; 2303 card->state = CARD_STATE_HARDSETUP;
2338 } 2304 }
2339 if (card->state == CARD_STATE_HARDSETUP) { 2305 if (card->state == CARD_STATE_HARDSETUP) {
2340 if (!card->use_hard_stop &&
2341 (card->info.type != QETH_CARD_TYPE_IQD)) {
2342 rc = qeth_l3_put_unique_id(card);
2343 if (rc)
2344 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
2345 }
2346 qeth_qdio_clear_card(card, 0); 2306 qeth_qdio_clear_card(card, 0);
2347 qeth_clear_qdio_buffers(card); 2307 qeth_clear_qdio_buffers(card);
2348 qeth_clear_working_pool_list(card); 2308 qeth_clear_working_pool_list(card);
@@ -2352,7 +2312,6 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
2352 qeth_clear_cmd_buffers(&card->read); 2312 qeth_clear_cmd_buffers(&card->read);
2353 qeth_clear_cmd_buffers(&card->write); 2313 qeth_clear_cmd_buffers(&card->write);
2354 } 2314 }
2355 card->use_hard_stop = 0;
2356 return rc; 2315 return rc;
2357} 2316}
2358 2317
@@ -3433,6 +3392,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
3433 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) 3392 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
3434 card->dev->dev_id = card->info.unique_id & 3393 card->dev->dev_id = card->info.unique_id &
3435 0xffff; 3394 0xffff;
3395 if (!card->info.guestlan)
3396 card->dev->features |= NETIF_F_GRO;
3436 } 3397 }
3437 } else if (card->info.type == QETH_CARD_TYPE_IQD) { 3398 } else if (card->info.type == QETH_CARD_TYPE_IQD) {
3438 card->dev = alloc_netdev(0, "hsi%d", ether_setup); 3399 card->dev = alloc_netdev(0, "hsi%d", ether_setup);
@@ -3471,6 +3432,9 @@ static int qeth_l3_probe_device(struct ccwgroup_device *gdev)
3471 card->discipline.output_handler = (qdio_handler_t *) 3432 card->discipline.output_handler = (qdio_handler_t *)
3472 qeth_qdio_output_handler; 3433 qeth_qdio_output_handler;
3473 card->discipline.recover = qeth_l3_recover; 3434 card->discipline.recover = qeth_l3_recover;
3435 if ((card->info.type == QETH_CARD_TYPE_OSD) ||
3436 (card->info.type == QETH_CARD_TYPE_OSX))
3437 card->options.checksum_type = HW_CHECKSUMMING;
3474 return 0; 3438 return 0;
3475} 3439}
3476 3440
@@ -3483,17 +3447,15 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
3483 qeth_set_allowed_threads(card, 0, 1); 3447 qeth_set_allowed_threads(card, 0, 1);
3484 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 3448 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
3485 3449
3486 if (cgdev->state == CCWGROUP_ONLINE) { 3450 if (cgdev->state == CCWGROUP_ONLINE)
3487 card->use_hard_stop = 1;
3488 qeth_l3_set_offline(cgdev); 3451 qeth_l3_set_offline(cgdev);
3489 }
3490 3452
3491 if (card->dev) { 3453 if (card->dev) {
3492 unregister_netdev(card->dev); 3454 unregister_netdev(card->dev);
3493 card->dev = NULL; 3455 card->dev = NULL;
3494 } 3456 }
3495 3457
3496 qeth_l3_clear_ip_list(card, 0, 0); 3458 qeth_l3_clear_ip_list(card, 0);
3497 qeth_l3_clear_ipato_list(card); 3459 qeth_l3_clear_ipato_list(card);
3498 return; 3460 return;
3499} 3461}
@@ -3594,7 +3556,6 @@ contin:
3594 mutex_unlock(&card->discipline_mutex); 3556 mutex_unlock(&card->discipline_mutex);
3595 return 0; 3557 return 0;
3596out_remove: 3558out_remove:
3597 card->use_hard_stop = 1;
3598 qeth_l3_stop_card(card, 0); 3559 qeth_l3_stop_card(card, 0);
3599 ccw_device_set_offline(CARD_DDEV(card)); 3560 ccw_device_set_offline(CARD_DDEV(card));
3600 ccw_device_set_offline(CARD_WDEV(card)); 3561 ccw_device_set_offline(CARD_WDEV(card));
@@ -3663,7 +3624,6 @@ static int qeth_l3_recover(void *ptr)
3663 QETH_CARD_TEXT(card, 2, "recover2"); 3624 QETH_CARD_TEXT(card, 2, "recover2");
3664 dev_warn(&card->gdev->dev, 3625 dev_warn(&card->gdev->dev,
3665 "A recovery process has been started for the device\n"); 3626 "A recovery process has been started for the device\n");
3666 card->use_hard_stop = 1;
3667 __qeth_l3_set_offline(card->gdev, 1); 3627 __qeth_l3_set_offline(card->gdev, 1);
3668 rc = __qeth_l3_set_online(card->gdev, 1); 3628 rc = __qeth_l3_set_online(card->gdev, 1);
3669 if (!rc) 3629 if (!rc)
@@ -3684,7 +3644,6 @@ static int qeth_l3_recover(void *ptr)
3684static void qeth_l3_shutdown(struct ccwgroup_device *gdev) 3644static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
3685{ 3645{
3686 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3646 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
3687 qeth_l3_clear_ip_list(card, 0, 0);
3688 qeth_qdio_clear_card(card, 0); 3647 qeth_qdio_clear_card(card, 0);
3689 qeth_clear_qdio_buffers(card); 3648 qeth_clear_qdio_buffers(card);
3690} 3649}
@@ -3700,7 +3659,6 @@ static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)
3700 if (gdev->state == CCWGROUP_OFFLINE) 3659 if (gdev->state == CCWGROUP_OFFLINE)
3701 return 0; 3660 return 0;
3702 if (card->state == CARD_STATE_UP) { 3661 if (card->state == CARD_STATE_UP) {
3703 card->use_hard_stop = 1;
3704 __qeth_l3_set_offline(card->gdev, 1); 3662 __qeth_l3_set_offline(card->gdev, 1);
3705 } else 3663 } else
3706 __qeth_l3_set_offline(card->gdev, 0); 3664 __qeth_l3_set_offline(card->gdev, 0);