43
43
static int __qeth_l3_set_online(struct ccwgroup_device *, int);
44
44
static int __qeth_l3_set_offline(struct ccwgroup_device *, int);
46
int qeth_l3_set_large_send(struct qeth_card *card,
47
enum qeth_large_send_types type)
51
card->options.large_send = type;
52
if (card->dev == NULL)
55
if (card->options.large_send == QETH_LARGE_SEND_TSO) {
56
if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) {
57
card->dev->features |= NETIF_F_TSO | NETIF_F_SG |
60
card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG |
62
card->options.large_send = QETH_LARGE_SEND_NO;
66
card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG |
68
card->options.large_send = QETH_LARGE_SEND_NO;
73
46
static int qeth_l3_isxdigit(char *buf)
530
502
addr = list_entry(card->ip_list.next,
531
503
struct qeth_ipaddr, entry);
532
504
list_del_init(&addr->entry);
534
spin_unlock_irqrestore(&card->ip_lock, flags);
535
qeth_l3_deregister_addr_entry(card, addr);
536
spin_lock_irqsave(&card->ip_lock, flags);
538
505
if (!recover || addr->is_multicast) {
1313
static int qeth_l3_query_ipassists_cb(struct qeth_card *card,
1314
struct qeth_reply *reply, unsigned long data)
1316
struct qeth_ipa_cmd *cmd;
1318
QETH_DBF_TEXT(SETUP, 2, "qipasscb");
1320
cmd = (struct qeth_ipa_cmd *) data;
1321
if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
1322
card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
1323
card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
1325
card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
1326
card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
1328
QETH_DBF_TEXT(SETUP, 2, "suppenbl");
1329
QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_supported);
1330
QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_enabled);
1334
static int qeth_l3_query_ipassists(struct qeth_card *card,
1335
enum qeth_prot_versions prot)
1338
struct qeth_cmd_buffer *iob;
1340
QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
1341
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
1342
rc = qeth_send_ipa_cmd(card, iob, qeth_l3_query_ipassists_cb, NULL);
1346
1280
#ifdef CONFIG_QETH_IPV6
1347
1281
static int qeth_l3_softsetup_ipv6(struct qeth_card *card)
1481
int qeth_l3_set_rx_csum(struct qeth_card *card,
1482
enum qeth_checksum_types csum_type)
1415
int qeth_l3_set_rx_csum(struct qeth_card *card, int on)
1486
if (card->options.checksum_type == HW_CHECKSUMMING) {
1487
if ((csum_type != HW_CHECKSUMMING) &&
1488
(card->state != CARD_STATE_DOWN)) {
1489
rc = qeth_l3_send_simple_setassparms(card,
1490
IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
1420
rc = qeth_l3_send_checksum_command(card);
1423
dev_info(&card->gdev->dev,
1424
"HW Checksumming (inbound) enabled\n");
1495
if (csum_type == HW_CHECKSUMMING) {
1496
if (card->state != CARD_STATE_DOWN) {
1497
if (!qeth_is_supported(card,
1498
IPA_INBOUND_CHECKSUM))
1500
rc = qeth_l3_send_checksum_command(card);
1426
rc = qeth_l3_send_simple_setassparms(card,
1427
IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
1506
card->options.checksum_type = csum_type;
1510
1435
static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
1514
1437
QETH_CARD_TEXT(card, 3, "strtcsum");
1516
if (card->options.checksum_type == NO_CHECKSUMMING) {
1517
dev_info(&card->gdev->dev,
1518
"Using no checksumming on %s.\n",
1519
QETH_CARD_IFNAME(card));
1522
if (card->options.checksum_type == SW_CHECKSUMMING) {
1523
dev_info(&card->gdev->dev,
1524
"Using SW checksumming on %s.\n",
1525
QETH_CARD_IFNAME(card));
1528
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
1529
dev_info(&card->gdev->dev,
1530
"Inbound HW Checksumming not "
1531
"supported on %s,\ncontinuing "
1532
"using Inbound SW Checksumming\n",
1533
QETH_CARD_IFNAME(card));
1534
card->options.checksum_type = SW_CHECKSUMMING;
1537
rc = qeth_l3_send_checksum_command(card);
1539
dev_info(&card->gdev->dev,
1540
"HW Checksumming (inbound) enabled\n");
1439
if (card->dev->features & NETIF_F_RXCSUM) {
1441
/* force set_features call */
1442
card->dev->features &= ~NETIF_F_RXCSUM;
1443
netdev_update_features(card->dev);
1545
1449
static int qeth_l3_start_ipa_tx_checksum(struct qeth_card *card)
1614
static int qeth_l3_put_unique_id(struct qeth_card *card)
1618
struct qeth_cmd_buffer *iob;
1619
struct qeth_ipa_cmd *cmd;
1621
QETH_CARD_TEXT(card, 2, "puniqeid");
1623
if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
1624
UNIQUE_ID_NOT_BY_CARD)
1626
iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR,
1628
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1629
*((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
1630
card->info.unique_id;
1631
memcpy(&cmd->data.create_destroy_addr.unique_id[0],
1632
card->dev->dev_addr, OSA_ADDR_LEN);
1633
rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
1637
1516
static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card,
1638
1517
struct qeth_reply *reply, unsigned long data)
2324
2197
dev_close(card->dev);
2327
if (!card->use_hard_stop) {
2328
rc = qeth_send_stoplan(card);
2330
QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
2332
2200
card->state = CARD_STATE_SOFTSETUP;
2334
2202
if (card->state == CARD_STATE_SOFTSETUP) {
2335
qeth_l3_clear_ip_list(card, !card->use_hard_stop, 1);
2203
qeth_l3_clear_ip_list(card, 1);
2336
2204
qeth_clear_ipacmd_list(card);
2337
2205
card->state = CARD_STATE_HARDSETUP;
2339
2207
if (card->state == CARD_STATE_HARDSETUP) {
2340
if (!card->use_hard_stop &&
2341
(card->info.type != QETH_CARD_TYPE_IQD)) {
2342
rc = qeth_l3_put_unique_id(card);
2344
QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
2346
2208
qeth_qdio_clear_card(card, 0);
2347
2209
qeth_clear_qdio_buffers(card);
2348
2210
qeth_clear_working_pool_list(card);
3292
static u32 qeth_l3_ethtool_get_rx_csum(struct net_device *dev)
3294
struct qeth_card *card = dev->ml_priv;
3296
return (card->options.checksum_type == HW_CHECKSUMMING);
3299
static int qeth_l3_ethtool_set_rx_csum(struct net_device *dev, u32 data)
3301
struct qeth_card *card = dev->ml_priv;
3302
enum qeth_checksum_types csum_type;
3305
csum_type = HW_CHECKSUMMING;
3307
csum_type = SW_CHECKSUMMING;
3309
return qeth_l3_set_rx_csum(card, csum_type);
3312
static int qeth_l3_ethtool_set_tso(struct net_device *dev, u32 data)
3314
struct qeth_card *card = dev->ml_priv;
3318
rc = qeth_l3_set_large_send(card, QETH_LARGE_SEND_TSO);
3320
dev->features &= ~NETIF_F_TSO;
3321
card->options.large_send = QETH_LARGE_SEND_NO;
3326
static int qeth_l3_ethtool_set_tx_csum(struct net_device *dev, u32 data)
3328
struct qeth_card *card = dev->ml_priv;
3331
if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
3332
dev->features |= NETIF_F_IP_CSUM;
3336
dev->features &= ~NETIF_F_IP_CSUM;
3151
static u32 qeth_l3_fix_features(struct net_device *dev, u32 features)
3153
struct qeth_card *card = dev->ml_priv;
3155
if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
3156
features &= ~NETIF_F_IP_CSUM;
3157
if (!qeth_is_supported(card, IPA_OUTBOUND_TSO))
3158
features &= ~NETIF_F_TSO;
3159
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
3160
features &= ~NETIF_F_RXCSUM;
3165
static int qeth_l3_set_features(struct net_device *dev, u32 features)
3167
struct qeth_card *card = dev->ml_priv;
3168
u32 changed = dev->features ^ features;
3171
if (!(changed & NETIF_F_RXCSUM))
3174
if (card->state == CARD_STATE_DOWN ||
3175
card->state == CARD_STATE_RECOVER)
3178
err = qeth_l3_set_rx_csum(card, features & NETIF_F_RXCSUM);
3180
dev->features = features ^ NETIF_F_RXCSUM;
3341
3185
static const struct ethtool_ops qeth_l3_ethtool_ops = {
3342
3186
.get_link = ethtool_op_get_link,
3343
.get_tx_csum = ethtool_op_get_tx_csum,
3344
.set_tx_csum = qeth_l3_ethtool_set_tx_csum,
3345
.get_rx_csum = qeth_l3_ethtool_get_rx_csum,
3346
.set_rx_csum = qeth_l3_ethtool_set_rx_csum,
3347
.get_sg = ethtool_op_get_sg,
3348
.set_sg = ethtool_op_set_sg,
3349
.get_tso = ethtool_op_get_tso,
3350
.set_tso = qeth_l3_ethtool_set_tso,
3351
3187
.get_strings = qeth_core_get_strings,
3352
3188
.get_ethtool_stats = qeth_core_get_ethtool_stats,
3353
3189
.get_sset_count = qeth_core_get_sset_count,
3388
3224
.ndo_set_multicast_list = qeth_l3_set_multicast_list,
3389
3225
.ndo_do_ioctl = qeth_l3_do_ioctl,
3390
3226
.ndo_change_mtu = qeth_change_mtu,
3227
.ndo_fix_features = qeth_l3_fix_features,
3228
.ndo_set_features = qeth_l3_set_features,
3391
3229
.ndo_vlan_rx_register = qeth_l3_vlan_rx_register,
3392
3230
.ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid,
3393
3231
.ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid,
3403
3241
.ndo_set_multicast_list = qeth_l3_set_multicast_list,
3404
3242
.ndo_do_ioctl = qeth_l3_do_ioctl,
3405
3243
.ndo_change_mtu = qeth_change_mtu,
3244
.ndo_fix_features = qeth_l3_fix_features,
3245
.ndo_set_features = qeth_l3_set_features,
3406
3246
.ndo_vlan_rx_register = qeth_l3_vlan_rx_register,
3407
3247
.ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid,
3408
3248
.ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid,
3433
3273
if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
3434
3274
card->dev->dev_id = card->info.unique_id &
3276
if (!card->info.guestlan) {
3277
card->dev->hw_features = NETIF_F_SG |
3278
NETIF_F_RXCSUM | NETIF_F_IP_CSUM |
3280
card->dev->features = NETIF_F_RXCSUM;
3437
3283
} else if (card->info.type == QETH_CARD_TYPE_IQD) {
3438
3284
card->dev = alloc_netdev(0, "hsi%d", ether_setup);
3483
3330
qeth_set_allowed_threads(card, 0, 1);
3484
3331
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
3486
if (cgdev->state == CCWGROUP_ONLINE) {
3487
card->use_hard_stop = 1;
3333
if (cgdev->state == CCWGROUP_ONLINE)
3488
3334
qeth_l3_set_offline(cgdev);
3491
3336
if (card->dev) {
3492
3337
unregister_netdev(card->dev);
3493
3338
card->dev = NULL;
3496
qeth_l3_clear_ip_list(card, 0, 0);
3341
qeth_l3_clear_ip_list(card, 0);
3497
3342
qeth_l3_clear_ipato_list(card);
3518
3363
goto out_remove;
3521
qeth_l3_query_ipassists(card, QETH_PROT_IPV4);
3523
3366
if (!card->dev && qeth_l3_setup_netdev(card)) {
3525
3368
goto out_remove;
3371
if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
3372
if (card->info.hwtrap &&
3373
qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
3374
card->info.hwtrap = 0;
3376
card->info.hwtrap = 0;
3528
3378
card->state = CARD_STATE_HARDSETUP;
3529
3379
memset(&card->rx, 0, sizeof(struct qeth_rx));
3530
3380
qeth_print_status_message(card);
3628
3476
if (card->dev && netif_carrier_ok(card->dev))
3629
3477
netif_carrier_off(card->dev);
3630
3478
recover_flag = card->state;
3479
if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
3480
qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
3481
card->info.hwtrap = 1;
3631
3483
qeth_l3_stop_card(card, recovery_mode);
3632
3484
rc = ccw_device_set_offline(CARD_DDEV(card));
3633
3485
rc2 = ccw_device_set_offline(CARD_WDEV(card));
3684
3535
static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
3686
3537
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
3687
qeth_l3_clear_ip_list(card, 0, 0);
3538
if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
3539
qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
3688
3540
qeth_qdio_clear_card(card, 0);
3689
3541
qeth_clear_qdio_buffers(card);