Lines Matching full:card
68 static void qeth_issue_next_read_cb(struct qeth_card *card,
72 static void qeth_free_qdio_queues(struct qeth_card *card);
82 struct qeth_card *card; in qeth_close_dev_handler() local
84 card = container_of(work, struct qeth_card, close_dev_work); in qeth_close_dev_handler()
85 QETH_CARD_TEXT(card, 2, "cldevhdl"); in qeth_close_dev_handler()
86 ccwgroup_set_offline(card->gdev); in qeth_close_dev_handler()
89 static const char *qeth_get_cardname(struct qeth_card *card) in qeth_get_cardname() argument
91 if (IS_VM_NIC(card)) { in qeth_get_cardname()
92 switch (card->info.type) { in qeth_get_cardname()
105 switch (card->info.type) { in qeth_get_cardname()
124 const char *qeth_get_cardname_short(struct qeth_card *card) in qeth_get_cardname_short() argument
126 if (IS_VM_NIC(card)) { in qeth_get_cardname_short()
127 switch (card->info.type) { in qeth_get_cardname_short()
140 switch (card->info.type) { in qeth_get_cardname_short()
142 switch (card->info.link_type) { in qeth_get_cardname_short()
179 void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads, in qeth_set_allowed_threads() argument
184 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_set_allowed_threads()
185 card->thread_allowed_mask = threads; in qeth_set_allowed_threads()
187 card->thread_start_mask &= threads; in qeth_set_allowed_threads()
188 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_set_allowed_threads()
189 wake_up(&card->wait_q); in qeth_set_allowed_threads()
193 int qeth_threads_running(struct qeth_card *card, unsigned long threads) in qeth_threads_running() argument
198 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_threads_running()
199 rc = (card->thread_running_mask & threads); in qeth_threads_running()
200 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_threads_running()
205 static void qeth_clear_working_pool_list(struct qeth_card *card) in qeth_clear_working_pool_list() argument
208 struct qeth_qdio_q *queue = card->qdio.in_q; in qeth_clear_working_pool_list()
211 QETH_CARD_TEXT(card, 5, "clwrklst"); in qeth_clear_working_pool_list()
213 &card->qdio.in_buf_pool.entry_list, list) in qeth_clear_working_pool_list()
232 static void qeth_free_buffer_pool(struct qeth_card *card) in qeth_free_buffer_pool() argument
236 list_for_each_entry_safe(entry, tmp, &card->qdio.init_pool.entry_list, in qeth_free_buffer_pool()
264 static int qeth_alloc_buffer_pool(struct qeth_card *card) in qeth_alloc_buffer_pool() argument
266 unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_alloc_buffer_pool()
269 QETH_CARD_TEXT(card, 5, "alocpool"); in qeth_alloc_buffer_pool()
270 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { in qeth_alloc_buffer_pool()
275 qeth_free_buffer_pool(card); in qeth_alloc_buffer_pool()
279 list_add(&entry->init_list, &card->qdio.init_pool.entry_list); in qeth_alloc_buffer_pool()
284 int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count) in qeth_resize_buffer_pool() argument
286 unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_resize_buffer_pool()
287 struct qeth_qdio_buffer_pool *pool = &card->qdio.init_pool; in qeth_resize_buffer_pool()
292 QETH_CARD_TEXT(card, 2, "realcbp"); in qeth_resize_buffer_pool()
295 if (!card->qdio.in_q) in qeth_resize_buffer_pool()
330 card->qdio.in_buf_pool.buf_count = count; in qeth_resize_buffer_pool()
365 static int qeth_cq_init(struct qeth_card *card) in qeth_cq_init() argument
369 if (card->options.cq == QETH_CQ_ENABLED) { in qeth_cq_init()
370 QETH_CARD_TEXT(card, 2, "cqinit"); in qeth_cq_init()
371 qdio_reset_buffers(card->qdio.c_q->qdio_bufs, in qeth_cq_init()
373 card->qdio.c_q->next_buf_to_init = 127; in qeth_cq_init()
374 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, in qeth_cq_init()
375 card->qdio.no_in_queues - 1, 0, in qeth_cq_init()
378 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_cq_init()
387 static int qeth_alloc_cq(struct qeth_card *card) in qeth_alloc_cq() argument
391 if (card->options.cq == QETH_CQ_ENABLED) { in qeth_alloc_cq()
395 QETH_CARD_TEXT(card, 2, "cqon"); in qeth_alloc_cq()
396 card->qdio.c_q = qeth_alloc_qdio_queue(); in qeth_alloc_cq()
397 if (!card->qdio.c_q) { in qeth_alloc_cq()
401 card->qdio.no_in_queues = 2; in qeth_alloc_cq()
402 card->qdio.out_bufstates = in qeth_alloc_cq()
403 kcalloc(card->qdio.no_out_queues * in qeth_alloc_cq()
407 outbuf_states = card->qdio.out_bufstates; in qeth_alloc_cq()
412 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_alloc_cq()
413 card->qdio.out_qs[i]->bufstates = outbuf_states; in qeth_alloc_cq()
417 QETH_CARD_TEXT(card, 2, "nocq"); in qeth_alloc_cq()
418 card->qdio.c_q = NULL; in qeth_alloc_cq()
419 card->qdio.no_in_queues = 1; in qeth_alloc_cq()
421 QETH_CARD_TEXT_(card, 2, "iqc%d", card->qdio.no_in_queues); in qeth_alloc_cq()
426 qeth_free_qdio_queue(card->qdio.c_q); in qeth_alloc_cq()
427 card->qdio.c_q = NULL; in qeth_alloc_cq()
429 dev_err(&card->gdev->dev, "Failed to create completion queue\n"); in qeth_alloc_cq()
433 static void qeth_free_cq(struct qeth_card *card) in qeth_free_cq() argument
435 if (card->qdio.c_q) { in qeth_free_cq()
436 --card->qdio.no_in_queues; in qeth_free_cq()
437 qeth_free_qdio_queue(card->qdio.c_q); in qeth_free_cq()
438 card->qdio.c_q = NULL; in qeth_free_cq()
440 kfree(card->qdio.out_bufstates); in qeth_free_cq()
441 card->qdio.out_bufstates = NULL; in qeth_free_cq()
472 if (q->card->options.cq != QETH_CQ_ENABLED) in qeth_cleanup_handled_pending()
485 QETH_CARD_TEXT(f->q->card, 5, "fp"); in qeth_cleanup_handled_pending()
486 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f); in qeth_cleanup_handled_pending()
505 static void qeth_qdio_handle_aob(struct qeth_card *card, in qeth_qdio_handle_aob() argument
515 QETH_CARD_TEXT(card, 5, "haob"); in qeth_qdio_handle_aob()
516 QETH_CARD_TEXT_(card, 5, "%lx", phys_aob_addr); in qeth_qdio_handle_aob()
518 QETH_CARD_TEXT_(card, 5, "%lx", aob->user1); in qeth_qdio_handle_aob()
524 i < aob->sb_count && i < QETH_MAX_BUFFER_ELEMENTS(card); in qeth_qdio_handle_aob()
533 QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc); in qeth_qdio_handle_aob()
571 static int __qeth_issue_next_read(struct qeth_card *card) in __qeth_issue_next_read() argument
573 struct qeth_cmd_buffer *iob = card->read_cmd; in __qeth_issue_next_read()
578 QETH_CARD_TEXT(card, 5, "issnxrd"); in __qeth_issue_next_read()
588 QETH_CARD_TEXT(card, 6, "noirqpnd"); in __qeth_issue_next_read()
594 rc, CARD_DEVID(card)); in __qeth_issue_next_read()
595 qeth_unlock_channel(card, channel); in __qeth_issue_next_read()
597 card->read_or_write_problem = 1; in __qeth_issue_next_read()
598 qeth_schedule_recovery(card); in __qeth_issue_next_read()
603 static int qeth_issue_next_read(struct qeth_card *card) in qeth_issue_next_read() argument
607 spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_issue_next_read()
608 ret = __qeth_issue_next_read(card); in qeth_issue_next_read()
609 spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_issue_next_read()
614 static void qeth_enqueue_cmd(struct qeth_card *card, in qeth_enqueue_cmd() argument
617 spin_lock_irq(&card->lock); in qeth_enqueue_cmd()
618 list_add_tail(&iob->list, &card->cmd_waiter_list); in qeth_enqueue_cmd()
619 spin_unlock_irq(&card->lock); in qeth_enqueue_cmd()
622 static void qeth_dequeue_cmd(struct qeth_card *card, in qeth_dequeue_cmd() argument
625 spin_lock_irq(&card->lock); in qeth_dequeue_cmd()
627 spin_unlock_irq(&card->lock); in qeth_dequeue_cmd()
637 static void qeth_flush_local_addrs4(struct qeth_card *card) in qeth_flush_local_addrs4() argument
643 spin_lock_irq(&card->local_addrs4_lock); in qeth_flush_local_addrs4()
644 hash_for_each_safe(card->local_addrs4, i, tmp, addr, hnode) { in qeth_flush_local_addrs4()
648 spin_unlock_irq(&card->local_addrs4_lock); in qeth_flush_local_addrs4()
651 static void qeth_flush_local_addrs6(struct qeth_card *card) in qeth_flush_local_addrs6() argument
657 spin_lock_irq(&card->local_addrs6_lock); in qeth_flush_local_addrs6()
658 hash_for_each_safe(card->local_addrs6, i, tmp, addr, hnode) { in qeth_flush_local_addrs6()
662 spin_unlock_irq(&card->local_addrs6_lock); in qeth_flush_local_addrs6()
665 static void qeth_flush_local_addrs(struct qeth_card *card) in qeth_flush_local_addrs() argument
667 qeth_flush_local_addrs4(card); in qeth_flush_local_addrs()
668 qeth_flush_local_addrs6(card); in qeth_flush_local_addrs()
671 static void qeth_add_local_addrs4(struct qeth_card *card, in qeth_add_local_addrs4() argument
678 dev_err_ratelimited(&card->gdev->dev, in qeth_add_local_addrs4()
684 spin_lock(&card->local_addrs4_lock); in qeth_add_local_addrs4()
690 hash_for_each_possible(card->local_addrs4, addr, hnode, key) { in qeth_add_local_addrs4()
702 dev_err(&card->gdev->dev, in qeth_add_local_addrs4()
709 hash_add_rcu(card->local_addrs4, &addr->hnode, key); in qeth_add_local_addrs4()
711 spin_unlock(&card->local_addrs4_lock); in qeth_add_local_addrs4()
714 static void qeth_add_local_addrs6(struct qeth_card *card, in qeth_add_local_addrs6() argument
721 dev_err_ratelimited(&card->gdev->dev, in qeth_add_local_addrs6()
727 spin_lock(&card->local_addrs6_lock); in qeth_add_local_addrs6()
733 hash_for_each_possible(card->local_addrs6, addr, hnode, key) { in qeth_add_local_addrs6()
745 dev_err(&card->gdev->dev, in qeth_add_local_addrs6()
752 hash_add_rcu(card->local_addrs6, &addr->hnode, key); in qeth_add_local_addrs6()
754 spin_unlock(&card->local_addrs6_lock); in qeth_add_local_addrs6()
757 static void qeth_del_local_addrs4(struct qeth_card *card, in qeth_del_local_addrs4() argument
764 dev_err_ratelimited(&card->gdev->dev, in qeth_del_local_addrs4()
770 spin_lock(&card->local_addrs4_lock); in qeth_del_local_addrs4()
776 hash_for_each_possible(card->local_addrs4, tmp, hnode, key) { in qeth_del_local_addrs4()
784 spin_unlock(&card->local_addrs4_lock); in qeth_del_local_addrs4()
787 static void qeth_del_local_addrs6(struct qeth_card *card, in qeth_del_local_addrs6() argument
794 dev_err_ratelimited(&card->gdev->dev, in qeth_del_local_addrs6()
800 spin_lock(&card->local_addrs6_lock); in qeth_del_local_addrs6()
806 hash_for_each_possible(card->local_addrs6, tmp, hnode, key) { in qeth_del_local_addrs6()
814 spin_unlock(&card->local_addrs6_lock); in qeth_del_local_addrs6()
817 static bool qeth_next_hop_is_local_v4(struct qeth_card *card, in qeth_next_hop_is_local_v4() argument
825 if (hash_empty(card->local_addrs4)) in qeth_next_hop_is_local_v4()
832 hash_for_each_possible_rcu(card->local_addrs4, tmp, hnode, key) { in qeth_next_hop_is_local_v4()
843 static bool qeth_next_hop_is_local_v6(struct qeth_card *card, in qeth_next_hop_is_local_v6() argument
851 if (hash_empty(card->local_addrs6)) in qeth_next_hop_is_local_v6()
858 hash_for_each_possible_rcu(card->local_addrs6, tmp, hnode, key) { in qeth_next_hop_is_local_v6()
871 struct qeth_card *card = m->private; in qeth_debugfs_local_addr_show() local
876 hash_for_each_rcu(card->local_addrs4, i, tmp, hnode) in qeth_debugfs_local_addr_show()
878 hash_for_each_rcu(card->local_addrs6, i, tmp, hnode) in qeth_debugfs_local_addr_show()
888 struct qeth_card *card) in qeth_issue_ipa_msg() argument
897 ipa_name, com, CARD_DEVID(card), rc, in qeth_issue_ipa_msg()
901 ipa_name, com, CARD_DEVID(card)); in qeth_issue_ipa_msg()
904 static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, in qeth_check_ipa_data() argument
907 QETH_CARD_TEXT(card, 5, "chkipad"); in qeth_check_ipa_data()
914 qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card); in qeth_check_ipa_data()
922 dev_err(&card->gdev->dev, in qeth_check_ipa_data()
924 netdev_name(card->dev)); in qeth_check_ipa_data()
925 schedule_work(&card->close_dev_work); in qeth_check_ipa_data()
927 dev_warn(&card->gdev->dev, in qeth_check_ipa_data()
929 netdev_name(card->dev), card->info.chpid); in qeth_check_ipa_data()
930 qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card); in qeth_check_ipa_data()
931 netif_carrier_off(card->dev); in qeth_check_ipa_data()
935 dev_info(&card->gdev->dev, in qeth_check_ipa_data()
937 netdev_name(card->dev), card->info.chpid); in qeth_check_ipa_data()
938 if (card->info.hwtrap) in qeth_check_ipa_data()
939 card->info.hwtrap = 2; in qeth_check_ipa_data()
940 qeth_schedule_recovery(card); in qeth_check_ipa_data()
945 if (card->discipline->control_event_handler(card, cmd)) in qeth_check_ipa_data()
952 qeth_add_local_addrs4(card, &cmd->data.local_addrs4); in qeth_check_ipa_data()
954 qeth_add_local_addrs6(card, &cmd->data.local_addrs6); in qeth_check_ipa_data()
956 QETH_CARD_TEXT(card, 3, "irla"); in qeth_check_ipa_data()
960 qeth_del_local_addrs4(card, &cmd->data.local_addrs4); in qeth_check_ipa_data()
962 qeth_del_local_addrs6(card, &cmd->data.local_addrs6); in qeth_check_ipa_data()
964 QETH_CARD_TEXT(card, 3, "urla"); in qeth_check_ipa_data()
972 static void qeth_clear_ipacmd_list(struct qeth_card *card) in qeth_clear_ipacmd_list() argument
977 QETH_CARD_TEXT(card, 4, "clipalst"); in qeth_clear_ipacmd_list()
979 spin_lock_irqsave(&card->lock, flags); in qeth_clear_ipacmd_list()
980 list_for_each_entry(iob, &card->cmd_waiter_list, list) in qeth_clear_ipacmd_list()
982 spin_unlock_irqrestore(&card->lock, flags); in qeth_clear_ipacmd_list()
985 static int qeth_check_idx_response(struct qeth_card *card, in qeth_check_idx_response() argument
992 QETH_CARD_TEXT(card, 2, "ckidxres"); in qeth_check_idx_response()
993 QETH_CARD_TEXT(card, 2, " idxterm"); in qeth_check_idx_response()
994 QETH_CARD_TEXT_(card, 2, "rc%x", buffer[4]); in qeth_check_idx_response()
997 dev_err(&card->gdev->dev, in qeth_check_idx_response()
1015 static void qeth_release_buffer_cb(struct qeth_card *card, in qeth_release_buffer_cb() argument
1059 static void qeth_issue_next_read_cb(struct qeth_card *card, in qeth_issue_next_read_cb() argument
1070 QETH_CARD_TEXT(card, 4, "sndctlcb"); in qeth_issue_next_read_cb()
1071 rc = qeth_check_idx_response(card, iob->data); in qeth_issue_next_read_cb()
1076 qeth_schedule_recovery(card); in qeth_issue_next_read_cb()
1079 qeth_clear_ipacmd_list(card); in qeth_issue_next_read_cb()
1085 cmd = qeth_check_ipa_data(card, cmd); in qeth_issue_next_read_cb()
1088 if (IS_OSN(card) && card->osn_info.assist_cb && in qeth_issue_next_read_cb()
1090 card->osn_info.assist_cb(card->dev, cmd); in qeth_issue_next_read_cb()
1096 spin_lock_irqsave(&card->lock, flags); in qeth_issue_next_read_cb()
1097 list_for_each_entry(tmp, &card->cmd_waiter_list, list) { in qeth_issue_next_read_cb()
1105 spin_unlock_irqrestore(&card->lock, flags); in qeth_issue_next_read_cb()
1121 rc = reply->callback(card, reply, cmd ? (unsigned long)cmd : in qeth_issue_next_read_cb()
1130 memcpy(&card->seqno.pdu_hdr_ack, in qeth_issue_next_read_cb()
1133 __qeth_issue_next_read(card); in qeth_issue_next_read_cb()
1138 static int qeth_set_thread_start_bit(struct qeth_card *card, in qeth_set_thread_start_bit() argument
1144 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_set_thread_start_bit()
1145 if (!(card->thread_allowed_mask & thread)) in qeth_set_thread_start_bit()
1147 else if (card->thread_start_mask & thread) in qeth_set_thread_start_bit()
1150 card->thread_start_mask |= thread; in qeth_set_thread_start_bit()
1151 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_set_thread_start_bit()
1156 static void qeth_clear_thread_start_bit(struct qeth_card *card, in qeth_clear_thread_start_bit() argument
1161 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_clear_thread_start_bit()
1162 card->thread_start_mask &= ~thread; in qeth_clear_thread_start_bit()
1163 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_clear_thread_start_bit()
1164 wake_up(&card->wait_q); in qeth_clear_thread_start_bit()
1167 static void qeth_clear_thread_running_bit(struct qeth_card *card, in qeth_clear_thread_running_bit() argument
1172 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_clear_thread_running_bit()
1173 card->thread_running_mask &= ~thread; in qeth_clear_thread_running_bit()
1174 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_clear_thread_running_bit()
1175 wake_up_all(&card->wait_q); in qeth_clear_thread_running_bit()
1178 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread) in __qeth_do_run_thread() argument
1183 spin_lock_irqsave(&card->thread_mask_lock, flags); in __qeth_do_run_thread()
1184 if (card->thread_start_mask & thread) { in __qeth_do_run_thread()
1185 if ((card->thread_allowed_mask & thread) && in __qeth_do_run_thread()
1186 !(card->thread_running_mask & thread)) { in __qeth_do_run_thread()
1188 card->thread_start_mask &= ~thread; in __qeth_do_run_thread()
1189 card->thread_running_mask |= thread; in __qeth_do_run_thread()
1193 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in __qeth_do_run_thread()
1197 static int qeth_do_run_thread(struct qeth_card *card, unsigned long thread) in qeth_do_run_thread() argument
1201 wait_event(card->wait_q, in qeth_do_run_thread()
1202 (rc = __qeth_do_run_thread(card, thread)) >= 0); in qeth_do_run_thread()
1206 int qeth_schedule_recovery(struct qeth_card *card) in qeth_schedule_recovery() argument
1210 QETH_CARD_TEXT(card, 2, "startrec"); in qeth_schedule_recovery()
1212 rc = qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_schedule_recovery()
1214 schedule_work(&card->kernel_thread_starter); in qeth_schedule_recovery()
1219 static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev, in qeth_get_problem() argument
1232 QETH_CARD_TEXT(card, 2, "CGENCHK"); in qeth_get_problem()
1245 QETH_CARD_TEXT(card, 2, "REVIND"); in qeth_get_problem()
1250 QETH_CARD_TEXT(card, 2, "CMDREJi"); in qeth_get_problem()
1254 QETH_CARD_TEXT(card, 2, "AFFE"); in qeth_get_problem()
1258 QETH_CARD_TEXT(card, 2, "ZEROSEN"); in qeth_get_problem()
1261 QETH_CARD_TEXT(card, 2, "DGENCHK"); in qeth_get_problem()
1267 static int qeth_check_irb_error(struct qeth_card *card, struct ccw_device *cdev, in qeth_check_irb_error() argument
1277 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1278 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); in qeth_check_irb_error()
1283 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1284 QETH_CARD_TEXT_(card, 2, " rc%d", -ETIMEDOUT); in qeth_check_irb_error()
1289 QETH_CARD_TEXT(card, 2, "ckirberr"); in qeth_check_irb_error()
1290 QETH_CARD_TEXT(card, 2, " rc???"); in qeth_check_irb_error()
1303 struct qeth_card *card; in qeth_irq() local
1307 card = dev_get_drvdata(&gdev->dev); in qeth_irq()
1309 QETH_CARD_TEXT(card, 5, "irq"); in qeth_irq()
1311 if (card->read.ccwdev == cdev) { in qeth_irq()
1312 channel = &card->read; in qeth_irq()
1313 QETH_CARD_TEXT(card, 5, "read"); in qeth_irq()
1314 } else if (card->write.ccwdev == cdev) { in qeth_irq()
1315 channel = &card->write; in qeth_irq()
1316 QETH_CARD_TEXT(card, 5, "write"); in qeth_irq()
1318 channel = &card->data; in qeth_irq()
1319 QETH_CARD_TEXT(card, 5, "data"); in qeth_irq()
1323 QETH_CARD_TEXT(card, 5, "irqunsol"); in qeth_irq()
1325 QETH_CARD_TEXT(card, 5, "irqunexp"); in qeth_irq()
1337 qeth_unlock_channel(card, channel); in qeth_irq()
1339 rc = qeth_check_irb_error(card, cdev, irb); in qeth_irq()
1349 wake_up(&card->wait_q); in qeth_irq()
1354 wake_up(&card->wait_q); in qeth_irq()
1382 rc = qeth_get_problem(card, cdev, irb); in qeth_irq()
1384 card->read_or_write_problem = 1; in qeth_irq()
1387 qeth_clear_ipacmd_list(card); in qeth_irq()
1388 qeth_schedule_recovery(card); in qeth_irq()
1400 iob->callback(card, iob, in qeth_irq()
1412 QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification); in qeth_notify_skbs()
1413 QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb); in qeth_notify_skbs()
1505 static void qeth_drain_output_queues(struct qeth_card *card) in qeth_drain_output_queues() argument
1509 QETH_CARD_TEXT(card, 2, "clearqdbf"); in qeth_drain_output_queues()
1511 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_drain_output_queues()
1512 if (card->qdio.out_qs[i]) in qeth_drain_output_queues()
1513 qeth_drain_output_queue(card->qdio.out_qs[i], false); in qeth_drain_output_queues()
1517 static void qeth_osa_set_output_queues(struct qeth_card *card, bool single) in qeth_osa_set_output_queues() argument
1519 unsigned int max = single ? 1 : card->dev->num_tx_queues; in qeth_osa_set_output_queues()
1521 if (card->qdio.no_out_queues == max) in qeth_osa_set_output_queues()
1524 if (atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED) in qeth_osa_set_output_queues()
1525 qeth_free_qdio_queues(card); in qeth_osa_set_output_queues()
1527 if (max == 1 && card->qdio.do_prio_queueing != QETH_PRIOQ_DEFAULT) in qeth_osa_set_output_queues()
1528 dev_info(&card->gdev->dev, "Priority Queueing not supported\n"); in qeth_osa_set_output_queues()
1530 card->qdio.no_out_queues = max; in qeth_osa_set_output_queues()
1533 static int qeth_update_from_chp_desc(struct qeth_card *card) in qeth_update_from_chp_desc() argument
1538 QETH_CARD_TEXT(card, 2, "chp_desc"); in qeth_update_from_chp_desc()
1540 ccwdev = card->data.ccwdev; in qeth_update_from_chp_desc()
1545 card->info.func_level = 0x4100 + chp_dsc->desc; in qeth_update_from_chp_desc()
1547 if (IS_OSD(card) || IS_OSX(card)) in qeth_update_from_chp_desc()
1549 qeth_osa_set_output_queues(card, chp_dsc->chpp & 0x02); in qeth_update_from_chp_desc()
1552 QETH_CARD_TEXT_(card, 2, "nr:%x", card->qdio.no_out_queues); in qeth_update_from_chp_desc()
1553 QETH_CARD_TEXT_(card, 2, "lvl:%02x", card->info.func_level); in qeth_update_from_chp_desc()
1557 static void qeth_init_qdio_info(struct qeth_card *card) in qeth_init_qdio_info() argument
1559 QETH_CARD_TEXT(card, 4, "intqdinf"); in qeth_init_qdio_info()
1560 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); in qeth_init_qdio_info()
1561 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; in qeth_init_qdio_info()
1562 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; in qeth_init_qdio_info()
1565 card->qdio.no_in_queues = 1; in qeth_init_qdio_info()
1566 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; in qeth_init_qdio_info()
1567 if (IS_IQD(card)) in qeth_init_qdio_info()
1568 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT; in qeth_init_qdio_info()
1570 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; in qeth_init_qdio_info()
1571 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count; in qeth_init_qdio_info()
1572 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list); in qeth_init_qdio_info()
1573 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list); in qeth_init_qdio_info()
1576 static void qeth_set_initial_options(struct qeth_card *card) in qeth_set_initial_options() argument
1578 card->options.route4.type = NO_ROUTER; in qeth_set_initial_options()
1579 card->options.route6.type = NO_ROUTER; in qeth_set_initial_options()
1580 card->options.isolation = ISOLATION_MODE_NONE; in qeth_set_initial_options()
1581 card->options.cq = QETH_CQ_DISABLED; in qeth_set_initial_options()
1582 card->options.layer = QETH_DISCIPLINE_UNDETERMINED; in qeth_set_initial_options()
1585 static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread) in qeth_do_start_thread() argument
1590 spin_lock_irqsave(&card->thread_mask_lock, flags); in qeth_do_start_thread()
1591 QETH_CARD_TEXT_(card, 4, " %02x%02x%02x", in qeth_do_start_thread()
1592 (u8) card->thread_start_mask, in qeth_do_start_thread()
1593 (u8) card->thread_allowed_mask, in qeth_do_start_thread()
1594 (u8) card->thread_running_mask); in qeth_do_start_thread()
1595 rc = (card->thread_start_mask & thread); in qeth_do_start_thread()
1596 spin_unlock_irqrestore(&card->thread_mask_lock, flags); in qeth_do_start_thread()
1604 struct qeth_card *card = container_of(work, struct qeth_card, in qeth_start_kernel_thread() local
1606 QETH_CARD_TEXT(card, 2, "strthrd"); in qeth_start_kernel_thread()
1608 if (card->read.state != CH_STATE_UP && in qeth_start_kernel_thread()
1609 card->write.state != CH_STATE_UP) in qeth_start_kernel_thread()
1611 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) { in qeth_start_kernel_thread()
1612 ts = kthread_run(qeth_do_reset, card, "qeth_recover"); in qeth_start_kernel_thread()
1614 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_start_kernel_thread()
1615 qeth_clear_thread_running_bit(card, in qeth_start_kernel_thread()
1622 static void qeth_setup_card(struct qeth_card *card) in qeth_setup_card() argument
1624 QETH_CARD_TEXT(card, 2, "setupcrd"); in qeth_setup_card()
1626 card->info.type = CARD_RDEV(card)->id.driver_info; in qeth_setup_card()
1627 card->state = CARD_STATE_DOWN; in qeth_setup_card()
1628 spin_lock_init(&card->lock); in qeth_setup_card()
1629 spin_lock_init(&card->thread_mask_lock); in qeth_setup_card()
1630 mutex_init(&card->conf_mutex); in qeth_setup_card()
1631 mutex_init(&card->discipline_mutex); in qeth_setup_card()
1632 INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread); in qeth_setup_card()
1633 INIT_LIST_HEAD(&card->cmd_waiter_list); in qeth_setup_card()
1634 init_waitqueue_head(&card->wait_q); in qeth_setup_card()
1635 qeth_set_initial_options(card); in qeth_setup_card()
1637 INIT_LIST_HEAD(&card->ipato.entries); in qeth_setup_card()
1638 qeth_init_qdio_info(card); in qeth_setup_card()
1639 INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work); in qeth_setup_card()
1640 INIT_WORK(&card->close_dev_work, qeth_close_dev_handler); in qeth_setup_card()
1641 hash_init(card->rx_mode_addrs); in qeth_setup_card()
1642 hash_init(card->local_addrs4); in qeth_setup_card()
1643 hash_init(card->local_addrs6); in qeth_setup_card()
1644 spin_lock_init(&card->local_addrs4_lock); in qeth_setup_card()
1645 spin_lock_init(&card->local_addrs6_lock); in qeth_setup_card()
1650 struct qeth_card *card = container_of(slr, struct qeth_card, in qeth_core_sl_print() local
1652 if (card->info.mcl_level[0]) in qeth_core_sl_print()
1654 CARD_BUS_ID(card), card->info.mcl_level); in qeth_core_sl_print()
1659 struct qeth_card *card; in qeth_alloc_card() local
1662 card = kzalloc(sizeof(*card), GFP_KERNEL); in qeth_alloc_card()
1663 if (!card) in qeth_alloc_card()
1665 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in qeth_alloc_card()
1667 card->gdev = gdev; in qeth_alloc_card()
1668 dev_set_drvdata(&gdev->dev, card); in qeth_alloc_card()
1669 CARD_RDEV(card) = gdev->cdev[0]; in qeth_alloc_card()
1670 CARD_WDEV(card) = gdev->cdev[1]; in qeth_alloc_card()
1671 CARD_DDEV(card) = gdev->cdev[2]; in qeth_alloc_card()
1673 card->event_wq = alloc_ordered_workqueue("%s_event", 0, in qeth_alloc_card()
1675 if (!card->event_wq) in qeth_alloc_card()
1678 card->read_cmd = qeth_alloc_cmd(&card->read, QETH_BUFSIZE, 1, 0); in qeth_alloc_card()
1679 if (!card->read_cmd) in qeth_alloc_card()
1682 card->debugfs = debugfs_create_dir(dev_name(&gdev->dev), in qeth_alloc_card()
1684 debugfs_create_file("local_addrs", 0400, card->debugfs, card, in qeth_alloc_card()
1687 card->qeth_service_level.seq_print = qeth_core_sl_print; in qeth_alloc_card()
1688 register_service_level(&card->qeth_service_level); in qeth_alloc_card()
1689 return card; in qeth_alloc_card()
1692 destroy_workqueue(card->event_wq); in qeth_alloc_card()
1695 kfree(card); in qeth_alloc_card()
1700 static int qeth_clear_channel(struct qeth_card *card, in qeth_clear_channel() argument
1705 QETH_CARD_TEXT(card, 3, "clearch"); in qeth_clear_channel()
1712 rc = wait_event_interruptible_timeout(card->wait_q, in qeth_clear_channel()
1722 static int qeth_halt_channel(struct qeth_card *card, in qeth_halt_channel() argument
1727 QETH_CARD_TEXT(card, 3, "haltch"); in qeth_halt_channel()
1734 rc = wait_event_interruptible_timeout(card->wait_q, in qeth_halt_channel()
1787 static int qeth_halt_channels(struct qeth_card *card) in qeth_halt_channels() argument
1791 QETH_CARD_TEXT(card, 3, "haltchs"); in qeth_halt_channels()
1792 rc1 = qeth_halt_channel(card, &card->read); in qeth_halt_channels()
1793 rc2 = qeth_halt_channel(card, &card->write); in qeth_halt_channels()
1794 rc3 = qeth_halt_channel(card, &card->data); in qeth_halt_channels()
1802 static int qeth_clear_channels(struct qeth_card *card) in qeth_clear_channels() argument
1806 QETH_CARD_TEXT(card, 3, "clearchs"); in qeth_clear_channels()
1807 rc1 = qeth_clear_channel(card, &card->read); in qeth_clear_channels()
1808 rc2 = qeth_clear_channel(card, &card->write); in qeth_clear_channels()
1809 rc3 = qeth_clear_channel(card, &card->data); in qeth_clear_channels()
1817 static int qeth_clear_halt_card(struct qeth_card *card, int halt) in qeth_clear_halt_card() argument
1821 QETH_CARD_TEXT(card, 3, "clhacrd"); in qeth_clear_halt_card()
1824 rc = qeth_halt_channels(card); in qeth_clear_halt_card()
1827 return qeth_clear_channels(card); in qeth_clear_halt_card()
1830 static int qeth_qdio_clear_card(struct qeth_card *card, int use_halt) in qeth_qdio_clear_card() argument
1834 QETH_CARD_TEXT(card, 3, "qdioclr"); in qeth_qdio_clear_card()
1835 switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED, in qeth_qdio_clear_card()
1838 if (IS_IQD(card)) in qeth_qdio_clear_card()
1839 rc = qdio_shutdown(CARD_DDEV(card), in qeth_qdio_clear_card()
1842 rc = qdio_shutdown(CARD_DDEV(card), in qeth_qdio_clear_card()
1845 QETH_CARD_TEXT_(card, 3, "1err%d", rc); in qeth_qdio_clear_card()
1846 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_clear_card()
1853 rc = qeth_clear_halt_card(card, use_halt); in qeth_qdio_clear_card()
1855 QETH_CARD_TEXT_(card, 3, "2err%d", rc); in qeth_qdio_clear_card()
1859 static enum qeth_discipline_id qeth_vm_detect_layer(struct qeth_card *card) in qeth_vm_detect_layer() argument
1868 QETH_CARD_TEXT(card, 2, "vmlayer"); in qeth_vm_detect_layer()
1881 ccw_device_get_id(CARD_RDEV(card), &id); in qeth_vm_detect_layer()
1911 QETH_CARD_TEXT_(card, 2, "err%x", rc); in qeth_vm_detect_layer()
1916 static enum qeth_discipline_id qeth_enforce_discipline(struct qeth_card *card) in qeth_enforce_discipline() argument
1920 if (IS_OSM(card) || IS_OSN(card)) in qeth_enforce_discipline()
1922 else if (IS_VM_NIC(card)) in qeth_enforce_discipline()
1923 disc = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 : in qeth_enforce_discipline()
1924 qeth_vm_detect_layer(card); in qeth_enforce_discipline()
1928 QETH_CARD_TEXT(card, 3, "force l2"); in qeth_enforce_discipline()
1931 QETH_CARD_TEXT(card, 3, "force l3"); in qeth_enforce_discipline()
1934 QETH_CARD_TEXT(card, 3, "force no"); in qeth_enforce_discipline()
1940 static void qeth_set_blkt_defaults(struct qeth_card *card) in qeth_set_blkt_defaults() argument
1942 QETH_CARD_TEXT(card, 2, "cfgblkt"); in qeth_set_blkt_defaults()
1944 if (card->info.use_v1_blkt) { in qeth_set_blkt_defaults()
1945 card->info.blkt.time_total = 0; in qeth_set_blkt_defaults()
1946 card->info.blkt.inter_packet = 0; in qeth_set_blkt_defaults()
1947 card->info.blkt.inter_packet_jumbo = 0; in qeth_set_blkt_defaults()
1949 card->info.blkt.time_total = 250; in qeth_set_blkt_defaults()
1950 card->info.blkt.inter_packet = 5; in qeth_set_blkt_defaults()
1951 card->info.blkt.inter_packet_jumbo = 15; in qeth_set_blkt_defaults()
1955 static void qeth_idx_init(struct qeth_card *card) in qeth_idx_init() argument
1957 memset(&card->seqno, 0, sizeof(card->seqno)); in qeth_idx_init()
1959 card->token.issuer_rm_w = 0x00010103UL; in qeth_idx_init()
1960 card->token.cm_filter_w = 0x00010108UL; in qeth_idx_init()
1961 card->token.cm_connection_w = 0x0001010aUL; in qeth_idx_init()
1962 card->token.ulp_filter_w = 0x0001010bUL; in qeth_idx_init()
1963 card->token.ulp_connection_w = 0x0001010dUL; in qeth_idx_init()
1965 switch (card->info.type) { in qeth_idx_init()
1967 card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD; in qeth_idx_init()
1971 card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD; in qeth_idx_init()
1978 static void qeth_idx_finalize_cmd(struct qeth_card *card, in qeth_idx_finalize_cmd() argument
1981 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data), &card->seqno.trans_hdr, in qeth_idx_finalize_cmd()
1983 if (iob->channel == &card->write) in qeth_idx_finalize_cmd()
1984 card->seqno.trans_hdr++; in qeth_idx_finalize_cmd()
1996 static void qeth_mpc_finalize_cmd(struct qeth_card *card, in qeth_mpc_finalize_cmd() argument
1999 qeth_idx_finalize_cmd(card, iob); in qeth_mpc_finalize_cmd()
2002 &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH); in qeth_mpc_finalize_cmd()
2003 card->seqno.pdu_hdr++; in qeth_mpc_finalize_cmd()
2005 &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH); in qeth_mpc_finalize_cmd()
2017 static struct qeth_cmd_buffer *qeth_mpc_alloc_cmd(struct qeth_card *card, in qeth_mpc_alloc_cmd() argument
2023 iob = qeth_alloc_cmd(&card->write, data_length, 1, QETH_TIMEOUT); in qeth_mpc_alloc_cmd()
2036 * qeth_send_control_data() - send control command to the card
2037 * @card: qeth_card structure pointer
2057 static int qeth_send_control_data(struct qeth_card *card, in qeth_send_control_data() argument
2069 QETH_CARD_TEXT(card, 2, "sendctl"); in qeth_send_control_data()
2074 timeout = wait_event_interruptible_timeout(card->wait_q, in qeth_send_control_data()
2083 iob->finalize(card, iob); in qeth_send_control_data()
2086 qeth_enqueue_cmd(card, iob); in qeth_send_control_data()
2091 QETH_CARD_TEXT(card, 6, "noirqpnd"); in qeth_send_control_data()
2100 CARD_DEVID(card), rc); in qeth_send_control_data()
2101 QETH_CARD_TEXT_(card, 2, " err%d", rc); in qeth_send_control_data()
2102 qeth_dequeue_cmd(card, iob); in qeth_send_control_data()
2104 qeth_unlock_channel(card, channel); in qeth_send_control_data()
2113 qeth_dequeue_cmd(card, iob); in qeth_send_control_data()
2138 static void qeth_read_conf_data_cb(struct qeth_card *card, in qeth_read_conf_data_cb() argument
2146 QETH_CARD_TEXT(card, 2, "cfgunit"); in qeth_read_conf_data_cb()
2153 card->info.is_vm_nic = nd->nd1.plant[0] == _ascebc['V'] && in qeth_read_conf_data_cb()
2156 card->info.chpid = tag[0]; in qeth_read_conf_data_cb()
2157 card->info.unit_addr2 = tag[1]; in qeth_read_conf_data_cb()
2160 card->info.cula = tag[1]; in qeth_read_conf_data_cb()
2162 card->info.use_v1_blkt = nd->nd3.model[0] == 0xF0 && in qeth_read_conf_data_cb()
2172 static int qeth_read_conf_data(struct qeth_card *card) in qeth_read_conf_data() argument
2174 struct qeth_channel *channel = &card->data; in qeth_read_conf_data()
2193 return qeth_send_control_data(card, iob, NULL, NULL); in qeth_read_conf_data()
2196 static int qeth_idx_check_activate_response(struct qeth_card *card, in qeth_idx_check_activate_response() argument
2202 rc = qeth_check_idx_response(card, iob->data); in qeth_idx_check_activate_response()
2210 QETH_CARD_TEXT_(card, 2, "idxneg%c", in qeth_idx_check_activate_response()
2230 static void qeth_idx_activate_read_channel_cb(struct qeth_card *card, in qeth_idx_activate_read_channel_cb() argument
2238 QETH_CARD_TEXT(card, 2, "idxrdcb"); in qeth_idx_activate_read_channel_cb()
2240 rc = qeth_idx_check_activate_response(card, channel, iob); in qeth_idx_activate_read_channel_cb()
2245 if (peer_level != qeth_peer_func_level(card->info.func_level)) { in qeth_idx_activate_read_channel_cb()
2248 card->info.func_level, peer_level); in qeth_idx_activate_read_channel_cb()
2253 memcpy(&card->token.issuer_rm_r, in qeth_idx_activate_read_channel_cb()
2256 memcpy(&card->info.mcl_level[0], in qeth_idx_activate_read_channel_cb()
2264 static void qeth_idx_activate_write_channel_cb(struct qeth_card *card, in qeth_idx_activate_write_channel_cb() argument
2272 QETH_CARD_TEXT(card, 2, "idxwrcb"); in qeth_idx_activate_write_channel_cb()
2274 rc = qeth_idx_check_activate_response(card, channel, iob); in qeth_idx_activate_write_channel_cb()
2280 qeth_peer_func_level(card->info.func_level)) { in qeth_idx_activate_write_channel_cb()
2283 card->info.func_level, peer_level); in qeth_idx_activate_write_channel_cb()
2292 static void qeth_idx_setup_activate_cmd(struct qeth_card *card, in qeth_idx_setup_activate_cmd() argument
2295 u16 addr = (card->info.cula << 8) + card->info.unit_addr2; in qeth_idx_setup_activate_cmd()
2296 u8 port = ((u8)card->dev->dev_port) | 0x80; in qeth_idx_setup_activate_cmd()
2307 &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH); in qeth_idx_setup_activate_cmd()
2309 &card->info.func_level, 2); in qeth_idx_setup_activate_cmd()
2310 memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &card->info.ddev_devno, 2); in qeth_idx_setup_activate_cmd()
2314 static int qeth_idx_activate_read_channel(struct qeth_card *card) in qeth_idx_activate_read_channel() argument
2316 struct qeth_channel *channel = &card->read; in qeth_idx_activate_read_channel()
2320 QETH_CARD_TEXT(card, 2, "idxread"); in qeth_idx_activate_read_channel()
2327 qeth_idx_setup_activate_cmd(card, iob); in qeth_idx_activate_read_channel()
2330 rc = qeth_send_control_data(card, iob, NULL, NULL); in qeth_idx_activate_read_channel()
2338 static int qeth_idx_activate_write_channel(struct qeth_card *card) in qeth_idx_activate_write_channel() argument
2340 struct qeth_channel *channel = &card->write; in qeth_idx_activate_write_channel()
2344 QETH_CARD_TEXT(card, 2, "idxwrite"); in qeth_idx_activate_write_channel()
2351 qeth_idx_setup_activate_cmd(card, iob); in qeth_idx_activate_write_channel()
2354 rc = qeth_send_control_data(card, iob, NULL, NULL); in qeth_idx_activate_write_channel()
2362 static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_cm_enable_cb() argument
2367 QETH_CARD_TEXT(card, 2, "cmenblcb"); in qeth_cm_enable_cb()
2370 memcpy(&card->token.cm_filter_r, in qeth_cm_enable_cb()
2376 static int qeth_cm_enable(struct qeth_card *card) in qeth_cm_enable() argument
2380 QETH_CARD_TEXT(card, 2, "cmenable"); in qeth_cm_enable()
2382 iob = qeth_mpc_alloc_cmd(card, CM_ENABLE, CM_ENABLE_SIZE); in qeth_cm_enable()
2387 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_enable()
2389 &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH); in qeth_cm_enable()
2391 return qeth_send_control_data(card, iob, qeth_cm_enable_cb, NULL); in qeth_cm_enable()
2394 static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_cm_setup_cb() argument
2399 QETH_CARD_TEXT(card, 2, "cmsetpcb"); in qeth_cm_setup_cb()
2402 memcpy(&card->token.cm_connection_r, in qeth_cm_setup_cb()
2408 static int qeth_cm_setup(struct qeth_card *card) in qeth_cm_setup() argument
2412 QETH_CARD_TEXT(card, 2, "cmsetup"); in qeth_cm_setup()
2414 iob = qeth_mpc_alloc_cmd(card, CM_SETUP, CM_SETUP_SIZE); in qeth_cm_setup()
2419 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2421 &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2423 &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH); in qeth_cm_setup()
2424 return qeth_send_control_data(card, iob, qeth_cm_setup_cb, NULL); in qeth_cm_setup()
2427 static bool qeth_is_supported_link_type(struct qeth_card *card, u8 link_type) in qeth_is_supported_link_type() argument
2431 dev_err(&card->gdev->dev, "Unsupported Token Ring device\n"); in qeth_is_supported_link_type()
2438 static int qeth_update_max_mtu(struct qeth_card *card, unsigned int max_mtu) in qeth_update_max_mtu() argument
2440 struct net_device *dev = card->dev; in qeth_update_max_mtu()
2445 if (IS_IQD(card)) in qeth_update_max_mtu()
2452 if (IS_IQD(card)) { in qeth_update_max_mtu()
2457 card->qdio.in_buf_size = max_mtu + 2 * PAGE_SIZE; in qeth_update_max_mtu()
2459 qeth_free_qdio_queues(card); in qeth_update_max_mtu()
2464 else if (IS_LAYER2(card)) in qeth_update_max_mtu()
2492 static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_ulp_enable_cb() argument
2500 QETH_CARD_TEXT(card, 2, "ulpenacb"); in qeth_ulp_enable_cb()
2503 memcpy(&card->token.ulp_filter_r, in qeth_ulp_enable_cb()
2506 if (IS_IQD(card)) { in qeth_ulp_enable_cb()
2518 if (!qeth_is_supported_link_type(card, link_type)) in qeth_ulp_enable_cb()
2522 card->info.link_type = link_type; in qeth_ulp_enable_cb()
2523 QETH_CARD_TEXT_(card, 2, "link%d", card->info.link_type); in qeth_ulp_enable_cb()
2527 static u8 qeth_mpc_select_prot_type(struct qeth_card *card) in qeth_mpc_select_prot_type() argument
2529 if (IS_OSN(card)) in qeth_mpc_select_prot_type()
2531 return IS_LAYER2(card) ? QETH_PROT_LAYER2 : QETH_PROT_TCPIP; in qeth_mpc_select_prot_type()
2534 static int qeth_ulp_enable(struct qeth_card *card) in qeth_ulp_enable() argument
2536 u8 prot_type = qeth_mpc_select_prot_type(card); in qeth_ulp_enable()
2541 QETH_CARD_TEXT(card, 2, "ulpenabl"); in qeth_ulp_enable()
2543 iob = qeth_mpc_alloc_cmd(card, ULP_ENABLE, ULP_ENABLE_SIZE); in qeth_ulp_enable()
2547 *(QETH_ULP_ENABLE_LINKNUM(iob->data)) = (u8) card->dev->dev_port; in qeth_ulp_enable()
2550 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_enable()
2552 &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_enable()
2553 rc = qeth_send_control_data(card, iob, qeth_ulp_enable_cb, &max_mtu); in qeth_ulp_enable()
2556 return qeth_update_max_mtu(card, max_mtu); in qeth_ulp_enable()
2559 static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_ulp_setup_cb() argument
2564 QETH_CARD_TEXT(card, 2, "ulpstpcb"); in qeth_ulp_setup_cb()
2567 memcpy(&card->token.ulp_connection_r, in qeth_ulp_setup_cb()
2572 QETH_CARD_TEXT(card, 2, "olmlimit"); in qeth_ulp_setup_cb()
2573 dev_err(&card->gdev->dev, "A connection could not be " in qeth_ulp_setup_cb()
2580 static int qeth_ulp_setup(struct qeth_card *card) in qeth_ulp_setup() argument
2585 QETH_CARD_TEXT(card, 2, "ulpsetup"); in qeth_ulp_setup()
2587 iob = qeth_mpc_alloc_cmd(card, ULP_SETUP, ULP_SETUP_SIZE); in qeth_ulp_setup()
2592 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2594 &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2596 &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH); in qeth_ulp_setup()
2598 memcpy(QETH_ULP_SETUP_CUA(iob->data), &card->info.ddev_devno, 2); in qeth_ulp_setup()
2599 temp = (card->info.cula << 8) + card->info.unit_addr2; in qeth_ulp_setup()
2601 return qeth_send_control_data(card, iob, qeth_ulp_setup_cb, NULL); in qeth_ulp_setup()
2654 static int qeth_alloc_qdio_queues(struct qeth_card *card) in qeth_alloc_qdio_queues() argument
2658 QETH_CARD_TEXT(card, 2, "allcqdbf"); in qeth_alloc_qdio_queues()
2660 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED, in qeth_alloc_qdio_queues()
2664 QETH_CARD_TEXT(card, 2, "inq"); in qeth_alloc_qdio_queues()
2665 card->qdio.in_q = qeth_alloc_qdio_queue(); in qeth_alloc_qdio_queues()
2666 if (!card->qdio.in_q) in qeth_alloc_qdio_queues()
2670 if (qeth_alloc_buffer_pool(card)) in qeth_alloc_qdio_queues()
2674 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_alloc_qdio_queues()
2680 QETH_CARD_TEXT_(card, 2, "outq %i", i); in qeth_alloc_qdio_queues()
2681 QETH_CARD_HEX(card, 2, &queue, sizeof(void *)); in qeth_alloc_qdio_queues()
2682 card->qdio.out_qs[i] = queue; in qeth_alloc_qdio_queues()
2683 queue->card = card; in qeth_alloc_qdio_queues()
2700 if (qeth_alloc_cq(card)) in qeth_alloc_qdio_queues()
2709 card->qdio.out_qs[i]->bufs[j]); in qeth_alloc_qdio_queues()
2710 card->qdio.out_qs[i]->bufs[j] = NULL; in qeth_alloc_qdio_queues()
2714 qeth_free_output_queue(card->qdio.out_qs[--i]); in qeth_alloc_qdio_queues()
2715 card->qdio.out_qs[i] = NULL; in qeth_alloc_qdio_queues()
2717 qeth_free_buffer_pool(card); in qeth_alloc_qdio_queues()
2719 qeth_free_qdio_queue(card->qdio.in_q); in qeth_alloc_qdio_queues()
2720 card->qdio.in_q = NULL; in qeth_alloc_qdio_queues()
2722 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); in qeth_alloc_qdio_queues()
2726 static void qeth_free_qdio_queues(struct qeth_card *card) in qeth_free_qdio_queues() argument
2730 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == in qeth_free_qdio_queues()
2734 qeth_free_cq(card); in qeth_free_qdio_queues()
2736 if (card->qdio.in_q->bufs[j].rx_skb) in qeth_free_qdio_queues()
2737 dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb); in qeth_free_qdio_queues()
2739 qeth_free_qdio_queue(card->qdio.in_q); in qeth_free_qdio_queues()
2740 card->qdio.in_q = NULL; in qeth_free_qdio_queues()
2742 qeth_free_buffer_pool(card); in qeth_free_qdio_queues()
2744 for (i = 0; i < card->qdio.no_out_queues; i++) { in qeth_free_qdio_queues()
2745 qeth_free_output_queue(card->qdio.out_qs[i]); in qeth_free_qdio_queues()
2746 card->qdio.out_qs[i] = NULL; in qeth_free_qdio_queues()
2750 static void qeth_fill_qib_parms(struct qeth_card *card, in qeth_fill_qib_parms() argument
2761 parms->pcit_a = QETH_PCI_THRESHOLD_A(card); in qeth_fill_qib_parms()
2762 parms->pcit_b = QETH_PCI_THRESHOLD_B(card); in qeth_fill_qib_parms()
2763 parms->pcit_c = QETH_PCI_TIMER_VALUE(card); in qeth_fill_qib_parms()
2770 parms->blkt_total = card->info.blkt.time_total; in qeth_fill_qib_parms()
2771 parms->blkt_inter_packet = card->info.blkt.inter_packet; in qeth_fill_qib_parms()
2772 parms->blkt_inter_packet_jumbo = card->info.blkt.inter_packet_jumbo; in qeth_fill_qib_parms()
2775 if (qeth_uses_tx_prio_queueing(card) || card->qdio.no_out_queues == 1) in qeth_fill_qib_parms()
2786 qeth_for_each_output_queue(card, queue, i) in qeth_fill_qib_parms()
2790 static int qeth_qdio_activate(struct qeth_card *card) in qeth_qdio_activate() argument
2792 QETH_CARD_TEXT(card, 3, "qdioact"); in qeth_qdio_activate()
2793 return qdio_activate(CARD_DDEV(card)); in qeth_qdio_activate()
2796 static int qeth_dm_act(struct qeth_card *card) in qeth_dm_act() argument
2800 QETH_CARD_TEXT(card, 2, "dmact"); in qeth_dm_act()
2802 iob = qeth_mpc_alloc_cmd(card, DM_ACT, DM_ACT_SIZE); in qeth_dm_act()
2807 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_dm_act()
2809 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_dm_act()
2810 return qeth_send_control_data(card, iob, NULL, NULL); in qeth_dm_act()
2813 static int qeth_mpc_initialize(struct qeth_card *card) in qeth_mpc_initialize() argument
2817 QETH_CARD_TEXT(card, 2, "mpcinit"); in qeth_mpc_initialize()
2819 rc = qeth_issue_next_read(card); in qeth_mpc_initialize()
2821 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_mpc_initialize()
2824 rc = qeth_cm_enable(card); in qeth_mpc_initialize()
2826 QETH_CARD_TEXT_(card, 2, "2err%d", rc); in qeth_mpc_initialize()
2829 rc = qeth_cm_setup(card); in qeth_mpc_initialize()
2831 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_mpc_initialize()
2834 rc = qeth_ulp_enable(card); in qeth_mpc_initialize()
2836 QETH_CARD_TEXT_(card, 2, "4err%d", rc); in qeth_mpc_initialize()
2839 rc = qeth_ulp_setup(card); in qeth_mpc_initialize()
2841 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_mpc_initialize()
2844 rc = qeth_alloc_qdio_queues(card); in qeth_mpc_initialize()
2846 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_mpc_initialize()
2849 rc = qeth_qdio_establish(card); in qeth_mpc_initialize()
2851 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_mpc_initialize()
2852 qeth_free_qdio_queues(card); in qeth_mpc_initialize()
2855 rc = qeth_qdio_activate(card); in qeth_mpc_initialize()
2857 QETH_CARD_TEXT_(card, 2, "7err%d", rc); in qeth_mpc_initialize()
2860 rc = qeth_dm_act(card); in qeth_mpc_initialize()
2862 QETH_CARD_TEXT_(card, 2, "8err%d", rc); in qeth_mpc_initialize()
2869 static void qeth_print_status_message(struct qeth_card *card) in qeth_print_status_message() argument
2871 switch (card->info.type) { in qeth_print_status_message()
2879 if (!card->info.mcl_level[0]) { in qeth_print_status_message()
2880 sprintf(card->info.mcl_level, "%02x%02x", in qeth_print_status_message()
2881 card->info.mcl_level[2], in qeth_print_status_message()
2882 card->info.mcl_level[3]); in qeth_print_status_message()
2887 if (IS_VM_NIC(card) || (card->info.mcl_level[0] & 0x80)) { in qeth_print_status_message()
2888 card->info.mcl_level[0] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2889 card->info.mcl_level[0]]; in qeth_print_status_message()
2890 card->info.mcl_level[1] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2891 card->info.mcl_level[1]]; in qeth_print_status_message()
2892 card->info.mcl_level[2] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2893 card->info.mcl_level[2]]; in qeth_print_status_message()
2894 card->info.mcl_level[3] = (char) _ebcasc[(__u8) in qeth_print_status_message()
2895 card->info.mcl_level[3]]; in qeth_print_status_message()
2896 card->info.mcl_level[QETH_MCL_LENGTH] = 0; in qeth_print_status_message()
2900 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1); in qeth_print_status_message()
2902 dev_info(&card->gdev->dev, in qeth_print_status_message()
2903 "Device is a%s card%s%s%s\nwith link type %s.\n", in qeth_print_status_message()
2904 qeth_get_cardname(card), in qeth_print_status_message()
2905 (card->info.mcl_level[0]) ? " (level: " : "", in qeth_print_status_message()
2906 (card->info.mcl_level[0]) ? card->info.mcl_level : "", in qeth_print_status_message()
2907 (card->info.mcl_level[0]) ? ")" : "", in qeth_print_status_message()
2908 qeth_get_cardname_short(card)); in qeth_print_status_message()
2911 static void qeth_initialize_working_pool_list(struct qeth_card *card) in qeth_initialize_working_pool_list() argument
2915 QETH_CARD_TEXT(card, 5, "inwrklst"); in qeth_initialize_working_pool_list()
2918 &card->qdio.init_pool.entry_list, init_list) { in qeth_initialize_working_pool_list()
2919 qeth_put_buffer_pool_entry(card, entry); in qeth_initialize_working_pool_list()
2924 struct qeth_card *card) in qeth_find_free_buffer_pool_entry() argument
2929 if (list_empty(&card->qdio.in_buf_pool.entry_list)) in qeth_find_free_buffer_pool_entry()
2932 list_for_each_entry(entry, &card->qdio.in_buf_pool.entry_list, list) { in qeth_find_free_buffer_pool_entry()
2934 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_find_free_buffer_pool_entry()
2947 entry = list_first_entry(&card->qdio.in_buf_pool.entry_list, in qeth_find_free_buffer_pool_entry()
2949 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_find_free_buffer_pool_entry()
2958 QETH_CARD_STAT_INC(card, rx_sg_alloc_page); in qeth_find_free_buffer_pool_entry()
2965 static int qeth_init_input_buffer(struct qeth_card *card, in qeth_init_input_buffer() argument
2971 if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) { in qeth_init_input_buffer()
2972 buf->rx_skb = netdev_alloc_skb(card->dev, in qeth_init_input_buffer()
2980 pool_entry = qeth_find_free_buffer_pool_entry(card); in qeth_init_input_buffer()
2993 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { in qeth_init_input_buffer()
2997 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) in qeth_init_input_buffer()
3006 static unsigned int qeth_tx_select_bulk_max(struct qeth_card *card, in qeth_tx_select_bulk_max() argument
3009 if (!IS_IQD(card) || in qeth_tx_select_bulk_max()
3010 qeth_iqd_is_mcast_queue(card, queue) || in qeth_tx_select_bulk_max()
3011 card->options.cq == QETH_CQ_ENABLED || in qeth_tx_select_bulk_max()
3012 qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd)) in qeth_tx_select_bulk_max()
3015 return card->ssqd.mmwc ? card->ssqd.mmwc : 1; in qeth_tx_select_bulk_max()
3018 static int qeth_init_qdio_queues(struct qeth_card *card) in qeth_init_qdio_queues() argument
3020 unsigned int rx_bufs = card->qdio.in_buf_pool.buf_count; in qeth_init_qdio_queues()
3024 QETH_CARD_TEXT(card, 2, "initqdqs"); in qeth_init_qdio_queues()
3027 qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); in qeth_init_qdio_queues()
3028 memset(&card->rx, 0, sizeof(struct qeth_rx)); in qeth_init_qdio_queues()
3030 qeth_initialize_working_pool_list(card); in qeth_init_qdio_queues()
3033 rc = qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); in qeth_init_qdio_queues()
3038 card->qdio.in_q->next_buf_to_init = QDIO_BUFNR(rx_bufs); in qeth_init_qdio_queues()
3039 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0, rx_bufs); in qeth_init_qdio_queues()
3041 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_init_qdio_queues()
3046 rc = qeth_cq_init(card); in qeth_init_qdio_queues()
3052 for (i = 0; i < card->qdio.no_out_queues; ++i) { in qeth_init_qdio_queues()
3053 struct qeth_qdio_out_q *queue = card->qdio.out_qs[i]; in qeth_init_qdio_queues()
3056 queue->max_elements = QETH_MAX_BUFFER_ELEMENTS(card); in qeth_init_qdio_queues()
3063 queue->bulk_max = qeth_tx_select_bulk_max(card, queue); in qeth_init_qdio_queues()
3066 netdev_tx_reset_queue(netdev_get_tx_queue(card->dev, i)); in qeth_init_qdio_queues()
3071 static void qeth_ipa_finalize_cmd(struct qeth_card *card, in qeth_ipa_finalize_cmd() argument
3074 qeth_mpc_finalize_cmd(card, iob); in qeth_ipa_finalize_cmd()
3077 __ipa_cmd(iob)->hdr.seqno = card->seqno.ipa++; in qeth_ipa_finalize_cmd()
3080 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, in qeth_prepare_ipa_cmd() argument
3085 u8 prot_type = qeth_mpc_select_prot_type(card); in qeth_prepare_ipa_cmd()
3099 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_prepare_ipa_cmd()
3112 struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card, in qeth_ipa_alloc_cmd() argument
3121 iob = qeth_alloc_cmd(&card->write, IPA_PDU_HEADER_SIZE + data_length, 1, in qeth_ipa_alloc_cmd()
3126 qeth_prepare_ipa_cmd(card, iob, data_length, qeth_ipa_match_reply); in qeth_ipa_alloc_cmd()
3133 hdr->rel_adapter_no = (u8) card->dev->dev_port; in qeth_ipa_alloc_cmd()
3134 hdr->prim_version_no = IS_LAYER2(card) ? 2 : 1; in qeth_ipa_alloc_cmd()
3141 static int qeth_send_ipa_cmd_cb(struct qeth_card *card, in qeth_send_ipa_cmd_cb() argument
3155 int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, in qeth_send_ipa_cmd() argument
3162 QETH_CARD_TEXT(card, 4, "sendipa"); in qeth_send_ipa_cmd()
3164 if (card->read_or_write_problem) { in qeth_send_ipa_cmd()
3171 rc = qeth_send_control_data(card, iob, reply_cb, reply_param); in qeth_send_ipa_cmd()
3173 qeth_clear_ipacmd_list(card); in qeth_send_ipa_cmd()
3174 qeth_schedule_recovery(card); in qeth_send_ipa_cmd()
3180 static int qeth_send_startlan_cb(struct qeth_card *card, in qeth_send_startlan_cb() argument
3191 static int qeth_send_startlan(struct qeth_card *card) in qeth_send_startlan() argument
3195 QETH_CARD_TEXT(card, 2, "strtlan"); in qeth_send_startlan()
3197 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_STARTLAN, QETH_PROT_NONE, 0); in qeth_send_startlan()
3200 return qeth_send_ipa_cmd(card, iob, qeth_send_startlan_cb, NULL); in qeth_send_startlan()
3211 static int qeth_query_setadapterparms_cb(struct qeth_card *card, in qeth_query_setadapterparms_cb() argument
3217 QETH_CARD_TEXT(card, 3, "quyadpcb"); in qeth_query_setadapterparms_cb()
3223 if (!qeth_is_supported_link_type(card, query_cmd->lan_type)) in qeth_query_setadapterparms_cb()
3226 card->info.link_type = query_cmd->lan_type; in qeth_query_setadapterparms_cb()
3227 QETH_CARD_TEXT_(card, 2, "lnk %d", card->info.link_type); in qeth_query_setadapterparms_cb()
3230 card->options.adp.supported = query_cmd->supported_cmds; in qeth_query_setadapterparms_cb()
3234 static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card, in qeth_get_adapter_cmd() argument
3241 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETADAPTERPARMS, QETH_PROT_IPV4, in qeth_get_adapter_cmd()
3256 static int qeth_query_setadapterparms(struct qeth_card *card) in qeth_query_setadapterparms() argument
3261 QETH_CARD_TEXT(card, 3, "queryadp"); in qeth_query_setadapterparms()
3262 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED, in qeth_query_setadapterparms()
3266 rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL); in qeth_query_setadapterparms()
3270 static int qeth_query_ipassists_cb(struct qeth_card *card, in qeth_query_ipassists_cb() argument
3275 QETH_CARD_TEXT(card, 2, "qipasscb"); in qeth_query_ipassists_cb()
3284 QETH_CARD_TEXT(card, 2, "ipaunsup"); in qeth_query_ipassists_cb()
3285 card->options.ipa4.supported |= IPA_SETADAPTERPARMS; in qeth_query_ipassists_cb()
3286 card->options.ipa6.supported |= IPA_SETADAPTERPARMS; in qeth_query_ipassists_cb()
3290 CARD_DEVID(card), cmd->hdr.return_code); in qeth_query_ipassists_cb()
3295 card->options.ipa4 = cmd->hdr.assists; in qeth_query_ipassists_cb()
3297 card->options.ipa6 = cmd->hdr.assists; in qeth_query_ipassists_cb()
3300 CARD_DEVID(card)); in qeth_query_ipassists_cb()
3304 static int qeth_query_ipassists(struct qeth_card *card, in qeth_query_ipassists() argument
3310 QETH_CARD_TEXT_(card, 2, "qipassi%i", prot); in qeth_query_ipassists()
3311 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_QIPASSIST, prot, 0); in qeth_query_ipassists()
3314 rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL); in qeth_query_ipassists()
3318 static int qeth_query_switch_attributes_cb(struct qeth_card *card, in qeth_query_switch_attributes_cb() argument
3325 QETH_CARD_TEXT(card, 2, "qswiatcb"); in qeth_query_switch_attributes_cb()
3333 QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities, in qeth_query_switch_attributes_cb()
3338 int qeth_query_switch_attributes(struct qeth_card *card, in qeth_query_switch_attributes() argument
3343 QETH_CARD_TEXT(card, 2, "qswiattr"); in qeth_query_switch_attributes()
3344 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES)) in qeth_query_switch_attributes()
3346 if (!netif_carrier_ok(card->dev)) in qeth_query_switch_attributes()
3348 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES, 0); in qeth_query_switch_attributes()
3351 return qeth_send_ipa_cmd(card, iob, in qeth_query_switch_attributes()
3355 struct qeth_cmd_buffer *qeth_get_diag_cmd(struct qeth_card *card, in qeth_get_diag_cmd() argument
3362 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SET_DIAG_ASS, QETH_PROT_NONE, in qeth_get_diag_cmd()
3374 static int qeth_query_setdiagass_cb(struct qeth_card *card, in qeth_query_setdiagass_cb() argument
3381 QETH_CARD_TEXT_(card, 2, "diagq:%x", rc); in qeth_query_setdiagass_cb()
3385 card->info.diagass_support = cmd->data.diagass.ext; in qeth_query_setdiagass_cb()
3389 static int qeth_query_setdiagass(struct qeth_card *card) in qeth_query_setdiagass() argument
3393 QETH_CARD_TEXT(card, 2, "qdiagass"); in qeth_query_setdiagass()
3394 iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_QUERY, 0); in qeth_query_setdiagass()
3397 return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL); in qeth_query_setdiagass()
3400 static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid) in qeth_get_trap_id() argument
3408 tid->chpid = card->info.chpid; in qeth_get_trap_id()
3409 ccw_device_get_id(CARD_RDEV(card), &ccwid); in qeth_get_trap_id()
3424 static int qeth_hw_trap_cb(struct qeth_card *card, in qeth_hw_trap_cb() argument
3431 QETH_CARD_TEXT_(card, 2, "trapc:%x", rc); in qeth_hw_trap_cb()
3437 int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action) in qeth_hw_trap() argument
3442 QETH_CARD_TEXT(card, 2, "diagtrap"); in qeth_hw_trap()
3443 iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_TRAP, 64); in qeth_hw_trap()
3454 qeth_get_trap_id(card, in qeth_hw_trap()
3463 return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL); in qeth_hw_trap()
3466 static int qeth_check_qdio_errors(struct qeth_card *card, in qeth_check_qdio_errors() argument
3472 QETH_CARD_TEXT(card, 2, dbftext); in qeth_check_qdio_errors()
3473 QETH_CARD_TEXT_(card, 2, " F15=%02X", in qeth_check_qdio_errors()
3475 QETH_CARD_TEXT_(card, 2, " F14=%02X", in qeth_check_qdio_errors()
3477 QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error); in qeth_check_qdio_errors()
3479 QETH_CARD_STAT_INC(card, rx_fifo_errors); in qeth_check_qdio_errors()
3487 static unsigned int qeth_rx_refill_queue(struct qeth_card *card, in qeth_rx_refill_queue() argument
3490 struct qeth_qdio_q *queue = card->qdio.in_q; in qeth_rx_refill_queue()
3497 if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) { in qeth_rx_refill_queue()
3500 if (qeth_init_input_buffer(card, in qeth_rx_refill_queue()
3511 atomic_set(&card->force_alloc_skb, 3); in qeth_rx_refill_queue()
3514 atomic_add_unless(&card->force_alloc_skb, -1, 0); in qeth_rx_refill_queue()
3519 list_for_each(lh, &card->qdio.in_buf_pool.entry_list) in qeth_rx_refill_queue()
3521 if (i == card->qdio.in_buf_pool.buf_count) { in qeth_rx_refill_queue()
3522 QETH_CARD_TEXT(card, 2, "qsarbw"); in qeth_rx_refill_queue()
3524 &card->buffer_reclaim_work, in qeth_rx_refill_queue()
3530 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, in qeth_rx_refill_queue()
3533 QETH_CARD_TEXT(card, 2, "qinberr"); in qeth_rx_refill_queue()
3545 struct qeth_card *card = container_of(to_delayed_work(work), in qeth_buffer_reclaim_work() local
3550 napi_schedule(&card->napi); in qeth_buffer_reclaim_work()
3555 static void qeth_handle_send_error(struct qeth_card *card, in qeth_handle_send_error() argument
3560 QETH_CARD_TEXT(card, 6, "hdsnderr"); in qeth_handle_send_error()
3561 qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr"); in qeth_handle_send_error()
3569 QETH_CARD_TEXT(card, 1, "lnkfail"); in qeth_handle_send_error()
3570 QETH_CARD_TEXT_(card, 1, "%04x %02x", in qeth_handle_send_error()
3606 QETH_CARD_TEXT(queue->card, 6, "np->pack"); in qeth_switch_to_packing_if_needed()
3625 QETH_CARD_TEXT(queue->card, 6, "pack->np"); in qeth_switch_to_nonpacking_if_needed()
3639 struct qeth_card *card = queue->card; in qeth_flush_buffers() local
3655 if (IS_IQD(card)) { in qeth_flush_buffers()
3661 if (!IS_IQD(card)) { in qeth_flush_buffers()
3692 rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags, in qeth_flush_buffers()
3696 if (IS_IQD(card)) { in qeth_flush_buffers()
3713 QETH_CARD_TEXT(queue->card, 2, "flushbuf"); in qeth_flush_buffers()
3714 QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no); in qeth_flush_buffers()
3715 QETH_CARD_TEXT_(queue->card, 2, " idx%d", index); in qeth_flush_buffers()
3716 QETH_CARD_TEXT_(queue->card, 2, " c%d", count); in qeth_flush_buffers()
3717 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc); in qeth_flush_buffers()
3721 qeth_schedule_recovery(queue->card); in qeth_flush_buffers()
3767 struct qeth_card *card = (struct qeth_card *)card_ptr; in qeth_qdio_poll() local
3769 napi_schedule_irqoff(&card->napi); in qeth_qdio_poll()
3772 int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq) in qeth_configure_cq() argument
3776 if (card->options.cq == QETH_CQ_NOTAVAILABLE) { in qeth_configure_cq()
3780 if (card->options.cq == cq) { in qeth_configure_cq()
3785 qeth_free_qdio_queues(card); in qeth_configure_cq()
3786 card->options.cq = cq; in qeth_configure_cq()
3795 static void qeth_qdio_cq_handler(struct qeth_card *card, unsigned int qdio_err, in qeth_qdio_cq_handler() argument
3799 struct qeth_qdio_q *cq = card->qdio.c_q; in qeth_qdio_cq_handler()
3803 QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element); in qeth_qdio_cq_handler()
3804 QETH_CARD_TEXT_(card, 5, "qcqhc%d", count); in qeth_qdio_cq_handler()
3805 QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err); in qeth_qdio_cq_handler()
3808 netif_tx_stop_all_queues(card->dev); in qeth_qdio_cq_handler()
3809 qeth_schedule_recovery(card); in qeth_qdio_cq_handler()
3821 qeth_qdio_handle_aob(card, phys_aob_addr); in qeth_qdio_cq_handler()
3826 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue, in qeth_qdio_cq_handler()
3827 card->qdio.c_q->next_buf_to_init, in qeth_qdio_cq_handler()
3830 dev_warn(&card->gdev->dev, in qeth_qdio_cq_handler()
3832 QETH_CARD_TEXT(card, 2, "qcqherr"); in qeth_qdio_cq_handler()
3843 struct qeth_card *card = (struct qeth_card *)card_ptr; in qeth_qdio_input_handler() local
3845 QETH_CARD_TEXT_(card, 2, "qihq%d", queue); in qeth_qdio_input_handler()
3846 QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err); in qeth_qdio_input_handler()
3849 qeth_schedule_recovery(card); in qeth_qdio_input_handler()
3857 struct qeth_card *card = (struct qeth_card *) card_ptr; in qeth_qdio_output_handler() local
3858 struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; in qeth_qdio_output_handler()
3859 struct net_device *dev = card->dev; in qeth_qdio_output_handler()
3863 QETH_CARD_TEXT(card, 6, "qdouhdl"); in qeth_qdio_output_handler()
3865 QETH_CARD_TEXT(card, 2, "achkcond"); in qeth_qdio_output_handler()
3867 qeth_schedule_recovery(card); in qeth_qdio_output_handler()
3874 qeth_handle_send_error(card, buf, qdio_error); in qeth_qdio_output_handler()
3893 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb) in qeth_get_priority_queue() argument
3898 switch (card->qdio.do_prio_queueing) { in qeth_get_priority_queue()
3909 return card->qdio.default_out_queue; in qeth_get_priority_queue()
3911 if (card->qdio.do_prio_queueing == QETH_PRIO_Q_ING_PREC) in qeth_get_priority_queue()
3932 return card->qdio.default_out_queue; in qeth_get_priority_queue()
3936 return card->qdio.default_out_queue; in qeth_get_priority_queue()
4190 static int __qeth_xmit(struct qeth_card *card, struct qeth_qdio_out_q *queue, in __qeth_xmit() argument
4203 txq = netdev_get_tx_queue(card->dev, skb_get_queue_mapping(skb)); in __qeth_xmit()
4268 int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, in qeth_do_send_packet() argument
4290 txq = netdev_get_tx_queue(card->dev, skb_get_queue_mapping(skb)); in qeth_do_send_packet()
4369 int qeth_xmit(struct qeth_card *card, struct sk_buff *skb, in qeth_xmit() argument
4389 proto_len = (IS_IQD(card) && IS_LAYER2(card)) ? ETH_HLEN : 0; in qeth_xmit()
4411 if (IS_IQD(card)) { in qeth_xmit()
4412 rc = __qeth_xmit(card, queue, skb, elements, hdr, data_offset, in qeth_xmit()
4418 rc = qeth_do_send_packet(card, queue, skb, hdr, data_offset, in qeth_xmit()
4430 static int qeth_setadp_promisc_mode_cb(struct qeth_card *card, in qeth_setadp_promisc_mode_cb() argument
4436 QETH_CARD_TEXT(card, 4, "prmadpcb"); in qeth_setadp_promisc_mode_cb()
4440 QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code); in qeth_setadp_promisc_mode_cb()
4443 card->info.promisc_mode = setparms->data.mode; in qeth_setadp_promisc_mode_cb()
4447 void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable) in qeth_setadp_promisc_mode() argument
4454 QETH_CARD_TEXT(card, 4, "setprom"); in qeth_setadp_promisc_mode()
4455 QETH_CARD_TEXT_(card, 4, "mode:%x", mode); in qeth_setadp_promisc_mode()
4457 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, in qeth_setadp_promisc_mode()
4463 qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL); in qeth_setadp_promisc_mode()
4467 static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card, in qeth_setadpparms_change_macaddr_cb() argument
4473 QETH_CARD_TEXT(card, 4, "chgmaccb"); in qeth_setadpparms_change_macaddr_cb()
4481 if (IS_LAYER2(card) && IS_OSD(card) && !IS_VM_NIC(card) && in qeth_setadpparms_change_macaddr_cb()
4485 ether_addr_copy(card->dev->dev_addr, adp_cmd->data.change_addr.addr); in qeth_setadpparms_change_macaddr_cb()
4489 int qeth_setadpparms_change_macaddr(struct qeth_card *card) in qeth_setadpparms_change_macaddr() argument
4495 QETH_CARD_TEXT(card, 4, "chgmac"); in qeth_setadpparms_change_macaddr()
4497 iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS, in qeth_setadpparms_change_macaddr()
4505 card->dev->dev_addr); in qeth_setadpparms_change_macaddr()
4506 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb, in qeth_setadpparms_change_macaddr()
4512 static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card, in qeth_setadpparms_set_access_ctrl_cb() argument
4518 QETH_CARD_TEXT(card, 4, "setaccb"); in qeth_setadpparms_set_access_ctrl_cb()
4521 QETH_CARD_TEXT_(card, 2, "rc=%d", in qeth_setadpparms_set_access_ctrl_cb()
4526 access_ctrl_req->subcmd_code, CARD_DEVID(card), in qeth_setadpparms_set_access_ctrl_cb()
4531 dev_info(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4534 dev_info(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4539 CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl_cb()
4543 CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl_cb()
4546 dev_err(&card->gdev->dev, "Adapter does not " in qeth_setadpparms_set_access_ctrl_cb()
4550 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4555 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl_cb()
4559 dev_err(&card->gdev->dev, "The adjacent switch port does not " in qeth_setadpparms_set_access_ctrl_cb()
4563 dev_err(&card->gdev->dev, "The reflective relay mode cannot be " in qeth_setadpparms_set_access_ctrl_cb()
4567 dev_warn(&card->gdev->dev, "Turning off reflective relay mode " in qeth_setadpparms_set_access_ctrl_cb()
4576 int qeth_setadpparms_set_access_ctrl(struct qeth_card *card, in qeth_setadpparms_set_access_ctrl() argument
4584 QETH_CARD_TEXT(card, 4, "setacctl"); in qeth_setadpparms_set_access_ctrl()
4586 if (!qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) { in qeth_setadpparms_set_access_ctrl()
4587 dev_err(&card->gdev->dev, in qeth_setadpparms_set_access_ctrl()
4592 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL, in qeth_setadpparms_set_access_ctrl()
4600 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb, in qeth_setadpparms_set_access_ctrl()
4603 QETH_CARD_TEXT_(card, 2, "rc=%d", rc); in qeth_setadpparms_set_access_ctrl()
4605 rc, CARD_DEVID(card)); in qeth_setadpparms_set_access_ctrl()
4613 struct qeth_card *card; in qeth_tx_timeout() local
4615 card = dev->ml_priv; in qeth_tx_timeout()
4616 QETH_CARD_TEXT(card, 4, "txtimeo"); in qeth_tx_timeout()
4617 qeth_schedule_recovery(card); in qeth_tx_timeout()
4623 struct qeth_card *card = dev->ml_priv; in qeth_mdio_read() local
4629 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) && in qeth_mdio_read()
4630 (card->info.link_type != QETH_LINK_TYPE_OSN) && in qeth_mdio_read()
4631 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH) && in qeth_mdio_read()
4632 (card->info.link_type != QETH_LINK_TYPE_25GBIT_ETH)) in qeth_mdio_read()
4664 rc = card->stats.rx_length_errors + in qeth_mdio_read()
4665 card->stats.rx_frame_errors + in qeth_mdio_read()
4666 card->stats.rx_fifo_errors; in qeth_mdio_read()
4688 static int qeth_snmp_command_cb(struct qeth_card *card, in qeth_snmp_command_cb() argument
4697 QETH_CARD_TEXT(card, 3, "snpcmdcb"); in qeth_snmp_command_cb()
4700 QETH_CARD_TEXT_(card, 4, "scer1%x", cmd->hdr.return_code); in qeth_snmp_command_cb()
4706 QETH_CARD_TEXT_(card, 4, "scer2%x", cmd->hdr.return_code); in qeth_snmp_command_cb()
4721 QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOSPC); in qeth_snmp_command_cb()
4724 QETH_CARD_TEXT_(card, 4, "snore%i", in qeth_snmp_command_cb()
4726 QETH_CARD_TEXT_(card, 4, "sseqn%i", in qeth_snmp_command_cb()
4738 static int qeth_snmp_command(struct qeth_card *card, char __user *udata) in qeth_snmp_command() argument
4746 QETH_CARD_TEXT(card, 3, "snmpcmd"); in qeth_snmp_command()
4748 if (IS_VM_NIC(card)) in qeth_snmp_command()
4751 if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) && in qeth_snmp_command()
4752 IS_LAYER3(card)) in qeth_snmp_command()
4764 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, req_len); in qeth_snmp_command()
4781 rc = qeth_send_ipa_cmd(card, iob, qeth_snmp_command_cb, &qinfo); in qeth_snmp_command()
4784 CARD_DEVID(card), rc); in qeth_snmp_command()
4794 static int qeth_setadpparms_query_oat_cb(struct qeth_card *card, in qeth_setadpparms_query_oat_cb() argument
4802 QETH_CARD_TEXT(card, 3, "qoatcb"); in qeth_setadpparms_query_oat_cb()
4821 static int qeth_query_oat_command(struct qeth_card *card, char __user *udata) in qeth_query_oat_command() argument
4831 QETH_CARD_TEXT(card, 3, "qoatcmd"); in qeth_query_oat_command()
4833 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) in qeth_query_oat_command()
4845 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT, in qeth_query_oat_command()
4855 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb, &priv); in qeth_query_oat_command()
4871 static int qeth_query_card_info_cb(struct qeth_card *card, in qeth_query_card_info_cb() argument
4878 QETH_CARD_TEXT(card, 2, "qcrdincb"); in qeth_query_card_info_cb()
4889 int qeth_query_card_info(struct qeth_card *card, in qeth_query_card_info() argument
4894 QETH_CARD_TEXT(card, 2, "qcrdinfo"); in qeth_query_card_info()
4895 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_CARD_INFO)) in qeth_query_card_info()
4897 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO, 0); in qeth_query_card_info()
4900 return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, in qeth_query_card_info()
4906 * @card: pointer to a qeth_card
4909 * 0, if a MAC address has been set for the card's netdevice
4912 int qeth_vm_request_mac(struct qeth_card *card) in qeth_vm_request_mac() argument
4918 QETH_CARD_TEXT(card, 2, "vmreqmac"); in qeth_vm_request_mac()
4930 request->devno = card->info.ddev_devno; in qeth_vm_request_mac()
4942 QETH_CARD_TEXT(card, 2, "badresp"); in qeth_vm_request_mac()
4943 QETH_CARD_HEX(card, 2, &request->resp_buf_len, in qeth_vm_request_mac()
4947 QETH_CARD_TEXT(card, 2, "badmac"); in qeth_vm_request_mac()
4948 QETH_CARD_HEX(card, 2, response->mac, ETH_ALEN); in qeth_vm_request_mac()
4950 ether_addr_copy(card->dev->dev_addr, response->mac); in qeth_vm_request_mac()
4960 static void qeth_determine_capabilities(struct qeth_card *card) in qeth_determine_capabilities() argument
4962 struct qeth_channel *channel = &card->data; in qeth_determine_capabilities()
4967 QETH_CARD_TEXT(card, 2, "detcapab"); in qeth_determine_capabilities()
4972 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_determine_capabilities()
4977 rc = qeth_read_conf_data(card); in qeth_determine_capabilities()
4980 CARD_DEVID(card), rc); in qeth_determine_capabilities()
4981 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_determine_capabilities()
4985 rc = qdio_get_ssqd_desc(ddev, &card->ssqd); in qeth_determine_capabilities()
4987 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_determine_capabilities()
4989 QETH_CARD_TEXT_(card, 2, "qfmt%d", card->ssqd.qfmt); in qeth_determine_capabilities()
4990 QETH_CARD_TEXT_(card, 2, "ac1:%02x", card->ssqd.qdioac1); in qeth_determine_capabilities()
4991 QETH_CARD_TEXT_(card, 2, "ac2:%04x", card->ssqd.qdioac2); in qeth_determine_capabilities()
4992 QETH_CARD_TEXT_(card, 2, "ac3:%04x", card->ssqd.qdioac3); in qeth_determine_capabilities()
4993 QETH_CARD_TEXT_(card, 2, "icnt%d", card->ssqd.icnt); in qeth_determine_capabilities()
4994 if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) || in qeth_determine_capabilities()
4995 ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) || in qeth_determine_capabilities()
4996 ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) { in qeth_determine_capabilities()
4997 dev_info(&card->gdev->dev, in qeth_determine_capabilities()
5000 card->options.cq = QETH_CQ_NOTAVAILABLE; in qeth_determine_capabilities()
5010 static void qeth_read_ccw_conf_data(struct qeth_card *card) in qeth_read_ccw_conf_data() argument
5012 struct qeth_card_info *info = &card->info; in qeth_read_ccw_conf_data()
5013 struct ccw_device *cdev = CARD_DDEV(card); in qeth_read_ccw_conf_data()
5016 QETH_CARD_TEXT(card, 2, "ccwconfd"); in qeth_read_ccw_conf_data()
5025 dev_info(&card->gdev->dev, "CHID: %x CHPID: %x\n", in qeth_read_ccw_conf_data()
5028 QETH_CARD_TEXT_(card, 3, "devn%x", info->ddev_devno); in qeth_read_ccw_conf_data()
5029 QETH_CARD_TEXT_(card, 3, "cssid:%x", info->cssid); in qeth_read_ccw_conf_data()
5030 QETH_CARD_TEXT_(card, 3, "iid:%x", info->iid); in qeth_read_ccw_conf_data()
5031 QETH_CARD_TEXT_(card, 3, "ssid:%x", info->ssid); in qeth_read_ccw_conf_data()
5032 QETH_CARD_TEXT_(card, 3, "chpid:%x", info->chpid); in qeth_read_ccw_conf_data()
5033 QETH_CARD_TEXT_(card, 3, "chid:%x", info->chid); in qeth_read_ccw_conf_data()
5034 QETH_CARD_TEXT_(card, 3, "idval%x", info->ids_valid); in qeth_read_ccw_conf_data()
5037 static int qeth_qdio_establish(struct qeth_card *card) in qeth_qdio_establish() argument
5046 QETH_CARD_TEXT(card, 2, "qdioest"); in qeth_qdio_establish()
5048 if (!IS_IQD(card) && !IS_VM_NIC(card)) { in qeth_qdio_establish()
5053 qeth_fill_qib_parms(card, qib_parms); in qeth_qdio_establish()
5056 in_sbal_ptrs[0] = card->qdio.in_q->qdio_bufs; in qeth_qdio_establish()
5057 if (card->options.cq == QETH_CQ_ENABLED) in qeth_qdio_establish()
5058 in_sbal_ptrs[1] = card->qdio.c_q->qdio_bufs; in qeth_qdio_establish()
5060 for (i = 0; i < card->qdio.no_out_queues; i++) in qeth_qdio_establish()
5061 out_sbal_ptrs[i] = card->qdio.out_qs[i]->qdio_bufs; in qeth_qdio_establish()
5064 init_data.q_format = IS_IQD(card) ? QDIO_IQDIO_QFMT : in qeth_qdio_establish()
5068 init_data.no_input_qs = card->qdio.no_in_queues; in qeth_qdio_establish()
5069 init_data.no_output_qs = card->qdio.no_out_queues; in qeth_qdio_establish()
5073 init_data.int_parm = (unsigned long) card; in qeth_qdio_establish()
5076 init_data.output_sbal_state_array = card->qdio.out_bufstates; in qeth_qdio_establish()
5077 init_data.scan_threshold = IS_IQD(card) ? 0 : 32; in qeth_qdio_establish()
5079 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, in qeth_qdio_establish()
5081 rc = qdio_allocate(CARD_DDEV(card), init_data.no_input_qs, in qeth_qdio_establish()
5084 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_establish()
5087 rc = qdio_establish(CARD_DDEV(card), &init_data); in qeth_qdio_establish()
5089 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); in qeth_qdio_establish()
5090 qdio_free(CARD_DDEV(card)); in qeth_qdio_establish()
5094 switch (card->options.cq) { in qeth_qdio_establish()
5096 dev_info(&card->gdev->dev, "Completion Queue support enabled"); in qeth_qdio_establish()
5099 dev_info(&card->gdev->dev, "Completion Queue support disabled"); in qeth_qdio_establish()
5110 static void qeth_core_free_card(struct qeth_card *card) in qeth_core_free_card() argument
5112 QETH_CARD_TEXT(card, 2, "freecrd"); in qeth_core_free_card()
5114 unregister_service_level(&card->qeth_service_level); in qeth_core_free_card()
5115 debugfs_remove_recursive(card->debugfs); in qeth_core_free_card()
5116 qeth_put_cmd(card->read_cmd); in qeth_core_free_card()
5117 destroy_workqueue(card->event_wq); in qeth_core_free_card()
5118 dev_set_drvdata(&card->gdev->dev, NULL); in qeth_core_free_card()
5119 kfree(card); in qeth_core_free_card()
5122 static void qeth_trace_features(struct qeth_card *card) in qeth_trace_features() argument
5124 QETH_CARD_TEXT(card, 2, "features"); in qeth_trace_features()
5125 QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4)); in qeth_trace_features()
5126 QETH_CARD_HEX(card, 2, &card->options.ipa6, sizeof(card->options.ipa6)); in qeth_trace_features()
5127 QETH_CARD_HEX(card, 2, &card->options.adp, sizeof(card->options.adp)); in qeth_trace_features()
5128 QETH_CARD_HEX(card, 2, &card->info.diagass_support, in qeth_trace_features()
5129 sizeof(card->info.diagass_support)); in qeth_trace_features()
5161 static int qeth_hardsetup_card(struct qeth_card *card, bool *carrier_ok) in qeth_hardsetup_card() argument
5166 QETH_CARD_TEXT(card, 2, "hrdsetup"); in qeth_hardsetup_card()
5167 atomic_set(&card->force_alloc_skb, 0); in qeth_hardsetup_card()
5168 rc = qeth_update_from_chp_desc(card); in qeth_hardsetup_card()
5174 CARD_DEVID(card)); in qeth_hardsetup_card()
5175 rc = qeth_qdio_clear_card(card, !IS_IQD(card)); in qeth_hardsetup_card()
5176 qeth_stop_channel(&card->data); in qeth_hardsetup_card()
5177 qeth_stop_channel(&card->write); in qeth_hardsetup_card()
5178 qeth_stop_channel(&card->read); in qeth_hardsetup_card()
5179 qdio_free(CARD_DDEV(card)); in qeth_hardsetup_card()
5181 rc = qeth_start_channel(&card->read); in qeth_hardsetup_card()
5184 rc = qeth_start_channel(&card->write); in qeth_hardsetup_card()
5187 rc = qeth_start_channel(&card->data); in qeth_hardsetup_card()
5192 QETH_CARD_TEXT(card, 2, "break1"); in qeth_hardsetup_card()
5195 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_hardsetup_card()
5202 qeth_determine_capabilities(card); in qeth_hardsetup_card()
5203 qeth_read_ccw_conf_data(card); in qeth_hardsetup_card()
5204 qeth_idx_init(card); in qeth_hardsetup_card()
5206 rc = qeth_idx_activate_read_channel(card); in qeth_hardsetup_card()
5208 QETH_CARD_TEXT(card, 2, "break2"); in qeth_hardsetup_card()
5211 QETH_CARD_TEXT_(card, 2, "3err%d", rc); in qeth_hardsetup_card()
5218 rc = qeth_idx_activate_write_channel(card); in qeth_hardsetup_card()
5220 QETH_CARD_TEXT(card, 2, "break3"); in qeth_hardsetup_card()
5223 QETH_CARD_TEXT_(card, 2, "4err%d", rc); in qeth_hardsetup_card()
5229 card->read_or_write_problem = 0; in qeth_hardsetup_card()
5230 rc = qeth_mpc_initialize(card); in qeth_hardsetup_card()
5232 QETH_CARD_TEXT_(card, 2, "5err%d", rc); in qeth_hardsetup_card()
5236 rc = qeth_send_startlan(card); in qeth_hardsetup_card()
5238 QETH_CARD_TEXT_(card, 2, "6err%d", rc); in qeth_hardsetup_card()
5240 dev_warn(&card->gdev->dev, "The LAN is offline\n"); in qeth_hardsetup_card()
5249 card->options.ipa4.supported = 0; in qeth_hardsetup_card()
5250 card->options.ipa6.supported = 0; in qeth_hardsetup_card()
5251 card->options.adp.supported = 0; in qeth_hardsetup_card()
5252 card->options.sbp.supported_funcs = 0; in qeth_hardsetup_card()
5253 card->info.diagass_support = 0; in qeth_hardsetup_card()
5254 rc = qeth_query_ipassists(card, QETH_PROT_IPV4); in qeth_hardsetup_card()
5257 if (qeth_is_supported(card, IPA_IPV6)) { in qeth_hardsetup_card()
5258 rc = qeth_query_ipassists(card, QETH_PROT_IPV6); in qeth_hardsetup_card()
5262 if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { in qeth_hardsetup_card()
5263 rc = qeth_query_setadapterparms(card); in qeth_hardsetup_card()
5265 QETH_CARD_TEXT_(card, 2, "7err%d", rc); in qeth_hardsetup_card()
5269 if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { in qeth_hardsetup_card()
5270 rc = qeth_query_setdiagass(card); in qeth_hardsetup_card()
5272 QETH_CARD_TEXT_(card, 2, "8err%d", rc); in qeth_hardsetup_card()
5275 qeth_trace_features(card); in qeth_hardsetup_card()
5277 if (!qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP) || in qeth_hardsetup_card()
5278 (card->info.hwtrap && qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))) in qeth_hardsetup_card()
5279 card->info.hwtrap = 0; in qeth_hardsetup_card()
5281 if (card->options.isolation != ISOLATION_MODE_NONE) { in qeth_hardsetup_card()
5282 rc = qeth_setadpparms_set_access_ctrl(card, in qeth_hardsetup_card()
5283 card->options.isolation); in qeth_hardsetup_card()
5288 rc = qeth_init_qdio_queues(card); in qeth_hardsetup_card()
5290 QETH_CARD_TEXT_(card, 2, "9err%d", rc); in qeth_hardsetup_card()
5296 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " in qeth_hardsetup_card()
5299 CARD_DEVID(card), rc); in qeth_hardsetup_card()
5303 static int qeth_set_online(struct qeth_card *card) in qeth_set_online() argument
5308 mutex_lock(&card->discipline_mutex); in qeth_set_online()
5309 mutex_lock(&card->conf_mutex); in qeth_set_online()
5310 QETH_CARD_TEXT(card, 2, "setonlin"); in qeth_set_online()
5312 rc = qeth_hardsetup_card(card, &carrier_ok); in qeth_set_online()
5314 QETH_CARD_TEXT_(card, 2, "2err%04x", rc); in qeth_set_online()
5319 qeth_print_status_message(card); in qeth_set_online()
5321 if (card->dev->reg_state != NETREG_REGISTERED) in qeth_set_online()
5323 qeth_set_real_num_tx_queues(card, qeth_tx_actual_queues(card)); in qeth_set_online()
5325 rc = card->discipline->set_online(card, carrier_ok); in qeth_set_online()
5330 kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE); in qeth_set_online()
5332 mutex_unlock(&card->conf_mutex); in qeth_set_online()
5333 mutex_unlock(&card->discipline_mutex); in qeth_set_online()
5338 qeth_qdio_clear_card(card, 0); in qeth_set_online()
5339 qeth_clear_working_pool_list(card); in qeth_set_online()
5340 qeth_flush_local_addrs(card); in qeth_set_online()
5342 qeth_stop_channel(&card->data); in qeth_set_online()
5343 qeth_stop_channel(&card->write); in qeth_set_online()
5344 qeth_stop_channel(&card->read); in qeth_set_online()
5345 qdio_free(CARD_DDEV(card)); in qeth_set_online()
5347 mutex_unlock(&card->conf_mutex); in qeth_set_online()
5348 mutex_unlock(&card->discipline_mutex); in qeth_set_online()
5352 int qeth_set_offline(struct qeth_card *card, bool resetting) in qeth_set_offline() argument
5356 mutex_lock(&card->discipline_mutex); in qeth_set_offline()
5357 mutex_lock(&card->conf_mutex); in qeth_set_offline()
5358 QETH_CARD_TEXT(card, 3, "setoffl"); in qeth_set_offline()
5360 if ((!resetting && card->info.hwtrap) || card->info.hwtrap == 2) { in qeth_set_offline()
5361 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_set_offline()
5362 card->info.hwtrap = 1; in qeth_set_offline()
5366 qeth_clear_ipacmd_list(card); in qeth_set_offline()
5369 card->info.open_when_online = card->dev->flags & IFF_UP; in qeth_set_offline()
5370 dev_close(card->dev); in qeth_set_offline()
5371 netif_device_detach(card->dev); in qeth_set_offline()
5372 netif_carrier_off(card->dev); in qeth_set_offline()
5375 cancel_work_sync(&card->rx_mode_work); in qeth_set_offline()
5377 card->discipline->set_offline(card); in qeth_set_offline()
5379 qeth_qdio_clear_card(card, 0); in qeth_set_offline()
5380 qeth_drain_output_queues(card); in qeth_set_offline()
5381 qeth_clear_working_pool_list(card); in qeth_set_offline()
5382 qeth_flush_local_addrs(card); in qeth_set_offline()
5383 card->info.promisc_mode = 0; in qeth_set_offline()
5385 rc = qeth_stop_channel(&card->data); in qeth_set_offline()
5386 rc2 = qeth_stop_channel(&card->write); in qeth_set_offline()
5387 rc3 = qeth_stop_channel(&card->read); in qeth_set_offline()
5391 QETH_CARD_TEXT_(card, 2, "1err%d", rc); in qeth_set_offline()
5392 qdio_free(CARD_DDEV(card)); in qeth_set_offline()
5395 kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE); in qeth_set_offline()
5397 mutex_unlock(&card->conf_mutex); in qeth_set_offline()
5398 mutex_unlock(&card->discipline_mutex); in qeth_set_offline()
5405 struct qeth_card *card = data; in qeth_do_reset() local
5408 QETH_CARD_TEXT(card, 2, "recover1"); in qeth_do_reset()
5409 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) in qeth_do_reset()
5411 QETH_CARD_TEXT(card, 2, "recover2"); in qeth_do_reset()
5412 dev_warn(&card->gdev->dev, in qeth_do_reset()
5415 qeth_set_offline(card, true); in qeth_do_reset()
5416 rc = qeth_set_online(card); in qeth_do_reset()
5418 dev_info(&card->gdev->dev, in qeth_do_reset()
5421 ccwgroup_set_offline(card->gdev); in qeth_do_reset()
5422 dev_warn(&card->gdev->dev, in qeth_do_reset()
5425 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_do_reset()
5426 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); in qeth_do_reset()
5431 static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, in qeth_l3_rebuild_skb() argument
5438 if (IS_IQD(card) && iucv->magic == ETH_P_AF_IUCV) { in qeth_l3_rebuild_skb()
5456 QETH_CARD_STAT_INC(card, rx_multicast); in qeth_l3_rebuild_skb()
5460 QETH_CARD_STAT_INC(card, rx_multicast); in qeth_l3_rebuild_skb()
5463 if (card->options.sniffer) in qeth_l3_rebuild_skb()
5477 if (!card->options.sniffer && in qeth_l3_rebuild_skb()
5489 static void qeth_receive_skb(struct qeth_card *card, struct sk_buff *skb, in qeth_receive_skb() argument
5492 struct napi_struct *napi = &card->napi; in qeth_receive_skb()
5499 QETH_CARD_STAT_ADD(card, rx_bytes, skb->len); in qeth_receive_skb()
5500 QETH_CARD_STAT_INC(card, rx_packets); in qeth_receive_skb()
5502 card->osn_info.data_cb(skb); in qeth_receive_skb()
5506 qeth_l3_rebuild_skb(card, skb, hdr); in qeth_receive_skb()
5522 if (is_cso && (card->dev->features & NETIF_F_RXCSUM)) { in qeth_receive_skb()
5524 QETH_CARD_STAT_INC(card, rx_skb_csum); in qeth_receive_skb()
5529 QETH_CARD_STAT_ADD(card, rx_bytes, skb->len); in qeth_receive_skb()
5530 QETH_CARD_STAT_INC(card, rx_packets); in qeth_receive_skb()
5532 QETH_CARD_STAT_INC(card, rx_sg_skbs); in qeth_receive_skb()
5533 QETH_CARD_STAT_ADD(card, rx_sg_frags, in qeth_receive_skb()
5561 static int qeth_extract_skb(struct qeth_card *card, in qeth_extract_skb() argument
5565 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_extract_skb()
5567 struct napi_struct *napi = &card->napi; in qeth_extract_skb()
5601 if (!IS_LAYER3(card)) { in qeth_extract_skb()
5602 QETH_CARD_STAT_INC(card, rx_dropped_notsupp); in qeth_extract_skb()
5620 if (!IS_OSN(card)) { in qeth_extract_skb()
5621 QETH_CARD_STAT_INC(card, rx_dropped_notsupp); in qeth_extract_skb()
5630 QETH_CARD_STAT_INC(card, rx_frame_errors); in qeth_extract_skb()
5632 QETH_CARD_STAT_INC(card, rx_dropped_notsupp); in qeth_extract_skb()
5639 QETH_CARD_STAT_INC(card, rx_dropped_runt); in qeth_extract_skb()
5643 use_rx_sg = (card->options.cq == QETH_CQ_ENABLED) || in qeth_extract_skb()
5645 !atomic_read(&card->force_alloc_skb) && in qeth_extract_skb()
5646 !IS_OSN(card)); in qeth_extract_skb()
5660 QETH_CARD_STAT_INC(card, rx_dropped_nomem); in qeth_extract_skb()
5669 netdev_info_once(card->dev, in qeth_extract_skb()
5678 QETH_CARD_STAT_INC(card, rx_dropped_nomem); in qeth_extract_skb()
5714 QETH_CARD_TEXT(card, 4, "unexeob"); in qeth_extract_skb()
5715 QETH_CARD_HEX(card, 2, buffer, sizeof(void *)); in qeth_extract_skb()
5721 QETH_CARD_STAT_INC(card, in qeth_extract_skb()
5738 qeth_receive_skb(card, skb, hdr, uses_frags); in qeth_extract_skb()
5742 static unsigned int qeth_extract_skbs(struct qeth_card *card, int budget, in qeth_extract_skbs() argument
5748 if (qeth_extract_skb(card, buf, &card->rx.buf_element, in qeth_extract_skbs()
5749 &card->rx.e_offset)) { in qeth_extract_skbs()
5761 static unsigned int qeth_rx_poll(struct qeth_card *card, int budget) in qeth_rx_poll() argument
5763 struct qeth_rx *ctx = &card->rx; in qeth_rx_poll()
5772 if (!card->rx.b_count) { in qeth_rx_poll()
5773 card->rx.qdio_err = 0; in qeth_rx_poll()
5774 card->rx.b_count = qdio_get_next_buffers( in qeth_rx_poll()
5775 card->data.ccwdev, 0, &card->rx.b_index, in qeth_rx_poll()
5776 &card->rx.qdio_err); in qeth_rx_poll()
5777 if (card->rx.b_count <= 0) { in qeth_rx_poll()
5778 card->rx.b_count = 0; in qeth_rx_poll()
5784 buffer = &card->qdio.in_q->bufs[card->rx.b_index]; in qeth_rx_poll()
5785 if (!(card->rx.qdio_err && in qeth_rx_poll()
5786 qeth_check_qdio_errors(card, buffer->buffer, in qeth_rx_poll()
5787 card->rx.qdio_err, "qinerr"))) in qeth_rx_poll()
5788 skbs_done = qeth_extract_skbs(card, budget, buffer, in qeth_rx_poll()
5797 QETH_CARD_STAT_INC(card, rx_bufs); in qeth_rx_poll()
5798 qeth_put_buffer_pool_entry(card, buffer->pool_entry); in qeth_rx_poll()
5800 card->rx.b_count--; in qeth_rx_poll()
5802 ctx->bufs_refill -= qeth_rx_refill_queue(card, in qeth_rx_poll()
5806 card->rx.b_index = QDIO_BUFNR(card->rx.b_index + 1); in qeth_rx_poll()
5807 card->rx.buf_element = 0; in qeth_rx_poll()
5808 card->rx.e_offset = 0; in qeth_rx_poll()
5815 static void qeth_cq_poll(struct qeth_card *card) in qeth_cq_poll() argument
5823 completed = qdio_inspect_queue(CARD_DDEV(card), 1, true, &start, in qeth_cq_poll()
5828 qeth_qdio_cq_handler(card, error, 1, start, completed); in qeth_cq_poll()
5835 struct qeth_card *card = container_of(napi, struct qeth_card, napi); in qeth_poll() local
5838 work_done = qeth_rx_poll(card, budget); in qeth_poll()
5840 if (card->options.cq == QETH_CQ_ENABLED) in qeth_poll()
5841 qeth_cq_poll(card); in qeth_poll()
5844 struct qeth_rx *ctx = &card->rx; in qeth_poll()
5847 ctx->bufs_refill -= qeth_rx_refill_queue(card, ctx->bufs_refill); in qeth_poll()
5855 qdio_start_irq(CARD_DDEV(card))) in qeth_poll()
5867 struct qeth_card *card = queue->card; in qeth_iqd_tx_complete() local
5871 WARN_ON_ONCE(card->options.cq != QETH_CQ_ENABLED); in qeth_iqd_tx_complete()
5901 QETH_CARD_TEXT_(card, 5, "pel%u", bidx); in qeth_iqd_tx_complete()
5906 QETH_CARD_TEXT(card, 2, "outofbuf"); in qeth_iqd_tx_complete()
5907 qeth_schedule_recovery(card); in qeth_iqd_tx_complete()
5913 if (card->options.cq == QETH_CQ_ENABLED) in qeth_iqd_tx_complete()
5923 struct qeth_card *card = queue->card; in qeth_tx_poll() local
5924 struct net_device *dev = card->dev; in qeth_tx_poll()
5949 completed = qdio_inspect_queue(CARD_DDEV(card), queue_no, false, in qeth_tx_poll()
5966 qeth_handle_send_error(card, buffer, error); in qeth_tx_poll()
5993 static int qeth_setassparms_get_caps_cb(struct qeth_card *card, in qeth_setassparms_get_caps_cb() argument
6008 int qeth_setassparms_cb(struct qeth_card *card, in qeth_setassparms_cb() argument
6013 QETH_CARD_TEXT(card, 4, "defadpcb"); in qeth_setassparms_cb()
6020 card->options.ipa4.enabled = cmd->hdr.assists.enabled; in qeth_setassparms_cb()
6022 card->options.ipa6.enabled = cmd->hdr.assists.enabled; in qeth_setassparms_cb()
6027 struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card, in qeth_get_setassparms_cmd() argument
6037 QETH_CARD_TEXT(card, 4, "getasscm"); in qeth_get_setassparms_cmd()
6038 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETASSPARMS, prot, in qeth_get_setassparms_cmd()
6055 int qeth_send_simple_setassparms_prot(struct qeth_card *card, in qeth_send_simple_setassparms_prot() argument
6063 QETH_CARD_TEXT_(card, 4, "simassp%i", prot); in qeth_send_simple_setassparms_prot()
6064 iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code, length, prot); in qeth_send_simple_setassparms_prot()
6070 return qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL); in qeth_send_simple_setassparms_prot()
6130 int qeth_core_load_discipline(struct qeth_card *card, in qeth_core_load_discipline() argument
6136 card->discipline = try_then_request_module( in qeth_core_load_discipline()
6140 card->discipline = try_then_request_module( in qeth_core_load_discipline()
6148 if (!card->discipline) { in qeth_core_load_discipline()
6149 dev_err(&card->gdev->dev, "There is no kernel module to " in qeth_core_load_discipline()
6154 card->options.layer = discipline; in qeth_core_load_discipline()
6158 void qeth_core_free_discipline(struct qeth_card *card) in qeth_core_free_discipline() argument
6160 if (IS_LAYER2(card)) in qeth_core_free_discipline()
6164 card->options.layer = QETH_DISCIPLINE_UNDETERMINED; in qeth_core_free_discipline()
6165 card->discipline = NULL; in qeth_core_free_discipline()
6206 static int qeth_add_dbf_entry(struct qeth_card *card, char *name) in qeth_add_dbf_entry() argument
6210 card->debug = debug_register(name, 2, 1, 8); in qeth_add_dbf_entry()
6211 if (!card->debug) { in qeth_add_dbf_entry()
6215 if (debug_register_view(card->debug, &debug_hex_ascii_view)) in qeth_add_dbf_entry()
6221 new_entry->dbf_info = card->debug; in qeth_add_dbf_entry()
6229 debug_unregister(card->debug); in qeth_add_dbf_entry()
6247 static struct net_device *qeth_alloc_netdev(struct qeth_card *card) in qeth_alloc_netdev() argument
6252 switch (card->info.type) { in qeth_alloc_netdev()
6273 priv->tx_wanted_queues = IS_IQD(card) ? QETH_IQD_MIN_TXQ : 1; in qeth_alloc_netdev()
6275 dev->ml_priv = card; in qeth_alloc_netdev()
6277 dev->min_mtu = IS_OSN(card) ? 64 : 576; in qeth_alloc_netdev()
6281 SET_NETDEV_DEV(dev, &card->gdev->dev); in qeth_alloc_netdev()
6284 if (IS_OSN(card)) { in qeth_alloc_netdev()
6291 if (IS_IQD(card)) in qeth_alloc_netdev()
6311 struct qeth_card *card; in qeth_core_probe_device() local
6325 card = qeth_alloc_card(gdev); in qeth_core_probe_device()
6326 if (!card) { in qeth_core_probe_device()
6334 card->debug = qeth_get_dbf_entry(dbf_name); in qeth_core_probe_device()
6335 if (!card->debug) { in qeth_core_probe_device()
6336 rc = qeth_add_dbf_entry(card, dbf_name); in qeth_core_probe_device()
6341 qeth_setup_card(card); in qeth_core_probe_device()
6342 card->dev = qeth_alloc_netdev(card); in qeth_core_probe_device()
6343 if (!card->dev) { in qeth_core_probe_device()
6348 qeth_determine_capabilities(card); in qeth_core_probe_device()
6349 qeth_set_blkt_defaults(card); in qeth_core_probe_device()
6351 card->qdio.no_out_queues = card->dev->num_tx_queues; in qeth_core_probe_device()
6352 rc = qeth_update_from_chp_desc(card); in qeth_core_probe_device()
6356 enforced_disc = qeth_enforce_discipline(card); in qeth_core_probe_device()
6362 card->info.layer_enforced = true; in qeth_core_probe_device()
6363 rc = qeth_core_load_discipline(card, enforced_disc); in qeth_core_probe_device()
6367 gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype : in qeth_core_probe_device()
6368 card->discipline->devtype; in qeth_core_probe_device()
6369 rc = card->discipline->setup(card->gdev); in qeth_core_probe_device()
6378 qeth_core_free_discipline(card); in qeth_core_probe_device()
6381 free_netdev(card->dev); in qeth_core_probe_device()
6383 qeth_core_free_card(card); in qeth_core_probe_device()
6391 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_remove_device() local
6393 QETH_CARD_TEXT(card, 2, "removedv"); in qeth_core_remove_device()
6395 if (card->discipline) { in qeth_core_remove_device()
6396 card->discipline->remove(gdev); in qeth_core_remove_device()
6397 qeth_core_free_discipline(card); in qeth_core_remove_device()
6400 qeth_free_qdio_queues(card); in qeth_core_remove_device()
6402 free_netdev(card->dev); in qeth_core_remove_device()
6403 qeth_core_free_card(card); in qeth_core_remove_device()
6409 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_set_online() local
6413 if (!card->discipline) { in qeth_core_set_online()
6414 def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 : in qeth_core_set_online()
6416 rc = qeth_core_load_discipline(card, def_discipline); in qeth_core_set_online()
6419 rc = card->discipline->setup(card->gdev); in qeth_core_set_online()
6421 qeth_core_free_discipline(card); in qeth_core_set_online()
6426 rc = qeth_set_online(card); in qeth_core_set_online()
6433 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_set_offline() local
6435 return qeth_set_offline(card, false); in qeth_core_set_offline()
6440 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_core_shutdown() local
6442 qeth_set_allowed_threads(card, 0, 1); in qeth_core_shutdown()
6443 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) in qeth_core_shutdown()
6444 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_core_shutdown()
6445 qeth_qdio_clear_card(card, 0); in qeth_core_shutdown()
6446 qeth_drain_output_queues(card); in qeth_core_shutdown()
6447 qdio_free(CARD_DDEV(card)); in qeth_core_shutdown()
6491 struct qeth_card *card; in qeth_get_card_by_busid() local
6497 card = dev_get_drvdata(&gdev->dev); in qeth_get_card_by_busid()
6499 return card; in qeth_get_card_by_busid()
6505 struct qeth_card *card = dev->ml_priv; in qeth_do_ioctl() local
6511 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); in qeth_do_ioctl()
6514 if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) && in qeth_do_ioctl()
6515 !IS_VM_NIC(card)) in qeth_do_ioctl()
6531 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); in qeth_do_ioctl()
6534 if (card->discipline->do_ioctl) in qeth_do_ioctl()
6535 rc = card->discipline->do_ioctl(dev, rq, cmd); in qeth_do_ioctl()
6540 QETH_CARD_TEXT_(card, 2, "ioce%x", rc); in qeth_do_ioctl()
6545 static int qeth_start_csum_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_start_csum_cb() argument
6558 static int qeth_set_csum_off(struct qeth_card *card, enum qeth_ipa_funcs cstype, in qeth_set_csum_off() argument
6561 return qeth_send_simple_setassparms_prot(card, cstype, IPA_CMD_ASS_STOP, in qeth_set_csum_off()
6565 static int qeth_set_csum_on(struct qeth_card *card, enum qeth_ipa_funcs cstype, in qeth_set_csum_on() argument
6575 if (IS_LAYER3(card) && prot == QETH_PROT_IPV4 && in qeth_set_csum_on()
6579 iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_START, 0, in qeth_set_csum_on()
6584 rc = qeth_send_ipa_cmd(card, iob, qeth_start_csum_cb, &features); in qeth_set_csum_on()
6589 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6593 iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_ENABLE, in qeth_set_csum_on()
6597 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6604 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps); in qeth_set_csum_on()
6606 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6612 qeth_set_csum_off(card, cstype, prot); in qeth_set_csum_on()
6616 dev_info(&card->gdev->dev, "HW Checksumming (%sbound IPv%d) enabled\n", in qeth_set_csum_on()
6625 static int qeth_set_ipa_csum(struct qeth_card *card, bool on, int cstype, in qeth_set_ipa_csum() argument
6628 return on ? qeth_set_csum_on(card, cstype, prot, lp2lp) : in qeth_set_ipa_csum()
6629 qeth_set_csum_off(card, cstype, prot); in qeth_set_ipa_csum()
6632 static int qeth_start_tso_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_start_tso_cb() argument
6646 static int qeth_set_tso_off(struct qeth_card *card, in qeth_set_tso_off() argument
6649 return qeth_send_simple_setassparms_prot(card, IPA_OUTBOUND_TSO, in qeth_set_tso_off()
6653 static int qeth_set_tso_on(struct qeth_card *card, in qeth_set_tso_on() argument
6661 iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO, in qeth_set_tso_on()
6666 rc = qeth_send_ipa_cmd(card, iob, qeth_start_tso_cb, &tso_data); in qeth_set_tso_on()
6671 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6675 iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO, in qeth_set_tso_on()
6679 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6686 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps); in qeth_set_tso_on()
6688 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6694 qeth_set_tso_off(card, prot); in qeth_set_tso_on()
6698 dev_info(&card->gdev->dev, "TSOv%u enabled (MSS: %u)\n", prot, in qeth_set_tso_on()
6703 static int qeth_set_ipa_tso(struct qeth_card *card, bool on, in qeth_set_ipa_tso() argument
6706 return on ? qeth_set_tso_on(card, prot) : qeth_set_tso_off(card, prot); in qeth_set_ipa_tso()
6709 static int qeth_set_ipa_rx_csum(struct qeth_card *card, bool on) in qeth_set_ipa_rx_csum() argument
6714 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) in qeth_set_ipa_rx_csum()
6715 rc_ipv4 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM, in qeth_set_ipa_rx_csum()
6717 if (!qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) in qeth_set_ipa_rx_csum()
6721 rc_ipv6 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM, in qeth_set_ipa_rx_csum()
6738 struct qeth_card *card = dev->ml_priv; in qeth_enable_hw_features() local
6747 if (IS_LAYER2(card) && IS_VM_NIC(card)) { in qeth_enable_hw_features()
6753 dev_warn(&card->gdev->dev, in qeth_enable_hw_features()
6758 static void qeth_check_restricted_features(struct qeth_card *card, in qeth_check_restricted_features() argument
6765 if (!card->info.has_lp2lp_cso_v6) in qeth_check_restricted_features()
6767 if (!card->info.has_lp2lp_cso_v4) in qeth_check_restricted_features()
6771 qeth_flush_local_addrs6(card); in qeth_check_restricted_features()
6773 qeth_flush_local_addrs4(card); in qeth_check_restricted_features()
6778 struct qeth_card *card = dev->ml_priv; in qeth_set_features() local
6782 QETH_CARD_TEXT(card, 2, "setfeat"); in qeth_set_features()
6783 QETH_CARD_HEX(card, 2, &features, sizeof(features)); in qeth_set_features()
6786 rc = qeth_set_ipa_csum(card, features & NETIF_F_IP_CSUM, in qeth_set_features()
6788 &card->info.has_lp2lp_cso_v4); in qeth_set_features()
6793 rc = qeth_set_ipa_csum(card, features & NETIF_F_IPV6_CSUM, in qeth_set_features()
6795 &card->info.has_lp2lp_cso_v6); in qeth_set_features()
6800 rc = qeth_set_ipa_rx_csum(card, features & NETIF_F_RXCSUM); in qeth_set_features()
6805 rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO, in qeth_set_features()
6811 rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO6, in qeth_set_features()
6817 qeth_check_restricted_features(card, dev->features ^ features, in qeth_set_features()
6832 struct qeth_card *card = dev->ml_priv; in qeth_fix_features() local
6834 QETH_CARD_TEXT(card, 2, "fixfeat"); in qeth_fix_features()
6835 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) in qeth_fix_features()
6837 if (!qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) in qeth_fix_features()
6839 if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM) && in qeth_fix_features()
6840 !qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) in qeth_fix_features()
6842 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) in qeth_fix_features()
6844 if (!qeth_is_supported6(card, IPA_OUTBOUND_TSO)) in qeth_fix_features()
6847 QETH_CARD_HEX(card, 2, &features, sizeof(features)); in qeth_fix_features()
6856 struct qeth_card *card = dev->ml_priv; in qeth_features_check() local
6860 READ_ONCE(card->options.isolation) != ISOLATION_MODE_FWD) { in qeth_features_check()
6868 if (!card->info.has_lp2lp_cso_v4) in qeth_features_check()
6871 if (restricted && qeth_next_hop_is_local_v4(card, skb)) in qeth_features_check()
6875 if (!card->info.has_lp2lp_cso_v6) in qeth_features_check()
6878 if (restricted && qeth_next_hop_is_local_v6(card, skb)) in qeth_features_check()
6910 struct qeth_card *card = dev->ml_priv; in qeth_get_stats64() local
6914 QETH_CARD_TEXT(card, 5, "getstat"); in qeth_get_stats64()
6916 stats->rx_packets = card->stats.rx_packets; in qeth_get_stats64()
6917 stats->rx_bytes = card->stats.rx_bytes; in qeth_get_stats64()
6918 stats->rx_errors = card->stats.rx_length_errors + in qeth_get_stats64()
6919 card->stats.rx_frame_errors + in qeth_get_stats64()
6920 card->stats.rx_fifo_errors; in qeth_get_stats64()
6921 stats->rx_dropped = card->stats.rx_dropped_nomem + in qeth_get_stats64()
6922 card->stats.rx_dropped_notsupp + in qeth_get_stats64()
6923 card->stats.rx_dropped_runt; in qeth_get_stats64()
6924 stats->multicast = card->stats.rx_multicast; in qeth_get_stats64()
6925 stats->rx_length_errors = card->stats.rx_length_errors; in qeth_get_stats64()
6926 stats->rx_frame_errors = card->stats.rx_frame_errors; in qeth_get_stats64()
6927 stats->rx_fifo_errors = card->stats.rx_fifo_errors; in qeth_get_stats64()
6929 for (i = 0; i < card->qdio.no_out_queues; i++) { in qeth_get_stats64()
6930 queue = card->qdio.out_qs[i]; in qeth_get_stats64()
6964 int qeth_set_real_num_tx_queues(struct qeth_card *card, unsigned int count) in qeth_set_real_num_tx_queues() argument
6966 struct net_device *dev = card->dev; in qeth_set_real_num_tx_queues()
6970 if (IS_IQD(card)) in qeth_set_real_num_tx_queues()
6975 if (rc && IS_IQD(card)) in qeth_set_real_num_tx_queues()
6999 struct qeth_card *card = dev->ml_priv; in qeth_open() local
7001 QETH_CARD_TEXT(card, 4, "qethopen"); in qeth_open()
7003 card->data.state = CH_STATE_UP; in qeth_open()
7006 napi_enable(&card->napi); in qeth_open()
7008 napi_schedule(&card->napi); in qeth_open()
7009 if (IS_IQD(card)) { in qeth_open()
7013 qeth_for_each_output_queue(card, queue, i) { in qeth_open()
7028 struct qeth_card *card = dev->ml_priv; in qeth_stop() local
7030 QETH_CARD_TEXT(card, 4, "qethstop"); in qeth_stop()
7031 if (IS_IQD(card)) { in qeth_stop()
7036 qeth_for_each_output_queue(card, queue, i) in qeth_stop()
7042 qeth_for_each_output_queue(card, queue, i) { in qeth_stop()
7051 napi_disable(&card->napi); in qeth_stop()
7052 cancel_delayed_work_sync(&card->buffer_reclaim_work); in qeth_stop()
7053 qdio_stop_irq(CARD_DDEV(card)); in qeth_stop()