Lines Matching defs:hvcsd
296 static int hvcs_get_pi(struct hvcs_struct *hvcsd);
299 static void hvcs_partner_free(struct hvcs_struct *hvcsd);
317 struct hvcs_struct *hvcsd = from_vio_dev(viod);
321 spin_lock_irqsave(&hvcsd->lock, flags);
322 retval = sprintf(buf, "%X\n", hvcsd->p_unit_address);
323 spin_unlock_irqrestore(&hvcsd->lock, flags);
331 struct hvcs_struct *hvcsd = from_vio_dev(viod);
335 spin_lock_irqsave(&hvcsd->lock, flags);
336 retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
337 spin_unlock_irqrestore(&hvcsd->lock, flags);
356 struct hvcs_struct *hvcsd = from_vio_dev(viod);
360 spin_lock_irqsave(&hvcsd->lock, flags);
361 retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
362 spin_unlock_irqrestore(&hvcsd->lock, flags);
373 struct hvcs_struct *hvcsd = from_vio_dev(viod);
380 spin_lock_irqsave(&hvcsd->lock, flags);
382 if (hvcsd->port.count > 0) {
383 spin_unlock_irqrestore(&hvcsd->lock, flags);
389 if (hvcsd->connected == 0) {
390 spin_unlock_irqrestore(&hvcsd->lock, flags);
396 hvcs_partner_free(hvcsd);
399 hvcsd->vdev->unit_address,
400 hvcsd->p_unit_address,
401 (uint32_t)hvcsd->p_partition_ID);
403 spin_unlock_irqrestore(&hvcsd->lock, flags);
410 struct hvcs_struct *hvcsd = from_vio_dev(viod);
414 spin_lock_irqsave(&hvcsd->lock, flags);
415 retval = sprintf(buf, "%d\n", hvcsd->connected);
416 spin_unlock_irqrestore(&hvcsd->lock, flags);
425 struct hvcs_struct *hvcsd = from_vio_dev(viod);
429 spin_lock_irqsave(&hvcsd->lock, flags);
430 retval = sprintf(buf, "%d\n", hvcsd->index);
431 spin_unlock_irqrestore(&hvcsd->lock, flags);
487 struct hvcs_struct *hvcsd = tty->driver_data;
490 spin_lock_irqsave(&hvcsd->lock, flags);
491 hvcsd->todo_mask |= HVCS_SCHED_READ;
492 spin_unlock_irqrestore(&hvcsd->lock, flags);
498 struct hvcs_struct *hvcsd = tty->driver_data;
501 spin_lock_irqsave(&hvcsd->lock, flags);
502 vio_disable_interrupts(hvcsd->vdev);
503 spin_unlock_irqrestore(&hvcsd->lock, flags);
513 struct hvcs_struct *hvcsd = dev_instance;
515 spin_lock(&hvcsd->lock);
516 vio_disable_interrupts(hvcsd->vdev);
517 hvcsd->todo_mask |= HVCS_SCHED_READ;
518 spin_unlock(&hvcsd->lock);
524 /* This function must be called with the hvcsd->lock held */
525 static void hvcs_try_write(struct hvcs_struct *hvcsd)
527 uint32_t unit_address = hvcsd->vdev->unit_address;
528 struct tty_struct *tty = hvcsd->port.tty;
531 if (hvcsd->todo_mask & HVCS_TRY_WRITE) {
534 &hvcsd->buffer[0],
535 hvcsd->chars_in_buffer );
537 hvcsd->chars_in_buffer = 0;
539 hvcsd->todo_mask &= ~(HVCS_TRY_WRITE);
555 static int hvcs_io(struct hvcs_struct *hvcsd)
563 spin_lock_irqsave(&hvcsd->lock, flags);
565 unit_address = hvcsd->vdev->unit_address;
566 tty = hvcsd->port.tty;
568 hvcs_try_write(hvcsd);
571 hvcsd->todo_mask &= ~(HVCS_READ_MASK);
573 } else if (!(hvcsd->todo_mask & (HVCS_READ_MASK)))
577 hvcsd->todo_mask &= ~(HVCS_READ_MASK);
579 if (tty_buffer_request_room(&hvcsd->port, HVCS_BUFF_LEN) >= HVCS_BUFF_LEN) {
583 tty_insert_flip_string(&hvcsd->port, buf, got);
588 hvcsd->todo_mask |= HVCS_QUICK_READ;
590 spin_unlock_irqrestore(&hvcsd->lock, flags);
593 tty_flip_buffer_push(&hvcsd->port);
596 spin_lock_irqsave(&hvcsd->lock, flags);
597 vio_enable_interrupts(hvcsd->vdev);
598 spin_unlock_irqrestore(&hvcsd->lock, flags);
601 return hvcsd->todo_mask;
604 spin_unlock_irqrestore(&hvcsd->lock, flags);
605 return hvcsd->todo_mask;
610 struct hvcs_struct *hvcsd;
621 list_for_each_entry(hvcsd, &hvcs_structs, next) {
622 hvcs_todo_mask |= hvcs_io(hvcsd);
666 struct hvcs_struct *hvcsd = container_of(p, struct hvcs_struct, port);
672 spin_lock_irqsave(&hvcsd->lock, flags);
674 comp = hvcsd->destroyed;
676 list_del(&(hvcsd->next));
678 if (hvcsd->connected == 1) {
679 hvcs_partner_free(hvcsd);
682 hvcsd->vdev->unit_address,
683 hvcsd->p_unit_address,
684 (uint32_t)hvcsd->p_partition_ID);
687 hvcsd->vdev->unit_address);
689 vdev = hvcsd->vdev;
690 hvcsd->vdev = NULL;
692 hvcsd->p_unit_address = 0;
693 hvcsd->p_partition_ID = 0;
694 hvcsd->destroyed = NULL;
695 hvcs_return_index(hvcsd->index);
696 memset(&hvcsd->p_location_code[0], 0x00, HVCS_CLC_LENGTH + 1);
698 spin_unlock_irqrestore(&hvcsd->lock, flags);
701 kfree(hvcsd);
732 struct hvcs_struct *hvcsd;
753 hvcsd = kzalloc(sizeof(*hvcsd), GFP_KERNEL);
754 if (!hvcsd)
757 tty_port_init(&hvcsd->port);
758 hvcsd->port.ops = &hvcs_port_ops;
759 spin_lock_init(&hvcsd->lock);
761 hvcsd->vdev = dev;
762 dev_set_drvdata(&dev->dev, hvcsd);
764 hvcsd->index = index;
766 /* hvcsd->index = ++hvcs_struct_count; */
767 hvcsd->chars_in_buffer = 0;
768 hvcsd->todo_mask = 0;
769 hvcsd->connected = 0;
775 if (hvcs_get_pi(hvcsd)) {
778 hvcsd->vdev->unit_address);
787 list_add_tail(&(hvcsd->next), &hvcs_structs);
801 struct hvcs_struct *hvcsd = dev_get_drvdata(&dev->dev);
808 spin_lock_irqsave(&hvcsd->lock, flags);
810 hvcsd->destroyed = ∁
811 tty = tty_port_tty_get(&hvcsd->port);
813 spin_unlock_irqrestore(&hvcsd->lock, flags);
824 tty_port_put(&hvcsd->port);
842 static void hvcs_set_pi(struct hvcs_partner_info *pi, struct hvcs_struct *hvcsd)
844 hvcsd->p_unit_address = pi->unit_address;
845 hvcsd->p_partition_ID = pi->partition_ID;
848 strscpy(hvcsd->p_location_code, pi->location_code,
849 sizeof(hvcsd->p_location_code));
858 * partner info then hvcsd->p_* will hold the last partner info data from the
863 * This function must be called with the hvcsd->lock held.
865 static int hvcs_get_pi(struct hvcs_struct *hvcsd)
868 uint32_t unit_address = hvcsd->vdev->unit_address;
886 hvcsd->p_unit_address = 0;
887 hvcsd->p_partition_ID = 0;
890 hvcs_set_pi(pi, hvcsd);
902 struct hvcs_struct *hvcsd;
907 list_for_each_entry(hvcsd, &hvcs_structs, next) {
908 spin_lock_irqsave(&hvcsd->lock, flags);
909 hvcs_get_pi(hvcsd);
910 spin_unlock_irqrestore(&hvcsd->lock, flags);
921 * the hvcsd->lock held.
923 static int hvcs_has_pi(struct hvcs_struct *hvcsd)
925 if ((!hvcsd->p_unit_address) || (!hvcsd->p_partition_ID))
934 * This function must be called with the hvcsd->lock held.
936 static int hvcs_partner_connect(struct hvcs_struct *hvcsd)
939 unsigned int unit_address = hvcsd->vdev->unit_address;
949 hvcsd->p_partition_ID,
950 hvcsd->p_unit_address);
952 hvcsd->connected = 1;
961 if (hvcs_get_pi(hvcsd))
964 if (!hvcs_has_pi(hvcsd))
968 hvcsd->p_partition_ID,
969 hvcsd->p_unit_address);
971 hvcsd->connected = 1;
986 /* This function must be called with the hvcsd->lock held */
987 static void hvcs_partner_free(struct hvcs_struct *hvcsd)
991 retval = hvcs_free_connection(hvcsd->vdev->unit_address);
993 hvcsd->connected = 0;
996 /* This helper function must be called WITHOUT the hvcsd->lock held */
997 static int hvcs_enable_device(struct hvcs_struct *hvcsd, uint32_t unit_address,
1007 rc = request_irq(irq, &hvcs_handle_interrupt, 0, "ibmhvcs", hvcsd);
1018 free_irq(irq, hvcsd);
1024 spin_lock_irqsave(&hvcsd->lock, flags);
1025 hvcs_partner_free(hvcsd);
1026 spin_unlock_irqrestore(&hvcsd->lock, flags);
1041 struct hvcs_struct *hvcsd;
1045 list_for_each_entry(hvcsd, &hvcs_structs, next) {
1046 spin_lock_irqsave(&hvcsd->lock, flags);
1047 if (hvcsd->index == index) {
1048 tty_port_get(&hvcsd->port);
1049 spin_unlock_irqrestore(&hvcsd->lock, flags);
1051 return hvcsd;
1053 spin_unlock_irqrestore(&hvcsd->lock, flags);
1062 struct hvcs_struct *hvcsd;
1072 hvcsd = hvcs_get_by_index(tty->index);
1073 if (!hvcsd) {
1079 spin_lock_irqsave(&hvcsd->lock, flags);
1081 if (hvcsd->connected == 0) {
1082 retval = hvcs_partner_connect(hvcsd);
1084 spin_unlock_irqrestore(&hvcsd->lock, flags);
1090 hvcsd->port.count = 0;
1091 hvcsd->port.tty = tty;
1092 tty->driver_data = hvcsd;
1094 memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1100 irq = hvcsd->vdev->irq;
1101 vdev = hvcsd->vdev;
1102 unit_address = hvcsd->vdev->unit_address;
1104 hvcsd->todo_mask |= HVCS_SCHED_READ;
1105 spin_unlock_irqrestore(&hvcsd->lock, flags);
1111 retval = hvcs_enable_device(hvcsd, unit_address, irq, vdev);
1117 retval = tty_port_install(&hvcsd->port, driver, tty);
1123 spin_lock_irqsave(&hvcsd->lock, flags);
1124 vio_disable_interrupts(hvcsd->vdev);
1125 spin_unlock_irqrestore(&hvcsd->lock, flags);
1126 free_irq(irq, hvcsd);
1128 tty_port_put(&hvcsd->port);
1139 struct hvcs_struct *hvcsd = tty->driver_data;
1142 spin_lock_irqsave(&hvcsd->lock, flags);
1143 hvcsd->port.count++;
1144 hvcsd->todo_mask |= HVCS_SCHED_READ;
1145 spin_unlock_irqrestore(&hvcsd->lock, flags);
1150 hvcsd->vdev->unit_address );
1157 struct hvcs_struct *hvcsd;
1176 hvcsd = tty->driver_data;
1178 spin_lock_irqsave(&hvcsd->lock, flags);
1179 if (hvcsd->port.count == 0) {
1180 spin_unlock_irqrestore(&hvcsd->lock, flags);
1182 } else if (--hvcsd->port.count == 0) {
1184 vio_disable_interrupts(hvcsd->vdev);
1191 hvcsd->port.tty = NULL;
1193 irq = hvcsd->vdev->irq;
1194 spin_unlock_irqrestore(&hvcsd->lock, flags);
1198 free_irq(irq, hvcsd);
1200 } else if (hvcsd->port.count < 0) {
1202 hvcsd->vdev->unit_address, hvcsd->port.count);
1205 spin_unlock_irqrestore(&hvcsd->lock, flags);
1210 struct hvcs_struct *hvcsd = tty->driver_data;
1219 tty_port_put(&hvcsd->port);
1224 struct hvcs_struct *hvcsd = tty->driver_data;
1228 spin_lock_irqsave(&hvcsd->lock, flags);
1235 vio_disable_interrupts(hvcsd->vdev);
1237 hvcsd->todo_mask = 0;
1238 hvcsd->port.tty = NULL;
1239 hvcsd->port.count = 0;
1243 memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1244 hvcsd->chars_in_buffer = 0;
1246 irq = hvcsd->vdev->irq;
1248 spin_unlock_irqrestore(&hvcsd->lock, flags);
1250 free_irq(irq, hvcsd);
1262 struct hvcs_struct *hvcsd = tty->driver_data;
1274 if (!hvcsd)
1286 spin_lock_irqsave(&hvcsd->lock, flags);
1294 if (hvcsd->port.count <= 0) {
1295 spin_unlock_irqrestore(&hvcsd->lock, flags);
1299 unit_address = hvcsd->vdev->unit_address;
1303 (HVCS_BUFF_LEN - hvcsd->chars_in_buffer));
1311 memcpy(&hvcsd->buffer[hvcsd->chars_in_buffer],
1315 hvcsd->chars_in_buffer += tosend;
1324 if (!(hvcsd->todo_mask & HVCS_TRY_WRITE))
1327 &hvcsd->buffer[0],
1328 hvcsd->chars_in_buffer);
1331 * Since we know we have enough room in hvcsd->buffer for
1338 hvcsd->todo_mask |= HVCS_TRY_WRITE;
1343 hvcsd->chars_in_buffer = 0;
1352 spin_unlock_irqrestore(&hvcsd->lock, flags);
1367 struct hvcs_struct *hvcsd = tty->driver_data;
1369 if (!hvcsd || hvcsd->port.count <= 0)
1372 return HVCS_BUFF_LEN - hvcsd->chars_in_buffer;
1377 struct hvcs_struct *hvcsd = tty->driver_data;
1379 return hvcsd->chars_in_buffer;