diff options
Diffstat (limited to 'drivers/scsi/aic7xxx/aic79xx_proc.c')
-rw-r--r-- | drivers/scsi/aic7xxx/aic79xx_proc.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c index 32be1f55998c..39a27840fce6 100644 --- a/drivers/scsi/aic7xxx/aic79xx_proc.c +++ b/drivers/scsi/aic7xxx/aic79xx_proc.c | |||
@@ -53,6 +53,49 @@ static void ahd_dump_device_state(struct info_str *info, | |||
53 | static int ahd_proc_write_seeprom(struct ahd_softc *ahd, | 53 | static int ahd_proc_write_seeprom(struct ahd_softc *ahd, |
54 | char *buffer, int length); | 54 | char *buffer, int length); |
55 | 55 | ||
56 | /* | ||
57 | * Table of syncrates that don't follow the "divisible by 4" | ||
58 | * rule. This table will be expanded in future SCSI specs. | ||
59 | */ | ||
60 | static struct { | ||
61 | u_int period_factor; | ||
62 | u_int period; /* in 100ths of ns */ | ||
63 | } scsi_syncrates[] = { | ||
64 | { 0x08, 625 }, /* FAST-160 */ | ||
65 | { 0x09, 1250 }, /* FAST-80 */ | ||
66 | { 0x0a, 2500 }, /* FAST-40 40MHz */ | ||
67 | { 0x0b, 3030 }, /* FAST-40 33MHz */ | ||
68 | { 0x0c, 5000 } /* FAST-20 */ | ||
69 | }; | ||
70 | |||
71 | /* | ||
72 | * Return the frequency in kHz corresponding to the given | ||
73 | * sync period factor. | ||
74 | */ | ||
75 | static u_int | ||
76 | ahd_calc_syncsrate(u_int period_factor) | ||
77 | { | ||
78 | int i; | ||
79 | int num_syncrates; | ||
80 | |||
81 | num_syncrates = sizeof(scsi_syncrates) / sizeof(scsi_syncrates[0]); | ||
82 | /* See if the period is in the "exception" table */ | ||
83 | for (i = 0; i < num_syncrates; i++) { | ||
84 | |||
85 | if (period_factor == scsi_syncrates[i].period_factor) { | ||
86 | /* Period in kHz */ | ||
87 | return (100000000 / scsi_syncrates[i].period); | ||
88 | } | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * Wasn't in the table, so use the standard | ||
93 | * 4 times conversion. | ||
94 | */ | ||
95 | return (10000000 / (period_factor * 4 * 10)); | ||
96 | } | ||
97 | |||
98 | |||
56 | static void | 99 | static void |
57 | copy_mem_info(struct info_str *info, char *data, int len) | 100 | copy_mem_info(struct info_str *info, char *data, int len) |
58 | { | 101 | { |
@@ -109,7 +152,7 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) | |||
109 | speed = 3300; | 152 | speed = 3300; |
110 | freq = 0; | 153 | freq = 0; |
111 | if (tinfo->offset != 0) { | 154 | if (tinfo->offset != 0) { |
112 | freq = aic_calc_syncsrate(tinfo->period); | 155 | freq = ahd_calc_syncsrate(tinfo->period); |
113 | speed = freq; | 156 | speed = freq; |
114 | } | 157 | } |
115 | speed *= (0x01 << tinfo->width); | 158 | speed *= (0x01 << tinfo->width); |