Lines Matching refs:card

73 static inline const char *qeth_get_cardname(struct qeth_card *card)
75 if (card->info.guestlan) {
76 switch (card->info.type) {
89 switch (card->info.type) {
108 const char *qeth_get_cardname_short(struct qeth_card *card)
110 if (card->info.guestlan) {
111 switch (card->info.type) {
124 switch (card->info.type) {
126 switch (card->info.link_type) {
161 void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
166 spin_lock_irqsave(&card->thread_mask_lock, flags);
167 card->thread_allowed_mask = threads;
169 card->thread_start_mask &= threads;
170 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
171 wake_up(&card->wait_q);
175 int qeth_threads_running(struct qeth_card *card, unsigned long threads)
180 spin_lock_irqsave(&card->thread_mask_lock, flags);
181 rc = (card->thread_running_mask & threads);
182 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
187 int qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
189 return wait_event_interruptible(card->wait_q,
190 qeth_threads_running(card, threads) == 0);
194 void qeth_clear_working_pool_list(struct qeth_card *card)
198 QETH_CARD_TEXT(card, 5, "clwrklst");
200 &card->qdio.in_buf_pool.entry_list, list){
206 static int qeth_alloc_buffer_pool(struct qeth_card *card)
212 QETH_CARD_TEXT(card, 5, "alocpool");
213 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) {
216 qeth_free_buffer_pool(card);
219 for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) {
226 qeth_free_buffer_pool(card);
232 &card->qdio.init_pool.entry_list);
237 int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
239 QETH_CARD_TEXT(card, 2, "realcbp");
241 if ((card->state != CARD_STATE_DOWN) &&
242 (card->state != CARD_STATE_RECOVER))
245 /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
246 qeth_clear_working_pool_list(card);
247 qeth_free_buffer_pool(card);
248 card->qdio.in_buf_pool.buf_count = bufcnt;
249 card->qdio.init_pool.buf_count = bufcnt;
250 return qeth_alloc_buffer_pool(card);
254 static inline int qeth_cq_init(struct qeth_card *card)
258 if (card->options.cq == QETH_CQ_ENABLED) {
260 memset(card->qdio.c_q->qdio_bufs, 0,
262 card->qdio.c_q->next_buf_to_init = 127;
263 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT,
264 card->qdio.no_in_queues - 1, 0,
276 static inline int qeth_alloc_cq(struct qeth_card *card)
280 if (card->options.cq == QETH_CQ_ENABLED) {
285 card->qdio.c_q = kzalloc(sizeof(struct qeth_qdio_q),
287 if (!card->qdio.c_q) {
291 QETH_DBF_HEX(SETUP, 2, &card->qdio.c_q, sizeof(void *));
294 card->qdio.c_q->bufs[i].buffer =
295 &card->qdio.c_q->qdio_bufs[i];
298 card->qdio.no_in_queues = 2;
300 card->qdio.out_bufstates = (struct qdio_outbuf_state *)
301 kzalloc(card->qdio.no_out_queues *
304 outbuf_states = card->qdio.out_bufstates;
309 for (i = 0; i < card->qdio.no_out_queues; ++i) {
310 card->qdio.out_qs[i]->bufstates = outbuf_states;
315 card->qdio.c_q = NULL;
316 card->qdio.no_in_queues = 1;
318 QETH_DBF_TEXT_(SETUP, 2, "iqc%d", card->qdio.no_in_queues);
323 kfree(card->qdio.c_q);
324 card->qdio.c_q = NULL;
326 dev_err(&card->gdev->dev, "Failed to create completion queue\n");
330 static inline void qeth_free_cq(struct qeth_card *card)
332 if (card->qdio.c_q) {
333 --card->qdio.no_in_queues;
334 kfree(card->qdio.c_q);
335 card->qdio.c_q = NULL;
337 kfree(card->qdio.out_bufstates);
338 card->qdio.out_bufstates = NULL;
368 if (q->card->options.cq != QETH_CQ_ENABLED)
380 QETH_CARD_TEXT(f->q->card, 5, "fp");
381 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f);
403 QETH_CARD_TEXT(q->card, 2, "clprecov");
408 static inline void qeth_qdio_handle_aob(struct qeth_card *card,
415 QETH_CARD_TEXT(card, 5, "haob");
416 QETH_CARD_TEXT_(card, 5, "%lx", phys_aob_addr);
418 QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
432 QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
445 static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue)
447 return card->options.cq == QETH_CQ_ENABLED &&
448 card->qdio.c_q != NULL &&
450 queue == card->qdio.no_in_queues - 1;
454 static int qeth_issue_next_read(struct qeth_card *card)
459 QETH_CARD_TEXT(card, 5, "issnxrd");
460 if (card->read.state != CH_STATE_UP)
462 iob = qeth_get_buffer(&card->read);
464 dev_warn(&card->gdev->dev, "The qeth device driver "
467 "available\n", dev_name(&card->gdev->dev));
470 qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
471 QETH_CARD_TEXT(card, 6, "noirqpnd");
472 rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
476 "rc=%i\n", dev_name(&card->gdev->dev), rc);
477 atomic_set(&card->read.irq_pending, 0);
478 card->read_or_write_problem = 1;
479 qeth_schedule_recovery(card);
480 wake_up(&card->wait_q);
485 static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
493 reply->card = card;
512 struct qeth_card *card)
520 ipa_name, com, dev_name(&card->gdev->dev),
521 QETH_CARD_IFNAME(card), rc,
525 ipa_name, com, dev_name(&card->gdev->dev),
526 QETH_CARD_IFNAME(card));
529 static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
534 QETH_CARD_TEXT(card, 5, "chkipad");
543 cmd->hdr.return_code, card);
548 dev_warn(&card->gdev->dev,
551 QETH_CARD_IFNAME(card),
552 card->info.chpid);
553 card->lan_online = 0;
554 if (card->dev && netif_carrier_ok(card->dev))
555 netif_carrier_off(card->dev);
558 dev_info(&card->gdev->dev,
561 QETH_CARD_IFNAME(card),
562 card->info.chpid);
563 netif_carrier_on(card->dev);
564 card->lan_online = 1;
565 if (card->info.hwtrap)
566 card->info.hwtrap = 2;
567 qeth_schedule_recovery(card);
572 QETH_CARD_TEXT(card, 3, "irla");
575 QETH_CARD_TEXT(card, 3, "urla");
587 void qeth_clear_ipacmd_list(struct qeth_card *card)
592 QETH_CARD_TEXT(card, 4, "clipalst");
594 spin_lock_irqsave(&card->lock, flags);
595 list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
603 spin_unlock_irqrestore(&card->lock, flags);
604 atomic_set(&card->write.irq_pending, 0);
608 static int qeth_check_idx_response(struct qeth_card *card,
621 QETH_CARD_TEXT(card, 2, "ckidxres");
622 QETH_CARD_TEXT(card, 2, " idxterm");
623 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO);
625 dev_err(&card->gdev->dev,
638 struct qeth_card *card;
640 card = CARD_FROM_CDEV(channel->ccwdev);
641 QETH_CARD_TEXT(card, 4, "setupccw");
642 if (channel == &card->read)
720 struct qeth_card *card;
727 card = CARD_FROM_CDEV(channel->ccwdev);
728 QETH_CARD_TEXT(card, 4, "sndctlcb");
729 rc = qeth_check_idx_response(card, iob->data);
734 qeth_clear_ipacmd_list(card);
735 qeth_schedule_recovery(card);
741 cmd = qeth_check_ipa_data(card, iob);
742 if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
745 if (card->info.type == QETH_CARD_TYPE_OSN &&
748 card->osn_info.assist_cb != NULL) {
749 card->osn_info.assist_cb(card->dev, cmd);
753 spin_lock_irqsave(&card->lock, flags);
754 list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
759 spin_unlock_irqrestore(&card->lock, flags);
765 keep_reply = reply->callback(card,
769 keep_reply = reply->callback(card,
778 spin_lock_irqsave(&card->lock, flags);
780 &card->cmd_waiter_list);
781 spin_unlock_irqrestore(&card->lock, flags);
790 spin_unlock_irqrestore(&card->lock, flags);
792 memcpy(&card->seqno.pdu_hdr_ack,
827 static int qeth_set_thread_start_bit(struct qeth_card *card,
832 spin_lock_irqsave(&card->thread_mask_lock, flags);
833 if (!(card->thread_allowed_mask & thread) ||
834 (card->thread_start_mask & thread)) {
835 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
838 card->thread_start_mask |= thread;
839 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
843 void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
847 spin_lock_irqsave(&card->thread_mask_lock, flags);
848 card->thread_start_mask &= ~thread;
849 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
850 wake_up(&card->wait_q);
854 void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
858 spin_lock_irqsave(&card->thread_mask_lock, flags);
859 card->thread_running_mask &= ~thread;
860 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
861 wake_up(&card->wait_q);
865 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
870 spin_lock_irqsave(&card->thread_mask_lock, flags);
871 if (card->thread_start_mask & thread) {
872 if ((card->thread_allowed_mask & thread) &&
873 !(card->thread_running_mask & thread)) {
875 card->thread_start_mask &= ~thread;
876 card->thread_running_mask |= thread;
880 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
884 int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
888 wait_event(card->wait_q,
889 (rc = __qeth_do_run_thread(card, thread)) >= 0);
894 void qeth_schedule_recovery(struct qeth_card *card)
896 QETH_CARD_TEXT(card, 2, "startrec");
897 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
898 schedule_work(&card->kernel_thread_starter);
906 struct qeth_card *card;
911 card = CARD_FROM_CDEV(cdev);
916 QETH_CARD_TEXT(card, 2, "CGENCHK");
929 QETH_CARD_TEXT(card, 2, "REVIND");
934 QETH_CARD_TEXT(card, 2, "CMDREJi");
938 QETH_CARD_TEXT(card, 2, "AFFE");
942 QETH_CARD_TEXT(card, 2, "ZEROSEN");
945 QETH_CARD_TEXT(card, 2, "DGENCHK");
954 struct qeth_card *card;
956 card = CARD_FROM_CDEV(cdev);
965 QETH_CARD_TEXT(card, 2, "ckirberr");
966 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO);
971 QETH_CARD_TEXT(card, 2, "ckirberr");
972 QETH_CARD_TEXT_(card, 2, " rc%d", -ETIMEDOUT);
974 if (card && (card->data.ccwdev == cdev)) {
975 card->data.state = CH_STATE_DOWN;
976 wake_up(&card->wait_q);
983 QETH_CARD_TEXT(card, 2, "ckirberr");
984 QETH_CARD_TEXT(card, 2, " rc???");
996 struct qeth_card *card;
1005 card = CARD_FROM_CDEV(cdev);
1006 if (!card)
1009 QETH_CARD_TEXT(card, 5, "irq");
1011 if (card->read.ccwdev == cdev) {
1012 channel = &card->read;
1013 QETH_CARD_TEXT(card, 5, "read");
1014 } else if (card->write.ccwdev == cdev) {
1015 channel = &card->write;
1016 QETH_CARD_TEXT(card, 5, "write");
1018 channel = &card->data;
1019 QETH_CARD_TEXT(card, 5, "data");
1030 if ((channel == &card->data) && (intparm != 0) &&
1035 QETH_CARD_TEXT(card, 6, "clrchpar");
1040 QETH_CARD_TEXT(card, 6, "hltchpar");
1065 qeth_clear_ipacmd_list(card);
1066 qeth_schedule_recovery(card);
1079 if (channel == &card->data)
1081 if (channel == &card->read &&
1083 qeth_issue_next_read(card);
1095 wake_up(&card->wait_q);
1109 QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
1110 QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
1140 QETH_CARD_TEXT(buf->q->card, 5, "skbr");
1141 QETH_CARD_TEXT_(buf->q->card, 5, "%lx", (long) skb);
1167 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) {
1199 void qeth_clear_qdio_buffers(struct qeth_card *card)
1203 QETH_CARD_TEXT(card, 2, "clearqdbf");
1205 for (i = 0; i < card->qdio.no_out_queues; ++i) {
1206 if (card->qdio.out_qs[i]) {
1207 qeth_clear_outq_buffers(card->qdio.out_qs[i], 0);
1213 static void qeth_free_buffer_pool(struct qeth_card *card)
1218 &card->qdio.init_pool.entry_list, init_list){
1219 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
1226 static void qeth_free_qdio_buffers(struct qeth_card *card)
1230 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
1234 qeth_free_cq(card);
1235 cancel_delayed_work_sync(&card->buffer_reclaim_work);
1237 dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
1238 kfree(card->qdio.in_q);
1239 card->qdio.in_q = NULL;
1241 qeth_free_buffer_pool(card);
1243 if (card->qdio.out_qs) {
1244 for (i = 0; i < card->qdio.no_out_queues; ++i) {
1245 qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
1246 kfree(card->qdio.out_qs[i]);
1248 kfree(card->qdio.out_qs);
1249 card->qdio.out_qs = NULL;
1262 static void qeth_get_channel_path_desc(struct qeth_card *card)
1278 ccwdev = card->data.ccwdev;
1281 if (card->info.type != QETH_CARD_TYPE_IQD) {
1284 if ((atomic_read(&card->qdio.state) !=
1286 (card->qdio.no_out_queues == 4))
1288 qeth_free_qdio_buffers(card);
1289 card->qdio.no_out_queues = 1;
1290 if (card->qdio.default_out_queue != 0)
1291 dev_info(&card->gdev->dev,
1293 card->qdio.default_out_queue = 0;
1295 if ((atomic_read(&card->qdio.state) !=
1297 (card->qdio.no_out_queues == 1)) {
1299 qeth_free_qdio_buffers(card);
1300 card->qdio.default_out_queue = 2;
1302 card->qdio.no_out_queues = 4;
1305 card->info.func_level = 0x4100 + chp_dsc->desc;
1308 QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
1309 QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
1313 static void qeth_init_qdio_info(struct qeth_card *card)
1316 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
1318 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1319 if (card->info.type == QETH_CARD_TYPE_IQD)
1320 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT;
1322 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
1323 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
1324 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
1325 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
1328 static void qeth_set_intial_options(struct qeth_card *card)
1330 card->options.route4.type = NO_ROUTER;
1331 card->options.route6.type = NO_ROUTER;
1332 card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
1333 card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
1334 card->options.fake_broadcast = 0;
1335 card->options.add_hhlen = DEFAULT_ADD_HHLEN;
1336 card->options.performance_stats = 0;
1337 card->options.rx_sg_cb = QETH_RX_SG_CB;
1338 card->options.isolation = ISOLATION_MODE_NONE;
1339 card->options.cq = QETH_CQ_DISABLED;
1342 static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
1347 spin_lock_irqsave(&card->thread_mask_lock, flags);
1348 QETH_CARD_TEXT_(card, 4, " %02x%02x%02x",
1349 (u8) card->thread_start_mask,
1350 (u8) card->thread_allowed_mask,
1351 (u8) card->thread_running_mask);
1352 rc = (card->thread_start_mask & thread);
1353 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
1360 struct qeth_card *card = container_of(work, struct qeth_card,
1362 QETH_CARD_TEXT(card , 2, "strthrd");
1364 if (card->read.state != CH_STATE_UP &&
1365 card->write.state != CH_STATE_UP)
1367 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
1368 ts = kthread_run(card->discipline.recover, (void *)card,
1371 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1372 qeth_clear_thread_running_bit(card,
1378 static int qeth_setup_card(struct qeth_card *card)
1382 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1384 card->read.state = CH_STATE_DOWN;
1385 card->write.state = CH_STATE_DOWN;
1386 card->data.state = CH_STATE_DOWN;
1387 card->state = CARD_STATE_DOWN;
1388 card->lan_online = 0;
1389 card->read_or_write_problem = 0;
1390 card->dev = NULL;
1391 spin_lock_init(&card->vlanlock);
1392 spin_lock_init(&card->mclock);
1393 spin_lock_init(&card->lock);
1394 spin_lock_init(&card->ip_lock);
1395 spin_lock_init(&card->thread_mask_lock);
1396 mutex_init(&card->conf_mutex);
1397 mutex_init(&card->discipline_mutex);
1398 card->thread_start_mask = 0;
1399 card->thread_allowed_mask = 0;
1400 card->thread_running_mask = 0;
1401 INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread);
1402 INIT_LIST_HEAD(&card->ip_list);
1403 INIT_LIST_HEAD(card->ip_tbd_list);
1404 INIT_LIST_HEAD(&card->cmd_waiter_list);
1405 init_waitqueue_head(&card->wait_q);
1407 qeth_set_intial_options(card);
1409 INIT_LIST_HEAD(&card->ipato.entries);
1410 card->ipato.enabled = 0;
1411 card->ipato.invert4 = 0;
1412 card->ipato.invert6 = 0;
1414 qeth_init_qdio_info(card);
1415 INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work);
1421 struct qeth_card *card = container_of(slr, struct qeth_card,
1423 if (card->info.mcl_level[0])
1425 CARD_BUS_ID(card), card->info.mcl_level);
1430 struct qeth_card *card;
1433 card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL);
1434 if (!card)
1436 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1437 card->ip_tbd_list = kzalloc(sizeof(struct list_head), GFP_KERNEL);
1438 if (!card->ip_tbd_list) {
1442 if (qeth_setup_channel(&card->read))
1444 if (qeth_setup_channel(&card->write))
1446 card->options.layer2 = -1;
1447 card->qeth_service_level.seq_print = qeth_core_sl_print;
1448 register_service_level(&card->qeth_service_level);
1449 return card;
1452 qeth_clean_channel(&card->read);
1454 kfree(card->ip_tbd_list);
1456 kfree(card);
1461 static int qeth_determine_card_type(struct qeth_card *card)
1467 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
1468 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1470 if ((CARD_RDEV(card)->id.dev_type ==
1472 (CARD_RDEV(card)->id.dev_model ==
1474 card->info.type = known_devices[i][QETH_DEV_MODEL_IND];
1475 card->qdio.no_out_queues =
1477 card->qdio.no_in_queues = 1;
1478 card->info.is_multicast_different =
1480 qeth_get_channel_path_desc(card);
1485 card->info.type = QETH_CARD_TYPE_UNKNOWN;
1486 dev_err(&card->gdev->dev, "The adapter hardware is of an "
1494 struct qeth_card *card;
1497 card = CARD_FROM_CDEV(channel->ccwdev);
1498 QETH_CARD_TEXT(card, 3, "clearch");
1505 rc = wait_event_interruptible_timeout(card->wait_q,
1518 struct qeth_card *card;
1521 card = CARD_FROM_CDEV(channel->ccwdev);
1522 QETH_CARD_TEXT(card, 3, "haltch");
1529 rc = wait_event_interruptible_timeout(card->wait_q,
1538 static int qeth_halt_channels(struct qeth_card *card)
1542 QETH_CARD_TEXT(card, 3, "haltchs");
1543 rc1 = qeth_halt_channel(&card->read);
1544 rc2 = qeth_halt_channel(&card->write);
1545 rc3 = qeth_halt_channel(&card->data);
1553 static int qeth_clear_channels(struct qeth_card *card)
1557 QETH_CARD_TEXT(card, 3, "clearchs");
1558 rc1 = qeth_clear_channel(&card->read);
1559 rc2 = qeth_clear_channel(&card->write);
1560 rc3 = qeth_clear_channel(&card->data);
1568 static int qeth_clear_halt_card(struct qeth_card *card, int halt)
1572 QETH_CARD_TEXT(card, 3, "clhacrd");
1575 rc = qeth_halt_channels(card);
1578 return qeth_clear_channels(card);
1581 int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
1585 QETH_CARD_TEXT(card, 3, "qdioclr");
1586 switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED,
1589 if (card->info.type == QETH_CARD_TYPE_IQD)
1590 rc = qdio_shutdown(CARD_DDEV(card),
1593 rc = qdio_shutdown(CARD_DDEV(card),
1596 QETH_CARD_TEXT_(card, 3, "1err%d", rc);
1597 qdio_free(CARD_DDEV(card));
1598 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
1605 rc = qeth_clear_halt_card(card, use_halt);
1607 QETH_CARD_TEXT_(card, 3, "2err%d", rc);
1608 card->state = CARD_STATE_DOWN;
1613 static int qeth_read_conf_data(struct qeth_card *card, void **buffer,
1619 struct qeth_channel *channel = &card->data;
1643 wait_event(card->wait_q,
1661 static void qeth_configure_unitaddr(struct qeth_card *card, char *prcd)
1664 card->info.chpid = prcd[30];
1665 card->info.unit_addr2 = prcd[31];
1666 card->info.cula = prcd[63];
1667 card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
1671 static void qeth_configure_blkt_default(struct qeth_card *card, char *prcd)
1677 card->info.blkt.time_total = 250;
1678 card->info.blkt.inter_packet = 5;
1679 card->info.blkt.inter_packet_jumbo = 15;
1681 card->info.blkt.time_total = 0;
1682 card->info.blkt.inter_packet = 0;
1683 card->info.blkt.inter_packet_jumbo = 0;
1687 static void qeth_init_tokens(struct qeth_card *card)
1689 card->token.issuer_rm_w = 0x00010103UL;
1690 card->token.cm_filter_w = 0x00010108UL;
1691 card->token.cm_connection_w = 0x0001010aUL;
1692 card->token.ulp_filter_w = 0x0001010bUL;
1693 card->token.ulp_connection_w = 0x0001010dUL;
1696 static void qeth_init_func_level(struct qeth_card *card)
1698 switch (card->info.type) {
1700 card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
1704 card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD;
1718 struct qeth_card *card;
1721 card = CARD_FROM_CDEV(channel->ccwdev);
1728 wait_event(card->wait_q,
1740 wake_up(&card->wait_q);
1743 rc = wait_event_interruptible_timeout(card->wait_q,
1760 struct qeth_card *card;
1768 card = CARD_FROM_CDEV(channel->ccwdev);
1777 if (channel == &card->write) {
1780 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1781 card->seqno.trans_hdr++;
1785 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1787 tmp = ((__u8)card->info.portno) | 0x80;
1790 &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
1792 &card->info.func_level, sizeof(__u16));
1793 ccw_device_get_id(CARD_DDEV(card), &temp_devid);
1795 temp = (card->info.cula << 8) + card->info.unit_addr2;
1798 wait_event(card->wait_q,
1811 wake_up(&card->wait_q);
1814 rc = wait_event_interruptible_timeout(card->wait_q,
1842 struct qeth_card *card;
1851 card = CARD_FROM_CDEV(channel->ccwdev);
1855 dev_err(&card->write.ccwdev->dev,
1861 dev_name(&card->write.ccwdev->dev));
1865 if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1868 "0x%x)\n", dev_name(&card->write.ccwdev->dev),
1869 card->info.func_level, temp);
1880 struct qeth_card *card;
1889 card = CARD_FROM_CDEV(channel->ccwdev);
1890 if (qeth_check_idx_response(card, iob->data))
1896 dev_err(&card->write.ccwdev->dev,
1902 dev_err(&card->read.ccwdev->dev,
1909 dev_name(&card->read.ccwdev->dev));
1911 QETH_CARD_TEXT_(card, 2, "idxread%c",
1921 (card->info.type == QETH_CARD_TYPE_OSD))
1922 card->info.portname_required = 1;
1925 if (temp != qeth_peer_func_level(card->info.func_level)) {
1928 dev_name(&card->read.ccwdev->dev),
1929 card->info.func_level, temp);
1932 memcpy(&card->token.issuer_rm_r,
1935 memcpy(&card->info.mcl_level[0],
1942 void qeth_prepare_control_data(struct qeth_card *card, int len,
1945 qeth_setup_ccw(&card->write, iob->data, len);
1949 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1950 card->seqno.trans_hdr++;
1952 &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
1953 card->seqno.pdu_hdr++;
1955 &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
1960 int qeth_send_control_data(struct qeth_card *card, int len,
1972 QETH_CARD_TEXT(card, 2, "sendctl");
1974 if (card->read_or_write_problem) {
1978 reply = qeth_alloc_reply(card);
1984 if (card->state == CARD_STATE_DOWN)
1987 reply->seqno = card->seqno.ipa++;
1989 spin_lock_irqsave(&card->lock, flags);
1990 list_add_tail(&reply->list, &card->cmd_waiter_list);
1991 spin_unlock_irqrestore(&card->lock, flags);
1994 while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
1995 qeth_prepare_control_data(card, len, iob);
2003 QETH_CARD_TEXT(card, 6, "noirqpnd");
2004 spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
2005 rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
2007 spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
2011 dev_name(&card->write.ccwdev->dev), rc);
2012 QETH_CARD_TEXT_(card, 2, " err%d", rc);
2013 spin_lock_irqsave(&card->lock, flags);
2016 spin_unlock_irqrestore(&card->lock, flags);
2018 atomic_set(&card->write.irq_pending, 0);
2019 wake_up(&card->wait_q);
2047 spin_lock_irqsave(&reply->card->lock, flags);
2049 spin_unlock_irqrestore(&reply->card->lock, flags);
2052 atomic_set(&card->write.irq_pending, 0);
2054 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
2061 static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2069 memcpy(&card->token.cm_filter_r,
2076 static int qeth_cm_enable(struct qeth_card *card)
2083 iob = qeth_wait_for_buffer(&card->write);
2086 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2088 &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
2090 rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
2095 static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2104 memcpy(&card->token.cm_connection_r,
2111 static int qeth_cm_setup(struct qeth_card *card)
2118 iob = qeth_wait_for_buffer(&card->write);
2121 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2123 &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
2125 &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
2126 rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
2132 static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card)
2134 switch (card->info.type) {
2138 return card->info.max_mtu;
2140 switch (card->info.link_type) {
2171 static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
2173 switch (card->info.type) {
2179 (mtu <= card->info.max_mtu));
2187 static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2199 memcpy(&card->token.ulp_filter_r,
2202 if (card->info.type == QETH_CARD_TYPE_IQD) {
2210 if (card->info.initial_mtu && (card->info.initial_mtu != mtu)) {
2212 if (card->dev &&
2213 ((card->dev->mtu == card->info.initial_mtu) ||
2214 (card->dev->mtu > mtu)))
2215 card->dev->mtu = mtu;
2216 qeth_free_qdio_buffers(card);
2218 card->info.initial_mtu = mtu;
2219 card->info.max_mtu = mtu;
2220 card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
2222 card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
2223 card->info.max_mtu = *(__u16 *)QETH_ULP_ENABLE_RESP_MAX_MTU(
2225 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
2232 card->info.link_type = link_type;
2234 card->info.link_type = 0;
2235 QETH_DBF_TEXT_(SETUP, 2, "link%d", card->info.link_type);
2240 static int qeth_ulp_enable(struct qeth_card *card)
2249 iob = qeth_wait_for_buffer(&card->write);
2253 (__u8) card->info.portno;
2254 if (card->options.layer2)
2255 if (card->info.type == QETH_CARD_TYPE_OSN)
2264 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2266 &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
2268 card->info.portname, 9);
2269 rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
2275 static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2284 memcpy(&card->token.ulp_connection_r,
2290 dev_err(&card->gdev->dev, "A connection could not be "
2298 static int qeth_ulp_setup(struct qeth_card *card)
2307 iob = qeth_wait_for_buffer(&card->write);
2311 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2313 &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
2315 &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
2317 ccw_device_get_id(CARD_DDEV(card), &dev_id);
2319 temp = (card->info.cula << 8) + card->info.unit_addr2;
2321 rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
2347 QETH_CARD_TEXT_(q->card, 2, "nbs%d", bidx);
2348 QETH_CARD_TEXT_(q->card, 2, "%lx", (long) newbuf);
2349 QETH_CARD_TEXT_(q->card, 2, "%lx",
2357 static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2363 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
2367 card->qdio.in_q = kzalloc(sizeof(struct qeth_qdio_q),
2369 if (!card->qdio.in_q)
2372 QETH_DBF_HEX(SETUP, 2, &card->qdio.in_q, sizeof(void *));
2373 memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
2376 card->qdio.in_q->bufs[i].buffer =
2377 &card->qdio.in_q->qdio_bufs[i];
2378 card->qdio.in_q->bufs[i].rx_skb = NULL;
2381 if (qeth_alloc_buffer_pool(card))
2385 card->qdio.out_qs =
2386 kzalloc(card->qdio.no_out_queues *
2388 if (!card->qdio.out_qs)
2390 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2391 card->qdio.out_qs[i] = kzalloc(sizeof(struct qeth_qdio_out_q),
2393 if (!card->qdio.out_qs[i])
2396 QETH_DBF_HEX(SETUP, 2, &card->qdio.out_qs[i], sizeof(void *));
2397 card->qdio.out_qs[i]->queue_no = i;
2400 BUG_ON(card->qdio.out_qs[i]->bufs[j] != NULL);
2401 if (qeth_init_qdio_out_buf(card->qdio.out_qs[i], j))
2407 if (qeth_alloc_cq(card))
2416 card->qdio.out_qs[i]->bufs[j]);
2417 card->qdio.out_qs[i]->bufs[j] = NULL;
2421 kfree(card->qdio.out_qs[--i]);
2422 qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
2424 kfree(card->qdio.out_qs);
2425 card->qdio.out_qs = NULL;
2427 qeth_free_buffer_pool(card);
2429 kfree(card->qdio.in_q);
2430 card->qdio.in_q = NULL;
2432 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
2436 static void qeth_create_qib_param_field(struct qeth_card *card,
2444 *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
2445 *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
2446 *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
2449 static void qeth_create_qib_param_field_blkt(struct qeth_card *card,
2456 *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
2457 *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
2459 card->info.blkt.inter_packet_jumbo;
2462 static int qeth_qdio_activate(struct qeth_card *card)
2465 return qdio_activate(CARD_DDEV(card));
2468 static int qeth_dm_act(struct qeth_card *card)
2475 iob = qeth_wait_for_buffer(&card->write);
2479 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2481 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2482 rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
2486 static int qeth_mpc_initialize(struct qeth_card *card)
2492 rc = qeth_issue_next_read(card);
2497 rc = qeth_cm_enable(card);
2502 rc = qeth_cm_setup(card);
2507 rc = qeth_ulp_enable(card);
2512 rc = qeth_ulp_setup(card);
2517 rc = qeth_alloc_qdio_buffers(card);
2522 rc = qeth_qdio_establish(card);
2525 qeth_free_qdio_buffers(card);
2528 rc = qeth_qdio_activate(card);
2533 rc = qeth_dm_act(card);
2541 qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
2545 static void qeth_print_status_with_portname(struct qeth_card *card)
2550 sprintf(dbf_text, "%s", card->info.portname + 1);
2555 dev_info(&card->gdev->dev, "Device is a%s card%s%s%s\n"
2557 qeth_get_cardname(card),
2558 (card->info.mcl_level[0]) ? " (level: " : "",
2559 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2560 (card->info.mcl_level[0]) ? ")" : "",
2561 qeth_get_cardname_short(card),
2566 static void qeth_print_status_no_portname(struct qeth_card *card)
2568 if (card->info.portname[0])
2569 dev_info(&card->gdev->dev, "Device is a%s "
2570 "card%s%s%s\nwith link type %s "
2572 qeth_get_cardname(card),
2573 (card->info.mcl_level[0]) ? " (level: " : "",
2574 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2575 (card->info.mcl_level[0]) ? ")" : "",
2576 qeth_get_cardname_short(card));
2578 dev_info(&card->gdev->dev, "Device is a%s "
2579 "card%s%s%s\nwith link type %s.\n",
2580 qeth_get_cardname(card),
2581 (card->info.mcl_level[0]) ? " (level: " : "",
2582 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2583 (card->info.mcl_level[0]) ? ")" : "",
2584 qeth_get_cardname_short(card));
2587 void qeth_print_status_message(struct qeth_card *card)
2589 switch (card->info.type) {
2597 if (!card->info.mcl_level[0]) {
2598 sprintf(card->info.mcl_level, "%02x%02x",
2599 card->info.mcl_level[2],
2600 card->info.mcl_level[3]);
2602 card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2607 if ((card->info.guestlan) ||
2608 (card->info.mcl_level[0] & 0x80)) {
2609 card->info.mcl_level[0] = (char) _ebcasc[(__u8)
2610 card->info.mcl_level[0]];
2611 card->info.mcl_level[1] = (char) _ebcasc[(__u8)
2612 card->info.mcl_level[1]];
2613 card->info.mcl_level[2] = (char) _ebcasc[(__u8)
2614 card->info.mcl_level[2]];
2615 card->info.mcl_level[3] = (char) _ebcasc[(__u8)
2616 card->info.mcl_level[3]];
2617 card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2621 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
2623 if (card->info.portname_required)
2624 qeth_print_status_with_portname(card);
2626 qeth_print_status_no_portname(card);
2630 static void qeth_initialize_working_pool_list(struct qeth_card *card)
2634 QETH_CARD_TEXT(card, 5, "inwrklst");
2637 &card->qdio.init_pool.entry_list, init_list) {
2638 qeth_put_buffer_pool_entry(card, entry);
2643 struct qeth_card *card)
2650 if (list_empty(&card->qdio.in_buf_pool.entry_list))
2653 list_for_each(plh, &card->qdio.in_buf_pool.entry_list) {
2656 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2669 entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
2671 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2679 if (card->options.performance_stats)
2680 card->perf_stats.sg_alloc_page_rx++;
2688 static int qeth_init_input_buffer(struct qeth_card *card,
2694 if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) {
2700 pool_entry = qeth_find_free_buffer_pool_entry(card);
2712 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2715 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2724 int qeth_init_qdio_queues(struct qeth_card *card)
2732 memset(card->qdio.in_q->qdio_bufs, 0,
2734 qeth_initialize_working_pool_list(card);
2736 for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
2737 qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
2738 card->qdio.in_q->next_buf_to_init =
2739 card->qdio.in_buf_pool.buf_count - 1;
2740 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
2741 card->qdio.in_buf_pool.buf_count - 1);
2748 rc = qeth_cq_init(card);
2754 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2755 memset(card->qdio.out_qs[i]->qdio_bufs, 0,
2758 qeth_clear_output_buffer(card->qdio.out_qs[i],
2759 card->qdio.out_qs[i]->bufs[j],
2762 card->qdio.out_qs[i]->card = card;
2763 card->qdio.out_qs[i]->next_buf_to_fill = 0;
2764 card->qdio.out_qs[i]->do_pack = 0;
2765 atomic_set(&card->qdio.out_qs[i]->used_buffers, 0);
2766 atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
2767 atomic_set(&card->qdio.out_qs[i]->state,
2784 static void qeth_fill_ipacmd_header(struct qeth_card *card,
2791 cmd->hdr.seqno = card->seqno.ipa;
2792 cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
2793 cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
2794 if (card->options.layer2)
2804 struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card,
2810 iob = qeth_wait_for_buffer(&card->write);
2812 qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
2818 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2824 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2828 int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2836 QETH_CARD_TEXT(card, 4, "sendipa");
2838 if (card->options.layer2)
2839 if (card->info.type == QETH_CARD_TYPE_OSN)
2845 qeth_prepare_ipa_cmd(card, iob, prot_type);
2846 rc = qeth_send_control_data(card, IPA_CMD_LENGTH,
2849 qeth_clear_ipacmd_list(card);
2850 qeth_schedule_recovery(card);
2856 int qeth_send_startlan(struct qeth_card *card)
2863 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2864 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2869 int qeth_default_setadapterparms_cb(struct qeth_card *card,
2874 QETH_CARD_TEXT(card, 4, "defadpcb");
2884 static int qeth_query_setadapterparms_cb(struct qeth_card *card,
2889 QETH_CARD_TEXT(card, 3, "quyadpcb");
2893 card->info.link_type =
2895 QETH_DBF_TEXT_(SETUP, 2, "lnk %d", card->info.link_type);
2897 card->options.adp.supported_funcs =
2899 return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
2902 struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
2908 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS,
2920 int qeth_query_setadapterparms(struct qeth_card *card)
2925 QETH_CARD_TEXT(card, 3, "queryadp");
2926 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
2928 rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
2933 static int qeth_query_ipassists_cb(struct qeth_card *card,
2942 card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
2943 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
2945 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
2946 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
2954 int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
2960 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
2961 rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
2966 static int qeth_query_setdiagass_cb(struct qeth_card *card,
2975 QETH_CARD_TEXT_(card, 2, "diagq:%x", rc);
2977 card->info.diagass_support = cmd->data.diagass.ext;
2981 static int qeth_query_setdiagass(struct qeth_card *card)
2987 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
2991 return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
2994 static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
3002 tid->chpid = card->info.chpid;
3003 ccw_device_get_id(CARD_RDEV(card), &ccwid);
3026 static int qeth_hw_trap_cb(struct qeth_card *card,
3035 QETH_CARD_TEXT_(card, 2, "trapc:%x", rc);
3039 int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
3045 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
3056 qeth_get_trap_id(card,
3065 return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
3069 int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
3073 QETH_CARD_TEXT(card, 2, dbftext);
3074 QETH_CARD_TEXT_(card, 2, " F15=%02X",
3076 QETH_CARD_TEXT_(card, 2, " F14=%02X",
3078 QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
3080 card->stats.rx_dropped++;
3091 struct qeth_card *card = container_of(work, struct qeth_card,
3094 QETH_CARD_TEXT_(card, 2, "brw:%x", card->reclaim_index);
3095 qeth_queue_input_buffer(card, card->reclaim_index);
3098 void qeth_queue_input_buffer(struct qeth_card *card, int index)
3100 struct qeth_qdio_q *queue = card->qdio.in_q;
3108 card->qdio.in_buf_pool.buf_count -
3110 card->qdio.in_buf_pool.buf_count -
3113 if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) {
3116 if (qeth_init_input_buffer(card,
3127 atomic_set(&card->force_alloc_skb, 3);
3130 atomic_add_unless(&card->force_alloc_skb, -1, 0);
3135 list_for_each(lh, &card->qdio.in_buf_pool.entry_list)
3137 if (i == card->qdio.in_buf_pool.buf_count) {
3138 QETH_CARD_TEXT(card, 2, "qsarbw");
3139 card->reclaim_index = index;
3141 &card->buffer_reclaim_work,
3154 if (card->options.performance_stats) {
3155 card->perf_stats.inbound_do_qdio_cnt++;
3156 card->perf_stats.inbound_do_qdio_start_time =
3159 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0,
3161 if (card->options.performance_stats)
3162 card->perf_stats.inbound_do_qdio_time +=
3164 card->perf_stats.inbound_do_qdio_start_time;
3166 QETH_CARD_TEXT(card, 2, "qinberr");
3174 static int qeth_handle_send_error(struct qeth_card *card,
3179 QETH_CARD_TEXT(card, 6, "hdsnderr");
3180 if (card->info.type == QETH_CARD_TYPE_IQD) {
3187 qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr");
3195 QETH_CARD_TEXT(card, 1, "lnkfail");
3196 QETH_CARD_TEXT_(card, 1, "%04x %02x",
3211 QETH_CARD_TEXT(queue->card, 6, "np->pack");
3212 if (queue->card->options.performance_stats)
3213 queue->card->perf_stats.sc_dp_p++;
3234 QETH_CARD_TEXT(queue->card, 6, "pack->np");
3235 if (queue->card->options.performance_stats)
3236 queue->card->perf_stats.sc_p_dp++;
3294 if (queue->card->info.type == QETH_CARD_TYPE_IQD)
3323 queue->card->dev->trans_start = jiffies;
3324 if (queue->card->options.performance_stats) {
3325 queue->card->perf_stats.outbound_do_qdio_cnt++;
3326 queue->card->perf_stats.outbound_do_qdio_start_time =
3332 rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
3334 if (queue->card->options.performance_stats)
3335 queue->card->perf_stats.outbound_do_qdio_time +=
3337 queue->card->perf_stats.outbound_do_qdio_start_time;
3340 queue->card->stats.tx_errors += count;
3344 QETH_CARD_TEXT(queue->card, 2, "flushbuf");
3345 QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
3346 QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
3347 QETH_CARD_TEXT_(queue->card, 2, " c%d", count);
3348 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc);
3352 qeth_schedule_recovery(queue->card);
3355 if (queue->card->options.performance_stats)
3356 queue->card->perf_stats.bufs_sent += count;
3378 netif_stop_queue(queue->card->dev);
3388 if (queue->card->options.performance_stats &&
3390 queue->card->perf_stats.bufs_sent_pack +=
3402 struct qeth_card *card = (struct qeth_card *)card_ptr;
3404 if (card->dev && (card->dev->flags & IFF_UP))
3405 napi_schedule(&card->napi);
3409 int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
3413 if (card->options.cq == QETH_CQ_NOTAVAILABLE) {
3417 if (card->options.cq == cq) {
3422 if (card->state != CARD_STATE_DOWN &&
3423 card->state != CARD_STATE_RECOVER) {
3428 qeth_free_qdio_buffers(card);
3429 card->options.cq = cq;
3439 static void qeth_qdio_cq_handler(struct qeth_card *card,
3442 struct qeth_qdio_q *cq = card->qdio.c_q;
3446 if (!qeth_is_cq(card, queue))
3449 QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element);
3450 QETH_CARD_TEXT_(card, 5, "qcqhc%d", count);
3451 QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err);
3454 netif_stop_queue(card->dev);
3455 qeth_schedule_recovery(card);
3459 if (card->options.performance_stats) {
3460 card->perf_stats.cq_cnt++;
3461 card->perf_stats.cq_start_time = qeth_get_micros();
3474 qeth_qdio_handle_aob(card, phys_aob_addr);
3486 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue,
3487 card->qdio.c_q->next_buf_to_init,
3490 dev_warn(&card->gdev->dev,
3492 QETH_CARD_TEXT(card, 2, "qcqherr");
3494 card->qdio.c_q->next_buf_to_init = (card->qdio.c_q->next_buf_to_init
3497 netif_wake_queue(card->dev);
3499 if (card->options.performance_stats) {
3501 delta_t -= card->perf_stats.cq_start_time;
3502 card->perf_stats.cq_time += delta_t;
3512 struct qeth_card *card = (struct qeth_card *)card_ptr;
3514 QETH_CARD_TEXT_(card, 2, "qihq%d", queue);
3515 QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err);
3517 if (qeth_is_cq(card, queue))
3518 qeth_qdio_cq_handler(card, qdio_err, queue, first_elem, count);
3520 qeth_schedule_recovery(card);
3530 struct qeth_card *card = (struct qeth_card *) card_ptr;
3531 struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
3535 QETH_CARD_TEXT(card, 6, "qdouhdl");
3537 QETH_CARD_TEXT(card, 2, "achkcond");
3538 netif_stop_queue(card->dev);
3539 qeth_schedule_recovery(card);
3542 if (card->options.performance_stats) {
3543 card->perf_stats.outbound_handler_cnt++;
3544 card->perf_stats.outbound_handler_start_time =
3550 qeth_handle_send_error(card, buffer, qdio_error);
3555 BUG_ON(card->options.cq != QETH_CQ_ENABLED);
3565 QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx);
3566 QETH_CARD_TEXT(queue->card, 5, "aob");
3567 QETH_CARD_TEXT_(queue->card, 5, "%lx",
3571 QETH_CARD_TEXT(card, 2, "outofbuf");
3572 qeth_schedule_recovery(card);
3575 if (card->options.cq == QETH_CQ_ENABLED) {
3590 if (card->info.type != QETH_CARD_TYPE_IQD)
3593 netif_wake_queue(queue->card->dev);
3594 if (card->options.performance_stats)
3595 card->perf_stats.outbound_handler_time += qeth_get_micros() -
3596 card->perf_stats.outbound_handler_start_time;
3600 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
3603 if (!ipv && (card->info.type == QETH_CARD_TYPE_OSD ||
3604 card->info.type == QETH_CARD_TYPE_OSX))
3605 return card->qdio.default_out_queue;
3606 switch (card->qdio.no_out_queues) {
3608 if (cast_type && card->info.is_multicast_different)
3609 return card->info.is_multicast_different &
3610 (card->qdio.no_out_queues - 1);
3611 if (card->qdio.do_prio_queueing && (ipv == 4)) {
3614 if (card->qdio.do_prio_queueing ==
3625 if (card->qdio.do_prio_queueing ==
3628 } else if (card->qdio.do_prio_queueing && (ipv == 6)) {
3631 return card->qdio.default_out_queue;
3634 return card->qdio.default_out_queue;
3639 int qeth_get_elements_no(struct qeth_card *card, void *hdr,
3647 if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)) {
3785 QETH_CARD_TEXT(queue->card, 6, "fillbfnp");
3790 QETH_CARD_TEXT(queue->card, 6, "fillbfpa");
3791 if (queue->card->options.performance_stats)
3792 queue->card->perf_stats.skbs_sent_pack++;
3794 QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
3806 int qeth_do_send_packet_fast(struct qeth_card *card,
3838 int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
3867 if ((QETH_MAX_BUFFER_ELEMENTS(card) -
3917 if (queue->card->options.performance_stats && do_pack)
3918 queue->card->perf_stats.bufs_sent_pack += flush_count;
3924 static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
3930 QETH_CARD_TEXT(card, 4, "prmadpcb");
3935 qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
3937 QETH_CARD_TEXT_(card, 4, "prmrc%2.2x", cmd->hdr.return_code);
3940 card->info.promisc_mode = setparms->data.mode;
3944 void qeth_setadp_promisc_mode(struct qeth_card *card)
3947 struct net_device *dev = card->dev;
3951 QETH_CARD_TEXT(card, 4, "setprom");
3954 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
3956 (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
3961 QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
3963 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
3967 qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
3973 struct qeth_card *card;
3976 card = dev->ml_priv;
3978 QETH_CARD_TEXT(card, 4, "chgmtu");
3980 QETH_CARD_TEXT(card, 4, dbf_text);
3986 if ((!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) &&
3987 (!qeth_mtu_is_valid(card, new_mtu)))
3996 struct qeth_card *card;
3998 card = dev->ml_priv;
4000 QETH_CARD_TEXT(card, 5, "getstat");
4002 return &card->stats;
4006 static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
4011 QETH_CARD_TEXT(card, 4, "chgmaccb");
4014 if (!card->options.layer2 ||
4015 !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
4016 memcpy(card->dev->dev_addr,
4019 card->info.mac_bits |= QETH_LAYER2_MAC_READ;
4021 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4025 int qeth_setadpparms_change_macaddr(struct qeth_card *card)
4031 QETH_CARD_TEXT(card, 4, "chgmac");
4033 iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS,
4039 card->dev->dev_addr, OSA_ADDR_LEN);
4040 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
4046 static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
4052 QETH_CARD_TEXT(card, 4, "setaccb");
4057 QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
4065 card->options.isolation = access_ctrl_req->subcmd_code;
4066 if (card->options.isolation == ISOLATION_MODE_NONE) {
4067 dev_info(&card->gdev->dev,
4070 dev_info(&card->gdev->dev,
4074 card->gdev->dev.kobj.name,
4082 card->gdev->dev.kobj.name,
4085 dev_err(&card->gdev->dev, "Adapter does not "
4089 card->options.isolation = ISOLATION_MODE_NONE;
4095 card->gdev->dev.kobj.name,
4098 dev_err(&card->gdev->dev,
4103 card->options.isolation = ISOLATION_MODE_NONE;
4109 card->gdev->dev.kobj.name,
4112 dev_err(&card->gdev->dev,
4116 card->options.isolation = ISOLATION_MODE_NONE;
4124 card->gdev->dev.kobj.name,
4129 card->options.isolation = ISOLATION_MODE_NONE;
4133 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4137 static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
4145 QETH_CARD_TEXT(card, 4, "setacctl");
4148 QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
4150 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL,
4157 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb,
4163 int qeth_set_access_ctrl_online(struct qeth_card *card)
4167 QETH_CARD_TEXT(card, 4, "setactlo");
4169 if ((card->info.type == QETH_CARD_TYPE_OSD ||
4170 card->info.type == QETH_CARD_TYPE_OSX) &&
4171 qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) {
4172 rc = qeth_setadpparms_set_access_ctrl(card,
4173 card->options.isolation);
4177 card->gdev->dev.kobj.name,
4180 } else if (card->options.isolation != ISOLATION_MODE_NONE) {
4181 card->options.isolation = ISOLATION_MODE_NONE;
4183 dev_err(&card->gdev->dev, "Adapter does not "
4193 struct qeth_card *card;
4195 card = dev->ml_priv;
4196 QETH_CARD_TEXT(card, 4, "txtimeo");
4197 card->stats.tx_errors++;
4198 qeth_schedule_recovery(card);
4204 struct qeth_card *card = dev->ml_priv;
4210 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
4211 (card->info.link_type != QETH_LINK_TYPE_OSN) &&
4212 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH))
4244 rc = card->stats.rx_errors;
4267 static int qeth_send_ipa_snmp_cmd(struct qeth_card *card,
4275 QETH_CARD_TEXT(card, 4, "sendsnmp");
4279 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
4287 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob,
4291 static int qeth_snmp_command_cb(struct qeth_card *card,
4300 QETH_CARD_TEXT(card, 3, "snpcmdcb");
4308 QETH_CARD_TEXT_(card, 4, "scer1%i", cmd->hdr.return_code);
4314 QETH_CARD_TEXT_(card, 4, "scer2%i", cmd->hdr.return_code);
4325 QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOMEM);
4329 QETH_CARD_TEXT_(card, 4, "snore%i",
4331 QETH_CARD_TEXT_(card, 4, "sseqn%i",
4345 QETH_CARD_TEXT_(card, 4, "srtot%i",
4347 QETH_CARD_TEXT_(card, 4, "srseq%i",
4355 int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4364 QETH_CARD_TEXT(card, 3, "snmpcmd");
4366 if (card->info.guestlan)
4369 if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) &&
4370 (!card->options.layer2)) {
4378 QETH_CARD_TEXT(card, 2, "snmpnome");
4389 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL,
4393 rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
4397 QETH_CARD_IFNAME(card), rc);
4409 static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
4417 QETH_CARD_TEXT(card, 3, "qoatcb");
4439 int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
4449 QETH_CARD_TEXT(card, 3, "qoatcmd");
4451 if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) {
4470 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT,
4477 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb,
4507 static inline int qeth_get_qdio_q_format(struct qeth_card *card)
4509 switch (card->info.type) {
4517 static void qeth_determine_capabilities(struct qeth_card *card)
4526 ddev = CARD_DDEV(card);
4536 rc = qeth_read_conf_data(card, (void **) &prcd, &length);
4539 dev_name(&card->gdev->dev), rc);
4543 qeth_configure_unitaddr(card, prcd);
4545 qeth_configure_blkt_default(card, prcd);
4548 rc = qdio_get_ssqd_desc(ddev, &card->ssqd);
4552 QETH_DBF_TEXT_(SETUP, 2, "qfmt%d", card->ssqd.qfmt);
4553 QETH_DBF_TEXT_(SETUP, 2, "%d", card->ssqd.qdioac1);
4554 QETH_DBF_TEXT_(SETUP, 2, "%d", card->ssqd.qdioac3);
4555 QETH_DBF_TEXT_(SETUP, 2, "icnt%d", card->ssqd.icnt);
4556 if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) ||
4557 ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) ||
4558 ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) {
4559 dev_info(&card->gdev->dev,
4562 card->options.cq = QETH_CQ_NOTAVAILABLE;
4573 static inline void qeth_qdio_establish_cq(struct qeth_card *card,
4578 if (card->options.cq == QETH_CQ_ENABLED) {
4580 (card->qdio.no_in_queues - 1);
4581 i = QDIO_MAX_BUFFERS_PER_Q * (card->qdio.no_in_queues - 1);
4584 virt_to_phys(card->qdio.c_q->bufs[i].buffer);
4587 queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
4591 static int qeth_qdio_establish(struct qeth_card *card)
4610 qeth_create_qib_param_field(card, qib_param_field);
4611 qeth_create_qib_param_field_blkt(card, qib_param_field);
4613 in_sbal_ptrs = kzalloc(card->qdio.no_in_queues *
4622 virt_to_phys(card->qdio.in_q->bufs[i].buffer);
4625 queue_start_poll = kzalloc(sizeof(void *) * card->qdio.no_in_queues,
4631 for (i = 0; i < card->qdio.no_in_queues; ++i)
4632 queue_start_poll[i] = card->discipline.start_poll;
4634 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
4637 kzalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
4643 for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
4646 card->qdio.out_qs[i]->bufs[j]->buffer);
4650 init_data.cdev = CARD_DDEV(card);
4651 init_data.q_format = qeth_get_qdio_q_format(card);
4654 init_data.no_input_qs = card->qdio.no_in_queues;
4655 init_data.no_output_qs = card->qdio.no_out_queues;
4656 init_data.input_handler = card->discipline.input_handler;
4657 init_data.output_handler = card->discipline.output_handler;
4659 init_data.int_parm = (unsigned long) card;
4662 init_data.output_sbal_state_array = card->qdio.out_bufstates;
4664 (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32;
4666 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
4670 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
4675 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
4676 qdio_free(CARD_DDEV(card));
4680 switch (card->options.cq) {
4682 dev_info(&card->gdev->dev, "Completion Queue support enabled");
4685 dev_info(&card->gdev->dev, "Completion Queue support disabled");
4702 static void qeth_core_free_card(struct qeth_card *card)
4706 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
4707 qeth_clean_channel(&card->read);
4708 qeth_clean_channel(&card->write);
4709 if (card->dev)
4710 free_netdev(card->dev);
4711 kfree(card->ip_tbd_list);
4712 qeth_free_qdio_buffers(card);
4713 unregister_service_level(&card->qeth_service_level);
4714 kfree(card);
4749 int qeth_core_hardsetup_card(struct qeth_card *card)
4755 atomic_set(&card->force_alloc_skb, 0);
4756 qeth_get_channel_path_desc(card);
4760 dev_name(&card->gdev->dev));
4761 ccw_device_set_offline(CARD_DDEV(card));
4762 ccw_device_set_offline(CARD_WDEV(card));
4763 ccw_device_set_offline(CARD_RDEV(card));
4764 rc = ccw_device_set_online(CARD_RDEV(card));
4767 rc = ccw_device_set_online(CARD_WDEV(card));
4770 rc = ccw_device_set_online(CARD_DDEV(card));
4773 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
4785 qeth_determine_capabilities(card);
4786 qeth_init_tokens(card);
4787 qeth_init_func_level(card);
4788 rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
4799 rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
4810 card->read_or_write_problem = 0;
4811 rc = qeth_mpc_initialize(card);
4817 card->options.ipa4.supported_funcs = 0;
4818 card->options.adp.supported_funcs = 0;
4819 card->info.diagass_support = 0;
4820 qeth_query_ipassists(card, QETH_PROT_IPV4);
4821 if (qeth_is_supported(card, IPA_SETADAPTERPARMS))
4822 qeth_query_setadapterparms(card);
4823 if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST))
4824 qeth_query_setdiagass(card);
4827 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
4830 dev_name(&card->gdev->dev), rc);
4880 struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4914 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) ||
4915 (card->info.link_type == QETH_LINK_TYPE_HSTR))
4931 if (((skb_len >= card->options.rx_sg_cb) &&
4932 (!(card->info.type == QETH_CARD_TYPE_OSN)) &&
4933 (!atomic_read(&card->force_alloc_skb))) ||
4934 (card->options.cq == QETH_CQ_ENABLED)) {
4960 QETH_CARD_TEXT(card, 4, "unexeob");
4961 QETH_CARD_HEX(card, 2, buffer, sizeof(void *));
4963 card->stats.rx_errors++;
4975 if (use_rx_sg && card->options.performance_stats) {
4976 card->perf_stats.sg_skbs_rx++;
4977 card->perf_stats.sg_frags_rx += skb_shinfo(skb)->nr_frags;
4982 QETH_CARD_TEXT(card, 2, "noskbmem");
4984 card->stats.rx_dropped++;
5042 int qeth_core_load_discipline(struct qeth_card *card,
5049 card->discipline.ccwgdriver = try_then_request_module(
5054 card->discipline.ccwgdriver = try_then_request_module(
5059 if (!card->discipline.ccwgdriver) {
5060 dev_err(&card->gdev->dev, "There is no kernel module to "
5068 void qeth_core_free_discipline(struct qeth_card *card)
5070 if (card->options.layer2)
5074 card->discipline.ccwgdriver = NULL;
5079 struct qeth_card *card;
5093 card = qeth_alloc_card();
5094 if (!card) {
5102 card->debug = debug_register(dbf_name, 2, 1, 8);
5103 if (!card->debug) {
5108 debug_register_view(card->debug, &debug_hex_ascii_view);
5110 card->read.ccwdev = gdev->cdev[0];
5111 card->write.ccwdev = gdev->cdev[1];
5112 card->data.ccwdev = gdev->cdev[2];
5113 dev_set_drvdata(&gdev->dev, card);
5114 card->gdev = gdev;
5119 rc = qeth_determine_card_type(card);
5124 rc = qeth_setup_card(card);
5130 if (card->info.type == QETH_CARD_TYPE_OSN)
5136 switch (card->info.type) {
5139 rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2);
5142 rc = card->discipline.ccwgdriver->probe(card->gdev);
5152 list_add_tail(&card->list, &qeth_core_card_list.list);
5155 qeth_determine_capabilities(card);
5159 qeth_core_free_discipline(card);
5161 if (card->info.type == QETH_CARD_TYPE_OSN)
5166 debug_unregister(card->debug);
5168 qeth_core_free_card(card);
5177 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5181 if (card->info.type == QETH_CARD_TYPE_OSN) {
5187 if (card->discipline.ccwgdriver) {
5188 card->discipline.ccwgdriver->remove(gdev);
5189 qeth_core_free_discipline(card);
5192 debug_unregister(card->debug);
5194 list_del(&card->list);
5196 qeth_core_free_card(card);
5204 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5208 if (!card->discipline.ccwgdriver) {
5209 if (card->info.type == QETH_CARD_TYPE_IQD)
5213 rc = qeth_core_load_discipline(card, def_discipline);
5216 rc = card->discipline.ccwgdriver->probe(card->gdev);
5220 rc = card->discipline.ccwgdriver->set_online(gdev);
5227 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5228 return card->discipline.ccwgdriver->set_offline(gdev);
5233 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5234 if (card->discipline.ccwgdriver &&
5235 card->discipline.ccwgdriver->shutdown)
5236 card->discipline.ccwgdriver->shutdown(gdev);
5241 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5242 if (card->discipline.ccwgdriver &&
5243 card->discipline.ccwgdriver->prepare)
5244 return card->discipline.ccwgdriver->prepare(gdev);
5250 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5251 if (card->discipline.ccwgdriver &&
5252 card->discipline.ccwgdriver->complete)
5253 card->discipline.ccwgdriver->complete(gdev);
5258 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5259 if (card->discipline.ccwgdriver &&
5260 card->discipline.ccwgdriver->freeze)
5261 return card->discipline.ccwgdriver->freeze(gdev);
5267 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5268 if (card->discipline.ccwgdriver &&
5269 card->discipline.ccwgdriver->thaw)
5270 return card->discipline.ccwgdriver->thaw(gdev);
5276 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5277 if (card->discipline.ccwgdriver &&
5278 card->discipline.ccwgdriver->restore)
5279 return card->discipline.ccwgdriver->restore(gdev);
5372 struct qeth_card *card = dev->ml_priv;
5373 data[0] = card->stats.rx_packets -
5374 card->perf_stats.initial_rx_packets;
5375 data[1] = card->perf_stats.bufs_rec;
5376 data[2] = card->stats.tx_packets -
5377 card->perf_stats.initial_tx_packets;
5378 data[3] = card->perf_stats.bufs_sent;
5379 data[4] = card->stats.tx_packets - card->perf_stats.initial_tx_packets
5380 - card->perf_stats.skbs_sent_pack;
5381 data[5] = card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack;
5382 data[6] = card->perf_stats.skbs_sent_pack;
5383 data[7] = card->perf_stats.bufs_sent_pack;
5384 data[8] = card->perf_stats.sg_skbs_sent;
5385 data[9] = card->perf_stats.sg_frags_sent;
5386 data[10] = card->perf_stats.sg_skbs_rx;
5387 data[11] = card->perf_stats.sg_frags_rx;
5388 data[12] = card->perf_stats.sg_alloc_page_rx;
5389 data[13] = (card->perf_stats.large_send_bytes >> 10);
5390 data[14] = card->perf_stats.large_send_cnt;
5391 data[15] = card->perf_stats.sc_dp_p;
5392 data[16] = card->perf_stats.sc_p_dp;
5395 data[19] = atomic_read(&card->qdio.out_qs[0]->used_buffers);
5396 data[20] = (card->qdio.no_out_queues > 1) ?
5397 atomic_read(&card->qdio.out_qs[1]->used_buffers) : 0;
5398 data[21] = (card->qdio.no_out_queues > 2) ?
5399 atomic_read(&card->qdio.out_qs[2]->used_buffers) : 0;
5400 data[22] = (card->qdio.no_out_queues > 3) ?
5401 atomic_read(&card->qdio.out_qs[3]->used_buffers) : 0;
5402 data[23] = card->perf_stats.inbound_time;
5403 data[24] = card->perf_stats.inbound_cnt;
5404 data[25] = card->perf_stats.inbound_do_qdio_time;
5405 data[26] = card->perf_stats.inbound_do_qdio_cnt;
5406 data[27] = card->perf_stats.outbound_handler_time;
5407 data[28] = card->perf_stats.outbound_handler_cnt;
5408 data[29] = card->perf_stats.outbound_time;
5409 data[30] = card->perf_stats.outbound_cnt;
5410 data[31] = card->perf_stats.outbound_do_qdio_time;
5411 data[32] = card->perf_stats.outbound_do_qdio_cnt;
5412 data[33] = card->perf_stats.tx_csum;
5413 data[34] = card->perf_stats.tx_lin;
5414 data[35] = card->perf_stats.cq_cnt;
5415 data[36] = card->perf_stats.cq_time;
5436 struct qeth_card *card = dev->ml_priv;
5437 if (card->options.layer2)
5443 strcpy(info->fw_version, card->info.mcl_level);
5445 CARD_RDEV_ID(card),
5446 CARD_WDEV_ID(card),
5447 CARD_DDEV_ID(card));
5454 struct qeth_card *card = netdev->ml_priv;
5457 if ((card->info.type == QETH_CARD_TYPE_IQD) || (card->info.guestlan))
5460 link_type = card->info.link_type;