Skip to content

Commit 70919e2

Browse files
braunudavem330
authored andcommitted
qeth: remove needless IPA-commands in offline
If a qeth device is set offline, data and control subchannels are cleared, which means removal of all IP Assist Primitive settings implicitly. There is no need to delete those settings explicitly. This patch removes all IP Assist invocations from offline. Signed-off-by: Ursula Braun <[email protected]> Signed-off-by: Frank Blaschka <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4c93fbb commit 70919e2

File tree

4 files changed

+33
-120
lines changed

4 files changed

+33
-120
lines changed

drivers/s390/net/qeth_core.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,6 @@ struct qeth_card {
741741
/* QDIO buffer handling */
742742
struct qeth_qdio_info qdio;
743743
struct qeth_perf_stats perf_stats;
744-
int use_hard_stop;
745744
int read_or_write_problem;
746745
struct qeth_osn_info osn_info;
747746
struct qeth_discipline discipline;

drivers/s390/net/qeth_core_main.c

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,15 @@ static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
302302
int com = cmd->hdr.command;
303303
ipa_name = qeth_get_ipa_cmd_name(com);
304304
if (rc)
305-
QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s returned x%X \"%s\"\n",
306-
ipa_name, com, QETH_CARD_IFNAME(card),
307-
rc, qeth_get_ipa_msg(rc));
305+
QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned "
306+
"x%X \"%s\"\n",
307+
ipa_name, com, dev_name(&card->gdev->dev),
308+
QETH_CARD_IFNAME(card), rc,
309+
qeth_get_ipa_msg(rc));
308310
else
309-
QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s succeeded\n",
310-
ipa_name, com, QETH_CARD_IFNAME(card));
311+
QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n",
312+
ipa_name, com, dev_name(&card->gdev->dev),
313+
QETH_CARD_IFNAME(card));
311314
}
312315

313316
static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
@@ -1083,7 +1086,6 @@ static int qeth_setup_card(struct qeth_card *card)
10831086
card->data.state = CH_STATE_DOWN;
10841087
card->state = CARD_STATE_DOWN;
10851088
card->lan_online = 0;
1086-
card->use_hard_stop = 0;
10871089
card->read_or_write_problem = 0;
10881090
card->dev = NULL;
10891091
spin_lock_init(&card->vlanlock);
@@ -1732,20 +1734,22 @@ int qeth_send_control_data(struct qeth_card *card, int len,
17321734
};
17331735
}
17341736

1737+
if (reply->rc == -EIO)
1738+
goto error;
17351739
rc = reply->rc;
17361740
qeth_put_reply(reply);
17371741
return rc;
17381742

17391743
time_err:
1744+
reply->rc = -ETIME;
17401745
spin_lock_irqsave(&reply->card->lock, flags);
17411746
list_del_init(&reply->list);
17421747
spin_unlock_irqrestore(&reply->card->lock, flags);
1743-
reply->rc = -ETIME;
17441748
atomic_inc(&reply->received);
1749+
error:
17451750
atomic_set(&card->write.irq_pending, 0);
17461751
qeth_release_buffer(iob->channel, iob);
17471752
card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
1748-
wake_up(&reply->wait_q);
17491753
rc = reply->rc;
17501754
qeth_put_reply(reply);
17511755
return rc;
@@ -2490,45 +2494,19 @@ int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
24902494
}
24912495
EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
24922496

2493-
static 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-
25052497
int qeth_send_startlan(struct qeth_card *card)
25062498
{
25072499
int rc;
2500+
struct qeth_cmd_buffer *iob;
25082501

25092502
QETH_DBF_TEXT(SETUP, 2, "strtlan");
25102503

2511-
rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0);
2504+
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2505+
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
25122506
return rc;
25132507
}
25142508
EXPORT_SYMBOL_GPL(qeth_send_startlan);
25152509

2516-
int 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-
}
2530-
EXPORT_SYMBOL_GPL(qeth_send_stoplan);
2531-
25322510
int qeth_default_setadapterparms_cb(struct qeth_card *card,
25332511
struct qeth_reply *reply, unsigned long data)
25342512
{

drivers/s390/net/qeth_l2_main.c

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,19 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
202202
kfree(mc);
203203
}
204204

