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 v3.9-rc8 1353 lines 36 kB view raw
1/* 2 * Copyright IBM Corp. 2007, 2009 3 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, 4 * Frank Pavlic <fpavlic@de.ibm.com>, 5 * Thomas Spatzier <tspat@de.ibm.com>, 6 * Frank Blaschka <frank.blaschka@de.ibm.com> 7 */ 8 9#define KMSG_COMPONENT "qeth" 10#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 11 12#include <linux/module.h> 13#include <linux/moduleparam.h> 14#include <linux/string.h> 15#include <linux/errno.h> 16#include <linux/kernel.h> 17#include <linux/slab.h> 18#include <linux/etherdevice.h> 19#include <linux/mii.h> 20#include <linux/ip.h> 21#include <linux/list.h> 22 23#include "qeth_core.h" 24 25static int qeth_l2_set_offline(struct ccwgroup_device *); 26static int qeth_l2_stop(struct net_device *); 27static int qeth_l2_send_delmac(struct qeth_card *, __u8 *); 28static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *, 29 enum qeth_ipa_cmds, 30 int (*reply_cb) (struct qeth_card *, 31 struct qeth_reply*, 32 unsigned long)); 33static void qeth_l2_set_multicast_list(struct net_device *); 34static int qeth_l2_recover(void *); 35 36static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 37{ 38 struct qeth_card *card = dev->ml_priv; 39 struct mii_ioctl_data *mii_data; 40 int rc = 0; 41 42 if (!card) 43 return -ENODEV; 44 45 if ((card->state != CARD_STATE_UP) && 46 (card->state != CARD_STATE_SOFTSETUP)) 47 return -ENODEV; 48 49 if (card->info.type == QETH_CARD_TYPE_OSN) 50 return -EPERM; 51 52 switch (cmd) { 53 case SIOC_QETH_ADP_SET_SNMP_CONTROL: 54 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); 55 break; 56 case SIOC_QETH_GET_CARD_TYPE: 57 if ((card->info.type == QETH_CARD_TYPE_OSD || 58 card->info.type == QETH_CARD_TYPE_OSM || 59 card->info.type == QETH_CARD_TYPE_OSX) && 60 !card->info.guestlan) 61 return 1; 62 return 0; 63 break; 64 case SIOCGMIIPHY: 65 mii_data = if_mii(rq); 66 mii_data->phy_id = 0; 67 break; 68 case SIOCGMIIREG: 69 mii_data = if_mii(rq); 70 if (mii_data->phy_id != 0) 71 rc = -EINVAL; 72 else 73 mii_data->val_out = qeth_mdio_read(dev, 74 mii_data->phy_id, mii_data->reg_num); 75 break; 76 case SIOC_QETH_QUERY_OAT: 77 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); 78 break; 79 default: 80 rc = -EOPNOTSUPP; 81 } 82 if (rc) 83 QETH_CARD_TEXT_(card, 2, "ioce%d", rc); 84 return rc; 85} 86 87static int qeth_l2_verify_dev(struct net_device *dev) 88{ 89 struct qeth_card *card; 90 unsigned long flags; 91 int rc = 0; 92 93 read_lock_irqsave(&qeth_core_card_list.rwlock, flags); 94 list_for_each_entry(card, &qeth_core_card_list.list, list) { 95 if (card->dev == dev) { 96 rc = QETH_REAL_CARD; 97 break; 98 } 99 } 100 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags); 101 102 return rc; 103} 104 105static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no) 106{ 107 struct qeth_card *card; 108 struct net_device *ndev; 109 __u16 temp_dev_no; 110 unsigned long flags; 111 struct ccw_dev_id read_devid; 112 113 ndev = NULL; 114 memcpy(&temp_dev_no, read_dev_no, 2); 115 read_lock_irqsave(&qeth_core_card_list.rwlock, flags); 116 list_for_each_entry(card, &qeth_core_card_list.list, list) { 117 ccw_device_get_id(CARD_RDEV(card), &read_devid); 118 if (read_devid.devno == temp_dev_no) { 119 ndev = card->dev; 120 break; 121 } 122 } 123 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags); 124 return ndev; 125} 126 127static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card, 128 struct qeth_reply *reply, 129 unsigned long data) 130{ 131 struct qeth_ipa_cmd *cmd; 132 __u8 *mac; 133 134 QETH_CARD_TEXT(card, 2, "L2Sgmacb"); 135 cmd = (struct qeth_ipa_cmd *) data; 136 mac = &cmd->data.setdelmac.mac[0]; 137 /* MAC already registered, needed in couple/uncouple case */ 138 if (cmd->hdr.return_code == IPA_RC_L2_DUP_MAC) { 139 QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n", 140 mac, QETH_CARD_IFNAME(card)); 141 cmd->hdr.return_code = 0; 142 } 143 if (cmd->hdr.return_code) 144 QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n", 145 mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); 146 return 0; 147} 148 149static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) 150{ 151 QETH_CARD_TEXT(card, 2, "L2Sgmac"); 152 return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC, 153 qeth_l2_send_setgroupmac_cb); 154} 155 156static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card, 157 struct qeth_reply *reply, 158 unsigned long data) 159{ 160 struct qeth_ipa_cmd *cmd; 161 __u8 *mac; 162 163 QETH_CARD_TEXT(card, 2, "L2Dgmacb"); 164 cmd = (struct qeth_ipa_cmd *) data; 165 mac = &cmd->data.setdelmac.mac[0]; 166 if (cmd->hdr.return_code) 167 QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n", 168 mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); 169 return 0; 170} 171 172static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) 173{ 174 QETH_CARD_TEXT(card, 2, "L2Dgmac"); 175 return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC, 176 qeth_l2_send_delgroupmac_cb); 177} 178 179static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) 180{ 181 struct qeth_mc_mac *mc; 182 int rc; 183 184 mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC); 185 186 if (!mc) 187 return; 188 189 memcpy(mc->mc_addr, mac, OSA_ADDR_LEN); 190 mc->mc_addrlen = OSA_ADDR_LEN; 191 mc->is_vmac = vmac; 192 193 if (vmac) { 194 rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, 195 NULL); 196 } else { 197 rc = qeth_l2_send_setgroupmac(card, mac); 198 } 199 200 if (!rc) 201 list_add_tail(&mc->list, &card->mc_list); 202 else 203 kfree(mc); 204} 205 206static void qeth_l2_del_all_mc(struct qeth_card *card, int del) 207{ 208 struct qeth_mc_mac *mc, *tmp; 209 210 spin_lock_bh(&card->mclock); 211 list_for_each_entry_safe(mc, tmp, &card->mc_list, list) { 212 if (del) { 213 if (mc->is_vmac) 214 qeth_l2_send_setdelmac(card, mc->mc_addr, 215 IPA_CMD_DELVMAC, NULL); 216 else 217 qeth_l2_send_delgroupmac(card, mc->mc_addr); 218 } 219 list_del(&mc->list); 220 kfree(mc); 221 } 222 spin_unlock_bh(&card->mclock); 223} 224 225static inline int qeth_l2_get_cast_type(struct qeth_card *card, 226 struct sk_buff *skb) 227{ 228 if (card->info.type == QETH_CARD_TYPE_OSN) 229 return RTN_UNSPEC; 230 if (is_broadcast_ether_addr(skb->data)) 231 return RTN_BROADCAST; 232 if (is_multicast_ether_addr(skb->data)) 233 return RTN_MULTICAST; 234 return RTN_UNSPEC; 235} 236 237static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, 238 struct sk_buff *skb, int ipv, int cast_type) 239{ 240 struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb); 241 242 memset(hdr, 0, sizeof(struct qeth_hdr)); 243 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2; 244 245 /* set byte byte 3 to casting flags */ 246 if (cast_type == RTN_MULTICAST) 247 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; 248 else if (cast_type == RTN_BROADCAST) 249 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; 250 else 251 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; 252 253 hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE; 254 /* VSWITCH relies on the VLAN 255 * information to be present in 256 * the QDIO header */ 257 if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) { 258 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN; 259 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI); 260 } 261} 262 263static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, 264 struct qeth_reply *reply, unsigned long data) 265{ 266 struct qeth_ipa_cmd *cmd; 267 268 QETH_CARD_TEXT(card, 2, "L2sdvcb"); 269 cmd = (struct qeth_ipa_cmd *) data; 270 if (cmd->hdr.return_code) { 271 QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. " 272 "Continuing\n", cmd->data.setdelvlan.vlan_id, 273 QETH_CARD_IFNAME(card), cmd->hdr.return_code); 274 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); 275 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); 276 } 277 return 0; 278} 279 280static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, 281 enum qeth_ipa_cmds ipacmd) 282{ 283 struct qeth_ipa_cmd *cmd; 284 struct qeth_cmd_buffer *iob; 285 286 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); 287 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); 288 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 289 cmd->data.setdelvlan.vlan_id = i; 290 return qeth_send_ipa_cmd(card, iob, 291 qeth_l2_send_setdelvlan_cb, NULL); 292} 293 294static void qeth_l2_process_vlans(struct qeth_card *card) 295{ 296 struct qeth_vlan_vid *id; 297 QETH_CARD_TEXT(card, 3, "L2prcvln"); 298 spin_lock_bh(&card->vlanlock); 299 list_for_each_entry(id, &card->vid_list, list) { 300 qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN); 301 } 302 spin_unlock_bh(&card->vlanlock); 303} 304 305static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 306{ 307 struct qeth_card *card = dev->ml_priv; 308 struct qeth_vlan_vid *id; 309 310 QETH_CARD_TEXT_(card, 4, "aid:%d", vid); 311 if (!vid) 312 return 0; 313 if (card->info.type == QETH_CARD_TYPE_OSM) { 314 QETH_CARD_TEXT(card, 3, "aidOSM"); 315 return 0; 316 } 317 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 318 QETH_CARD_TEXT(card, 3, "aidREC"); 319 return 0; 320 } 321 id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); 322 if (id) { 323 id->vid = vid; 324 qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); 325 spin_lock_bh(&card->vlanlock); 326 list_add_tail(&id->list, &card->vid_list); 327 spin_unlock_bh(&card->vlanlock); 328 } else { 329 return -ENOMEM; 330 } 331 return 0; 332} 333 334static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) 335{ 336 struct qeth_vlan_vid *id, *tmpid = NULL; 337 struct qeth_card *card = dev->ml_priv; 338 339 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); 340 if (card->info.type == QETH_CARD_TYPE_OSM) { 341 QETH_CARD_TEXT(card, 3, "kidOSM"); 342 return 0; 343 } 344 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 345 QETH_CARD_TEXT(card, 3, "kidREC"); 346 return 0; 347 } 348 spin_lock_bh(&card->vlanlock); 349 list_for_each_entry(id, &card->vid_list, list) { 350 if (id->vid == vid) { 351 list_del(&id->list); 352 tmpid = id; 353 break; 354 } 355 } 356 spin_unlock_bh(&card->vlanlock); 357 if (tmpid) { 358 qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); 359 kfree(tmpid); 360 } 361 qeth_l2_set_multicast_list(card->dev); 362 return 0; 363} 364 365static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) 366{ 367 int rc = 0; 368 369 QETH_DBF_TEXT(SETUP , 2, "stopcard"); 370 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 371 372 qeth_set_allowed_threads(card, 0, 1); 373 if (card->read.state == CH_STATE_UP && 374 card->write.state == CH_STATE_UP && 375 (card->state == CARD_STATE_UP)) { 376 if (recovery_mode && 377 card->info.type != QETH_CARD_TYPE_OSN) { 378 qeth_l2_stop(card->dev); 379 } else { 380 rtnl_lock(); 381 dev_close(card->dev); 382 rtnl_unlock(); 383 } 384 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 385 card->state = CARD_STATE_SOFTSETUP; 386 } 387 if (card->state == CARD_STATE_SOFTSETUP) { 388 qeth_l2_del_all_mc(card, 0); 389 qeth_clear_ipacmd_list(card); 390 card->state = CARD_STATE_HARDSETUP; 391 } 392 if (card->state == CARD_STATE_HARDSETUP) { 393 qeth_qdio_clear_card(card, 0); 394 qeth_clear_qdio_buffers(card); 395 qeth_clear_working_pool_list(card); 396 card->state = CARD_STATE_DOWN; 397 } 398 if (card->state == CARD_STATE_DOWN) { 399 qeth_clear_cmd_buffers(&card->read); 400 qeth_clear_cmd_buffers(&card->write); 401 } 402 return rc; 403} 404 405static int qeth_l2_process_inbound_buffer(struct qeth_card *card, 406 int budget, int *done) 407{ 408 int work_done = 0; 409 struct sk_buff *skb; 410 struct qeth_hdr *hdr; 411 unsigned int len; 412 413 *done = 0; 414 WARN_ON_ONCE(!budget); 415 while (budget) { 416 skb = qeth_core_get_next_skb(card, 417 &card->qdio.in_q->bufs[card->rx.b_index], 418 &card->rx.b_element, &card->rx.e_offset, &hdr); 419 if (!skb) { 420 *done = 1; 421 break; 422 } 423 skb->dev = card->dev; 424 switch (hdr->hdr.l2.id) { 425 case QETH_HEADER_TYPE_LAYER2: 426 skb->pkt_type = PACKET_HOST; 427 skb->protocol = eth_type_trans(skb, skb->dev); 428 skb->ip_summed = CHECKSUM_NONE; 429 if (skb->protocol == htons(ETH_P_802_2)) 430 *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno; 431 len = skb->len; 432 netif_receive_skb(skb); 433 break; 434 case QETH_HEADER_TYPE_OSN: 435 if (card->info.type == QETH_CARD_TYPE_OSN) { 436 skb_push(skb, sizeof(struct qeth_hdr)); 437 skb_copy_to_linear_data(skb, hdr, 438 sizeof(struct qeth_hdr)); 439 len = skb->len; 440 card->osn_info.data_cb(skb); 441 break; 442 } 443 /* else unknown */ 444 default: 445 dev_kfree_skb_any(skb); 446 QETH_CARD_TEXT(card, 3, "inbunkno"); 447 QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN); 448 continue; 449 } 450 work_done++; 451 budget--; 452 card->stats.rx_packets++; 453 card->stats.rx_bytes += len; 454 } 455 return work_done; 456} 457 458static int qeth_l2_poll(struct napi_struct *napi, int budget) 459{ 460 struct qeth_card *card = container_of(napi, struct qeth_card, napi); 461 int work_done = 0; 462 struct qeth_qdio_buffer *buffer; 463 int done; 464 int new_budget = budget; 465 466 if (card->options.performance_stats) { 467 card->perf_stats.inbound_cnt++; 468 card->perf_stats.inbound_start_time = qeth_get_micros(); 469 } 470 471 while (1) { 472 if (!card->rx.b_count) { 473 card->rx.qdio_err = 0; 474 card->rx.b_count = qdio_get_next_buffers( 475 card->data.ccwdev, 0, &card->rx.b_index, 476 &card->rx.qdio_err); 477 if (card->rx.b_count <= 0) { 478 card->rx.b_count = 0; 479 break; 480 } 481 card->rx.b_element = 482 &card->qdio.in_q->bufs[card->rx.b_index] 483 .buffer->element[0]; 484 card->rx.e_offset = 0; 485 } 486 487 while (card->rx.b_count) { 488 buffer = &card->qdio.in_q->bufs[card->rx.b_index]; 489 if (!(card->rx.qdio_err && 490 qeth_check_qdio_errors(card, buffer->buffer, 491 card->rx.qdio_err, "qinerr"))) 492 work_done += qeth_l2_process_inbound_buffer( 493 card, new_budget, &done); 494 else 495 done = 1; 496 497 if (done) { 498 if (card->options.performance_stats) 499 card->perf_stats.bufs_rec++; 500 qeth_put_buffer_pool_entry(card, 501 buffer->pool_entry); 502 qeth_queue_input_buffer(card, card->rx.b_index); 503 card->rx.b_count--; 504 if (card->rx.b_count) { 505 card->rx.b_index = 506 (card->rx.b_index + 1) % 507 QDIO_MAX_BUFFERS_PER_Q; 508 card->rx.b_element = 509 &card->qdio.in_q 510 ->bufs[card->rx.b_index] 511 .buffer->element[0]; 512 card->rx.e_offset = 0; 513 } 514 } 515 516 if (work_done >= budget) 517 goto out; 518 else 519 new_budget = budget - work_done; 520 } 521 } 522 523 napi_complete(napi); 524 if (qdio_start_irq(card->data.ccwdev, 0)) 525 napi_schedule(&card->napi); 526out: 527 if (card->options.performance_stats) 528 card->perf_stats.inbound_time += qeth_get_micros() - 529 card->perf_stats.inbound_start_time; 530 return work_done; 531} 532 533static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, 534 enum qeth_ipa_cmds ipacmd, 535 int (*reply_cb) (struct qeth_card *, 536 struct qeth_reply*, 537 unsigned long)) 538{ 539 struct qeth_ipa_cmd *cmd; 540 struct qeth_cmd_buffer *iob; 541 542 QETH_CARD_TEXT(card, 2, "L2sdmac"); 543 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); 544 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 545 cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; 546 memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); 547 return qeth_send_ipa_cmd(card, iob, reply_cb, NULL); 548} 549 550static int qeth_l2_send_setmac_cb(struct qeth_card *card, 551 struct qeth_reply *reply, 552 unsigned long data) 553{ 554 struct qeth_ipa_cmd *cmd; 555 556 QETH_CARD_TEXT(card, 2, "L2Smaccb"); 557 cmd = (struct qeth_ipa_cmd *) data; 558 if (cmd->hdr.return_code) { 559 QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code); 560 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 561 switch (cmd->hdr.return_code) { 562 case IPA_RC_L2_DUP_MAC: 563 case IPA_RC_L2_DUP_LAYER3_MAC: 564 dev_warn(&card->gdev->dev, 565 "MAC address %pM already exists\n", 566 cmd->data.setdelmac.mac); 567 break; 568 case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: 569 case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: 570 dev_warn(&card->gdev->dev, 571 "MAC address %pM is not authorized\n", 572 cmd->data.setdelmac.mac); 573 break; 574 default: 575 break; 576 } 577 } else { 578 card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; 579 memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, 580 OSA_ADDR_LEN); 581 dev_info(&card->gdev->dev, 582 "MAC address %pM successfully registered on device %s\n", 583 card->dev->dev_addr, card->dev->name); 584 } 585 return 0; 586} 587 588static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) 589{ 590 QETH_CARD_TEXT(card, 2, "L2Setmac"); 591 return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, 592 qeth_l2_send_setmac_cb); 593} 594 595static int qeth_l2_send_delmac_cb(struct qeth_card *card, 596 struct qeth_reply *reply, 597 unsigned long data) 598{ 599 struct qeth_ipa_cmd *cmd; 600 601 QETH_CARD_TEXT(card, 2, "L2Dmaccb"); 602 cmd = (struct qeth_ipa_cmd *) data; 603 if (cmd->hdr.return_code) { 604 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); 605 return 0; 606 } 607 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 608 609 return 0; 610} 611 612static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) 613{ 614 QETH_CARD_TEXT(card, 2, "L2Delmac"); 615 if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) 616 return 0; 617 return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, 618 qeth_l2_send_delmac_cb); 619} 620 621static int qeth_l2_request_initial_mac(struct qeth_card *card) 622{ 623 int rc = 0; 624 char vendor_pre[] = {0x02, 0x00, 0x00}; 625 626 QETH_DBF_TEXT(SETUP, 2, "doL2init"); 627 QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card)); 628 629 if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { 630 rc = qeth_query_setadapterparms(card); 631 if (rc) { 632 QETH_DBF_MESSAGE(2, "could not query adapter " 633 "parameters on device %s: x%x\n", 634 CARD_BUS_ID(card), rc); 635 } 636 } 637 638 if (card->info.type == QETH_CARD_TYPE_IQD || 639 card->info.type == QETH_CARD_TYPE_OSM || 640 card->info.type == QETH_CARD_TYPE_OSX || 641 card->info.guestlan) { 642 rc = qeth_setadpparms_change_macaddr(card); 643 if (rc) { 644 QETH_DBF_MESSAGE(2, "couldn't get MAC address on " 645 "device %s: x%x\n", CARD_BUS_ID(card), rc); 646 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 647 return rc; 648 } 649 QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); 650 } else { 651 eth_random_addr(card->dev->dev_addr); 652 memcpy(card->dev->dev_addr, vendor_pre, 3); 653 } 654 return 0; 655} 656 657static int qeth_l2_set_mac_address(struct net_device *dev, void *p) 658{ 659 struct sockaddr *addr = p; 660 struct qeth_card *card = dev->ml_priv; 661 int rc = 0; 662 663 QETH_CARD_TEXT(card, 3, "setmac"); 664 665 if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) { 666 QETH_CARD_TEXT(card, 3, "setmcINV"); 667 return -EOPNOTSUPP; 668 } 669 670 if (card->info.type == QETH_CARD_TYPE_OSN || 671 card->info.type == QETH_CARD_TYPE_OSM || 672 card->info.type == QETH_CARD_TYPE_OSX) { 673 QETH_CARD_TEXT(card, 3, "setmcTYP"); 674 return -EOPNOTSUPP; 675 } 676 QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN); 677 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 678 QETH_CARD_TEXT(card, 3, "setmcREC"); 679 return -ERESTARTSYS; 680 } 681 rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); 682 if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) 683 rc = qeth_l2_send_setmac(card, addr->sa_data); 684 return rc ? -EINVAL : 0; 685} 686 687static void qeth_l2_set_multicast_list(struct net_device *dev) 688{ 689 struct qeth_card *card = dev->ml_priv; 690 struct netdev_hw_addr *ha; 691 692 if (card->info.type == QETH_CARD_TYPE_OSN) 693 return ; 694 695 QETH_CARD_TEXT(card, 3, "setmulti"); 696 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && 697 (card->state != CARD_STATE_UP)) 698 return; 699 qeth_l2_del_all_mc(card, 1); 700 spin_lock_bh(&card->mclock); 701 netdev_for_each_mc_addr(ha, dev) 702 qeth_l2_add_mc(card, ha->addr, 0); 703 704 netdev_for_each_uc_addr(ha, dev) 705 qeth_l2_add_mc(card, ha->addr, 1); 706 707 spin_unlock_bh(&card->mclock); 708 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) 709 return; 710 qeth_setadp_promisc_mode(card); 711} 712 713static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) 714{ 715 int rc; 716 struct qeth_hdr *hdr = NULL; 717 int elements = 0; 718 struct qeth_card *card = dev->ml_priv; 719 struct sk_buff *new_skb = skb; 720 int ipv = qeth_get_ip_version(skb); 721 int cast_type = qeth_l2_get_cast_type(card, skb); 722 struct qeth_qdio_out_q *queue = card->qdio.out_qs 723 [qeth_get_priority_queue(card, skb, ipv, cast_type)]; 724 int tx_bytes = skb->len; 725 int data_offset = -1; 726 int elements_needed = 0; 727 int hd_len = 0; 728 729 if ((card->state != CARD_STATE_UP) || !card->lan_online) { 730 card->stats.tx_carrier_errors++; 731 goto tx_drop; 732 } 733 734 if ((card->info.type == QETH_CARD_TYPE_OSN) && 735 (skb->protocol == htons(ETH_P_IPV6))) 736 goto tx_drop; 737 738 if (card->options.performance_stats) { 739 card->perf_stats.outbound_cnt++; 740 card->perf_stats.outbound_start_time = qeth_get_micros(); 741 } 742 netif_stop_queue(dev); 743 744 if (card->info.type == QETH_CARD_TYPE_OSN) 745 hdr = (struct qeth_hdr *)skb->data; 746 else { 747 if (card->info.type == QETH_CARD_TYPE_IQD) { 748 new_skb = skb; 749 data_offset = ETH_HLEN; 750 hd_len = ETH_HLEN; 751 hdr = kmem_cache_alloc(qeth_core_header_cache, 752 GFP_ATOMIC); 753 if (!hdr) 754 goto tx_drop; 755 elements_needed++; 756 skb_reset_mac_header(new_skb); 757 qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type); 758 hdr->hdr.l2.pkt_length = new_skb->len; 759 memcpy(((char *)hdr) + sizeof(struct qeth_hdr), 760 skb_mac_header(new_skb), ETH_HLEN); 761 } else { 762 /* create a clone with writeable headroom */ 763 new_skb = skb_realloc_headroom(skb, 764 sizeof(struct qeth_hdr)); 765 if (!new_skb) 766 goto tx_drop; 767 hdr = (struct qeth_hdr *)skb_push(new_skb, 768 sizeof(struct qeth_hdr)); 769 skb_set_mac_header(new_skb, sizeof(struct qeth_hdr)); 770 qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type); 771 } 772 } 773 774 elements = qeth_get_elements_no(card, (void *)hdr, new_skb, 775 elements_needed); 776 if (!elements) { 777 if (data_offset >= 0) 778 kmem_cache_free(qeth_core_header_cache, hdr); 779 goto tx_drop; 780 } 781 782 if (card->info.type != QETH_CARD_TYPE_IQD) { 783 if (qeth_hdr_chk_and_bounce(new_skb, 784 sizeof(struct qeth_hdr_layer2))) 785 goto tx_drop; 786 rc = qeth_do_send_packet(card, queue, new_skb, hdr, 787 elements); 788 } else 789 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, 790 elements, data_offset, hd_len); 791 if (!rc) { 792 card->stats.tx_packets++; 793 card->stats.tx_bytes += tx_bytes; 794 if (new_skb != skb) 795 dev_kfree_skb_any(skb); 796 rc = NETDEV_TX_OK; 797 } else { 798 if (data_offset >= 0) 799 kmem_cache_free(qeth_core_header_cache, hdr); 800 801 if (rc == -EBUSY) { 802 if (new_skb != skb) 803 dev_kfree_skb_any(new_skb); 804 return NETDEV_TX_BUSY; 805 } else 806 goto tx_drop; 807 } 808 809 netif_wake_queue(dev); 810 if (card->options.performance_stats) 811 card->perf_stats.outbound_time += qeth_get_micros() - 812 card->perf_stats.outbound_start_time; 813 return rc; 814 815tx_drop: 816 card->stats.tx_dropped++; 817 card->stats.tx_errors++; 818 if ((new_skb != skb) && new_skb) 819 dev_kfree_skb_any(new_skb); 820 dev_kfree_skb_any(skb); 821 netif_wake_queue(dev); 822 return NETDEV_TX_OK; 823} 824 825static int __qeth_l2_open(struct net_device *dev) 826{ 827 struct qeth_card *card = dev->ml_priv; 828 int rc = 0; 829 830 QETH_CARD_TEXT(card, 4, "qethopen"); 831 if (card->state == CARD_STATE_UP) 832 return rc; 833 if (card->state != CARD_STATE_SOFTSETUP) 834 return -ENODEV; 835 836 if ((card->info.type != QETH_CARD_TYPE_OSN) && 837 (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) { 838 QETH_CARD_TEXT(card, 4, "nomacadr"); 839 return -EPERM; 840 } 841 card->data.state = CH_STATE_UP; 842 card->state = CARD_STATE_UP; 843 netif_start_queue(dev); 844 845 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { 846 napi_enable(&card->napi); 847 napi_schedule(&card->napi); 848 } else 849 rc = -EIO; 850 return rc; 851} 852 853static int qeth_l2_open(struct net_device *dev) 854{ 855 struct qeth_card *card = dev->ml_priv; 856 857 QETH_CARD_TEXT(card, 5, "qethope_"); 858 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 859 QETH_CARD_TEXT(card, 3, "openREC"); 860 return -ERESTARTSYS; 861 } 862 return __qeth_l2_open(dev); 863} 864 865static int qeth_l2_stop(struct net_device *dev) 866{ 867 struct qeth_card *card = dev->ml_priv; 868 869 QETH_CARD_TEXT(card, 4, "qethstop"); 870 netif_tx_disable(dev); 871 if (card->state == CARD_STATE_UP) { 872 card->state = CARD_STATE_SOFTSETUP; 873 napi_disable(&card->napi); 874 } 875 return 0; 876} 877 878static int qeth_l2_probe_device(struct ccwgroup_device *gdev) 879{ 880 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 881 882 INIT_LIST_HEAD(&card->vid_list); 883 INIT_LIST_HEAD(&card->mc_list); 884 card->options.layer2 = 1; 885 card->info.hwtrap = 0; 886 return 0; 887} 888 889static void qeth_l2_remove_device(struct ccwgroup_device *cgdev) 890{ 891 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 892 893 qeth_set_allowed_threads(card, 0, 1); 894 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 895 896 if (cgdev->state == CCWGROUP_ONLINE) 897 qeth_l2_set_offline(cgdev); 898 899 if (card->dev) { 900 unregister_netdev(card->dev); 901 card->dev = NULL; 902 } 903 return; 904} 905 906static const struct ethtool_ops qeth_l2_ethtool_ops = { 907 .get_link = ethtool_op_get_link, 908 .get_strings = qeth_core_get_strings, 909 .get_ethtool_stats = qeth_core_get_ethtool_stats, 910 .get_sset_count = qeth_core_get_sset_count, 911 .get_drvinfo = qeth_core_get_drvinfo, 912 .get_settings = qeth_core_ethtool_get_settings, 913}; 914 915static const struct ethtool_ops qeth_l2_osn_ops = { 916 .get_strings = qeth_core_get_strings, 917 .get_ethtool_stats = qeth_core_get_ethtool_stats, 918 .get_sset_count = qeth_core_get_sset_count, 919 .get_drvinfo = qeth_core_get_drvinfo, 920}; 921 922static const struct net_device_ops qeth_l2_netdev_ops = { 923 .ndo_open = qeth_l2_open, 924 .ndo_stop = qeth_l2_stop, 925 .ndo_get_stats = qeth_get_stats, 926 .ndo_start_xmit = qeth_l2_hard_start_xmit, 927 .ndo_validate_addr = eth_validate_addr, 928 .ndo_set_rx_mode = qeth_l2_set_multicast_list, 929 .ndo_do_ioctl = qeth_l2_do_ioctl, 930 .ndo_set_mac_address = qeth_l2_set_mac_address, 931 .ndo_change_mtu = qeth_change_mtu, 932 .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid, 933 .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid, 934 .ndo_tx_timeout = qeth_tx_timeout, 935}; 936 937static int qeth_l2_setup_netdev(struct qeth_card *card) 938{ 939 switch (card->info.type) { 940 case QETH_CARD_TYPE_IQD: 941 card->dev = alloc_netdev(0, "hsi%d", ether_setup); 942 break; 943 case QETH_CARD_TYPE_OSN: 944 card->dev = alloc_netdev(0, "osn%d", ether_setup); 945 card->dev->flags |= IFF_NOARP; 946 break; 947 default: 948 card->dev = alloc_etherdev(0); 949 } 950 951 if (!card->dev) 952 return -ENODEV; 953 954 card->dev->ml_priv = card; 955 card->dev->watchdog_timeo = QETH_TX_TIMEOUT; 956 card->dev->mtu = card->info.initial_mtu; 957 card->dev->netdev_ops = &qeth_l2_netdev_ops; 958 if (card->info.type != QETH_CARD_TYPE_OSN) 959 SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops); 960 else 961 SET_ETHTOOL_OPS(card->dev, &qeth_l2_osn_ops); 962 card->dev->features |= NETIF_F_HW_VLAN_FILTER; 963 card->info.broadcast_capable = 1; 964 qeth_l2_request_initial_mac(card); 965 SET_NETDEV_DEV(card->dev, &card->gdev->dev); 966 netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT); 967 return register_netdev(card->dev); 968} 969 970static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) 971{ 972 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 973 int rc = 0; 974 enum qeth_card_states recover_flag; 975 976 mutex_lock(&card->discipline_mutex); 977 mutex_lock(&card->conf_mutex); 978 QETH_DBF_TEXT(SETUP, 2, "setonlin"); 979 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 980 981 recover_flag = card->state; 982 rc = qeth_core_hardsetup_card(card); 983 if (rc) { 984 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); 985 rc = -ENODEV; 986 goto out_remove; 987 } 988 qeth_trace_features(card); 989 990 if (!card->dev && qeth_l2_setup_netdev(card)) { 991 rc = -ENODEV; 992 goto out_remove; 993 } 994 995 if (card->info.type != QETH_CARD_TYPE_OSN) 996 qeth_l2_send_setmac(card, &card->dev->dev_addr[0]); 997 998 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) { 999 if (card->info.hwtrap && 1000 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM)) 1001 card->info.hwtrap = 0; 1002 } else 1003 card->info.hwtrap = 0; 1004 1005 card->state = CARD_STATE_HARDSETUP; 1006 memset(&card->rx, 0, sizeof(struct qeth_rx)); 1007 qeth_print_status_message(card); 1008 1009 /* softsetup */ 1010 QETH_DBF_TEXT(SETUP, 2, "softsetp"); 1011 1012 rc = qeth_send_startlan(card); 1013 if (rc) { 1014 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 1015 if (rc == 0xe080) { 1016 dev_warn(&card->gdev->dev, 1017 "The LAN is offline\n"); 1018 card->lan_online = 0; 1019 goto contin; 1020 } 1021 rc = -ENODEV; 1022 goto out_remove; 1023 } else 1024 card->lan_online = 1; 1025 1026contin: 1027 if ((card->info.type == QETH_CARD_TYPE_OSD) || 1028 (card->info.type == QETH_CARD_TYPE_OSX)) { 1029 /* configure isolation level */ 1030 rc = qeth_set_access_ctrl_online(card, 0); 1031 if (rc) { 1032 rc = -ENODEV; 1033 goto out_remove; 1034 } 1035 } 1036 1037 if (card->info.type != QETH_CARD_TYPE_OSN && 1038 card->info.type != QETH_CARD_TYPE_OSM) 1039 qeth_l2_process_vlans(card); 1040 1041 netif_tx_disable(card->dev); 1042 1043 rc = qeth_init_qdio_queues(card); 1044 if (rc) { 1045 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); 1046 rc = -ENODEV; 1047 goto out_remove; 1048 } 1049 card->state = CARD_STATE_SOFTSETUP; 1050 if (card->lan_online) 1051 netif_carrier_on(card->dev); 1052 else 1053 netif_carrier_off(card->dev); 1054 1055 qeth_set_allowed_threads(card, 0xffffffff, 0); 1056 if (recover_flag == CARD_STATE_RECOVER) { 1057 if (recovery_mode && 1058 card->info.type != QETH_CARD_TYPE_OSN) { 1059 __qeth_l2_open(card->dev); 1060 } else { 1061 rtnl_lock(); 1062 dev_open(card->dev); 1063 rtnl_unlock(); 1064 } 1065 /* this also sets saved unicast addresses */ 1066 qeth_l2_set_multicast_list(card->dev); 1067 } 1068 /* let user_space know that device is online */ 1069 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); 1070 mutex_unlock(&card->conf_mutex); 1071 mutex_unlock(&card->discipline_mutex); 1072 return 0; 1073 1074out_remove: 1075 qeth_l2_stop_card(card, 0); 1076 ccw_device_set_offline(CARD_DDEV(card)); 1077 ccw_device_set_offline(CARD_WDEV(card)); 1078 ccw_device_set_offline(CARD_RDEV(card)); 1079 if (recover_flag == CARD_STATE_RECOVER) 1080 card->state = CARD_STATE_RECOVER; 1081 else 1082 card->state = CARD_STATE_DOWN; 1083 mutex_unlock(&card->conf_mutex); 1084 mutex_unlock(&card->discipline_mutex); 1085 return rc; 1086} 1087 1088static int qeth_l2_set_online(struct ccwgroup_device *gdev) 1089{ 1090 return __qeth_l2_set_online(gdev, 0); 1091} 1092 1093static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev, 1094 int recovery_mode) 1095{ 1096 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 1097 int rc = 0, rc2 = 0, rc3 = 0; 1098 enum qeth_card_states recover_flag; 1099 1100 mutex_lock(&card->discipline_mutex); 1101 mutex_lock(&card->conf_mutex); 1102 QETH_DBF_TEXT(SETUP, 3, "setoffl"); 1103 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); 1104 1105 if (card->dev && netif_carrier_ok(card->dev)) 1106 netif_carrier_off(card->dev); 1107 recover_flag = card->state; 1108 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { 1109 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 1110 card->info.hwtrap = 1; 1111 } 1112 qeth_l2_stop_card(card, recovery_mode); 1113 rc = ccw_device_set_offline(CARD_DDEV(card)); 1114 rc2 = ccw_device_set_offline(CARD_WDEV(card)); 1115 rc3 = ccw_device_set_offline(CARD_RDEV(card)); 1116 if (!rc) 1117 rc = (rc2) ? rc2 : rc3; 1118 if (rc) 1119 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 1120 if (recover_flag == CARD_STATE_UP) 1121 card->state = CARD_STATE_RECOVER; 1122 /* let user_space know that device is offline */ 1123 kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE); 1124 mutex_unlock(&card->conf_mutex); 1125 mutex_unlock(&card->discipline_mutex); 1126 return 0; 1127} 1128 1129static int qeth_l2_set_offline(struct ccwgroup_device *cgdev) 1130{ 1131 return __qeth_l2_set_offline(cgdev, 0); 1132} 1133 1134static int qeth_l2_recover(void *ptr) 1135{ 1136 struct qeth_card *card; 1137 int rc = 0; 1138 1139 card = (struct qeth_card *) ptr; 1140 QETH_CARD_TEXT(card, 2, "recover1"); 1141 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) 1142 return 0; 1143 QETH_CARD_TEXT(card, 2, "recover2"); 1144 dev_warn(&card->gdev->dev, 1145 "A recovery process has been started for the device\n"); 1146 qeth_set_recovery_task(card); 1147 __qeth_l2_set_offline(card->gdev, 1); 1148 rc = __qeth_l2_set_online(card->gdev, 1); 1149 if (!rc) 1150 dev_info(&card->gdev->dev, 1151 "Device successfully recovered!\n"); 1152 else { 1153 qeth_close_dev(card); 1154 dev_warn(&card->gdev->dev, "The qeth device driver " 1155 "failed to recover an error on the device\n"); 1156 } 1157 qeth_clear_recovery_task(card); 1158 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 1159 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); 1160 return 0; 1161} 1162 1163static int __init qeth_l2_init(void) 1164{ 1165 pr_info("register layer 2 discipline\n"); 1166 return 0; 1167} 1168 1169static void __exit qeth_l2_exit(void) 1170{ 1171 pr_info("unregister layer 2 discipline\n"); 1172} 1173 1174static void qeth_l2_shutdown(struct ccwgroup_device *gdev) 1175{ 1176 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 1177 qeth_set_allowed_threads(card, 0, 1); 1178 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) 1179 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 1180 qeth_qdio_clear_card(card, 0); 1181 qeth_clear_qdio_buffers(card); 1182} 1183 1184static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev) 1185{ 1186 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 1187 1188 if (card->dev) 1189 netif_device_detach(card->dev); 1190 qeth_set_allowed_threads(card, 0, 1); 1191 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 1192 if (gdev->state == CCWGROUP_OFFLINE) 1193 return 0; 1194 if (card->state == CARD_STATE_UP) { 1195 if (card->info.hwtrap) 1196 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 1197 __qeth_l2_set_offline(card->gdev, 1); 1198 } else 1199 __qeth_l2_set_offline(card->gdev, 0); 1200 return 0; 1201} 1202 1203static int qeth_l2_pm_resume(struct ccwgroup_device *gdev) 1204{ 1205 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 1206 int rc = 0; 1207 1208 if (gdev->state == CCWGROUP_OFFLINE) 1209 goto out; 1210 1211 if (card->state == CARD_STATE_RECOVER) { 1212 rc = __qeth_l2_set_online(card->gdev, 1); 1213 if (rc) { 1214 rtnl_lock(); 1215 dev_close(card->dev); 1216 rtnl_unlock(); 1217 } 1218 } else 1219 rc = __qeth_l2_set_online(card->gdev, 0); 1220out: 1221 qeth_set_allowed_threads(card, 0xffffffff, 0); 1222 if (card->dev) 1223 netif_device_attach(card->dev); 1224 if (rc) 1225 dev_warn(&card->gdev->dev, "The qeth device driver " 1226 "failed to recover an error on the device\n"); 1227 return rc; 1228} 1229 1230struct qeth_discipline qeth_l2_discipline = { 1231 .start_poll = qeth_qdio_start_poll, 1232 .input_handler = (qdio_handler_t *) qeth_qdio_input_handler, 1233 .output_handler = (qdio_handler_t *) qeth_qdio_output_handler, 1234 .recover = qeth_l2_recover, 1235 .setup = qeth_l2_probe_device, 1236 .remove = qeth_l2_remove_device, 1237 .set_online = qeth_l2_set_online, 1238 .set_offline = qeth_l2_set_offline, 1239 .shutdown = qeth_l2_shutdown, 1240 .freeze = qeth_l2_pm_suspend, 1241 .thaw = qeth_l2_pm_resume, 1242 .restore = qeth_l2_pm_resume, 1243}; 1244EXPORT_SYMBOL_GPL(qeth_l2_discipline); 1245 1246static int qeth_osn_send_control_data(struct qeth_card *card, int len, 1247 struct qeth_cmd_buffer *iob) 1248{ 1249 unsigned long flags; 1250 int rc = 0; 1251 1252 QETH_CARD_TEXT(card, 5, "osndctrd"); 1253 1254 wait_event(card->wait_q, 1255 atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0); 1256 qeth_prepare_control_data(card, len, iob); 1257 QETH_CARD_TEXT(card, 6, "osnoirqp"); 1258 spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags); 1259 rc = ccw_device_start(card->write.ccwdev, &card->write.ccw, 1260 (addr_t) iob, 0, 0); 1261 spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags); 1262 if (rc) { 1263 QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: " 1264 "ccw_device_start rc = %i\n", rc); 1265 QETH_CARD_TEXT_(card, 2, " err%d", rc); 1266 qeth_release_buffer(iob->channel, iob); 1267 atomic_set(&card->write.irq_pending, 0); 1268 wake_up(&card->wait_q); 1269 } 1270 return rc; 1271} 1272 1273static int qeth_osn_send_ipa_cmd(struct qeth_card *card, 1274 struct qeth_cmd_buffer *iob, int data_len) 1275{ 1276 u16 s1, s2; 1277 1278 QETH_CARD_TEXT(card, 4, "osndipa"); 1279 1280 qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2); 1281 s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len); 1282 s2 = (u16)data_len; 1283 memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2); 1284 memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2); 1285 memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2); 1286 memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2); 1287 return qeth_osn_send_control_data(card, s1, iob); 1288} 1289 1290int qeth_osn_assist(struct net_device *dev, void *data, int data_len) 1291{ 1292 struct qeth_cmd_buffer *iob; 1293 struct qeth_card *card; 1294 int rc; 1295 1296 if (!dev) 1297 return -ENODEV; 1298 card = dev->ml_priv; 1299 if (!card) 1300 return -ENODEV; 1301 QETH_CARD_TEXT(card, 2, "osnsdmc"); 1302 if ((card->state != CARD_STATE_UP) && 1303 (card->state != CARD_STATE_SOFTSETUP)) 1304 return -ENODEV; 1305 iob = qeth_wait_for_buffer(&card->write); 1306 memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len); 1307 rc = qeth_osn_send_ipa_cmd(card, iob, data_len); 1308 return rc; 1309} 1310EXPORT_SYMBOL(qeth_osn_assist); 1311 1312int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev, 1313 int (*assist_cb)(struct net_device *, void *), 1314 int (*data_cb)(struct sk_buff *)) 1315{ 1316 struct qeth_card *card; 1317 1318 *dev = qeth_l2_netdev_by_devno(read_dev_no); 1319 if (*dev == NULL) 1320 return -ENODEV; 1321 card = (*dev)->ml_priv; 1322 if (!card) 1323 return -ENODEV; 1324 QETH_CARD_TEXT(card, 2, "osnreg"); 1325 if ((assist_cb == NULL) || (data_cb == NULL)) 1326 return -EINVAL; 1327 card->osn_info.assist_cb = assist_cb; 1328 card->osn_info.data_cb = data_cb; 1329 return 0; 1330} 1331EXPORT_SYMBOL(qeth_osn_register); 1332 1333void qeth_osn_deregister(struct net_device *dev) 1334{ 1335 struct qeth_card *card; 1336 1337 if (!dev) 1338 return; 1339 card = dev->ml_priv; 1340 if (!card) 1341 return; 1342 QETH_CARD_TEXT(card, 2, "osndereg"); 1343 card->osn_info.assist_cb = NULL; 1344 card->osn_info.data_cb = NULL; 1345 return; 1346} 1347EXPORT_SYMBOL(qeth_osn_deregister); 1348 1349module_init(qeth_l2_init); 1350module_exit(qeth_l2_exit); 1351MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>"); 1352MODULE_DESCRIPTION("qeth layer 2 discipline"); 1353MODULE_LICENSE("GPL");