diff options
author | Julian Wiedmann <jwi@linux.ibm.com> | 2018-08-09 08:48:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-08-09 17:02:50 -0400 |
commit | 24142fd8d87d763bfc401cb0c496bb1050fea0b8 (patch) | |
tree | ccad079c3f02b82832bcfc13e2904224232d317e /drivers/s390 | |
parent | 45ca2fd64682cd1ea14b480fbb4b38b601ac123b (diff) |
s390/qeth: do basic setup for data channel
The data channel currently doesn't need a setup operation, because we
don't use pre-allocated cmd buffers for its IO. But subsequent changes
will introduce further setup that also applies to the data channel.
This refactors things a bit, so that the new stuff can then be
automatically applied to all channels.
Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 714c71e30b7f..eab8c4a182b0 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -899,11 +899,19 @@ out: | |||
899 | qeth_release_buffer(channel, iob); | 899 | qeth_release_buffer(channel, iob); |
900 | } | 900 | } |
901 | 901 | ||
902 | static int qeth_setup_channel(struct qeth_channel *channel) | 902 | static int qeth_setup_channel(struct qeth_channel *channel, bool alloc_buffers) |
903 | { | 903 | { |
904 | int cnt; | 904 | int cnt; |
905 | 905 | ||
906 | QETH_DBF_TEXT(SETUP, 2, "setupch"); | 906 | QETH_DBF_TEXT(SETUP, 2, "setupch"); |
907 | |||
908 | channel->state = CH_STATE_DOWN; | ||
909 | atomic_set(&channel->irq_pending, 0); | ||
910 | init_waitqueue_head(&channel->wait_q); | ||
911 | |||
912 | if (!alloc_buffers) | ||
913 | return 0; | ||
914 | |||
907 | for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) { | 915 | for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) { |
908 | channel->iob[cnt].data = | 916 | channel->iob[cnt].data = |
909 | kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL); | 917 | kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL); |
@@ -920,10 +928,8 @@ static int qeth_setup_channel(struct qeth_channel *channel) | |||
920 | return -ENOMEM; | 928 | return -ENOMEM; |
921 | } | 929 | } |
922 | channel->io_buf_no = 0; | 930 | channel->io_buf_no = 0; |
923 | atomic_set(&channel->irq_pending, 0); | ||
924 | spin_lock_init(&channel->iob_lock); | 931 | spin_lock_init(&channel->iob_lock); |
925 | 932 | ||
926 | init_waitqueue_head(&channel->wait_q); | ||
927 | return 0; | 933 | return 0; |
928 | } | 934 | } |
929 | 935 | ||
@@ -1448,13 +1454,9 @@ static void qeth_start_kernel_thread(struct work_struct *work) | |||
1448 | static void qeth_buffer_reclaim_work(struct work_struct *); | 1454 | static void qeth_buffer_reclaim_work(struct work_struct *); |
1449 | static int qeth_setup_card(struct qeth_card *card) | 1455 | static int qeth_setup_card(struct qeth_card *card) |
1450 | { | 1456 | { |
1451 | |||
1452 | QETH_DBF_TEXT(SETUP, 2, "setupcrd"); | 1457 | QETH_DBF_TEXT(SETUP, 2, "setupcrd"); |
1453 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 1458 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
1454 | 1459 | ||
1455 | card->read.state = CH_STATE_DOWN; | ||
1456 | card->write.state = CH_STATE_DOWN; | ||
1457 | card->data.state = CH_STATE_DOWN; | ||
1458 | card->state = CARD_STATE_DOWN; | 1460 | card->state = CARD_STATE_DOWN; |
1459 | card->lan_online = 0; | 1461 | card->lan_online = 0; |
1460 | card->read_or_write_problem = 0; | 1462 | card->read_or_write_problem = 0; |
@@ -1504,15 +1506,19 @@ static struct qeth_card *qeth_alloc_card(void) | |||
1504 | if (!card) | 1506 | if (!card) |
1505 | goto out; | 1507 | goto out; |
1506 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 1508 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
1507 | if (qeth_setup_channel(&card->read)) | 1509 | if (qeth_setup_channel(&card->read, true)) |
1508 | goto out_ip; | 1510 | goto out_ip; |
1509 | if (qeth_setup_channel(&card->write)) | 1511 | if (qeth_setup_channel(&card->write, true)) |
1510 | goto out_channel; | 1512 | goto out_channel; |
1513 | if (qeth_setup_channel(&card->data, false)) | ||
1514 | goto out_data; | ||
1511 | card->options.layer2 = -1; | 1515 | card->options.layer2 = -1; |
1512 | card->qeth_service_level.seq_print = qeth_core_sl_print; | 1516 | card->qeth_service_level.seq_print = qeth_core_sl_print; |
1513 | register_service_level(&card->qeth_service_level); | 1517 | register_service_level(&card->qeth_service_level); |
1514 | return card; | 1518 | return card; |
1515 | 1519 | ||
1520 | out_data: | ||
1521 | qeth_clean_channel(&card->write); | ||
1516 | out_channel: | 1522 | out_channel: |
1517 | qeth_clean_channel(&card->read); | 1523 | qeth_clean_channel(&card->read); |
1518 | out_ip: | 1524 | out_ip: |