0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #undef DEBUG
0020 #undef DEBUGDATA
0021 #undef DEBUGCCW
0022
0023 #define KMSG_COMPONENT "ctcm"
0024 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
0025
0026 #include <linux/module.h>
0027 #include <linux/init.h>
0028 #include <linux/kernel.h>
0029 #include <linux/slab.h>
0030 #include <linux/errno.h>
0031 #include <linux/types.h>
0032 #include <linux/interrupt.h>
0033 #include <linux/timer.h>
0034 #include <linux/bitops.h>
0035
0036 #include <linux/signal.h>
0037 #include <linux/string.h>
0038
0039 #include <linux/ip.h>
0040 #include <linux/if_arp.h>
0041 #include <linux/tcp.h>
0042 #include <linux/skbuff.h>
0043 #include <linux/ctype.h>
0044 #include <net/dst.h>
0045
0046 #include <linux/io.h>
0047 #include <asm/ccwdev.h>
0048 #include <asm/ccwgroup.h>
0049 #include <linux/uaccess.h>
0050
0051 #include <asm/idals.h>
0052
0053 #include "ctcm_fsms.h"
0054 #include "ctcm_main.h"
0055
0056
0057
0058
0059
0060
0061 static struct device *ctcm_root_dev;
0062
0063
0064
0065
0066 struct channel *channels;
0067
0068
0069
0070
0071
0072
0073
0074
0075 void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
0076 {
0077 struct net_device *dev = ch->netdev;
0078 struct ctcm_priv *priv = dev->ml_priv;
0079 __u16 len = *((__u16 *) pskb->data);
0080
0081 skb_put(pskb, 2 + LL_HEADER_LENGTH);
0082 skb_pull(pskb, 2);
0083 pskb->dev = dev;
0084 pskb->ip_summed = CHECKSUM_UNNECESSARY;
0085 while (len > 0) {
0086 struct sk_buff *skb;
0087 int skblen;
0088 struct ll_header *header = (struct ll_header *)pskb->data;
0089
0090 skb_pull(pskb, LL_HEADER_LENGTH);
0091 if ((ch->protocol == CTCM_PROTO_S390) &&
0092 (header->type != ETH_P_IP)) {
0093 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) {
0094 ch->logflags |= LOG_FLAG_ILLEGALPKT;
0095
0096
0097
0098
0099
0100
0101 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0102 "%s(%s): Illegal packet type 0x%04x"
0103 " - dropping",
0104 CTCM_FUNTAIL, dev->name, header->type);
0105 }
0106 priv->stats.rx_dropped++;
0107 priv->stats.rx_frame_errors++;
0108 return;
0109 }
0110 pskb->protocol = cpu_to_be16(header->type);
0111 if ((header->length <= LL_HEADER_LENGTH) ||
0112 (len <= LL_HEADER_LENGTH)) {
0113 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) {
0114 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0115 "%s(%s): Illegal packet size %d(%d,%d)"
0116 "- dropping",
0117 CTCM_FUNTAIL, dev->name,
0118 header->length, dev->mtu, len);
0119 ch->logflags |= LOG_FLAG_ILLEGALSIZE;
0120 }
0121
0122 priv->stats.rx_dropped++;
0123 priv->stats.rx_length_errors++;
0124 return;
0125 }
0126 header->length -= LL_HEADER_LENGTH;
0127 len -= LL_HEADER_LENGTH;
0128 if ((header->length > skb_tailroom(pskb)) ||
0129 (header->length > len)) {
0130 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
0131 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0132 "%s(%s): Packet size %d (overrun)"
0133 " - dropping", CTCM_FUNTAIL,
0134 dev->name, header->length);
0135 ch->logflags |= LOG_FLAG_OVERRUN;
0136 }
0137
0138 priv->stats.rx_dropped++;
0139 priv->stats.rx_length_errors++;
0140 return;
0141 }
0142 skb_put(pskb, header->length);
0143 skb_reset_mac_header(pskb);
0144 len -= header->length;
0145 skb = dev_alloc_skb(pskb->len);
0146 if (!skb) {
0147 if (!(ch->logflags & LOG_FLAG_NOMEM)) {
0148 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0149 "%s(%s): MEMORY allocation error",
0150 CTCM_FUNTAIL, dev->name);
0151 ch->logflags |= LOG_FLAG_NOMEM;
0152 }
0153 priv->stats.rx_dropped++;
0154 return;
0155 }
0156 skb_copy_from_linear_data(pskb, skb_put(skb, pskb->len),
0157 pskb->len);
0158 skb_reset_mac_header(skb);
0159 skb->dev = pskb->dev;
0160 skb->protocol = pskb->protocol;
0161 pskb->ip_summed = CHECKSUM_UNNECESSARY;
0162 skblen = skb->len;
0163
0164
0165
0166 ch->logflags = 0;
0167 priv->stats.rx_packets++;
0168 priv->stats.rx_bytes += skblen;
0169 netif_rx(skb);
0170 if (len > 0) {
0171 skb_pull(pskb, header->length);
0172 if (skb_tailroom(pskb) < LL_HEADER_LENGTH) {
0173 CTCM_DBF_DEV_NAME(TRACE, dev,
0174 "Overrun in ctcm_unpack_skb");
0175 ch->logflags |= LOG_FLAG_OVERRUN;
0176 return;
0177 }
0178 skb_put(pskb, LL_HEADER_LENGTH);
0179 }
0180 }
0181 }
0182
0183
0184
0185
0186
0187
0188 static void channel_free(struct channel *ch)
0189 {
0190 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s)", CTCM_FUNTAIL, ch->id);
0191 ch->flags &= ~CHANNEL_FLAGS_INUSE;
0192 fsm_newstate(ch->fsm, CTC_STATE_IDLE);
0193 }
0194
0195
0196
0197
0198
0199
0200 static void channel_remove(struct channel *ch)
0201 {
0202 struct channel **c = &channels;
0203 char chid[CTCM_ID_SIZE+1];
0204 int ok = 0;
0205
0206 if (ch == NULL)
0207 return;
0208 else
0209 strncpy(chid, ch->id, CTCM_ID_SIZE);
0210
0211 channel_free(ch);
0212 while (*c) {
0213 if (*c == ch) {
0214 *c = ch->next;
0215 fsm_deltimer(&ch->timer);
0216 if (IS_MPC(ch))
0217 fsm_deltimer(&ch->sweep_timer);
0218
0219 kfree_fsm(ch->fsm);
0220 clear_normalized_cda(&ch->ccw[4]);
0221 if (ch->trans_skb != NULL) {
0222 clear_normalized_cda(&ch->ccw[1]);
0223 dev_kfree_skb_any(ch->trans_skb);
0224 }
0225 if (IS_MPC(ch)) {
0226 tasklet_kill(&ch->ch_tasklet);
0227 tasklet_kill(&ch->ch_disc_tasklet);
0228 kfree(ch->discontact_th);
0229 }
0230 kfree(ch->ccw);
0231 kfree(ch->irb);
0232 kfree(ch);
0233 ok = 1;
0234 break;
0235 }
0236 c = &((*c)->next);
0237 }
0238
0239 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s) %s", CTCM_FUNTAIL,
0240 chid, ok ? "OK" : "failed");
0241 }
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252 static struct channel *channel_get(enum ctcm_channel_types type,
0253 char *id, int direction)
0254 {
0255 struct channel *ch = channels;
0256
0257 while (ch && (strncmp(ch->id, id, CTCM_ID_SIZE) || (ch->type != type)))
0258 ch = ch->next;
0259 if (!ch) {
0260 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0261 "%s(%d, %s, %d) not found in channel list\n",
0262 CTCM_FUNTAIL, type, id, direction);
0263 } else {
0264 if (ch->flags & CHANNEL_FLAGS_INUSE)
0265 ch = NULL;
0266 else {
0267 ch->flags |= CHANNEL_FLAGS_INUSE;
0268 ch->flags &= ~CHANNEL_FLAGS_RWMASK;
0269 ch->flags |= (direction == CTCM_WRITE)
0270 ? CHANNEL_FLAGS_WRITE : CHANNEL_FLAGS_READ;
0271 fsm_newstate(ch->fsm, CTC_STATE_STOPPED);
0272 }
0273 }
0274 return ch;
0275 }
0276
0277 static long ctcm_check_irb_error(struct ccw_device *cdev, struct irb *irb)
0278 {
0279 if (!IS_ERR(irb))
0280 return 0;
0281
0282 CTCM_DBF_TEXT_(ERROR, CTC_DBF_WARN,
0283 "irb error %ld on device %s\n",
0284 PTR_ERR(irb), dev_name(&cdev->dev));
0285
0286 switch (PTR_ERR(irb)) {
0287 case -EIO:
0288 dev_err(&cdev->dev,
0289 "An I/O-error occurred on the CTCM device\n");
0290 break;
0291 case -ETIMEDOUT:
0292 dev_err(&cdev->dev,
0293 "An adapter hardware operation timed out\n");
0294 break;
0295 default:
0296 dev_err(&cdev->dev,
0297 "An error occurred on the adapter hardware\n");
0298 }
0299 return PTR_ERR(irb);
0300 }
0301
0302
0303
0304
0305
0306
0307
0308
0309 static void ccw_unit_check(struct channel *ch, __u8 sense)
0310 {
0311 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
0312 "%s(%s): %02x",
0313 CTCM_FUNTAIL, ch->id, sense);
0314
0315 if (sense & SNS0_INTERVENTION_REQ) {
0316 if (sense & 0x01) {
0317 if (ch->sense_rc != 0x01) {
0318 pr_notice(
0319 "%s: The communication peer has "
0320 "disconnected\n", ch->id);
0321 ch->sense_rc = 0x01;
0322 }
0323 fsm_event(ch->fsm, CTC_EVENT_UC_RCRESET, ch);
0324 } else {
0325 if (ch->sense_rc != SNS0_INTERVENTION_REQ) {
0326 pr_notice(
0327 "%s: The remote operating system is "
0328 "not available\n", ch->id);
0329 ch->sense_rc = SNS0_INTERVENTION_REQ;
0330 }
0331 fsm_event(ch->fsm, CTC_EVENT_UC_RSRESET, ch);
0332 }
0333 } else if (sense & SNS0_EQUIPMENT_CHECK) {
0334 if (sense & SNS0_BUS_OUT_CHECK) {
0335 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) {
0336 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0337 "%s(%s): remote HW error %02x",
0338 CTCM_FUNTAIL, ch->id, sense);
0339 ch->sense_rc = SNS0_BUS_OUT_CHECK;
0340 }
0341 fsm_event(ch->fsm, CTC_EVENT_UC_HWFAIL, ch);
0342 } else {
0343 if (ch->sense_rc != SNS0_EQUIPMENT_CHECK) {
0344 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0345 "%s(%s): remote read parity error %02x",
0346 CTCM_FUNTAIL, ch->id, sense);
0347 ch->sense_rc = SNS0_EQUIPMENT_CHECK;
0348 }
0349 fsm_event(ch->fsm, CTC_EVENT_UC_RXPARITY, ch);
0350 }
0351 } else if (sense & SNS0_BUS_OUT_CHECK) {
0352 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) {
0353 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0354 "%s(%s): BUS OUT error %02x",
0355 CTCM_FUNTAIL, ch->id, sense);
0356 ch->sense_rc = SNS0_BUS_OUT_CHECK;
0357 }
0358 if (sense & 0x04)
0359 fsm_event(ch->fsm, CTC_EVENT_UC_TXTIMEOUT, ch);
0360 else
0361 fsm_event(ch->fsm, CTC_EVENT_UC_TXPARITY, ch);
0362 } else if (sense & SNS0_CMD_REJECT) {
0363 if (ch->sense_rc != SNS0_CMD_REJECT) {
0364 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0365 "%s(%s): Command rejected",
0366 CTCM_FUNTAIL, ch->id);
0367 ch->sense_rc = SNS0_CMD_REJECT;
0368 }
0369 } else if (sense == 0) {
0370 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0371 "%s(%s): Unit check ZERO",
0372 CTCM_FUNTAIL, ch->id);
0373 fsm_event(ch->fsm, CTC_EVENT_UC_ZERO, ch);
0374 } else {
0375 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
0376 "%s(%s): Unit check code %02x unknown",
0377 CTCM_FUNTAIL, ch->id, sense);
0378 fsm_event(ch->fsm, CTC_EVENT_UC_UNKNOWN, ch);
0379 }
0380 }
0381
0382 int ctcm_ch_alloc_buffer(struct channel *ch)
0383 {
0384 clear_normalized_cda(&ch->ccw[1]);
0385 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC | GFP_DMA);
0386 if (ch->trans_skb == NULL) {
0387 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0388 "%s(%s): %s trans_skb allocation error",
0389 CTCM_FUNTAIL, ch->id,
0390 (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ?
0391 "RX" : "TX");
0392 return -ENOMEM;
0393 }
0394
0395 ch->ccw[1].count = ch->max_bufsize;
0396 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
0397 dev_kfree_skb(ch->trans_skb);
0398 ch->trans_skb = NULL;
0399 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0400 "%s(%s): %s set norm_cda failed",
0401 CTCM_FUNTAIL, ch->id,
0402 (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ?
0403 "RX" : "TX");
0404 return -ENOMEM;
0405 }
0406
0407 ch->ccw[1].count = 0;
0408 ch->trans_skb_data = ch->trans_skb->data;
0409 ch->flags &= ~CHANNEL_FLAGS_BUFSIZE_CHANGED;
0410 return 0;
0411 }
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425 int ctcm_open(struct net_device *dev)
0426 {
0427 struct ctcm_priv *priv = dev->ml_priv;
0428
0429 CTCMY_DBF_DEV_NAME(SETUP, dev, "");
0430 if (!IS_MPC(priv))
0431 fsm_event(priv->fsm, DEV_EVENT_START, dev);
0432 return 0;
0433 }
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443 int ctcm_close(struct net_device *dev)
0444 {
0445 struct ctcm_priv *priv = dev->ml_priv;
0446
0447 CTCMY_DBF_DEV_NAME(SETUP, dev, "");
0448 if (!IS_MPC(priv))
0449 fsm_event(priv->fsm, DEV_EVENT_STOP, dev);
0450 return 0;
0451 }
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465 static int ctcm_transmit_skb(struct channel *ch, struct sk_buff *skb)
0466 {
0467 unsigned long saveflags;
0468 struct ll_header header;
0469 int rc = 0;
0470 __u16 block_len;
0471 int ccw_idx;
0472 struct sk_buff *nskb;
0473 unsigned long hi;
0474
0475
0476
0477
0478
0479 spin_lock_irqsave(&ch->collect_lock, saveflags);
0480 if (fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) {
0481 int l = skb->len + LL_HEADER_LENGTH;
0482
0483 if (ch->collect_len + l > ch->max_bufsize - 2) {
0484 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
0485 return -EBUSY;
0486 } else {
0487 refcount_inc(&skb->users);
0488 header.length = l;
0489 header.type = be16_to_cpu(skb->protocol);
0490 header.unused = 0;
0491 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
0492 LL_HEADER_LENGTH);
0493 skb_queue_tail(&ch->collect_queue, skb);
0494 ch->collect_len += l;
0495 }
0496 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
0497 goto done;
0498 }
0499 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
0500
0501
0502
0503
0504 refcount_inc(&skb->users);
0505 ch->prof.txlen += skb->len;
0506 header.length = skb->len + LL_HEADER_LENGTH;
0507 header.type = be16_to_cpu(skb->protocol);
0508 header.unused = 0;
0509 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header, LL_HEADER_LENGTH);
0510 block_len = skb->len + 2;
0511 *((__u16 *)skb_push(skb, 2)) = block_len;
0512
0513
0514
0515
0516
0517 hi = ((unsigned long)skb_tail_pointer(skb) + LL_HEADER_LENGTH) >> 31;
0518 if (hi) {
0519 nskb = alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
0520 if (!nskb) {
0521 refcount_dec(&skb->users);
0522 skb_pull(skb, LL_HEADER_LENGTH + 2);
0523 ctcm_clear_busy(ch->netdev);
0524 return -ENOMEM;
0525 } else {
0526 skb_put_data(nskb, skb->data, skb->len);
0527 refcount_inc(&nskb->users);
0528 refcount_dec(&skb->users);
0529 dev_kfree_skb_irq(skb);
0530 skb = nskb;
0531 }
0532 }
0533
0534 ch->ccw[4].count = block_len;
0535 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
0536
0537
0538
0539
0540
0541 if (ctcm_checkalloc_buffer(ch)) {
0542
0543
0544
0545
0546 refcount_dec(&skb->users);
0547 skb_pull(skb, LL_HEADER_LENGTH + 2);
0548 ctcm_clear_busy(ch->netdev);
0549 return -ENOMEM;
0550 }
0551
0552 skb_reset_tail_pointer(ch->trans_skb);
0553 ch->trans_skb->len = 0;
0554 ch->ccw[1].count = skb->len;
0555 skb_copy_from_linear_data(skb,
0556 skb_put(ch->trans_skb, skb->len), skb->len);
0557 refcount_dec(&skb->users);
0558 dev_kfree_skb_irq(skb);
0559 ccw_idx = 0;
0560 } else {
0561 skb_queue_tail(&ch->io_queue, skb);
0562 ccw_idx = 3;
0563 }
0564 if (do_debug_ccw)
0565 ctcmpc_dumpit((char *)&ch->ccw[ccw_idx],
0566 sizeof(struct ccw1) * 3);
0567 ch->retry = 0;
0568 fsm_newstate(ch->fsm, CTC_STATE_TX);
0569 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
0570 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
0571 ch->prof.send_stamp = jiffies;
0572 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx], 0, 0xff, 0);
0573 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
0574 if (ccw_idx == 3)
0575 ch->prof.doios_single++;
0576 if (rc != 0) {
0577 fsm_deltimer(&ch->timer);
0578 ctcm_ccw_check_rc(ch, rc, "single skb TX");
0579 if (ccw_idx == 3)
0580 skb_dequeue_tail(&ch->io_queue);
0581
0582
0583
0584
0585 skb_pull(skb, LL_HEADER_LENGTH + 2);
0586 } else if (ccw_idx == 0) {
0587 struct net_device *dev = ch->netdev;
0588 struct ctcm_priv *priv = dev->ml_priv;
0589 priv->stats.tx_packets++;
0590 priv->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
0591 }
0592 done:
0593 ctcm_clear_busy(ch->netdev);
0594 return rc;
0595 }
0596
0597 static void ctcmpc_send_sweep_req(struct channel *rch)
0598 {
0599 struct net_device *dev = rch->netdev;
0600 struct ctcm_priv *priv;
0601 struct mpc_group *grp;
0602 struct th_sweep *header;
0603 struct sk_buff *sweep_skb;
0604 struct channel *ch;
0605
0606
0607 priv = dev->ml_priv;
0608 grp = priv->mpcg;
0609 ch = priv->channel[CTCM_WRITE];
0610
0611
0612
0613 if (grp->in_sweep == 0) {
0614 grp->in_sweep = 1;
0615 grp->sweep_rsp_pend_num = grp->active_channels[CTCM_READ];
0616 grp->sweep_req_pend_num = grp->active_channels[CTCM_READ];
0617 }
0618
0619 sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA);
0620
0621 if (sweep_skb == NULL) {
0622
0623 goto nomem;
0624 }
0625
0626 header = skb_put_zero(sweep_skb, TH_SWEEP_LENGTH);
0627 header->th.th_ch_flag = TH_SWEEP_REQ;
0628 header->sw.th_last_seq = ch->th_seq_num;
0629
0630 netif_trans_update(dev);
0631 skb_queue_tail(&ch->sweep_queue, sweep_skb);
0632
0633 fsm_addtimer(&ch->sweep_timer, 100, CTC_EVENT_RSWEEP_TIMER, ch);
0634
0635 return;
0636
0637 nomem:
0638 grp->in_sweep = 0;
0639 ctcm_clear_busy(dev);
0640 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
0641
0642 return;
0643 }
0644
0645
0646
0647
0648 static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
0649 {
0650 struct pdu *p_header;
0651 struct net_device *dev = ch->netdev;
0652 struct ctcm_priv *priv = dev->ml_priv;
0653 struct mpc_group *grp = priv->mpcg;
0654 struct th_header *header;
0655 struct sk_buff *nskb;
0656 int rc = 0;
0657 int ccw_idx;
0658 unsigned long hi;
0659 unsigned long saveflags = 0;
0660
0661 CTCM_PR_DEBUG("Enter %s: %s, cp=%i ch=0x%p id=%s state=%s\n",
0662 __func__, dev->name, smp_processor_id(), ch,
0663 ch->id, fsm_getstate_str(ch->fsm));
0664
0665 if ((fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) || grp->in_sweep) {
0666 spin_lock_irqsave(&ch->collect_lock, saveflags);
0667 refcount_inc(&skb->users);
0668
0669 p_header = skb_push(skb, PDU_HEADER_LENGTH);
0670 p_header->pdu_offset = skb->len - PDU_HEADER_LENGTH;
0671 p_header->pdu_proto = 0x01;
0672 if (be16_to_cpu(skb->protocol) == ETH_P_SNAP) {
0673 p_header->pdu_flag = PDU_FIRST | PDU_CNTL;
0674 } else {
0675 p_header->pdu_flag = PDU_FIRST;
0676 }
0677 p_header->pdu_seq = 0;
0678
0679 CTCM_PR_DEBUG("%s(%s): Put on collect_q - skb len: %04x \n"
0680 "pdu header and data for up to 32 bytes:\n",
0681 __func__, dev->name, skb->len);
0682 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
0683
0684 skb_queue_tail(&ch->collect_queue, skb);
0685 ch->collect_len += skb->len;
0686
0687 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
0688 goto done;
0689 }
0690
0691
0692
0693
0694
0695 refcount_inc(&skb->users);
0696
0697
0698
0699
0700
0701 hi = ((unsigned long)skb->tail + TH_HEADER_LENGTH) >> 31;
0702 if (hi) {
0703 nskb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
0704 if (!nskb) {
0705 goto nomem_exit;
0706 } else {
0707 skb_put_data(nskb, skb->data, skb->len);
0708 refcount_inc(&nskb->users);
0709 refcount_dec(&skb->users);
0710 dev_kfree_skb_irq(skb);
0711 skb = nskb;
0712 }
0713 }
0714
0715 p_header = skb_push(skb, PDU_HEADER_LENGTH);
0716 p_header->pdu_offset = skb->len - PDU_HEADER_LENGTH;
0717 p_header->pdu_proto = 0x01;
0718 p_header->pdu_seq = 0;
0719 if (be16_to_cpu(skb->protocol) == ETH_P_SNAP) {
0720 p_header->pdu_flag = PDU_FIRST | PDU_CNTL;
0721 } else {
0722 p_header->pdu_flag = PDU_FIRST;
0723 }
0724
0725 if (ch->collect_len > 0) {
0726 spin_lock_irqsave(&ch->collect_lock, saveflags);
0727 skb_queue_tail(&ch->collect_queue, skb);
0728 ch->collect_len += skb->len;
0729 skb = skb_dequeue(&ch->collect_queue);
0730 ch->collect_len -= skb->len;
0731 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
0732 }
0733
0734 p_header = (struct pdu *)skb->data;
0735 p_header->pdu_flag |= PDU_LAST;
0736
0737 ch->prof.txlen += skb->len - PDU_HEADER_LENGTH;
0738
0739
0740 header = skb_push(skb, TH_HEADER_LENGTH);
0741 memset(header, 0, TH_HEADER_LENGTH);
0742
0743 header->th_ch_flag = TH_HAS_PDU;
0744 ch->th_seq_num++;
0745 header->th_seq_num = ch->th_seq_num;
0746
0747 CTCM_PR_DBGDATA("%s(%s) ToVTAM_th_seq= %08x\n" ,
0748 __func__, dev->name, ch->th_seq_num);
0749
0750 CTCM_PR_DBGDATA("%s(%s): skb len: %04x\n - pdu header and data for "
0751 "up to 32 bytes sent to vtam:\n",
0752 __func__, dev->name, skb->len);
0753 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
0754
0755 ch->ccw[4].count = skb->len;
0756 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
0757
0758
0759
0760
0761 if (ctcm_checkalloc_buffer(ch)) {
0762
0763
0764
0765
0766 goto nomem_exit;
0767 }
0768
0769 skb_reset_tail_pointer(ch->trans_skb);
0770 ch->trans_skb->len = 0;
0771 ch->ccw[1].count = skb->len;
0772 skb_put_data(ch->trans_skb, skb->data, skb->len);
0773 refcount_dec(&skb->users);
0774 dev_kfree_skb_irq(skb);
0775 ccw_idx = 0;
0776 CTCM_PR_DBGDATA("%s(%s): trans_skb len: %04x\n"
0777 "up to 32 bytes sent to vtam:\n",
0778 __func__, dev->name, ch->trans_skb->len);
0779 CTCM_D3_DUMP((char *)ch->trans_skb->data,
0780 min_t(int, 32, ch->trans_skb->len));
0781 } else {
0782 skb_queue_tail(&ch->io_queue, skb);
0783 ccw_idx = 3;
0784 }
0785 ch->retry = 0;
0786 fsm_newstate(ch->fsm, CTC_STATE_TX);
0787 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
0788
0789 if (do_debug_ccw)
0790 ctcmpc_dumpit((char *)&ch->ccw[ccw_idx],
0791 sizeof(struct ccw1) * 3);
0792
0793 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
0794 ch->prof.send_stamp = jiffies;
0795 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx], 0, 0xff, 0);
0796 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
0797 if (ccw_idx == 3)
0798 ch->prof.doios_single++;
0799 if (rc != 0) {
0800 fsm_deltimer(&ch->timer);
0801 ctcm_ccw_check_rc(ch, rc, "single skb TX");
0802 if (ccw_idx == 3)
0803 skb_dequeue_tail(&ch->io_queue);
0804 } else if (ccw_idx == 0) {
0805 priv->stats.tx_packets++;
0806 priv->stats.tx_bytes += skb->len - TH_HEADER_LENGTH;
0807 }
0808 if (ch->th_seq_num > 0xf0000000)
0809 ctcmpc_send_sweep_req(ch);
0810
0811 goto done;
0812 nomem_exit:
0813 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_CRIT,
0814 "%s(%s): MEMORY allocation ERROR\n",
0815 CTCM_FUNTAIL, ch->id);
0816 rc = -ENOMEM;
0817 refcount_dec(&skb->users);
0818 dev_kfree_skb_any(skb);
0819 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
0820 done:
0821 CTCM_PR_DEBUG("Exit %s(%s)\n", __func__, dev->name);
0822 return rc;
0823 }
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837 static int ctcm_tx(struct sk_buff *skb, struct net_device *dev)
0838 {
0839 struct ctcm_priv *priv = dev->ml_priv;
0840
0841 if (skb == NULL) {
0842 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0843 "%s(%s): NULL sk_buff passed",
0844 CTCM_FUNTAIL, dev->name);
0845 priv->stats.tx_dropped++;
0846 return NETDEV_TX_OK;
0847 }
0848 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) {
0849 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
0850 "%s(%s): Got sk_buff with head room < %ld bytes",
0851 CTCM_FUNTAIL, dev->name, LL_HEADER_LENGTH + 2);
0852 dev_kfree_skb(skb);
0853 priv->stats.tx_dropped++;
0854 return NETDEV_TX_OK;
0855 }
0856
0857
0858
0859
0860
0861 if (fsm_getstate(priv->fsm) != DEV_STATE_RUNNING) {
0862 fsm_event(priv->fsm, DEV_EVENT_START, dev);
0863 dev_kfree_skb(skb);
0864 priv->stats.tx_dropped++;
0865 priv->stats.tx_errors++;
0866 priv->stats.tx_carrier_errors++;
0867 return NETDEV_TX_OK;
0868 }
0869
0870 if (ctcm_test_and_set_busy(dev))
0871 return NETDEV_TX_BUSY;
0872
0873 netif_trans_update(dev);
0874 if (ctcm_transmit_skb(priv->channel[CTCM_WRITE], skb) != 0)
0875 return NETDEV_TX_BUSY;
0876 return NETDEV_TX_OK;
0877 }
0878
0879
0880 static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
0881 {
0882 int len = 0;
0883 struct ctcm_priv *priv = dev->ml_priv;
0884 struct mpc_group *grp = priv->mpcg;
0885 struct sk_buff *newskb = NULL;
0886
0887
0888
0889
0890 if (skb == NULL) {
0891 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
0892 "%s(%s): NULL sk_buff passed",
0893 CTCM_FUNTAIL, dev->name);
0894 priv->stats.tx_dropped++;
0895 goto done;
0896 }
0897 if (skb_headroom(skb) < (TH_HEADER_LENGTH + PDU_HEADER_LENGTH)) {
0898 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
0899 "%s(%s): Got sk_buff with head room < %ld bytes",
0900 CTCM_FUNTAIL, dev->name,
0901 TH_HEADER_LENGTH + PDU_HEADER_LENGTH);
0902
0903 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
0904
0905 len = skb->len + TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
0906 newskb = __dev_alloc_skb(len, GFP_ATOMIC | GFP_DMA);
0907
0908 if (!newskb) {
0909 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
0910 "%s: %s: __dev_alloc_skb failed",
0911 __func__, dev->name);
0912
0913 dev_kfree_skb_any(skb);
0914 priv->stats.tx_dropped++;
0915 priv->stats.tx_errors++;
0916 priv->stats.tx_carrier_errors++;
0917 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
0918 goto done;
0919 }
0920 newskb->protocol = skb->protocol;
0921 skb_reserve(newskb, TH_HEADER_LENGTH + PDU_HEADER_LENGTH);
0922 skb_put_data(newskb, skb->data, skb->len);
0923 dev_kfree_skb_any(skb);
0924 skb = newskb;
0925 }
0926
0927
0928
0929
0930
0931
0932 if ((fsm_getstate(priv->fsm) != DEV_STATE_RUNNING) ||
0933 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) {
0934 dev_kfree_skb_any(skb);
0935 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
0936 "%s(%s): inactive MPCGROUP - dropped",
0937 CTCM_FUNTAIL, dev->name);
0938 priv->stats.tx_dropped++;
0939 priv->stats.tx_errors++;
0940 priv->stats.tx_carrier_errors++;
0941 goto done;
0942 }
0943
0944 if (ctcm_test_and_set_busy(dev)) {
0945 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
0946 "%s(%s): device busy - dropped",
0947 CTCM_FUNTAIL, dev->name);
0948 dev_kfree_skb_any(skb);
0949 priv->stats.tx_dropped++;
0950 priv->stats.tx_errors++;
0951 priv->stats.tx_carrier_errors++;
0952 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
0953 goto done;
0954 }
0955
0956 netif_trans_update(dev);
0957 if (ctcmpc_transmit_skb(priv->channel[CTCM_WRITE], skb) != 0) {
0958 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
0959 "%s(%s): device error - dropped",
0960 CTCM_FUNTAIL, dev->name);
0961 dev_kfree_skb_any(skb);
0962 priv->stats.tx_dropped++;
0963 priv->stats.tx_errors++;
0964 priv->stats.tx_carrier_errors++;
0965 ctcm_clear_busy(dev);
0966 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
0967 goto done;
0968 }
0969 ctcm_clear_busy(dev);
0970 done:
0971 if (do_debug)
0972 MPC_DBF_DEV_NAME(TRACE, dev, "exit");
0973
0974 return NETDEV_TX_OK;
0975 }
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989 static int ctcm_change_mtu(struct net_device *dev, int new_mtu)
0990 {
0991 struct ctcm_priv *priv;
0992 int max_bufsize;
0993
0994 priv = dev->ml_priv;
0995 max_bufsize = priv->channel[CTCM_READ]->max_bufsize;
0996
0997 if (IS_MPC(priv)) {
0998 if (new_mtu > max_bufsize - TH_HEADER_LENGTH)
0999 return -EINVAL;
1000 dev->hard_header_len = TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
1001 } else {
1002 if (new_mtu > max_bufsize - LL_HEADER_LENGTH - 2)
1003 return -EINVAL;
1004 dev->hard_header_len = LL_HEADER_LENGTH + 2;
1005 }
1006 dev->mtu = new_mtu;
1007 return 0;
1008 }
1009
1010
1011
1012
1013
1014
1015
1016
1017 static struct net_device_stats *ctcm_stats(struct net_device *dev)
1018 {
1019 return &((struct ctcm_priv *)dev->ml_priv)->stats;
1020 }
1021
1022 static void ctcm_free_netdevice(struct net_device *dev)
1023 {
1024 struct ctcm_priv *priv;
1025 struct mpc_group *grp;
1026
1027 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1028 "%s(%s)", CTCM_FUNTAIL, dev->name);
1029 priv = dev->ml_priv;
1030 if (priv) {
1031 grp = priv->mpcg;
1032 if (grp) {
1033 if (grp->fsm)
1034 kfree_fsm(grp->fsm);
1035 dev_kfree_skb(grp->xid_skb);
1036 dev_kfree_skb(grp->rcvd_xid_skb);
1037 tasklet_kill(&grp->mpc_tasklet2);
1038 kfree(grp);
1039 priv->mpcg = NULL;
1040 }
1041 if (priv->fsm) {
1042 kfree_fsm(priv->fsm);
1043 priv->fsm = NULL;
1044 }
1045 kfree(priv->xid);
1046 priv->xid = NULL;
1047
1048
1049
1050
1051 }
1052 #ifdef MODULE
1053 free_netdev(dev);
1054 #endif
1055 }
1056
1057 struct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv);
1058
1059 static const struct net_device_ops ctcm_netdev_ops = {
1060 .ndo_open = ctcm_open,
1061 .ndo_stop = ctcm_close,
1062 .ndo_get_stats = ctcm_stats,
1063 .ndo_change_mtu = ctcm_change_mtu,
1064 .ndo_start_xmit = ctcm_tx,
1065 };
1066
1067 static const struct net_device_ops ctcm_mpc_netdev_ops = {
1068 .ndo_open = ctcm_open,
1069 .ndo_stop = ctcm_close,
1070 .ndo_get_stats = ctcm_stats,
1071 .ndo_change_mtu = ctcm_change_mtu,
1072 .ndo_start_xmit = ctcmpc_tx,
1073 };
1074
1075 static void ctcm_dev_setup(struct net_device *dev)
1076 {
1077 dev->type = ARPHRD_SLIP;
1078 dev->tx_queue_len = 100;
1079 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
1080 dev->min_mtu = 576;
1081 dev->max_mtu = 65527;
1082 }
1083
1084
1085
1086
1087
1088 static struct net_device *ctcm_init_netdevice(struct ctcm_priv *priv)
1089 {
1090 struct net_device *dev;
1091 struct mpc_group *grp;
1092 if (!priv)
1093 return NULL;
1094
1095 if (IS_MPC(priv))
1096 dev = alloc_netdev(0, MPC_DEVICE_GENE, NET_NAME_UNKNOWN,
1097 ctcm_dev_setup);
1098 else
1099 dev = alloc_netdev(0, CTC_DEVICE_GENE, NET_NAME_UNKNOWN,
1100 ctcm_dev_setup);
1101
1102 if (!dev) {
1103 CTCM_DBF_TEXT_(ERROR, CTC_DBF_CRIT,
1104 "%s: MEMORY allocation ERROR",
1105 CTCM_FUNTAIL);
1106 return NULL;
1107 }
1108 dev->ml_priv = priv;
1109 priv->fsm = init_fsm("ctcmdev", dev_state_names, dev_event_names,
1110 CTCM_NR_DEV_STATES, CTCM_NR_DEV_EVENTS,
1111 dev_fsm, dev_fsm_len, GFP_KERNEL);
1112 if (priv->fsm == NULL) {
1113 CTCMY_DBF_DEV(SETUP, dev, "init_fsm error");
1114 free_netdev(dev);
1115 return NULL;
1116 }
1117 fsm_newstate(priv->fsm, DEV_STATE_STOPPED);
1118 fsm_settimer(priv->fsm, &priv->restart_timer);
1119
1120 if (IS_MPC(priv)) {
1121
1122 grp = ctcmpc_init_mpc_group(priv);
1123 if (grp == NULL) {
1124 MPC_DBF_DEV(SETUP, dev, "init_mpc_group error");
1125 free_netdev(dev);
1126 return NULL;
1127 }
1128 tasklet_init(&grp->mpc_tasklet2,
1129 mpc_group_ready, (unsigned long)dev);
1130 dev->mtu = MPC_BUFSIZE_DEFAULT -
1131 TH_HEADER_LENGTH - PDU_HEADER_LENGTH;
1132
1133 dev->netdev_ops = &ctcm_mpc_netdev_ops;
1134 dev->hard_header_len = TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
1135 priv->buffer_size = MPC_BUFSIZE_DEFAULT;
1136 } else {
1137 dev->mtu = CTCM_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
1138 dev->netdev_ops = &ctcm_netdev_ops;
1139 dev->hard_header_len = LL_HEADER_LENGTH + 2;
1140 }
1141
1142 CTCMY_DBF_DEV(SETUP, dev, "finished");
1143
1144 return dev;
1145 }
1146
1147
1148
1149
1150
1151
1152
1153
1154 static void ctcm_irq_handler(struct ccw_device *cdev,
1155 unsigned long intparm, struct irb *irb)
1156 {
1157 struct channel *ch;
1158 struct net_device *dev;
1159 struct ctcm_priv *priv;
1160 struct ccwgroup_device *cgdev;
1161 int cstat;
1162 int dstat;
1163
1164 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
1165 "Enter %s(%s)", CTCM_FUNTAIL, dev_name(&cdev->dev));
1166
1167 if (ctcm_check_irb_error(cdev, irb))
1168 return;
1169
1170 cgdev = dev_get_drvdata(&cdev->dev);
1171
1172 cstat = irb->scsw.cmd.cstat;
1173 dstat = irb->scsw.cmd.dstat;
1174
1175
1176 if (cgdev == NULL) {
1177 CTCM_DBF_TEXT_(TRACE, CTC_DBF_ERROR,
1178 "%s(%s) unsolicited irq: c-%02x d-%02x\n",
1179 CTCM_FUNTAIL, dev_name(&cdev->dev), cstat, dstat);
1180 dev_warn(&cdev->dev,
1181 "The adapter received a non-specific IRQ\n");
1182 return;
1183 }
1184
1185 priv = dev_get_drvdata(&cgdev->dev);
1186
1187
1188 if (priv->channel[CTCM_READ]->cdev == cdev)
1189 ch = priv->channel[CTCM_READ];
1190 else if (priv->channel[CTCM_WRITE]->cdev == cdev)
1191 ch = priv->channel[CTCM_WRITE];
1192 else {
1193 dev_err(&cdev->dev,
1194 "%s: Internal error: Can't determine channel for "
1195 "interrupt device %s\n",
1196 __func__, dev_name(&cdev->dev));
1197
1198 return;
1199 }
1200
1201 dev = ch->netdev;
1202 if (dev == NULL) {
1203 dev_err(&cdev->dev,
1204 "%s Internal error: net_device is NULL, ch = 0x%p\n",
1205 __func__, ch);
1206
1207 return;
1208 }
1209
1210
1211 memcpy(ch->irb, irb, sizeof(struct irb));
1212
1213
1214 if (irb->scsw.cmd.cstat) {
1215 fsm_event(ch->fsm, CTC_EVENT_SC_UNKNOWN, ch);
1216 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
1217 "%s(%s): sub-ch check %s: cs=%02x ds=%02x",
1218 CTCM_FUNTAIL, dev->name, ch->id, cstat, dstat);
1219 dev_warn(&cdev->dev,
1220 "A check occurred on the subchannel\n");
1221 return;
1222 }
1223
1224
1225 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
1226 if ((irb->ecw[0] & ch->sense_rc) == 0)
1227
1228 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
1229 "%s(%s): sense=%02x, ds=%02x",
1230 CTCM_FUNTAIL, ch->id, irb->ecw[0], dstat);
1231 ccw_unit_check(ch, irb->ecw[0]);
1232 return;
1233 }
1234 if (irb->scsw.cmd.dstat & DEV_STAT_BUSY) {
1235 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION)
1236 fsm_event(ch->fsm, CTC_EVENT_ATTNBUSY, ch);
1237 else
1238 fsm_event(ch->fsm, CTC_EVENT_BUSY, ch);
1239 return;
1240 }
1241 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) {
1242 fsm_event(ch->fsm, CTC_EVENT_ATTN, ch);
1243 return;
1244 }
1245 if ((irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
1246 (irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
1247 (irb->scsw.cmd.stctl ==
1248 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))
1249 fsm_event(ch->fsm, CTC_EVENT_FINSTAT, ch);
1250 else
1251 fsm_event(ch->fsm, CTC_EVENT_IRQ, ch);
1252
1253 }
1254
1255 static const struct device_type ctcm_devtype = {
1256 .name = "ctcm",
1257 .groups = ctcm_attr_groups,
1258 };
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268 static int ctcm_probe_device(struct ccwgroup_device *cgdev)
1269 {
1270 struct ctcm_priv *priv;
1271
1272 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1273 "%s %p",
1274 __func__, cgdev);
1275
1276 if (!get_device(&cgdev->dev))
1277 return -ENODEV;
1278
1279 priv = kzalloc(sizeof(struct ctcm_priv), GFP_KERNEL);
1280 if (!priv) {
1281 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
1282 "%s: memory allocation failure",
1283 CTCM_FUNTAIL);
1284 put_device(&cgdev->dev);
1285 return -ENOMEM;
1286 }
1287 priv->buffer_size = CTCM_BUFSIZE_DEFAULT;
1288 cgdev->cdev[0]->handler = ctcm_irq_handler;
1289 cgdev->cdev[1]->handler = ctcm_irq_handler;
1290 dev_set_drvdata(&cgdev->dev, priv);
1291 cgdev->dev.type = &ctcm_devtype;
1292
1293 return 0;
1294 }
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306 static int add_channel(struct ccw_device *cdev, enum ctcm_channel_types type,
1307 struct ctcm_priv *priv)
1308 {
1309 struct channel **c = &channels;
1310 struct channel *ch;
1311 int ccw_num;
1312 int rc = 0;
1313
1314 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1315 "%s(%s), type %d, proto %d",
1316 __func__, dev_name(&cdev->dev), type, priv->protocol);
1317
1318 ch = kzalloc(sizeof(struct channel), GFP_KERNEL);
1319 if (ch == NULL)
1320 return -ENOMEM;
1321
1322 ch->protocol = priv->protocol;
1323 if (IS_MPC(priv)) {
1324 ch->discontact_th = kzalloc(TH_HEADER_LENGTH, GFP_KERNEL);
1325 if (ch->discontact_th == NULL)
1326 goto nomem_return;
1327
1328 ch->discontact_th->th_blk_flag = TH_DISCONTACT;
1329 tasklet_init(&ch->ch_disc_tasklet,
1330 mpc_action_send_discontact, (unsigned long)ch);
1331
1332 tasklet_init(&ch->ch_tasklet, ctcmpc_bh, (unsigned long)ch);
1333 ch->max_bufsize = (MPC_BUFSIZE_DEFAULT - 35);
1334 ccw_num = 17;
1335 } else
1336 ccw_num = 8;
1337
1338 ch->ccw = kcalloc(ccw_num, sizeof(struct ccw1), GFP_KERNEL | GFP_DMA);
1339 if (ch->ccw == NULL)
1340 goto nomem_return;
1341
1342 ch->cdev = cdev;
1343 snprintf(ch->id, CTCM_ID_SIZE, "ch-%s", dev_name(&cdev->dev));
1344 ch->type = type;
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389 ch->ccw[6].cmd_code = CCW_CMD_SET_EXTENDED;
1390 ch->ccw[6].flags = CCW_FLAG_SLI;
1391
1392 ch->ccw[7].cmd_code = CCW_CMD_NOOP;
1393 ch->ccw[7].flags = CCW_FLAG_SLI;
1394
1395 if (IS_MPC(priv)) {
1396 ch->ccw[15].cmd_code = CCW_CMD_WRITE;
1397 ch->ccw[15].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1398 ch->ccw[15].count = TH_HEADER_LENGTH;
1399 ch->ccw[15].cda = virt_to_phys(ch->discontact_th);
1400
1401 ch->ccw[16].cmd_code = CCW_CMD_NOOP;
1402 ch->ccw[16].flags = CCW_FLAG_SLI;
1403
1404 ch->fsm = init_fsm(ch->id, ctc_ch_state_names,
1405 ctc_ch_event_names, CTC_MPC_NR_STATES,
1406 CTC_MPC_NR_EVENTS, ctcmpc_ch_fsm,
1407 mpc_ch_fsm_len, GFP_KERNEL);
1408 } else {
1409 ch->fsm = init_fsm(ch->id, ctc_ch_state_names,
1410 ctc_ch_event_names, CTC_NR_STATES,
1411 CTC_NR_EVENTS, ch_fsm,
1412 ch_fsm_len, GFP_KERNEL);
1413 }
1414 if (ch->fsm == NULL)
1415 goto nomem_return;
1416
1417 fsm_newstate(ch->fsm, CTC_STATE_IDLE);
1418
1419 ch->irb = kzalloc(sizeof(struct irb), GFP_KERNEL);
1420 if (ch->irb == NULL)
1421 goto nomem_return;
1422
1423 while (*c && ctcm_less_than((*c)->id, ch->id))
1424 c = &(*c)->next;
1425
1426 if (*c && (!strncmp((*c)->id, ch->id, CTCM_ID_SIZE))) {
1427 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1428 "%s (%s) already in list, using old entry",
1429 __func__, (*c)->id);
1430
1431 goto free_return;
1432 }
1433
1434 spin_lock_init(&ch->collect_lock);
1435
1436 fsm_settimer(ch->fsm, &ch->timer);
1437 skb_queue_head_init(&ch->io_queue);
1438 skb_queue_head_init(&ch->collect_queue);
1439
1440 if (IS_MPC(priv)) {
1441 fsm_settimer(ch->fsm, &ch->sweep_timer);
1442 skb_queue_head_init(&ch->sweep_queue);
1443 }
1444 ch->next = *c;
1445 *c = ch;
1446 return 0;
1447
1448 nomem_return:
1449 rc = -ENOMEM;
1450
1451 free_return:
1452 kfree(ch->ccw);
1453 kfree(ch->discontact_th);
1454 kfree_fsm(ch->fsm);
1455 kfree(ch->irb);
1456 kfree(ch);
1457 return rc;
1458 }
1459
1460
1461
1462
1463 static enum ctcm_channel_types get_channel_type(struct ccw_device_id *id)
1464 {
1465 enum ctcm_channel_types type;
1466 type = (enum ctcm_channel_types)id->driver_info;
1467
1468 if (type == ctcm_channel_type_ficon)
1469 type = ctcm_channel_type_escon;
1470
1471 return type;
1472 }
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482 static int ctcm_new_device(struct ccwgroup_device *cgdev)
1483 {
1484 char read_id[CTCM_ID_SIZE];
1485 char write_id[CTCM_ID_SIZE];
1486 int direction;
1487 enum ctcm_channel_types type;
1488 struct ctcm_priv *priv;
1489 struct net_device *dev;
1490 struct ccw_device *cdev0;
1491 struct ccw_device *cdev1;
1492 struct channel *readc;
1493 struct channel *writec;
1494 int ret;
1495 int result;
1496
1497 priv = dev_get_drvdata(&cgdev->dev);
1498 if (!priv) {
1499 result = -ENODEV;
1500 goto out_err_result;
1501 }
1502
1503 cdev0 = cgdev->cdev[0];
1504 cdev1 = cgdev->cdev[1];
1505
1506 type = get_channel_type(&cdev0->id);
1507
1508 snprintf(read_id, CTCM_ID_SIZE, "ch-%s", dev_name(&cdev0->dev));
1509 snprintf(write_id, CTCM_ID_SIZE, "ch-%s", dev_name(&cdev1->dev));
1510
1511 ret = add_channel(cdev0, type, priv);
1512 if (ret) {
1513 result = ret;
1514 goto out_err_result;
1515 }
1516 ret = add_channel(cdev1, type, priv);
1517 if (ret) {
1518 result = ret;
1519 goto out_remove_channel1;
1520 }
1521
1522 ret = ccw_device_set_online(cdev0);
1523 if (ret != 0) {
1524 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1525 "%s(%s) set_online rc=%d",
1526 CTCM_FUNTAIL, read_id, ret);
1527 result = -EIO;
1528 goto out_remove_channel2;
1529 }
1530
1531 ret = ccw_device_set_online(cdev1);
1532 if (ret != 0) {
1533 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1534 "%s(%s) set_online rc=%d",
1535 CTCM_FUNTAIL, write_id, ret);
1536
1537 result = -EIO;
1538 goto out_ccw1;
1539 }
1540
1541 dev = ctcm_init_netdevice(priv);
1542 if (dev == NULL) {
1543 result = -ENODEV;
1544 goto out_ccw2;
1545 }
1546
1547 for (direction = CTCM_READ; direction <= CTCM_WRITE; direction++) {
1548 priv->channel[direction] =
1549 channel_get(type, direction == CTCM_READ ?
1550 read_id : write_id, direction);
1551 if (priv->channel[direction] == NULL) {
1552 if (direction == CTCM_WRITE)
1553 channel_free(priv->channel[CTCM_READ]);
1554 result = -ENODEV;
1555 goto out_dev;
1556 }
1557 priv->channel[direction]->netdev = dev;
1558 priv->channel[direction]->protocol = priv->protocol;
1559 priv->channel[direction]->max_bufsize = priv->buffer_size;
1560 }
1561
1562 SET_NETDEV_DEV(dev, &cgdev->dev);
1563
1564 if (register_netdev(dev)) {
1565 result = -ENODEV;
1566 goto out_dev;
1567 }
1568
1569 strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name));
1570
1571 dev_info(&dev->dev,
1572 "setup OK : r/w = %s/%s, protocol : %d\n",
1573 priv->channel[CTCM_READ]->id,
1574 priv->channel[CTCM_WRITE]->id, priv->protocol);
1575
1576 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1577 "setup(%s) OK : r/w = %s/%s, protocol : %d", dev->name,
1578 priv->channel[CTCM_READ]->id,
1579 priv->channel[CTCM_WRITE]->id, priv->protocol);
1580
1581 return 0;
1582 out_dev:
1583 ctcm_free_netdevice(dev);
1584 out_ccw2:
1585 ccw_device_set_offline(cgdev->cdev[1]);
1586 out_ccw1:
1587 ccw_device_set_offline(cgdev->cdev[0]);
1588 out_remove_channel2:
1589 readc = channel_get(type, read_id, CTCM_READ);
1590 channel_remove(readc);
1591 out_remove_channel1:
1592 writec = channel_get(type, write_id, CTCM_WRITE);
1593 channel_remove(writec);
1594 out_err_result:
1595 return result;
1596 }
1597
1598
1599
1600
1601
1602
1603
1604
1605 static int ctcm_shutdown_device(struct ccwgroup_device *cgdev)
1606 {
1607 struct ctcm_priv *priv;
1608 struct net_device *dev;
1609
1610 priv = dev_get_drvdata(&cgdev->dev);
1611 if (!priv)
1612 return -ENODEV;
1613
1614 if (priv->channel[CTCM_READ]) {
1615 dev = priv->channel[CTCM_READ]->netdev;
1616 CTCM_DBF_DEV(SETUP, dev, "");
1617
1618 ctcm_close(dev);
1619 dev->flags &= ~IFF_RUNNING;
1620 channel_free(priv->channel[CTCM_READ]);
1621 } else
1622 dev = NULL;
1623
1624 if (priv->channel[CTCM_WRITE])
1625 channel_free(priv->channel[CTCM_WRITE]);
1626
1627 if (dev) {
1628 unregister_netdev(dev);
1629 ctcm_free_netdevice(dev);
1630 }
1631
1632 if (priv->fsm)
1633 kfree_fsm(priv->fsm);
1634
1635 ccw_device_set_offline(cgdev->cdev[1]);
1636 ccw_device_set_offline(cgdev->cdev[0]);
1637 channel_remove(priv->channel[CTCM_READ]);
1638 channel_remove(priv->channel[CTCM_WRITE]);
1639 priv->channel[CTCM_READ] = priv->channel[CTCM_WRITE] = NULL;
1640
1641 return 0;
1642
1643 }
1644
1645
1646 static void ctcm_remove_device(struct ccwgroup_device *cgdev)
1647 {
1648 struct ctcm_priv *priv = dev_get_drvdata(&cgdev->dev);
1649
1650 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1651 "removing device %p, proto : %d",
1652 cgdev, priv->protocol);
1653
1654 if (cgdev->state == CCWGROUP_ONLINE)
1655 ctcm_shutdown_device(cgdev);
1656 dev_set_drvdata(&cgdev->dev, NULL);
1657 kfree(priv);
1658 put_device(&cgdev->dev);
1659 }
1660
1661 static struct ccw_device_id ctcm_ids[] = {
1662 {CCW_DEVICE(0x3088, 0x08), .driver_info = ctcm_channel_type_parallel},
1663 {CCW_DEVICE(0x3088, 0x1e), .driver_info = ctcm_channel_type_ficon},
1664 {CCW_DEVICE(0x3088, 0x1f), .driver_info = ctcm_channel_type_escon},
1665 {},
1666 };
1667 MODULE_DEVICE_TABLE(ccw, ctcm_ids);
1668
1669 static struct ccw_driver ctcm_ccw_driver = {
1670 .driver = {
1671 .owner = THIS_MODULE,
1672 .name = "ctcm",
1673 },
1674 .ids = ctcm_ids,
1675 .probe = ccwgroup_probe_ccwdev,
1676 .remove = ccwgroup_remove_ccwdev,
1677 .int_class = IRQIO_CTC,
1678 };
1679
1680 static struct ccwgroup_driver ctcm_group_driver = {
1681 .driver = {
1682 .owner = THIS_MODULE,
1683 .name = CTC_DRIVER_NAME,
1684 },
1685 .ccw_driver = &ctcm_ccw_driver,
1686 .setup = ctcm_probe_device,
1687 .remove = ctcm_remove_device,
1688 .set_online = ctcm_new_device,
1689 .set_offline = ctcm_shutdown_device,
1690 };
1691
1692 static ssize_t group_store(struct device_driver *ddrv, const char *buf,
1693 size_t count)
1694 {
1695 int err;
1696
1697 err = ccwgroup_create_dev(ctcm_root_dev, &ctcm_group_driver, 2, buf);
1698 return err ? err : count;
1699 }
1700 static DRIVER_ATTR_WO(group);
1701
1702 static struct attribute *ctcm_drv_attrs[] = {
1703 &driver_attr_group.attr,
1704 NULL,
1705 };
1706 static struct attribute_group ctcm_drv_attr_group = {
1707 .attrs = ctcm_drv_attrs,
1708 };
1709 static const struct attribute_group *ctcm_drv_attr_groups[] = {
1710 &ctcm_drv_attr_group,
1711 NULL,
1712 };
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724 static void __exit ctcm_exit(void)
1725 {
1726 ccwgroup_driver_unregister(&ctcm_group_driver);
1727 ccw_driver_unregister(&ctcm_ccw_driver);
1728 root_device_unregister(ctcm_root_dev);
1729 ctcm_unregister_dbf_views();
1730 pr_info("CTCM driver unloaded\n");
1731 }
1732
1733
1734
1735
1736 static void print_banner(void)
1737 {
1738 pr_info("CTCM driver initialized\n");
1739 }
1740
1741
1742
1743
1744
1745
1746
1747 static int __init ctcm_init(void)
1748 {
1749 int ret;
1750
1751 channels = NULL;
1752
1753 ret = ctcm_register_dbf_views();
1754 if (ret)
1755 goto out_err;
1756 ctcm_root_dev = root_device_register("ctcm");
1757 ret = PTR_ERR_OR_ZERO(ctcm_root_dev);
1758 if (ret)
1759 goto register_err;
1760 ret = ccw_driver_register(&ctcm_ccw_driver);
1761 if (ret)
1762 goto ccw_err;
1763 ctcm_group_driver.driver.groups = ctcm_drv_attr_groups;
1764 ret = ccwgroup_driver_register(&ctcm_group_driver);
1765 if (ret)
1766 goto ccwgroup_err;
1767 print_banner();
1768 return 0;
1769
1770 ccwgroup_err:
1771 ccw_driver_unregister(&ctcm_ccw_driver);
1772 ccw_err:
1773 root_device_unregister(ctcm_root_dev);
1774 register_err:
1775 ctcm_unregister_dbf_views();
1776 out_err:
1777 pr_err("%s / Initializing the ctcm device driver failed, ret = %d\n",
1778 __func__, ret);
1779 return ret;
1780 }
1781
1782 module_init(ctcm_init);
1783 module_exit(ctcm_exit);
1784
1785 MODULE_AUTHOR("Peter Tiedemann <ptiedem@de.ibm.com>");
1786 MODULE_DESCRIPTION("Network driver for S/390 CTC + CTCMPC (SNA)");
1787 MODULE_LICENSE("GPL");
1788