• Home
  • Raw
  • Download

Lines Matching refs:card

67 static void qeth_issue_next_read_cb(struct qeth_card *card,
71 static void qeth_free_qdio_queues(struct qeth_card *card);
73 static const char *qeth_get_cardname(struct qeth_card *card) in qeth_get_cardname() argument
75 if (IS_VM_NIC(card)) { in qeth_get_cardname()
76 switch (card->info.type) { in qeth_get_cardname()
89 switch (card->info.type) { in qeth_get_cardname()
106 const char *qeth_get_cardname_short(struct qeth_card *card) in qeth_get_cardname_short() argument
108 if (IS_VM_NIC(card)) { in qeth_get_cardname_short()
109 switch (card->info.type) { in qeth_get_cardname_short()
122 switch (card->info.type) { in qeth_get_cardname_short()
124 switch (card->info.link_type) { in qeth_get_cardname_short()
159 void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads, in qeth_set_allowed_threads() argument
164 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_set_allowed_threads()
165 card->thread_allowed_mask = threads; in qeth_set_allowed_threads()
167 card->thread_start_mask &= threads; in qeth_set_allowed_threads()
168 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_set_allowed_threads()
169 wake_up(&card->wait_q); in qeth_set_allowed_threads()
173 int qeth_threads_running(struct qeth_card *card, unsigned long threads) in qeth_threads_running() argument
178 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_threads_running()
179 rc = (card->thread_running_mask & threads); in qeth_threads_running()
180 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_threads_running()
185 static void qeth_clear_working_pool_list(struct qeth_card *card) in qeth_clear_working_pool_list() argument
188 struct qeth_qdio_q *queue = card->qdio.in_q; in qeth_clear_working_pool_list()
191 QETH_CARD_TEXT(card, 5, "clwrklst"); in qeth_clear_working_pool_list()
193 &card->qdio.in_buf_pool.entry_list, list) in qeth_clear_working_pool_list()
215 static void qeth_free_buffer_pool(struct qeth_card *card) in qeth_free_buffer_pool() argument
219 list_for_each_entry_safe(entry, tmp, &card->qdio.init_pool.entry_list, in qeth_free_buffer_pool()
247 static int qeth_alloc_buffer_pool(struct qeth_card *card) in qeth_alloc_buffer_pool() argument
249 unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_alloc_buffer_pool()
252 QETH_CARD_TEXT(card, 5, "alocpool"); in qeth_alloc_buffer_pool()
253 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { in qeth_alloc_buffer_pool()
258 qeth_free_buffer_pool(card); in qeth_alloc_buffer_pool()
262 list_add(&entry->init_list, &card->qdio.init_pool.entry_list); in qeth_alloc_buffer_pool()
267 int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count) in qeth_resize_buffer_pool() argument
269 unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_resize_buffer_pool()
270 struct qeth_qdio_buffer_pool *pool = &card->qdio.init_pool; in qeth_resize_buffer_pool()
275 QETH_CARD_TEXT(card, 2, "realcbp"); in qeth_resize_buffer_pool()
278 if (!card->qdio.in_q) in qeth_resize_buffer_pool()
313 card->qdio.in_buf_pool.buf_count = count; in qeth_resize_buffer_pool()
348 static int qeth_cq_init(struct qeth_card *card) in qeth_cq_init() argument
352 if (card->options.cq == QETH_CQ_ENABLED) { in qeth_cq_init()
353 QETH_CARD_TEXT(card, 2, "cqinit"); in qeth_cq_init()
354 qdio_reset_buffers(card->qdio.c_q->qdio_bufs, in qeth_cq_init()
356 card->qdio.c_q->next_buf_to_init = 127; in qeth_cq_init()
357 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, in qeth_cq_init()
358 card->qdio.no_in_queues - 1, 0, 127, NULL); in qeth_cq_init()
360 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_cq_init()
369 static int qeth_alloc_cq(struct qeth_card *card) in qeth_alloc_cq() argument
371 if (card->options.cq == QETH_CQ_ENABLED) { in qeth_alloc_cq()
372 QETH_CARD_TEXT(card, 2, "cqon"); in qeth_alloc_cq()
373 card->qdio.c_q = qeth_alloc_qdio_queue(); in qeth_alloc_cq()
374 if (!card->qdio.c_q) { in qeth_alloc_cq()
375 dev_err(&card->gdev->dev, "Failed to create completion queue\n"); in qeth_alloc_cq()
379 card->qdio.no_in_queues = 2; in qeth_alloc_cq()
381 QETH_CARD_TEXT(card, 2, "nocq"); in qeth_alloc_cq()
382 card->qdio.c_q = NULL; in qeth_alloc_cq()
383 card->qdio.no_in_queues = 1; in qeth_alloc_cq()
385 QETH_CARD_TEXT_(card, 2, "iqc%d", card->qdio.no_in_queues); in qeth_alloc_cq()
389 static void qeth_free_cq(struct qeth_card *card) in qeth_free_cq() argument
391 if (card->qdio.c_q) { in qeth_free_cq()
392 --card->qdio.no_in_queues; in qeth_free_cq()
393 qeth_free_qdio_queue(card->qdio.c_q); in qeth_free_cq()
394 card->qdio.c_q = NULL; in qeth_free_cq()
439 static int __qeth_issue_next_read(struct qeth_card *card) in __qeth_issue_next_read() argument
441 struct qeth_cmd_buffer *iob = card->read_cmd; in __qeth_issue_next_read()
446 QETH_CARD_TEXT(card, 5, "issnxrd"); in __qeth_issue_next_read()
456 QETH_CARD_TEXT(card, 6, "noirqpnd"); in __qeth_issue_next_read()
462 rc, CARD_DEVID(card)); in __qeth_issue_next_read()
463 qeth_unlock_channel(card, channel); in __qeth_issue_next_read()
465 card->read_or_write_problem = 1; in __qeth_issue_next_read()
466 qeth_schedule_recovery(card); in __qeth_issue_next_read()
471 static int qeth_issue_next_read(struct qeth_card *card) in qeth_issue_next_read() argument
475 spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_issue_next_read()
476 ret = __qeth_issue_next_read(card); in qeth_issue_next_read()
477 spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_issue_next_read()
482 static void qeth_enqueue_cmd(struct qeth_card *card, in qeth_enqueue_cmd() argument
485 spin_lock_irq(&card->lock); in qeth_enqueue_cmd()
486 list_add_tail(&iob->list_entry, &card->cmd_waiter_list); in qeth_enqueue_cmd()
487 spin_unlock_irq(&card->lock); in qeth_enqueue_cmd()
490 static void qeth_dequeue_cmd(struct qeth_card *card, in qeth_dequeue_cmd() argument
493 spin_lock_irq(&card->lock); in qeth_dequeue_cmd()
495 spin_unlock_irq(&card->lock); in qeth_dequeue_cmd()
504 static void qeth_flush_local_addrs4(struct qeth_card *card) in qeth_flush_local_addrs4() argument
510 spin_lock_irq(&card->local_addrs4_lock); in qeth_flush_local_addrs4()
511 hash_for_each_safe(card->local_addrs4, i, tmp, addr, hnode) { in qeth_flush_local_addrs4()
515 spin_unlock_irq(&card->local_addrs4_lock); in qeth_flush_local_addrs4()
518 static void qeth_flush_local_addrs6(struct qeth_card *card) in qeth_flush_local_addrs6() argument
524 spin_lock_irq(&card->local_addrs6_lock); in qeth_flush_local_addrs6()
525 hash_for_each_safe(card->local_addrs6, i, tmp, addr, hnode) { in qeth_flush_local_addrs6()
529 spin_unlock_irq(&card->local_addrs6_lock); in qeth_flush_local_addrs6()
532 static void qeth_flush_local_addrs(struct qeth_card *card) in qeth_flush_local_addrs() argument
534 qeth_flush_local_addrs4(card); in qeth_flush_local_addrs()
535 qeth_flush_local_addrs6(card); in qeth_flush_local_addrs()
538 static void qeth_add_local_addrs4(struct qeth_card *card, in qeth_add_local_addrs4() argument
545 dev_err_ratelimited(&card->gdev->dev, in qeth_add_local_addrs4()
551 spin_lock(&card->local_addrs4_lock); in qeth_add_local_addrs4()
557 hash_for_each_possible(card->local_addrs4, addr, hnode, key) { in qeth_add_local_addrs4()
569 dev_err(&card->gdev->dev, in qeth_add_local_addrs4()
576 hash_add_rcu(card->local_addrs4, &addr->hnode, key); in qeth_add_local_addrs4()
578 spin_unlock(&card->local_addrs4_lock); in qeth_add_local_addrs4()
581 static void qeth_add_local_addrs6(struct qeth_card *card, in qeth_add_local_addrs6() argument
588 dev_err_ratelimited(&card->gdev->dev, in qeth_add_local_addrs6()
594 spin_lock(&card->local_addrs6_lock); in qeth_add_local_addrs6()
600 hash_for_each_possible(card->local_addrs6, addr, hnode, key) { in qeth_add_local_addrs6()
612 dev_err(&card->gdev->dev, in qeth_add_local_addrs6()
619 hash_add_rcu(card->local_addrs6, &addr->hnode, key); in qeth_add_local_addrs6()
621 spin_unlock(&card->local_addrs6_lock); in qeth_add_local_addrs6()
624 static void qeth_del_local_addrs4(struct qeth_card *card, in qeth_del_local_addrs4() argument
631 dev_err_ratelimited(&card->gdev->dev, in qeth_del_local_addrs4()
637 spin_lock(&card->local_addrs4_lock); in qeth_del_local_addrs4()
643 hash_for_each_possible(card->local_addrs4, tmp, hnode, key) { in qeth_del_local_addrs4()
651 spin_unlock(&card->local_addrs4_lock); in qeth_del_local_addrs4()
654 static void qeth_del_local_addrs6(struct qeth_card *card, in qeth_del_local_addrs6() argument
661 dev_err_ratelimited(&card->gdev->dev, in qeth_del_local_addrs6()
667 spin_lock(&card->local_addrs6_lock); in qeth_del_local_addrs6()
673 hash_for_each_possible(card->local_addrs6, tmp, hnode, key) { in qeth_del_local_addrs6()
681 spin_unlock(&card->local_addrs6_lock); in qeth_del_local_addrs6()
684 static bool qeth_next_hop_is_local_v4(struct qeth_card *card, in qeth_next_hop_is_local_v4() argument
692 if (hash_empty(card->local_addrs4)) in qeth_next_hop_is_local_v4()
700 hash_for_each_possible_rcu(card->local_addrs4, tmp, hnode, key) { in qeth_next_hop_is_local_v4()
711 static bool qeth_next_hop_is_local_v6(struct qeth_card *card, in qeth_next_hop_is_local_v6() argument
719 if (hash_empty(card->local_addrs6)) in qeth_next_hop_is_local_v6()
727 hash_for_each_possible_rcu(card->local_addrs6, tmp, hnode, key) { in qeth_next_hop_is_local_v6()
740 struct qeth_card *card = m->private; in qeth_debugfs_local_addr_show() local
745 hash_for_each_rcu(card->local_addrs4, i, tmp, hnode) in qeth_debugfs_local_addr_show()
747 hash_for_each_rcu(card->local_addrs6, i, tmp, hnode) in qeth_debugfs_local_addr_show()
757 struct qeth_card *card) in qeth_issue_ipa_msg() argument
766 ipa_name, com, CARD_DEVID(card), rc, in qeth_issue_ipa_msg()
770 ipa_name, com, CARD_DEVID(card)); in qeth_issue_ipa_msg()
773 static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, in qeth_check_ipa_data() argument
776 QETH_CARD_TEXT(card, 5, "chkipad"); in qeth_check_ipa_data()
780 qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card); in qeth_check_ipa_data()
788 dev_err(&card->gdev->dev, in qeth_check_ipa_data()
790 netdev_name(card->dev)); in qeth_check_ipa_data()
792 qeth_schedule_recovery(card); in qeth_check_ipa_data()
795 dev_warn(&card->gdev->dev, in qeth_check_ipa_data()
797 netdev_name(card->dev), card->info.chpid); in qeth_check_ipa_data()
798 qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card); in qeth_check_ipa_data()
799 netif_carrier_off(card->dev); in qeth_check_ipa_data()
803 dev_info(&card->gdev->dev, in qeth_check_ipa_data()
805 netdev_name(card->dev), card->info.chpid); in qeth_check_ipa_data()
806 if (card->info.hwtrap) in qeth_check_ipa_data()
807 card->info.hwtrap = 2; in qeth_check_ipa_data()
808 qeth_schedule_recovery(card); in qeth_check_ipa_data()
813 if (card->discipline->control_event_handler(card, cmd)) in qeth_check_ipa_data()
818 qeth_add_local_addrs4(card, &cmd->data.local_addrs4); in qeth_check_ipa_data()
820 qeth_add_local_addrs6(card, &cmd->data.local_addrs6); in qeth_check_ipa_data()
822 QETH_CARD_TEXT(card, 3, "irla"); in qeth_check_ipa_data()
826 qeth_del_local_addrs4(card, &cmd->data.local_addrs4); in qeth_check_ipa_data()
828 qeth_del_local_addrs6(card, &cmd->data.local_addrs6); in qeth_check_ipa_data()
830 QETH_CARD_TEXT(card, 3, "urla"); in qeth_check_ipa_data()
838 static void qeth_clear_ipacmd_list(struct qeth_card *card) in qeth_clear_ipacmd_list() argument
843 QETH_CARD_TEXT(card, 4, "clipalst"); in qeth_clear_ipacmd_list()
845 spin_lock_irqsave(&card->lock, flags); in qeth_clear_ipacmd_list()
846 list_for_each_entry(iob, &card->cmd_waiter_list, list_entry) in qeth_clear_ipacmd_list()
848 spin_unlock_irqrestore(&card->lock, flags); in qeth_clear_ipacmd_list()
851 static int qeth_check_idx_response(struct qeth_card *card, in qeth_check_idx_response() argument
858 QETH_CARD_TEXT(card, 2, "ckidxres"); in qeth_check_idx_response()
859 QETH_CARD_TEXT(card, 2, " idxterm"); in qeth_check_idx_response()
860 QETH_CARD_TEXT_(card, 2, "rc%x", buffer[4]); in qeth_check_idx_response()
863 dev_err(&card->gdev->dev, in qeth_check_idx_response()
872 static void qeth_release_buffer_cb(struct qeth_card *card, in qeth_release_buffer_cb() argument
914 static void qeth_issue_next_read_cb(struct qeth_card *card, in qeth_issue_next_read_cb() argument
925 QETH_CARD_TEXT(card, 4, "sndctlcb"); in qeth_issue_next_read_cb()
926 rc = qeth_check_idx_response(card, iob->data); in qeth_issue_next_read_cb()
931 qeth_schedule_recovery(card); in qeth_issue_next_read_cb()
934 qeth_clear_ipacmd_list(card); in qeth_issue_next_read_cb()
940 cmd = qeth_check_ipa_data(card, cmd); in qeth_issue_next_read_cb()
946 spin_lock_irqsave(&card->lock, flags); in qeth_issue_next_read_cb()
947 list_for_each_entry(tmp, &card->cmd_waiter_list, list_entry) { in qeth_issue_next_read_cb()
955 spin_unlock_irqrestore(&card->lock, flags); in qeth_issue_next_read_cb()
971 rc = reply->callback(card, reply, cmd ? (unsigned long)cmd : in qeth_issue_next_read_cb()
980 memcpy(&card->seqno.pdu_hdr_ack, in qeth_issue_next_read_cb()
983 __qeth_issue_next_read(card); in qeth_issue_next_read_cb()
988 static int qeth_set_thread_start_bit(struct qeth_card *card, in qeth_set_thread_start_bit() argument
994 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_set_thread_start_bit()
995 if (!(card->thread_allowed_mask & thread)) in qeth_set_thread_start_bit()
997 else if (card->thread_start_mask & thread) in qeth_set_thread_start_bit()
1000 card->thread_start_mask |= thread; in qeth_set_thread_start_bit()
1001 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_set_thread_start_bit()
1006 static void qeth_clear_thread_start_bit(struct qeth_card *card, in qeth_clear_thread_start_bit() argument
1011 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_clear_thread_start_bit()
1012 card->thread_start_mask &= ~thread; in qeth_clear_thread_start_bit()
1013 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_clear_thread_start_bit()
1014 wake_up(&card->wait_q); in qeth_clear_thread_start_bit()
1017 static void qeth_clear_thread_running_bit(struct qeth_card *card, in qeth_clear_thread_running_bit() argument
1022 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_clear_thread_running_bit()
1023 card->thread_running_mask &= ~thread; in qeth_clear_thread_running_bit()
1024 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_clear_thread_running_bit()
1025 wake_up_all(&card->wait_q); in qeth_clear_thread_running_bit()
1028 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread) in __qeth_do_run_thread() argument
1033 spin_lock_irqsave(&card->thread_mask_lock, flags); in __qeth_do_run_thread()
1034 if (card->thread_start_mask & thread) { in __qeth_do_run_thread()
1035 if ((card->thread_allowed_mask & thread) && in __qeth_do_run_thread()
1036 !(card->thread_running_mask & thread)) { in __qeth_do_run_thread()
1038 card->thread_start_mask &= ~thread; in __qeth_do_run_thread()
1039 card->thread_running_mask |= thread; in __qeth_do_run_thread()
1043 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in __qeth_do_run_thread()
1047 static int qeth_do_run_thread(struct qeth_card *card, unsigned long thread) in qeth_do_run_thread() argument
1051 wait_event(card->wait_q, in qeth_do_run_thread()
1052 (rc = __qeth_do_run_thread(card, thread)) >= 0); in qeth_do_run_thread()
1056 int qeth_schedule_recovery(struct qeth_card *card) in qeth_schedule_recovery() argument
1060 QETH_CARD_TEXT(card, 2, "startrec"); in qeth_schedule_recovery()
1062 rc = qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_schedule_recovery()
1064 schedule_work(&card->kernel_thread_starter); in qeth_schedule_recovery()
1069 static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev, in qeth_get_problem() argument
1082 QETH_CARD_TEXT(card, 2, "CGENCHK"); in qeth_get_problem()
1095 QETH_CARD_TEXT(card, 2, "REVIND"); in qeth_get_problem()
1100 QETH_CARD_TEXT(card, 2, "CMDREJi"); in qeth_get_problem()
1104 QETH_CARD_TEXT(card, 2, "AFFE"); in qeth_get_problem()
1108 QETH_CARD_TEXT(card, 2, "ZEROSEN"); in qeth_get_problem()
1111 QETH_CARD_TEXT(card, 2, "DGENCHK"); in qeth_get_problem()
1117 static int qeth_check_irb_error(struct qeth_card *card, struct ccw_device *cdev, in qeth_check_irb_error() argument
1127 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1128 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); in qeth_check_irb_error()
1133 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1134 QETH_CARD_TEXT_(card, 2, " rc%d", -ETIMEDOUT); in qeth_check_irb_error()
1139 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1140 QETH_CARD_TEXT(card, 2, " rc???"); in qeth_check_irb_error()
1153 struct qeth_card *card; in qeth_irq() local
1157 card = dev_get_drvdata(&gdev->dev); in qeth_irq()
1159 QETH_CARD_TEXT(card, 5, "irq"); in qeth_irq()
1161 if (card->read.ccwdev == cdev) { in qeth_irq()
1162 channel = &card->read; in qeth_irq()
1163 QETH_CARD_TEXT(card, 5, "read"); in qeth_irq()
1164 } else if (card->write.ccwdev == cdev) { in qeth_irq()
1165 channel = &card->write; in qeth_irq()
1166 QETH_CARD_TEXT(card, 5, "write"); in qeth_irq()
1168 channel = &card->data; in qeth_irq()
1169 QETH_CARD_TEXT(card, 5, "data"); in qeth_irq()
1173 QETH_CARD_TEXT(card, 5, "irqunsol"); in qeth_irq()
1175 QETH_CARD_TEXT(card, 5, "irqunexp"); in qeth_irq()
1186 qeth_unlock_channel(card, channel); in qeth_irq()
1188 rc = qeth_check_irb_error(card, cdev, irb); in qeth_irq()
1198 wake_up(&card->wait_q); in qeth_irq()
1203 wake_up(&card->wait_q); in qeth_irq()
1231 rc = qeth_get_problem(card, cdev, irb); in qeth_irq()
1233 card->read_or_write_problem = 1; in qeth_irq()
1236 qeth_clear_ipacmd_list(card); in qeth_irq()
1237 qeth_schedule_recovery(card); in qeth_irq()
1249 iob->callback(card, iob, in qeth_irq()
1263 QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification); in qeth_notify_skbs()
1264 QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb); in qeth_notify_skbs()
1345 static void qeth_tx_complete_pending_bufs(struct qeth_card *card, in qeth_tx_complete_pending_bufs() argument
1359 QETH_CARD_TEXT(card, 5, "fp"); in qeth_tx_complete_pending_bufs()
1360 QETH_CARD_TEXT_(card, 5, "%lx", (long) buf); in qeth_tx_complete_pending_bufs()
1387 qeth_tx_complete_pending_bufs(q->card, q, true, 0); in qeth_drain_output_queue()
1401 static void qeth_drain_output_queues(struct qeth_card *card) in qeth_drain_output_queues() argument
1405 QETH_CARD_TEXT(card, 2, "clearqdbf"); in qeth_drain_output_queues()
1407 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_drain_output_queues()
1408 if (card->qdio.out_qs[i]) in qeth_drain_output_queues()
1409 qeth_drain_output_queue(card->qdio.out_qs[i], false); in qeth_drain_output_queues()
1413 static void qeth_osa_set_output_queues(struct qeth_card *card, bool single) in qeth_osa_set_output_queues() argument
1415 unsigned int max = single ? 1 : card->dev->num_tx_queues; in qeth_osa_set_output_queues()
1417 if (card->qdio.no_out_queues == max) in qeth_osa_set_output_queues()
1420 if (atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED) in qeth_osa_set_output_queues()
1421 qeth_free_qdio_queues(card); in qeth_osa_set_output_queues()
1423 if (max == 1 && card->qdio.do_prio_queueing != QETH_PRIOQ_DEFAULT) in qeth_osa_set_output_queues()
1424 dev_info(&card->gdev->dev, "Priority Queueing not supported\n"); in qeth_osa_set_output_queues()
1426 card->qdio.no_out_queues = max; in qeth_osa_set_output_queues()
1429 static int qeth_update_from_chp_desc(struct qeth_card *card) in qeth_update_from_chp_desc() argument
1434 QETH_CARD_TEXT(card, 2, "chp_desc"); in qeth_update_from_chp_desc()
1436 ccwdev = card->data.ccwdev; in qeth_update_from_chp_desc()
1441 card->info.func_level = 0x4100 + chp_dsc->desc; in qeth_update_from_chp_desc()
1443 if (IS_OSD(card) || IS_OSX(card)) in qeth_update_from_chp_desc()
1445 qeth_osa_set_output_queues(card, chp_dsc->chpp & 0x02); in qeth_update_from_chp_desc()
1448 QETH_CARD_TEXT_(card, 2, "nr:%x", card->qdio.no_out_queues); in qeth_update_from_chp_desc()
1449 QETH_CARD_TEXT_(card, 2, "lvl:%02x", card->info.func_level); in qeth_update_from_chp_desc()
1453 static void qeth_init_qdio_info(struct qeth_card *card) in qeth_init_qdio_info() argument
1455 QETH_CARD_TEXT(card, 4, "intqdinf"); in qeth_init_qdio_info()
1456 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); in qeth_init_qdio_info()
1457 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; in qeth_init_qdio_info()
1458 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; in qeth_init_qdio_info()
1461 card->qdio.no_in_queues = 1; in qeth_init_qdio_info()
1462 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; in qeth_init_qdio_info()
1463 if (IS_IQD(card)) in qeth_init_qdio_info()
1464 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT; in qeth_init_qdio_info()
1466 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; in qeth_init_qdio_info()
1467 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count; in qeth_init_qdio_info()
1468 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list); in qeth_init_qdio_info()
1469 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list); in qeth_init_qdio_info()
1472 static void qeth_set_initial_options(struct qeth_card *card) in qeth_set_initial_options() argument
1474 card->options.route4.type = NO_ROUTER; in qeth_set_initial_options()
1475 card->options.route6.type = NO_ROUTER; in qeth_set_initial_options()
1476 card->options.isolation = ISOLATION_MODE_NONE; in qeth_set_initial_options()
1477 card->options.cq = QETH_CQ_DISABLED; in qeth_set_initial_options()
1478 card->options.layer = QETH_DISCIPLINE_UNDETERMINED; in qeth_set_initial_options()
1481 static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread) in qeth_do_start_thread() argument
1486 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_do_start_thread()
1487 QETH_CARD_TEXT_(card, 4, " %02x%02x%02x", in qeth_do_start_thread()
1488 (u8) card->thread_start_mask, in qeth_do_start_thread()
1489 (u8) card->thread_allowed_mask, in qeth_do_start_thread()
1490 (u8) card->thread_running_mask); in qeth_do_start_thread()
1491 rc = (card->thread_start_mask & thread); in qeth_do_start_thread()
1492 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_do_start_thread()
1500 struct qeth_card *card = container_of(work, struct qeth_card, in qeth_start_kernel_thread() local
1502 QETH_CARD_TEXT(card, 2, "strthrd"); in qeth_start_kernel_thread()
1504 if (card->read.state != CH_STATE_UP && in qeth_start_kernel_thread()
1505 card->write.state != CH_STATE_UP) in qeth_start_kernel_thread()
1507 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) { in qeth_start_kernel_thread()
1508 ts = kthread_run(qeth_do_reset, card, "qeth_recover"); in qeth_start_kernel_thread()
1510 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_start_kernel_thread()
1511 qeth_clear_thread_running_bit(card, in qeth_start_kernel_thread()
1518 static void qeth_setup_card(struct qeth_card *card) in qeth_setup_card() argument
1520 QETH_CARD_TEXT(card, 2, "setupcrd"); in qeth_setup_card()
1522 card->info.type = CARD_RDEV(card)->id.driver_info; in qeth_setup_card()
1523 card->state = CARD_STATE_DOWN; in qeth_setup_card()
1524 spin_lock_init(&card->lock); in qeth_setup_card()
1525 spin_lock_init(&card->thread_mask_lock); in qeth_setup_card()
1526 mutex_init(&card->conf_mutex); in qeth_setup_card()
1527 mutex_init(&card->discipline_mutex); in qeth_setup_card()
1528 INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread); in qeth_setup_card()
1529 INIT_LIST_HEAD(&card->cmd_waiter_list); in qeth_setup_card()
1530 init_waitqueue_head(&card->wait_q); in qeth_setup_card()
1531 qeth_set_initial_options(card); in qeth_setup_card()
1533 INIT_LIST_HEAD(&card->ipato.entries); in qeth_setup_card()
1534 qeth_init_qdio_info(card); in qeth_setup_card()
1535 INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work); in qeth_setup_card()
1536 hash_init(card->rx_mode_addrs); in qeth_setup_card()
1537 hash_init(card->local_addrs4); in qeth_setup_card()
1538 hash_init(card->local_addrs6); in qeth_setup_card()
1539 spin_lock_init(&card->local_addrs4_lock); in qeth_setup_card()
1540 spin_lock_init(&card->local_addrs6_lock); in qeth_setup_card()
1545 struct qeth_card *card = container_of(slr, struct qeth_card, in qeth_core_sl_print() local
1547 if (card->info.mcl_level[0]) in qeth_core_sl_print()
1549 CARD_BUS_ID(card), card->info.mcl_level); in qeth_core_sl_print()
1554 struct qeth_card *card; in qeth_alloc_card() local
1557 card = kzalloc(sizeof(*card), GFP_KERNEL); in qeth_alloc_card()
1558 if (!card) in qeth_alloc_card()
1560 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in qeth_alloc_card()
1562 card->gdev = gdev; in qeth_alloc_card()
1563 dev_set_drvdata(&gdev->dev, card); in qeth_alloc_card()
1564 CARD_RDEV(card) = gdev->cdev[0]; in qeth_alloc_card()
1565 CARD_WDEV(card) = gdev->cdev[1]; in qeth_alloc_card()
1566 CARD_DDEV(card) = gdev->cdev[2]; in qeth_alloc_card()
1568 card->event_wq = alloc_ordered_workqueue("%s_event", 0, in qeth_alloc_card()
1570 if (!card->event_wq) in qeth_alloc_card()
1573 card->read_cmd = qeth_alloc_cmd(&card->read, QETH_BUFSIZE, 1, 0); in qeth_alloc_card()
1574 if (!card->read_cmd) in qeth_alloc_card()
1577 card->debugfs = debugfs_create_dir(dev_name(&gdev->dev), in qeth_alloc_card()
1579 debugfs_create_file("local_addrs", 0400, card->debugfs, card, in qeth_alloc_card()
1582 card->qeth_service_level.seq_print = qeth_core_sl_print; in qeth_alloc_card()
1583 register_service_level(&card->qeth_service_level); in qeth_alloc_card()
1584 return card; in qeth_alloc_card()
1587 destroy_workqueue(card->event_wq); in qeth_alloc_card()
1590 kfree(card); in qeth_alloc_card()
1595 static int qeth_clear_channel(struct qeth_card *card, in qeth_clear_channel() argument
1600 QETH_CARD_TEXT(card, 3, "clearch"); in qeth_clear_channel()
1607 rc = wait_event_interruptible_timeout(card->wait_q, in qeth_clear_channel()
1617 static int qeth_halt_channel(struct qeth_card *card, in qeth_halt_channel() argument
1622 QETH_CARD_TEXT(card, 3, "haltch"); in qeth_halt_channel()
1629 rc = wait_event_interruptible_timeout(card->wait_q, in qeth_halt_channel()
1681 static int qeth_halt_channels(struct qeth_card *card) in qeth_halt_channels() argument
1685 QETH_CARD_TEXT(card, 3, "haltchs"); in qeth_halt_channels()
1686 rc1 = qeth_halt_channel(card, &card->read); in qeth_halt_channels()
1687 rc2 = qeth_halt_channel(card, &card->write); in qeth_halt_channels()
1688 rc3 = qeth_halt_channel(card, &card->data); in qeth_halt_channels()
1696 static int qeth_clear_channels(struct qeth_card *card) in qeth_clear_channels() argument
1700 QETH_CARD_TEXT(card, 3, "clearchs"); in qeth_clear_channels()
1701 rc1 = qeth_clear_channel(card, &card->read); in qeth_clear_channels()
1702 rc2 = qeth_clear_channel(card, &card->write); in qeth_clear_channels()
1703 rc3 = qeth_clear_channel(card, &card->data); in qeth_clear_channels()
1711 static int qeth_clear_halt_card(struct qeth_card *card, int halt) in qeth_clear_halt_card() argument
1715 QETH_CARD_TEXT(card, 3, "clhacrd"); in qeth_clear_halt_card()
1718 rc = qeth_halt_channels(card); in qeth_clear_halt_card()
1721 return qeth_clear_channels(card); in qeth_clear_halt_card()
1724 static int qeth_qdio_clear_card(struct qeth_card *card, int use_halt) in qeth_qdio_clear_card() argument
1728 QETH_CARD_TEXT(card, 3, "qdioclr"); in qeth_qdio_clear_card()
1729 switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED, in qeth_qdio_clear_card()
1732 if (IS_IQD(card)) in qeth_qdio_clear_card()
1733 rc = qdio_shutdown(CARD_DDEV(card), in qeth_qdio_clear_card()
1736 rc = qdio_shutdown(CARD_DDEV(card), in qeth_qdio_clear_card()
1739 QETH_CARD_TEXT_(card, 3, "1err%d", rc); in qeth_qdio_clear_card()
1740 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_clear_card()
1747 rc = qeth_clear_halt_card(card, use_halt); in qeth_qdio_clear_card()
1749 QETH_CARD_TEXT_(card, 3, "2err%d", rc); in qeth_qdio_clear_card()
1753 static enum qeth_discipline_id qeth_vm_detect_layer(struct qeth_card *card) in qeth_vm_detect_layer() argument
1762 QETH_CARD_TEXT(card, 2, "vmlayer"); in qeth_vm_detect_layer()
1775 ccw_device_get_id(CARD_RDEV(card), &id); in qeth_vm_detect_layer()
1805 QETH_CARD_TEXT_(card, 2, "err%x", rc); in qeth_vm_detect_layer()
1810 static enum qeth_discipline_id qeth_enforce_discipline(struct qeth_card *card) in qeth_enforce_discipline() argument
1814 if (IS_OSM(card)) in qeth_enforce_discipline()
1816 else if (IS_VM_NIC(card)) in qeth_enforce_discipline()
1817 disc = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 : in qeth_enforce_discipline()
1818 qeth_vm_detect_layer(card); in qeth_enforce_discipline()
1822 QETH_CARD_TEXT(card, 3, "force l2"); in qeth_enforce_discipline()
1825 QETH_CARD_TEXT(card, 3, "force l3"); in qeth_enforce_discipline()
1828 QETH_CARD_TEXT(card, 3, "force no"); in qeth_enforce_discipline()
1834 static void qeth_set_blkt_defaults(struct qeth_card *card) in qeth_set_blkt_defaults() argument
1836 QETH_CARD_TEXT(card, 2, "cfgblkt"); in qeth_set_blkt_defaults()
1838 if (card->info.use_v1_blkt) { in qeth_set_blkt_defaults()
1839 card->info.blkt.time_total = 0; in qeth_set_blkt_defaults()
1840 card->info.blkt.inter_packet = 0; in qeth_set_blkt_defaults()
1841 card->info.blkt.inter_packet_jumbo = 0; in qeth_set_blkt_defaults()
1843 card->info.blkt.time_total = 250; in qeth_set_blkt_defaults()
1844 card->info.blkt.inter_packet = 5; in qeth_set_blkt_defaults()
1845 card->info.blkt.inter_packet_jumbo = 15; in qeth_set_blkt_defaults()
1849 static void qeth_idx_init(struct qeth_card *card) in qeth_idx_init() argument
1851 memset(&card->seqno, 0, sizeof(card->seqno)); in qeth_idx_init()
1853 card->token.issuer_rm_w = 0x00010103UL; in qeth_idx_init()
1854 card->token.cm_filter_w = 0x00010108UL; in qeth_idx_init()
1855 card->token.cm_connection_w = 0x0001010aUL; in qeth_idx_init()
1856 card->token.ulp_filter_w = 0x0001010bUL; in qeth_idx_init()
1857 card->token.ulp_connection_w = 0x0001010dUL; in qeth_idx_init()
1859 switch (card->info.type) { in qeth_idx_init()
1861 card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD; in qeth_idx_init()
1864 card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD; in qeth_idx_init()
1871 static void qeth_idx_finalize_cmd(struct qeth_card *card, in qeth_idx_finalize_cmd() argument
1874 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data), &card->seqno.trans_hdr, in qeth_idx_finalize_cmd()
1876 if (iob->channel == &card->write) in qeth_idx_finalize_cmd()
1877 card->seqno.trans_hdr++; in qeth_idx_finalize_cmd()
1889 static void qeth_mpc_finalize_cmd(struct qeth_card *card, in qeth_mpc_finalize_cmd() argument
1892 qeth_idx_finalize_cmd(card, iob); in qeth_mpc_finalize_cmd()
1895 &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH); in qeth_mpc_finalize_cmd()
1896 card->seqno.pdu_hdr++; in qeth_mpc_finalize_cmd()
1898 &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH); in qeth_mpc_finalize_cmd()
1910 static struct qeth_cmd_buffer *qeth_mpc_alloc_cmd(struct qeth_card *card, in qeth_mpc_alloc_cmd() argument
1916 iob = qeth_alloc_cmd(&card->write, data_length, 1, QETH_TIMEOUT); in qeth_mpc_alloc_cmd()
1950 static int qeth_send_control_data(struct qeth_card *card, in qeth_send_control_data() argument
1962 QETH_CARD_TEXT(card, 2, "sendctl"); in qeth_send_control_data()
1967 timeout = wait_event_interruptible_timeout(card->wait_q, in qeth_send_control_data()
1976 iob->finalize(card, iob); in qeth_send_control_data()
1979 qeth_enqueue_cmd(card, iob); in qeth_send_control_data()
1984 QETH_CARD_TEXT(card, 6, "noirqpnd"); in qeth_send_control_data()
1991 CARD_DEVID(card), rc); in qeth_send_control_data()
1992 QETH_CARD_TEXT_(card, 2, " err%d", rc); in qeth_send_control_data()
1993 qeth_dequeue_cmd(card, iob); in qeth_send_control_data()
1995 qeth_unlock_channel(card, channel); in qeth_send_control_data()
2004 qeth_dequeue_cmd(card, iob); in qeth_send_control_data()
2029 static void qeth_read_conf_data_cb(struct qeth_card *card, in qeth_read_conf_data_cb() argument
2037 QETH_CARD_TEXT(card, 2, "cfgunit"); in qeth_read_conf_data_cb()
2044 card->info.is_vm_nic = nd->nd1.plant[0] == _ascebc['V'] && in qeth_read_conf_data_cb()
2047 card->info.chpid = tag[0]; in qeth_read_conf_data_cb()
2048 card->info.unit_addr2 = tag[1]; in qeth_read_conf_data_cb()
2051 card->info.cula = tag[1]; in qeth_read_conf_data_cb()
2053 card->info.use_v1_blkt = nd->nd3.model[0] == 0xF0 && in qeth_read_conf_data_cb()
2063 static int qeth_read_conf_data(struct qeth_card *card) in qeth_read_conf_data() argument
2065 struct qeth_channel *channel = &card->data; in qeth_read_conf_data()
2084 return qeth_send_control_data(card, iob, NULL, NULL); in qeth_read_conf_data()
2087 static int qeth_idx_check_activate_response(struct qeth_card *card, in qeth_idx_check_activate_response() argument
2093 rc = qeth_check_idx_response(card, iob->data); in qeth_idx_check_activate_response()
2101 QETH_CARD_TEXT_(card, 2, "idxneg%c", in qeth_idx_check_activate_response()
2121 static void qeth_idx_activate_read_channel_cb(struct qeth_card *card, in qeth_idx_activate_read_channel_cb() argument
2129 QETH_CARD_TEXT(card, 2, "idxrdcb"); in qeth_idx_activate_read_channel_cb()
2131 rc = qeth_idx_check_activate_response(card, channel, iob); in qeth_idx_activate_read_channel_cb()
2136 if (peer_level != qeth_peer_func_level(card->info.func_level)) { in qeth_idx_activate_read_channel_cb()
2139 card->info.func_level, peer_level); in qeth_idx_activate_read_channel_cb()
2144 memcpy(&card->token.issuer_rm_r, in qeth_idx_activate_read_channel_cb()
2147 memcpy(&card->info.mcl_level[0], in qeth_idx_activate_read_channel_cb()
2155 static void qeth_idx_activate_write_channel_cb(struct qeth_card *card, in qeth_idx_activate_write_channel_cb() argument
2163 QETH_CARD_TEXT(card, 2, "idxwrcb"); in qeth_idx_activate_write_channel_cb()
2165 rc = qeth_idx_check_activate_response(card, channel, iob); in qeth_idx_activate_write_channel_cb()
2171 qeth_peer_func_level(card->info.func_level)) { in qeth_idx_activate_write_channel_cb()
2174 card->info.func_level, peer_level); in qeth_idx_activate_write_channel_cb()
2183 static void qeth_idx_setup_activate_cmd(struct qeth_card *card, in qeth_idx_setup_activate_cmd() argument
2186 u16 addr = (card->info.cula << 8) + card->info.unit_addr2; in qeth_idx_setup_activate_cmd()
2187 u8 port = ((u8)card->dev->dev_port) | 0x80; in qeth_idx_setup_activate_cmd()
2198 &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH); in qeth_idx_setup_activate_cmd()
2200 &card->info.func_level, 2); in qeth_idx_setup_activate_cmd()
2201 memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &card->info.ddev_devno, 2); in qeth_idx_setup_activate_cmd()
2205 static int qeth_idx_activate_read_channel(struct qeth_card *card) in qeth_idx_activate_read_channel() argument
2207 struct qeth_channel *channel = &card->read; in qeth_idx_activate_read_channel()
2211 QETH_CARD_TEXT(card, 2, "idxread"); in qeth_idx_activate_read_channel()
2218 qeth_idx_setup_activate_cmd(card, iob); in qeth_idx_activate_read_channel()
2221 rc = qeth_send_control_data(card, iob, NULL, NULL); in qeth_idx_activate_read_channel()
2229 static int qeth_idx_activate_write_channel(struct qeth_card *card) in qeth_idx_activate_write_channel() argument
2231 struct qeth_channel *channel = &card->write; in qeth_idx_activate_write_channel()
2235 QETH_CARD_TEXT(card, 2, "idxwrite"); in qeth_idx_activate_write_channel()
2242 qeth_idx_setup_activate_cmd(card, iob); in qeth_idx_activate_write_channel()
2245 rc = qeth_send_control_data(card, iob, NULL, NULL); in qeth_idx_activate_write_channel()
2253 static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_cm_enable_cb() argument
2258 QETH_CARD_TEXT(card, 2, "cmenblcb"); in qeth_cm_enable_cb()
2261 memcpy(&card->token.cm_filter_r, in qeth_cm_enable_cb()
2267 static int qeth_cm_enable(struct qeth_card *card) in qeth_cm_enable() argument
2271 QETH_CARD_TEXT(card, 2, "cmenable"); in qeth_cm_enable()
2273 iob = qeth_mpc_alloc_cmd(card, CM_ENABLE, CM_ENABLE_SIZE); in qeth_cm_enable()
2278 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_enable()
2280 &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH); in qeth_cm_enable()
2282 return qeth_send_control_data(card, iob, qeth_cm_enable_cb, NULL); in qeth_cm_enable()
2285 static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_cm_setup_cb() argument
2290 QETH_CARD_TEXT(card, 2, "cmsetpcb"); in qeth_cm_setup_cb()
2293 memcpy(&card->token.cm_connection_r, in qeth_cm_setup_cb()
2299 static int qeth_cm_setup(struct qeth_card *card) in qeth_cm_setup() argument
2303 QETH_CARD_TEXT(card, 2, "cmsetup"); in qeth_cm_setup()
2305 iob = qeth_mpc_alloc_cmd(card, CM_SETUP, CM_SETUP_SIZE); in qeth_cm_setup()
2310 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2312 &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2314 &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2315 return qeth_send_control_data(card, iob, qeth_cm_setup_cb, NULL); in qeth_cm_setup()
2318 static bool qeth_is_supported_link_type(struct qeth_card *card, u8 link_type) in qeth_is_supported_link_type() argument
2322 dev_err(&card->gdev->dev, "Unsupported Token Ring device\n"); in qeth_is_supported_link_type()
2329 static int qeth_update_max_mtu(struct qeth_card *card, unsigned int max_mtu) in qeth_update_max_mtu() argument
2331 struct net_device *dev = card->dev; in qeth_update_max_mtu()
2336 if (IS_IQD(card)) in qeth_update_max_mtu()
2343 if (IS_IQD(card)) { in qeth_update_max_mtu()
2348 card->qdio.in_buf_size = max_mtu + 2 * PAGE_SIZE; in qeth_update_max_mtu()
2350 qeth_free_qdio_queues(card); in qeth_update_max_mtu()
2355 else if (IS_LAYER2(card)) in qeth_update_max_mtu()
2383 static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_ulp_enable_cb() argument
2391 QETH_CARD_TEXT(card, 2, "ulpenacb"); in qeth_ulp_enable_cb()
2394 memcpy(&card->token.ulp_filter_r, in qeth_ulp_enable_cb()
2397 if (IS_IQD(card)) { in qeth_ulp_enable_cb()
2409 if (!qeth_is_supported_link_type(card, link_type)) in qeth_ulp_enable_cb()
2413 card->info.link_type = link_type; in qeth_ulp_enable_cb()
2414 QETH_CARD_TEXT_(card, 2, "link%d", card->info.link_type); in qeth_ulp_enable_cb()
2418 static u8 qeth_mpc_select_prot_type(struct qeth_card *card) in qeth_mpc_select_prot_type() argument
2420 return IS_LAYER2(card) ? QETH_MPC_PROT_L2 : QETH_MPC_PROT_L3; in qeth_mpc_select_prot_type()
2423 static int qeth_ulp_enable(struct qeth_card *card) in qeth_ulp_enable() argument
2425 u8 prot_type = qeth_mpc_select_prot_type(card); in qeth_ulp_enable()
2430 QETH_CARD_TEXT(card, 2, "ulpenabl"); in qeth_ulp_enable()
2432 iob = qeth_mpc_alloc_cmd(card, ULP_ENABLE, ULP_ENABLE_SIZE); in qeth_ulp_enable()
2436 *(QETH_ULP_ENABLE_LINKNUM(iob->data)) = (u8) card->dev->dev_port; in qeth_ulp_enable()
2439 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_enable()
2441 &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_enable()
2442 rc = qeth_send_control_data(card, iob, qeth_ulp_enable_cb, &max_mtu); in qeth_ulp_enable()
2445 return qeth_update_max_mtu(card, max_mtu); in qeth_ulp_enable()
2448 static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_ulp_setup_cb() argument
2453 QETH_CARD_TEXT(card, 2, "ulpstpcb"); in qeth_ulp_setup_cb()
2456 memcpy(&card->token.ulp_connection_r, in qeth_ulp_setup_cb()
2461 QETH_CARD_TEXT(card, 2, "olmlimit"); in qeth_ulp_setup_cb()
2462 dev_err(&card->gdev->dev, "A connection could not be " in qeth_ulp_setup_cb()
2469 static int qeth_ulp_setup(struct qeth_card *card) in qeth_ulp_setup() argument
2474 QETH_CARD_TEXT(card, 2, "ulpsetup"); in qeth_ulp_setup()
2476 iob = qeth_mpc_alloc_cmd(card, ULP_SETUP, ULP_SETUP_SIZE); in qeth_ulp_setup()
2481 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2483 &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2485 &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2487 memcpy(QETH_ULP_SETUP_CUA(iob->data), &card->info.ddev_devno, 2); in qeth_ulp_setup()
2488 temp = (card->info.cula << 8) + card->info.unit_addr2; in qeth_ulp_setup()
2490 return qeth_send_control_data(card, iob, qeth_ulp_setup_cb, NULL); in qeth_ulp_setup()
2555 static int qeth_alloc_qdio_queues(struct qeth_card *card) in qeth_alloc_qdio_queues() argument
2559 QETH_CARD_TEXT(card, 2, "allcqdbf"); in qeth_alloc_qdio_queues()
2561 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED, in qeth_alloc_qdio_queues()
2565 QETH_CARD_TEXT(card, 2, "inq"); in qeth_alloc_qdio_queues()
2566 card->qdio.in_q = qeth_alloc_qdio_queue(); in qeth_alloc_qdio_queues()
2567 if (!card->qdio.in_q) in qeth_alloc_qdio_queues()
2571 if (qeth_alloc_buffer_pool(card)) in qeth_alloc_qdio_queues()
2575 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_alloc_qdio_queues()
2581 QETH_CARD_TEXT_(card, 2, "outq %i", i); in qeth_alloc_qdio_queues()
2582 QETH_CARD_HEX(card, 2, &queue, sizeof(void *)); in qeth_alloc_qdio_queues()
2583 card->qdio.out_qs[i] = queue; in qeth_alloc_qdio_queues()
2584 queue->card = card; in qeth_alloc_qdio_queues()
2589 if (IS_IQD(card)) { in qeth_alloc_qdio_queues()
2602 if (qeth_alloc_cq(card)) in qeth_alloc_qdio_queues()
2609 qeth_free_output_queue(card->qdio.out_qs[--i]); in qeth_alloc_qdio_queues()
2610 card->qdio.out_qs[i] = NULL; in qeth_alloc_qdio_queues()
2612 qeth_free_buffer_pool(card); in qeth_alloc_qdio_queues()
2614 qeth_free_qdio_queue(card->qdio.in_q); in qeth_alloc_qdio_queues()
2615 card->qdio.in_q = NULL; in qeth_alloc_qdio_queues()
2617 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); in qeth_alloc_qdio_queues()
2621 static void qeth_free_qdio_queues(struct qeth_card *card) in qeth_free_qdio_queues() argument
2625 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == in qeth_free_qdio_queues()
2629 qeth_free_cq(card); in qeth_free_qdio_queues()
2631 if (card->qdio.in_q->bufs[j].rx_skb) in qeth_free_qdio_queues()
2632 dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb); in qeth_free_qdio_queues()
2634 qeth_free_qdio_queue(card->qdio.in_q); in qeth_free_qdio_queues()
2635 card->qdio.in_q = NULL; in qeth_free_qdio_queues()
2637 qeth_free_buffer_pool(card); in qeth_free_qdio_queues()
2639 for (i = 0; i < card->qdio.no_out_queues; i++) { in qeth_free_qdio_queues()
2640 qeth_free_output_queue(card->qdio.out_qs[i]); in qeth_free_qdio_queues()
2641 card->qdio.out_qs[i] = NULL; in qeth_free_qdio_queues()
2645 static void qeth_fill_qib_parms(struct qeth_card *card, in qeth_fill_qib_parms() argument
2656 parms->pcit_a = QETH_PCI_THRESHOLD_A(card); in qeth_fill_qib_parms()
2657 parms->pcit_b = QETH_PCI_THRESHOLD_B(card); in qeth_fill_qib_parms()
2658 parms->pcit_c = QETH_PCI_TIMER_VALUE(card); in qeth_fill_qib_parms()
2665 parms->blkt_total = card->info.blkt.time_total; in qeth_fill_qib_parms()
2666 parms->blkt_inter_packet = card->info.blkt.inter_packet; in qeth_fill_qib_parms()
2667 parms->blkt_inter_packet_jumbo = card->info.blkt.inter_packet_jumbo; in qeth_fill_qib_parms()
2670 if (qeth_uses_tx_prio_queueing(card) || card->qdio.no_out_queues == 1) in qeth_fill_qib_parms()
2681 qeth_for_each_output_queue(card, queue, i) in qeth_fill_qib_parms()
2685 static int qeth_qdio_activate(struct qeth_card *card) in qeth_qdio_activate() argument
2687 QETH_CARD_TEXT(card, 3, "qdioact"); in qeth_qdio_activate()
2688 return qdio_activate(CARD_DDEV(card)); in qeth_qdio_activate()
2691 static int qeth_dm_act(struct qeth_card *card) in qeth_dm_act() argument
2695 QETH_CARD_TEXT(card, 2, "dmact"); in qeth_dm_act()
2697 iob = qeth_mpc_alloc_cmd(card, DM_ACT, DM_ACT_SIZE); in qeth_dm_act()
2702 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_dm_act()
2704 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_dm_act()
2705 return qeth_send_control_data(card, iob, NULL, NULL); in qeth_dm_act()
2708 static int qeth_mpc_initialize(struct qeth_card *card) in qeth_mpc_initialize() argument
2712 QETH_CARD_TEXT(card, 2, "mpcinit"); in qeth_mpc_initialize()
2714 rc = qeth_issue_next_read(card); in qeth_mpc_initialize()
2716 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_mpc_initialize()
2719 rc = qeth_cm_enable(card); in qeth_mpc_initialize()
2721 QETH_CARD_TEXT_(card, 2, "2err%d", rc); in qeth_mpc_initialize()
2724 rc = qeth_cm_setup(card); in qeth_mpc_initialize()
2726 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_mpc_initialize()
2729 rc = qeth_ulp_enable(card); in qeth_mpc_initialize()
2731 QETH_CARD_TEXT_(card, 2, "4err%d", rc); in qeth_mpc_initialize()
2734 rc = qeth_ulp_setup(card); in qeth_mpc_initialize()
2736 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_mpc_initialize()
2739 rc = qeth_alloc_qdio_queues(card); in qeth_mpc_initialize()
2741 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_mpc_initialize()
2744 rc = qeth_qdio_establish(card); in qeth_mpc_initialize()
2746 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_mpc_initialize()
2747 qeth_free_qdio_queues(card); in qeth_mpc_initialize()
2750 rc = qeth_qdio_activate(card); in qeth_mpc_initialize()
2752 QETH_CARD_TEXT_(card, 2, "7err%d", rc); in qeth_mpc_initialize()
2755 rc = qeth_dm_act(card); in qeth_mpc_initialize()
2757 QETH_CARD_TEXT_(card, 2, "8err%d", rc); in qeth_mpc_initialize()
2764 static void qeth_print_status_message(struct qeth_card *card) in qeth_print_status_message() argument
2766 switch (card->info.type) { in qeth_print_status_message()
2774 if (!card->info.mcl_level[0]) { in qeth_print_status_message()
2775 sprintf(card->info.mcl_level, "%02x%02x", in qeth_print_status_message()
2776 card->info.mcl_level[2], in qeth_print_status_message()
2777 card->info.mcl_level[3]); in qeth_print_status_message()
2782 if (IS_VM_NIC(card) || (card->info.mcl_level[0] & 0x80)) { in qeth_print_status_message()
2783 card->info.mcl_level[0] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2784 card->info.mcl_level[0]]; in qeth_print_status_message()
2785 card->info.mcl_level[1] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2786 card->info.mcl_level[1]]; in qeth_print_status_message()
2787 card->info.mcl_level[2] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2788 card->info.mcl_level[2]]; in qeth_print_status_message()
2789 card->info.mcl_level[3] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2790 card->info.mcl_level[3]]; in qeth_print_status_message()
2791 card->info.mcl_level[QETH_MCL_LENGTH] = 0; in qeth_print_status_message()
2795 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1); in qeth_print_status_message()
2797 dev_info(&card->gdev->dev, in qeth_print_status_message()
2799 qeth_get_cardname(card), in qeth_print_status_message()
2800 (card->info.mcl_level[0]) ? " (level: " : "", in qeth_print_status_message()
2801 (card->info.mcl_level[0]) ? card->info.mcl_level : "", in qeth_print_status_message()
2802 (card->info.mcl_level[0]) ? ")" : "", in qeth_print_status_message()
2803 qeth_get_cardname_short(card)); in qeth_print_status_message()
2806 static void qeth_initialize_working_pool_list(struct qeth_card *card) in qeth_initialize_working_pool_list() argument
2810 QETH_CARD_TEXT(card, 5, "inwrklst"); in qeth_initialize_working_pool_list()
2813 &card->qdio.init_pool.entry_list, init_list) { in qeth_initialize_working_pool_list()
2814 qeth_put_buffer_pool_entry(card, entry); in qeth_initialize_working_pool_list()
2819 struct qeth_card *card) in qeth_find_free_buffer_pool_entry() argument
2824 if (list_empty(&card->qdio.in_buf_pool.entry_list)) in qeth_find_free_buffer_pool_entry()
2827 list_for_each_entry(entry, &card->qdio.in_buf_pool.entry_list, list) { in qeth_find_free_buffer_pool_entry()
2829 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_find_free_buffer_pool_entry()
2842 entry = list_first_entry(&card->qdio.in_buf_pool.entry_list, in qeth_find_free_buffer_pool_entry()
2844 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_find_free_buffer_pool_entry()
2853 QETH_CARD_STAT_INC(card, rx_sg_alloc_page); in qeth_find_free_buffer_pool_entry()
2860 static int qeth_init_input_buffer(struct qeth_card *card, in qeth_init_input_buffer() argument
2866 if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) { in qeth_init_input_buffer()
2867 buf->rx_skb = netdev_alloc_skb(card->dev, in qeth_init_input_buffer()
2875 pool_entry = qeth_find_free_buffer_pool_entry(card); in qeth_init_input_buffer()
2888 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_init_input_buffer()
2892 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) in qeth_init_input_buffer()
2901 static unsigned int qeth_tx_select_bulk_max(struct qeth_card *card, in qeth_tx_select_bulk_max() argument
2904 if (!IS_IQD(card) || in qeth_tx_select_bulk_max()
2905 qeth_iqd_is_mcast_queue(card, queue) || in qeth_tx_select_bulk_max()
2906 card->options.cq == QETH_CQ_ENABLED || in qeth_tx_select_bulk_max()
2907 qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd)) in qeth_tx_select_bulk_max()
2910 return card->ssqd.mmwc ? card->ssqd.mmwc : 1; in qeth_tx_select_bulk_max()
2913 static int qeth_init_qdio_queues(struct qeth_card *card) in qeth_init_qdio_queues() argument
2915 unsigned int rx_bufs = card->qdio.in_buf_pool.buf_count; in qeth_init_qdio_queues()
2919 QETH_CARD_TEXT(card, 2, "initqdqs"); in qeth_init_qdio_queues()
2922 qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); in qeth_init_qdio_queues()
2923 memset(&card->rx, 0, sizeof(struct qeth_rx)); in qeth_init_qdio_queues()
2925 qeth_initialize_working_pool_list(card); in qeth_init_qdio_queues()
2928 rc = qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); in qeth_init_qdio_queues()
2933 card->qdio.in_q->next_buf_to_init = QDIO_BUFNR(rx_bufs); in qeth_init_qdio_queues()
2934 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0, rx_bufs, in qeth_init_qdio_queues()
2937 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_init_qdio_queues()
2942 rc = qeth_cq_init(card); in qeth_init_qdio_queues()
2948 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_init_qdio_queues()
2949 struct qeth_qdio_out_q *queue = card->qdio.out_qs[i]; in qeth_init_qdio_queues()
2952 queue->max_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_init_qdio_queues()
2959 queue->bulk_max = qeth_tx_select_bulk_max(card, queue); in qeth_init_qdio_queues()
2962 netdev_tx_reset_queue(netdev_get_tx_queue(card->dev, i)); in qeth_init_qdio_queues()
2967 static void qeth_ipa_finalize_cmd(struct qeth_card *card, in qeth_ipa_finalize_cmd() argument
2970 qeth_mpc_finalize_cmd(card, iob); in qeth_ipa_finalize_cmd()
2973 __ipa_cmd(iob)->hdr.seqno = card->seqno.ipa++; in qeth_ipa_finalize_cmd()
2976 static void qeth_prepare_ipa_cmd(struct qeth_card *card, in qeth_prepare_ipa_cmd() argument
2979 u8 prot_type = qeth_mpc_select_prot_type(card); in qeth_prepare_ipa_cmd()
2992 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_prepare_ipa_cmd()
3004 struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card, in qeth_ipa_alloc_cmd() argument
3013 iob = qeth_alloc_cmd(&card->write, IPA_PDU_HEADER_SIZE + data_length, 1, in qeth_ipa_alloc_cmd()
3018 qeth_prepare_ipa_cmd(card, iob, data_length); in qeth_ipa_alloc_cmd()
3026 hdr->rel_adapter_no = (u8) card->dev->dev_port; in qeth_ipa_alloc_cmd()
3027 hdr->prim_version_no = IS_LAYER2(card) ? 2 : 1; in qeth_ipa_alloc_cmd()
3034 static int qeth_send_ipa_cmd_cb(struct qeth_card *card, in qeth_send_ipa_cmd_cb() argument
3048 int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, in qeth_send_ipa_cmd() argument
3055 QETH_CARD_TEXT(card, 4, "sendipa"); in qeth_send_ipa_cmd()
3057 if (card->read_or_write_problem) { in qeth_send_ipa_cmd()
3064 rc = qeth_send_control_data(card, iob, reply_cb, reply_param); in qeth_send_ipa_cmd()
3066 qeth_clear_ipacmd_list(card); in qeth_send_ipa_cmd()
3067 qeth_schedule_recovery(card); in qeth_send_ipa_cmd()
3073 static int qeth_send_startlan_cb(struct qeth_card *card, in qeth_send_startlan_cb() argument
3084 static int qeth_send_startlan(struct qeth_card *card) in qeth_send_startlan() argument
3088 QETH_CARD_TEXT(card, 2, "strtlan"); in qeth_send_startlan()
3090 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_STARTLAN, QETH_PROT_NONE, 0); in qeth_send_startlan()
3093 return qeth_send_ipa_cmd(card, iob, qeth_send_startlan_cb, NULL); in qeth_send_startlan()
3104 static int qeth_query_setadapterparms_cb(struct qeth_card *card, in qeth_query_setadapterparms_cb() argument
3110 QETH_CARD_TEXT(card, 3, "quyadpcb"); in qeth_query_setadapterparms_cb()
3116 if (!qeth_is_supported_link_type(card, query_cmd->lan_type)) in qeth_query_setadapterparms_cb()
3119 card->info.link_type = query_cmd->lan_type; in qeth_query_setadapterparms_cb()
3120 QETH_CARD_TEXT_(card, 2, "lnk %d", card->info.link_type); in qeth_query_setadapterparms_cb()
3123 card->options.adp.supported = query_cmd->supported_cmds; in qeth_query_setadapterparms_cb()
3127 static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card, in qeth_get_adapter_cmd() argument
3134 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETADAPTERPARMS, QETH_PROT_IPV4, in qeth_get_adapter_cmd()
3149 static int qeth_query_setadapterparms(struct qeth_card *card) in qeth_query_setadapterparms() argument
3154 QETH_CARD_TEXT(card, 3, "queryadp"); in qeth_query_setadapterparms()
3155 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED, in qeth_query_setadapterparms()
3159 rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL); in qeth_query_setadapterparms()
3163 static int qeth_query_ipassists_cb(struct qeth_card *card, in qeth_query_ipassists_cb() argument
3168 QETH_CARD_TEXT(card, 2, "qipasscb"); in qeth_query_ipassists_cb()
3177 QETH_CARD_TEXT(card, 2, "ipaunsup"); in qeth_query_ipassists_cb()
3178 card->options.ipa4.supported |= IPA_SETADAPTERPARMS; in qeth_query_ipassists_cb()
3179 card->options.ipa6.supported |= IPA_SETADAPTERPARMS; in qeth_query_ipassists_cb()
3183 CARD_DEVID(card), cmd->hdr.return_code); in qeth_query_ipassists_cb()
3188 card->options.ipa4 = cmd->hdr.assists; in qeth_query_ipassists_cb()
3190 card->options.ipa6 = cmd->hdr.assists; in qeth_query_ipassists_cb()
3193 CARD_DEVID(card)); in qeth_query_ipassists_cb()
3197 static int qeth_query_ipassists(struct qeth_card *card, in qeth_query_ipassists() argument
3203 QETH_CARD_TEXT_(card, 2, "qipassi%i", prot); in qeth_query_ipassists()
3204 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_QIPASSIST, prot, 0); in qeth_query_ipassists()
3207 rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL); in qeth_query_ipassists()
3211 static int qeth_query_switch_attributes_cb(struct qeth_card *card, in qeth_query_switch_attributes_cb() argument
3218 QETH_CARD_TEXT(card, 2, "qswiatcb"); in qeth_query_switch_attributes_cb()
3226 QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities, in qeth_query_switch_attributes_cb()
3231 int qeth_query_switch_attributes(struct qeth_card *card, in qeth_query_switch_attributes() argument
3236 QETH_CARD_TEXT(card, 2, "qswiattr"); in qeth_query_switch_attributes()
3237 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES)) in qeth_query_switch_attributes()
3239 if (!netif_carrier_ok(card->dev)) in qeth_query_switch_attributes()
3241 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES, 0); in qeth_query_switch_attributes()
3244 return qeth_send_ipa_cmd(card, iob, in qeth_query_switch_attributes()
3248 struct qeth_cmd_buffer *qeth_get_diag_cmd(struct qeth_card *card, in qeth_get_diag_cmd() argument
3255 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SET_DIAG_ASS, QETH_PROT_NONE, in qeth_get_diag_cmd()
3267 static int qeth_query_setdiagass_cb(struct qeth_card *card, in qeth_query_setdiagass_cb() argument
3274 QETH_CARD_TEXT_(card, 2, "diagq:%x", rc); in qeth_query_setdiagass_cb()
3278 card->info.diagass_support = cmd->data.diagass.ext; in qeth_query_setdiagass_cb()
3282 static int qeth_query_setdiagass(struct qeth_card *card) in qeth_query_setdiagass() argument
3286 QETH_CARD_TEXT(card, 2, "qdiagass"); in qeth_query_setdiagass()
3287 iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_QUERY, 0); in qeth_query_setdiagass()
3290 return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL); in qeth_query_setdiagass()
3293 static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid) in qeth_get_trap_id() argument
3301 tid->chpid = card->info.chpid; in qeth_get_trap_id()
3302 ccw_device_get_id(CARD_RDEV(card), &ccwid); in qeth_get_trap_id()
3317 static int qeth_hw_trap_cb(struct qeth_card *card, in qeth_hw_trap_cb() argument
3324 QETH_CARD_TEXT_(card, 2, "trapc:%x", rc); in qeth_hw_trap_cb()
3330 int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action) in qeth_hw_trap() argument
3335 QETH_CARD_TEXT(card, 2, "diagtrap"); in qeth_hw_trap()
3336 iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_TRAP, 64); in qeth_hw_trap()
3347 qeth_get_trap_id(card, in qeth_hw_trap()
3356 return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL); in qeth_hw_trap()
3359 static int qeth_check_qdio_errors(struct qeth_card *card, in qeth_check_qdio_errors() argument
3365 QETH_CARD_TEXT(card, 2, dbftext); in qeth_check_qdio_errors()
3366 QETH_CARD_TEXT_(card, 2, " F15=%02X", in qeth_check_qdio_errors()
3368 QETH_CARD_TEXT_(card, 2, " F14=%02X", in qeth_check_qdio_errors()
3370 QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error); in qeth_check_qdio_errors()
3372 QETH_CARD_STAT_INC(card, rx_fifo_errors); in qeth_check_qdio_errors()
3380 static unsigned int qeth_rx_refill_queue(struct qeth_card *card, in qeth_rx_refill_queue() argument
3383 struct qeth_qdio_q *queue = card->qdio.in_q; in qeth_rx_refill_queue()
3390 if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) { in qeth_rx_refill_queue()
3393 if (qeth_init_input_buffer(card, in qeth_rx_refill_queue()
3404 atomic_set(&card->force_alloc_skb, 3); in qeth_rx_refill_queue()
3407 atomic_add_unless(&card->force_alloc_skb, -1, 0); in qeth_rx_refill_queue()
3412 list_for_each(lh, &card->qdio.in_buf_pool.entry_list) in qeth_rx_refill_queue()
3414 if (i == card->qdio.in_buf_pool.buf_count) { in qeth_rx_refill_queue()
3415 QETH_CARD_TEXT(card, 2, "qsarbw"); in qeth_rx_refill_queue()
3417 &card->buffer_reclaim_work, in qeth_rx_refill_queue()
3423 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, in qeth_rx_refill_queue()
3426 QETH_CARD_TEXT(card, 2, "qinberr"); in qeth_rx_refill_queue()
3438 struct qeth_card *card = container_of(to_delayed_work(work), in qeth_buffer_reclaim_work() local
3443 napi_schedule(&card->napi); in qeth_buffer_reclaim_work()
3448 static void qeth_handle_send_error(struct qeth_card *card, in qeth_handle_send_error() argument
3453 QETH_CARD_TEXT(card, 6, "hdsnderr"); in qeth_handle_send_error()
3454 qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr"); in qeth_handle_send_error()
3462 QETH_CARD_TEXT(card, 1, "lnkfail"); in qeth_handle_send_error()
3463 QETH_CARD_TEXT_(card, 1, "%04x %02x", in qeth_handle_send_error()
3499 QETH_CARD_TEXT(queue->card, 6, "np->pack"); in qeth_switch_to_packing_if_needed()
3518 QETH_CARD_TEXT(queue->card, 6, "pack->np"); in qeth_switch_to_nonpacking_if_needed()
3531 struct qeth_card *card = queue->card; in qeth_flush_buffers() local
3546 if (IS_IQD(card)) { in qeth_flush_buffers()
3552 if (IS_IQD(card)) { in qeth_flush_buffers()
3553 if (card->options.cq == QETH_CQ_ENABLED && in qeth_flush_buffers()
3554 !qeth_iqd_is_mcast_queue(card, queue) && in qeth_flush_buffers()
3595 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_OUTPUT, queue->queue_no, in qeth_flush_buffers()
3611 } else if (qeth_use_tx_irqs(card) && in qeth_flush_buffers()
3622 QETH_CARD_TEXT(queue->card, 2, "flushbuf"); in qeth_flush_buffers()
3623 QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no); in qeth_flush_buffers()
3624 QETH_CARD_TEXT_(queue->card, 2, " idx%d", index); in qeth_flush_buffers()
3625 QETH_CARD_TEXT_(queue->card, 2, " c%d", count); in qeth_flush_buffers()
3626 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc); in qeth_flush_buffers()
3630 qeth_schedule_recovery(queue->card); in qeth_flush_buffers()
3675 struct qeth_card *card = (struct qeth_card *)card_ptr; in qeth_qdio_poll() local
3677 napi_schedule_irqoff(&card->napi); in qeth_qdio_poll()
3680 int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq) in qeth_configure_cq() argument
3684 if (card->options.cq == QETH_CQ_NOTAVAILABLE) { in qeth_configure_cq()
3688 if (card->options.cq == cq) { in qeth_configure_cq()
3693 qeth_free_qdio_queues(card); in qeth_configure_cq()
3694 card->options.cq = cq; in qeth_configure_cq()
3703 static void qeth_qdio_handle_aob(struct qeth_card *card, struct qaob *aob) in qeth_qdio_handle_aob() argument
3711 queue_no < card->qdio.no_out_queues) in qeth_qdio_handle_aob()
3712 napi_schedule(&card->qdio.out_qs[queue_no]->napi); in qeth_qdio_handle_aob()
3715 static void qeth_qdio_cq_handler(struct qeth_card *card, unsigned int qdio_err, in qeth_qdio_cq_handler() argument
3719 struct qeth_qdio_q *cq = card->qdio.c_q; in qeth_qdio_cq_handler()
3723 QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element); in qeth_qdio_cq_handler()
3724 QETH_CARD_TEXT_(card, 5, "qcqhc%d", count); in qeth_qdio_cq_handler()
3725 QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err); in qeth_qdio_cq_handler()
3728 netif_tx_stop_all_queues(card->dev); in qeth_qdio_cq_handler()
3729 qeth_schedule_recovery(card); in qeth_qdio_cq_handler()
3741 qeth_qdio_handle_aob(card, phys_to_virt(phys_aob_addr)); in qeth_qdio_cq_handler()
3746 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue, in qeth_qdio_cq_handler()
3749 dev_warn(&card->gdev->dev, in qeth_qdio_cq_handler()
3751 QETH_CARD_TEXT(card, 2, "qcqherr"); in qeth_qdio_cq_handler()
3762 struct qeth_card *card = (struct qeth_card *)card_ptr; in qeth_qdio_input_handler() local
3764 QETH_CARD_TEXT_(card, 2, "qihq%d", queue); in qeth_qdio_input_handler()
3765 QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err); in qeth_qdio_input_handler()
3768 qeth_schedule_recovery(card); in qeth_qdio_input_handler()
3776 struct qeth_card *card = (struct qeth_card *) card_ptr; in qeth_qdio_output_handler() local
3778 QETH_CARD_TEXT(card, 2, "achkcond"); in qeth_qdio_output_handler()
3779 netif_tx_stop_all_queues(card->dev); in qeth_qdio_output_handler()
3780 qeth_schedule_recovery(card); in qeth_qdio_output_handler()
3786 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb) in qeth_get_priority_queue() argument
3791 switch (card->qdio.do_prio_queueing) { in qeth_get_priority_queue()
3802 return card->qdio.default_out_queue; in qeth_get_priority_queue()
3804 if (card->qdio.do_prio_queueing == QETH_PRIO_Q_ING_PREC) in qeth_get_priority_queue()
3825 return card->qdio.default_out_queue; in qeth_get_priority_queue()
3829 return card->qdio.default_out_queue; in qeth_get_priority_queue()
4083 static int __qeth_xmit(struct qeth_card *card, struct qeth_qdio_out_q *queue, in __qeth_xmit() argument
4096 txq = netdev_get_tx_queue(card->dev, skb_get_queue_mapping(skb)); in __qeth_xmit()
4161 static int qeth_do_send_packet(struct qeth_card *card, in qeth_do_send_packet() argument
4184 txq = netdev_get_tx_queue(card->dev, skb_get_queue_mapping(skb)); in qeth_do_send_packet()
4262 int qeth_xmit(struct qeth_card *card, struct sk_buff *skb, in qeth_xmit() argument
4282 proto_len = (IS_IQD(card) && IS_LAYER2(card)) ? ETH_HLEN : 0; in qeth_xmit()
4304 if (IS_IQD(card)) { in qeth_xmit()
4305 rc = __qeth_xmit(card, queue, skb, elements, hdr, data_offset, in qeth_xmit()
4311 rc = qeth_do_send_packet(card, queue, skb, hdr, data_offset, in qeth_xmit()
4323 static int qeth_setadp_promisc_mode_cb(struct qeth_card *card, in qeth_setadp_promisc_mode_cb() argument
4329 QETH_CARD_TEXT(card, 4, "prmadpcb"); in qeth_setadp_promisc_mode_cb()
4333 QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code); in qeth_setadp_promisc_mode_cb()
4336 card->info.promisc_mode = setparms->data.mode; in qeth_setadp_promisc_mode_cb()
4340 void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable) in qeth_setadp_promisc_mode() argument
4347 QETH_CARD_TEXT(card, 4, "setprom"); in qeth_setadp_promisc_mode()
4348 QETH_CARD_TEXT_(card, 4, "mode:%x", mode); in qeth_setadp_promisc_mode()
4350 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, in qeth_setadp_promisc_mode()
4356 qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL); in qeth_setadp_promisc_mode()
4360 static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card, in qeth_setadpparms_change_macaddr_cb() argument
4366 QETH_CARD_TEXT(card, 4, "chgmaccb"); in qeth_setadpparms_change_macaddr_cb()
4374 if (IS_LAYER2(card) && IS_OSD(card) && !IS_VM_NIC(card) && in qeth_setadpparms_change_macaddr_cb()
4378 ether_addr_copy(card->dev->dev_addr, adp_cmd->data.change_addr.addr); in qeth_setadpparms_change_macaddr_cb()
4382 int qeth_setadpparms_change_macaddr(struct qeth_card *card) in qeth_setadpparms_change_macaddr() argument
4388 QETH_CARD_TEXT(card, 4, "chgmac"); in qeth_setadpparms_change_macaddr()
4390 iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS, in qeth_setadpparms_change_macaddr()
4398 card->dev->dev_addr); in qeth_setadpparms_change_macaddr()
4399 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb, in qeth_setadpparms_change_macaddr()
4405 static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card, in qeth_setadpparms_set_access_ctrl_cb() argument
4411 QETH_CARD_TEXT(card, 4, "setaccb"); in qeth_setadpparms_set_access_ctrl_cb()
4414 QETH_CARD_TEXT_(card, 2, "rc=%d", in qeth_setadpparms_set_access_ctrl_cb()
4419 access_ctrl_req->subcmd_code, CARD_DEVID(card), in qeth_setadpparms_set_access_ctrl_cb()
4424 dev_info(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4427 dev_info(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4432 CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl_cb()
4436 CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl_cb()
4439 dev_err(&card->gdev->dev, "Adapter does not " in qeth_setadpparms_set_access_ctrl_cb()
4443 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4448 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4452 dev_err(&card->gdev->dev, "The adjacent switch port does not " in qeth_setadpparms_set_access_ctrl_cb()
4456 dev_err(&card->gdev->dev, "The reflective relay mode cannot be " in qeth_setadpparms_set_access_ctrl_cb()
4460 dev_warn(&card->gdev->dev, "Turning off reflective relay mode " in qeth_setadpparms_set_access_ctrl_cb()
4469 int qeth_setadpparms_set_access_ctrl(struct qeth_card *card, in qeth_setadpparms_set_access_ctrl() argument
4477 QETH_CARD_TEXT(card, 4, "setacctl"); in qeth_setadpparms_set_access_ctrl()
4479 if (!qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) { in qeth_setadpparms_set_access_ctrl()
4480 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl()
4485 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL, in qeth_setadpparms_set_access_ctrl()
4493 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb, in qeth_setadpparms_set_access_ctrl()
4496 QETH_CARD_TEXT_(card, 2, "rc=%d", rc); in qeth_setadpparms_set_access_ctrl()
4498 rc, CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl()
4506 struct qeth_card *card; in qeth_tx_timeout() local
4508 card = dev->ml_priv; in qeth_tx_timeout()
4509 QETH_CARD_TEXT(card, 4, "txtimeo"); in qeth_tx_timeout()
4510 qeth_schedule_recovery(card); in qeth_tx_timeout()
4516 struct qeth_card *card = dev->ml_priv; in qeth_mdio_read() local
4522 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) && in qeth_mdio_read()
4523 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH) && in qeth_mdio_read()
4524 (card->info.link_type != QETH_LINK_TYPE_25GBIT_ETH)) in qeth_mdio_read()
4556 rc = card->stats.rx_length_errors + in qeth_mdio_read()
4557 card->stats.rx_frame_errors + in qeth_mdio_read()
4558 card->stats.rx_fifo_errors; in qeth_mdio_read()
4580 static int qeth_snmp_command_cb(struct qeth_card *card, in qeth_snmp_command_cb() argument
4589 QETH_CARD_TEXT(card, 3, "snpcmdcb"); in qeth_snmp_command_cb()
4592 QETH_CARD_TEXT_(card, 4, "scer1%x", cmd->hdr.return_code); in qeth_snmp_command_cb()
4598 QETH_CARD_TEXT_(card, 4, "scer2%x", cmd->hdr.return_code); in qeth_snmp_command_cb()
4613 QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOSPC); in qeth_snmp_command_cb()
4616 QETH_CARD_TEXT_(card, 4, "snore%i", in qeth_snmp_command_cb()
4618 QETH_CARD_TEXT_(card, 4, "sseqn%i", in qeth_snmp_command_cb()
4630 static int qeth_snmp_command(struct qeth_card *card, char __user *udata) in qeth_snmp_command() argument
4638 QETH_CARD_TEXT(card, 3, "snmpcmd"); in qeth_snmp_command()
4640 if (IS_VM_NIC(card)) in qeth_snmp_command()
4643 if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) && in qeth_snmp_command()
4644 IS_LAYER3(card)) in qeth_snmp_command()
4656 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, req_len); in qeth_snmp_command()
4673 rc = qeth_send_ipa_cmd(card, iob, qeth_snmp_command_cb, &qinfo); in qeth_snmp_command()
4676 CARD_DEVID(card), rc); in qeth_snmp_command()
4686 static int qeth_setadpparms_query_oat_cb(struct qeth_card *card, in qeth_setadpparms_query_oat_cb() argument
4694 QETH_CARD_TEXT(card, 3, "qoatcb"); in qeth_setadpparms_query_oat_cb()
4713 static int qeth_query_oat_command(struct qeth_card *card, char __user *udata) in qeth_query_oat_command() argument
4723 QETH_CARD_TEXT(card, 3, "qoatcmd"); in qeth_query_oat_command()
4725 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) in qeth_query_oat_command()
4737 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT, in qeth_query_oat_command()
4747 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb, &priv); in qeth_query_oat_command()
4763 static int qeth_query_card_info_cb(struct qeth_card *card, in qeth_query_card_info_cb() argument
4770 QETH_CARD_TEXT(card, 2, "qcrdincb"); in qeth_query_card_info_cb()
4775 netdev_dbg(card->dev, in qeth_query_card_info_cb()
4834 int qeth_query_card_info(struct qeth_card *card, in qeth_query_card_info() argument
4839 QETH_CARD_TEXT(card, 2, "qcrdinfo"); in qeth_query_card_info()
4840 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_CARD_INFO)) in qeth_query_card_info()
4842 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO, 0); in qeth_query_card_info()
4846 return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, link_info); in qeth_query_card_info()
4849 static int qeth_init_link_info_oat_cb(struct qeth_card *card, in qeth_init_link_info_oat_cb() argument
4935 static void qeth_init_link_info(struct qeth_card *card) in qeth_init_link_info() argument
4937 card->info.link_info.duplex = DUPLEX_FULL; in qeth_init_link_info()
4939 if (IS_IQD(card) || IS_VM_NIC(card)) { in qeth_init_link_info()
4940 card->info.link_info.speed = SPEED_10000; in qeth_init_link_info()
4941 card->info.link_info.port = PORT_FIBRE; in qeth_init_link_info()
4942 card->info.link_info.link_mode = QETH_LINK_MODE_FIBRE_SHORT; in qeth_init_link_info()
4944 switch (card->info.link_type) { in qeth_init_link_info()
4947 card->info.link_info.speed = SPEED_100; in qeth_init_link_info()
4948 card->info.link_info.port = PORT_TP; in qeth_init_link_info()
4952 card->info.link_info.speed = SPEED_1000; in qeth_init_link_info()
4953 card->info.link_info.port = PORT_FIBRE; in qeth_init_link_info()
4956 card->info.link_info.speed = SPEED_10000; in qeth_init_link_info()
4957 card->info.link_info.port = PORT_FIBRE; in qeth_init_link_info()
4960 card->info.link_info.speed = SPEED_25000; in qeth_init_link_info()
4961 card->info.link_info.port = PORT_FIBRE; in qeth_init_link_info()
4964 dev_info(&card->gdev->dev, "Unknown link type %x\n", in qeth_init_link_info()
4965 card->info.link_type); in qeth_init_link_info()
4966 card->info.link_info.speed = SPEED_UNKNOWN; in qeth_init_link_info()
4967 card->info.link_info.port = PORT_OTHER; in qeth_init_link_info()
4970 card->info.link_info.link_mode = QETH_LINK_MODE_UNKNOWN; in qeth_init_link_info()
4974 if (qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) { in qeth_init_link_info()
4978 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT, in qeth_init_link_info()
4987 if (!qeth_send_ipa_cmd(card, iob, in qeth_init_link_info()
4991 card->info.link_info.speed = link_info.speed; in qeth_init_link_info()
4993 card->info.link_info.duplex = link_info.duplex; in qeth_init_link_info()
4995 card->info.link_info.port = link_info.port; in qeth_init_link_info()
4997 card->info.link_info.link_mode = link_info.link_mode; in qeth_init_link_info()
5011 int qeth_vm_request_mac(struct qeth_card *card) in qeth_vm_request_mac() argument
5017 QETH_CARD_TEXT(card, 2, "vmreqmac"); in qeth_vm_request_mac()
5029 request->devno = card->info.ddev_devno; in qeth_vm_request_mac()
5041 QETH_CARD_TEXT(card, 2, "badresp"); in qeth_vm_request_mac()
5042 QETH_CARD_HEX(card, 2, &request->resp_buf_len, in qeth_vm_request_mac()
5046 QETH_CARD_TEXT(card, 2, "badmac"); in qeth_vm_request_mac()
5047 QETH_CARD_HEX(card, 2, response->mac, ETH_ALEN); in qeth_vm_request_mac()
5049 ether_addr_copy(card->dev->dev_addr, response->mac); in qeth_vm_request_mac()
5059 static void qeth_determine_capabilities(struct qeth_card *card) in qeth_determine_capabilities() argument
5061 struct qeth_channel *channel = &card->data; in qeth_determine_capabilities()
5066 QETH_CARD_TEXT(card, 2, "detcapab"); in qeth_determine_capabilities()
5071 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_determine_capabilities()
5076 rc = qeth_read_conf_data(card); in qeth_determine_capabilities()
5079 CARD_DEVID(card), rc); in qeth_determine_capabilities()
5080 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_determine_capabilities()
5084 rc = qdio_get_ssqd_desc(ddev, &card->ssqd); in qeth_determine_capabilities()
5086 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_determine_capabilities()
5088 QETH_CARD_TEXT_(card, 2, "qfmt%d", card->ssqd.qfmt); in qeth_determine_capabilities()
5089 QETH_CARD_TEXT_(card, 2, "ac1:%02x", card->ssqd.qdioac1); in qeth_determine_capabilities()
5090 QETH_CARD_TEXT_(card, 2, "ac2:%04x", card->ssqd.qdioac2); in qeth_determine_capabilities()
5091 QETH_CARD_TEXT_(card, 2, "ac3:%04x", card->ssqd.qdioac3); in qeth_determine_capabilities()
5092 QETH_CARD_TEXT_(card, 2, "icnt%d", card->ssqd.icnt); in qeth_determine_capabilities()
5093 if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) || in qeth_determine_capabilities()
5094 ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) || in qeth_determine_capabilities()
5095 ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) { in qeth_determine_capabilities()
5096 dev_info(&card->gdev->dev, in qeth_determine_capabilities()
5099 card->options.cq = QETH_CQ_NOTAVAILABLE; in qeth_determine_capabilities()
5109 static void qeth_read_ccw_conf_data(struct qeth_card *card) in qeth_read_ccw_conf_data() argument
5111 struct qeth_card_info *info = &card->info; in qeth_read_ccw_conf_data()
5112 struct ccw_device *cdev = CARD_DDEV(card); in qeth_read_ccw_conf_data()
5115 QETH_CARD_TEXT(card, 2, "ccwconfd"); in qeth_read_ccw_conf_data()
5124 dev_info(&card->gdev->dev, "CHID: %x CHPID: %x\n", in qeth_read_ccw_conf_data()
5127 QETH_CARD_TEXT_(card, 3, "devn%x", info->ddev_devno); in qeth_read_ccw_conf_data()
5128 QETH_CARD_TEXT_(card, 3, "cssid:%x", info->cssid); in qeth_read_ccw_conf_data()
5129 QETH_CARD_TEXT_(card, 3, "iid:%x", info->iid); in qeth_read_ccw_conf_data()
5130 QETH_CARD_TEXT_(card, 3, "ssid:%x", info->ssid); in qeth_read_ccw_conf_data()
5131 QETH_CARD_TEXT_(card, 3, "chpid:%x", info->chpid); in qeth_read_ccw_conf_data()
5132 QETH_CARD_TEXT_(card, 3, "chid:%x", info->chid); in qeth_read_ccw_conf_data()
5133 QETH_CARD_TEXT_(card, 3, "idval%x", info->ids_valid); in qeth_read_ccw_conf_data()
5136 static int qeth_qdio_establish(struct qeth_card *card) in qeth_qdio_establish() argument
5145 QETH_CARD_TEXT(card, 2, "qdioest"); in qeth_qdio_establish()
5147 if (!IS_IQD(card) && !IS_VM_NIC(card)) { in qeth_qdio_establish()
5152 qeth_fill_qib_parms(card, qib_parms); in qeth_qdio_establish()
5155 in_sbal_ptrs[0] = card->qdio.in_q->qdio_bufs; in qeth_qdio_establish()
5156 if (card->options.cq == QETH_CQ_ENABLED) in qeth_qdio_establish()
5157 in_sbal_ptrs[1] = card->qdio.c_q->qdio_bufs; in qeth_qdio_establish()
5159 for (i = 0; i < card->qdio.no_out_queues; i++) in qeth_qdio_establish()
5160 out_sbal_ptrs[i] = card->qdio.out_qs[i]->qdio_bufs; in qeth_qdio_establish()
5163 init_data.q_format = IS_IQD(card) ? QDIO_IQDIO_QFMT : in qeth_qdio_establish()
5167 init_data.no_input_qs = card->qdio.no_in_queues; in qeth_qdio_establish()
5168 init_data.no_output_qs = card->qdio.no_out_queues; in qeth_qdio_establish()
5172 init_data.int_parm = (unsigned long) card; in qeth_qdio_establish()
5176 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, in qeth_qdio_establish()
5178 rc = qdio_allocate(CARD_DDEV(card), init_data.no_input_qs, in qeth_qdio_establish()
5181 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_establish()
5184 rc = qdio_establish(CARD_DDEV(card), &init_data); in qeth_qdio_establish()
5186 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_establish()
5187 qdio_free(CARD_DDEV(card)); in qeth_qdio_establish()
5191 switch (card->options.cq) { in qeth_qdio_establish()
5193 dev_info(&card->gdev->dev, "Completion Queue support enabled"); in qeth_qdio_establish()
5196 dev_info(&card->gdev->dev, "Completion Queue support disabled"); in qeth_qdio_establish()
5207 static void qeth_core_free_card(struct qeth_card *card) in qeth_core_free_card() argument
5209 QETH_CARD_TEXT(card, 2, "freecrd"); in qeth_core_free_card()
5211 unregister_service_level(&card->qeth_service_level); in qeth_core_free_card()
5212 debugfs_remove_recursive(card->debugfs); in qeth_core_free_card()
5213 qeth_put_cmd(card->read_cmd); in qeth_core_free_card()
5214 destroy_workqueue(card->event_wq); in qeth_core_free_card()
5215 dev_set_drvdata(&card->gdev->dev, NULL); in qeth_core_free_card()
5216 kfree(card); in qeth_core_free_card()
5219 static void qeth_trace_features(struct qeth_card *card) in qeth_trace_features() argument
5221 QETH_CARD_TEXT(card, 2, "features"); in qeth_trace_features()
5222 QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4)); in qeth_trace_features()
5223 QETH_CARD_HEX(card, 2, &card->options.ipa6, sizeof(card->options.ipa6)); in qeth_trace_features()
5224 QETH_CARD_HEX(card, 2, &card->options.adp, sizeof(card->options.adp)); in qeth_trace_features()
5225 QETH_CARD_HEX(card, 2, &card->info.diagass_support, in qeth_trace_features()
5226 sizeof(card->info.diagass_support)); in qeth_trace_features()
5254 static int qeth_hardsetup_card(struct qeth_card *card, bool *carrier_ok) in qeth_hardsetup_card() argument
5259 QETH_CARD_TEXT(card, 2, "hrdsetup"); in qeth_hardsetup_card()
5260 atomic_set(&card->force_alloc_skb, 0); in qeth_hardsetup_card()
5261 rc = qeth_update_from_chp_desc(card); in qeth_hardsetup_card()
5267 CARD_DEVID(card)); in qeth_hardsetup_card()
5268 rc = qeth_qdio_clear_card(card, !IS_IQD(card)); in qeth_hardsetup_card()
5269 qeth_stop_channel(&card->data); in qeth_hardsetup_card()
5270 qeth_stop_channel(&card->write); in qeth_hardsetup_card()
5271 qeth_stop_channel(&card->read); in qeth_hardsetup_card()
5272 qdio_free(CARD_DDEV(card)); in qeth_hardsetup_card()
5274 rc = qeth_start_channel(&card->read); in qeth_hardsetup_card()
5277 rc = qeth_start_channel(&card->write); in qeth_hardsetup_card()
5280 rc = qeth_start_channel(&card->data); in qeth_hardsetup_card()
5285 QETH_CARD_TEXT(card, 2, "break1"); in qeth_hardsetup_card()
5288 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_hardsetup_card()
5295 qeth_determine_capabilities(card); in qeth_hardsetup_card()
5296 qeth_read_ccw_conf_data(card); in qeth_hardsetup_card()
5297 qeth_idx_init(card); in qeth_hardsetup_card()
5299 rc = qeth_idx_activate_read_channel(card); in qeth_hardsetup_card()
5301 QETH_CARD_TEXT(card, 2, "break2"); in qeth_hardsetup_card()
5304 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_hardsetup_card()
5311 rc = qeth_idx_activate_write_channel(card); in qeth_hardsetup_card()
5313 QETH_CARD_TEXT(card, 2, "break3"); in qeth_hardsetup_card()
5316 QETH_CARD_TEXT_(card, 2, "4err%d", rc); in qeth_hardsetup_card()
5322 card->read_or_write_problem = 0; in qeth_hardsetup_card()
5323 rc = qeth_mpc_initialize(card); in qeth_hardsetup_card()
5325 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_hardsetup_card()
5329 rc = qeth_send_startlan(card); in qeth_hardsetup_card()
5331 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_hardsetup_card()
5333 dev_warn(&card->gdev->dev, "The LAN is offline\n"); in qeth_hardsetup_card()
5342 card->options.ipa4.supported = 0; in qeth_hardsetup_card()
5343 card->options.ipa6.supported = 0; in qeth_hardsetup_card()
5344 card->options.adp.supported = 0; in qeth_hardsetup_card()
5345 card->options.sbp.supported_funcs = 0; in qeth_hardsetup_card()
5346 card->info.diagass_support = 0; in qeth_hardsetup_card()
5347 rc = qeth_query_ipassists(card, QETH_PROT_IPV4); in qeth_hardsetup_card()
5350 if (qeth_is_supported(card, IPA_IPV6)) { in qeth_hardsetup_card()
5351 rc = qeth_query_ipassists(card, QETH_PROT_IPV6); in qeth_hardsetup_card()
5355 if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { in qeth_hardsetup_card()
5356 rc = qeth_query_setadapterparms(card); in qeth_hardsetup_card()
5358 QETH_CARD_TEXT_(card, 2, "7err%d", rc); in qeth_hardsetup_card()
5362 if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { in qeth_hardsetup_card()
5363 rc = qeth_query_setdiagass(card); in qeth_hardsetup_card()
5365 QETH_CARD_TEXT_(card, 2, "8err%d", rc); in qeth_hardsetup_card()
5368 qeth_trace_features(card); in qeth_hardsetup_card()
5370 if (!qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP) || in qeth_hardsetup_card()
5371 (card->info.hwtrap && qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))) in qeth_hardsetup_card()
5372 card->info.hwtrap = 0; in qeth_hardsetup_card()
5374 if (card->options.isolation != ISOLATION_MODE_NONE) { in qeth_hardsetup_card()
5375 rc = qeth_setadpparms_set_access_ctrl(card, in qeth_hardsetup_card()
5376 card->options.isolation); in qeth_hardsetup_card()
5381 qeth_init_link_info(card); in qeth_hardsetup_card()
5383 rc = qeth_init_qdio_queues(card); in qeth_hardsetup_card()
5385 QETH_CARD_TEXT_(card, 2, "9err%d", rc); in qeth_hardsetup_card()
5391 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " in qeth_hardsetup_card()
5394 CARD_DEVID(card), rc); in qeth_hardsetup_card()
5398 static int qeth_set_online(struct qeth_card *card, in qeth_set_online() argument
5404 mutex_lock(&card->conf_mutex); in qeth_set_online()
5405 QETH_CARD_TEXT(card, 2, "setonlin"); in qeth_set_online()
5407 rc = qeth_hardsetup_card(card, &carrier_ok); in qeth_set_online()
5409 QETH_CARD_TEXT_(card, 2, "2err%04x", rc); in qeth_set_online()
5414 qeth_print_status_message(card); in qeth_set_online()
5416 if (card->dev->reg_state != NETREG_REGISTERED) in qeth_set_online()
5418 qeth_set_real_num_tx_queues(card, qeth_tx_actual_queues(card)); in qeth_set_online()
5420 rc = disc->set_online(card, carrier_ok); in qeth_set_online()
5425 kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE); in qeth_set_online()
5427 mutex_unlock(&card->conf_mutex); in qeth_set_online()
5432 qeth_qdio_clear_card(card, 0); in qeth_set_online()
5433 qeth_clear_working_pool_list(card); in qeth_set_online()
5434 qeth_flush_local_addrs(card); in qeth_set_online()
5436 qeth_stop_channel(&card->data); in qeth_set_online()
5437 qeth_stop_channel(&card->write); in qeth_set_online()
5438 qeth_stop_channel(&card->read); in qeth_set_online()
5439 qdio_free(CARD_DDEV(card)); in qeth_set_online()
5441 mutex_unlock(&card->conf_mutex); in qeth_set_online()
5445 int qeth_set_offline(struct qeth_card *card, const struct qeth_discipline *disc, in qeth_set_offline() argument
5450 mutex_lock(&card->conf_mutex); in qeth_set_offline()
5451 QETH_CARD_TEXT(card, 3, "setoffl"); in qeth_set_offline()
5453 if ((!resetting && card->info.hwtrap) || card->info.hwtrap == 2) { in qeth_set_offline()
5454 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_set_offline()
5455 card->info.hwtrap = 1; in qeth_set_offline()
5459 qeth_clear_ipacmd_list(card); in qeth_set_offline()
5462 netif_device_detach(card->dev); in qeth_set_offline()
5463 netif_carrier_off(card->dev); in qeth_set_offline()
5466 cancel_work_sync(&card->rx_mode_work); in qeth_set_offline()
5468 disc->set_offline(card); in qeth_set_offline()
5470 qeth_qdio_clear_card(card, 0); in qeth_set_offline()
5471 qeth_drain_output_queues(card); in qeth_set_offline()
5472 qeth_clear_working_pool_list(card); in qeth_set_offline()
5473 qeth_flush_local_addrs(card); in qeth_set_offline()
5474 card->info.promisc_mode = 0; in qeth_set_offline()
5476 rc = qeth_stop_channel(&card->data); in qeth_set_offline()
5477 rc2 = qeth_stop_channel(&card->write); in qeth_set_offline()
5478 rc3 = qeth_stop_channel(&card->read); in qeth_set_offline()
5482 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_set_offline()
5483 qdio_free(CARD_DDEV(card)); in qeth_set_offline()
5486 kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE); in qeth_set_offline()
5488 mutex_unlock(&card->conf_mutex); in qeth_set_offline()
5496 struct qeth_card *card = data; in qeth_do_reset() local
5500 disc = card->discipline; in qeth_do_reset()
5502 QETH_CARD_TEXT(card, 2, "recover1"); in qeth_do_reset()
5503 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) in qeth_do_reset()
5505 QETH_CARD_TEXT(card, 2, "recover2"); in qeth_do_reset()
5506 dev_warn(&card->gdev->dev, in qeth_do_reset()
5509 qeth_set_offline(card, disc, true); in qeth_do_reset()
5510 rc = qeth_set_online(card, disc); in qeth_do_reset()
5512 dev_info(&card->gdev->dev, in qeth_do_reset()
5515 qeth_set_offline(card, disc, true); in qeth_do_reset()
5516 ccwgroup_set_offline(card->gdev, false); in qeth_do_reset()
5517 dev_warn(&card->gdev->dev, in qeth_do_reset()
5520 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_do_reset()
5521 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); in qeth_do_reset()
5526 static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, in qeth_l3_rebuild_skb() argument
5533 if (IS_IQD(card) && iucv->magic == ETH_P_AF_IUCV) { in qeth_l3_rebuild_skb()
5551 QETH_CARD_STAT_INC(card, rx_multicast); in qeth_l3_rebuild_skb()
5555 QETH_CARD_STAT_INC(card, rx_multicast); in qeth_l3_rebuild_skb()
5558 if (card->options.sniffer) in qeth_l3_rebuild_skb()
5572 if (!card->options.sniffer && in qeth_l3_rebuild_skb()
5584 static void qeth_receive_skb(struct qeth_card *card, struct sk_buff *skb, in qeth_receive_skb() argument
5587 struct napi_struct *napi = &card->napi; in qeth_receive_skb()
5593 qeth_l3_rebuild_skb(card, skb, hdr); in qeth_receive_skb()
5609 if (is_cso && (card->dev->features & NETIF_F_RXCSUM)) { in qeth_receive_skb()
5611 QETH_CARD_STAT_INC(card, rx_skb_csum); in qeth_receive_skb()
5616 QETH_CARD_STAT_ADD(card, rx_bytes, skb->len); in qeth_receive_skb()
5617 QETH_CARD_STAT_INC(card, rx_packets); in qeth_receive_skb()
5619 QETH_CARD_STAT_INC(card, rx_sg_skbs); in qeth_receive_skb()
5620 QETH_CARD_STAT_ADD(card, rx_sg_frags, in qeth_receive_skb()
5648 static int qeth_extract_skb(struct qeth_card *card, in qeth_extract_skb() argument
5652 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_extract_skb()
5654 struct napi_struct *napi = &card->napi; in qeth_extract_skb()
5688 if (!IS_LAYER3(card)) { in qeth_extract_skb()
5689 QETH_CARD_STAT_INC(card, rx_dropped_notsupp); in qeth_extract_skb()
5707 QETH_CARD_STAT_INC(card, rx_frame_errors); in qeth_extract_skb()
5709 QETH_CARD_STAT_INC(card, rx_dropped_notsupp); in qeth_extract_skb()
5716 QETH_CARD_STAT_INC(card, rx_dropped_runt); in qeth_extract_skb()
5720 use_rx_sg = (card->options.cq == QETH_CQ_ENABLED) || in qeth_extract_skb()
5722 !atomic_read(&card->force_alloc_skb)); in qeth_extract_skb()
5736 QETH_CARD_STAT_INC(card, rx_dropped_nomem); in qeth_extract_skb()
5745 netdev_info_once(card->dev, in qeth_extract_skb()
5754 QETH_CARD_STAT_INC(card, rx_dropped_nomem); in qeth_extract_skb()
5790 QETH_CARD_TEXT(card, 4, "unexeob"); in qeth_extract_skb()
5791 QETH_CARD_HEX(card, 2, buffer, sizeof(void *)); in qeth_extract_skb()
5797 QETH_CARD_STAT_INC(card, in qeth_extract_skb()
5814 qeth_receive_skb(card, skb, hdr, uses_frags); in qeth_extract_skb()
5818 static unsigned int qeth_extract_skbs(struct qeth_card *card, int budget, in qeth_extract_skbs() argument
5824 if (qeth_extract_skb(card, buf, &card->rx.buf_element, in qeth_extract_skbs()
5825 &card->rx.e_offset)) { in qeth_extract_skbs()
5837 static unsigned int qeth_rx_poll(struct qeth_card *card, int budget) in qeth_rx_poll() argument
5839 struct qeth_rx *ctx = &card->rx; in qeth_rx_poll()
5848 if (!card->rx.b_count) { in qeth_rx_poll()
5849 card->rx.qdio_err = 0; in qeth_rx_poll()
5850 card->rx.b_count = qdio_inspect_queue(CARD_DDEV(card), in qeth_rx_poll()
5852 &card->rx.b_index, in qeth_rx_poll()
5853 &card->rx.qdio_err); in qeth_rx_poll()
5854 if (card->rx.b_count <= 0) { in qeth_rx_poll()
5855 card->rx.b_count = 0; in qeth_rx_poll()
5861 buffer = &card->qdio.in_q->bufs[card->rx.b_index]; in qeth_rx_poll()
5862 if (!(card->rx.qdio_err && in qeth_rx_poll()
5863 qeth_check_qdio_errors(card, buffer->buffer, in qeth_rx_poll()
5864 card->rx.qdio_err, "qinerr"))) in qeth_rx_poll()
5865 skbs_done = qeth_extract_skbs(card, budget, buffer, in qeth_rx_poll()
5874 QETH_CARD_STAT_INC(card, rx_bufs); in qeth_rx_poll()
5875 qeth_put_buffer_pool_entry(card, buffer->pool_entry); in qeth_rx_poll()
5877 card->rx.b_count--; in qeth_rx_poll()
5879 ctx->bufs_refill -= qeth_rx_refill_queue(card, in qeth_rx_poll()
5883 card->rx.b_index = QDIO_BUFNR(card->rx.b_index + 1); in qeth_rx_poll()
5884 card->rx.buf_element = 0; in qeth_rx_poll()
5885 card->rx.e_offset = 0; in qeth_rx_poll()
5892 static void qeth_cq_poll(struct qeth_card *card) in qeth_cq_poll() argument
5900 completed = qdio_inspect_queue(CARD_DDEV(card), 1, true, &start, in qeth_cq_poll()
5905 qeth_qdio_cq_handler(card, error, 1, start, completed); in qeth_cq_poll()
5912 struct qeth_card *card = container_of(napi, struct qeth_card, napi); in qeth_poll() local
5915 work_done = qeth_rx_poll(card, budget); in qeth_poll()
5917 if (qeth_use_tx_irqs(card)) { in qeth_poll()
5921 qeth_for_each_output_queue(card, queue, i) { in qeth_poll()
5927 if (card->options.cq == QETH_CQ_ENABLED) in qeth_poll()
5928 qeth_cq_poll(card); in qeth_poll()
5931 struct qeth_rx *ctx = &card->rx; in qeth_poll()
5934 ctx->bufs_refill -= qeth_rx_refill_queue(card, ctx->bufs_refill); in qeth_poll()
5942 qdio_start_irq(CARD_DDEV(card))) in qeth_poll()
5955 struct qeth_card *card = queue->card; in qeth_iqd_tx_complete() local
5964 netdev_WARN_ONCE(card->dev, in qeth_iqd_tx_complete()
5967 qeth_schedule_recovery(card); in qeth_iqd_tx_complete()
5971 QETH_CARD_TEXT_(card, 5, "pel%u", bidx); in qeth_iqd_tx_complete()
5981 QETH_CARD_TEXT(card, 2, "outofbuf"); in qeth_iqd_tx_complete()
5982 qeth_schedule_recovery(card); in qeth_iqd_tx_complete()
5995 } else if (card->options.cq == QETH_CQ_ENABLED) { in qeth_iqd_tx_complete()
6007 struct qeth_card *card = queue->card; in qeth_tx_poll() local
6008 struct net_device *dev = card->dev; in qeth_tx_poll()
6012 if (IS_IQD(card)) in qeth_tx_poll()
6023 qeth_tx_complete_pending_bufs(card, queue, false, budget); in qeth_tx_poll()
6038 completed = qdio_inspect_queue(CARD_DDEV(card), queue_no, false, in qeth_tx_poll()
6056 qeth_handle_send_error(card, buffer, error); in qeth_tx_poll()
6057 if (IS_IQD(card)) in qeth_tx_poll()
6066 if (IS_IQD(card)) in qeth_tx_poll()
6089 static int qeth_setassparms_get_caps_cb(struct qeth_card *card, in qeth_setassparms_get_caps_cb() argument
6104 int qeth_setassparms_cb(struct qeth_card *card, in qeth_setassparms_cb() argument
6109 QETH_CARD_TEXT(card, 4, "defadpcb"); in qeth_setassparms_cb()
6116 card->options.ipa4.enabled = cmd->hdr.assists.enabled; in qeth_setassparms_cb()
6118 card->options.ipa6.enabled = cmd->hdr.assists.enabled; in qeth_setassparms_cb()
6123 struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card, in qeth_get_setassparms_cmd() argument
6133 QETH_CARD_TEXT(card, 4, "getasscm"); in qeth_get_setassparms_cmd()
6134 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETASSPARMS, prot, in qeth_get_setassparms_cmd()
6151 int qeth_send_simple_setassparms_prot(struct qeth_card *card, in qeth_send_simple_setassparms_prot() argument
6159 QETH_CARD_TEXT_(card, 4, "simassp%i", prot); in qeth_send_simple_setassparms_prot()
6160 iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code, length, prot); in qeth_send_simple_setassparms_prot()
6166 return qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL); in qeth_send_simple_setassparms_prot()
6226 int qeth_setup_discipline(struct qeth_card *card, in qeth_setup_discipline() argument
6234 card->discipline = try_then_request_module( in qeth_setup_discipline()
6238 card->discipline = try_then_request_module( in qeth_setup_discipline()
6246 if (!card->discipline) { in qeth_setup_discipline()
6247 dev_err(&card->gdev->dev, "There is no kernel module to " in qeth_setup_discipline()
6252 rc = card->discipline->setup(card->gdev); in qeth_setup_discipline()
6258 card->discipline = NULL; in qeth_setup_discipline()
6263 card->options.layer = discipline; in qeth_setup_discipline()
6267 void qeth_remove_discipline(struct qeth_card *card) in qeth_remove_discipline() argument
6269 card->discipline->remove(card->gdev); in qeth_remove_discipline()
6271 if (IS_LAYER2(card)) in qeth_remove_discipline()
6275 card->options.layer = QETH_DISCIPLINE_UNDETERMINED; in qeth_remove_discipline()
6276 card->discipline = NULL; in qeth_remove_discipline()
6310 static int qeth_add_dbf_entry(struct qeth_card *card, char *name) in qeth_add_dbf_entry() argument
6314 card->debug = debug_register(name, 2, 1, 8); in qeth_add_dbf_entry()
6315 if (!card->debug) { in qeth_add_dbf_entry()
6319 if (debug_register_view(card->debug, &debug_hex_ascii_view)) in qeth_add_dbf_entry()
6325 new_entry->dbf_info = card->debug; in qeth_add_dbf_entry()
6333 debug_unregister(card->debug); in qeth_add_dbf_entry()
6351 static struct net_device *qeth_alloc_netdev(struct qeth_card *card) in qeth_alloc_netdev() argument
6356 switch (card->info.type) { in qeth_alloc_netdev()
6373 priv->tx_wanted_queues = IS_IQD(card) ? QETH_IQD_MIN_TXQ : 1; in qeth_alloc_netdev()
6375 dev->ml_priv = card; in qeth_alloc_netdev()
6381 SET_NETDEV_DEV(dev, &card->gdev->dev); in qeth_alloc_netdev()
6388 if (IS_IQD(card)) in qeth_alloc_netdev()
6407 struct qeth_card *card; in qeth_core_probe_device() local
6421 card = qeth_alloc_card(gdev); in qeth_core_probe_device()
6422 if (!card) { in qeth_core_probe_device()
6430 card->debug = qeth_get_dbf_entry(dbf_name); in qeth_core_probe_device()
6431 if (!card->debug) { in qeth_core_probe_device()
6432 rc = qeth_add_dbf_entry(card, dbf_name); in qeth_core_probe_device()
6437 qeth_setup_card(card); in qeth_core_probe_device()
6438 card->dev = qeth_alloc_netdev(card); in qeth_core_probe_device()
6439 if (!card->dev) { in qeth_core_probe_device()
6444 qeth_determine_capabilities(card); in qeth_core_probe_device()
6445 qeth_set_blkt_defaults(card); in qeth_core_probe_device()
6447 card->qdio.no_out_queues = card->dev->num_tx_queues; in qeth_core_probe_device()
6448 rc = qeth_update_from_chp_desc(card); in qeth_core_probe_device()
6454 enforced_disc = qeth_enforce_discipline(card); in qeth_core_probe_device()
6460 card->info.layer_enforced = true; in qeth_core_probe_device()
6462 rc = qeth_setup_discipline(card, enforced_disc); in qeth_core_probe_device()
6473 free_netdev(card->dev); in qeth_core_probe_device()
6475 qeth_core_free_card(card); in qeth_core_probe_device()
6483 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_remove_device() local
6485 QETH_CARD_TEXT(card, 2, "removedv"); in qeth_core_remove_device()
6487 mutex_lock(&card->discipline_mutex); in qeth_core_remove_device()
6488 if (card->discipline) in qeth_core_remove_device()
6489 qeth_remove_discipline(card); in qeth_core_remove_device()
6490 mutex_unlock(&card->discipline_mutex); in qeth_core_remove_device()
6492 qeth_free_qdio_queues(card); in qeth_core_remove_device()
6494 free_netdev(card->dev); in qeth_core_remove_device()
6495 qeth_core_free_card(card); in qeth_core_remove_device()
6501 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_set_online() local
6505 mutex_lock(&card->discipline_mutex); in qeth_core_set_online()
6506 if (!card->discipline) { in qeth_core_set_online()
6507 def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 : in qeth_core_set_online()
6509 rc = qeth_setup_discipline(card, def_discipline); in qeth_core_set_online()
6514 rc = qeth_set_online(card, card->discipline); in qeth_core_set_online()
6517 mutex_unlock(&card->discipline_mutex); in qeth_core_set_online()
6523 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_set_offline() local
6526 mutex_lock(&card->discipline_mutex); in qeth_core_set_offline()
6527 rc = qeth_set_offline(card, card->discipline, false); in qeth_core_set_offline()
6528 mutex_unlock(&card->discipline_mutex); in qeth_core_set_offline()
6535 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_shutdown() local
6537 qeth_set_allowed_threads(card, 0, 1); in qeth_core_shutdown()
6538 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) in qeth_core_shutdown()
6539 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_core_shutdown()
6540 qeth_qdio_clear_card(card, 0); in qeth_core_shutdown()
6541 qeth_drain_output_queues(card); in qeth_core_shutdown()
6542 qdio_free(CARD_DDEV(card)); in qeth_core_shutdown()
6585 struct qeth_card *card = dev->ml_priv; in qeth_siocdevprivate() local
6590 rc = qeth_snmp_command(card, data); in qeth_siocdevprivate()
6593 if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) && in qeth_siocdevprivate()
6594 !IS_VM_NIC(card)) in qeth_siocdevprivate()
6598 rc = qeth_query_oat_command(card, data); in qeth_siocdevprivate()
6601 if (card->discipline->do_ioctl) in qeth_siocdevprivate()
6602 rc = card->discipline->do_ioctl(dev, rq, data, cmd); in qeth_siocdevprivate()
6607 QETH_CARD_TEXT_(card, 2, "ioce%x", rc); in qeth_siocdevprivate()
6614 struct qeth_card *card = dev->ml_priv; in qeth_do_ioctl() local
6635 QETH_CARD_TEXT_(card, 2, "ioce%x", rc); in qeth_do_ioctl()
6640 static int qeth_start_csum_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_start_csum_cb() argument
6653 static int qeth_set_csum_off(struct qeth_card *card, enum qeth_ipa_funcs cstype, in qeth_set_csum_off() argument
6656 return qeth_send_simple_setassparms_prot(card, cstype, IPA_CMD_ASS_STOP, in qeth_set_csum_off()
6660 static int qeth_set_csum_on(struct qeth_card *card, enum qeth_ipa_funcs cstype, in qeth_set_csum_on() argument
6670 if (IS_LAYER3(card) && prot == QETH_PROT_IPV4 && in qeth_set_csum_on()
6674 iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_START, 0, in qeth_set_csum_on()
6679 rc = qeth_send_ipa_cmd(card, iob, qeth_start_csum_cb, &features); in qeth_set_csum_on()
6684 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6688 iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_ENABLE, in qeth_set_csum_on()
6692 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6699 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps); in qeth_set_csum_on()
6701 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6707 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6711 dev_info(&card->gdev->dev, "HW Checksumming (%sbound IPv%d) enabled\n", in qeth_set_csum_on()
6720 static int qeth_set_ipa_csum(struct qeth_card *card, bool on, int cstype, in qeth_set_ipa_csum() argument
6723 return on ? qeth_set_csum_on(card, cstype, prot, lp2lp) : in qeth_set_ipa_csum()
6724 qeth_set_csum_off(card, cstype, prot); in qeth_set_ipa_csum()
6727 static int qeth_start_tso_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_start_tso_cb() argument
6741 static int qeth_set_tso_off(struct qeth_card *card, in qeth_set_tso_off() argument
6744 return qeth_send_simple_setassparms_prot(card, IPA_OUTBOUND_TSO, in qeth_set_tso_off()
6748 static int qeth_set_tso_on(struct qeth_card *card, in qeth_set_tso_on() argument
6756 iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO, in qeth_set_tso_on()
6761 rc = qeth_send_ipa_cmd(card, iob, qeth_start_tso_cb, &tso_data); in qeth_set_tso_on()
6766 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6770 iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO, in qeth_set_tso_on()
6774 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6781 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps); in qeth_set_tso_on()
6783 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6789 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6793 dev_info(&card->gdev->dev, "TSOv%u enabled (MSS: %u)\n", prot, in qeth_set_tso_on()
6798 static int qeth_set_ipa_tso(struct qeth_card *card, bool on, in qeth_set_ipa_tso() argument
6801 return on ? qeth_set_tso_on(card, prot) : qeth_set_tso_off(card, prot); in qeth_set_ipa_tso()
6804 static int qeth_set_ipa_rx_csum(struct qeth_card *card, bool on) in qeth_set_ipa_rx_csum() argument
6809 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) in qeth_set_ipa_rx_csum()
6810 rc_ipv4 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM, in qeth_set_ipa_rx_csum()
6812 if (!qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) in qeth_set_ipa_rx_csum()
6816 rc_ipv6 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM, in qeth_set_ipa_rx_csum()
6833 struct qeth_card *card = dev->ml_priv; in qeth_enable_hw_features() local
6842 if (IS_LAYER2(card) && IS_VM_NIC(card)) { in qeth_enable_hw_features()
6848 dev_warn(&card->gdev->dev, in qeth_enable_hw_features()
6853 static void qeth_check_restricted_features(struct qeth_card *card, in qeth_check_restricted_features() argument
6860 if (!card->info.has_lp2lp_cso_v6) in qeth_check_restricted_features()
6862 if (!card->info.has_lp2lp_cso_v4) in qeth_check_restricted_features()
6866 qeth_flush_local_addrs6(card); in qeth_check_restricted_features()
6868 qeth_flush_local_addrs4(card); in qeth_check_restricted_features()
6873 struct qeth_card *card = dev->ml_priv; in qeth_set_features() local
6877 QETH_CARD_TEXT(card, 2, "setfeat"); in qeth_set_features()
6878 QETH_CARD_HEX(card, 2, &features, sizeof(features)); in qeth_set_features()
6881 rc = qeth_set_ipa_csum(card, features & NETIF_F_IP_CSUM, in qeth_set_features()
6883 &card->info.has_lp2lp_cso_v4); in qeth_set_features()
6888 rc = qeth_set_ipa_csum(card, features & NETIF_F_IPV6_CSUM, in qeth_set_features()
6890 &card->info.has_lp2lp_cso_v6); in qeth_set_features()
6895 rc = qeth_set_ipa_rx_csum(card, features & NETIF_F_RXCSUM); in qeth_set_features()
6900 rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO, in qeth_set_features()
6906 rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO6, in qeth_set_features()
6912 qeth_check_restricted_features(card, dev->features ^ features, in qeth_set_features()
6927 struct qeth_card *card = dev->ml_priv; in qeth_fix_features() local
6929 QETH_CARD_TEXT(card, 2, "fixfeat"); in qeth_fix_features()
6930 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) in qeth_fix_features()
6932 if (!qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) in qeth_fix_features()
6934 if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM) && in qeth_fix_features()
6935 !qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) in qeth_fix_features()
6937 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) in qeth_fix_features()
6939 if (!qeth_is_supported6(card, IPA_OUTBOUND_TSO)) in qeth_fix_features()
6942 QETH_CARD_HEX(card, 2, &features, sizeof(features)); in qeth_fix_features()
6951 struct qeth_card *card = dev->ml_priv; in qeth_features_check() local
6955 READ_ONCE(card->options.isolation) != ISOLATION_MODE_FWD) { in qeth_features_check()
6963 if (!card->info.has_lp2lp_cso_v4) in qeth_features_check()
6966 if (restricted && qeth_next_hop_is_local_v4(card, skb)) in qeth_features_check()
6970 if (!card->info.has_lp2lp_cso_v6) in qeth_features_check()
6973 if (restricted && qeth_next_hop_is_local_v6(card, skb)) in qeth_features_check()
7005 struct qeth_card *card = dev->ml_priv; in qeth_get_stats64() local
7009 QETH_CARD_TEXT(card, 5, "getstat"); in qeth_get_stats64()
7011 stats->rx_packets = card->stats.rx_packets; in qeth_get_stats64()
7012 stats->rx_bytes = card->stats.rx_bytes; in qeth_get_stats64()
7013 stats->rx_errors = card->stats.rx_length_errors + in qeth_get_stats64()
7014 card->stats.rx_frame_errors + in qeth_get_stats64()
7015 card->stats.rx_fifo_errors; in qeth_get_stats64()
7016 stats->rx_dropped = card->stats.rx_dropped_nomem + in qeth_get_stats64()
7017 card->stats.rx_dropped_notsupp + in qeth_get_stats64()
7018 card->stats.rx_dropped_runt; in qeth_get_stats64()
7019 stats->multicast = card->stats.rx_multicast; in qeth_get_stats64()
7020 stats->rx_length_errors = card->stats.rx_length_errors; in qeth_get_stats64()
7021 stats->rx_frame_errors = card->stats.rx_frame_errors; in qeth_get_stats64()
7022 stats->rx_fifo_errors = card->stats.rx_fifo_errors; in qeth_get_stats64()
7024 for (i = 0; i < card->qdio.no_out_queues; i++) { in qeth_get_stats64()
7025 queue = card->qdio.out_qs[i]; in qeth_get_stats64()
7059 int qeth_set_real_num_tx_queues(struct qeth_card *card, unsigned int count) in qeth_set_real_num_tx_queues() argument
7061 struct net_device *dev = card->dev; in qeth_set_real_num_tx_queues()
7065 if (IS_IQD(card)) in qeth_set_real_num_tx_queues()
7070 if (rc && IS_IQD(card)) in qeth_set_real_num_tx_queues()
7094 struct qeth_card *card = dev->ml_priv; in qeth_open() local
7098 QETH_CARD_TEXT(card, 4, "qethopen"); in qeth_open()
7100 card->data.state = CH_STATE_UP; in qeth_open()
7104 qeth_for_each_output_queue(card, queue, i) { in qeth_open()
7111 napi_enable(&card->napi); in qeth_open()
7112 napi_schedule(&card->napi); in qeth_open()
7122 struct qeth_card *card = dev->ml_priv; in qeth_stop() local
7126 QETH_CARD_TEXT(card, 4, "qethstop"); in qeth_stop()
7128 napi_disable(&card->napi); in qeth_stop()
7129 cancel_delayed_work_sync(&card->buffer_reclaim_work); in qeth_stop()
7130 qdio_stop_irq(CARD_DDEV(card)); in qeth_stop()
7133 qeth_for_each_output_queue(card, queue, i) in qeth_stop()
7139 qeth_for_each_output_queue(card, queue, i) { in qeth_stop()