diff options
Diffstat (limited to 'drivers/scsi/atari_NCR5380.c')
-rw-r--r-- | drivers/scsi/atari_NCR5380.c | 145 |
1 files changed, 60 insertions, 85 deletions
diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 2db79b469d9e..0f3cdbc80ba6 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c | |||
@@ -719,119 +719,94 @@ static void __init NCR5380_print_options(struct Scsi_Host *instance) | |||
719 | * Inputs : instance, pointer to this instance. | 719 | * Inputs : instance, pointer to this instance. |
720 | */ | 720 | */ |
721 | 721 | ||
722 | static void NCR5380_print_status(struct Scsi_Host *instance) | 722 | static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd) |
723 | { | 723 | { |
724 | char *pr_bfr; | 724 | int i, s; |
725 | char *start; | 725 | unsigned char *command; |
726 | int len; | 726 | printk("scsi%d: destination target %d, lun %d\n", |
727 | 727 | H_NO(cmd), cmd->device->id, cmd->device->lun); | |
728 | NCR_PRINT(NDEBUG_ANY); | 728 | printk(KERN_CONT " command = "); |
729 | NCR_PRINT_PHASE(NDEBUG_ANY); | 729 | command = cmd->cmnd; |
730 | 730 | printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]); | |
731 | pr_bfr = (char *)__get_free_page(GFP_ATOMIC); | 731 | for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) |
732 | if (!pr_bfr) { | 732 | printk(KERN_CONT " %02x", command[i]); |
733 | printk("NCR5380_print_status: no memory for print buffer\n"); | 733 | printk("\n"); |
734 | return; | ||
735 | } | ||
736 | len = NCR5380_proc_info(instance, pr_bfr, &start, 0, PAGE_SIZE, 0); | ||
737 | pr_bfr[len] = 0; | ||
738 | printk("\n%s\n", pr_bfr); | ||
739 | free_page((unsigned long)pr_bfr); | ||
740 | } | 734 | } |
741 | 735 | ||
742 | 736 | static void NCR5380_print_status(struct Scsi_Host *instance) | |
743 | /******************************************/ | ||
744 | /* | ||
745 | * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED] | ||
746 | * | ||
747 | * *buffer: I/O buffer | ||
748 | * **start: if inout == FALSE pointer into buffer where user read should start | ||
749 | * offset: current offset | ||
750 | * length: length of buffer | ||
751 | * hostno: Scsi_Host host_no | ||
752 | * inout: TRUE - user is writing; FALSE - user is reading | ||
753 | * | ||
754 | * Return the number of bytes read from or written | ||
755 | */ | ||
756 | |||
757 | #undef SPRINTF | ||
758 | #define SPRINTF(fmt,args...) \ | ||
759 | do { \ | ||
760 | if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ | ||
761 | pos += sprintf(pos, fmt , ## args); \ | ||
762 | } while(0) | ||
763 | static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length); | ||
764 | |||
765 | static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, | ||
766 | char **start, off_t offset, int length, int inout) | ||
767 | { | 737 | { |
768 | char *pos = buffer; | ||
769 | struct NCR5380_hostdata *hostdata; | 738 | struct NCR5380_hostdata *hostdata; |
770 | Scsi_Cmnd *ptr; | 739 | Scsi_Cmnd *ptr; |
771 | unsigned long flags; | 740 | unsigned long flags; |
772 | off_t begin = 0; | 741 | |
773 | #define check_offset() \ | 742 | NCR_PRINT(NDEBUG_ANY); |
774 | do { \ | 743 | NCR_PRINT_PHASE(NDEBUG_ANY); |
775 | if (pos - buffer < offset - begin) { \ | ||
776 | begin += pos - buffer; \ | ||
777 | pos = buffer; \ | ||
778 | } \ | ||
779 | } while (0) | ||
780 | 744 | ||
781 | hostdata = (struct NCR5380_hostdata *)instance->hostdata; | 745 | hostdata = (struct NCR5380_hostdata *)instance->hostdata; |
782 | 746 | ||
783 | if (inout) /* Has data been written to the file ? */ | 747 | printk("\nNCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); |
784 | return -ENOSYS; /* Currently this is a no-op */ | ||
785 | SPRINTF("NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); | ||
786 | check_offset(); | ||
787 | local_irq_save(flags); | 748 | local_irq_save(flags); |
788 | SPRINTF("NCR5380: coroutine is%s running.\n", | 749 | printk("NCR5380: coroutine is%s running.\n", |
789 | main_running ? "" : "n't"); | 750 | main_running ? "" : "n't"); |
790 | check_offset(); | ||
791 | if (!hostdata->connected) | 751 | if (!hostdata->connected) |
792 | SPRINTF("scsi%d: no currently connected command\n", HOSTNO); | 752 | printk("scsi%d: no currently connected command\n", HOSTNO); |
793 | else | 753 | else |
794 | pos = lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, | 754 | lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected); |
795 | pos, buffer, length); | 755 | printk("scsi%d: issue_queue\n", HOSTNO); |
796 | SPRINTF("scsi%d: issue_queue\n", HOSTNO); | 756 | for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) |
797 | check_offset(); | 757 | lprint_Scsi_Cmnd(ptr); |
798 | for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) { | ||
799 | pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); | ||
800 | check_offset(); | ||
801 | } | ||
802 | 758 | ||
803 | SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); | 759 | printk("scsi%d: disconnected_queue\n", HOSTNO); |
804 | check_offset(); | ||
805 | for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; | 760 | for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; |
806 | ptr = NEXT(ptr)) { | 761 | ptr = NEXT(ptr)) |
807 | pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); | 762 | lprint_Scsi_Cmnd(ptr); |
808 | check_offset(); | ||
809 | } | ||
810 | 763 | ||
811 | local_irq_restore(flags); | 764 | local_irq_restore(flags); |
812 | *start = buffer + (offset - begin); | 765 | printk("\n"); |
813 | if (pos - buffer < offset - begin) | ||
814 | return 0; | ||
815 | else if (pos - buffer - (offset - begin) < length) | ||
816 | return pos - buffer - (offset - begin); | ||
817 | return length; | ||
818 | } | 766 | } |
819 | 767 | ||
820 | static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length) | 768 | static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m) |
821 | { | 769 | { |
822 | int i, s; | 770 | int i, s; |
823 | unsigned char *command; | 771 | unsigned char *command; |
824 | SPRINTF("scsi%d: destination target %d, lun %d\n", | 772 | seq_printf(m, "scsi%d: destination target %d, lun %d\n", |
825 | H_NO(cmd), cmd->device->id, cmd->device->lun); | 773 | H_NO(cmd), cmd->device->id, cmd->device->lun); |
826 | SPRINTF(" command = "); | 774 | seq_printf(m, " command = "); |
827 | command = cmd->cmnd; | 775 | command = cmd->cmnd; |
828 | SPRINTF("%2d (0x%02x)", command[0], command[0]); | 776 | seq_printf(m, "%2d (0x%02x)", command[0], command[0]); |
829 | for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) | 777 | for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) |
830 | SPRINTF(" %02x", command[i]); | 778 | seq_printf(m, " %02x", command[i]); |
831 | SPRINTF("\n"); | 779 | seq_printf(m, "\n"); |
832 | return pos; | ||
833 | } | 780 | } |
834 | 781 | ||
782 | static int NCR5380_show_info(struct seq_file *m, struct Scsi_Host *instance) | ||
783 | { | ||
784 | struct NCR5380_hostdata *hostdata; | ||
785 | Scsi_Cmnd *ptr; | ||
786 | unsigned long flags; | ||
787 | |||
788 | hostdata = (struct NCR5380_hostdata *)instance->hostdata; | ||
789 | |||
790 | seq_printf(m, "NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); | ||
791 | local_irq_save(flags); | ||
792 | seq_printf(m, "NCR5380: coroutine is%s running.\n", | ||
793 | main_running ? "" : "n't"); | ||
794 | if (!hostdata->connected) | ||
795 | seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO); | ||
796 | else | ||
797 | show_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m); | ||
798 | seq_printf(m, "scsi%d: issue_queue\n", HOSTNO); | ||
799 | for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) | ||
800 | show_Scsi_Cmnd(ptr, m); | ||
801 | |||
802 | seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO); | ||
803 | for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; | ||
804 | ptr = NEXT(ptr)) | ||
805 | show_Scsi_Cmnd(ptr, m); | ||
806 | |||
807 | local_irq_restore(flags); | ||
808 | return 0; | ||
809 | } | ||
835 | 810 | ||
836 | /* | 811 | /* |
837 | * Function : void NCR5380_init (struct Scsi_Host *instance) | 812 | * Function : void NCR5380_init (struct Scsi_Host *instance) |