Lines Matching defs:hvcsd
302 static int hvcs_has_pi(struct hvcs_struct *hvcsd);
304 struct hvcs_struct *hvcsd);
305 static int hvcs_get_pi(struct hvcs_struct *hvcsd);
308 static int hvcs_partner_connect(struct hvcs_struct *hvcsd);
309 static void hvcs_partner_free(struct hvcs_struct *hvcsd);
311 static int hvcs_enable_device(struct hvcs_struct *hvcsd,
339 struct hvcs_struct *hvcsd = from_vio_dev(viod);
343 spin_lock_irqsave(&hvcsd->lock, flags);
344 retval = sprintf(buf, "%X\n", hvcsd->p_unit_address);
345 spin_unlock_irqrestore(&hvcsd->lock, flags);
353 struct hvcs_struct *hvcsd = from_vio_dev(viod);
357 spin_lock_irqsave(&hvcsd->lock, flags);
358 retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
359 spin_unlock_irqrestore(&hvcsd->lock, flags);
378 struct hvcs_struct *hvcsd = from_vio_dev(viod);
382 spin_lock_irqsave(&hvcsd->lock, flags);
383 retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
384 spin_unlock_irqrestore(&hvcsd->lock, flags);
395 struct hvcs_struct *hvcsd = from_vio_dev(viod);
402 spin_lock_irqsave(&hvcsd->lock, flags);
404 if (hvcsd->port.count > 0) {
405 spin_unlock_irqrestore(&hvcsd->lock, flags);
411 if (hvcsd->connected == 0) {
412 spin_unlock_irqrestore(&hvcsd->lock, flags);
418 hvcs_partner_free(hvcsd);
421 hvcsd->vdev->unit_address,
422 hvcsd->p_unit_address,
423 (uint32_t)hvcsd->p_partition_ID);
425 spin_unlock_irqrestore(&hvcsd->lock, flags);
432 struct hvcs_struct *hvcsd = from_vio_dev(viod);
436 spin_lock_irqsave(&hvcsd->lock, flags);
437 retval = sprintf(buf, "%d\n", hvcsd->connected);
438 spin_unlock_irqrestore(&hvcsd->lock, flags);
447 struct hvcs_struct *hvcsd = from_vio_dev(viod);
451 spin_lock_irqsave(&hvcsd->lock, flags);
452 retval = sprintf(buf, "%d\n", hvcsd->index);
453 spin_unlock_irqrestore(&hvcsd->lock, flags);
504 struct hvcs_struct *hvcsd = tty->driver_data;
507 spin_lock_irqsave(&hvcsd->lock, flags);
508 hvcsd->todo_mask |= HVCS_SCHED_READ;
509 spin_unlock_irqrestore(&hvcsd->lock, flags);
515 struct hvcs_struct *hvcsd = tty->driver_data;
518 spin_lock_irqsave(&hvcsd->lock, flags);
519 vio_disable_interrupts(hvcsd->vdev);
520 spin_unlock_irqrestore(&hvcsd->lock, flags);
530 struct hvcs_struct *hvcsd = dev_instance;
532 spin_lock(&hvcsd->lock);
533 vio_disable_interrupts(hvcsd->vdev);
534 hvcsd->todo_mask |= HVCS_SCHED_READ;
535 spin_unlock(&hvcsd->lock);
541 /* This function must be called with the hvcsd->lock held */
542 static void hvcs_try_write(struct hvcs_struct *hvcsd)
544 uint32_t unit_address = hvcsd->vdev->unit_address;
545 struct tty_struct *tty = hvcsd->port.tty;
548 if (hvcsd->todo_mask & HVCS_TRY_WRITE) {
551 &hvcsd->buffer[0],
552 hvcsd->chars_in_buffer );
554 hvcsd->chars_in_buffer = 0;
556 hvcsd->todo_mask &= ~(HVCS_TRY_WRITE);
572 static int hvcs_io(struct hvcs_struct *hvcsd)
580 spin_lock_irqsave(&hvcsd->lock, flags);
582 unit_address = hvcsd->vdev->unit_address;
583 tty = hvcsd->port.tty;
585 hvcs_try_write(hvcsd);
588 hvcsd->todo_mask &= ~(HVCS_READ_MASK);
590 } else if (!(hvcsd->todo_mask & (HVCS_READ_MASK)))
594 hvcsd->todo_mask &= ~(HVCS_READ_MASK);
596 if (tty_buffer_request_room(&hvcsd->port, HVCS_BUFF_LEN) >= HVCS_BUFF_LEN) {
600 tty_insert_flip_string(&hvcsd->port, buf, got);
605 hvcsd->todo_mask |= HVCS_QUICK_READ;
607 spin_unlock_irqrestore(&hvcsd->lock, flags);
610 tty_flip_buffer_push(&hvcsd->port);
614 spin_lock_irqsave(&hvcsd->lock, flags);
615 vio_enable_interrupts(hvcsd->vdev);
616 spin_unlock_irqrestore(&hvcsd->lock, flags);
619 return hvcsd->todo_mask;
622 spin_unlock_irqrestore(&hvcsd->lock, flags);
623 return hvcsd->todo_mask;
628 struct hvcs_struct *hvcsd;
639 list_for_each_entry(hvcsd, &hvcs_structs, next) {
640 hvcs_todo_mask |= hvcs_io(hvcsd);
684 struct hvcs_struct *hvcsd = container_of(p, struct hvcs_struct, port);
689 spin_lock_irqsave(&hvcsd->lock, flags);
692 list_del(&(hvcsd->next));
694 if (hvcsd->connected == 1) {
695 hvcs_partner_free(hvcsd);
698 hvcsd->vdev->unit_address,
699 hvcsd->p_unit_address,
700 (uint32_t)hvcsd->p_partition_ID);
703 hvcsd->vdev->unit_address);
705 vdev = hvcsd->vdev;
706 hvcsd->vdev = NULL;
708 hvcsd->p_unit_address = 0;
709 hvcsd->p_partition_ID = 0;
710 hvcs_return_index(hvcsd->index);
711 memset(&hvcsd->p_location_code[0], 0x00, HVCS_CLC_LENGTH + 1);
713 spin_unlock_irqrestore(&hvcsd->lock, flags);
718 kfree(hvcsd);
747 struct hvcs_struct *hvcsd;
769 hvcsd = kzalloc(sizeof(*hvcsd), GFP_KERNEL);
770 if (!hvcsd)
773 tty_port_init(&hvcsd->port);
774 hvcsd->port.ops = &hvcs_port_ops;
775 spin_lock_init(&hvcsd->lock);
777 hvcsd->vdev = dev;
778 dev_set_drvdata(&dev->dev, hvcsd);
780 hvcsd->index = index;
782 /* hvcsd->index = ++hvcs_struct_count; */
783 hvcsd->chars_in_buffer = 0;
784 hvcsd->todo_mask = 0;
785 hvcsd->connected = 0;
791 if (hvcs_get_pi(hvcsd)) {
794 hvcsd->vdev->unit_address);
803 list_add_tail(&(hvcsd->next), &hvcs_structs);
809 hvcsd->vdev->unit_address);
824 struct hvcs_struct *hvcsd = dev_get_drvdata(&dev->dev);
828 if (!hvcsd)
833 spin_lock_irqsave(&hvcsd->lock, flags);
835 tty = hvcsd->port.tty;
837 spin_unlock_irqrestore(&hvcsd->lock, flags);
843 tty_port_put(&hvcsd->port);
866 static void hvcs_set_pi(struct hvcs_partner_info *pi, struct hvcs_struct *hvcsd)
868 hvcsd->p_unit_address = pi->unit_address;
869 hvcsd->p_partition_ID = pi->partition_ID;
872 strlcpy(hvcsd->p_location_code, pi->location_code,
873 sizeof(hvcsd->p_location_code));
882 * partner info then hvcsd->p_* will hold the last partner info data from the
887 * This function must be called with the hvcsd->lock held.
889 static int hvcs_get_pi(struct hvcs_struct *hvcsd)
892 uint32_t unit_address = hvcsd->vdev->unit_address;
910 hvcsd->p_unit_address = 0;
911 hvcsd->p_partition_ID = 0;
914 hvcs_set_pi(pi, hvcsd);
926 struct hvcs_struct *hvcsd;
931 list_for_each_entry(hvcsd, &hvcs_structs, next) {
932 spin_lock_irqsave(&hvcsd->lock, flags);
933 hvcs_get_pi(hvcsd);
934 spin_unlock_irqrestore(&hvcsd->lock, flags);
945 * the hvcsd->lock held.
947 static int hvcs_has_pi(struct hvcs_struct *hvcsd)
949 if ((!hvcsd->p_unit_address) || (!hvcsd->p_partition_ID))
958 * This function must be called with the hvcsd->lock held.
960 static int hvcs_partner_connect(struct hvcs_struct *hvcsd)
963 unsigned int unit_address = hvcsd->vdev->unit_address;
973 hvcsd->p_partition_ID,
974 hvcsd->p_unit_address);
976 hvcsd->connected = 1;
985 if (hvcs_get_pi(hvcsd))
988 if (!hvcs_has_pi(hvcsd))
992 hvcsd->p_partition_ID,
993 hvcsd->p_unit_address);
995 hvcsd->connected = 1;
1010 /* This function must be called with the hvcsd->lock held */
1011 static void hvcs_partner_free(struct hvcs_struct *hvcsd)
1015 retval = hvcs_free_connection(hvcsd->vdev->unit_address);
1017 hvcsd->connected = 0;
1020 /* This helper function must be called WITHOUT the hvcsd->lock held */
1021 static int hvcs_enable_device(struct hvcs_struct *hvcsd, uint32_t unit_address,
1031 rc = request_irq(irq, &hvcs_handle_interrupt, 0, "ibmhvcs", hvcsd);
1042 free_irq(irq, hvcsd);
1048 spin_lock_irqsave(&hvcsd->lock, flags);
1049 hvcs_partner_free(hvcsd);
1050 spin_unlock_irqrestore(&hvcsd->lock, flags);
1065 struct hvcs_struct *hvcsd;
1069 list_for_each_entry(hvcsd, &hvcs_structs, next) {
1070 spin_lock_irqsave(&hvcsd->lock, flags);
1071 if (hvcsd->index == index) {
1072 tty_port_get(&hvcsd->port);
1073 spin_unlock_irqrestore(&hvcsd->lock, flags);
1075 return hvcsd;
1077 spin_unlock_irqrestore(&hvcsd->lock, flags);
1086 struct hvcs_struct *hvcsd;
1096 hvcsd = hvcs_get_by_index(tty->index);
1097 if (!hvcsd) {
1103 spin_lock_irqsave(&hvcsd->lock, flags);
1105 if (hvcsd->connected == 0) {
1106 retval = hvcs_partner_connect(hvcsd);
1108 spin_unlock_irqrestore(&hvcsd->lock, flags);
1114 hvcsd->port.count = 0;
1115 hvcsd->port.tty = tty;
1116 tty->driver_data = hvcsd;
1118 memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1124 irq = hvcsd->vdev->irq;
1125 vdev = hvcsd->vdev;
1126 unit_address = hvcsd->vdev->unit_address;
1128 hvcsd->todo_mask |= HVCS_SCHED_READ;
1129 spin_unlock_irqrestore(&hvcsd->lock, flags);
1135 retval = hvcs_enable_device(hvcsd, unit_address, irq, vdev);
1141 retval = tty_port_install(&hvcsd->port, driver, tty);
1147 spin_lock_irqsave(&hvcsd->lock, flags);
1148 vio_disable_interrupts(hvcsd->vdev);
1149 spin_unlock_irqrestore(&hvcsd->lock, flags);
1150 free_irq(irq, hvcsd);
1152 tty_port_put(&hvcsd->port);
1163 struct hvcs_struct *hvcsd = tty->driver_data;
1166 spin_lock_irqsave(&hvcsd->lock, flags);
1167 hvcsd->port.count++;
1168 hvcsd->todo_mask |= HVCS_SCHED_READ;
1169 spin_unlock_irqrestore(&hvcsd->lock, flags);
1174 hvcsd->vdev->unit_address );
1181 struct hvcs_struct *hvcsd;
1200 hvcsd = tty->driver_data;
1202 spin_lock_irqsave(&hvcsd->lock, flags);
1203 if (--hvcsd->port.count == 0) {
1205 vio_disable_interrupts(hvcsd->vdev);
1212 hvcsd->port.tty = NULL;
1214 irq = hvcsd->vdev->irq;
1215 spin_unlock_irqrestore(&hvcsd->lock, flags);
1219 free_irq(irq, hvcsd);
1221 } else if (hvcsd->port.count < 0) {
1223 hvcsd->vdev->unit_address, hvcsd->port.count);
1226 spin_unlock_irqrestore(&hvcsd->lock, flags);
1231 struct hvcs_struct *hvcsd = tty->driver_data;
1240 tty_port_put(&hvcsd->port);
1245 struct hvcs_struct *hvcsd = tty->driver_data;
1250 spin_lock_irqsave(&hvcsd->lock, flags);
1252 temp_open_count = hvcsd->port.count;
1259 vio_disable_interrupts(hvcsd->vdev);
1261 hvcsd->todo_mask = 0;
1265 hvcsd->port.tty = NULL;
1267 hvcsd->port.count = 0;
1271 memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1272 hvcsd->chars_in_buffer = 0;
1274 irq = hvcsd->vdev->irq;
1276 spin_unlock_irqrestore(&hvcsd->lock, flags);
1278 free_irq(irq, hvcsd);
1292 tty_port_put(&hvcsd->port);
1306 struct hvcs_struct *hvcsd = tty->driver_data;
1318 if (!hvcsd)
1330 spin_lock_irqsave(&hvcsd->lock, flags);
1338 if (hvcsd->port.count <= 0) {
1339 spin_unlock_irqrestore(&hvcsd->lock, flags);
1343 unit_address = hvcsd->vdev->unit_address;
1346 tosend = min(count, (HVCS_BUFF_LEN - hvcsd->chars_in_buffer));
1354 memcpy(&hvcsd->buffer[hvcsd->chars_in_buffer],
1358 hvcsd->chars_in_buffer += tosend;
1367 if (!(hvcsd->todo_mask & HVCS_TRY_WRITE))
1370 &hvcsd->buffer[0],
1371 hvcsd->chars_in_buffer);
1374 * Since we know we have enough room in hvcsd->buffer for
1381 hvcsd->todo_mask |= HVCS_TRY_WRITE;
1386 hvcsd->chars_in_buffer = 0;
1395 spin_unlock_irqrestore(&hvcsd->lock, flags);
1410 struct hvcs_struct *hvcsd = tty->driver_data;
1412 if (!hvcsd || hvcsd->port.count <= 0)
1415 return HVCS_BUFF_LEN - hvcsd->chars_in_buffer;
1420 struct hvcs_struct *hvcsd = tty->driver_data;
1422 return hvcsd->chars_in_buffer;