Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.35 3762 lines 101 kB view raw
1/* 2 * drivers/s390/net/qeth_l3_main.c 3 * 4 * Copyright IBM Corp. 2007, 2009 5 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, 6 * Frank Pavlic <fpavlic@de.ibm.com>, 7 * Thomas Spatzier <tspat@de.ibm.com>, 8 * Frank Blaschka <frank.blaschka@de.ibm.com> 9 */ 10 11#define KMSG_COMPONENT "qeth" 12#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 13 14#include <linux/module.h> 15#include <linux/moduleparam.h> 16#include <linux/string.h> 17#include <linux/errno.h> 18#include <linux/kernel.h> 19#include <linux/etherdevice.h> 20#include <linux/mii.h> 21#include <linux/ip.h> 22#include <linux/ipv6.h> 23#include <linux/inetdevice.h> 24#include <linux/igmp.h> 25#include <linux/slab.h> 26 27#include <net/ip.h> 28#include <net/arp.h> 29#include <net/ip6_checksum.h> 30 31#include "qeth_l3.h" 32 33static int qeth_l3_set_offline(struct ccwgroup_device *); 34static int qeth_l3_recover(void *); 35static int qeth_l3_stop(struct net_device *); 36static void qeth_l3_set_multicast_list(struct net_device *); 37static int qeth_l3_neigh_setup(struct net_device *, struct neigh_parms *); 38static int qeth_l3_register_addr_entry(struct qeth_card *, 39 struct qeth_ipaddr *); 40static int qeth_l3_deregister_addr_entry(struct qeth_card *, 41 struct qeth_ipaddr *); 42static int __qeth_l3_set_online(struct ccwgroup_device *, int); 43static int __qeth_l3_set_offline(struct ccwgroup_device *, int); 44 45int qeth_l3_set_large_send(struct qeth_card *card, 46 enum qeth_large_send_types type) 47{ 48 int rc = 0; 49 50 card->options.large_send = type; 51 if (card->dev == NULL) 52 return 0; 53 54 if (card->options.large_send == QETH_LARGE_SEND_TSO) { 55 if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) { 56 card->dev->features |= NETIF_F_TSO | NETIF_F_SG | 57 NETIF_F_IP_CSUM; 58 } else { 59 card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | 60 NETIF_F_IP_CSUM); 61 card->options.large_send = QETH_LARGE_SEND_NO; 62 rc = -EOPNOTSUPP; 63 } 64 } else { 65 card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | 66 NETIF_F_IP_CSUM); 67 card->options.large_send = QETH_LARGE_SEND_NO; 68 } 69 return rc; 70} 71 72static int qeth_l3_isxdigit(char *buf) 73{ 74 while (*buf) { 75 if (!isxdigit(*buf++)) 76 return 0; 77 } 78 return 1; 79} 80 81void qeth_l3_ipaddr4_to_string(const __u8 *addr, char *buf) 82{ 83 sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]); 84} 85 86int qeth_l3_string_to_ipaddr4(const char *buf, __u8 *addr) 87{ 88 int count = 0, rc = 0; 89 int in[4]; 90 char c; 91 92 rc = sscanf(buf, "%u.%u.%u.%u%c", 93 &in[0], &in[1], &in[2], &in[3], &c); 94 if (rc != 4 && (rc != 5 || c != '\n')) 95 return -EINVAL; 96 for (count = 0; count < 4; count++) { 97 if (in[count] > 255) 98 return -EINVAL; 99 addr[count] = in[count]; 100 } 101 return 0; 102} 103 104void qeth_l3_ipaddr6_to_string(const __u8 *addr, char *buf) 105{ 106 sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x" 107 ":%02x%02x:%02x%02x:%02x%02x:%02x%02x", 108 addr[0], addr[1], addr[2], addr[3], 109 addr[4], addr[5], addr[6], addr[7], 110 addr[8], addr[9], addr[10], addr[11], 111 addr[12], addr[13], addr[14], addr[15]); 112} 113 114int qeth_l3_string_to_ipaddr6(const char *buf, __u8 *addr) 115{ 116 const char *end, *end_tmp, *start; 117 __u16 *in; 118 char num[5]; 119 int num2, cnt, out, found, save_cnt; 120 unsigned short in_tmp[8] = {0, }; 121 122 cnt = out = found = save_cnt = num2 = 0; 123 end = start = buf; 124 in = (__u16 *) addr; 125 memset(in, 0, 16); 126 while (*end) { 127 end = strchr(start, ':'); 128 if (end == NULL) { 129 end = buf + strlen(buf); 130 end_tmp = strchr(start, '\n'); 131 if (end_tmp != NULL) 132 end = end_tmp; 133 out = 1; 134 } 135 if ((end - start)) { 136 memset(num, 0, 5); 137 if ((end - start) > 4) 138 return -EINVAL; 139 memcpy(num, start, end - start); 140 if (!qeth_l3_isxdigit(num)) 141 return -EINVAL; 142 sscanf(start, "%x", &num2); 143 if (found) 144 in_tmp[save_cnt++] = num2; 145 else 146 in[cnt++] = num2; 147 if (out) 148 break; 149 } else { 150 if (found) 151 return -EINVAL; 152 found = 1; 153 } 154 start = ++end; 155 } 156 if (cnt + save_cnt > 8) 157 return -EINVAL; 158 cnt = 7; 159 while (save_cnt) 160 in[cnt--] = in_tmp[--save_cnt]; 161 return 0; 162} 163 164void qeth_l3_ipaddr_to_string(enum qeth_prot_versions proto, const __u8 *addr, 165 char *buf) 166{ 167 if (proto == QETH_PROT_IPV4) 168 qeth_l3_ipaddr4_to_string(addr, buf); 169 else if (proto == QETH_PROT_IPV6) 170 qeth_l3_ipaddr6_to_string(addr, buf); 171} 172 173int qeth_l3_string_to_ipaddr(const char *buf, enum qeth_prot_versions proto, 174 __u8 *addr) 175{ 176 if (proto == QETH_PROT_IPV4) 177 return qeth_l3_string_to_ipaddr4(buf, addr); 178 else if (proto == QETH_PROT_IPV6) 179 return qeth_l3_string_to_ipaddr6(buf, addr); 180 else 181 return -EINVAL; 182} 183 184static void qeth_l3_convert_addr_to_bits(u8 *addr, u8 *bits, int len) 185{ 186 int i, j; 187 u8 octet; 188 189 for (i = 0; i < len; ++i) { 190 octet = addr[i]; 191 for (j = 7; j >= 0; --j) { 192 bits[i*8 + j] = octet & 1; 193 octet >>= 1; 194 } 195 } 196} 197 198static int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card, 199 struct qeth_ipaddr *addr) 200{ 201 struct qeth_ipato_entry *ipatoe; 202 u8 addr_bits[128] = {0, }; 203 u8 ipatoe_bits[128] = {0, }; 204 int rc = 0; 205 206 if (!card->ipato.enabled) 207 return 0; 208 209 qeth_l3_convert_addr_to_bits((u8 *) &addr->u, addr_bits, 210 (addr->proto == QETH_PROT_IPV4)? 4:16); 211 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { 212 if (addr->proto != ipatoe->proto) 213 continue; 214 qeth_l3_convert_addr_to_bits(ipatoe->addr, ipatoe_bits, 215 (ipatoe->proto == QETH_PROT_IPV4) ? 216 4 : 16); 217 if (addr->proto == QETH_PROT_IPV4) 218 rc = !memcmp(addr_bits, ipatoe_bits, 219 min(32, ipatoe->mask_bits)); 220 else 221 rc = !memcmp(addr_bits, ipatoe_bits, 222 min(128, ipatoe->mask_bits)); 223 if (rc) 224 break; 225 } 226 /* invert? */ 227 if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4) 228 rc = !rc; 229 else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6) 230 rc = !rc; 231 232 return rc; 233} 234 235/* 236 * Add IP to be added to todo list. If there is already an "add todo" 237 * in this list we just incremenent the reference count. 238 * Returns 0 if we just incremented reference count. 239 */ 240static int __qeth_l3_insert_ip_todo(struct qeth_card *card, 241 struct qeth_ipaddr *addr, int add) 242{ 243 struct qeth_ipaddr *tmp, *t; 244 int found = 0; 245 246 if (card->options.sniffer) 247 return 0; 248 list_for_each_entry_safe(tmp, t, card->ip_tbd_list, entry) { 249 if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) && 250 (tmp->type == QETH_IP_TYPE_DEL_ALL_MC)) 251 return 0; 252 if ((tmp->proto == QETH_PROT_IPV4) && 253 (addr->proto == QETH_PROT_IPV4) && 254 (tmp->type == addr->type) && 255 (tmp->is_multicast == addr->is_multicast) && 256 (tmp->u.a4.addr == addr->u.a4.addr) && 257 (tmp->u.a4.mask == addr->u.a4.mask)) { 258 found = 1; 259 break; 260 } 261 if ((tmp->proto == QETH_PROT_IPV6) && 262 (addr->proto == QETH_PROT_IPV6) && 263 (tmp->type == addr->type) && 264 (tmp->is_multicast == addr->is_multicast) && 265 (tmp->u.a6.pfxlen == addr->u.a6.pfxlen) && 266 (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr, 267 sizeof(struct in6_addr)) == 0)) { 268 found = 1; 269 break; 270 } 271 } 272 if (found) { 273 if (addr->users != 0) 274 tmp->users += addr->users; 275 else 276 tmp->users += add ? 1 : -1; 277 if (tmp->users == 0) { 278 list_del(&tmp->entry); 279 kfree(tmp); 280 } 281 return 0; 282 } else { 283 if (addr->type == QETH_IP_TYPE_DEL_ALL_MC) 284 list_add(&addr->entry, card->ip_tbd_list); 285 else { 286 if (addr->users == 0) 287 addr->users += add ? 1 : -1; 288 if (add && (addr->type == QETH_IP_TYPE_NORMAL) && 289 qeth_l3_is_addr_covered_by_ipato(card, addr)) { 290 QETH_DBF_TEXT(TRACE, 2, "tkovaddr"); 291 addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG; 292 } 293 list_add_tail(&addr->entry, card->ip_tbd_list); 294 } 295 return 1; 296 } 297} 298 299static int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr) 300{ 301 unsigned long flags; 302 int rc = 0; 303 304 QETH_DBF_TEXT(TRACE, 4, "delip"); 305 306 if (addr->proto == QETH_PROT_IPV4) 307 QETH_DBF_HEX(TRACE, 4, &addr->u.a4.addr, 4); 308 else { 309 QETH_DBF_HEX(TRACE, 4, &addr->u.a6.addr, 8); 310 QETH_DBF_HEX(TRACE, 4, ((char *)&addr->u.a6.addr) + 8, 8); 311 } 312 spin_lock_irqsave(&card->ip_lock, flags); 313 rc = __qeth_l3_insert_ip_todo(card, addr, 0); 314 spin_unlock_irqrestore(&card->ip_lock, flags); 315 return rc; 316} 317 318static int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr) 319{ 320 unsigned long flags; 321 int rc = 0; 322 323 QETH_DBF_TEXT(TRACE, 4, "addip"); 324 if (addr->proto == QETH_PROT_IPV4) 325 QETH_DBF_HEX(TRACE, 4, &addr->u.a4.addr, 4); 326 else { 327 QETH_DBF_HEX(TRACE, 4, &addr->u.a6.addr, 8); 328 QETH_DBF_HEX(TRACE, 4, ((char *)&addr->u.a6.addr) + 8, 8); 329 } 330 spin_lock_irqsave(&card->ip_lock, flags); 331 rc = __qeth_l3_insert_ip_todo(card, addr, 1); 332 spin_unlock_irqrestore(&card->ip_lock, flags); 333 return rc; 334} 335 336 337static struct qeth_ipaddr *qeth_l3_get_addr_buffer( 338 enum qeth_prot_versions prot) 339{ 340 struct qeth_ipaddr *addr; 341 342 addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC); 343 if (addr == NULL) { 344 return NULL; 345 } 346 addr->type = QETH_IP_TYPE_NORMAL; 347 addr->proto = prot; 348 return addr; 349} 350 351static void qeth_l3_delete_mc_addresses(struct qeth_card *card) 352{ 353 struct qeth_ipaddr *iptodo; 354 unsigned long flags; 355 356 QETH_DBF_TEXT(TRACE, 4, "delmc"); 357 iptodo = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); 358 if (!iptodo) { 359 QETH_DBF_TEXT(TRACE, 2, "dmcnomem"); 360 return; 361 } 362 iptodo->type = QETH_IP_TYPE_DEL_ALL_MC; 363 spin_lock_irqsave(&card->ip_lock, flags); 364 if (!__qeth_l3_insert_ip_todo(card, iptodo, 0)) 365 kfree(iptodo); 366 spin_unlock_irqrestore(&card->ip_lock, flags); 367} 368 369/* 370 * Add/remove address to/from card's ip list, i.e. try to add or remove 371 * reference to/from an IP address that is already registered on the card. 372 * Returns: 373 * 0 address was on card and its reference count has been adjusted, 374 * but is still > 0, so nothing has to be done 375 * also returns 0 if card was not on card and the todo was to delete 376 * the address -> there is also nothing to be done 377 * 1 address was not on card and the todo is to add it to the card's ip 378 * list 379 * -1 address was on card and its reference count has been decremented 380 * to <= 0 by the todo -> address must be removed from card 381 */ 382static int __qeth_l3_ref_ip_on_card(struct qeth_card *card, 383 struct qeth_ipaddr *todo, struct qeth_ipaddr **__addr) 384{ 385 struct qeth_ipaddr *addr; 386 int found = 0; 387 388 list_for_each_entry(addr, &card->ip_list, entry) { 389 if ((addr->proto == QETH_PROT_IPV4) && 390 (todo->proto == QETH_PROT_IPV4) && 391 (addr->type == todo->type) && 392 (addr->u.a4.addr == todo->u.a4.addr) && 393 (addr->u.a4.mask == todo->u.a4.mask)) { 394 found = 1; 395 break; 396 } 397 if ((addr->proto == QETH_PROT_IPV6) && 398 (todo->proto == QETH_PROT_IPV6) && 399 (addr->type == todo->type) && 400 (addr->u.a6.pfxlen == todo->u.a6.pfxlen) && 401 (memcmp(&addr->u.a6.addr, &todo->u.a6.addr, 402 sizeof(struct in6_addr)) == 0)) { 403 found = 1; 404 break; 405 } 406 } 407 if (found) { 408 addr->users += todo->users; 409 if (addr->users <= 0) { 410 *__addr = addr; 411 return -1; 412 } else { 413 /* for VIPA and RXIP limit refcount to 1 */ 414 if (addr->type != QETH_IP_TYPE_NORMAL) 415 addr->users = 1; 416 return 0; 417 } 418 } 419 if (todo->users > 0) { 420 /* for VIPA and RXIP limit refcount to 1 */ 421 if (todo->type != QETH_IP_TYPE_NORMAL) 422 todo->users = 1; 423 return 1; 424 } else 425 return 0; 426} 427 428static void __qeth_l3_delete_all_mc(struct qeth_card *card, 429 unsigned long *flags) 430{ 431 struct list_head fail_list; 432 struct qeth_ipaddr *addr, *tmp; 433 int rc; 434 435 INIT_LIST_HEAD(&fail_list); 436again: 437 list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) { 438 if (addr->is_multicast) { 439 list_del(&addr->entry); 440 spin_unlock_irqrestore(&card->ip_lock, *flags); 441 rc = qeth_l3_deregister_addr_entry(card, addr); 442 spin_lock_irqsave(&card->ip_lock, *flags); 443 if (!rc || (rc == IPA_RC_MC_ADDR_NOT_FOUND)) 444 kfree(addr); 445 else 446 list_add_tail(&addr->entry, &fail_list); 447 goto again; 448 } 449 } 450 list_splice(&fail_list, &card->ip_list); 451} 452 453static void qeth_l3_set_ip_addr_list(struct qeth_card *card) 454{ 455 struct list_head *tbd_list; 456 struct qeth_ipaddr *todo, *addr; 457 unsigned long flags; 458 int rc; 459 460 QETH_DBF_TEXT(TRACE, 2, "sdiplist"); 461 QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *)); 462 463 if (card->options.sniffer) 464 return; 465 spin_lock_irqsave(&card->ip_lock, flags); 466 tbd_list = card->ip_tbd_list; 467 card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_ATOMIC); 468 if (!card->ip_tbd_list) { 469 QETH_DBF_TEXT(TRACE, 0, "silnomem"); 470 card->ip_tbd_list = tbd_list; 471 spin_unlock_irqrestore(&card->ip_lock, flags); 472 return; 473 } else 474 INIT_LIST_HEAD(card->ip_tbd_list); 475 476 while (!list_empty(tbd_list)) { 477 todo = list_entry(tbd_list->next, struct qeth_ipaddr, entry); 478 list_del(&todo->entry); 479 if (todo->type == QETH_IP_TYPE_DEL_ALL_MC) { 480 __qeth_l3_delete_all_mc(card, &flags); 481 kfree(todo); 482 continue; 483 } 484 rc = __qeth_l3_ref_ip_on_card(card, todo, &addr); 485 if (rc == 0) { 486 /* nothing to be done; only adjusted refcount */ 487 kfree(todo); 488 } else if (rc == 1) { 489 /* new entry to be added to on-card list */ 490 spin_unlock_irqrestore(&card->ip_lock, flags); 491 rc = qeth_l3_register_addr_entry(card, todo); 492 spin_lock_irqsave(&card->ip_lock, flags); 493 if (!rc || (rc == IPA_RC_LAN_OFFLINE)) 494 list_add_tail(&todo->entry, &card->ip_list); 495 else 496 kfree(todo); 497 } else if (rc == -1) { 498 /* on-card entry to be removed */ 499 list_del_init(&addr->entry); 500 spin_unlock_irqrestore(&card->ip_lock, flags); 501 rc = qeth_l3_deregister_addr_entry(card, addr); 502 spin_lock_irqsave(&card->ip_lock, flags); 503 if (!rc || (rc == IPA_RC_IP_ADDRESS_NOT_DEFINED)) 504 kfree(addr); 505 else 506 list_add_tail(&addr->entry, &card->ip_list); 507 kfree(todo); 508 } 509 } 510 spin_unlock_irqrestore(&card->ip_lock, flags); 511 kfree(tbd_list); 512} 513 514static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean, 515 int recover) 516{ 517 struct qeth_ipaddr *addr, *tmp; 518 unsigned long flags; 519 520 QETH_DBF_TEXT(TRACE, 4, "clearip"); 521 if (recover && card->options.sniffer) 522 return; 523 spin_lock_irqsave(&card->ip_lock, flags); 524 /* clear todo list */ 525 list_for_each_entry_safe(addr, tmp, card->ip_tbd_list, entry) { 526 list_del(&addr->entry); 527 kfree(addr); 528 } 529 530 while (!list_empty(&card->ip_list)) { 531 addr = list_entry(card->ip_list.next, 532 struct qeth_ipaddr, entry); 533 list_del_init(&addr->entry); 534 if (clean) { 535 spin_unlock_irqrestore(&card->ip_lock, flags); 536 qeth_l3_deregister_addr_entry(card, addr); 537 spin_lock_irqsave(&card->ip_lock, flags); 538 } 539 if (!recover || addr->is_multicast) { 540 kfree(addr); 541 continue; 542 } 543 list_add_tail(&addr->entry, card->ip_tbd_list); 544 } 545 spin_unlock_irqrestore(&card->ip_lock, flags); 546} 547 548static int qeth_l3_address_exists_in_list(struct list_head *list, 549 struct qeth_ipaddr *addr, int same_type) 550{ 551 struct qeth_ipaddr *tmp; 552 553 list_for_each_entry(tmp, list, entry) { 554 if ((tmp->proto == QETH_PROT_IPV4) && 555 (addr->proto == QETH_PROT_IPV4) && 556 ((same_type && (tmp->type == addr->type)) || 557 (!same_type && (tmp->type != addr->type))) && 558 (tmp->u.a4.addr == addr->u.a4.addr)) 559 return 1; 560 561 if ((tmp->proto == QETH_PROT_IPV6) && 562 (addr->proto == QETH_PROT_IPV6) && 563 ((same_type && (tmp->type == addr->type)) || 564 (!same_type && (tmp->type != addr->type))) && 565 (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr, 566 sizeof(struct in6_addr)) == 0)) 567 return 1; 568 569 } 570 return 0; 571} 572 573static int qeth_l3_send_setdelmc(struct qeth_card *card, 574 struct qeth_ipaddr *addr, int ipacmd) 575{ 576 int rc; 577 struct qeth_cmd_buffer *iob; 578 struct qeth_ipa_cmd *cmd; 579 580 QETH_DBF_TEXT(TRACE, 4, "setdelmc"); 581 582 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); 583 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 584 memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN); 585 if (addr->proto == QETH_PROT_IPV6) 586 memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr, 587 sizeof(struct in6_addr)); 588 else 589 memcpy(&cmd->data.setdelipm.ip4, &addr->u.a4.addr, 4); 590 591 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 592 593 return rc; 594} 595 596static void qeth_l3_fill_netmask(u8 *netmask, unsigned int len) 597{ 598 int i, j; 599 for (i = 0; i < 16; i++) { 600 j = (len) - (i * 8); 601 if (j >= 8) 602 netmask[i] = 0xff; 603 else if (j > 0) 604 netmask[i] = (u8)(0xFF00 >> j); 605 else 606 netmask[i] = 0; 607 } 608} 609 610static int qeth_l3_send_setdelip(struct qeth_card *card, 611 struct qeth_ipaddr *addr, int ipacmd, unsigned int flags) 612{ 613 int rc; 614 struct qeth_cmd_buffer *iob; 615 struct qeth_ipa_cmd *cmd; 616 __u8 netmask[16]; 617 618 QETH_DBF_TEXT(TRACE, 4, "setdelip"); 619 QETH_DBF_TEXT_(TRACE, 4, "flags%02X", flags); 620 621 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); 622 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 623 if (addr->proto == QETH_PROT_IPV6) { 624 memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr, 625 sizeof(struct in6_addr)); 626 qeth_l3_fill_netmask(netmask, addr->u.a6.pfxlen); 627 memcpy(cmd->data.setdelip6.mask, netmask, 628 sizeof(struct in6_addr)); 629 cmd->data.setdelip6.flags = flags; 630 } else { 631 memcpy(cmd->data.setdelip4.ip_addr, &addr->u.a4.addr, 4); 632 memcpy(cmd->data.setdelip4.mask, &addr->u.a4.mask, 4); 633 cmd->data.setdelip4.flags = flags; 634 } 635 636 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 637 638 return rc; 639} 640 641static int qeth_l3_send_setrouting(struct qeth_card *card, 642 enum qeth_routing_types type, enum qeth_prot_versions prot) 643{ 644 int rc; 645 struct qeth_ipa_cmd *cmd; 646 struct qeth_cmd_buffer *iob; 647 648 QETH_DBF_TEXT(TRACE, 4, "setroutg"); 649 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); 650 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 651 cmd->data.setrtg.type = (type); 652 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 653 654 return rc; 655} 656 657static void qeth_l3_correct_routing_type(struct qeth_card *card, 658 enum qeth_routing_types *type, enum qeth_prot_versions prot) 659{ 660 if (card->info.type == QETH_CARD_TYPE_IQD) { 661 switch (*type) { 662 case NO_ROUTER: 663 case PRIMARY_CONNECTOR: 664 case SECONDARY_CONNECTOR: 665 case MULTICAST_ROUTER: 666 return; 667 default: 668 goto out_inval; 669 } 670 } else { 671 switch (*type) { 672 case NO_ROUTER: 673 case PRIMARY_ROUTER: 674 case SECONDARY_ROUTER: 675 return; 676 case MULTICAST_ROUTER: 677 if (qeth_is_ipafunc_supported(card, prot, 678 IPA_OSA_MC_ROUTER)) 679 return; 680 default: 681 goto out_inval; 682 } 683 } 684out_inval: 685 *type = NO_ROUTER; 686} 687 688int qeth_l3_setrouting_v4(struct qeth_card *card) 689{ 690 int rc; 691 692 QETH_DBF_TEXT(TRACE, 3, "setrtg4"); 693 694 qeth_l3_correct_routing_type(card, &card->options.route4.type, 695 QETH_PROT_IPV4); 696 697 rc = qeth_l3_send_setrouting(card, card->options.route4.type, 698 QETH_PROT_IPV4); 699 if (rc) { 700 card->options.route4.type = NO_ROUTER; 701 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 702 " on %s. Type set to 'no router'.\n", rc, 703 QETH_CARD_IFNAME(card)); 704 } 705 return rc; 706} 707 708int qeth_l3_setrouting_v6(struct qeth_card *card) 709{ 710 int rc = 0; 711 712 QETH_DBF_TEXT(TRACE, 3, "setrtg6"); 713#ifdef CONFIG_QETH_IPV6 714 715 if (!qeth_is_supported(card, IPA_IPV6)) 716 return 0; 717 qeth_l3_correct_routing_type(card, &card->options.route6.type, 718 QETH_PROT_IPV6); 719 720 rc = qeth_l3_send_setrouting(card, card->options.route6.type, 721 QETH_PROT_IPV6); 722 if (rc) { 723 card->options.route6.type = NO_ROUTER; 724 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 725 " on %s. Type set to 'no router'.\n", rc, 726 QETH_CARD_IFNAME(card)); 727 } 728#endif 729 return rc; 730} 731 732/* 733 * IP address takeover related functions 734 */ 735static void qeth_l3_clear_ipato_list(struct qeth_card *card) 736{ 737 738 struct qeth_ipato_entry *ipatoe, *tmp; 739 unsigned long flags; 740 741 spin_lock_irqsave(&card->ip_lock, flags); 742 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { 743 list_del(&ipatoe->entry); 744 kfree(ipatoe); 745 } 746 spin_unlock_irqrestore(&card->ip_lock, flags); 747} 748 749int qeth_l3_add_ipato_entry(struct qeth_card *card, 750 struct qeth_ipato_entry *new) 751{ 752 struct qeth_ipato_entry *ipatoe; 753 unsigned long flags; 754 int rc = 0; 755 756 QETH_DBF_TEXT(TRACE, 2, "addipato"); 757 spin_lock_irqsave(&card->ip_lock, flags); 758 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { 759 if (ipatoe->proto != new->proto) 760 continue; 761 if (!memcmp(ipatoe->addr, new->addr, 762 (ipatoe->proto == QETH_PROT_IPV4)? 4:16) && 763 (ipatoe->mask_bits == new->mask_bits)) { 764 rc = -EEXIST; 765 break; 766 } 767 } 768 if (!rc) 769 list_add_tail(&new->entry, &card->ipato.entries); 770 771 spin_unlock_irqrestore(&card->ip_lock, flags); 772 return rc; 773} 774 775void qeth_l3_del_ipato_entry(struct qeth_card *card, 776 enum qeth_prot_versions proto, u8 *addr, int mask_bits) 777{ 778 struct qeth_ipato_entry *ipatoe, *tmp; 779 unsigned long flags; 780 781 QETH_DBF_TEXT(TRACE, 2, "delipato"); 782 spin_lock_irqsave(&card->ip_lock, flags); 783 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { 784 if (ipatoe->proto != proto) 785 continue; 786 if (!memcmp(ipatoe->addr, addr, 787 (proto == QETH_PROT_IPV4)? 4:16) && 788 (ipatoe->mask_bits == mask_bits)) { 789 list_del(&ipatoe->entry); 790 kfree(ipatoe); 791 } 792 } 793 spin_unlock_irqrestore(&card->ip_lock, flags); 794} 795 796/* 797 * VIPA related functions 798 */ 799int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto, 800 const u8 *addr) 801{ 802 struct qeth_ipaddr *ipaddr; 803 unsigned long flags; 804 int rc = 0; 805 806 ipaddr = qeth_l3_get_addr_buffer(proto); 807 if (ipaddr) { 808 if (proto == QETH_PROT_IPV4) { 809 QETH_DBF_TEXT(TRACE, 2, "addvipa4"); 810 memcpy(&ipaddr->u.a4.addr, addr, 4); 811 ipaddr->u.a4.mask = 0; 812 } else if (proto == QETH_PROT_IPV6) { 813 QETH_DBF_TEXT(TRACE, 2, "addvipa6"); 814 memcpy(&ipaddr->u.a6.addr, addr, 16); 815 ipaddr->u.a6.pfxlen = 0; 816 } 817 ipaddr->type = QETH_IP_TYPE_VIPA; 818 ipaddr->set_flags = QETH_IPA_SETIP_VIPA_FLAG; 819 ipaddr->del_flags = QETH_IPA_DELIP_VIPA_FLAG; 820 } else 821 return -ENOMEM; 822 spin_lock_irqsave(&card->ip_lock, flags); 823 if (qeth_l3_address_exists_in_list(&card->ip_list, ipaddr, 0) || 824 qeth_l3_address_exists_in_list(card->ip_tbd_list, ipaddr, 0)) 825 rc = -EEXIST; 826 spin_unlock_irqrestore(&card->ip_lock, flags); 827 if (rc) { 828 return rc; 829 } 830 if (!qeth_l3_add_ip(card, ipaddr)) 831 kfree(ipaddr); 832 qeth_l3_set_ip_addr_list(card); 833 return rc; 834} 835 836void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto, 837 const u8 *addr) 838{ 839 struct qeth_ipaddr *ipaddr; 840 841 ipaddr = qeth_l3_get_addr_buffer(proto); 842 if (ipaddr) { 843 if (proto == QETH_PROT_IPV4) { 844 QETH_DBF_TEXT(TRACE, 2, "delvipa4"); 845 memcpy(&ipaddr->u.a4.addr, addr, 4); 846 ipaddr->u.a4.mask = 0; 847 } else if (proto == QETH_PROT_IPV6) { 848 QETH_DBF_TEXT(TRACE, 2, "delvipa6"); 849 memcpy(&ipaddr->u.a6.addr, addr, 16); 850 ipaddr->u.a6.pfxlen = 0; 851 } 852 ipaddr->type = QETH_IP_TYPE_VIPA; 853 } else 854 return; 855 if (!qeth_l3_delete_ip(card, ipaddr)) 856 kfree(ipaddr); 857 qeth_l3_set_ip_addr_list(card); 858} 859 860/* 861 * proxy ARP related functions 862 */ 863int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, 864 const u8 *addr) 865{ 866 struct qeth_ipaddr *ipaddr; 867 unsigned long flags; 868 int rc = 0; 869 870 ipaddr = qeth_l3_get_addr_buffer(proto); 871 if (ipaddr) { 872 if (proto == QETH_PROT_IPV4) { 873 QETH_DBF_TEXT(TRACE, 2, "addrxip4"); 874 memcpy(&ipaddr->u.a4.addr, addr, 4); 875 ipaddr->u.a4.mask = 0; 876 } else if (proto == QETH_PROT_IPV6) { 877 QETH_DBF_TEXT(TRACE, 2, "addrxip6"); 878 memcpy(&ipaddr->u.a6.addr, addr, 16); 879 ipaddr->u.a6.pfxlen = 0; 880 } 881 ipaddr->type = QETH_IP_TYPE_RXIP; 882 ipaddr->set_flags = QETH_IPA_SETIP_TAKEOVER_FLAG; 883 ipaddr->del_flags = 0; 884 } else 885 return -ENOMEM; 886 spin_lock_irqsave(&card->ip_lock, flags); 887 if (qeth_l3_address_exists_in_list(&card->ip_list, ipaddr, 0) || 888 qeth_l3_address_exists_in_list(card->ip_tbd_list, ipaddr, 0)) 889 rc = -EEXIST; 890 spin_unlock_irqrestore(&card->ip_lock, flags); 891 if (rc) { 892 return rc; 893 } 894 if (!qeth_l3_add_ip(card, ipaddr)) 895 kfree(ipaddr); 896 qeth_l3_set_ip_addr_list(card); 897 return 0; 898} 899 900void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto, 901 const u8 *addr) 902{ 903 struct qeth_ipaddr *ipaddr; 904 905 ipaddr = qeth_l3_get_addr_buffer(proto); 906 if (ipaddr) { 907 if (proto == QETH_PROT_IPV4) { 908 QETH_DBF_TEXT(TRACE, 2, "addrxip4"); 909 memcpy(&ipaddr->u.a4.addr, addr, 4); 910 ipaddr->u.a4.mask = 0; 911 } else if (proto == QETH_PROT_IPV6) { 912 QETH_DBF_TEXT(TRACE, 2, "addrxip6"); 913 memcpy(&ipaddr->u.a6.addr, addr, 16); 914 ipaddr->u.a6.pfxlen = 0; 915 } 916 ipaddr->type = QETH_IP_TYPE_RXIP; 917 } else 918 return; 919 if (!qeth_l3_delete_ip(card, ipaddr)) 920 kfree(ipaddr); 921 qeth_l3_set_ip_addr_list(card); 922} 923 924static int qeth_l3_register_addr_entry(struct qeth_card *card, 925 struct qeth_ipaddr *addr) 926{ 927 char buf[50]; 928 int rc = 0; 929 int cnt = 3; 930 931 if (addr->proto == QETH_PROT_IPV4) { 932 QETH_DBF_TEXT(TRACE, 2, "setaddr4"); 933 QETH_DBF_HEX(TRACE, 3, &addr->u.a4.addr, sizeof(int)); 934 } else if (addr->proto == QETH_PROT_IPV6) { 935 QETH_DBF_TEXT(TRACE, 2, "setaddr6"); 936 QETH_DBF_HEX(TRACE, 3, &addr->u.a6.addr, 8); 937 QETH_DBF_HEX(TRACE, 3, ((char *)&addr->u.a6.addr) + 8, 8); 938 } else { 939 QETH_DBF_TEXT(TRACE, 2, "setaddr?"); 940 QETH_DBF_HEX(TRACE, 3, addr, sizeof(struct qeth_ipaddr)); 941 } 942 do { 943 if (addr->is_multicast) 944 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_SETIPM); 945 else 946 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP, 947 addr->set_flags); 948 if (rc) 949 QETH_DBF_TEXT(TRACE, 2, "failed"); 950 } while ((--cnt > 0) && rc); 951 if (rc) { 952 QETH_DBF_TEXT(TRACE, 2, "FAILED"); 953 qeth_l3_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf); 954 dev_warn(&card->gdev->dev, 955 "Registering IP address %s failed\n", buf); 956 } 957 return rc; 958} 959 960static int qeth_l3_deregister_addr_entry(struct qeth_card *card, 961 struct qeth_ipaddr *addr) 962{ 963 int rc = 0; 964 965 if (addr->proto == QETH_PROT_IPV4) { 966 QETH_DBF_TEXT(TRACE, 2, "deladdr4"); 967 QETH_DBF_HEX(TRACE, 3, &addr->u.a4.addr, sizeof(int)); 968 } else if (addr->proto == QETH_PROT_IPV6) { 969 QETH_DBF_TEXT(TRACE, 2, "deladdr6"); 970 QETH_DBF_HEX(TRACE, 3, &addr->u.a6.addr, 8); 971 QETH_DBF_HEX(TRACE, 3, ((char *)&addr->u.a6.addr) + 8, 8); 972 } else { 973 QETH_DBF_TEXT(TRACE, 2, "deladdr?"); 974 QETH_DBF_HEX(TRACE, 3, addr, sizeof(struct qeth_ipaddr)); 975 } 976 if (addr->is_multicast) 977 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_DELIPM); 978 else 979 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP, 980 addr->del_flags); 981 if (rc) 982 QETH_DBF_TEXT(TRACE, 2, "failed"); 983 984 return rc; 985} 986 987static inline u8 qeth_l3_get_qeth_hdr_flags4(int cast_type) 988{ 989 if (cast_type == RTN_MULTICAST) 990 return QETH_CAST_MULTICAST; 991 if (cast_type == RTN_BROADCAST) 992 return QETH_CAST_BROADCAST; 993 return QETH_CAST_UNICAST; 994} 995 996static inline u8 qeth_l3_get_qeth_hdr_flags6(int cast_type) 997{ 998 u8 ct = QETH_HDR_PASSTHRU | QETH_HDR_IPV6; 999 if (cast_type == RTN_MULTICAST) 1000 return ct | QETH_CAST_MULTICAST; 1001 if (cast_type == RTN_ANYCAST) 1002 return ct | QETH_CAST_ANYCAST; 1003 if (cast_type == RTN_BROADCAST) 1004 return ct | QETH_CAST_BROADCAST; 1005 return ct | QETH_CAST_UNICAST; 1006} 1007 1008static int qeth_l3_send_setadp_mode(struct qeth_card *card, __u32 command, 1009 __u32 mode) 1010{ 1011 int rc; 1012 struct qeth_cmd_buffer *iob; 1013 struct qeth_ipa_cmd *cmd; 1014 1015 QETH_DBF_TEXT(TRACE, 4, "adpmode"); 1016 1017 iob = qeth_get_adapter_cmd(card, command, 1018 sizeof(struct qeth_ipacmd_setadpparms)); 1019 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1020 cmd->data.setadapterparms.data.mode = mode; 1021 rc = qeth_send_ipa_cmd(card, iob, qeth_default_setadapterparms_cb, 1022 NULL); 1023 return rc; 1024} 1025 1026static int qeth_l3_setadapter_hstr(struct qeth_card *card) 1027{ 1028 int rc; 1029 1030 QETH_DBF_TEXT(TRACE, 4, "adphstr"); 1031 1032 if (qeth_adp_supported(card, IPA_SETADP_SET_BROADCAST_MODE)) { 1033 rc = qeth_l3_send_setadp_mode(card, 1034 IPA_SETADP_SET_BROADCAST_MODE, 1035 card->options.broadcast_mode); 1036 if (rc) 1037 QETH_DBF_MESSAGE(2, "couldn't set broadcast mode on " 1038 "device %s: x%x\n", 1039 CARD_BUS_ID(card), rc); 1040 rc = qeth_l3_send_setadp_mode(card, 1041 IPA_SETADP_ALTER_MAC_ADDRESS, 1042 card->options.macaddr_mode); 1043 if (rc) 1044 QETH_DBF_MESSAGE(2, "couldn't set macaddr mode on " 1045 "device %s: x%x\n", CARD_BUS_ID(card), rc); 1046 return rc; 1047 } 1048 if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL) 1049 QETH_DBF_MESSAGE(2, "set adapter parameters not available " 1050 "to set broadcast mode, using ALLRINGS " 1051 "on device %s:\n", CARD_BUS_ID(card)); 1052 if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL) 1053 QETH_DBF_MESSAGE(2, "set adapter parameters not available " 1054 "to set macaddr mode, using NONCANONICAL " 1055 "on device %s:\n", CARD_BUS_ID(card)); 1056 return 0; 1057} 1058 1059static int qeth_l3_setadapter_parms(struct qeth_card *card) 1060{ 1061 int rc; 1062 1063 QETH_DBF_TEXT(SETUP, 2, "setadprm"); 1064 1065 if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)) { 1066 dev_info(&card->gdev->dev, 1067 "set adapter parameters not supported.\n"); 1068 QETH_DBF_TEXT(SETUP, 2, " notsupp"); 1069 return 0; 1070 } 1071 rc = qeth_query_setadapterparms(card); 1072 if (rc) { 1073 QETH_DBF_MESSAGE(2, "%s couldn't set adapter parameters: " 1074 "0x%x\n", dev_name(&card->gdev->dev), rc); 1075 return rc; 1076 } 1077 if (qeth_adp_supported(card, IPA_SETADP_ALTER_MAC_ADDRESS)) { 1078 rc = qeth_setadpparms_change_macaddr(card); 1079 if (rc) 1080 dev_warn(&card->gdev->dev, "Reading the adapter MAC" 1081 " address failed\n"); 1082 } 1083 1084 if ((card->info.link_type == QETH_LINK_TYPE_HSTR) || 1085 (card->info.link_type == QETH_LINK_TYPE_LANE_TR)) 1086 rc = qeth_l3_setadapter_hstr(card); 1087 1088 return rc; 1089} 1090 1091static int qeth_l3_default_setassparms_cb(struct qeth_card *card, 1092 struct qeth_reply *reply, unsigned long data) 1093{ 1094 struct qeth_ipa_cmd *cmd; 1095 1096 QETH_DBF_TEXT(TRACE, 4, "defadpcb"); 1097 1098 cmd = (struct qeth_ipa_cmd *) data; 1099 if (cmd->hdr.return_code == 0) { 1100 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code; 1101 if (cmd->hdr.prot_version == QETH_PROT_IPV4) 1102 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled; 1103 if (cmd->hdr.prot_version == QETH_PROT_IPV6) 1104 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; 1105 } 1106 if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM && 1107 cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) { 1108 card->info.csum_mask = cmd->data.setassparms.data.flags_32bit; 1109 QETH_DBF_TEXT_(TRACE, 3, "csum:%d", card->info.csum_mask); 1110 } 1111 if (cmd->data.setassparms.hdr.assist_no == IPA_OUTBOUND_CHECKSUM && 1112 cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) { 1113 card->info.tx_csum_mask = 1114 cmd->data.setassparms.data.flags_32bit; 1115 QETH_DBF_TEXT_(TRACE, 3, "tcsu:%d", card->info.tx_csum_mask); 1116 } 1117 1118 return 0; 1119} 1120 1121static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd( 1122 struct qeth_card *card, enum qeth_ipa_funcs ipa_func, __u16 cmd_code, 1123 __u16 len, enum qeth_prot_versions prot) 1124{ 1125 struct qeth_cmd_buffer *iob; 1126 struct qeth_ipa_cmd *cmd; 1127 1128 QETH_DBF_TEXT(TRACE, 4, "getasscm"); 1129 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); 1130 1131 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1132 cmd->data.setassparms.hdr.assist_no = ipa_func; 1133 cmd->data.setassparms.hdr.length = 8 + len; 1134 cmd->data.setassparms.hdr.command_code = cmd_code; 1135 cmd->data.setassparms.hdr.return_code = 0; 1136 cmd->data.setassparms.hdr.seq_no = 0; 1137 1138 return iob; 1139} 1140 1141static int qeth_l3_send_setassparms(struct qeth_card *card, 1142 struct qeth_cmd_buffer *iob, __u16 len, long data, 1143 int (*reply_cb)(struct qeth_card *, struct qeth_reply *, 1144 unsigned long), 1145 void *reply_param) 1146{ 1147 int rc; 1148 struct qeth_ipa_cmd *cmd; 1149 1150 QETH_DBF_TEXT(TRACE, 4, "sendassp"); 1151 1152 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1153 if (len <= sizeof(__u32)) 1154 cmd->data.setassparms.data.flags_32bit = (__u32) data; 1155 else /* (len > sizeof(__u32)) */ 1156 memcpy(&cmd->data.setassparms.data, (void *) data, len); 1157 1158 rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param); 1159 return rc; 1160} 1161 1162#ifdef CONFIG_QETH_IPV6 1163static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, 1164 enum qeth_ipa_funcs ipa_func, __u16 cmd_code) 1165{ 1166 int rc; 1167 struct qeth_cmd_buffer *iob; 1168 1169 QETH_DBF_TEXT(TRACE, 4, "simassp6"); 1170 iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, 1171 0, QETH_PROT_IPV6); 1172 rc = qeth_l3_send_setassparms(card, iob, 0, 0, 1173 qeth_l3_default_setassparms_cb, NULL); 1174 return rc; 1175} 1176#endif 1177 1178static int qeth_l3_send_simple_setassparms(struct qeth_card *card, 1179 enum qeth_ipa_funcs ipa_func, __u16 cmd_code, long data) 1180{ 1181 int rc; 1182 int length = 0; 1183 struct qeth_cmd_buffer *iob; 1184 1185 QETH_DBF_TEXT(TRACE, 4, "simassp4"); 1186 if (data) 1187 length = sizeof(__u32); 1188 iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, 1189 length, QETH_PROT_IPV4); 1190 rc = qeth_l3_send_setassparms(card, iob, length, data, 1191 qeth_l3_default_setassparms_cb, NULL); 1192 return rc; 1193} 1194 1195static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) 1196{ 1197 int rc; 1198 1199 QETH_DBF_TEXT(TRACE, 3, "ipaarp"); 1200 1201 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { 1202 dev_info(&card->gdev->dev, 1203 "ARP processing not supported on %s!\n", 1204 QETH_CARD_IFNAME(card)); 1205 return 0; 1206 } 1207 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, 1208 IPA_CMD_ASS_START, 0); 1209 if (rc) { 1210 dev_warn(&card->gdev->dev, 1211 "Starting ARP processing support for %s failed\n", 1212 QETH_CARD_IFNAME(card)); 1213 } 1214 return rc; 1215} 1216 1217static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card) 1218{ 1219 int rc; 1220 1221 QETH_DBF_TEXT(TRACE, 3, "ipaipfrg"); 1222 1223 if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) { 1224 dev_info(&card->gdev->dev, 1225 "Hardware IP fragmentation not supported on %s\n", 1226 QETH_CARD_IFNAME(card)); 1227 return -EOPNOTSUPP; 1228 } 1229 1230 rc = qeth_l3_send_simple_setassparms(card, IPA_IP_FRAGMENTATION, 1231 IPA_CMD_ASS_START, 0); 1232 if (rc) { 1233 dev_warn(&card->gdev->dev, 1234 "Starting IP fragmentation support for %s failed\n", 1235 QETH_CARD_IFNAME(card)); 1236 } else 1237 dev_info(&card->gdev->dev, 1238 "Hardware IP fragmentation enabled \n"); 1239 return rc; 1240} 1241 1242static int qeth_l3_start_ipa_source_mac(struct qeth_card *card) 1243{ 1244 int rc; 1245 1246 QETH_DBF_TEXT(TRACE, 3, "stsrcmac"); 1247 1248 if (!qeth_is_supported(card, IPA_SOURCE_MAC)) { 1249 dev_info(&card->gdev->dev, 1250 "Inbound source MAC-address not supported on %s\n", 1251 QETH_CARD_IFNAME(card)); 1252 return -EOPNOTSUPP; 1253 } 1254 1255 rc = qeth_l3_send_simple_setassparms(card, IPA_SOURCE_MAC, 1256 IPA_CMD_ASS_START, 0); 1257 if (rc) 1258 dev_warn(&card->gdev->dev, 1259 "Starting source MAC-address support for %s failed\n", 1260 QETH_CARD_IFNAME(card)); 1261 return rc; 1262} 1263 1264static int qeth_l3_start_ipa_vlan(struct qeth_card *card) 1265{ 1266 int rc = 0; 1267 1268 QETH_DBF_TEXT(TRACE, 3, "strtvlan"); 1269 1270 if (!qeth_is_supported(card, IPA_FULL_VLAN)) { 1271 dev_info(&card->gdev->dev, 1272 "VLAN not supported on %s\n", QETH_CARD_IFNAME(card)); 1273 return -EOPNOTSUPP; 1274 } 1275 1276 rc = qeth_l3_send_simple_setassparms(card, IPA_VLAN_PRIO, 1277 IPA_CMD_ASS_START, 0); 1278 if (rc) { 1279 dev_warn(&card->gdev->dev, 1280 "Starting VLAN support for %s failed\n", 1281 QETH_CARD_IFNAME(card)); 1282 } else { 1283 dev_info(&card->gdev->dev, "VLAN enabled\n"); 1284 } 1285 return rc; 1286} 1287 1288static int qeth_l3_start_ipa_multicast(struct qeth_card *card) 1289{ 1290 int rc; 1291 1292 QETH_DBF_TEXT(TRACE, 3, "stmcast"); 1293 1294 if (!qeth_is_supported(card, IPA_MULTICASTING)) { 1295 dev_info(&card->gdev->dev, 1296 "Multicast not supported on %s\n", 1297 QETH_CARD_IFNAME(card)); 1298 return -EOPNOTSUPP; 1299 } 1300 1301 rc = qeth_l3_send_simple_setassparms(card, IPA_MULTICASTING, 1302 IPA_CMD_ASS_START, 0); 1303 if (rc) { 1304 dev_warn(&card->gdev->dev, 1305 "Starting multicast support for %s failed\n", 1306 QETH_CARD_IFNAME(card)); 1307 } else { 1308 dev_info(&card->gdev->dev, "Multicast enabled\n"); 1309 card->dev->flags |= IFF_MULTICAST; 1310 } 1311 return rc; 1312} 1313 1314static int qeth_l3_query_ipassists_cb(struct qeth_card *card, 1315 struct qeth_reply *reply, unsigned long data) 1316{ 1317 struct qeth_ipa_cmd *cmd; 1318 1319 QETH_DBF_TEXT(SETUP, 2, "qipasscb"); 1320 1321 cmd = (struct qeth_ipa_cmd *) data; 1322 if (cmd->hdr.prot_version == QETH_PROT_IPV4) { 1323 card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported; 1324 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled; 1325 } else { 1326 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported; 1327 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; 1328 } 1329 QETH_DBF_TEXT(SETUP, 2, "suppenbl"); 1330 QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_supported); 1331 QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_enabled); 1332 return 0; 1333} 1334 1335static int qeth_l3_query_ipassists(struct qeth_card *card, 1336 enum qeth_prot_versions prot) 1337{ 1338 int rc; 1339 struct qeth_cmd_buffer *iob; 1340 1341 QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot); 1342 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot); 1343 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_query_ipassists_cb, NULL); 1344 return rc; 1345} 1346 1347#ifdef CONFIG_QETH_IPV6 1348static int qeth_l3_softsetup_ipv6(struct qeth_card *card) 1349{ 1350 int rc; 1351 1352 QETH_DBF_TEXT(TRACE, 3, "softipv6"); 1353 1354 if (card->info.type == QETH_CARD_TYPE_IQD) 1355 goto out; 1356 1357 rc = qeth_l3_query_ipassists(card, QETH_PROT_IPV6); 1358 if (rc) { 1359 dev_err(&card->gdev->dev, 1360 "Activating IPv6 support for %s failed\n", 1361 QETH_CARD_IFNAME(card)); 1362 return rc; 1363 } 1364 rc = qeth_l3_send_simple_setassparms(card, IPA_IPV6, 1365 IPA_CMD_ASS_START, 3); 1366 if (rc) { 1367 dev_err(&card->gdev->dev, 1368 "Activating IPv6 support for %s failed\n", 1369 QETH_CARD_IFNAME(card)); 1370 return rc; 1371 } 1372 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_IPV6, 1373 IPA_CMD_ASS_START); 1374 if (rc) { 1375 dev_err(&card->gdev->dev, 1376 "Activating IPv6 support for %s failed\n", 1377 QETH_CARD_IFNAME(card)); 1378 return rc; 1379 } 1380 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_PASSTHRU, 1381 IPA_CMD_ASS_START); 1382 if (rc) { 1383 dev_warn(&card->gdev->dev, 1384 "Enabling the passthrough mode for %s failed\n", 1385 QETH_CARD_IFNAME(card)); 1386 return rc; 1387 } 1388out: 1389 dev_info(&card->gdev->dev, "IPV6 enabled\n"); 1390 return 0; 1391} 1392#endif 1393 1394static int qeth_l3_start_ipa_ipv6(struct qeth_card *card) 1395{ 1396 int rc = 0; 1397 1398 QETH_DBF_TEXT(TRACE, 3, "strtipv6"); 1399 1400 if (!qeth_is_supported(card, IPA_IPV6)) { 1401 dev_info(&card->gdev->dev, 1402 "IPv6 not supported on %s\n", QETH_CARD_IFNAME(card)); 1403 return 0; 1404 } 1405#ifdef CONFIG_QETH_IPV6 1406 rc = qeth_l3_softsetup_ipv6(card); 1407#endif 1408 return rc ; 1409} 1410 1411static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) 1412{ 1413 int rc; 1414 1415 QETH_DBF_TEXT(TRACE, 3, "stbrdcst"); 1416 card->info.broadcast_capable = 0; 1417 if (!qeth_is_supported(card, IPA_FILTERING)) { 1418 dev_info(&card->gdev->dev, 1419 "Broadcast not supported on %s\n", 1420 QETH_CARD_IFNAME(card)); 1421 rc = -EOPNOTSUPP; 1422 goto out; 1423 } 1424 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, 1425 IPA_CMD_ASS_START, 0); 1426 if (rc) { 1427 dev_warn(&card->gdev->dev, "Enabling broadcast filtering for " 1428 "%s failed\n", QETH_CARD_IFNAME(card)); 1429 goto out; 1430 } 1431 1432 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, 1433 IPA_CMD_ASS_CONFIGURE, 1); 1434 if (rc) { 1435 dev_warn(&card->gdev->dev, 1436 "Setting up broadcast filtering for %s failed\n", 1437 QETH_CARD_IFNAME(card)); 1438 goto out; 1439 } 1440 card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; 1441 dev_info(&card->gdev->dev, "Broadcast enabled\n"); 1442 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, 1443 IPA_CMD_ASS_ENABLE, 1); 1444 if (rc) { 1445 dev_warn(&card->gdev->dev, "Setting up broadcast echo " 1446 "filtering for %s failed\n", QETH_CARD_IFNAME(card)); 1447 goto out; 1448 } 1449 card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO; 1450out: 1451 if (card->info.broadcast_capable) 1452 card->dev->flags |= IFF_BROADCAST; 1453 else 1454 card->dev->flags &= ~IFF_BROADCAST; 1455 return rc; 1456} 1457 1458static int qeth_l3_send_checksum_command(struct qeth_card *card) 1459{ 1460 int rc; 1461 1462 rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM, 1463 IPA_CMD_ASS_START, 0); 1464 if (rc) { 1465 dev_warn(&card->gdev->dev, "Starting HW checksumming for %s " 1466 "failed, using SW checksumming\n", 1467 QETH_CARD_IFNAME(card)); 1468 return rc; 1469 } 1470 rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM, 1471 IPA_CMD_ASS_ENABLE, 1472 card->info.csum_mask); 1473 if (rc) { 1474 dev_warn(&card->gdev->dev, "Enabling HW checksumming for %s " 1475 "failed, using SW checksumming\n", 1476 QETH_CARD_IFNAME(card)); 1477 return rc; 1478 } 1479 return 0; 1480} 1481 1482int qeth_l3_set_rx_csum(struct qeth_card *card, 1483 enum qeth_checksum_types csum_type) 1484{ 1485 int rc = 0; 1486 1487 if (card->options.checksum_type == HW_CHECKSUMMING) { 1488 if ((csum_type != HW_CHECKSUMMING) && 1489 (card->state != CARD_STATE_DOWN)) { 1490 rc = qeth_l3_send_simple_setassparms(card, 1491 IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0); 1492 if (rc) 1493 return -EIO; 1494 } 1495 } else { 1496 if (csum_type == HW_CHECKSUMMING) { 1497 if (card->state != CARD_STATE_DOWN) { 1498 if (!qeth_is_supported(card, 1499 IPA_INBOUND_CHECKSUM)) 1500 return -EPERM; 1501 rc = qeth_l3_send_checksum_command(card); 1502 if (rc) 1503 return -EIO; 1504 } 1505 } 1506 } 1507 card->options.checksum_type = csum_type; 1508 return rc; 1509} 1510 1511static int qeth_l3_start_ipa_checksum(struct qeth_card *card) 1512{ 1513 int rc = 0; 1514 1515 QETH_DBF_TEXT(TRACE, 3, "strtcsum"); 1516 1517 if (card->options.checksum_type == NO_CHECKSUMMING) { 1518 dev_info(&card->gdev->dev, 1519 "Using no checksumming on %s.\n", 1520 QETH_CARD_IFNAME(card)); 1521 return 0; 1522 } 1523 if (card->options.checksum_type == SW_CHECKSUMMING) { 1524 dev_info(&card->gdev->dev, 1525 "Using SW checksumming on %s.\n", 1526 QETH_CARD_IFNAME(card)); 1527 return 0; 1528 } 1529 if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) { 1530 dev_info(&card->gdev->dev, 1531 "Inbound HW Checksumming not " 1532 "supported on %s,\ncontinuing " 1533 "using Inbound SW Checksumming\n", 1534 QETH_CARD_IFNAME(card)); 1535 card->options.checksum_type = SW_CHECKSUMMING; 1536 return 0; 1537 } 1538 rc = qeth_l3_send_checksum_command(card); 1539 if (!rc) 1540 dev_info(&card->gdev->dev, 1541 "HW Checksumming (inbound) enabled\n"); 1542 1543 return rc; 1544} 1545 1546static int qeth_l3_start_ipa_tx_checksum(struct qeth_card *card) 1547{ 1548 int rc = 0; 1549 1550 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) 1551 return rc; 1552 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM, 1553 IPA_CMD_ASS_START, 0); 1554 if (rc) 1555 goto err_out; 1556 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM, 1557 IPA_CMD_ASS_ENABLE, card->info.tx_csum_mask); 1558 if (rc) 1559 goto err_out; 1560 dev_info(&card->gdev->dev, "HW TX Checksumming enabled\n"); 1561 return rc; 1562err_out: 1563 dev_warn(&card->gdev->dev, "Enabling HW TX checksumming for %s " 1564 "failed, using SW TX checksumming\n", QETH_CARD_IFNAME(card)); 1565 return rc; 1566} 1567 1568static int qeth_l3_start_ipa_tso(struct qeth_card *card) 1569{ 1570 int rc; 1571 1572 QETH_DBF_TEXT(TRACE, 3, "sttso"); 1573 1574 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) { 1575 dev_info(&card->gdev->dev, 1576 "Outbound TSO not supported on %s\n", 1577 QETH_CARD_IFNAME(card)); 1578 rc = -EOPNOTSUPP; 1579 } else { 1580 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_TSO, 1581 IPA_CMD_ASS_START, 0); 1582 if (rc) 1583 dev_warn(&card->gdev->dev, "Starting outbound TCP " 1584 "segmentation offload for %s failed\n", 1585 QETH_CARD_IFNAME(card)); 1586 else 1587 dev_info(&card->gdev->dev, 1588 "Outbound TSO enabled\n"); 1589 } 1590 if (rc && (card->options.large_send == QETH_LARGE_SEND_TSO)) { 1591 card->options.large_send = QETH_LARGE_SEND_NO; 1592 card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG); 1593 } 1594 return rc; 1595} 1596 1597static int qeth_l3_start_ipassists(struct qeth_card *card) 1598{ 1599 QETH_DBF_TEXT(TRACE, 3, "strtipas"); 1600 1601 qeth_set_access_ctrl_online(card); /* go on*/ 1602 qeth_l3_start_ipa_arp_processing(card); /* go on*/ 1603 qeth_l3_start_ipa_ip_fragmentation(card); /* go on*/ 1604 qeth_l3_start_ipa_source_mac(card); /* go on*/ 1605 qeth_l3_start_ipa_vlan(card); /* go on*/ 1606 qeth_l3_start_ipa_multicast(card); /* go on*/ 1607 qeth_l3_start_ipa_ipv6(card); /* go on*/ 1608 qeth_l3_start_ipa_broadcast(card); /* go on*/ 1609 qeth_l3_start_ipa_checksum(card); /* go on*/ 1610 qeth_l3_start_ipa_tx_checksum(card); 1611 qeth_l3_start_ipa_tso(card); /* go on*/ 1612 return 0; 1613} 1614 1615static int qeth_l3_put_unique_id(struct qeth_card *card) 1616{ 1617 1618 int rc = 0; 1619 struct qeth_cmd_buffer *iob; 1620 struct qeth_ipa_cmd *cmd; 1621 1622 QETH_DBF_TEXT(TRACE, 2, "puniqeid"); 1623 1624 if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) == 1625 UNIQUE_ID_NOT_BY_CARD) 1626 return -1; 1627 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR, 1628 QETH_PROT_IPV6); 1629 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1630 *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = 1631 card->info.unique_id; 1632 memcpy(&cmd->data.create_destroy_addr.unique_id[0], 1633 card->dev->dev_addr, OSA_ADDR_LEN); 1634 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 1635 return rc; 1636} 1637 1638static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, 1639 struct qeth_reply *reply, unsigned long data) 1640{ 1641 struct qeth_ipa_cmd *cmd; 1642 1643 cmd = (struct qeth_ipa_cmd *) data; 1644 if (cmd->hdr.return_code == 0) 1645 memcpy(card->dev->dev_addr, 1646 cmd->data.create_destroy_addr.unique_id, ETH_ALEN); 1647 else 1648 random_ether_addr(card->dev->dev_addr); 1649 1650 return 0; 1651} 1652 1653static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) 1654{ 1655 int rc = 0; 1656 struct qeth_cmd_buffer *iob; 1657 struct qeth_ipa_cmd *cmd; 1658 1659 QETH_DBF_TEXT(SETUP, 2, "hsrmac"); 1660 1661 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, 1662 QETH_PROT_IPV6); 1663 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1664 *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = 1665 card->info.unique_id; 1666 1667 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_iqd_read_initial_mac_cb, 1668 NULL); 1669 return rc; 1670} 1671 1672static int qeth_l3_get_unique_id_cb(struct qeth_card *card, 1673 struct qeth_reply *reply, unsigned long data) 1674{ 1675 struct qeth_ipa_cmd *cmd; 1676 1677 cmd = (struct qeth_ipa_cmd *) data; 1678 if (cmd->hdr.return_code == 0) 1679 card->info.unique_id = *((__u16 *) 1680 &cmd->data.create_destroy_addr.unique_id[6]); 1681 else { 1682 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | 1683 UNIQUE_ID_NOT_BY_CARD; 1684 dev_warn(&card->gdev->dev, "The network adapter failed to " 1685 "generate a unique ID\n"); 1686 } 1687 return 0; 1688} 1689 1690static int qeth_l3_get_unique_id(struct qeth_card *card) 1691{ 1692 int rc = 0; 1693 struct qeth_cmd_buffer *iob; 1694 struct qeth_ipa_cmd *cmd; 1695 1696 QETH_DBF_TEXT(SETUP, 2, "guniqeid"); 1697 1698 if (!qeth_is_supported(card, IPA_IPV6)) { 1699 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | 1700 UNIQUE_ID_NOT_BY_CARD; 1701 return 0; 1702 } 1703 1704 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, 1705 QETH_PROT_IPV6); 1706 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1707 *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = 1708 card->info.unique_id; 1709 1710 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_get_unique_id_cb, NULL); 1711 return rc; 1712} 1713 1714static int 1715qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, 1716 unsigned long data) 1717{ 1718 struct qeth_ipa_cmd *cmd; 1719 __u16 rc; 1720 1721 QETH_DBF_TEXT(SETUP, 2, "diastrcb"); 1722 1723 cmd = (struct qeth_ipa_cmd *)data; 1724 rc = cmd->hdr.return_code; 1725 if (rc) 1726 QETH_DBF_TEXT_(TRACE, 2, "dxter%x", rc); 1727 switch (cmd->data.diagass.action) { 1728 case QETH_DIAGS_CMD_TRACE_QUERY: 1729 break; 1730 case QETH_DIAGS_CMD_TRACE_DISABLE: 1731 switch (rc) { 1732 case 0: 1733 case IPA_RC_INVALID_SUBCMD: 1734 card->info.promisc_mode = SET_PROMISC_MODE_OFF; 1735 dev_info(&card->gdev->dev, "The HiperSockets network " 1736 "traffic analyzer is deactivated\n"); 1737 break; 1738 default: 1739 break; 1740 } 1741 break; 1742 case QETH_DIAGS_CMD_TRACE_ENABLE: 1743 switch (rc) { 1744 case 0: 1745 card->info.promisc_mode = SET_PROMISC_MODE_ON; 1746 dev_info(&card->gdev->dev, "The HiperSockets network " 1747 "traffic analyzer is activated\n"); 1748 break; 1749 case IPA_RC_HARDWARE_AUTH_ERROR: 1750 dev_warn(&card->gdev->dev, "The device is not " 1751 "authorized to run as a HiperSockets network " 1752 "traffic analyzer\n"); 1753 break; 1754 case IPA_RC_TRACE_ALREADY_ACTIVE: 1755 dev_warn(&card->gdev->dev, "A HiperSockets " 1756 "network traffic analyzer is already " 1757 "active in the HiperSockets LAN\n"); 1758 break; 1759 default: 1760 break; 1761 } 1762 break; 1763 default: 1764 QETH_DBF_MESSAGE(2, "Unknown sniffer action (0x%04x) on %s\n", 1765 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); 1766 } 1767 1768 return 0; 1769} 1770 1771static int 1772qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) 1773{ 1774 struct qeth_cmd_buffer *iob; 1775 struct qeth_ipa_cmd *cmd; 1776 1777 QETH_DBF_TEXT(SETUP, 2, "diagtrac"); 1778 1779 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); 1780 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 1781 cmd->data.diagass.subcmd_len = 16; 1782 cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRACE; 1783 cmd->data.diagass.type = QETH_DIAGS_TYPE_HIPERSOCKET; 1784 cmd->data.diagass.action = diags_cmd; 1785 return qeth_send_ipa_cmd(card, iob, qeth_diags_trace_cb, NULL); 1786} 1787 1788static void qeth_l3_get_mac_for_ipm(__u32 ipm, char *mac, 1789 struct net_device *dev) 1790{ 1791 if (dev->type == ARPHRD_IEEE802_TR) 1792 ip_tr_mc_map(ipm, mac); 1793 else 1794 ip_eth_mc_map(ipm, mac); 1795} 1796 1797static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev) 1798{ 1799 struct qeth_ipaddr *ipm; 1800 struct ip_mc_list *im4; 1801 char buf[MAX_ADDR_LEN]; 1802 1803 QETH_DBF_TEXT(TRACE, 4, "addmc"); 1804 for (im4 = in4_dev->mc_list; im4; im4 = im4->next) { 1805 qeth_l3_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev); 1806 ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); 1807 if (!ipm) 1808 continue; 1809 ipm->u.a4.addr = im4->multiaddr; 1810 memcpy(ipm->mac, buf, OSA_ADDR_LEN); 1811 ipm->is_multicast = 1; 1812 if (!qeth_l3_add_ip(card, ipm)) 1813 kfree(ipm); 1814 } 1815} 1816 1817static void qeth_l3_add_vlan_mc(struct qeth_card *card) 1818{ 1819 struct in_device *in_dev; 1820 struct vlan_group *vg; 1821 int i; 1822 1823 QETH_DBF_TEXT(TRACE, 4, "addmcvl"); 1824 if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) 1825 return; 1826 1827 vg = card->vlangrp; 1828 for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { 1829 struct net_device *netdev = vlan_group_get_device(vg, i); 1830 if (netdev == NULL || 1831 !(netdev->flags & IFF_UP)) 1832 continue; 1833 in_dev = in_dev_get(netdev); 1834 if (!in_dev) 1835 continue; 1836 read_lock(&in_dev->mc_list_lock); 1837 qeth_l3_add_mc(card, in_dev); 1838 read_unlock(&in_dev->mc_list_lock); 1839 in_dev_put(in_dev); 1840 } 1841} 1842 1843static void qeth_l3_add_multicast_ipv4(struct qeth_card *card) 1844{ 1845 struct in_device *in4_dev; 1846 1847 QETH_DBF_TEXT(TRACE, 4, "chkmcv4"); 1848 in4_dev = in_dev_get(card->dev); 1849 if (in4_dev == NULL) 1850 return; 1851 read_lock(&in4_dev->mc_list_lock); 1852 qeth_l3_add_mc(card, in4_dev); 1853 qeth_l3_add_vlan_mc(card); 1854 read_unlock(&in4_dev->mc_list_lock); 1855 in_dev_put(in4_dev); 1856} 1857 1858#ifdef CONFIG_QETH_IPV6 1859static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) 1860{ 1861 struct qeth_ipaddr *ipm; 1862 struct ifmcaddr6 *im6; 1863 char buf[MAX_ADDR_LEN]; 1864 1865 QETH_DBF_TEXT(TRACE, 4, "addmc6"); 1866 for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) { 1867 ndisc_mc_map(&im6->mca_addr, buf, in6_dev->dev, 0); 1868 ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV6); 1869 if (!ipm) 1870 continue; 1871 ipm->is_multicast = 1; 1872 memcpy(ipm->mac, buf, OSA_ADDR_LEN); 1873 memcpy(&ipm->u.a6.addr, &im6->mca_addr.s6_addr, 1874 sizeof(struct in6_addr)); 1875 if (!qeth_l3_add_ip(card, ipm)) 1876 kfree(ipm); 1877 } 1878} 1879 1880static void qeth_l3_add_vlan_mc6(struct qeth_card *card) 1881{ 1882 struct inet6_dev *in_dev; 1883 struct vlan_group *vg; 1884 int i; 1885 1886 QETH_DBF_TEXT(TRACE, 4, "admc6vl"); 1887 if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) 1888 return; 1889 1890 vg = card->vlangrp; 1891 for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { 1892 struct net_device *netdev = vlan_group_get_device(vg, i); 1893 if (netdev == NULL || 1894 !(netdev->flags & IFF_UP)) 1895 continue; 1896 in_dev = in6_dev_get(netdev); 1897 if (!in_dev) 1898 continue; 1899 read_lock_bh(&in_dev->lock); 1900 qeth_l3_add_mc6(card, in_dev); 1901 read_unlock_bh(&in_dev->lock); 1902 in6_dev_put(in_dev); 1903 } 1904} 1905 1906static void qeth_l3_add_multicast_ipv6(struct qeth_card *card) 1907{ 1908 struct inet6_dev *in6_dev; 1909 1910 QETH_DBF_TEXT(TRACE, 4, "chkmcv6"); 1911 if (!qeth_is_supported(card, IPA_IPV6)) 1912 return ; 1913 in6_dev = in6_dev_get(card->dev); 1914 if (in6_dev == NULL) 1915 return; 1916 read_lock_bh(&in6_dev->lock); 1917 qeth_l3_add_mc6(card, in6_dev); 1918 qeth_l3_add_vlan_mc6(card); 1919 read_unlock_bh(&in6_dev->lock); 1920 in6_dev_put(in6_dev); 1921} 1922#endif /* CONFIG_QETH_IPV6 */ 1923 1924static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, 1925 unsigned short vid) 1926{ 1927 struct in_device *in_dev; 1928 struct in_ifaddr *ifa; 1929 struct qeth_ipaddr *addr; 1930 1931 QETH_DBF_TEXT(TRACE, 4, "frvaddr4"); 1932 1933 in_dev = in_dev_get(vlan_group_get_device(card->vlangrp, vid)); 1934 if (!in_dev) 1935 return; 1936 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { 1937 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); 1938 if (addr) { 1939 addr->u.a4.addr = ifa->ifa_address; 1940 addr->u.a4.mask = ifa->ifa_mask; 1941 addr->type = QETH_IP_TYPE_NORMAL; 1942 if (!qeth_l3_delete_ip(card, addr)) 1943 kfree(addr); 1944 } 1945 } 1946 in_dev_put(in_dev); 1947} 1948 1949static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, 1950 unsigned short vid) 1951{ 1952#ifdef CONFIG_QETH_IPV6 1953 struct inet6_dev *in6_dev; 1954 struct inet6_ifaddr *ifa; 1955 struct qeth_ipaddr *addr; 1956 1957 QETH_DBF_TEXT(TRACE, 4, "frvaddr6"); 1958 1959 in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid)); 1960 if (!in6_dev) 1961 return; 1962 list_for_each_entry(ifa, &in6_dev->addr_list, if_list) { 1963 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6); 1964 if (addr) { 1965 memcpy(&addr->u.a6.addr, &ifa->addr, 1966 sizeof(struct in6_addr)); 1967 addr->u.a6.pfxlen = ifa->prefix_len; 1968 addr->type = QETH_IP_TYPE_NORMAL; 1969 if (!qeth_l3_delete_ip(card, addr)) 1970 kfree(addr); 1971 } 1972 } 1973 in6_dev_put(in6_dev); 1974#endif /* CONFIG_QETH_IPV6 */ 1975} 1976 1977static void qeth_l3_free_vlan_addresses(struct qeth_card *card, 1978 unsigned short vid) 1979{ 1980 if (!card->vlangrp) 1981 return; 1982 qeth_l3_free_vlan_addresses4(card, vid); 1983 qeth_l3_free_vlan_addresses6(card, vid); 1984} 1985 1986static void qeth_l3_vlan_rx_register(struct net_device *dev, 1987 struct vlan_group *grp) 1988{ 1989 struct qeth_card *card = dev->ml_priv; 1990 unsigned long flags; 1991 1992 QETH_DBF_TEXT(TRACE, 4, "vlanreg"); 1993 spin_lock_irqsave(&card->vlanlock, flags); 1994 card->vlangrp = grp; 1995 spin_unlock_irqrestore(&card->vlanlock, flags); 1996} 1997 1998static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 1999{ 2000 return; 2001} 2002 2003static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) 2004{ 2005 struct qeth_card *card = dev->ml_priv; 2006 unsigned long flags; 2007 2008 QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid); 2009 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 2010 QETH_DBF_TEXT(TRACE, 3, "kidREC"); 2011 return; 2012 } 2013 spin_lock_irqsave(&card->vlanlock, flags); 2014 /* unregister IP addresses of vlan device */ 2015 qeth_l3_free_vlan_addresses(card, vid); 2016 vlan_group_set_device(card->vlangrp, vid, NULL); 2017 spin_unlock_irqrestore(&card->vlanlock, flags); 2018 qeth_l3_set_multicast_list(card->dev); 2019} 2020 2021static inline __u16 qeth_l3_rebuild_skb(struct qeth_card *card, 2022 struct sk_buff *skb, struct qeth_hdr *hdr) 2023{ 2024 unsigned short vlan_id = 0; 2025 __be16 prot; 2026 struct iphdr *ip_hdr; 2027 unsigned char tg_addr[MAX_ADDR_LEN]; 2028 2029 if (!(hdr->hdr.l3.flags & QETH_HDR_PASSTHRU)) { 2030 prot = htons((hdr->hdr.l3.flags & QETH_HDR_IPV6)? ETH_P_IPV6 : 2031 ETH_P_IP); 2032 switch (hdr->hdr.l3.flags & QETH_HDR_CAST_MASK) { 2033 case QETH_CAST_MULTICAST: 2034 switch (prot) { 2035#ifdef CONFIG_QETH_IPV6 2036 case __constant_htons(ETH_P_IPV6): 2037 ndisc_mc_map((struct in6_addr *) 2038 skb->data + 24, 2039 tg_addr, card->dev, 0); 2040 break; 2041#endif 2042 case __constant_htons(ETH_P_IP): 2043 ip_hdr = (struct iphdr *)skb->data; 2044 (card->dev->type == ARPHRD_IEEE802_TR) ? 2045 ip_tr_mc_map(ip_hdr->daddr, tg_addr): 2046 ip_eth_mc_map(ip_hdr->daddr, tg_addr); 2047 break; 2048 default: 2049 memcpy(tg_addr, card->dev->broadcast, 2050 card->dev->addr_len); 2051 } 2052 card->stats.multicast++; 2053 skb->pkt_type = PACKET_MULTICAST; 2054 break; 2055 case QETH_CAST_BROADCAST: 2056 memcpy(tg_addr, card->dev->broadcast, 2057 card->dev->addr_len); 2058 card->stats.multicast++; 2059 skb->pkt_type = PACKET_BROADCAST; 2060 break; 2061 case QETH_CAST_UNICAST: 2062 case QETH_CAST_ANYCAST: 2063 case QETH_CAST_NOCAST: 2064 default: 2065 if (card->options.sniffer) 2066 skb->pkt_type = PACKET_OTHERHOST; 2067 else 2068 skb->pkt_type = PACKET_HOST; 2069 memcpy(tg_addr, card->dev->dev_addr, 2070 card->dev->addr_len); 2071 } 2072 if (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR) 2073 card->dev->header_ops->create(skb, card->dev, prot, 2074 tg_addr, &hdr->hdr.l3.dest_addr[2], 2075 card->dev->addr_len); 2076 else 2077 card->dev->header_ops->create(skb, card->dev, prot, 2078 tg_addr, "FAKELL", card->dev->addr_len); 2079 } 2080 2081#ifdef CONFIG_TR 2082 if (card->dev->type == ARPHRD_IEEE802_TR) 2083 skb->protocol = tr_type_trans(skb, card->dev); 2084 else 2085#endif 2086 skb->protocol = eth_type_trans(skb, card->dev); 2087 2088 if (hdr->hdr.l3.ext_flags & 2089 (QETH_HDR_EXT_VLAN_FRAME | QETH_HDR_EXT_INCLUDE_VLAN_TAG)) { 2090 vlan_id = (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_VLAN_FRAME)? 2091 hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]); 2092 } 2093 2094 switch (card->options.checksum_type) { 2095 case SW_CHECKSUMMING: 2096 skb->ip_summed = CHECKSUM_NONE; 2097 break; 2098 case NO_CHECKSUMMING: 2099 skb->ip_summed = CHECKSUM_UNNECESSARY; 2100 break; 2101 case HW_CHECKSUMMING: 2102 if ((hdr->hdr.l3.ext_flags & 2103 (QETH_HDR_EXT_CSUM_HDR_REQ | 2104 QETH_HDR_EXT_CSUM_TRANSP_REQ)) == 2105 (QETH_HDR_EXT_CSUM_HDR_REQ | 2106 QETH_HDR_EXT_CSUM_TRANSP_REQ)) 2107 skb->ip_summed = CHECKSUM_UNNECESSARY; 2108 else 2109 skb->ip_summed = CHECKSUM_NONE; 2110 } 2111 2112 return vlan_id; 2113} 2114 2115static void qeth_l3_process_inbound_buffer(struct qeth_card *card, 2116 struct qeth_qdio_buffer *buf, int index) 2117{ 2118 struct qdio_buffer_element *element; 2119 struct sk_buff *skb; 2120 struct qeth_hdr *hdr; 2121 int offset; 2122 __u16 vlan_tag = 0; 2123 unsigned int len; 2124 /* get first element of current buffer */ 2125 element = (struct qdio_buffer_element *)&buf->buffer->element[0]; 2126 offset = 0; 2127 if (card->options.performance_stats) 2128 card->perf_stats.bufs_rec++; 2129 while ((skb = qeth_core_get_next_skb(card, buf->buffer, &element, 2130 &offset, &hdr))) { 2131 skb->dev = card->dev; 2132 /* is device UP ? */ 2133 if (!(card->dev->flags & IFF_UP)) { 2134 dev_kfree_skb_any(skb); 2135 continue; 2136 } 2137 2138 switch (hdr->hdr.l3.id) { 2139 case QETH_HEADER_TYPE_LAYER3: 2140 vlan_tag = qeth_l3_rebuild_skb(card, skb, hdr); 2141 len = skb->len; 2142 if (vlan_tag && !card->options.sniffer) 2143 if (card->vlangrp) 2144 vlan_hwaccel_rx(skb, card->vlangrp, 2145 vlan_tag); 2146 else { 2147 dev_kfree_skb_any(skb); 2148 continue; 2149 } 2150 else 2151 netif_rx(skb); 2152 break; 2153 case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */ 2154 skb->pkt_type = PACKET_HOST; 2155 skb->protocol = eth_type_trans(skb, skb->dev); 2156 if (card->options.checksum_type == NO_CHECKSUMMING) 2157 skb->ip_summed = CHECKSUM_UNNECESSARY; 2158 else 2159 skb->ip_summed = CHECKSUM_NONE; 2160 len = skb->len; 2161 netif_receive_skb(skb); 2162 break; 2163 default: 2164 dev_kfree_skb_any(skb); 2165 QETH_DBF_TEXT(TRACE, 3, "inbunkno"); 2166 QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN); 2167 continue; 2168 } 2169 2170 card->stats.rx_packets++; 2171 card->stats.rx_bytes += len; 2172 } 2173} 2174 2175static int qeth_l3_verify_vlan_dev(struct net_device *dev, 2176 struct qeth_card *card) 2177{ 2178 int rc = 0; 2179 struct vlan_group *vg; 2180 int i; 2181 2182 vg = card->vlangrp; 2183 if (!vg) 2184 return rc; 2185 2186 for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { 2187 if (vlan_group_get_device(vg, i) == dev) { 2188 rc = QETH_VLAN_CARD; 2189 break; 2190 } 2191 } 2192 2193 if (rc && !(vlan_dev_real_dev(dev)->ml_priv == (void *)card)) 2194 return 0; 2195 2196 return rc; 2197} 2198 2199static int qeth_l3_verify_dev(struct net_device *dev) 2200{ 2201 struct qeth_card *card; 2202 unsigned long flags; 2203 int rc = 0; 2204 2205 read_lock_irqsave(&qeth_core_card_list.rwlock, flags); 2206 list_for_each_entry(card, &qeth_core_card_list.list, list) { 2207 if (card->dev == dev) { 2208 rc = QETH_REAL_CARD; 2209 break; 2210 } 2211 rc = qeth_l3_verify_vlan_dev(dev, card); 2212 if (rc) 2213 break; 2214 } 2215 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags); 2216 2217 return rc; 2218} 2219 2220static struct qeth_card *qeth_l3_get_card_from_dev(struct net_device *dev) 2221{ 2222 struct qeth_card *card = NULL; 2223 int rc; 2224 2225 rc = qeth_l3_verify_dev(dev); 2226 if (rc == QETH_REAL_CARD) 2227 card = dev->ml_priv; 2228 else if (rc == QETH_VLAN_CARD) 2229 card = vlan_dev_real_dev(dev)->ml_priv; 2230 if (card && card->options.layer2) 2231 card = NULL; 2232 QETH_DBF_TEXT_(TRACE, 4, "%d", rc); 2233 return card ; 2234} 2235 2236static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) 2237{ 2238 int rc = 0; 2239 2240 QETH_DBF_TEXT(SETUP, 2, "stopcard"); 2241 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 2242 2243 qeth_set_allowed_threads(card, 0, 1); 2244 if (card->options.sniffer && 2245 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) 2246 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); 2247 if (card->read.state == CH_STATE_UP && 2248 card->write.state == CH_STATE_UP && 2249 (card->state == CARD_STATE_UP)) { 2250 if (recovery_mode) 2251 qeth_l3_stop(card->dev); 2252 else { 2253 rtnl_lock(); 2254 dev_close(card->dev); 2255 rtnl_unlock(); 2256 } 2257 if (!card->use_hard_stop) { 2258 rc = qeth_send_stoplan(card); 2259 if (rc) 2260 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 2261 } 2262 card->state = CARD_STATE_SOFTSETUP; 2263 } 2264 if (card->state == CARD_STATE_SOFTSETUP) { 2265 qeth_l3_clear_ip_list(card, !card->use_hard_stop, 1); 2266 qeth_clear_ipacmd_list(card); 2267 card->state = CARD_STATE_HARDSETUP; 2268 } 2269 if (card->state == CARD_STATE_HARDSETUP) { 2270 if (!card->use_hard_stop && 2271 (card->info.type != QETH_CARD_TYPE_IQD)) { 2272 rc = qeth_l3_put_unique_id(card); 2273 if (rc) 2274 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); 2275 } 2276 qeth_qdio_clear_card(card, 0); 2277 qeth_clear_qdio_buffers(card); 2278 qeth_clear_working_pool_list(card); 2279 card->state = CARD_STATE_DOWN; 2280 } 2281 if (card->state == CARD_STATE_DOWN) { 2282 qeth_clear_cmd_buffers(&card->read); 2283 qeth_clear_cmd_buffers(&card->write); 2284 } 2285 card->use_hard_stop = 0; 2286 return rc; 2287} 2288 2289/* 2290 * test for and Switch promiscuous mode (on or off) 2291 * either for guestlan or HiperSocket Sniffer 2292 */ 2293static void 2294qeth_l3_handle_promisc_mode(struct qeth_card *card) 2295{ 2296 struct net_device *dev = card->dev; 2297 2298 if (((dev->flags & IFF_PROMISC) && 2299 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) || 2300 (!(dev->flags & IFF_PROMISC) && 2301 (card->info.promisc_mode == SET_PROMISC_MODE_OFF))) 2302 return; 2303 2304 if (card->info.guestlan) { /* Guestlan trace */ 2305 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) 2306 qeth_setadp_promisc_mode(card); 2307 } else if (card->options.sniffer && /* HiperSockets trace */ 2308 qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { 2309 if (dev->flags & IFF_PROMISC) { 2310 QETH_DBF_TEXT(TRACE, 3, "+promisc"); 2311 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE); 2312 } else { 2313 QETH_DBF_TEXT(TRACE, 3, "-promisc"); 2314 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); 2315 } 2316 } 2317} 2318 2319static void qeth_l3_set_multicast_list(struct net_device *dev) 2320{ 2321 struct qeth_card *card = dev->ml_priv; 2322 2323 QETH_DBF_TEXT(TRACE, 3, "setmulti"); 2324 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && 2325 (card->state != CARD_STATE_UP)) 2326 return; 2327 if (!card->options.sniffer) { 2328 qeth_l3_delete_mc_addresses(card); 2329 qeth_l3_add_multicast_ipv4(card); 2330#ifdef CONFIG_QETH_IPV6 2331 qeth_l3_add_multicast_ipv6(card); 2332#endif 2333 qeth_l3_set_ip_addr_list(card); 2334 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) 2335 return; 2336 } 2337 qeth_l3_handle_promisc_mode(card); 2338} 2339 2340static const char *qeth_l3_arp_get_error_cause(int *rc) 2341{ 2342 switch (*rc) { 2343 case QETH_IPA_ARP_RC_FAILED: 2344 *rc = -EIO; 2345 return "operation failed"; 2346 case QETH_IPA_ARP_RC_NOTSUPP: 2347 *rc = -EOPNOTSUPP; 2348 return "operation not supported"; 2349 case QETH_IPA_ARP_RC_OUT_OF_RANGE: 2350 *rc = -EINVAL; 2351 return "argument out of range"; 2352 case QETH_IPA_ARP_RC_Q_NOTSUPP: 2353 *rc = -EOPNOTSUPP; 2354 return "query operation not supported"; 2355 case QETH_IPA_ARP_RC_Q_NO_DATA: 2356 *rc = -ENOENT; 2357 return "no query data available"; 2358 default: 2359 return "unknown error"; 2360 } 2361} 2362 2363static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) 2364{ 2365 int tmp; 2366 int rc; 2367 2368 QETH_DBF_TEXT(TRACE, 3, "arpstnoe"); 2369 2370 /* 2371 * currently GuestLAN only supports the ARP assist function 2372 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_SET_NO_ENTRIES; 2373 * thus we say EOPNOTSUPP for this ARP function 2374 */ 2375 if (card->info.guestlan) 2376 return -EOPNOTSUPP; 2377 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { 2378 return -EOPNOTSUPP; 2379 } 2380 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, 2381 IPA_CMD_ASS_ARP_SET_NO_ENTRIES, 2382 no_entries); 2383 if (rc) { 2384 tmp = rc; 2385 QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on " 2386 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), 2387 qeth_l3_arp_get_error_cause(&rc), tmp, tmp); 2388 } 2389 return rc; 2390} 2391 2392static void qeth_l3_copy_arp_entries_stripped(struct qeth_arp_query_info *qinfo, 2393 struct qeth_arp_query_data *qdata, int entry_size, 2394 int uentry_size) 2395{ 2396 char *entry_ptr; 2397 char *uentry_ptr; 2398 int i; 2399 2400 entry_ptr = (char *)&qdata->data; 2401 uentry_ptr = (char *)(qinfo->udata + qinfo->udata_offset); 2402 for (i = 0; i < qdata->no_entries; ++i) { 2403 /* strip off 32 bytes "media specific information" */ 2404 memcpy(uentry_ptr, (entry_ptr + 32), entry_size - 32); 2405 entry_ptr += entry_size; 2406 uentry_ptr += uentry_size; 2407 } 2408} 2409 2410static int qeth_l3_arp_query_cb(struct qeth_card *card, 2411 struct qeth_reply *reply, unsigned long data) 2412{ 2413 struct qeth_ipa_cmd *cmd; 2414 struct qeth_arp_query_data *qdata; 2415 struct qeth_arp_query_info *qinfo; 2416 int entry_size; 2417 int uentry_size; 2418 int i; 2419 2420 QETH_DBF_TEXT(TRACE, 4, "arpquecb"); 2421 2422 qinfo = (struct qeth_arp_query_info *) reply->param; 2423 cmd = (struct qeth_ipa_cmd *) data; 2424 if (cmd->hdr.return_code) { 2425 QETH_DBF_TEXT_(TRACE, 4, "qaer1%i", cmd->hdr.return_code); 2426 return 0; 2427 } 2428 if (cmd->data.setassparms.hdr.return_code) { 2429 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code; 2430 QETH_DBF_TEXT_(TRACE, 4, "qaer2%i", cmd->hdr.return_code); 2431 return 0; 2432 } 2433 qdata = &cmd->data.setassparms.data.query_arp; 2434 switch (qdata->reply_bits) { 2435 case 5: 2436 uentry_size = entry_size = sizeof(struct qeth_arp_qi_entry5); 2437 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) 2438 uentry_size = sizeof(struct qeth_arp_qi_entry5_short); 2439 break; 2440 case 7: 2441 /* fall through to default */ 2442 default: 2443 /* tr is the same as eth -> entry7 */ 2444 uentry_size = entry_size = sizeof(struct qeth_arp_qi_entry7); 2445 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) 2446 uentry_size = sizeof(struct qeth_arp_qi_entry7_short); 2447 break; 2448 } 2449 /* check if there is enough room in userspace */ 2450 if ((qinfo->udata_len - qinfo->udata_offset) < 2451 qdata->no_entries * uentry_size){ 2452 QETH_DBF_TEXT_(TRACE, 4, "qaer3%i", -ENOMEM); 2453 cmd->hdr.return_code = -ENOMEM; 2454 goto out_error; 2455 } 2456 QETH_DBF_TEXT_(TRACE, 4, "anore%i", 2457 cmd->data.setassparms.hdr.number_of_replies); 2458 QETH_DBF_TEXT_(TRACE, 4, "aseqn%i", cmd->data.setassparms.hdr.seq_no); 2459 QETH_DBF_TEXT_(TRACE, 4, "anoen%i", qdata->no_entries); 2460 2461 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) { 2462 /* strip off "media specific information" */ 2463 qeth_l3_copy_arp_entries_stripped(qinfo, qdata, entry_size, 2464 uentry_size); 2465 } else 2466 /*copy entries to user buffer*/ 2467 memcpy(qinfo->udata + qinfo->udata_offset, 2468 (char *)&qdata->data, qdata->no_entries*uentry_size); 2469 2470 qinfo->no_entries += qdata->no_entries; 2471 qinfo->udata_offset += (qdata->no_entries*uentry_size); 2472 /* check if all replies received ... */ 2473 if (cmd->data.setassparms.hdr.seq_no < 2474 cmd->data.setassparms.hdr.number_of_replies) 2475 return 1; 2476 memcpy(qinfo->udata, &qinfo->no_entries, 4); 2477 /* keep STRIP_ENTRIES flag so the user program can distinguish 2478 * stripped entries from normal ones */ 2479 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) 2480 qdata->reply_bits |= QETH_QARP_STRIP_ENTRIES; 2481 memcpy(qinfo->udata + QETH_QARP_MASK_OFFSET, &qdata->reply_bits, 2); 2482 return 0; 2483out_error: 2484 i = 0; 2485 memcpy(qinfo->udata, &i, 4); 2486 return 0; 2487} 2488 2489static int qeth_l3_send_ipa_arp_cmd(struct qeth_card *card, 2490 struct qeth_cmd_buffer *iob, int len, 2491 int (*reply_cb)(struct qeth_card *, struct qeth_reply *, 2492 unsigned long), 2493 void *reply_param) 2494{ 2495 QETH_DBF_TEXT(TRACE, 4, "sendarp"); 2496 2497 memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE); 2498 memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data), 2499 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); 2500 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob, 2501 reply_cb, reply_param); 2502} 2503 2504static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) 2505{ 2506 struct qeth_cmd_buffer *iob; 2507 struct qeth_arp_query_info qinfo = {0, }; 2508 int tmp; 2509 int rc; 2510 2511 QETH_DBF_TEXT(TRACE, 3, "arpquery"); 2512 2513 if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ 2514 IPA_ARP_PROCESSING)) { 2515 return -EOPNOTSUPP; 2516 } 2517 /* get size of userspace buffer and mask_bits -> 6 bytes */ 2518 if (copy_from_user(&qinfo, udata, 6)) 2519 return -EFAULT; 2520 qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL); 2521 if (!qinfo.udata) 2522 return -ENOMEM; 2523 qinfo.udata_offset = QETH_QARP_ENTRIES_OFFSET; 2524 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, 2525 IPA_CMD_ASS_ARP_QUERY_INFO, 2526 sizeof(int), QETH_PROT_IPV4); 2527 2528 rc = qeth_l3_send_ipa_arp_cmd(card, iob, 2529 QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN, 2530 qeth_l3_arp_query_cb, (void *)&qinfo); 2531 if (rc) { 2532 tmp = rc; 2533 QETH_DBF_MESSAGE(2, "Error while querying ARP cache on %s: %s " 2534 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), 2535 qeth_l3_arp_get_error_cause(&rc), tmp, tmp); 2536 if (copy_to_user(udata, qinfo.udata, 4)) 2537 rc = -EFAULT; 2538 } else { 2539 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) 2540 rc = -EFAULT; 2541 } 2542 kfree(qinfo.udata); 2543 return rc; 2544} 2545 2546static int qeth_l3_arp_add_entry(struct qeth_card *card, 2547 struct qeth_arp_cache_entry *entry) 2548{ 2549 struct qeth_cmd_buffer *iob; 2550 char buf[16]; 2551 int tmp; 2552 int rc; 2553 2554 QETH_DBF_TEXT(TRACE, 3, "arpadent"); 2555 2556 /* 2557 * currently GuestLAN only supports the ARP assist function 2558 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_ADD_ENTRY; 2559 * thus we say EOPNOTSUPP for this ARP function 2560 */ 2561 if (card->info.guestlan) 2562 return -EOPNOTSUPP; 2563 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { 2564 return -EOPNOTSUPP; 2565 } 2566 2567 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, 2568 IPA_CMD_ASS_ARP_ADD_ENTRY, 2569 sizeof(struct qeth_arp_cache_entry), 2570 QETH_PROT_IPV4); 2571 rc = qeth_l3_send_setassparms(card, iob, 2572 sizeof(struct qeth_arp_cache_entry), 2573 (unsigned long) entry, 2574 qeth_l3_default_setassparms_cb, NULL); 2575 if (rc) { 2576 tmp = rc; 2577 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); 2578 QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s " 2579 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), 2580 qeth_l3_arp_get_error_cause(&rc), tmp, tmp); 2581 } 2582 return rc; 2583} 2584 2585static int qeth_l3_arp_remove_entry(struct qeth_card *card, 2586 struct qeth_arp_cache_entry *entry) 2587{ 2588 struct qeth_cmd_buffer *iob; 2589 char buf[16] = {0, }; 2590 int tmp; 2591 int rc; 2592 2593 QETH_DBF_TEXT(TRACE, 3, "arprment"); 2594 2595 /* 2596 * currently GuestLAN only supports the ARP assist function 2597 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_REMOVE_ENTRY; 2598 * thus we say EOPNOTSUPP for this ARP function 2599 */ 2600 if (card->info.guestlan) 2601 return -EOPNOTSUPP; 2602 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { 2603 return -EOPNOTSUPP; 2604 } 2605 memcpy(buf, entry, 12); 2606 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, 2607 IPA_CMD_ASS_ARP_REMOVE_ENTRY, 2608 12, 2609 QETH_PROT_IPV4); 2610 rc = qeth_l3_send_setassparms(card, iob, 2611 12, (unsigned long)buf, 2612 qeth_l3_default_setassparms_cb, NULL); 2613 if (rc) { 2614 tmp = rc; 2615 memset(buf, 0, 16); 2616 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); 2617 QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s" 2618 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), 2619 qeth_l3_arp_get_error_cause(&rc), tmp, tmp); 2620 } 2621 return rc; 2622} 2623 2624static int qeth_l3_arp_flush_cache(struct qeth_card *card) 2625{ 2626 int rc; 2627 int tmp; 2628 2629 QETH_DBF_TEXT(TRACE, 3, "arpflush"); 2630 2631 /* 2632 * currently GuestLAN only supports the ARP assist function 2633 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_FLUSH_CACHE; 2634 * thus we say EOPNOTSUPP for this ARP function 2635 */ 2636 if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) 2637 return -EOPNOTSUPP; 2638 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { 2639 return -EOPNOTSUPP; 2640 } 2641 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, 2642 IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); 2643 if (rc) { 2644 tmp = rc; 2645 QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s " 2646 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), 2647 qeth_l3_arp_get_error_cause(&rc), tmp, tmp); 2648 } 2649 return rc; 2650} 2651 2652static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 2653{ 2654 struct qeth_card *card = dev->ml_priv; 2655 struct qeth_arp_cache_entry arp_entry; 2656 struct mii_ioctl_data *mii_data; 2657 int rc = 0; 2658 2659 if (!card) 2660 return -ENODEV; 2661 2662 if ((card->state != CARD_STATE_UP) && 2663 (card->state != CARD_STATE_SOFTSETUP)) 2664 return -ENODEV; 2665 2666 switch (cmd) { 2667 case SIOC_QETH_ARP_SET_NO_ENTRIES: 2668 if (!capable(CAP_NET_ADMIN)) { 2669 rc = -EPERM; 2670 break; 2671 } 2672 rc = qeth_l3_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue); 2673 break; 2674 case SIOC_QETH_ARP_QUERY_INFO: 2675 if (!capable(CAP_NET_ADMIN)) { 2676 rc = -EPERM; 2677 break; 2678 } 2679 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); 2680 break; 2681 case SIOC_QETH_ARP_ADD_ENTRY: 2682 if (!capable(CAP_NET_ADMIN)) { 2683 rc = -EPERM; 2684 break; 2685 } 2686 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, 2687 sizeof(struct qeth_arp_cache_entry))) 2688 rc = -EFAULT; 2689 else 2690 rc = qeth_l3_arp_add_entry(card, &arp_entry); 2691 break; 2692 case SIOC_QETH_ARP_REMOVE_ENTRY: 2693 if (!capable(CAP_NET_ADMIN)) { 2694 rc = -EPERM; 2695 break; 2696 } 2697 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, 2698 sizeof(struct qeth_arp_cache_entry))) 2699 rc = -EFAULT; 2700 else 2701 rc = qeth_l3_arp_remove_entry(card, &arp_entry); 2702 break; 2703 case SIOC_QETH_ARP_FLUSH_CACHE: 2704 if (!capable(CAP_NET_ADMIN)) { 2705 rc = -EPERM; 2706 break; 2707 } 2708 rc = qeth_l3_arp_flush_cache(card); 2709 break; 2710 case SIOC_QETH_ADP_SET_SNMP_CONTROL: 2711 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); 2712 break; 2713 case SIOC_QETH_GET_CARD_TYPE: 2714 if ((card->info.type == QETH_CARD_TYPE_OSD || 2715 card->info.type == QETH_CARD_TYPE_OSX) && 2716 !card->info.guestlan) 2717 return 1; 2718 return 0; 2719 break; 2720 case SIOCGMIIPHY: 2721 mii_data = if_mii(rq); 2722 mii_data->phy_id = 0; 2723 break; 2724 case SIOCGMIIREG: 2725 mii_data = if_mii(rq); 2726 if (mii_data->phy_id != 0) 2727 rc = -EINVAL; 2728 else 2729 mii_data->val_out = qeth_mdio_read(dev, 2730 mii_data->phy_id, 2731 mii_data->reg_num); 2732 break; 2733 default: 2734 rc = -EOPNOTSUPP; 2735 } 2736 if (rc) 2737 QETH_DBF_TEXT_(TRACE, 2, "ioce%d", rc); 2738 return rc; 2739} 2740 2741int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb) 2742{ 2743 int cast_type = RTN_UNSPEC; 2744 2745 if (skb_dst(skb) && skb_dst(skb)->neighbour) { 2746 cast_type = skb_dst(skb)->neighbour->type; 2747 if ((cast_type == RTN_BROADCAST) || 2748 (cast_type == RTN_MULTICAST) || 2749 (cast_type == RTN_ANYCAST)) 2750 return cast_type; 2751 else 2752 return RTN_UNSPEC; 2753 } 2754 /* try something else */ 2755 if (skb->protocol == ETH_P_IPV6) 2756 return (skb_network_header(skb)[24] == 0xff) ? 2757 RTN_MULTICAST : 0; 2758 else if (skb->protocol == ETH_P_IP) 2759 return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ? 2760 RTN_MULTICAST : 0; 2761 /* ... */ 2762 if (!memcmp(skb->data, skb->dev->broadcast, 6)) 2763 return RTN_BROADCAST; 2764 else { 2765 u16 hdr_mac; 2766 2767 hdr_mac = *((u16 *)skb->data); 2768 /* tr multicast? */ 2769 switch (card->info.link_type) { 2770 case QETH_LINK_TYPE_HSTR: 2771 case QETH_LINK_TYPE_LANE_TR: 2772 if ((hdr_mac == QETH_TR_MAC_NC) || 2773 (hdr_mac == QETH_TR_MAC_C)) 2774 return RTN_MULTICAST; 2775 break; 2776 /* eth or so multicast? */ 2777 default: 2778 if ((hdr_mac == QETH_ETH_MAC_V4) || 2779 (hdr_mac == QETH_ETH_MAC_V6)) 2780 return RTN_MULTICAST; 2781 } 2782 } 2783 return cast_type; 2784} 2785 2786static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, 2787 struct sk_buff *skb, int ipv, int cast_type) 2788{ 2789 memset(hdr, 0, sizeof(struct qeth_hdr)); 2790 hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3; 2791 hdr->hdr.l3.ext_flags = 0; 2792 2793 /* 2794 * before we're going to overwrite this location with next hop ip. 2795 * v6 uses passthrough, v4 sets the tag in the QDIO header. 2796 */ 2797 if (card->vlangrp && vlan_tx_tag_present(skb)) { 2798 if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD)) 2799 hdr->hdr.l3.ext_flags = QETH_HDR_EXT_VLAN_FRAME; 2800 else 2801 hdr->hdr.l3.ext_flags = QETH_HDR_EXT_INCLUDE_VLAN_TAG; 2802 hdr->hdr.l3.vlan_id = vlan_tx_tag_get(skb); 2803 } 2804 2805 hdr->hdr.l3.length = skb->len - sizeof(struct qeth_hdr); 2806 if (ipv == 4) { 2807 /* IPv4 */ 2808 hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type); 2809 memset(hdr->hdr.l3.dest_addr, 0, 12); 2810 if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { 2811 *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = 2812 *((u32 *) skb_dst(skb)->neighbour->primary_key); 2813 } else { 2814 /* fill in destination address used in ip header */ 2815 *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = 2816 ip_hdr(skb)->daddr; 2817 } 2818 } else if (ipv == 6) { 2819 /* IPv6 */ 2820 hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type); 2821 if (card->info.type == QETH_CARD_TYPE_IQD) 2822 hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU; 2823 if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { 2824 memcpy(hdr->hdr.l3.dest_addr, 2825 skb_dst(skb)->neighbour->primary_key, 16); 2826 } else { 2827 /* fill in destination address used in ip header */ 2828 memcpy(hdr->hdr.l3.dest_addr, 2829 &ipv6_hdr(skb)->daddr, 16); 2830 } 2831 } else { 2832 /* passthrough */ 2833 if ((skb->dev->type == ARPHRD_IEEE802_TR) && 2834 !memcmp(skb->data + sizeof(struct qeth_hdr) + 2835 sizeof(__u16), skb->dev->broadcast, 6)) { 2836 hdr->hdr.l3.flags = QETH_CAST_BROADCAST | 2837 QETH_HDR_PASSTHRU; 2838 } else if (!memcmp(skb->data + sizeof(struct qeth_hdr), 2839 skb->dev->broadcast, 6)) { 2840 /* broadcast? */ 2841 hdr->hdr.l3.flags = QETH_CAST_BROADCAST | 2842 QETH_HDR_PASSTHRU; 2843 } else { 2844 hdr->hdr.l3.flags = (cast_type == RTN_MULTICAST) ? 2845 QETH_CAST_MULTICAST | QETH_HDR_PASSTHRU : 2846 QETH_CAST_UNICAST | QETH_HDR_PASSTHRU; 2847 } 2848 } 2849} 2850 2851static inline void qeth_l3_hdr_csum(struct qeth_card *card, 2852 struct qeth_hdr *hdr, struct sk_buff *skb) 2853{ 2854 struct iphdr *iph = ip_hdr(skb); 2855 2856 /* tcph->check contains already the pseudo hdr checksum 2857 * so just set the header flags 2858 */ 2859 if (iph->protocol == IPPROTO_UDP) 2860 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; 2861 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ; 2862 if (card->options.performance_stats) 2863 card->perf_stats.tx_csum++; 2864} 2865 2866static void qeth_tso_fill_header(struct qeth_card *card, 2867 struct qeth_hdr *qhdr, struct sk_buff *skb) 2868{ 2869 struct qeth_hdr_tso *hdr = (struct qeth_hdr_tso *)qhdr; 2870 struct tcphdr *tcph = tcp_hdr(skb); 2871 struct iphdr *iph = ip_hdr(skb); 2872 struct ipv6hdr *ip6h = ipv6_hdr(skb); 2873 2874 /*fix header to TSO values ...*/ 2875 hdr->hdr.hdr.l3.id = QETH_HEADER_TYPE_TSO; 2876 /*set values which are fix for the first approach ...*/ 2877 hdr->ext.hdr_tot_len = (__u16) sizeof(struct qeth_hdr_ext_tso); 2878 hdr->ext.imb_hdr_no = 1; 2879 hdr->ext.hdr_type = 1; 2880 hdr->ext.hdr_version = 1; 2881 hdr->ext.hdr_len = 28; 2882 /*insert non-fix values */ 2883 hdr->ext.mss = skb_shinfo(skb)->gso_size; 2884 hdr->ext.dg_hdr_len = (__u16)(iph->ihl*4 + tcph->doff*4); 2885 hdr->ext.payload_len = (__u16)(skb->len - hdr->ext.dg_hdr_len - 2886 sizeof(struct qeth_hdr_tso)); 2887 tcph->check = 0; 2888 if (skb->protocol == ETH_P_IPV6) { 2889 ip6h->payload_len = 0; 2890 tcph->check = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, 2891 0, IPPROTO_TCP, 0); 2892 } else { 2893 /*OSA want us to set these values ...*/ 2894 tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, 2895 0, IPPROTO_TCP, 0); 2896 iph->tot_len = 0; 2897 iph->check = 0; 2898 } 2899} 2900 2901static inline int qeth_l3_tso_elements(struct sk_buff *skb) 2902{ 2903 unsigned long tcpd = (unsigned long)tcp_hdr(skb) + 2904 tcp_hdr(skb)->doff * 4; 2905 int tcpd_len = skb->len - (tcpd - (unsigned long)skb->data); 2906 int elements = PFN_UP(tcpd + tcpd_len) - PFN_DOWN(tcpd); 2907 elements += skb_shinfo(skb)->nr_frags; 2908 return elements; 2909} 2910 2911static inline int qeth_l3_tso_check(struct sk_buff *skb) 2912{ 2913 int len = ((unsigned long)tcp_hdr(skb) + tcp_hdr(skb)->doff * 4) - 2914 (unsigned long)skb->data; 2915 return (((unsigned long)skb->data & PAGE_MASK) != 2916 (((unsigned long)skb->data + len) & PAGE_MASK)); 2917} 2918 2919static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) 2920{ 2921 int rc; 2922 u16 *tag; 2923 struct qeth_hdr *hdr = NULL; 2924 int elements_needed = 0; 2925 int elems; 2926 struct qeth_card *card = dev->ml_priv; 2927 struct sk_buff *new_skb = NULL; 2928 int ipv = qeth_get_ip_version(skb); 2929 int cast_type = qeth_l3_get_cast_type(card, skb); 2930 struct qeth_qdio_out_q *queue = card->qdio.out_qs 2931 [qeth_get_priority_queue(card, skb, ipv, cast_type)]; 2932 int tx_bytes = skb->len; 2933 enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO; 2934 int data_offset = -1; 2935 int nr_frags; 2936 2937 if (((card->info.type == QETH_CARD_TYPE_IQD) && (!ipv)) || 2938 card->options.sniffer) 2939 goto tx_drop; 2940 2941 if ((card->state != CARD_STATE_UP) || !card->lan_online) { 2942 card->stats.tx_carrier_errors++; 2943 goto tx_drop; 2944 } 2945 2946 if ((cast_type == RTN_BROADCAST) && 2947 (card->info.broadcast_capable == 0)) 2948 goto tx_drop; 2949 2950 if (card->options.performance_stats) { 2951 card->perf_stats.outbound_cnt++; 2952 card->perf_stats.outbound_start_time = qeth_get_micros(); 2953 } 2954 2955 if (skb_is_gso(skb)) 2956 large_send = card->options.large_send; 2957 2958 if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) && 2959 (skb_shinfo(skb)->nr_frags == 0)) { 2960 new_skb = skb; 2961 data_offset = ETH_HLEN; 2962 hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC); 2963 if (!hdr) 2964 goto tx_drop; 2965 elements_needed++; 2966 } else { 2967 /* create a clone with writeable headroom */ 2968 new_skb = skb_realloc_headroom(skb, sizeof(struct qeth_hdr_tso) 2969 + VLAN_HLEN); 2970 if (!new_skb) 2971 goto tx_drop; 2972 } 2973 2974 if (card->info.type == QETH_CARD_TYPE_IQD) { 2975 if (data_offset < 0) 2976 skb_pull(new_skb, ETH_HLEN); 2977 } else { 2978 if (ipv == 4) { 2979 if (card->dev->type == ARPHRD_IEEE802_TR) 2980 skb_pull(new_skb, TR_HLEN); 2981 else 2982 skb_pull(new_skb, ETH_HLEN); 2983 } 2984 2985 if (ipv == 6 && card->vlangrp && 2986 vlan_tx_tag_present(new_skb)) { 2987 skb_push(new_skb, VLAN_HLEN); 2988 skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4); 2989 skb_copy_to_linear_data_offset(new_skb, 4, 2990 new_skb->data + 8, 4); 2991 skb_copy_to_linear_data_offset(new_skb, 8, 2992 new_skb->data + 12, 4); 2993 tag = (u16 *)(new_skb->data + 12); 2994 *tag = __constant_htons(ETH_P_8021Q); 2995 *(tag + 1) = htons(vlan_tx_tag_get(new_skb)); 2996 new_skb->vlan_tci = 0; 2997 } 2998 } 2999 3000 netif_stop_queue(dev); 3001 3002 /* fix hardware limitation: as long as we do not have sbal 3003 * chaining we can not send long frag lists 3004 */ 3005 if (large_send == QETH_LARGE_SEND_TSO) { 3006 if (qeth_l3_tso_elements(new_skb) + 1 > 16) { 3007 if (skb_linearize(new_skb)) 3008 goto tx_drop; 3009 if (card->options.performance_stats) 3010 card->perf_stats.tx_lin++; 3011 } 3012 } 3013 3014 if ((large_send == QETH_LARGE_SEND_TSO) && 3015 (cast_type == RTN_UNSPEC)) { 3016 hdr = (struct qeth_hdr *)skb_push(new_skb, 3017 sizeof(struct qeth_hdr_tso)); 3018 if (qeth_l3_tso_check(new_skb)) 3019 QETH_DBF_MESSAGE(2, "tso skb misaligned\n"); 3020 memset(hdr, 0, sizeof(struct qeth_hdr_tso)); 3021 qeth_l3_fill_header(card, hdr, new_skb, ipv, cast_type); 3022 qeth_tso_fill_header(card, hdr, new_skb); 3023 elements_needed++; 3024 } else { 3025 if (data_offset < 0) { 3026 hdr = (struct qeth_hdr *)skb_push(new_skb, 3027 sizeof(struct qeth_hdr)); 3028 qeth_l3_fill_header(card, hdr, new_skb, ipv, 3029 cast_type); 3030 } else { 3031 qeth_l3_fill_header(card, hdr, new_skb, ipv, 3032 cast_type); 3033 hdr->hdr.l3.length = new_skb->len - data_offset; 3034 } 3035 3036 if (skb->ip_summed == CHECKSUM_PARTIAL) 3037 qeth_l3_hdr_csum(card, hdr, new_skb); 3038 } 3039 3040 elems = qeth_get_elements_no(card, (void *)hdr, new_skb, 3041 elements_needed); 3042 if (!elems) { 3043 if (data_offset >= 0) 3044 kmem_cache_free(qeth_core_header_cache, hdr); 3045 goto tx_drop; 3046 } 3047 elements_needed += elems; 3048 nr_frags = skb_shinfo(new_skb)->nr_frags; 3049 3050 if (card->info.type != QETH_CARD_TYPE_IQD) 3051 rc = qeth_do_send_packet(card, queue, new_skb, hdr, 3052 elements_needed); 3053 else 3054 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, 3055 elements_needed, data_offset, 0); 3056 3057 if (!rc) { 3058 card->stats.tx_packets++; 3059 card->stats.tx_bytes += tx_bytes; 3060 if (new_skb != skb) 3061 dev_kfree_skb_any(skb); 3062 if (card->options.performance_stats) { 3063 if (large_send != QETH_LARGE_SEND_NO) { 3064 card->perf_stats.large_send_bytes += tx_bytes; 3065 card->perf_stats.large_send_cnt++; 3066 } 3067 if (nr_frags) { 3068 card->perf_stats.sg_skbs_sent++; 3069 /* nr_frags + skb->data */ 3070 card->perf_stats.sg_frags_sent += nr_frags + 1; 3071 } 3072 } 3073 rc = NETDEV_TX_OK; 3074 } else { 3075 if (data_offset >= 0) 3076 kmem_cache_free(qeth_core_header_cache, hdr); 3077 3078 if (rc == -EBUSY) { 3079 if (new_skb != skb) 3080 dev_kfree_skb_any(new_skb); 3081 return NETDEV_TX_BUSY; 3082 } else 3083 goto tx_drop; 3084 } 3085 3086 netif_wake_queue(dev); 3087 if (card->options.performance_stats) 3088 card->perf_stats.outbound_time += qeth_get_micros() - 3089 card->perf_stats.outbound_start_time; 3090 return rc; 3091 3092tx_drop: 3093 card->stats.tx_dropped++; 3094 card->stats.tx_errors++; 3095 if ((new_skb != skb) && new_skb) 3096 dev_kfree_skb_any(new_skb); 3097 dev_kfree_skb_any(skb); 3098 netif_wake_queue(dev); 3099 return NETDEV_TX_OK; 3100} 3101 3102static int qeth_l3_open(struct net_device *dev) 3103{ 3104 struct qeth_card *card = dev->ml_priv; 3105 3106 QETH_DBF_TEXT(TRACE, 4, "qethopen"); 3107 if (card->state != CARD_STATE_SOFTSETUP) 3108 return -ENODEV; 3109 card->data.state = CH_STATE_UP; 3110 card->state = CARD_STATE_UP; 3111 netif_start_queue(dev); 3112 3113 if (!card->lan_online && netif_carrier_ok(dev)) 3114 netif_carrier_off(dev); 3115 return 0; 3116} 3117 3118static int qeth_l3_stop(struct net_device *dev) 3119{ 3120 struct qeth_card *card = dev->ml_priv; 3121 3122 QETH_DBF_TEXT(TRACE, 4, "qethstop"); 3123 netif_tx_disable(dev); 3124 if (card->state == CARD_STATE_UP) 3125 card->state = CARD_STATE_SOFTSETUP; 3126 return 0; 3127} 3128 3129static u32 qeth_l3_ethtool_get_rx_csum(struct net_device *dev) 3130{ 3131 struct qeth_card *card = dev->ml_priv; 3132 3133 return (card->options.checksum_type == HW_CHECKSUMMING); 3134} 3135 3136static int qeth_l3_ethtool_set_rx_csum(struct net_device *dev, u32 data) 3137{ 3138 struct qeth_card *card = dev->ml_priv; 3139 enum qeth_checksum_types csum_type; 3140 3141 if (data) 3142 csum_type = HW_CHECKSUMMING; 3143 else 3144 csum_type = SW_CHECKSUMMING; 3145 3146 return qeth_l3_set_rx_csum(card, csum_type); 3147} 3148 3149static int qeth_l3_ethtool_set_tso(struct net_device *dev, u32 data) 3150{ 3151 struct qeth_card *card = dev->ml_priv; 3152 int rc = 0; 3153 3154 if (data) { 3155 rc = qeth_l3_set_large_send(card, QETH_LARGE_SEND_TSO); 3156 } else { 3157 dev->features &= ~NETIF_F_TSO; 3158 card->options.large_send = QETH_LARGE_SEND_NO; 3159 } 3160 return rc; 3161} 3162 3163static int qeth_l3_ethtool_set_tx_csum(struct net_device *dev, u32 data) 3164{ 3165 struct qeth_card *card = dev->ml_priv; 3166 3167 if (data) { 3168 if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) 3169 dev->features |= NETIF_F_IP_CSUM; 3170 else 3171 return -EPERM; 3172 } else 3173 dev->features &= ~NETIF_F_IP_CSUM; 3174 3175 return 0; 3176} 3177 3178static const struct ethtool_ops qeth_l3_ethtool_ops = { 3179 .get_link = ethtool_op_get_link, 3180 .get_tx_csum = ethtool_op_get_tx_csum, 3181 .set_tx_csum = qeth_l3_ethtool_set_tx_csum, 3182 .get_rx_csum = qeth_l3_ethtool_get_rx_csum, 3183 .set_rx_csum = qeth_l3_ethtool_set_rx_csum, 3184 .get_sg = ethtool_op_get_sg, 3185 .set_sg = ethtool_op_set_sg, 3186 .get_tso = ethtool_op_get_tso, 3187 .set_tso = qeth_l3_ethtool_set_tso, 3188 .get_strings = qeth_core_get_strings, 3189 .get_ethtool_stats = qeth_core_get_ethtool_stats, 3190 .get_sset_count = qeth_core_get_sset_count, 3191 .get_drvinfo = qeth_core_get_drvinfo, 3192 .get_settings = qeth_core_ethtool_get_settings, 3193}; 3194 3195/* 3196 * we need NOARP for IPv4 but we want neighbor solicitation for IPv6. Setting 3197 * NOARP on the netdevice is no option because it also turns off neighbor 3198 * solicitation. For IPv4 we install a neighbor_setup function. We don't want 3199 * arp resolution but we want the hard header (packet socket will work 3200 * e.g. tcpdump) 3201 */ 3202static int qeth_l3_neigh_setup_noarp(struct neighbour *n) 3203{ 3204 n->nud_state = NUD_NOARP; 3205 memcpy(n->ha, "FAKELL", 6); 3206 n->output = n->ops->connected_output; 3207 return 0; 3208} 3209 3210static int 3211qeth_l3_neigh_setup(struct net_device *dev, struct neigh_parms *np) 3212{ 3213 if (np->tbl->family == AF_INET) 3214 np->neigh_setup = qeth_l3_neigh_setup_noarp; 3215 3216 return 0; 3217} 3218 3219static const struct net_device_ops qeth_l3_netdev_ops = { 3220 .ndo_open = qeth_l3_open, 3221 .ndo_stop = qeth_l3_stop, 3222 .ndo_get_stats = qeth_get_stats, 3223 .ndo_start_xmit = qeth_l3_hard_start_xmit, 3224 .ndo_validate_addr = eth_validate_addr, 3225 .ndo_set_multicast_list = qeth_l3_set_multicast_list, 3226 .ndo_do_ioctl = qeth_l3_do_ioctl, 3227 .ndo_change_mtu = qeth_change_mtu, 3228 .ndo_vlan_rx_register = qeth_l3_vlan_rx_register, 3229 .ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid, 3230 .ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid, 3231 .ndo_tx_timeout = qeth_tx_timeout, 3232}; 3233 3234static const struct net_device_ops qeth_l3_osa_netdev_ops = { 3235 .ndo_open = qeth_l3_open, 3236 .ndo_stop = qeth_l3_stop, 3237 .ndo_get_stats = qeth_get_stats, 3238 .ndo_start_xmit = qeth_l3_hard_start_xmit, 3239 .ndo_validate_addr = eth_validate_addr, 3240 .ndo_set_multicast_list = qeth_l3_set_multicast_list, 3241 .ndo_do_ioctl = qeth_l3_do_ioctl, 3242 .ndo_change_mtu = qeth_change_mtu, 3243 .ndo_vlan_rx_register = qeth_l3_vlan_rx_register, 3244 .ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid, 3245 .ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid, 3246 .ndo_tx_timeout = qeth_tx_timeout, 3247 .ndo_neigh_setup = qeth_l3_neigh_setup, 3248}; 3249 3250static int qeth_l3_setup_netdev(struct qeth_card *card) 3251{ 3252 if (card->info.type == QETH_CARD_TYPE_OSD || 3253 card->info.type == QETH_CARD_TYPE_OSX) { 3254 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || 3255 (card->info.link_type == QETH_LINK_TYPE_HSTR)) { 3256#ifdef CONFIG_TR 3257 card->dev = alloc_trdev(0); 3258#endif 3259 if (!card->dev) 3260 return -ENODEV; 3261 card->dev->netdev_ops = &qeth_l3_netdev_ops; 3262 } else { 3263 card->dev = alloc_etherdev(0); 3264 if (!card->dev) 3265 return -ENODEV; 3266 card->dev->netdev_ops = &qeth_l3_osa_netdev_ops; 3267 3268 /*IPv6 address autoconfiguration stuff*/ 3269 qeth_l3_get_unique_id(card); 3270 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) 3271 card->dev->dev_id = card->info.unique_id & 3272 0xffff; 3273 } 3274 } else if (card->info.type == QETH_CARD_TYPE_IQD) { 3275 card->dev = alloc_netdev(0, "hsi%d", ether_setup); 3276 if (!card->dev) 3277 return -ENODEV; 3278 card->dev->flags |= IFF_NOARP; 3279 card->dev->netdev_ops = &qeth_l3_netdev_ops; 3280 qeth_l3_iqd_read_initial_mac(card); 3281 } else 3282 return -ENODEV; 3283 3284 card->dev->ml_priv = card; 3285 card->dev->watchdog_timeo = QETH_TX_TIMEOUT; 3286 card->dev->mtu = card->info.initial_mtu; 3287 SET_ETHTOOL_OPS(card->dev, &qeth_l3_ethtool_ops); 3288 card->dev->features |= NETIF_F_HW_VLAN_TX | 3289 NETIF_F_HW_VLAN_RX | 3290 NETIF_F_HW_VLAN_FILTER; 3291 card->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 3292 card->dev->gso_max_size = 15 * PAGE_SIZE; 3293 3294 SET_NETDEV_DEV(card->dev, &card->gdev->dev); 3295 return register_netdev(card->dev); 3296} 3297 3298static void qeth_l3_qdio_input_handler(struct ccw_device *ccwdev, 3299 unsigned int qdio_err, unsigned int queue, int first_element, 3300 int count, unsigned long card_ptr) 3301{ 3302 struct net_device *net_dev; 3303 struct qeth_card *card; 3304 struct qeth_qdio_buffer *buffer; 3305 int index; 3306 int i; 3307 3308 card = (struct qeth_card *) card_ptr; 3309 net_dev = card->dev; 3310 if (card->options.performance_stats) { 3311 card->perf_stats.inbound_cnt++; 3312 card->perf_stats.inbound_start_time = qeth_get_micros(); 3313 } 3314 if (qdio_err & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { 3315 QETH_DBF_TEXT(TRACE, 1, "qdinchk"); 3316 QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); 3317 QETH_DBF_TEXT_(TRACE, 1, "%04X%04X", 3318 first_element, count); 3319 QETH_DBF_TEXT_(TRACE, 1, "%04X", queue); 3320 qeth_schedule_recovery(card); 3321 return; 3322 } 3323 for (i = first_element; i < (first_element + count); ++i) { 3324 index = i % QDIO_MAX_BUFFERS_PER_Q; 3325 buffer = &card->qdio.in_q->bufs[index]; 3326 if (!(qdio_err && 3327 qeth_check_qdio_errors(card, buffer->buffer, 3328 qdio_err, "qinerr"))) 3329 qeth_l3_process_inbound_buffer(card, buffer, index); 3330 /* clear buffer and give back to hardware */ 3331 qeth_put_buffer_pool_entry(card, buffer->pool_entry); 3332 qeth_queue_input_buffer(card, index); 3333 } 3334 if (card->options.performance_stats) 3335 card->perf_stats.inbound_time += qeth_get_micros() - 3336 card->perf_stats.inbound_start_time; 3337} 3338 3339static int qeth_l3_probe_device(struct ccwgroup_device *gdev) 3340{ 3341 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3342 3343 qeth_l3_create_device_attributes(&gdev->dev); 3344 card->options.layer2 = 0; 3345 card->discipline.input_handler = (qdio_handler_t *) 3346 qeth_l3_qdio_input_handler; 3347 card->discipline.output_handler = (qdio_handler_t *) 3348 qeth_qdio_output_handler; 3349 card->discipline.recover = qeth_l3_recover; 3350 return 0; 3351} 3352 3353static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) 3354{ 3355 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 3356 3357 qeth_set_allowed_threads(card, 0, 1); 3358 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 3359 3360 if (cgdev->state == CCWGROUP_ONLINE) { 3361 card->use_hard_stop = 1; 3362 qeth_l3_set_offline(cgdev); 3363 } 3364 3365 if (card->dev) { 3366 unregister_netdev(card->dev); 3367 card->dev = NULL; 3368 } 3369 3370 qeth_l3_remove_device_attributes(&cgdev->dev); 3371 qeth_l3_clear_ip_list(card, 0, 0); 3372 qeth_l3_clear_ipato_list(card); 3373 return; 3374} 3375 3376static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) 3377{ 3378 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3379 int rc = 0; 3380 enum qeth_card_states recover_flag; 3381 3382 BUG_ON(!card); 3383 mutex_lock(&card->conf_mutex); 3384 QETH_DBF_TEXT(SETUP, 2, "setonlin"); 3385 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 3386 3387 recover_flag = card->state; 3388 rc = qeth_core_hardsetup_card(card); 3389 if (rc) { 3390 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); 3391 rc = -ENODEV; 3392 goto out_remove; 3393 } 3394 3395 qeth_l3_query_ipassists(card, QETH_PROT_IPV4); 3396 3397 if (!card->dev && qeth_l3_setup_netdev(card)) { 3398 rc = -ENODEV; 3399 goto out_remove; 3400 } 3401 3402 card->state = CARD_STATE_HARDSETUP; 3403 qeth_print_status_message(card); 3404 3405 /* softsetup */ 3406 QETH_DBF_TEXT(SETUP, 2, "softsetp"); 3407 3408 rc = qeth_send_startlan(card); 3409 if (rc) { 3410 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 3411 if (rc == 0xe080) { 3412 dev_warn(&card->gdev->dev, 3413 "The LAN is offline\n"); 3414 card->lan_online = 0; 3415 goto out; 3416 } 3417 rc = -ENODEV; 3418 goto out_remove; 3419 } else 3420 card->lan_online = 1; 3421 3422 rc = qeth_l3_setadapter_parms(card); 3423 if (rc) 3424 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); 3425 if (!card->options.sniffer) { 3426 rc = qeth_l3_start_ipassists(card); 3427 if (rc) 3428 QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc); 3429 qeth_l3_set_large_send(card, card->options.large_send); 3430 rc = qeth_l3_setrouting_v4(card); 3431 if (rc) 3432 QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc); 3433 rc = qeth_l3_setrouting_v6(card); 3434 if (rc) 3435 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc); 3436 } 3437 netif_tx_disable(card->dev); 3438 3439 rc = qeth_init_qdio_queues(card); 3440 if (rc) { 3441 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); 3442 rc = -ENODEV; 3443 goto out_remove; 3444 } 3445 card->state = CARD_STATE_SOFTSETUP; 3446 netif_carrier_on(card->dev); 3447 3448 qeth_set_allowed_threads(card, 0xffffffff, 0); 3449 qeth_l3_set_ip_addr_list(card); 3450 if (recover_flag == CARD_STATE_RECOVER) { 3451 if (recovery_mode) 3452 qeth_l3_open(card->dev); 3453 else { 3454 rtnl_lock(); 3455 dev_open(card->dev); 3456 rtnl_unlock(); 3457 } 3458 qeth_l3_set_multicast_list(card->dev); 3459 } 3460 /* let user_space know that device is online */ 3461 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); 3462out: 3463 mutex_unlock(&card->conf_mutex); 3464 return 0; 3465out_remove: 3466 card->use_hard_stop = 1; 3467 qeth_l3_stop_card(card, 0); 3468 ccw_device_set_offline(CARD_DDEV(card)); 3469 ccw_device_set_offline(CARD_WDEV(card)); 3470 ccw_device_set_offline(CARD_RDEV(card)); 3471 if (recover_flag == CARD_STATE_RECOVER) 3472 card->state = CARD_STATE_RECOVER; 3473 else 3474 card->state = CARD_STATE_DOWN; 3475 mutex_unlock(&card->conf_mutex); 3476 return rc; 3477} 3478 3479static int qeth_l3_set_online(struct ccwgroup_device *gdev) 3480{ 3481 return __qeth_l3_set_online(gdev, 0); 3482} 3483 3484static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev, 3485 int recovery_mode) 3486{ 3487 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 3488 int rc = 0, rc2 = 0, rc3 = 0; 3489 enum qeth_card_states recover_flag; 3490 3491 mutex_lock(&card->conf_mutex); 3492 QETH_DBF_TEXT(SETUP, 3, "setoffl"); 3493 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); 3494 3495 if (card->dev && netif_carrier_ok(card->dev)) 3496 netif_carrier_off(card->dev); 3497 recover_flag = card->state; 3498 qeth_l3_stop_card(card, recovery_mode); 3499 rc = ccw_device_set_offline(CARD_DDEV(card)); 3500 rc2 = ccw_device_set_offline(CARD_WDEV(card)); 3501 rc3 = ccw_device_set_offline(CARD_RDEV(card)); 3502 if (!rc) 3503 rc = (rc2) ? rc2 : rc3; 3504 if (rc) 3505 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 3506 if (recover_flag == CARD_STATE_UP) 3507 card->state = CARD_STATE_RECOVER; 3508 /* let user_space know that device is offline */ 3509 kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE); 3510 mutex_unlock(&card->conf_mutex); 3511 return 0; 3512} 3513 3514static int qeth_l3_set_offline(struct ccwgroup_device *cgdev) 3515{ 3516 return __qeth_l3_set_offline(cgdev, 0); 3517} 3518 3519static int qeth_l3_recover(void *ptr) 3520{ 3521 struct qeth_card *card; 3522 int rc = 0; 3523 3524 card = (struct qeth_card *) ptr; 3525 QETH_DBF_TEXT(TRACE, 2, "recover1"); 3526 QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *)); 3527 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) 3528 return 0; 3529 QETH_DBF_TEXT(TRACE, 2, "recover2"); 3530 dev_warn(&card->gdev->dev, 3531 "A recovery process has been started for the device\n"); 3532 card->use_hard_stop = 1; 3533 __qeth_l3_set_offline(card->gdev, 1); 3534 rc = __qeth_l3_set_online(card->gdev, 1); 3535 /* don't run another scheduled recovery */ 3536 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 3537 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); 3538 if (!rc) 3539 dev_info(&card->gdev->dev, 3540 "Device successfully recovered!\n"); 3541 else { 3542 rtnl_lock(); 3543 dev_close(card->dev); 3544 rtnl_unlock(); 3545 dev_warn(&card->gdev->dev, "The qeth device driver " 3546 "failed to recover an error on the device\n"); 3547 } 3548 return 0; 3549} 3550 3551static void qeth_l3_shutdown(struct ccwgroup_device *gdev) 3552{ 3553 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3554 qeth_l3_clear_ip_list(card, 0, 0); 3555 qeth_qdio_clear_card(card, 0); 3556 qeth_clear_qdio_buffers(card); 3557} 3558 3559static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev) 3560{ 3561 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3562 3563 if (card->dev) 3564 netif_device_detach(card->dev); 3565 qeth_set_allowed_threads(card, 0, 1); 3566 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 3567 if (gdev->state == CCWGROUP_OFFLINE) 3568 return 0; 3569 if (card->state == CARD_STATE_UP) { 3570 card->use_hard_stop = 1; 3571 __qeth_l3_set_offline(card->gdev, 1); 3572 } else 3573 __qeth_l3_set_offline(card->gdev, 0); 3574 return 0; 3575} 3576 3577static int qeth_l3_pm_resume(struct ccwgroup_device *gdev) 3578{ 3579 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3580 int rc = 0; 3581 3582 if (gdev->state == CCWGROUP_OFFLINE) 3583 goto out; 3584 3585 if (card->state == CARD_STATE_RECOVER) { 3586 rc = __qeth_l3_set_online(card->gdev, 1); 3587 if (rc) { 3588 rtnl_lock(); 3589 dev_close(card->dev); 3590 rtnl_unlock(); 3591 } 3592 } else 3593 rc = __qeth_l3_set_online(card->gdev, 0); 3594out: 3595 qeth_set_allowed_threads(card, 0xffffffff, 0); 3596 if (card->dev) 3597 netif_device_attach(card->dev); 3598 if (rc) 3599 dev_warn(&card->gdev->dev, "The qeth device driver " 3600 "failed to recover an error on the device\n"); 3601 return rc; 3602} 3603 3604struct ccwgroup_driver qeth_l3_ccwgroup_driver = { 3605 .probe = qeth_l3_probe_device, 3606 .remove = qeth_l3_remove_device, 3607 .set_online = qeth_l3_set_online, 3608 .set_offline = qeth_l3_set_offline, 3609 .shutdown = qeth_l3_shutdown, 3610 .freeze = qeth_l3_pm_suspend, 3611 .thaw = qeth_l3_pm_resume, 3612 .restore = qeth_l3_pm_resume, 3613}; 3614EXPORT_SYMBOL_GPL(qeth_l3_ccwgroup_driver); 3615 3616static int qeth_l3_ip_event(struct notifier_block *this, 3617 unsigned long event, void *ptr) 3618{ 3619 struct in_ifaddr *ifa = (struct in_ifaddr *)ptr; 3620 struct net_device *dev = (struct net_device *)ifa->ifa_dev->dev; 3621 struct qeth_ipaddr *addr; 3622 struct qeth_card *card; 3623 3624 if (dev_net(dev) != &init_net) 3625 return NOTIFY_DONE; 3626 3627 QETH_DBF_TEXT(TRACE, 3, "ipevent"); 3628 card = qeth_l3_get_card_from_dev(dev); 3629 if (!card) 3630 return NOTIFY_DONE; 3631 3632 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); 3633 if (addr != NULL) { 3634 addr->u.a4.addr = ifa->ifa_address; 3635 addr->u.a4.mask = ifa->ifa_mask; 3636 addr->type = QETH_IP_TYPE_NORMAL; 3637 } else 3638 goto out; 3639 3640 switch (event) { 3641 case NETDEV_UP: 3642 if (!qeth_l3_add_ip(card, addr)) 3643 kfree(addr); 3644 break; 3645 case NETDEV_DOWN: 3646 if (!qeth_l3_delete_ip(card, addr)) 3647 kfree(addr); 3648 break; 3649 default: 3650 break; 3651 } 3652 qeth_l3_set_ip_addr_list(card); 3653out: 3654 return NOTIFY_DONE; 3655} 3656 3657static struct notifier_block qeth_l3_ip_notifier = { 3658 qeth_l3_ip_event, 3659 NULL, 3660}; 3661 3662#ifdef CONFIG_QETH_IPV6 3663/** 3664 * IPv6 event handler 3665 */ 3666static int qeth_l3_ip6_event(struct notifier_block *this, 3667 unsigned long event, void *ptr) 3668{ 3669 struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr; 3670 struct net_device *dev = (struct net_device *)ifa->idev->dev; 3671 struct qeth_ipaddr *addr; 3672 struct qeth_card *card; 3673 3674 QETH_DBF_TEXT(TRACE, 3, "ip6event"); 3675 3676 card = qeth_l3_get_card_from_dev(dev); 3677 if (!card) 3678 return NOTIFY_DONE; 3679 if (!qeth_is_supported(card, IPA_IPV6)) 3680 return NOTIFY_DONE; 3681 3682 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6); 3683 if (addr != NULL) { 3684 memcpy(&addr->u.a6.addr, &ifa->addr, sizeof(struct in6_addr)); 3685 addr->u.a6.pfxlen = ifa->prefix_len; 3686 addr->type = QETH_IP_TYPE_NORMAL; 3687 } else 3688 goto out; 3689 3690 switch (event) { 3691 case NETDEV_UP: 3692 if (!qeth_l3_add_ip(card, addr)) 3693 kfree(addr); 3694 break; 3695 case NETDEV_DOWN: 3696 if (!qeth_l3_delete_ip(card, addr)) 3697 kfree(addr); 3698 break; 3699 default: 3700 break; 3701 } 3702 qeth_l3_set_ip_addr_list(card); 3703out: 3704 return NOTIFY_DONE; 3705} 3706 3707static struct notifier_block qeth_l3_ip6_notifier = { 3708 qeth_l3_ip6_event, 3709 NULL, 3710}; 3711#endif 3712 3713static int qeth_l3_register_notifiers(void) 3714{ 3715 int rc; 3716 3717 QETH_DBF_TEXT(TRACE, 5, "regnotif"); 3718 rc = register_inetaddr_notifier(&qeth_l3_ip_notifier); 3719 if (rc) 3720 return rc; 3721#ifdef CONFIG_QETH_IPV6 3722 rc = register_inet6addr_notifier(&qeth_l3_ip6_notifier); 3723 if (rc) { 3724 unregister_inetaddr_notifier(&qeth_l3_ip_notifier); 3725 return rc; 3726 } 3727#else 3728 pr_warning("There is no IPv6 support for the layer 3 discipline\n"); 3729#endif 3730 return 0; 3731} 3732 3733static void qeth_l3_unregister_notifiers(void) 3734{ 3735 3736 QETH_DBF_TEXT(TRACE, 5, "unregnot"); 3737 BUG_ON(unregister_inetaddr_notifier(&qeth_l3_ip_notifier)); 3738#ifdef CONFIG_QETH_IPV6 3739 BUG_ON(unregister_inet6addr_notifier(&qeth_l3_ip6_notifier)); 3740#endif /* QETH_IPV6 */ 3741} 3742 3743static int __init qeth_l3_init(void) 3744{ 3745 int rc = 0; 3746 3747 pr_info("register layer 3 discipline\n"); 3748 rc = qeth_l3_register_notifiers(); 3749 return rc; 3750} 3751 3752static void __exit qeth_l3_exit(void) 3753{ 3754 qeth_l3_unregister_notifiers(); 3755 pr_info("unregister layer 3 discipline\n"); 3756} 3757 3758module_init(qeth_l3_init); 3759module_exit(qeth_l3_exit); 3760MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>"); 3761MODULE_DESCRIPTION("qeth layer 3 discipline"); 3762MODULE_LICENSE("GPL");