302
303
int com = cmd->hdr.command;
303
304
ipa_name = qeth_get_ipa_cmd_name(com);
305
QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s returned x%X \"%s\"\n",
306
ipa_name, com, QETH_CARD_IFNAME(card),
307
rc, qeth_get_ipa_msg(rc));
306
QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned "
308
ipa_name, com, dev_name(&card->gdev->dev),
309
QETH_CARD_IFNAME(card), rc,
310
qeth_get_ipa_msg(rc));
309
QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s succeeded\n",
310
ipa_name, com, QETH_CARD_IFNAME(card));
312
QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n",
313
ipa_name, com, dev_name(&card->gdev->dev),
314
QETH_CARD_IFNAME(card));
313
317
static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
2491
2503
EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
2493
static int qeth_send_startstoplan(struct qeth_card *card,
2494
enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot)
2497
struct qeth_cmd_buffer *iob;
2499
iob = qeth_get_ipacmd_buffer(card, ipacmd, prot);
2500
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2505
2505
int qeth_send_startlan(struct qeth_card *card)
2508
struct qeth_cmd_buffer *iob;
2509
2510
QETH_DBF_TEXT(SETUP, 2, "strtlan");
2511
rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0);
2512
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2513
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2514
2516
EXPORT_SYMBOL_GPL(qeth_send_startlan);
2516
int qeth_send_stoplan(struct qeth_card *card)
2521
* TODO: according to the IPA format document page 14,
2522
* TCP/IP (we!) never issue a STOPLAN
2525
QETH_DBF_TEXT(SETUP, 2, "stoplan");
2527
rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 0);
2530
EXPORT_SYMBOL_GPL(qeth_send_stoplan);
2532
2518
int qeth_default_setadapterparms_cb(struct qeth_card *card,
2533
2519
struct qeth_reply *reply, unsigned long data)
2594
2580
EXPORT_SYMBOL_GPL(qeth_query_setadapterparms);
2582
static int qeth_query_ipassists_cb(struct qeth_card *card,
2583
struct qeth_reply *reply, unsigned long data)
2585
struct qeth_ipa_cmd *cmd;
2587
QETH_DBF_TEXT(SETUP, 2, "qipasscb");
2589
cmd = (struct qeth_ipa_cmd *) data;
2590
if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
2591
card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
2592
card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
2594
card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
2595
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
2597
QETH_DBF_TEXT(SETUP, 2, "suppenbl");
2598
QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_supported);
2599
QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_enabled);
2603
int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
2606
struct qeth_cmd_buffer *iob;
2608
QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
2609
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
2610
rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
2613
EXPORT_SYMBOL_GPL(qeth_query_ipassists);
2615
static int qeth_query_setdiagass_cb(struct qeth_card *card,
2616
struct qeth_reply *reply, unsigned long data)
2618
struct qeth_ipa_cmd *cmd;
2621
cmd = (struct qeth_ipa_cmd *)data;
2622
rc = cmd->hdr.return_code;
2624
QETH_CARD_TEXT_(card, 2, "diagq:%x", rc);
2626
card->info.diagass_support = cmd->data.diagass.ext;
2630
static int qeth_query_setdiagass(struct qeth_card *card)
2632
struct qeth_cmd_buffer *iob;
2633
struct qeth_ipa_cmd *cmd;
2635
QETH_DBF_TEXT(SETUP, 2, "qdiagass");
2636
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
2637
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
2638
cmd->data.diagass.subcmd_len = 16;
2639
cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY;
2640
return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
2643
static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
2645
unsigned long info = get_zeroed_page(GFP_KERNEL);
2646
struct sysinfo_2_2_2 *info222 = (struct sysinfo_2_2_2 *)info;
2647
struct sysinfo_3_2_2 *info322 = (struct sysinfo_3_2_2 *)info;
2648
struct ccw_dev_id ccwid;
2651
tid->chpid = card->info.chpid;
2652
ccw_device_get_id(CARD_RDEV(card), &ccwid);
2653
tid->ssid = ccwid.ssid;
2654
tid->devno = ccwid.devno;
2658
rc = stsi(NULL, 0, 0, 0);
2662
level = (((unsigned int) rc) >> 28);
2664
if ((level >= 2) && (stsi(info222, 2, 2, 2) != -ENOSYS))
2665
tid->lparnr = info222->lpar_number;
2667
if ((level >= 3) && (stsi(info322, 3, 2, 2) != -ENOSYS)) {
2668
EBCASC(info322->vm[0].name, sizeof(info322->vm[0].name));
2669
memcpy(tid->vmname, info322->vm[0].name, sizeof(tid->vmname));
2675
static int qeth_hw_trap_cb(struct qeth_card *card,
2676
struct qeth_reply *reply, unsigned long data)
2678
struct qeth_ipa_cmd *cmd;
2681
cmd = (struct qeth_ipa_cmd *)data;
2682
rc = cmd->hdr.return_code;
2684
QETH_CARD_TEXT_(card, 2, "trapc:%x", rc);
2688
int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
2690
struct qeth_cmd_buffer *iob;
2691
struct qeth_ipa_cmd *cmd;
2693
QETH_DBF_TEXT(SETUP, 2, "diagtrap");
2694
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
2695
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
2696
cmd->data.diagass.subcmd_len = 80;
2697
cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP;
2698
cmd->data.diagass.type = 1;
2699
cmd->data.diagass.action = action;
2701
case QETH_DIAGS_TRAP_ARM:
2702
cmd->data.diagass.options = 0x0003;
2703
cmd->data.diagass.ext = 0x00010000 +
2704
sizeof(struct qeth_trap_id);
2705
qeth_get_trap_id(card,
2706
(struct qeth_trap_id *)cmd->data.diagass.cdata);
2708
case QETH_DIAGS_TRAP_DISARM:
2709
cmd->data.diagass.options = 0x0001;
2711
case QETH_DIAGS_TRAP_CAPTURE:
2714
return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
2716
EXPORT_SYMBOL_GPL(qeth_hw_trap);
2596
2718
int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
2597
2719
unsigned int qdio_error, const char *dbftext)
2599
2721
if (qdio_error) {
2600
2722
QETH_CARD_TEXT(card, 2, dbftext);
2601
2723
QETH_CARD_TEXT_(card, 2, " F15=%02X",
2602
buf->element[15].flags & 0xff);
2724
buf->element[15].sflags);
2603
2725
QETH_CARD_TEXT_(card, 2, " F14=%02X",
2604
buf->element[14].flags & 0xff);
2726
buf->element[14].sflags);
2605
2727
QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
2606
if ((buf->element[15].flags & 0xff) == 0x12) {
2728
if ((buf->element[15].sflags) == 0x12) {
2607
2729
card->stats.rx_dropped++;