Lines Matching refs:ch

74 void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)  in ctcm_unpack_skb()  argument
76 struct net_device *dev = ch->netdev; in ctcm_unpack_skb()
90 if ((ch->protocol == CTCM_PROTO_S390) && in ctcm_unpack_skb()
92 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) { in ctcm_unpack_skb()
93 ch->logflags |= LOG_FLAG_ILLEGALPKT; in ctcm_unpack_skb()
112 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) { in ctcm_unpack_skb()
118 ch->logflags |= LOG_FLAG_ILLEGALSIZE; in ctcm_unpack_skb()
129 if (!(ch->logflags & LOG_FLAG_OVERRUN)) { in ctcm_unpack_skb()
134 ch->logflags |= LOG_FLAG_OVERRUN; in ctcm_unpack_skb()
146 if (!(ch->logflags & LOG_FLAG_NOMEM)) { in ctcm_unpack_skb()
150 ch->logflags |= LOG_FLAG_NOMEM; in ctcm_unpack_skb()
165 ch->logflags = 0; in ctcm_unpack_skb()
174 ch->logflags |= LOG_FLAG_OVERRUN; in ctcm_unpack_skb()
187 static void channel_free(struct channel *ch) in channel_free() argument
189 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s)", CTCM_FUNTAIL, ch->id); in channel_free()
190 ch->flags &= ~CHANNEL_FLAGS_INUSE; in channel_free()
191 fsm_newstate(ch->fsm, CTC_STATE_IDLE); in channel_free()
199 static void channel_remove(struct channel *ch) in channel_remove() argument
205 if (ch == NULL) in channel_remove()
208 strncpy(chid, ch->id, CTCM_ID_SIZE); in channel_remove()
210 channel_free(ch); in channel_remove()
212 if (*c == ch) { in channel_remove()
213 *c = ch->next; in channel_remove()
214 fsm_deltimer(&ch->timer); in channel_remove()
215 if (IS_MPC(ch)) in channel_remove()
216 fsm_deltimer(&ch->sweep_timer); in channel_remove()
218 kfree_fsm(ch->fsm); in channel_remove()
219 clear_normalized_cda(&ch->ccw[4]); in channel_remove()
220 if (ch->trans_skb != NULL) { in channel_remove()
221 clear_normalized_cda(&ch->ccw[1]); in channel_remove()
222 dev_kfree_skb_any(ch->trans_skb); in channel_remove()
224 if (IS_MPC(ch)) { in channel_remove()
225 tasklet_kill(&ch->ch_tasklet); in channel_remove()
226 tasklet_kill(&ch->ch_disc_tasklet); in channel_remove()
227 kfree(ch->discontact_th); in channel_remove()
229 kfree(ch->ccw); in channel_remove()
230 kfree(ch->irb); in channel_remove()
231 kfree(ch); in channel_remove()
254 struct channel *ch = channels; in channel_get() local
256 while (ch && (strncmp(ch->id, id, CTCM_ID_SIZE) || (ch->type != type))) in channel_get()
257 ch = ch->next; in channel_get()
258 if (!ch) { in channel_get()
263 if (ch->flags & CHANNEL_FLAGS_INUSE) in channel_get()
264 ch = NULL; in channel_get()
266 ch->flags |= CHANNEL_FLAGS_INUSE; in channel_get()
267 ch->flags &= ~CHANNEL_FLAGS_RWMASK; in channel_get()
268 ch->flags |= (direction == CTCM_WRITE) in channel_get()
270 fsm_newstate(ch->fsm, CTC_STATE_STOPPED); in channel_get()
273 return ch; in channel_get()
308 static inline void ccw_unit_check(struct channel *ch, __u8 sense) in ccw_unit_check() argument
312 CTCM_FUNTAIL, ch->id, sense); in ccw_unit_check()
316 if (ch->sense_rc != 0x01) { in ccw_unit_check()
319 "disconnected\n", ch->id); in ccw_unit_check()
320 ch->sense_rc = 0x01; in ccw_unit_check()
322 fsm_event(ch->fsm, CTC_EVENT_UC_RCRESET, ch); in ccw_unit_check()
324 if (ch->sense_rc != SNS0_INTERVENTION_REQ) { in ccw_unit_check()
327 "not available\n", ch->id); in ccw_unit_check()
328 ch->sense_rc = SNS0_INTERVENTION_REQ; in ccw_unit_check()
330 fsm_event(ch->fsm, CTC_EVENT_UC_RSRESET, ch); in ccw_unit_check()
334 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) { in ccw_unit_check()
337 CTCM_FUNTAIL, ch->id, sense); in ccw_unit_check()
338 ch->sense_rc = SNS0_BUS_OUT_CHECK; in ccw_unit_check()
340 fsm_event(ch->fsm, CTC_EVENT_UC_HWFAIL, ch); in ccw_unit_check()
342 if (ch->sense_rc != SNS0_EQUIPMENT_CHECK) { in ccw_unit_check()
345 CTCM_FUNTAIL, ch->id, sense); in ccw_unit_check()
346 ch->sense_rc = SNS0_EQUIPMENT_CHECK; in ccw_unit_check()
348 fsm_event(ch->fsm, CTC_EVENT_UC_RXPARITY, ch); in ccw_unit_check()
351 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) { in ccw_unit_check()
354 CTCM_FUNTAIL, ch->id, sense); in ccw_unit_check()
355 ch->sense_rc = SNS0_BUS_OUT_CHECK; in ccw_unit_check()
358 fsm_event(ch->fsm, CTC_EVENT_UC_TXTIMEOUT, ch); in ccw_unit_check()
360 fsm_event(ch->fsm, CTC_EVENT_UC_TXPARITY, ch); in ccw_unit_check()
362 if (ch->sense_rc != SNS0_CMD_REJECT) { in ccw_unit_check()
365 CTCM_FUNTAIL, ch->id); in ccw_unit_check()
366 ch->sense_rc = SNS0_CMD_REJECT; in ccw_unit_check()
371 CTCM_FUNTAIL, ch->id); in ccw_unit_check()
372 fsm_event(ch->fsm, CTC_EVENT_UC_ZERO, ch); in ccw_unit_check()
376 CTCM_FUNTAIL, ch->id, sense); in ccw_unit_check()
377 fsm_event(ch->fsm, CTC_EVENT_UC_UNKNOWN, ch); in ccw_unit_check()
381 int ctcm_ch_alloc_buffer(struct channel *ch) in ctcm_ch_alloc_buffer() argument
383 clear_normalized_cda(&ch->ccw[1]); in ctcm_ch_alloc_buffer()
384 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC | GFP_DMA); in ctcm_ch_alloc_buffer()
385 if (ch->trans_skb == NULL) { in ctcm_ch_alloc_buffer()
388 CTCM_FUNTAIL, ch->id, in ctcm_ch_alloc_buffer()
389 (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ? in ctcm_ch_alloc_buffer()
394 ch->ccw[1].count = ch->max_bufsize; in ctcm_ch_alloc_buffer()
395 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) { in ctcm_ch_alloc_buffer()
396 dev_kfree_skb(ch->trans_skb); in ctcm_ch_alloc_buffer()
397 ch->trans_skb = NULL; in ctcm_ch_alloc_buffer()
400 CTCM_FUNTAIL, ch->id, in ctcm_ch_alloc_buffer()
401 (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ? in ctcm_ch_alloc_buffer()
406 ch->ccw[1].count = 0; in ctcm_ch_alloc_buffer()
407 ch->trans_skb_data = ch->trans_skb->data; in ctcm_ch_alloc_buffer()
408 ch->flags &= ~CHANNEL_FLAGS_BUFSIZE_CHANGED; in ctcm_ch_alloc_buffer()
464 static int ctcm_transmit_skb(struct channel *ch, struct sk_buff *skb) in ctcm_transmit_skb() argument
478 spin_lock_irqsave(&ch->collect_lock, saveflags); in ctcm_transmit_skb()
479 if (fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) { in ctcm_transmit_skb()
482 if (ch->collect_len + l > ch->max_bufsize - 2) { in ctcm_transmit_skb()
483 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcm_transmit_skb()
492 skb_queue_tail(&ch->collect_queue, skb); in ctcm_transmit_skb()
493 ch->collect_len += l; in ctcm_transmit_skb()
495 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcm_transmit_skb()
498 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcm_transmit_skb()
504 ch->prof.txlen += skb->len; in ctcm_transmit_skb()
522 ctcm_clear_busy(ch->netdev); in ctcm_transmit_skb()
533 ch->ccw[4].count = block_len; in ctcm_transmit_skb()
534 if (set_normalized_cda(&ch->ccw[4], skb->data)) { in ctcm_transmit_skb()
540 if (ctcm_checkalloc_buffer(ch)) { in ctcm_transmit_skb()
547 ctcm_clear_busy(ch->netdev); in ctcm_transmit_skb()
551 skb_reset_tail_pointer(ch->trans_skb); in ctcm_transmit_skb()
552 ch->trans_skb->len = 0; in ctcm_transmit_skb()
553 ch->ccw[1].count = skb->len; in ctcm_transmit_skb()
555 skb_put(ch->trans_skb, skb->len), skb->len); in ctcm_transmit_skb()
560 skb_queue_tail(&ch->io_queue, skb); in ctcm_transmit_skb()
564 ctcmpc_dumpit((char *)&ch->ccw[ccw_idx], in ctcm_transmit_skb()
566 ch->retry = 0; in ctcm_transmit_skb()
567 fsm_newstate(ch->fsm, CTC_STATE_TX); in ctcm_transmit_skb()
568 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch); in ctcm_transmit_skb()
569 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); in ctcm_transmit_skb()
570 ch->prof.send_stamp = jiffies; in ctcm_transmit_skb()
571 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx], in ctcm_transmit_skb()
572 (unsigned long)ch, 0xff, 0); in ctcm_transmit_skb()
573 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); in ctcm_transmit_skb()
575 ch->prof.doios_single++; in ctcm_transmit_skb()
577 fsm_deltimer(&ch->timer); in ctcm_transmit_skb()
578 ctcm_ccw_check_rc(ch, rc, "single skb TX"); in ctcm_transmit_skb()
580 skb_dequeue_tail(&ch->io_queue); in ctcm_transmit_skb()
587 struct net_device *dev = ch->netdev; in ctcm_transmit_skb()
593 ctcm_clear_busy(ch->netdev); in ctcm_transmit_skb()
604 struct channel *ch; in ctcmpc_send_sweep_req() local
609 ch = priv->channel[CTCM_WRITE]; in ctcmpc_send_sweep_req()
639 header->sw.th_last_seq = ch->th_seq_num; in ctcmpc_send_sweep_req()
646 skb_queue_tail(&ch->sweep_queue, sweep_skb); in ctcmpc_send_sweep_req()
648 fsm_addtimer(&ch->sweep_timer, 100, CTC_EVENT_RSWEEP_TIMER, ch); in ctcmpc_send_sweep_req()
663 static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb) in ctcmpc_transmit_skb() argument
666 struct net_device *dev = ch->netdev; in ctcmpc_transmit_skb()
677 __func__, dev->name, smp_processor_id(), ch, in ctcmpc_transmit_skb()
678 ch->id, fsm_getstate_str(ch->fsm)); in ctcmpc_transmit_skb()
680 if ((fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) || grp->in_sweep) { in ctcmpc_transmit_skb()
681 spin_lock_irqsave(&ch->collect_lock, saveflags); in ctcmpc_transmit_skb()
686 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcmpc_transmit_skb()
707 skb_queue_tail(&ch->collect_queue, skb); in ctcmpc_transmit_skb()
708 ch->collect_len += skb->len; in ctcmpc_transmit_skb()
711 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcmpc_transmit_skb()
757 if (ch->collect_len > 0) { in ctcmpc_transmit_skb()
758 spin_lock_irqsave(&ch->collect_lock, saveflags); in ctcmpc_transmit_skb()
759 skb_queue_tail(&ch->collect_queue, skb); in ctcmpc_transmit_skb()
760 ch->collect_len += skb->len; in ctcmpc_transmit_skb()
761 skb = skb_dequeue(&ch->collect_queue); in ctcmpc_transmit_skb()
762 ch->collect_len -= skb->len; in ctcmpc_transmit_skb()
763 spin_unlock_irqrestore(&ch->collect_lock, saveflags); in ctcmpc_transmit_skb()
769 ch->prof.txlen += skb->len - PDU_HEADER_LENGTH; in ctcmpc_transmit_skb()
779 ch->th_seq_num++; in ctcmpc_transmit_skb()
780 header->th_seq_num = ch->th_seq_num; in ctcmpc_transmit_skb()
783 __func__, dev->name, ch->th_seq_num); in ctcmpc_transmit_skb()
795 ch->ccw[4].count = skb->len; in ctcmpc_transmit_skb()
796 if (set_normalized_cda(&ch->ccw[4], skb->data)) { in ctcmpc_transmit_skb()
801 if (ctcm_checkalloc_buffer(ch)) { in ctcmpc_transmit_skb()
809 skb_reset_tail_pointer(ch->trans_skb); in ctcmpc_transmit_skb()
810 ch->trans_skb->len = 0; in ctcmpc_transmit_skb()
811 ch->ccw[1].count = skb->len; in ctcmpc_transmit_skb()
812 memcpy(skb_put(ch->trans_skb, skb->len), skb->data, skb->len); in ctcmpc_transmit_skb()
818 __func__, dev->name, ch->trans_skb->len); in ctcmpc_transmit_skb()
819 CTCM_D3_DUMP((char *)ch->trans_skb->data, in ctcmpc_transmit_skb()
820 min_t(int, 32, ch->trans_skb->len)); in ctcmpc_transmit_skb()
822 skb_queue_tail(&ch->io_queue, skb); in ctcmpc_transmit_skb()
825 ch->retry = 0; in ctcmpc_transmit_skb()
826 fsm_newstate(ch->fsm, CTC_STATE_TX); in ctcmpc_transmit_skb()
827 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch); in ctcmpc_transmit_skb()
830 ctcmpc_dumpit((char *)&ch->ccw[ccw_idx], in ctcmpc_transmit_skb()
833 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); in ctcmpc_transmit_skb()
834 ch->prof.send_stamp = jiffies; in ctcmpc_transmit_skb()
835 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx], in ctcmpc_transmit_skb()
836 (unsigned long)ch, 0xff, 0); in ctcmpc_transmit_skb()
837 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); in ctcmpc_transmit_skb()
839 ch->prof.doios_single++; in ctcmpc_transmit_skb()
841 fsm_deltimer(&ch->timer); in ctcmpc_transmit_skb()
842 ctcm_ccw_check_rc(ch, rc, "single skb TX"); in ctcmpc_transmit_skb()
844 skb_dequeue_tail(&ch->io_queue); in ctcmpc_transmit_skb()
849 if (ch->th_seq_num > 0xf0000000) /* Chose at random. */ in ctcmpc_transmit_skb()
850 ctcmpc_send_sweep_req(ch); in ctcmpc_transmit_skb()
856 CTCM_FUNTAIL, ch->id); in ctcmpc_transmit_skb()
1201 struct channel *ch; in ctcm_irq_handler() local
1233 ch = priv->channel[CTCM_READ]; in ctcm_irq_handler()
1235 ch = priv->channel[CTCM_WRITE]; in ctcm_irq_handler()
1245 dev = ch->netdev; in ctcm_irq_handler()
1249 __func__, ch); in ctcm_irq_handler()
1255 memcpy(ch->irb, irb, sizeof(struct irb)); in ctcm_irq_handler()
1259 fsm_event(ch->fsm, CTC_EVENT_SC_UNKNOWN, ch); in ctcm_irq_handler()
1262 CTCM_FUNTAIL, dev->name, ch->id, cstat, dstat); in ctcm_irq_handler()
1270 if ((irb->ecw[0] & ch->sense_rc) == 0) in ctcm_irq_handler()
1274 CTCM_FUNTAIL, ch->id, irb->ecw[0], dstat); in ctcm_irq_handler()
1275 ccw_unit_check(ch, irb->ecw[0]); in ctcm_irq_handler()
1280 fsm_event(ch->fsm, CTC_EVENT_ATTNBUSY, ch); in ctcm_irq_handler()
1282 fsm_event(ch->fsm, CTC_EVENT_BUSY, ch); in ctcm_irq_handler()
1286 fsm_event(ch->fsm, CTC_EVENT_ATTN, ch); in ctcm_irq_handler()
1293 fsm_event(ch->fsm, CTC_EVENT_FINSTAT, ch); in ctcm_irq_handler()
1295 fsm_event(ch->fsm, CTC_EVENT_IRQ, ch); in ctcm_irq_handler()
1354 struct channel *ch; in add_channel() local
1362 ch = kzalloc(sizeof(struct channel), GFP_KERNEL); in add_channel()
1363 if (ch == NULL) in add_channel()
1366 ch->protocol = priv->protocol; in add_channel()
1368 ch->discontact_th = kzalloc(TH_HEADER_LENGTH, gfp_type()); in add_channel()
1369 if (ch->discontact_th == NULL) in add_channel()
1372 ch->discontact_th->th_blk_flag = TH_DISCONTACT; in add_channel()
1373 tasklet_init(&ch->ch_disc_tasklet, in add_channel()
1374 mpc_action_send_discontact, (unsigned long)ch); in add_channel()
1376 tasklet_init(&ch->ch_tasklet, ctcmpc_bh, (unsigned long)ch); in add_channel()
1377 ch->max_bufsize = (MPC_BUFSIZE_DEFAULT - 35); in add_channel()
1382 ch->ccw = kzalloc(ccw_num * sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); in add_channel()
1383 if (ch->ccw == NULL) in add_channel()
1386 ch->cdev = cdev; in add_channel()
1387 snprintf(ch->id, CTCM_ID_SIZE, "ch-%s", dev_name(&cdev->dev)); in add_channel()
1388 ch->type = type; in add_channel()
1433 ch->ccw[6].cmd_code = CCW_CMD_SET_EXTENDED; in add_channel()
1434 ch->ccw[6].flags = CCW_FLAG_SLI; in add_channel()
1436 ch->ccw[7].cmd_code = CCW_CMD_NOOP; in add_channel()
1437 ch->ccw[7].flags = CCW_FLAG_SLI; in add_channel()
1440 ch->ccw[15].cmd_code = CCW_CMD_WRITE; in add_channel()
1441 ch->ccw[15].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in add_channel()
1442 ch->ccw[15].count = TH_HEADER_LENGTH; in add_channel()
1443 ch->ccw[15].cda = virt_to_phys(ch->discontact_th); in add_channel()
1445 ch->ccw[16].cmd_code = CCW_CMD_NOOP; in add_channel()
1446 ch->ccw[16].flags = CCW_FLAG_SLI; in add_channel()
1448 ch->fsm = init_fsm(ch->id, ctc_ch_state_names, in add_channel()
1453 ch->fsm = init_fsm(ch->id, ctc_ch_state_names, in add_channel()
1458 if (ch->fsm == NULL) in add_channel()
1461 fsm_newstate(ch->fsm, CTC_STATE_IDLE); in add_channel()
1463 ch->irb = kzalloc(sizeof(struct irb), GFP_KERNEL); in add_channel()
1464 if (ch->irb == NULL) in add_channel()
1467 while (*c && ctcm_less_than((*c)->id, ch->id)) in add_channel()
1470 if (*c && (!strncmp((*c)->id, ch->id, CTCM_ID_SIZE))) { in add_channel()
1478 spin_lock_init(&ch->collect_lock); in add_channel()
1480 fsm_settimer(ch->fsm, &ch->timer); in add_channel()
1481 skb_queue_head_init(&ch->io_queue); in add_channel()
1482 skb_queue_head_init(&ch->collect_queue); in add_channel()
1485 fsm_settimer(ch->fsm, &ch->sweep_timer); in add_channel()
1486 skb_queue_head_init(&ch->sweep_queue); in add_channel()
1488 ch->next = *c; in add_channel()
1489 *c = ch; in add_channel()
1496 kfree(ch->ccw); in add_channel()
1497 kfree(ch->discontact_th); in add_channel()
1498 kfree_fsm(ch->fsm); in add_channel()
1499 kfree(ch->irb); in add_channel()
1500 kfree(ch); in add_channel()