• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/s390/net/

Lines Matching refs:card

60 static inline const char *qeth_get_cardname(struct qeth_card *card)
62 if (card->info.guestlan) {
63 switch (card->info.type) {
76 switch (card->info.type) {
95 const char *qeth_get_cardname_short(struct qeth_card *card)
97 if (card->info.guestlan) {
98 switch (card->info.type) {
111 switch (card->info.type) {
113 switch (card->info.link_type) {
148 void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
153 spin_lock_irqsave(&card->thread_mask_lock, flags);
154 card->thread_allowed_mask = threads;
156 card->thread_start_mask &= threads;
157 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
158 wake_up(&card->wait_q);
162 int qeth_threads_running(struct qeth_card *card, unsigned long threads)
167 spin_lock_irqsave(&card->thread_mask_lock, flags);
168 rc = (card->thread_running_mask & threads);
169 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
174 int qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
176 return wait_event_interruptible(card->wait_q,
177 qeth_threads_running(card, threads) == 0);
181 void qeth_clear_working_pool_list(struct qeth_card *card)
185 QETH_CARD_TEXT(card, 5, "clwrklst");
187 &card->qdio.in_buf_pool.entry_list, list){
193 static int qeth_alloc_buffer_pool(struct qeth_card *card)
199 QETH_CARD_TEXT(card, 5, "alocpool");
200 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) {
203 qeth_free_buffer_pool(card);
206 for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) {
213 qeth_free_buffer_pool(card);
219 &card->qdio.init_pool.entry_list);
224 int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
226 QETH_CARD_TEXT(card, 2, "realcbp");
228 if ((card->state != CARD_STATE_DOWN) &&
229 (card->state != CARD_STATE_RECOVER))
232 /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
233 qeth_clear_working_pool_list(card);
234 qeth_free_buffer_pool(card);
235 card->qdio.in_buf_pool.buf_count = bufcnt;
236 card->qdio.init_pool.buf_count = bufcnt;
237 return qeth_alloc_buffer_pool(card);
241 static int qeth_issue_next_read(struct qeth_card *card)
246 QETH_CARD_TEXT(card, 5, "issnxrd");
247 if (card->read.state != CH_STATE_UP)
249 iob = qeth_get_buffer(&card->read);
251 dev_warn(&card->gdev->dev, "The qeth device driver "
254 "available\n", dev_name(&card->gdev->dev));
257 qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
258 QETH_CARD_TEXT(card, 6, "noirqpnd");
259 rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
263 "rc=%i\n", dev_name(&card->gdev->dev), rc);
264 atomic_set(&card->read.irq_pending, 0);
265 card->read_or_write_problem = 1;
266 qeth_schedule_recovery(card);
267 wake_up(&card->wait_q);
272 static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
280 reply->card = card;
299 struct qeth_card *card)
306 ipa_name, com, QETH_CARD_IFNAME(card),
310 ipa_name, com, QETH_CARD_IFNAME(card));
313 static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
318 QETH_CARD_TEXT(card, 5, "chkipad");
327 cmd->hdr.return_code, card);
332 dev_warn(&card->gdev->dev,
335 QETH_CARD_IFNAME(card),
336 card->info.chpid);
337 card->lan_online = 0;
338 if (card->dev && netif_carrier_ok(card->dev))
339 netif_carrier_off(card->dev);
342 dev_info(&card->gdev->dev,
345 QETH_CARD_IFNAME(card),
346 card->info.chpid);
347 netif_carrier_on(card->dev);
348 card->lan_online = 1;
349 qeth_schedule_recovery(card);
354 QETH_CARD_TEXT(card, 3, "irla");
357 QETH_CARD_TEXT(card, 3, "urla");
369 void qeth_clear_ipacmd_list(struct qeth_card *card)
374 QETH_CARD_TEXT(card, 4, "clipalst");
376 spin_lock_irqsave(&card->lock, flags);
377 list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
385 spin_unlock_irqrestore(&card->lock, flags);
386 atomic_set(&card->write.irq_pending, 0);
390 static int qeth_check_idx_response(struct qeth_card *card,
403 QETH_CARD_TEXT(card, 2, "ckidxres");
404 QETH_CARD_TEXT(card, 2, " idxterm");
405 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO);
407 dev_err(&card->gdev->dev,
420 struct qeth_card *card;
422 card = CARD_FROM_CDEV(channel->ccwdev);
423 QETH_CARD_TEXT(card, 4, "setupccw");
424 if (channel == &card->read)
501 struct qeth_card *card;
508 card = CARD_FROM_CDEV(channel->ccwdev);
509 QETH_CARD_TEXT(card, 4, "sndctlcb");
510 rc = qeth_check_idx_response(card, iob->data);
515 qeth_clear_ipacmd_list(card);
516 qeth_schedule_recovery(card);
522 cmd = qeth_check_ipa_data(card, iob);
523 if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
526 if (card->info.type == QETH_CARD_TYPE_OSN &&
529 card->osn_info.assist_cb != NULL) {
530 card->osn_info.assist_cb(card->dev, cmd);
534 spin_lock_irqsave(&card->lock, flags);
535 list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
540 spin_unlock_irqrestore(&card->lock, flags);
546 keep_reply = reply->callback(card,
550 keep_reply = reply->callback(card,
559 spin_lock_irqsave(&card->lock, flags);
561 &card->cmd_waiter_list);
562 spin_unlock_irqrestore(&card->lock, flags);
571 spin_unlock_irqrestore(&card->lock, flags);
573 memcpy(&card->seqno.pdu_hdr_ack,
608 static int qeth_set_thread_start_bit(struct qeth_card *card,
613 spin_lock_irqsave(&card->thread_mask_lock, flags);
614 if (!(card->thread_allowed_mask & thread) ||
615 (card->thread_start_mask & thread)) {
616 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
619 card->thread_start_mask |= thread;
620 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
624 void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
628 spin_lock_irqsave(&card->thread_mask_lock, flags);
629 card->thread_start_mask &= ~thread;
630 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
631 wake_up(&card->wait_q);
635 void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
639 spin_lock_irqsave(&card->thread_mask_lock, flags);
640 card->thread_running_mask &= ~thread;
641 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
642 wake_up(&card->wait_q);
646 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
651 spin_lock_irqsave(&card->thread_mask_lock, flags);
652 if (card->thread_start_mask & thread) {
653 if ((card->thread_allowed_mask & thread) &&
654 !(card->thread_running_mask & thread)) {
656 card->thread_start_mask &= ~thread;
657 card->thread_running_mask |= thread;
661 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
665 int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
669 wait_event(card->wait_q,
670 (rc = __qeth_do_run_thread(card, thread)) >= 0);
675 void qeth_schedule_recovery(struct qeth_card *card)
677 QETH_CARD_TEXT(card, 2, "startrec");
678 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
679 schedule_work(&card->kernel_thread_starter);
687 struct qeth_card *card;
692 card = CARD_FROM_CDEV(cdev);
697 QETH_CARD_TEXT(card, 2, "CGENCHK");
710 QETH_CARD_TEXT(card, 2, "REVIND");
715 QETH_CARD_TEXT(card, 2, "CMDREJi");
719 QETH_CARD_TEXT(card, 2, "AFFE");
723 QETH_CARD_TEXT(card, 2, "ZEROSEN");
726 QETH_CARD_TEXT(card, 2, "DGENCHK");
735 struct qeth_card *card;
737 card = CARD_FROM_CDEV(cdev);
746 QETH_CARD_TEXT(card, 2, "ckirberr");
747 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO);
752 QETH_CARD_TEXT(card, 2, "ckirberr");
753 QETH_CARD_TEXT_(card, 2, " rc%d", -ETIMEDOUT);
755 if (card && (card->data.ccwdev == cdev)) {
756 card->data.state = CH_STATE_DOWN;
757 wake_up(&card->wait_q);
764 QETH_CARD_TEXT(card, 2, "ckirberr");
765 QETH_CARD_TEXT(card, 2, " rc???");
777 struct qeth_card *card;
786 card = CARD_FROM_CDEV(cdev);
787 if (!card)
790 QETH_CARD_TEXT(card, 5, "irq");
792 if (card->read.ccwdev == cdev) {
793 channel = &card->read;
794 QETH_CARD_TEXT(card, 5, "read");
795 } else if (card->write.ccwdev == cdev) {
796 channel = &card->write;
797 QETH_CARD_TEXT(card, 5, "write");
799 channel = &card->data;
800 QETH_CARD_TEXT(card, 5, "data");
811 if ((channel == &card->data) && (intparm != 0) &&
816 QETH_CARD_TEXT(card, 6, "clrchpar");
821 QETH_CARD_TEXT(card, 6, "hltchpar");
846 qeth_clear_ipacmd_list(card);
847 qeth_schedule_recovery(card);
860 if (channel == &card->data)
862 if (channel == &card->read &&
864 qeth_issue_next_read(card);
876 wake_up(&card->wait_q);
898 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) {
918 void qeth_clear_qdio_buffers(struct qeth_card *card)
922 QETH_CARD_TEXT(card, 2, "clearqdbf");
924 for (i = 0; i < card->qdio.no_out_queues; ++i)
925 if (card->qdio.out_qs[i]) {
927 qeth_clear_output_buffer(card->qdio.out_qs[i],
928 &card->qdio.out_qs[i]->bufs[j]);
933 static void qeth_free_buffer_pool(struct qeth_card *card)
938 &card->qdio.init_pool.entry_list, init_list){
939 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
946 static void qeth_free_qdio_buffers(struct qeth_card *card)
950 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
953 kfree(card->qdio.in_q);
954 card->qdio.in_q = NULL;
956 qeth_free_buffer_pool(card);
958 if (card->qdio.out_qs) {
959 for (i = 0; i < card->qdio.no_out_queues; ++i) {
961 qeth_clear_output_buffer(card->qdio.out_qs[i],
962 &card->qdio.out_qs[i]->bufs[j]);
963 kfree(card->qdio.out_qs[i]);
965 kfree(card->qdio.out_qs);
966 card->qdio.out_qs = NULL;
979 static void qeth_get_channel_path_desc(struct qeth_card *card)
995 ccwdev = card->data.ccwdev;
1000 card->qdio.no_out_queues = 1;
1001 card->info.func_level = 0x4100 + chp_dsc->desc;
1004 if (card->qdio.no_out_queues == 1) {
1005 card->qdio.default_out_queue = 0;
1006 dev_info(&card->gdev->dev,
1009 QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
1010 QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
1014 static void qeth_init_qdio_info(struct qeth_card *card)
1017 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
1019 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1020 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
1021 card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
1022 INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
1023 INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
1026 static void qeth_set_intial_options(struct qeth_card *card)
1028 card->options.route4.type = NO_ROUTER;
1029 card->options.route6.type = NO_ROUTER;
1030 card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
1031 card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
1032 card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
1033 card->options.fake_broadcast = 0;
1034 card->options.add_hhlen = DEFAULT_ADD_HHLEN;
1035 card->options.performance_stats = 0;
1036 card->options.rx_sg_cb = QETH_RX_SG_CB;
1037 card->options.isolation = ISOLATION_MODE_NONE;
1040 static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
1045 spin_lock_irqsave(&card->thread_mask_lock, flags);
1046 QETH_CARD_TEXT_(card, 4, " %02x%02x%02x",
1047 (u8) card->thread_start_mask,
1048 (u8) card->thread_allowed_mask,
1049 (u8) card->thread_running_mask);
1050 rc = (card->thread_start_mask & thread);
1051 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
1057 struct qeth_card *card = container_of(work, struct qeth_card,
1059 QETH_CARD_TEXT(card , 2, "strthrd");
1061 if (card->read.state != CH_STATE_UP &&
1062 card->write.state != CH_STATE_UP)
1064 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
1065 kthread_run(card->discipline.recover, (void *) card,
1069 static int qeth_setup_card(struct qeth_card *card)
1073 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1075 card->read.state = CH_STATE_DOWN;
1076 card->write.state = CH_STATE_DOWN;
1077 card->data.state = CH_STATE_DOWN;
1078 card->state = CARD_STATE_DOWN;
1079 card->lan_online = 0;
1080 card->use_hard_stop = 0;
1081 card->read_or_write_problem = 0;
1082 card->dev = NULL;
1083 spin_lock_init(&card->vlanlock);
1084 spin_lock_init(&card->mclock);
1085 card->vlangrp = NULL;
1086 spin_lock_init(&card->lock);
1087 spin_lock_init(&card->ip_lock);
1088 spin_lock_init(&card->thread_mask_lock);
1089 mutex_init(&card->conf_mutex);
1090 mutex_init(&card->discipline_mutex);
1091 card->thread_start_mask = 0;
1092 card->thread_allowed_mask = 0;
1093 card->thread_running_mask = 0;
1094 INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread);
1095 INIT_LIST_HEAD(&card->ip_list);
1096 INIT_LIST_HEAD(card->ip_tbd_list);
1097 INIT_LIST_HEAD(&card->cmd_waiter_list);
1098 init_waitqueue_head(&card->wait_q);
1100 qeth_set_intial_options(card);
1102 INIT_LIST_HEAD(&card->ipato.entries);
1103 card->ipato.enabled = 0;
1104 card->ipato.invert4 = 0;
1105 card->ipato.invert6 = 0;
1107 qeth_init_qdio_info(card);
1113 struct qeth_card *card = container_of(slr, struct qeth_card,
1115 if (card->info.mcl_level[0])
1117 CARD_BUS_ID(card), card->info.mcl_level);
1122 struct qeth_card *card;
1125 card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL);
1126 if (!card)
1128 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1129 card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_KERNEL);
1130 if (!card->ip_tbd_list) {
1134 if (qeth_setup_channel(&card->read))
1136 if (qeth_setup_channel(&card->write))
1138 card->options.layer2 = -1;
1139 card->qeth_service_level.seq_print = qeth_core_sl_print;
1140 register_service_level(&card->qeth_service_level);
1141 return card;
1144 qeth_clean_channel(&card->read);
1146 kfree(card->ip_tbd_list);
1148 kfree(card);
1153 static int qeth_determine_card_type(struct qeth_card *card)
1159 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
1160 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1162 if ((CARD_RDEV(card)->id.dev_type ==
1164 (CARD_RDEV(card)->id.dev_model ==
1166 card->info.type = known_devices[i][QETH_DEV_MODEL_IND];
1167 card->qdio.no_out_queues =
1169 card->info.is_multicast_different =
1171 qeth_get_channel_path_desc(card);
1176 card->info.type = QETH_CARD_TYPE_UNKNOWN;
1177 dev_err(&card->gdev->dev, "The adapter hardware is of an "
1185 struct qeth_card *card;
1188 card = CARD_FROM_CDEV(channel->ccwdev);
1189 QETH_CARD_TEXT(card, 3, "clearch");
1196 rc = wait_event_interruptible_timeout(card->wait_q,
1209 struct qeth_card *card;
1212 card = CARD_FROM_CDEV(channel->ccwdev);
1213 QETH_CARD_TEXT(card, 3, "haltch");
1220 rc = wait_event_interruptible_timeout(card->wait_q,
1229 static int qeth_halt_channels(struct qeth_card *card)
1233 QETH_CARD_TEXT(card, 3, "haltchs");
1234 rc1 = qeth_halt_channel(&card->read);
1235 rc2 = qeth_halt_channel(&card->write);
1236 rc3 = qeth_halt_channel(&card->data);
1244 static int qeth_clear_channels(struct qeth_card *card)
1248 QETH_CARD_TEXT(card, 3, "clearchs");
1249 rc1 = qeth_clear_channel(&card->read);
1250 rc2 = qeth_clear_channel(&card->write);
1251 rc3 = qeth_clear_channel(&card->data);
1259 static int qeth_clear_halt_card(struct qeth_card *card, int halt)
1263 QETH_CARD_TEXT(card, 3, "clhacrd");
1266 rc = qeth_halt_channels(card);
1269 return qeth_clear_channels(card);
1272 int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
1276 QETH_CARD_TEXT(card, 3, "qdioclr");
1277 switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED,
1280 if (card->info.type == QETH_CARD_TYPE_IQD)
1281 rc = qdio_shutdown(CARD_DDEV(card),
1284 rc = qdio_shutdown(CARD_DDEV(card),
1287 QETH_CARD_TEXT_(card, 3, "1err%d", rc);
1288 qdio_free(CARD_DDEV(card));
1289 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
1296 rc = qeth_clear_halt_card(card, use_halt);
1298 QETH_CARD_TEXT_(card, 3, "2err%d", rc);
1299 card->state = CARD_STATE_DOWN;
1304 static int qeth_read_conf_data(struct qeth_card *card, void **buffer,
1310 struct qeth_channel *channel = &card->data;
1334 wait_event(card->wait_q,
1352 static void qeth_configure_unitaddr(struct qeth_card *card, char *prcd)
1355 card->info.chpid = prcd[30];
1356 card->info.unit_addr2 = prcd[31];
1357 card->info.cula = prcd[63];
1358 card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
1362 static void qeth_configure_blkt_default(struct qeth_card *card, char *prcd)
1367 card->info.blkt.time_total = 250;
1368 card->info.blkt.inter_packet = 5;
1369 card->info.blkt.inter_packet_jumbo = 15;
1371 card->info.blkt.time_total = 0;
1372 card->info.blkt.inter_packet = 0;
1373 card->info.blkt.inter_packet_jumbo = 0;
1377 static void qeth_init_tokens(struct qeth_card *card)
1379 card->token.issuer_rm_w = 0x00010103UL;
1380 card->token.cm_filter_w = 0x00010108UL;
1381 card->token.cm_connection_w = 0x0001010aUL;
1382 card->token.ulp_filter_w = 0x0001010bUL;
1383 card->token.ulp_connection_w = 0x0001010dUL;
1386 static void qeth_init_func_level(struct qeth_card *card)
1388 switch (card->info.type) {
1390 card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
1394 card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD;
1408 struct qeth_card *card;
1411 card = CARD_FROM_CDEV(channel->ccwdev);
1418 wait_event(card->wait_q,
1430 wake_up(&card->wait_q);
1433 rc = wait_event_interruptible_timeout(card->wait_q,
1450 struct qeth_card *card;
1458 card = CARD_FROM_CDEV(channel->ccwdev);
1467 if (channel == &card->write) {
1470 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1471 card->seqno.trans_hdr++;
1475 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1477 tmp = ((__u8)card->info.portno) | 0x80;
1480 &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
1482 &card->info.func_level, sizeof(__u16));
1483 ccw_device_get_id(CARD_DDEV(card), &temp_devid);
1485 temp = (card->info.cula << 8) + card->info.unit_addr2;
1488 wait_event(card->wait_q,
1501 wake_up(&card->wait_q);
1504 rc = wait_event_interruptible_timeout(card->wait_q,
1532 struct qeth_card *card;
1541 card = CARD_FROM_CDEV(channel->ccwdev);
1545 dev_err(&card->write.ccwdev->dev,
1551 dev_name(&card->write.ccwdev->dev));
1555 if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1558 "0x%x)\n", dev_name(&card->write.ccwdev->dev),
1559 card->info.func_level, temp);
1570 struct qeth_card *card;
1579 card = CARD_FROM_CDEV(channel->ccwdev);
1580 if (qeth_check_idx_response(card, iob->data))
1586 dev_err(&card->write.ccwdev->dev,
1592 dev_err(&card->read.ccwdev->dev,
1599 dev_name(&card->read.ccwdev->dev));
1601 QETH_CARD_TEXT_(card, 2, "idxread%c",
1611 (card->info.type == QETH_CARD_TYPE_OSD))
1612 card->info.portname_required = 1;
1615 if (temp != qeth_peer_func_level(card->info.func_level)) {
1618 dev_name(&card->read.ccwdev->dev),
1619 card->info.func_level, temp);
1622 memcpy(&card->token.issuer_rm_r,
1625 memcpy(&card->info.mcl_level[0],
1632 void qeth_prepare_control_data(struct qeth_card *card, int len,
1635 qeth_setup_ccw(&card->write, iob->data, len);
1639 &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1640 card->seqno.trans_hdr++;
1642 &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
1643 card->seqno.pdu_hdr++;
1645 &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
1650 int qeth_send_control_data(struct qeth_card *card, int len,
1662 QETH_CARD_TEXT(card, 2, "sendctl");
1664 if (card->read_or_write_problem) {
1668 reply = qeth_alloc_reply(card);
1674 if (card->state == CARD_STATE_DOWN)
1677 reply->seqno = card->seqno.ipa++;
1679 spin_lock_irqsave(&card->lock, flags);
1680 list_add_tail(&reply->list, &card->cmd_waiter_list);
1681 spin_unlock_irqrestore(&card->lock, flags);
1684 while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
1685 qeth_prepare_control_data(card, len, iob);
1693 QETH_CARD_TEXT(card, 6, "noirqpnd");
1694 spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1695 rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1697 spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1701 dev_name(&card->write.ccwdev->dev), rc);
1702 QETH_CARD_TEXT_(card, 2, " err%d", rc);
1703 spin_lock_irqsave(&card->lock, flags);
1706 spin_unlock_irqrestore(&card->lock, flags);
1708 atomic_set(&card->write.irq_pending, 0);
1709 wake_up(&card->wait_q);
1734 spin_lock_irqsave(&reply->card->lock, flags);
1736 spin_unlock_irqrestore(&reply->card->lock, flags);
1739 atomic_set(&card->write.irq_pending, 0);
1741 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
1749 static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
1757 memcpy(&card->token.cm_filter_r,
1764 static int qeth_cm_enable(struct qeth_card *card)
1771 iob = qeth_wait_for_buffer(&card->write);
1774 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
1776 &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
1778 rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
1783 static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
1792 memcpy(&card->token.cm_connection_r,
1799 static int qeth_cm_setup(struct qeth_card *card)
1806 iob = qeth_wait_for_buffer(&card->write);
1809 &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
1811 &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
1813 &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
1814 rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
1820 static inline int qeth_get_initial_mtu_for_card(struct qeth_card *card)
1822 switch (card->info.type) {
1826 return card->info.max_mtu;
1828 switch (card->info.link_type) {
1886 static inline int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
1888 switch (card->info.type) {
1895 (mtu <= card->info.max_mtu + 4096 - 32));
1903 static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
1915 memcpy(&card->token.ulp_filter_r,
1918 if (qeth_get_mtu_out_of_mpc(card->info.type)) {
1926 card->info.max_mtu = mtu;
1927 card->info.initial_mtu = mtu;
1928 card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
1930 card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
1931 card->info.max_mtu = qeth_get_max_mtu_for_card(card->info.type);
1932 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1939 card->info.link_type = link_type;
1941 card->info.link_type = 0;
1942 QETH_DBF_TEXT_(SETUP, 2, "link%d", card->info.link_type);
1947 static int qeth_ulp_enable(struct qeth_card *card)
1955 iob = qeth_wait_for_buffer(&card->write);
1959 (__u8) card->info.portno;
1960 if (card->options.layer2)
1961 if (card->info.type == QETH_CARD_TYPE_OSN)
1970 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
1972 &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
1974 card->info.portname, 9);
1975 rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
1981 static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
1990 memcpy(&card->token.ulp_connection_r,
1996 dev_err(&card->gdev->dev, "A connection could not be "
2004 static int qeth_ulp_setup(struct qeth_card *card)
2013 iob = qeth_wait_for_buffer(&card->write);
2017 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2019 &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
2021 &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
2023 ccw_device_get_id(CARD_DDEV(card), &dev_id);
2025 temp = (card->info.cula << 8) + card->info.unit_addr2;
2027 rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
2032 static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2038 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
2042 card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
2044 if (!card->qdio.in_q)
2047 QETH_DBF_HEX(SETUP, 2, &card->qdio.in_q, sizeof(void *));
2048 memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
2051 card->qdio.in_q->bufs[i].buffer =
2052 &card->qdio.in_q->qdio_bufs[i];
2054 if (qeth_alloc_buffer_pool(card))
2057 card->qdio.out_qs =
2058 kmalloc(card->qdio.no_out_queues *
2060 if (!card->qdio.out_qs)
2062 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2063 card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q),
2065 if (!card->qdio.out_qs[i])
2068 QETH_DBF_HEX(SETUP, 2, &card->qdio.out_qs[i], sizeof(void *));
2069 memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q));
2070 card->qdio.out_qs[i]->queue_no = i;
2073 card->qdio.out_qs[i]->bufs[j].buffer =
2074 &card->qdio.out_qs[i]->qdio_bufs[j];
2075 skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j].
2078 &card->qdio.out_qs[i]->bufs[j].skb_list.lock,
2080 INIT_LIST_HEAD(&card->qdio.out_qs[i]->bufs[j].ctx_list);
2087 kfree(card->qdio.out_qs[--i]);
2088 kfree(card->qdio.out_qs);
2089 card->qdio.out_qs = NULL;
2091 qeth_free_buffer_pool(card);
2093 kfree(card->qdio.in_q);
2094 card->qdio.in_q = NULL;
2096 atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
2100 static void qeth_create_qib_param_field(struct qeth_card *card,
2108 *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
2109 *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
2110 *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
2113 static void qeth_create_qib_param_field_blkt(struct qeth_card *card,
2120 *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
2121 *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
2123 card->info.blkt.inter_packet_jumbo;
2126 static int qeth_qdio_activate(struct qeth_card *card)
2129 return qdio_activate(CARD_DDEV(card));
2132 static int qeth_dm_act(struct qeth_card *card)
2139 iob = qeth_wait_for_buffer(&card->write);
2143 &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2145 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2146 rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
2150 static int qeth_mpc_initialize(struct qeth_card *card)
2156 rc = qeth_issue_next_read(card);
2161 rc = qeth_cm_enable(card);
2166 rc = qeth_cm_setup(card);
2171 rc = qeth_ulp_enable(card);
2176 rc = qeth_ulp_setup(card);
2181 rc = qeth_alloc_qdio_buffers(card);
2186 rc = qeth_qdio_establish(card);
2189 qeth_free_qdio_buffers(card);
2192 rc = qeth_qdio_activate(card);
2197 rc = qeth_dm_act(card);
2205 qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
2209 static void qeth_print_status_with_portname(struct qeth_card *card)
2214 sprintf(dbf_text, "%s", card->info.portname + 1);
2219 dev_info(&card->gdev->dev, "Device is a%s card%s%s%s\n"
2221 qeth_get_cardname(card),
2222 (card->info.mcl_level[0]) ? " (level: " : "",
2223 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2224 (card->info.mcl_level[0]) ? ")" : "",
2225 qeth_get_cardname_short(card),
2230 static void qeth_print_status_no_portname(struct qeth_card *card)
2232 if (card->info.portname[0])
2233 dev_info(&card->gdev->dev, "Device is a%s "
2234 "card%s%s%s\nwith link type %s "
2236 qeth_get_cardname(card),
2237 (card->info.mcl_level[0]) ? " (level: " : "",
2238 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2239 (card->info.mcl_level[0]) ? ")" : "",
2240 qeth_get_cardname_short(card));
2242 dev_info(&card->gdev->dev, "Device is a%s "
2243 "card%s%s%s\nwith link type %s.\n",
2244 qeth_get_cardname(card),
2245 (card->info.mcl_level[0]) ? " (level: " : "",
2246 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2247 (card->info.mcl_level[0]) ? ")" : "",
2248 qeth_get_cardname_short(card));
2251 void qeth_print_status_message(struct qeth_card *card)
2253 switch (card->info.type) {
2261 if (!card->info.mcl_level[0]) {
2262 sprintf(card->info.mcl_level, "%02x%02x",
2263 card->info.mcl_level[2],
2264 card->info.mcl_level[3]);
2266 card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2271 if ((card->info.guestlan) ||
2272 (card->info.mcl_level[0] & 0x80)) {
2273 card->info.mcl_level[0] = (char) _ebcasc[(__u8)
2274 card->info.mcl_level[0]];
2275 card->info.mcl_level[1] = (char) _ebcasc[(__u8)
2276 card->info.mcl_level[1]];
2277 card->info.mcl_level[2] = (char) _ebcasc[(__u8)
2278 card->info.mcl_level[2]];
2279 card->info.mcl_level[3] = (char) _ebcasc[(__u8)
2280 card->info.mcl_level[3]];
2281 card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2285 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
2287 if (card->info.portname_required)
2288 qeth_print_status_with_portname(card);
2290 qeth_print_status_no_portname(card);
2294 static void qeth_initialize_working_pool_list(struct qeth_card *card)
2298 QETH_CARD_TEXT(card, 5, "inwrklst");
2301 &card->qdio.init_pool.entry_list, init_list) {
2302 qeth_put_buffer_pool_entry(card, entry);
2307 struct qeth_card *card)
2314 if (list_empty(&card->qdio.in_buf_pool.entry_list))
2317 list_for_each(plh, &card->qdio.in_buf_pool.entry_list) {
2320 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2333 entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
2335 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2343 if (card->options.performance_stats)
2344 card->perf_stats.sg_alloc_page_rx++;
2352 static int qeth_init_input_buffer(struct qeth_card *card,
2358 pool_entry = qeth_find_free_buffer_pool_entry(card);
2370 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2373 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2381 int qeth_init_qdio_queues(struct qeth_card *card)
2389 memset(card->qdio.in_q->qdio_bufs, 0,
2391 qeth_initialize_working_pool_list(card);
2393 for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
2394 qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
2395 card->qdio.in_q->next_buf_to_init =
2396 card->qdio.in_buf_pool.buf_count - 1;
2397 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
2398 card->qdio.in_buf_pool.buf_count - 1);
2404 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2405 memset(card->qdio.out_qs[i]->qdio_bufs, 0,
2408 qeth_clear_output_buffer(card->qdio.out_qs[i],
2409 &card->qdio.out_qs[i]->bufs[j]);
2411 card->qdio.out_qs[i]->card = card;
2412 card->qdio.out_qs[i]->next_buf_to_fill = 0;
2413 card->qdio.out_qs[i]->do_pack = 0;
2414 atomic_set(&card->qdio.out_qs[i]->used_buffers, 0);
2415 atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
2416 atomic_set(&card->qdio.out_qs[i]->state,
2433 static void qeth_fill_ipacmd_header(struct qeth_card *card,
2440 cmd->hdr.seqno = card->seqno.ipa;
2441 cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
2442 cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
2443 if (card->options.layer2)
2453 struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card,
2459 iob = qeth_wait_for_buffer(&card->write);
2461 qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
2467 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2473 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2477 int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2485 QETH_CARD_TEXT(card, 4, "sendipa");
2487 if (card->options.layer2)
2488 if (card->info.type == QETH_CARD_TYPE_OSN)
2494 qeth_prepare_ipa_cmd(card, iob, prot_type);
2495 rc = qeth_send_control_data(card, IPA_CMD_LENGTH,
2498 qeth_clear_ipacmd_list(card);
2499 qeth_schedule_recovery(card);
2505 static int qeth_send_startstoplan(struct qeth_card *card,
2511 iob = qeth_get_ipacmd_buffer(card, ipacmd, prot);
2512 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2517 int qeth_send_startlan(struct qeth_card *card)
2523 rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0);
2528 int qeth_send_stoplan(struct qeth_card *card)
2539 rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 0);
2544 int qeth_default_setadapterparms_cb(struct qeth_card *card,
2549 QETH_CARD_TEXT(card, 4, "defadpcb");
2559 static int qeth_query_setadapterparms_cb(struct qeth_card *card,
2564 QETH_CARD_TEXT(card, 3, "quyadpcb");
2568 card->info.link_type =
2570 QETH_DBF_TEXT_(SETUP, 2, "lnk %d", card->info.link_type);
2572 card->options.adp.supported_funcs =
2574 return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
2577 struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
2583 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS,
2595 int qeth_query_setadapterparms(struct qeth_card *card)
2600 QETH_CARD_TEXT(card, 3, "queryadp");
2601 iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
2603 rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
2608 int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
2612 QETH_CARD_TEXT(card, 2, dbftext);
2613 QETH_CARD_TEXT_(card, 2, " F15=%02X",
2615 QETH_CARD_TEXT_(card, 2, " F14=%02X",
2617 QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
2619 card->stats.rx_dropped++;
2628 void qeth_queue_input_buffer(struct qeth_card *card, int index)
2630 struct qeth_qdio_q *queue = card->qdio.in_q;
2637 card->qdio.in_buf_pool.buf_count -
2639 card->qdio.in_buf_pool.buf_count -
2642 if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) {
2645 if (qeth_init_input_buffer(card,
2656 atomic_set(&card->force_alloc_skb, 3);
2659 atomic_add_unless(&card->force_alloc_skb, -1, 0);
2669 if (card->options.performance_stats) {
2670 card->perf_stats.inbound_do_qdio_cnt++;
2671 card->perf_stats.inbound_do_qdio_start_time =
2674 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0,
2676 if (card->options.performance_stats)
2677 card->perf_stats.inbound_do_qdio_time +=
2679 card->perf_stats.inbound_do_qdio_start_time;
2681 dev_warn(&card->gdev->dev,
2683 QETH_CARD_TEXT(card, 2, "qinberr");
2691 static int qeth_handle_send_error(struct qeth_card *card,
2696 QETH_CARD_TEXT(card, 6, "hdsnderr");
2697 if (card->info.type == QETH_CARD_TYPE_IQD) {
2704 qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr");
2712 QETH_CARD_TEXT(card, 1, "lnkfail");
2713 QETH_CARD_TEXT_(card, 1, "%04x %02x",
2728 QETH_CARD_TEXT(queue->card, 6, "np->pack");
2729 if (queue->card->options.performance_stats)
2730 queue->card->perf_stats.sc_dp_p++;
2751 QETH_CARD_TEXT(queue->card, 6, "pack->np");
2752 if (queue->card->options.performance_stats)
2753 queue->card->perf_stats.sc_p_dp++;
2806 if (queue->card->info.type == QETH_CARD_TYPE_IQD)
2836 queue->card->dev->trans_start = jiffies;
2837 if (queue->card->options.performance_stats) {
2838 queue->card->perf_stats.outbound_do_qdio_cnt++;
2839 queue->card->perf_stats.outbound_do_qdio_start_time =
2845 rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
2847 if (queue->card->options.performance_stats)
2848 queue->card->perf_stats.outbound_do_qdio_time +=
2850 queue->card->perf_stats.outbound_do_qdio_start_time;
2856 queue->card->stats.tx_errors += count;
2860 QETH_CARD_TEXT(queue->card, 2, "flushbuf");
2861 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc);
2865 qeth_schedule_recovery(queue->card);
2869 if (queue->card->options.performance_stats)
2870 queue->card->perf_stats.bufs_sent += count;
2892 netif_stop_queue(queue->card->dev);
2902 if (queue->card->options.performance_stats &&
2904 queue->card->perf_stats.bufs_sent_pack +=
2917 struct qeth_card *card = (struct qeth_card *) card_ptr;
2918 struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
2923 QETH_CARD_TEXT(card, 6, "qdouhdl");
2925 QETH_CARD_TEXT(card, 2, "achkcond");
2926 netif_stop_queue(card->dev);
2927 qeth_schedule_recovery(card);
2930 if (card->options.performance_stats) {
2931 card->perf_stats.outbound_handler_cnt++;
2932 card->perf_stats.outbound_handler_start_time =
2937 qeth_send_err = qeth_handle_send_error(card, buffer, qdio_error);
2943 if (card->info.type != QETH_CARD_TYPE_IQD)
2946 netif_wake_queue(queue->card->dev);
2947 if (card->options.performance_stats)
2948 card->perf_stats.outbound_handler_time += qeth_get_micros() -
2949 card->perf_stats.outbound_handler_start_time;
2953 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
2956 if (!ipv && (card->info.type == QETH_CARD_TYPE_OSD ||
2957 card->info.type == QETH_CARD_TYPE_OSX))
2958 return card->qdio.default_out_queue;
2959 switch (card->qdio.no_out_queues) {
2961 if (cast_type && card->info.is_multicast_different)
2962 return card->info.is_multicast_different &
2963 (card->qdio.no_out_queues - 1);
2964 if (card->qdio.do_prio_queueing && (ipv == 4)) {
2967 if (card->qdio.do_prio_queueing ==
2978 if (card->qdio.do_prio_queueing ==
2981 } else if (card->qdio.do_prio_queueing && (ipv == 6)) {
2984 return card->qdio.default_out_queue;
2987 return card->qdio.default_out_queue;
2992 int qeth_get_elements_no(struct qeth_card *card, void *hdr,
3000 if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)) {
3137 QETH_CARD_TEXT(queue->card, 6, "fillbfnp");
3142 QETH_CARD_TEXT(queue->card, 6, "fillbfpa");
3143 if (queue->card->options.performance_stats)
3144 queue->card->perf_stats.skbs_sent_pack++;
3146 QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
3158 int qeth_do_send_packet_fast(struct qeth_card *card,
3202 QETH_CARD_TEXT(card, 2, "qrdrop");
3212 int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
3241 if ((QETH_MAX_BUFFER_ELEMENTS(card) -
3291 if (queue->card->options.performance_stats && do_pack)
3292 queue->card->perf_stats.bufs_sent_pack += flush_count;
3298 static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
3304 QETH_CARD_TEXT(card, 4, "prmadpcb");
3309 qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
3311 QETH_CARD_TEXT_(card, 4, "prmrc%2.2x", cmd->hdr.return_code);
3314 card->info.promisc_mode = setparms->data.mode;
3318 void qeth_setadp_promisc_mode(struct qeth_card *card)
3321 struct net_device *dev = card->dev;
3325 QETH_CARD_TEXT(card, 4, "setprom");
3328 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
3330 (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
3335 QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
3337 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
3341 qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
3347 struct qeth_card *card;
3350 card = dev->ml_priv;
3352 QETH_CARD_TEXT(card, 4, "chgmtu");
3354 QETH_CARD_TEXT(card, 4, dbf_text);
3360 if ((!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) &&
3361 (!qeth_mtu_is_valid(card, new_mtu)))
3370 struct qeth_card *card;
3372 card = dev->ml_priv;
3374 QETH_CARD_TEXT(card, 5, "getstat");
3376 return &card->stats;
3380 static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
3385 QETH_CARD_TEXT(card, 4, "chgmaccb");
3388 if (!card->options.layer2 ||
3389 !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
3390 memcpy(card->dev->dev_addr,
3393 card->info.mac_bits |= QETH_LAYER2_MAC_READ;
3395 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
3399 int qeth_setadpparms_change_macaddr(struct qeth_card *card)
3405 QETH_CARD_TEXT(card, 4, "chgmac");
3407 iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS,
3413 card->dev->dev_addr, OSA_ADDR_LEN);
3414 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
3420 static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
3426 QETH_CARD_TEXT(card, 4, "setaccb");
3431 QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
3439 card->options.isolation = access_ctrl_req->subcmd_code;
3440 if (card->options.isolation == ISOLATION_MODE_NONE) {
3441 dev_info(&card->gdev->dev,
3444 dev_info(&card->gdev->dev,
3448 card->gdev->dev.kobj.name,
3456 card->gdev->dev.kobj.name,
3459 dev_err(&card->gdev->dev, "Adapter does not "
3463 card->options.isolation = ISOLATION_MODE_NONE;
3469 card->gdev->dev.kobj.name,
3472 dev_err(&card->gdev->dev,
3477 card->options.isolation = ISOLATION_MODE_NONE;
3483 card->gdev->dev.kobj.name,
3486 dev_err(&card->gdev->dev,
3490 card->options.isolation = ISOLATION_MODE_NONE;
3498 card->gdev->dev.kobj.name,
3503 card->options.isolation = ISOLATION_MODE_NONE;
3507 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
3511 static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
3519 QETH_CARD_TEXT(card, 4, "setacctl");
3522 QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
3524 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL,
3531 rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb,
3537 int qeth_set_access_ctrl_online(struct qeth_card *card)
3541 QETH_CARD_TEXT(card, 4, "setactlo");
3543 if ((card->info.type == QETH_CARD_TYPE_OSD ||
3544 card->info.type == QETH_CARD_TYPE_OSX) &&
3545 qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) {
3546 rc = qeth_setadpparms_set_access_ctrl(card,
3547 card->options.isolation);
3551 card->gdev->dev.kobj.name,
3554 } else if (card->options.isolation != ISOLATION_MODE_NONE) {
3555 card->options.isolation = ISOLATION_MODE_NONE;
3557 dev_err(&card->gdev->dev, "Adapter does not "
3567 struct qeth_card *card;
3569 card = dev->ml_priv;
3570 QETH_CARD_TEXT(card, 4, "txtimeo");
3571 card->stats.tx_errors++;
3572 qeth_schedule_recovery(card);
3578 struct qeth_card *card = dev->ml_priv;
3584 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
3585 (card->info.link_type != QETH_LINK_TYPE_OSN) &&
3586 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH))
3618 rc = card->stats.rx_errors;
3641 static int qeth_send_ipa_snmp_cmd(struct qeth_card *card,
3649 QETH_CARD_TEXT(card, 4, "sendsnmp");
3653 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
3661 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob,
3665 static int qeth_snmp_command_cb(struct qeth_card *card,
3674 QETH_CARD_TEXT(card, 3, "snpcmdcb");
3682 QETH_CARD_TEXT_(card, 4, "scer1%i", cmd->hdr.return_code);
3688 QETH_CARD_TEXT_(card, 4, "scer2%i", cmd->hdr.return_code);
3699 QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOMEM);
3703 QETH_CARD_TEXT_(card, 4, "snore%i",
3705 QETH_CARD_TEXT_(card, 4, "sseqn%i",
3719 QETH_CARD_TEXT_(card, 4, "srtot%i",
3721 QETH_CARD_TEXT_(card, 4, "srseq%i",
3729 int qeth_snmp_command(struct qeth_card *card, char __user *udata)
3738 QETH_CARD_TEXT(card, 3, "snmpcmd");
3740 if (card->info.guestlan)
3743 if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) &&
3744 (!card->options.layer2)) {
3752 QETH_CARD_TEXT(card, 2, "snmpnome");
3763 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL,
3767 rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
3771 QETH_CARD_IFNAME(card), rc);
3783 static inline int qeth_get_qdio_q_format(struct qeth_card *card)
3785 switch (card->info.type) {
3793 static int qeth_qdio_establish(struct qeth_card *card)
3809 qeth_create_qib_param_field(card, qib_param_field);
3810 qeth_create_qib_param_field_blkt(card, qib_param_field);
3820 virt_to_phys(card->qdio.in_q->bufs[i].buffer);
3823 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
3830 for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
3833 card->qdio.out_qs[i]->bufs[j].buffer);
3837 init_data.cdev = CARD_DDEV(card);
3838 init_data.q_format = qeth_get_qdio_q_format(card);
3842 init_data.no_output_qs = card->qdio.no_out_queues;
3843 init_data.input_handler = card->discipline.input_handler;
3844 init_data.output_handler = card->discipline.output_handler;
3845 init_data.int_parm = (unsigned long) card;
3849 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
3853 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
3858 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
3859 qdio_free(CARD_DDEV(card));
3869 static void qeth_core_free_card(struct qeth_card *card)
3873 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
3874 qeth_clean_channel(&card->read);
3875 qeth_clean_channel(&card->write);
3876 if (card->dev)
3877 free_netdev(card->dev);
3878 kfree(card->ip_tbd_list);
3879 qeth_free_qdio_buffers(card);
3880 unregister_service_level(&card->qeth_service_level);
3881 kfree(card);
3913 int qeth_core_hardsetup_card(struct qeth_card *card)
3919 atomic_set(&card->force_alloc_skb, 0);
3923 dev_name(&card->gdev->dev));
3924 ccw_device_set_offline(CARD_DDEV(card));
3925 ccw_device_set_offline(CARD_WDEV(card));
3926 ccw_device_set_offline(CARD_RDEV(card));
3927 rc = ccw_device_set_online(CARD_RDEV(card));
3930 rc = ccw_device_set_online(CARD_WDEV(card));
3933 rc = ccw_device_set_online(CARD_DDEV(card));
3936 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
3948 qeth_init_tokens(card);
3949 qeth_init_func_level(card);
3950 rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
3961 rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
3972 card->read_or_write_problem = 0;
3973 rc = qeth_mpc_initialize(card);
3980 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
3983 dev_name(&card->gdev->dev), rc);
4024 struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4057 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) ||
4058 (card->info.link_type == QETH_LINK_TYPE_HSTR))
4074 if ((skb_len >= card->options.rx_sg_cb) &&
4075 (!(card->info.type == QETH_CARD_TYPE_OSN)) &&
4076 (!atomic_read(&card->force_alloc_skb))) {
4102 QETH_CARD_TEXT(card, 4, "unexeob");
4103 QETH_CARD_HEX(card, 2, buffer, sizeof(void *));
4105 card->stats.rx_errors++;
4117 if (use_rx_sg && card->options.performance_stats) {
4118 card->perf_stats.sg_skbs_rx++;
4119 card->perf_stats.sg_frags_rx += skb_shinfo(skb)->nr_frags;
4124 QETH_CARD_TEXT(card, 2, "noskbmem");
4126 card->stats.rx_dropped++;
4184 int qeth_core_load_discipline(struct qeth_card *card,
4190 card->discipline.ccwgdriver = try_then_request_module(
4195 card->discipline.ccwgdriver = try_then_request_module(
4200 if (!card->discipline.ccwgdriver) {
4201 dev_err(&card->gdev->dev, "There is no kernel module to "
4208 void qeth_core_free_discipline(struct qeth_card *card)
4210 if (card->options.layer2)
4214 card->discipline.ccwgdriver = NULL;
4217 static void qeth_determine_capabilities(struct qeth_card *card)
4224 rc = ccw_device_set_online(CARD_DDEV(card));
4231 rc = qeth_read_conf_data(card, (void **) &prcd, &length);
4234 dev_name(&card->gdev->dev), rc);
4238 qeth_configure_unitaddr(card, prcd);
4239 qeth_configure_blkt_default(card, prcd);
4242 rc = qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd);
4247 ccw_device_set_offline(CARD_DDEV(card));
4254 struct qeth_card *card;
4268 card = qeth_alloc_card();
4269 if (!card) {
4277 card->debug = debug_register(dbf_name, 2, 1, 8);
4278 if (!card->debug) {
4283 debug_register_view(card->debug, &debug_hex_ascii_view);
4285 card->read.ccwdev = gdev->cdev[0];
4286 card->write.ccwdev = gdev->cdev[1];
4287 card->data.ccwdev = gdev->cdev[2];
4288 dev_set_drvdata(&gdev->dev, card);
4289 card->gdev = gdev;
4294 rc = qeth_determine_card_type(card);
4299 rc = qeth_setup_card(card);
4305 if (card->info.type == QETH_CARD_TYPE_OSN)
4311 switch (card->info.type) {
4314 rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2);
4317 rc = card->discipline.ccwgdriver->probe(card->gdev);
4327 list_add_tail(&card->list, &qeth_core_card_list.list);
4330 qeth_determine_capabilities(card);
4334 qeth_core_free_discipline(card);
4336 if (card->info.type == QETH_CARD_TYPE_OSN)
4341 debug_unregister(card->debug);
4343 qeth_core_free_card(card);
4352 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4356 if (card->info.type == QETH_CARD_TYPE_OSN) {
4362 if (card->discipline.ccwgdriver) {
4363 card->discipline.ccwgdriver->remove(gdev);
4364 qeth_core_free_discipline(card);
4367 debug_unregister(card->debug);
4369 list_del(&card->list);
4371 qeth_core_free_card(card);
4379 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4383 if (!card->discipline.ccwgdriver) {
4384 if (card->info.type == QETH_CARD_TYPE_IQD)
4388 rc = qeth_core_load_discipline(card, def_discipline);
4391 rc = card->discipline.ccwgdriver->probe(card->gdev);
4395 rc = card->discipline.ccwgdriver->set_online(gdev);
4402 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4403 return card->discipline.ccwgdriver->set_offline(gdev);
4408 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4409 if (card->discipline.ccwgdriver &&
4410 card->discipline.ccwgdriver->shutdown)
4411 card->discipline.ccwgdriver->shutdown(gdev);
4416 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4417 if (card->discipline.ccwgdriver &&
4418 card->discipline.ccwgdriver->prepare)
4419 return card->discipline.ccwgdriver->prepare(gdev);
4425 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4426 if (card->discipline.ccwgdriver &&
4427 card->discipline.ccwgdriver->complete)
4428 card->discipline.ccwgdriver->complete(gdev);
4433 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4434 if (card->discipline.ccwgdriver &&
4435 card->discipline.ccwgdriver->freeze)
4436 return card->discipline.ccwgdriver->freeze(gdev);
4442 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4443 if (card->discipline.ccwgdriver &&
4444 card->discipline.ccwgdriver->thaw)
4445 return card->discipline.ccwgdriver->thaw(gdev);
4451 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
4452 if (card->discipline.ccwgdriver &&
4453 card->discipline.ccwgdriver->restore)
4454 return card->discipline.ccwgdriver->restore(gdev);
4543 struct qeth_card *card = dev->ml_priv;
4544 data[0] = card->stats.rx_packets -
4545 card->perf_stats.initial_rx_packets;
4546 data[1] = card->perf_stats.bufs_rec;
4547 data[2] = card->stats.tx_packets -
4548 card->perf_stats.initial_tx_packets;
4549 data[3] = card->perf_stats.bufs_sent;
4550 data[4] = card->stats.tx_packets - card->perf_stats.initial_tx_packets
4551 - card->perf_stats.skbs_sent_pack;
4552 data[5] = card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack;
4553 data[6] = card->perf_stats.skbs_sent_pack;
4554 data[7] = card->perf_stats.bufs_sent_pack;
4555 data[8] = card->perf_stats.sg_skbs_sent;
4556 data[9] = card->perf_stats.sg_frags_sent;
4557 data[10] = card->perf_stats.sg_skbs_rx;
4558 data[11] = card->perf_stats.sg_frags_rx;
4559 data[12] = card->perf_stats.sg_alloc_page_rx;
4560 data[13] = (card->perf_stats.large_send_bytes >> 10);
4561 data[14] = card->perf_stats.large_send_cnt;
4562 data[15] = card->perf_stats.sc_dp_p;
4563 data[16] = card->perf_stats.sc_p_dp;
4566 data[19] = atomic_read(&card->qdio.out_qs[0]->used_buffers);
4567 data[20] = (card->qdio.no_out_queues > 1) ?
4568 atomic_read(&card->qdio.out_qs[1]->used_buffers) : 0;
4569 data[21] = (card->qdio.no_out_queues > 2) ?
4570 atomic_read(&card->qdio.out_qs[2]->used_buffers) : 0;
4571 data[22] = (card->qdio.no_out_queues > 3) ?
4572 atomic_read(&card->qdio.out_qs[3]->used_buffers) : 0;
4573 data[23] = card->perf_stats.inbound_time;
4574 data[24] = card->perf_stats.inbound_cnt;
4575 data[25] = card->perf_stats.inbound_do_qdio_time;
4576 data[26] = card->perf_stats.inbound_do_qdio_cnt;
4577 data[27] = card->perf_stats.outbound_handler_time;
4578 data[28] = card->perf_stats.outbound_handler_cnt;
4579 data[29] = card->perf_stats.outbound_time;
4580 data[30] = card->perf_stats.outbound_cnt;
4581 data[31] = card->perf_stats.outbound_do_qdio_time;
4582 data[32] = card->perf_stats.outbound_do_qdio_cnt;
4583 data[33] = card->perf_stats.tx_csum;
4584 data[34] = card->perf_stats.tx_lin;
4605 struct qeth_card *card = dev->ml_priv;
4606 if (card->options.layer2)
4612 strcpy(info->fw_version, card->info.mcl_level);
4614 CARD_RDEV_ID(card),
4615 CARD_WDEV_ID(card),
4616 CARD_DDEV_ID(card));
4623 struct qeth_card *card = netdev->ml_priv;
4626 if ((card->info.type == QETH_CARD_TYPE_IQD) || (card->info.guestlan))
4629 link_type = card->info.link_type;