summaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorJulian Wiedmann <jwi@linux.ibm.com>2018-08-09 08:48:01 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-09 17:02:50 -0400
commit24142fd8d87d763bfc401cb0c496bb1050fea0b8 (patch)
treeccad079c3f02b82832bcfc13e2904224232d317e /drivers/s390
parent45ca2fd64682cd1ea14b480fbb4b38b601ac123b (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.c24
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
902static int qeth_setup_channel(struct qeth_channel *channel) 902static 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)
1448static void qeth_buffer_reclaim_work(struct work_struct *); 1454static void qeth_buffer_reclaim_work(struct work_struct *);
1449static int qeth_setup_card(struct qeth_card *card) 1455static 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
1520out_data:
1521 qeth_clean_channel(&card->write);
1516out_channel: 1522out_channel:
1517 qeth_clean_channel(&card->read); 1523 qeth_clean_channel(&card->read);
1518out_ip: 1524out_ip: