diff options
Diffstat (limited to 'drivers/sn')
-rw-r--r-- | drivers/sn/ioc4.c | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/drivers/sn/ioc4.c b/drivers/sn/ioc4.c index cdeff909403e..8256a97eb508 100644 --- a/drivers/sn/ioc4.c +++ b/drivers/sn/ioc4.c | |||
@@ -160,9 +160,6 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) | |||
160 | writel(0, &idd->idd_misc_regs->int_out.raw); | 160 | writel(0, &idd->idd_misc_regs->int_out.raw); |
161 | mmiowb(); | 161 | mmiowb(); |
162 | 162 | ||
163 | printk(KERN_INFO | ||
164 | "%s: Calibrating PCI bus speed " | ||
165 | "for pci_dev %s ... ", __FUNCTION__, pci_name(idd->idd_pdev)); | ||
166 | /* Set up square wave */ | 163 | /* Set up square wave */ |
167 | int_out.raw = 0; | 164 | int_out.raw = 0; |
168 | int_out.fields.count = IOC4_CALIBRATE_COUNT; | 165 | int_out.fields.count = IOC4_CALIBRATE_COUNT; |
@@ -206,11 +203,16 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) | |||
206 | /* Bounds check the result. */ | 203 | /* Bounds check the result. */ |
207 | if (period > IOC4_CALIBRATE_LOW_LIMIT || | 204 | if (period > IOC4_CALIBRATE_LOW_LIMIT || |
208 | period < IOC4_CALIBRATE_HIGH_LIMIT) { | 205 | period < IOC4_CALIBRATE_HIGH_LIMIT) { |
209 | printk("failed. Assuming PCI clock ticks are %d ns.\n", | 206 | printk(KERN_INFO |
207 | "IOC4 %s: Clock calibration failed. Assuming" | ||
208 | "PCI clock is %d ns.\n", | ||
209 | pci_name(idd->idd_pdev), | ||
210 | IOC4_CALIBRATE_DEFAULT / IOC4_EXTINT_COUNT_DIVISOR); | 210 | IOC4_CALIBRATE_DEFAULT / IOC4_EXTINT_COUNT_DIVISOR); |
211 | period = IOC4_CALIBRATE_DEFAULT; | 211 | period = IOC4_CALIBRATE_DEFAULT; |
212 | } else { | 212 | } else { |
213 | printk("succeeded. PCI clock ticks are %ld ns.\n", | 213 | printk(KERN_DEBUG |
214 | "IOC4 %s: PCI clock is %ld ns.\n", | ||
215 | pci_name(idd->idd_pdev), | ||
214 | period / IOC4_EXTINT_COUNT_DIVISOR); | 216 | period / IOC4_EXTINT_COUNT_DIVISOR); |
215 | } | 217 | } |
216 | 218 | ||
@@ -222,6 +224,51 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) | |||
222 | idd->count_period = period; | 224 | idd->count_period = period; |
223 | } | 225 | } |
224 | 226 | ||
227 | /* There are three variants of IOC4 cards: IO9, IO10, and PCI-RT. | ||
228 | * Each brings out different combinations of IOC4 signals, thus. | ||
229 | * the IOC4 subdrivers need to know to which we're attached. | ||
230 | * | ||
231 | * We look for the presence of a SCSI (IO9) or SATA (IO10) controller | ||
232 | * on the same PCI bus at slot number 3 to differentiate IO9 from IO10. | ||
233 | * If neither is present, it's a PCI-RT. | ||
234 | */ | ||
235 | static unsigned int | ||
236 | ioc4_variant(struct ioc4_driver_data *idd) | ||
237 | { | ||
238 | struct pci_dev *pdev = NULL; | ||
239 | int found = 0; | ||
240 | |||
241 | /* IO9: Look for a QLogic ISP 12160 at the same bus and slot 3. */ | ||
242 | do { | ||
243 | pdev = pci_get_device(PCI_VENDOR_ID_QLOGIC, | ||
244 | PCI_DEVICE_ID_QLOGIC_ISP12160, pdev); | ||
245 | if (pdev && | ||
246 | idd->idd_pdev->bus->number == pdev->bus->number && | ||
247 | 3 == PCI_SLOT(pdev->devfn)) | ||
248 | found = 1; | ||
249 | pci_dev_put(pdev); | ||
250 | } while (pdev && !found); | ||
251 | if (NULL != pdev) | ||
252 | return IOC4_VARIANT_IO9; | ||
253 | |||
254 | /* IO10: Look for a Vitesse VSC 7174 at the same bus and slot 3. */ | ||
255 | pdev = NULL; | ||
256 | do { | ||
257 | pdev = pci_get_device(PCI_VENDOR_ID_VITESSE, | ||
258 | PCI_DEVICE_ID_VITESSE_VSC7174, pdev); | ||
259 | if (pdev && | ||
260 | idd->idd_pdev->bus->number == pdev->bus->number && | ||
261 | 3 == PCI_SLOT(pdev->devfn)) | ||
262 | found = 1; | ||
263 | pci_dev_put(pdev); | ||
264 | } while (pdev && !found); | ||
265 | if (NULL != pdev) | ||
266 | return IOC4_VARIANT_IO10; | ||
267 | |||
268 | /* PCI-RT: No SCSI/SATA controller will be present */ | ||
269 | return IOC4_VARIANT_PCI_RT; | ||
270 | } | ||
271 | |||
225 | /* Adds a new instance of an IOC4 card */ | 272 | /* Adds a new instance of an IOC4 card */ |
226 | static int | 273 | static int |
227 | ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) | 274 | ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) |
@@ -286,6 +333,13 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) | |||
286 | 333 | ||
287 | /* Failsafe portion of per-IOC4 initialization */ | 334 | /* Failsafe portion of per-IOC4 initialization */ |
288 | 335 | ||
336 | /* Detect card variant */ | ||
337 | idd->idd_variant = ioc4_variant(idd); | ||
338 | printk(KERN_INFO "IOC4 %s: %s card detected.\n", pci_name(pdev), | ||
339 | idd->idd_variant == IOC4_VARIANT_IO9 ? "IO9" : | ||
340 | idd->idd_variant == IOC4_VARIANT_PCI_RT ? "PCI-RT" : | ||
341 | idd->idd_variant == IOC4_VARIANT_IO10 ? "IO10" : "unknown"); | ||
342 | |||
289 | /* Initialize IOC4 */ | 343 | /* Initialize IOC4 */ |
290 | pci_read_config_dword(idd->idd_pdev, PCI_COMMAND, &pcmd); | 344 | pci_read_config_dword(idd->idd_pdev, PCI_COMMAND, &pcmd); |
291 | pci_write_config_dword(idd->idd_pdev, PCI_COMMAND, | 345 | pci_write_config_dword(idd->idd_pdev, PCI_COMMAND, |