205-
static void qeth_l2_del_all_mc(struct qeth_card *card)
205+
static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
206206
{
207207
struct qeth_mc_mac *mc, *tmp;
208208

209209
spin_lock_bh(&card->mclock);
210210
list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
211-
if (mc->is_vmac)
212-
qeth_l2_send_setdelmac(card, mc->mc_addr,
211+
if (del) {
212+
if (mc->is_vmac)
213+
qeth_l2_send_setdelmac(card, mc->mc_addr,
213214
IPA_CMD_DELVMAC, NULL);
214-
else
215-
qeth_l2_send_delgroupmac(card, mc->mc_addr);
215+
else
216+
qeth_l2_send_delgroupmac(card, mc->mc_addr);
217+
}
216218
list_del(&mc->list);
217219
kfree(mc);
218220
}
@@ -288,18 +290,13 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
288290
qeth_l2_send_setdelvlan_cb, NULL);
289291
}
290292

291-
static void qeth_l2_process_vlans(struct qeth_card *card, int clear)
293+
static void qeth_l2_process_vlans(struct qeth_card *card)
292294
{
293295
struct qeth_vlan_vid *id;
294296
QETH_CARD_TEXT(card, 3, "L2prcvln");
295297
spin_lock_bh(&card->vlanlock);
296298
list_for_each_entry(id, &card->vid_list, list) {
297-
if (clear)
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);
299+
qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
303300
}
304301
spin_unlock_bh(&card->vlanlock);
305302
}
@@ -379,19 +376,11 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
379376
dev_close(card->dev);
380377
rtnl_unlock();
381378
}
382-
if (!card->use_hard_stop ||
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-
}
379+
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
388380
card->state = CARD_STATE_SOFTSETUP;
389381
}
390382
if (card->state == CARD_STATE_SOFTSETUP) {
391-
qeth_l2_process_vlans(card, 1);
392-
if (!card->use_hard_stop ||
393-
recovery_mode)
394-
qeth_l2_del_all_mc(card);
383+
qeth_l2_del_all_mc(card, 0);
395384
qeth_clear_ipacmd_list(card);
396385
card->state = CARD_STATE_HARDSETUP;
397386
}
@@ -405,7 +394,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
405394
qeth_clear_cmd_buffers(&card->read);
406395
qeth_clear_cmd_buffers(&card->write);
407396
}
408-
card->use_hard_stop = 0;
409397
return rc;
410398
}
411399

@@ -705,7 +693,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev)
705693
if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
706694
(card->state != CARD_STATE_UP))
707695
return;
708-
qeth_l2_del_all_mc(card);
696+
qeth_l2_del_all_mc(card, 1);
709697
spin_lock_bh(&card->mclock);
710698
netdev_for_each_mc_addr(ha, dev)
711699
qeth_l2_add_mc(card, ha->addr, 0);
@@ -907,10 +895,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
907895
qeth_set_allowed_threads(card, 0, 1);
908896
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
909897

910-
if (cgdev->state == CCWGROUP_ONLINE) {
911-
card->use_hard_stop = 1;
898+
if (cgdev->state == CCWGROUP_ONLINE)
912899
qeth_l2_set_offline(cgdev);
913-
}
914900

915901
if (card->dev) {
916902
unregister_netdev(card->dev);
@@ -1040,7 +1026,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
10401026

10411027
if (card->info.type != QETH_CARD_TYPE_OSN &&
10421028
card->info.type != QETH_CARD_TYPE_OSM)
1043-
qeth_l2_process_vlans(card, 0);
1029+
qeth_l2_process_vlans(card);
10441030

10451031
netif_tx_disable(card->dev);
10461032

@@ -1076,7 +1062,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
10761062
return 0;
10771063

10781064
out_remove:
1079-
card->use_hard_stop = 1;
10801065
qeth_l2_stop_card(card, 0);
10811066
ccw_device_set_offline(CARD_DDEV(card));
10821067
ccw_device_set_offline(CARD_WDEV(card));
@@ -1144,7 +1129,6 @@ static int qeth_l2_recover(void *ptr)
11441129
QETH_CARD_TEXT(card, 2, "recover2");
11451130
dev_warn(&card->gdev->dev,
11461131
"A recovery process has been started for the device\n");
1147-
card->use_hard_stop = 1;
11481132
__qeth_l2_set_offline(card->gdev, 1);
11491133
rc = __qeth_l2_set_online(card->gdev, 1);
11501134
if (!rc)
@@ -1191,7 +1175,6 @@ static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
11911175
if (gdev->state == CCWGROUP_OFFLINE)
11921176
return 0;
11931177
if (card->state == CARD_STATE_UP) {
1194-
card->use_hard_stop = 1;
11951178
__qeth_l2_set_offline(card->gdev, 1);
11961179
} else
11971180
__qeth_l2_set_offline(card->gdev, 0);

drivers/s390/net/qeth_l3_main.c

Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,7 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
510510
kfree(tbd_list);
511511
}
512512

513-
static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean,
514-
int recover)
513+
static void qeth_l3_clear_ip_list(struct qeth_card *card, int recover)
515514
{
516515
struct qeth_ipaddr *addr, *tmp;
517516
unsigned long flags;
@@ -530,11 +529,6 @@ static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean,
530529
addr = list_entry(card->ip_list.next,
531530
struct qeth_ipaddr, entry);
532531
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-
}
538532
if (!recover || addr->is_multicast) {
539533
kfree(addr);
540534
continue;
@@ -1611,29 +1605,6 @@ static int qeth_l3_start_ipassists(struct qeth_card *card)
16111605
return 0;
16121606
}
16131607

1614-
static 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-
16371608
static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card,
16381609
struct qeth_reply *reply, unsigned long data)
16391610
{
@@ -2324,25 +2295,14 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
23242295
dev_close(card->dev);
23252296
rtnl_unlock();
23262297
}
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-
}
23322298
card->state = CARD_STATE_SOFTSETUP;
23332299
}
23342300
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);
23362302
qeth_clear_ipacmd_list(card);
23372303
card->state = CARD_STATE_HARDSETUP;
23382304
}
23392305
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-
}
23462306
qeth_qdio_clear_card(card, 0);
23472307
qeth_clear_qdio_buffers(card);
23482308
qeth_clear_working_pool_list(card);
@@ -2352,7 +2312,6 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
23522312
qeth_clear_cmd_buffers(&card->read);
23532313
qeth_clear_cmd_buffers(&card->write);
23542314
}
2355-
card->use_hard_stop = 0;
23562315
return rc;
23572316
}
23582317

@@ -3483,17 +3442,15 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
34833442
qeth_set_allowed_threads(card, 0, 1);
34843443
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
34853444

3486-
if (cgdev->state == CCWGROUP_ONLINE) {
3487-
card->use_hard_stop = 1;
3445+
if (cgdev->state == CCWGROUP_ONLINE)
34883446
qeth_l3_set_offline(cgdev);
3489-
}
34903447

34913448
if (card->dev) {
34923449
unregister_netdev(card->dev);
34933450
card->dev = NULL;
34943451
}
34953452

3496-
qeth_l3_clear_ip_list(card, 0, 0);
3453+
qeth_l3_clear_ip_list(card, 0);
34973454
qeth_l3_clear_ipato_list(card);
34983455
return;
34993456
}
@@ -3594,7 +3551,6 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
35943551
mutex_unlock(&card->discipline_mutex);
35953552
return 0;
35963553
out_remove:
3597-
card->use_hard_stop = 1;
35983554
qeth_l3_stop_card(card, 0);
35993555
ccw_device_set_offline(CARD_DDEV(card));
36003556
ccw_device_set_offline(CARD_WDEV(card));
@@ -3663,7 +3619,6 @@ static int qeth_l3_recover(void *ptr)
36633619
QETH_CARD_TEXT(card, 2, "recover2");
36643620
dev_warn(&card->gdev->dev,
36653621
"A recovery process has been started for the device\n");
3666-
card->use_hard_stop = 1;
36673622
__qeth_l3_set_offline(card->gdev, 1);
36683623
rc = __qeth_l3_set_online(card->gdev, 1);
36693624
if (!rc)
@@ -3684,7 +3639,6 @@ static int qeth_l3_recover(void *ptr)
36843639
static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
36853640
{
36863641
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
3687-
qeth_l3_clear_ip_list(card, 0, 0);
36883642
qeth_qdio_clear_card(card, 0);
36893643
qeth_clear_qdio_buffers(card);
36903644
}
@@ -3700,7 +3654,6 @@ static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)
37003654
if (gdev->state == CCWGROUP_OFFLINE)
37013655
return 0;
37023656
if (card->state == CARD_STATE_UP) {
3703-
card->use_hard_stop = 1;
37043657
__qeth_l3_set_offline(card->gdev, 1);
37053658
} else
37063659
__qeth_l3_set_offline(card->gdev, 0);

0 commit comments

Comments
 (0)