]>
Commit | Line | Data |
---|---|---|
9e5a6bf4 | 1 | diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.c linux-2.6.1-rc2/drivers/message/fusion/mptbase.c |
2 | --- linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.c 2004-01-06 14:17:58.000000000 -0700 | |
3 | +++ linux-2.6.1-rc2/drivers/message/fusion/mptbase.c 2004-01-06 15:01:27.803311992 -0700 | |
4 | @@ -167,6 +167,7 @@ | |
5 | static MPT_EVHANDLER MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS]; | |
6 | /* Reset handler lookup table */ | |
7 | static MPT_RESETHANDLER MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS]; | |
8 | +static MPT_DVHANDLER MptDvHandler[MPT_MAX_PROTOCOL_DRIVERS]; | |
9 | ||
10 | static int FusionInitCalled = 0; | |
11 | static int mpt_base_index = -1; | |
12 | @@ -183,7 +184,6 @@ | |
13 | static int mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply); | |
14 | ||
15 | static int mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag); | |
16 | -static int mpt_adapter_install(struct pci_dev *pdev); | |
17 | static void mpt_detect_bound_ports(MPT_ADAPTER *this, struct pci_dev *pdev); | |
18 | static void mpt_adapter_disable(MPT_ADAPTER *ioc, int freeup); | |
19 | static void mpt_adapter_dispose(MPT_ADAPTER *ioc); | |
20 | @@ -232,8 +232,11 @@ | |
21 | static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); | |
22 | static void mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info); | |
23 | ||
24 | -int fusion_init(void); | |
25 | -static void fusion_exit(void); | |
26 | +/* module entry point */ | |
27 | +static int __devinit mptbase_probe (struct pci_dev *, const struct pci_device_id *); | |
28 | +static void __devexit mptbase_remove(struct pci_dev *); | |
29 | +static int __init fusion_init (void); | |
30 | +static void __exit fusion_exit (void); | |
31 | ||
32 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
33 | /* | |
34 | @@ -260,6 +263,80 @@ | |
35 | ||
36 | #endif | |
37 | ||
38 | +/**************************************************************************** | |
39 | + * Supported hardware | |
40 | + */ | |
41 | +#define DEVT_INDEX_MPT 0x0000 /* Fusion MPT Interface */ | |
42 | + | |
43 | +static struct pci_device_id mptbase_pci_table[] = { | |
44 | + { | |
45 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
46 | + .device = PCI_DEVICE_ID_LSI_FC909, | |
47 | + .subvendor = PCI_ANY_ID, | |
48 | + .subdevice = PCI_ANY_ID, | |
49 | + .class = PCI_CLASS_SERIAL_FIBER << 8, | |
50 | + .class_mask = 0xFFFF00, | |
51 | + .driver_data = DEVT_INDEX_MPT | |
52 | + }, | |
53 | + { | |
54 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
55 | + .device = PCI_DEVICE_ID_LSI_FC929, | |
56 | + .subvendor = PCI_ANY_ID, | |
57 | + .subdevice = PCI_ANY_ID, | |
58 | + .class = PCI_CLASS_SERIAL_FIBER << 8, | |
59 | + .class_mask = 0xFFFF00, | |
60 | + .driver_data = DEVT_INDEX_MPT | |
61 | + }, | |
62 | + { | |
63 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
64 | + .device = PCI_DEVICE_ID_LSI_FC919, | |
65 | + .subvendor = PCI_ANY_ID, | |
66 | + .subdevice = PCI_ANY_ID, | |
67 | + .class = PCI_CLASS_SERIAL_FIBER << 8, | |
68 | + .class_mask = 0xFFFF00, | |
69 | + .driver_data = DEVT_INDEX_MPT | |
70 | + }, | |
71 | + { | |
72 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
73 | + .device = PCI_DEVICE_ID_LSI_FC929X, | |
74 | + .subvendor = PCI_ANY_ID, | |
75 | + .subdevice = PCI_ANY_ID, | |
76 | + .class = PCI_CLASS_SERIAL_FIBER << 8, | |
77 | + .class_mask = 0xFFFF00, | |
78 | + .driver_data = DEVT_INDEX_MPT | |
79 | + }, | |
80 | + { | |
81 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
82 | + .device = PCI_DEVICE_ID_LSI_FC919X, | |
83 | + .subvendor = PCI_ANY_ID, | |
84 | + .subdevice = PCI_ANY_ID, | |
85 | + .class = PCI_CLASS_SERIAL_FIBER << 8, | |
86 | + .class_mask = 0xFFFF00, | |
87 | + .driver_data = DEVT_INDEX_MPT | |
88 | + }, | |
89 | + { | |
90 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
91 | + .device = PCI_DEVICE_ID_LSI_53C1030, | |
92 | + .subvendor = PCI_ANY_ID, | |
93 | + .subdevice = PCI_ANY_ID, | |
94 | + .class = PCI_CLASS_STORAGE_SCSI << 8, | |
95 | + .class_mask = 0xFFFF00, | |
96 | + .driver_data = DEVT_INDEX_MPT | |
97 | + }, | |
98 | + { | |
99 | + .vendor = PCI_VENDOR_ID_LSI_LOGIC, | |
100 | + .device = PCI_DEVICE_ID_LSI_1030_53C1035, | |
101 | + .subvendor = PCI_ANY_ID, | |
102 | + .subdevice = PCI_ANY_ID, | |
103 | + .class = PCI_CLASS_STORAGE_SCSI << 8, | |
104 | + .class_mask = 0xFFFF00, | |
105 | + .driver_data = DEVT_INDEX_MPT | |
106 | + }, | |
107 | + {0} /* Terminating entry */ | |
108 | +}; | |
109 | +MODULE_DEVICE_TABLE(pci, mptbase_pci_table); | |
110 | + | |
111 | + | |
112 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
113 | /* 20000207 -sralston | |
114 | * GRRRRR... IOSpace (port i/o) register access (for the 909) is back! | |
115 | @@ -803,6 +880,36 @@ | |
116 | MptResetHandlers[cb_idx] = NULL; | |
117 | } | |
118 | ||
119 | + | |
120 | +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION | |
121 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
122 | +/** | |
123 | + * mpt_dv_register - Register protocol-specific domain validation handler. | |
124 | + */ | |
125 | +int mpt_dv_register(MPT_DVHANDLER dv_cbfunc, int cb_idx) | |
126 | +{ | |
127 | + if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) | |
128 | + return -1; | |
129 | + | |
130 | + MptDvHandler[cb_idx] = dv_cbfunc; | |
131 | + return 0; | |
132 | +} | |
133 | + | |
134 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
135 | +/** | |
136 | + * mpt_dv_deregister - Deregister protocol-specific domain validation handler. | |
137 | + */ | |
138 | +void | |
139 | +mpt_dv_deregister(int cb_idx) | |
140 | +{ | |
141 | + if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) | |
142 | + return; | |
143 | + | |
144 | + MptDvHandler[cb_idx] = NULL; | |
145 | +} | |
146 | +#endif | |
147 | + | |
148 | + | |
149 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
150 | /** | |
151 | * mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 1024) | |
152 | @@ -1142,88 +1249,6 @@ | |
153 | return next; | |
154 | } | |
155 | ||
156 | -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
157 | -/* | |
158 | - * mpt_pci_scan - Scan PCI devices for MPT adapters. | |
159 | - * | |
160 | - * Returns count of MPT adapters found, keying off of PCI vendor and | |
161 | - * device_id's. | |
162 | - */ | |
163 | -static int __init | |
164 | -mpt_pci_scan(void) | |
165 | -{ | |
166 | - struct pci_dev *pdev = NULL; | |
167 | - struct pci_dev *pdev2; | |
168 | - int found = 0; | |
169 | - int count = 0; | |
170 | - int r; | |
171 | - | |
172 | - dprintk((KERN_INFO MYNAM ": Checking for MPT adapters...\n")); | |
173 | - | |
174 | - /* | |
175 | - * NOTE: The 929, 929X, 1030 and 1035 will appear as 2 separate PCI devices, | |
176 | - * one for each channel. | |
177 | - */ | |
178 | - while ((pdev = pci_find_device(PCI_VENDOR_ID_LSI_LOGIC, PCI_ANY_ID, pdev)) != NULL) { | |
179 | - pdev2 = NULL; | |
180 | - if ((pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC909) && | |
181 | - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929) && | |
182 | - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919) && | |
183 | - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929X) && | |
184 | - (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919X) && | |
185 | - (pdev->device != MPI_MANUFACTPAGE_DEVID_53C1030) && | |
186 | - (pdev->device != MPI_MANUFACTPAGE_DEVID_1030_53C1035) && | |
187 | - 1) { | |
188 | - dprintk((KERN_INFO MYNAM ": Skipping LSI device=%04xh\n", pdev->device)); | |
189 | - continue; | |
190 | - } | |
191 | - | |
192 | - /* GRRRRR | |
193 | - * dual function devices (929, 929X, 1030, 1035) may be presented in Func 1,0 order, | |
194 | - * but we'd really really rather have them in Func 0,1 order. | |
195 | - * Do some kind of look ahead here... | |
196 | - */ | |
197 | - if (pdev->devfn & 1) { | |
198 | - pdev2 = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev); | |
199 | - if (pdev2 && (pdev2->vendor == 0x1000) && | |
200 | - (PCI_SLOT(pdev2->devfn) == PCI_SLOT(pdev->devfn)) && | |
201 | - (pdev2->device == pdev->device) && | |
202 | - (pdev2->bus->number == pdev->bus->number) && | |
203 | - !(pdev2->devfn & 1)) { | |
204 | - dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI bus/dfn=%02x/%02xh, class=%08x, id=%xh\n", | |
205 | - pdev2->bus->number, pdev2->devfn, pdev2->class, pdev2->device)); | |
206 | - found++; | |
207 | - if ((r = mpt_adapter_install(pdev2)) == 0) | |
208 | - count++; | |
209 | - } else { | |
210 | - pdev2 = NULL; | |
211 | - } | |
212 | - } | |
213 | - | |
214 | - dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI bus/dfn=%02x/%02xh, class=%08x, id=%xh\n", | |
215 | - pdev->bus->number, pdev->devfn, pdev->class, pdev->device)); | |
216 | - found++; | |
217 | - if ((r = mpt_adapter_install(pdev)) == 0) | |
218 | - count++; | |
219 | - | |
220 | - if (pdev2) | |
221 | - pdev = pdev2; | |
222 | - } | |
223 | - | |
224 | - printk(KERN_INFO MYNAM ": %d MPT adapter%s found, %d installed.\n", | |
225 | - found, (found==1) ? "" : "s", count); | |
226 | - | |
227 | - if (!found || !count) { | |
228 | - fusion_exit(); | |
229 | - return -ENODEV; | |
230 | - } | |
231 | - | |
232 | -#ifdef CONFIG_PROC_FS | |
233 | - (void) procmpt_create(); | |
234 | -#endif | |
235 | - | |
236 | - return count; | |
237 | -} | |
238 | ||
239 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
240 | /** | |
241 | @@ -1253,7 +1278,7 @@ | |
242 | ||
243 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
244 | /* | |
245 | - * mpt_adapter_install - Install a PCI intelligent MPT adapter. | |
246 | + * mptbase_probe - Install a PCI intelligent MPT adapter. | |
247 | * @pdev: Pointer to pci_dev structure | |
248 | * | |
249 | * This routine performs all the steps necessary to bring the IOC of | |
250 | @@ -1268,8 +1293,8 @@ | |
251 | * | |
252 | * TODO: Add support for polled controllers | |
253 | */ | |
254 | -static int __init | |
255 | -mpt_adapter_install(struct pci_dev *pdev) | |
256 | +static int | |
257 | +__devinit mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |
258 | { | |
259 | MPT_ADAPTER *ioc; | |
260 | u8 *mem; | |
261 | @@ -1292,6 +1317,13 @@ | |
262 | return r; | |
263 | } | |
264 | ||
265 | + if (!pci_set_consistent_dma_mask(pdev, mask)) | |
266 | + dprintk((KERN_INFO MYNAM | |
267 | + ": Using 64 bit consistent mask\n")); | |
268 | + else | |
269 | + dprintk((KERN_INFO MYNAM | |
270 | + ": Not using 64 bit consistent mask\n")); | |
271 | + | |
272 | ioc = kmalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); | |
273 | if (ioc == NULL) { | |
274 | printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); | |
275 | @@ -1500,6 +1532,7 @@ | |
276 | ioc->pci_irq = pdev->irq; | |
277 | ||
278 | pci_set_master(pdev); /* ?? */ | |
279 | + pci_set_drvdata(pdev, ioc); | |
280 | ||
281 | #ifndef __sparc__ | |
282 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq)); | |
283 | @@ -1525,6 +1558,146 @@ | |
284 | ||
285 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
286 | /* | |
287 | + * mptbase_remove - Remove a PCI intelligent MPT adapter. | |
288 | + * @pdev: Pointer to pci_dev structure | |
289 | + * | |
290 | + */ | |
291 | + | |
292 | +static void | |
293 | +__devexit mptbase_remove(struct pci_dev *pdev) | |
294 | +{ | |
295 | + mptscsih_sync_irq(pdev->irq); | |
296 | + pci_set_drvdata(pdev, NULL); | |
297 | +} | |
298 | + | |
299 | + | |
300 | +/************************************************************************** | |
301 | + * Power Management | |
302 | + */ | |
303 | +#ifdef CONFIG_PM | |
304 | +#include <acpi/acpi_drivers.h> | |
305 | + | |
306 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
307 | +/* | |
308 | + * mptbase_suspend - Fusion MPT base driver suspend routine. | |
309 | + * | |
310 | + * | |
311 | + */ | |
312 | +static int mptbase_suspend(struct pci_dev *pdev, u32 state) | |
313 | +{ | |
314 | + u32 device_state; | |
315 | + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | |
316 | + | |
317 | + switch(state) | |
318 | + { | |
319 | + case ACPI_STATE_S1: | |
320 | + device_state=ACPI_STATE_D1; | |
321 | + break; | |
322 | + case ACPI_STATE_S3: | |
323 | + case ACPI_STATE_S4: | |
324 | + device_state=ACPI_STATE_D3; | |
325 | + break; | |
326 | + default: | |
327 | + return -EAGAIN /*FIXME*/; | |
328 | + break; | |
329 | + } | |
330 | + | |
331 | + printk(MYIOC_s_INFO_FMT | |
332 | + "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n", | |
333 | + ioc->name, pdev, pci_name(pdev), device_state); | |
334 | + | |
335 | + pci_save_state(pdev, ioc->PciState); | |
336 | + | |
337 | + /* put ioc into READY_STATE */ | |
338 | + if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) { | |
339 | + printk(MYIOC_s_ERR_FMT | |
340 | + "pci-suspend: IOC msg unit reset failed!\n", ioc->name); | |
341 | + } | |
342 | + | |
343 | + /* disable interrupts */ | |
344 | + CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); | |
345 | + ioc->active = 0; | |
346 | + | |
347 | + /* Clear any lingering interrupt */ | |
348 | + CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); | |
349 | + | |
350 | + pci_disable_device(pdev); | |
351 | + pci_set_power_state(pdev, device_state); | |
352 | + | |
353 | + return 0; | |
354 | +} | |
355 | + | |
356 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
357 | +/* | |
358 | + * mptbase_resume - Fusion MPT base driver resume routine. | |
359 | + * | |
360 | + * | |
361 | + */ | |
362 | +static int mptbase_resume(struct pci_dev *pdev) | |
363 | +{ | |
364 | + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | |
365 | + u32 device_state = pdev->current_state; | |
366 | + int do_domain_validation_flag=0; | |
367 | + int recovery_state; | |
368 | + | |
369 | + printk(MYIOC_s_INFO_FMT | |
370 | + "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", | |
371 | + ioc->name, pdev, pci_name(pdev), device_state); | |
372 | + | |
373 | + pci_set_power_state(pdev, ACPI_STATE_D0); | |
374 | + pci_restore_state(pdev, ioc->PciState); | |
375 | + pci_enable_device(pdev); | |
376 | + | |
377 | + /* enable interrupts */ | |
378 | + CHIPREG_WRITE32(&ioc->chip->IntMask, ~(MPI_HIM_RIM)); | |
379 | + ioc->active = 1; | |
380 | + | |
381 | + /* F/W not running */ | |
382 | + if(!CHIPREG_READ32(&ioc->chip->Doorbell)) { | |
383 | + do_domain_validation_flag=1; | |
384 | + } | |
385 | + | |
386 | + printk(MYIOC_s_INFO_FMT | |
387 | + "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", | |
388 | + ioc->name, | |
389 | + (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), | |
390 | + CHIPREG_READ32(&ioc->chip->Doorbell)); | |
391 | + | |
392 | + /* bring ioc to operational state */ | |
393 | + if ((recovery_state = mpt_do_ioc_recovery(ioc, | |
394 | + MPT_HOSTEVENT_IOC_RECOVER, CAN_SLEEP)) != 0) { | |
395 | + printk(MYIOC_s_INFO_FMT | |
396 | + "pci-resume: Cannot recover, error:[%x]\n", | |
397 | + ioc->name, recovery_state); | |
398 | + } else { | |
399 | + printk(MYIOC_s_INFO_FMT | |
400 | + "pci-resume: success\n", ioc->name); | |
401 | + } | |
402 | + | |
403 | +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION | |
404 | + if(do_domain_validation_flag) { | |
405 | + int ii; | |
406 | + | |
407 | + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { | |
408 | + ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_NEED_DV; | |
409 | + } | |
410 | + | |
411 | + for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { | |
412 | + if(MptDvHandler[ii]) { | |
413 | + printk(MYIOC_s_INFO_FMT | |
414 | + "pci-resume: domain validation\n",ioc->name); | |
415 | + (*(MptDvHandler[ii]))(NULL); | |
416 | + } | |
417 | + } | |
418 | + } | |
419 | +#endif | |
420 | + return 0; | |
421 | +} | |
422 | + | |
423 | +#endif | |
424 | + | |
425 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
426 | +/* | |
427 | * mpt_do_ioc_recovery - Initialize or recover MPT adapter. | |
428 | * @ioc: Pointer to MPT adapter structure | |
429 | * @reason: Event word / reason | |
430 | @@ -5851,6 +6024,8 @@ | |
431 | EXPORT_SYMBOL(mpt_event_deregister); | |
432 | EXPORT_SYMBOL(mpt_reset_register); | |
433 | EXPORT_SYMBOL(mpt_reset_deregister); | |
434 | +EXPORT_SYMBOL(mpt_dv_register); | |
435 | +EXPORT_SYMBOL(mpt_dv_deregister); | |
436 | EXPORT_SYMBOL(mpt_get_msg_frame); | |
437 | EXPORT_SYMBOL(mpt_put_msg_frame); | |
438 | EXPORT_SYMBOL(mpt_free_msg_frame); | |
439 | @@ -5877,16 +6052,29 @@ | |
440 | EXPORT_SYMBOL(mpt_ASCQ_TableSz); | |
441 | EXPORT_SYMBOL(mpt_ScsiOpcodesPtr); | |
442 | ||
443 | + | |
444 | +static struct pci_driver mptbase_driver = { | |
445 | + .name = "mptbase", | |
446 | + .id_table = mptbase_pci_table, | |
447 | + .probe = mptbase_probe, | |
448 | + .remove = __devexit_p(mptbase_remove), | |
449 | +#ifdef CONFIG_PM | |
450 | + .suspend = mptbase_suspend, | |
451 | + .resume = mptbase_resume, | |
452 | +#endif | |
453 | +}; | |
454 | + | |
455 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
456 | /* | |
457 | * fusion_init - Fusion MPT base driver initialization routine. | |
458 | * | |
459 | * Returns 0 for success, non-zero for failure. | |
460 | */ | |
461 | -int __init | |
462 | -fusion_init(void) | |
463 | +static int | |
464 | +__init fusion_init(void) | |
465 | { | |
466 | int i; | |
467 | + int r; | |
468 | ||
469 | if (FusionInitCalled++) { | |
470 | dprintk((KERN_INFO MYNAM ": INFO - Driver late-init entry point called\n")); | |
471 | @@ -5920,10 +6108,13 @@ | |
472 | /* FIXME! */ | |
473 | } | |
474 | ||
475 | - if ((i = mpt_pci_scan()) < 0) | |
476 | - return i; | |
477 | + r = pci_module_init(&mptbase_driver); | |
478 | ||
479 | - return 0; | |
480 | +#ifdef CONFIG_PROC_FS | |
481 | + (void) procmpt_create(); | |
482 | +#endif | |
483 | + | |
484 | + return r; | |
485 | } | |
486 | ||
487 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
488 | @@ -5934,13 +6125,14 @@ | |
489 | * and removes all %MPT_PROCFS_MPTBASEDIR entries. | |
490 | */ | |
491 | static void | |
492 | -fusion_exit(void) | |
493 | +__exit fusion_exit(void) | |
494 | { | |
495 | MPT_ADAPTER *this; | |
496 | - struct pci_dev *pdev = NULL; | |
497 | ||
498 | dprintk((KERN_INFO MYNAM ": fusion_exit() called!\n")); | |
499 | ||
500 | + pci_unregister_driver(&mptbase_driver); | |
501 | + | |
502 | /* Whups? 20010120 -sralston | |
503 | * Moved this *above* removal of all MptAdapters! | |
504 | */ | |
505 | @@ -5956,9 +6148,6 @@ | |
506 | ||
507 | this->active = 0; | |
508 | ||
509 | - pdev = (struct pci_dev *)this->pcidev; | |
510 | - mptscsih_sync_irq(pdev->irq); | |
511 | - | |
512 | /* Clear any lingering interrupt */ | |
513 | CHIPREG_WRITE32(&this->chip->IntStatus, 0); | |
514 | ||
515 | @@ -5971,7 +6160,6 @@ | |
516 | mpt_reset_deregister(mpt_base_index); | |
517 | } | |
518 | ||
519 | -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
520 | ||
521 | module_init(fusion_init); | |
522 | module_exit(fusion_exit); | |
523 | diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.h linux-2.6.1-rc2/drivers/message/fusion/mptbase.h | |
524 | --- linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.h 2004-01-06 14:17:58.000000000 -0700 | |
525 | +++ linux-2.6.1-rc2/drivers/message/fusion/mptbase.h 2003-12-19 10:01:51.000000000 -0700 | |
526 | @@ -80,8 +80,8 @@ | |
527 | #define COPYRIGHT "Copyright (c) 1999-2003 " MODULEAUTHOR | |
528 | #endif | |
529 | ||
0affecb3 | 530 | -#define MPT_LINUX_VERSION_COMMON "2.05.00.06" |
531 | -#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-2.05.00.06" | |
9e5a6bf4 | 532 | +#define MPT_LINUX_VERSION_COMMON "3.00.00" |
533 | +#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.00.00" | |
534 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" | |
535 | ||
536 | #define show_mptmod_ver(s,ver) \ | |
537 | @@ -629,6 +629,9 @@ | |
538 | FCPortPage0_t fc_port_page0[2]; | |
539 | LANPage0_t lan_cnfg_page0; | |
540 | LANPage1_t lan_cnfg_page1; | |
541 | +#ifdef CONFIG_PM | |
542 | + u32 PciState[64]; /* save PCI state to this area */ | |
543 | +#endif | |
544 | u8 FirstWhoInit; | |
545 | u8 upload_fw; /* If set, do a fw upload */ | |
546 | u8 reload_fw; /* Force a FW Reload on next reset */ | |
547 | @@ -649,6 +652,7 @@ | |
548 | typedef int (*MPT_CALLBACK)(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply); | |
549 | typedef int (*MPT_EVHANDLER)(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply); | |
550 | typedef int (*MPT_RESETHANDLER)(MPT_ADAPTER *ioc, int reset_phase); | |
551 | +typedef void (*MPT_DVHANDLER)(void *arg); | |
552 | /* reset_phase defs */ | |
553 | #define MPT_IOC_PRE_RESET 0 | |
554 | #define MPT_IOC_POST_RESET 1 | |
555 | @@ -1001,6 +1005,8 @@ | |
556 | extern void mpt_event_deregister(int cb_idx); | |
557 | extern int mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func); | |
558 | extern void mpt_reset_deregister(int cb_idx); | |
559 | +extern int mpt_dv_register(MPT_DVHANDLER dv_cbfunc, int cb_idx); | |
560 | +extern void mpt_dv_deregister(int cb_idx); | |
561 | extern int mpt_register_ascqops_strings(void *ascqTable, int ascqtbl_sz, const char **opsTable); | |
562 | extern void mpt_deregister_ascqops_strings(void); | |
563 | extern MPT_FRAME_HDR *mpt_get_msg_frame(int handle, int iocid); | |
564 | diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.c linux-2.6.1-rc2/drivers/message/fusion/mptscsih.c | |
565 | --- linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.c 2004-01-06 14:17:58.000000000 -0700 | |
566 | +++ linux-2.6.1-rc2/drivers/message/fusion/mptscsih.c 2004-01-06 14:25:16.000000000 -0700 | |
567 | @@ -164,8 +164,8 @@ | |
568 | static MPT_FRAME_HDR *mptscsih_search_pendingQ(MPT_SCSI_HOST *hd, int scpnt_idx); | |
569 | static void post_pendingQ_commands(MPT_SCSI_HOST *hd); | |
570 | ||
571 | -static int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag); | |
572 | -static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag); | |
573 | +static int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag); | |
574 | +static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag); | |
575 | ||
576 | static int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); | |
577 | static int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); | |
578 | @@ -196,6 +196,12 @@ | |
579 | static int mptscsih_setup(char *str); | |
580 | static int mptscsih_halt(struct notifier_block *nb, ulong event, void *buf); | |
581 | ||
582 | +/* module entry point */ | |
583 | +static int __init mptscsih_init (void); | |
584 | +static void __exit mptscsih_exit (void); | |
585 | +int mptscsih_release(struct Scsi_Host *host); | |
586 | + | |
587 | + | |
588 | /* | |
589 | * Reboot Notification | |
590 | */ | |
591 | @@ -238,6 +244,34 @@ | |
592 | driver_setup = MPTSCSIH_DRIVER_SETUP; | |
593 | ||
594 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
595 | + | |
596 | +/* see mptscsih.h */ | |
597 | + | |
598 | +#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS | |
599 | +static Scsi_Host_Template driver_template = { | |
600 | + .proc_name = "mptscsih", | |
601 | + .proc_info = x_scsi_proc_info, | |
602 | + .name = "MPT SCSI Host", | |
603 | + .info = x_scsi_info, | |
604 | + .queuecommand = x_scsi_queuecommand, | |
605 | + .slave_alloc = x_scsi_slave_alloc, | |
606 | + .slave_configure = x_scsi_slave_configure, | |
607 | + .slave_destroy = x_scsi_slave_destroy, | |
608 | + .eh_abort_handler = x_scsi_abort, | |
609 | + .eh_device_reset_handler = x_scsi_dev_reset, | |
610 | + .eh_bus_reset_handler = x_scsi_bus_reset, | |
611 | + .eh_host_reset_handler = x_scsi_host_reset, | |
612 | + .bios_param = x_scsi_bios_param, | |
613 | + .can_queue = MPT_SCSI_CAN_QUEUE, | |
614 | + .this_id = -1, | |
615 | + .sg_tablesize = MPT_SCSI_SG_DEPTH, | |
616 | + .max_sectors = MPT_SCSI_MAX_SECTORS, | |
617 | + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, | |
618 | + .use_clustering = ENABLE_CLUSTERING, | |
619 | +}; | |
620 | +#endif | |
621 | + | |
622 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
623 | /* | |
624 | * Private inline routines... | |
625 | */ | |
626 | @@ -264,12 +298,14 @@ | |
627 | mptscsih_io_direction(Scsi_Cmnd *cmd) | |
628 | { | |
629 | switch (cmd->cmnd[0]) { | |
630 | - case WRITE_6: | |
631 | - case WRITE_10: | |
632 | + case WRITE_6: | |
633 | + case WRITE_10: | |
634 | + case WRITE_16: | |
635 | return SCSI_DATA_WRITE; | |
636 | break; | |
637 | - case READ_6: | |
638 | - case READ_10: | |
639 | + case READ_6: | |
640 | + case READ_10: | |
641 | + case READ_16: | |
642 | return SCSI_DATA_READ; | |
643 | break; | |
644 | } | |
645 | @@ -280,6 +316,7 @@ | |
646 | switch (cmd->cmnd[0]) { | |
647 | /* _DATA_OUT commands */ | |
648 | case WRITE_6: case WRITE_10: case WRITE_12: | |
649 | + case WRITE_16: | |
650 | case WRITE_LONG: case WRITE_SAME: case WRITE_BUFFER: | |
651 | case WRITE_VERIFY: case WRITE_VERIFY_12: | |
652 | case COMPARE: case COPY: case COPY_VERIFY: | |
653 | @@ -826,6 +863,13 @@ | |
654 | sc->resid = sc->request_bufflen - xfer_cnt; | |
655 | dprintk((KERN_NOTICE " SET sc->resid=%02xh\n", sc->resid)); | |
656 | ||
657 | + if(sc->underflow > xfer_cnt) { | |
658 | + printk(MYIOC_s_INFO_FMT | |
659 | + "SCSI data underrun: underflow=%02x, xfercnt=%02x\n", | |
660 | + ioc->name, sc->underflow, xfer_cnt); | |
661 | + sc->result = DID_SOFT_ERROR << 16; | |
662 | + } | |
663 | + | |
664 | /* Report Queue Full | |
665 | */ | |
666 | if (sc->result == MPI_SCSI_STATUS_TASK_SET_FULL) | |
9e5a6bf4 | 667 | @@ -1275,7 +1320,6 @@ |
668 | mem = (u8 *) hd->ChainToChain; | |
669 | } | |
670 | memset(mem, 0xFF, sz); | |
671 | - | |
672 | sz = num_chain * hd->ioc->req_sz; | |
673 | if (hd->ChainBuffer == NULL) { | |
674 | /* Allocate free chain buffer pool | |
675 | @@ -1357,18 +1401,13 @@ | |
676 | /* SCSI host fops start here... */ | |
677 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
678 | /** | |
679 | - * mptscsih_detect - Register MPT adapter(s) as SCSI host(s) with | |
680 | + * mptscsih_init - Register MPT adapter(s) as SCSI host(s) with | |
681 | * linux scsi mid-layer. | |
682 | - * @tpnt: Pointer to Scsi_Host_Template structure | |
683 | * | |
684 | - * (linux Scsi_Host_Template.detect routine) | |
685 | - * | |
686 | - * Returns number of SCSI host adapters that were successfully | |
687 | - * registered with the linux scsi mid-layer via the scsi_register() | |
688 | - * API call. | |
689 | + * Returns 0 for success, non-zero for failure. | |
690 | */ | |
691 | -int | |
692 | -mptscsih_detect(Scsi_Host_Template *tpnt) | |
693 | +static int | |
694 | +__init mptscsih_init(void) | |
695 | { | |
696 | struct Scsi_Host *sh = NULL; | |
697 | MPT_SCSI_HOST *hd = NULL; | |
698 | @@ -1387,6 +1426,12 @@ | |
699 | ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSCSIH_DRIVER); | |
700 | ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, MPTSCSIH_DRIVER); | |
701 | ||
702 | +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION | |
703 | + if(mpt_dv_register(mptscsih_domainValidation, MPTSCSIH_DRIVER) != 0 ) { | |
704 | + dprintk((KERN_INFO MYNAM | |
705 | + ": failed to register dv callback\n")); | |
706 | + } | |
707 | +#endif | |
708 | if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) { | |
709 | dprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n")); | |
710 | } else { | |
711 | @@ -1431,14 +1476,17 @@ | |
712 | continue; | |
713 | } | |
714 | ||
715 | - tpnt->proc_info = mptscsih_proc_info; | |
716 | - sh = scsi_register(tpnt, sizeof(MPT_SCSI_HOST)); | |
717 | + sh = scsi_host_alloc(&driver_template, sizeof(MPT_SCSI_HOST)); | |
718 | if (sh != NULL) { | |
719 | spin_lock_irqsave(&this->FreeQlock, flags); | |
720 | sh->io_port = 0; | |
721 | sh->n_io_port = 0; | |
722 | sh->irq = 0; | |
723 | ||
724 | + /* set 16 byte cdb's | |
725 | + */ | |
726 | + sh->max_cmd_len = 16; | |
727 | + | |
728 | /* Yikes! This is important! | |
729 | * Otherwise, by default, linux | |
730 | * only scans target IDs 0-7! | |
731 | @@ -1634,7 +1682,7 @@ | |
732 | hd->ioc->spi_data.forceDv = 0; | |
733 | for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) | |
734 | hd->ioc->spi_data.dvStatus[ii] = MPT_SCSICFG_NEGOTIATE; | |
735 | - | |
736 | + | |
737 | if (hd->negoNvram == 0) { | |
738 | for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) | |
739 | hd->ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_DV_NOT_DONE; | |
740 | @@ -1649,6 +1697,10 @@ | |
741 | } | |
742 | ||
743 | mpt_scsi_hosts++; | |
744 | + | |
745 | + scsi_add_host (sh, &this->pcidev->dev); | |
746 | + scsi_scan_host(sh); | |
747 | + | |
748 | } | |
749 | ||
750 | } /* for each adapter port */ | |
751 | @@ -1657,24 +1709,62 @@ | |
752 | } | |
753 | ||
754 | done: | |
755 | - if (mpt_scsi_hosts > 0) | |
756 | + if (mpt_scsi_hosts > 0) { | |
757 | register_reboot_notifier(&mptscsih_notifier); | |
758 | - else { | |
759 | + return 0; | |
760 | + } else { | |
761 | mpt_reset_deregister(ScsiDoneCtx); | |
762 | dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n")); | |
763 | ||
764 | mpt_event_deregister(ScsiDoneCtx); | |
765 | dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n")); | |
766 | ||
767 | +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION | |
768 | + mpt_dv_deregister(MPTSCSIH_DRIVER); | |
769 | +#endif | |
770 | mpt_deregister(ScsiScanDvCtx); | |
771 | mpt_deregister(ScsiTaskCtx); | |
772 | mpt_deregister(ScsiDoneCtx); | |
773 | ||
774 | if (info_kbuf != NULL) | |
775 | kfree(info_kbuf); | |
776 | + | |
777 | + return -EBUSY; | |
778 | } | |
779 | ||
780 | - return mpt_scsi_hosts; | |
781 | +} | |
782 | + | |
783 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
784 | +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
785 | +/** | |
786 | + * mptscsih_exit - Unregisters MPT adapter(s) | |
787 | + * | |
788 | + */ | |
789 | +static void | |
790 | +__exit mptscsih_exit(void) | |
791 | +{ | |
792 | + MPT_ADAPTER *this; | |
793 | + struct Scsi_Host *sh = NULL; | |
794 | + | |
795 | + this = mpt_adapter_find_first(); | |
796 | + while (this != NULL) { | |
797 | + | |
798 | + if (this->last_state != MPI_IOC_STATE_OPERATIONAL) { | |
799 | + this = mpt_adapter_find_next(this); | |
800 | + continue; | |
801 | + } | |
802 | + | |
803 | + sh = this->sh; | |
804 | + if( sh == NULL ) { | |
805 | + continue; | |
806 | + } | |
807 | + | |
808 | + scsi_remove_host(sh); | |
809 | + mptscsih_release(sh); | |
810 | + scsi_host_put(sh); | |
811 | + this->sh = NULL; | |
812 | + this = mpt_adapter_find_next(this); | |
813 | + } | |
814 | } | |
815 | ||
816 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
817 | @@ -1801,7 +1891,6 @@ | |
818 | /* NULL the Scsi_Host pointer | |
819 | */ | |
820 | hd->ioc->sh = NULL; | |
821 | - scsi_unregister(host); | |
822 | ||
823 | if (mpt_scsi_hosts) { | |
824 | if (--mpt_scsi_hosts == 0) { | |
825 | @@ -1811,6 +1900,10 @@ | |
826 | mpt_event_deregister(ScsiDoneCtx); | |
827 | dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n")); | |
828 | ||
829 | +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION | |
830 | + mpt_dv_deregister(MPTSCSIH_DRIVER); | |
831 | +#endif | |
832 | + | |
833 | mpt_deregister(ScsiScanDvCtx); | |
834 | mpt_deregister(ScsiTaskCtx); | |
835 | mpt_deregister(ScsiDoneCtx); | |
836 | @@ -2606,7 +2699,7 @@ | |
837 | * Returns 0 for SUCCESS or -1 if FAILED. | |
838 | */ | |
839 | static int | |
840 | -mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag) | |
841 | +mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag) | |
842 | { | |
843 | MPT_ADAPTER *ioc = NULL; | |
844 | int rc = -1; | |
845 | @@ -2662,7 +2755,7 @@ | |
846 | */ | |
847 | if (hd->hard_resets < -1) | |
848 | hd->hard_resets++; | |
849 | - rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, sleepFlag); | |
850 | + rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, timeout, sleepFlag); | |
851 | if (rc) { | |
852 | printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", hd->ioc->name); | |
853 | } else { | |
854 | @@ -2708,7 +2801,7 @@ | |
855 | * else other non-zero value returned. | |
856 | */ | |
857 | static int | |
858 | -mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag) | |
859 | +mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag) | |
860 | { | |
861 | MPT_FRAME_HDR *mf; | |
862 | SCSITaskMgmt_t *pScsiTm; | |
863 | @@ -2758,7 +2851,7 @@ | |
864 | */ | |
865 | hd->tmPtr = mf; | |
866 | hd->numTMrequests++; | |
867 | - hd->TMtimer.expires = jiffies + HZ*20; /* 20 seconds */ | |
868 | + hd->TMtimer.expires = jiffies + timeout; | |
869 | add_timer(&hd->TMtimer); | |
870 | ||
871 | if ((retval = mpt_send_handshake_request(ScsiTaskCtx, hd->ioc->id, | |
872 | @@ -2868,7 +2961,8 @@ | |
873 | ||
874 | spin_unlock_irq(host_lock); | |
875 | if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, | |
876 | - SCpnt->device->id, SCpnt->device->lun, ctx2abort, CAN_SLEEP) | |
877 | + SCpnt->device->id, SCpnt->device->lun, | |
878 | + ctx2abort, (HZ*2) /* 2 second timeout */,CAN_SLEEP) | |
879 | < 0) { | |
880 | ||
881 | /* The TM request failed and the subsequent FW-reload failed! | |
882 | @@ -2938,7 +3032,7 @@ | |
883 | } | |
884 | ||
885 | if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, | |
886 | - SCpnt->device->id, 0, 0, CAN_SLEEP) | |
887 | + SCpnt->device->id, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP) | |
888 | < 0){ | |
889 | /* The TM request failed and the subsequent FW-reload failed! | |
890 | * Fatal error case. | |
891 | @@ -3002,7 +3096,7 @@ | |
892 | ||
893 | /* We are now ready to execute the task management request. */ | |
894 | if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, | |
895 | - 0, 0, 0, CAN_SLEEP) | |
896 | + 0, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP) | |
897 | < 0){ | |
898 | ||
899 | /* The TM request failed and the subsequent FW-reload failed! | |
900 | @@ -3085,7 +3179,7 @@ | |
901 | mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd) | |
902 | { | |
903 | unsigned long flags; | |
904 | - int loop_count = 60 * 4; /* Wait 60 seconds */ | |
905 | + int loop_count = 10 * 4; /* Wait 10 seconds */ | |
906 | int status = FAILED; | |
907 | ||
908 | do { | |
909 | @@ -3225,18 +3319,50 @@ | |
910 | */ | |
911 | int | |
912 | mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, | |
913 | - sector_t capacity, int *ip) | |
914 | + sector_t capacity, int geom[]) | |
915 | { | |
916 | - int size; | |
917 | + int heads; | |
918 | + int sectors; | |
919 | + sector_t cylinders; | |
920 | +#ifdef CONFIG_LBD | |
921 | + ulong dummy; | |
922 | +#endif | |
923 | ||
924 | - size = capacity; | |
925 | - ip[0] = 64; /* heads */ | |
926 | - ip[1] = 32; /* sectors */ | |
927 | - if ((ip[2] = size >> 11) > 1024) { /* cylinders, test for big disk */ | |
928 | - ip[0] = 255; /* heads */ | |
929 | - ip[1] = 63; /* sectors */ | |
930 | - ip[2] = size / (255 * 63); /* cylinders */ | |
931 | + heads = 64; | |
932 | + sectors = 32; | |
933 | +#ifdef CONFIG_LBD | |
934 | + dummy = heads * sectors; | |
935 | + cylinders = capacity; | |
936 | + do_div(cylinders,dummy); | |
937 | +#else | |
938 | + cylinders = (ulong)capacity / (heads * sectors); | |
939 | +#endif | |
940 | + | |
941 | + /* | |
942 | + * Handle extended translation size for logical drives | |
943 | + * > 1Gb | |
944 | + */ | |
945 | + if ((ulong)capacity >= 0x200000) { | |
946 | + heads = 255; | |
947 | + sectors = 63; | |
948 | +#ifdef CONFIG_LBD | |
949 | + dummy = heads * sectors; | |
950 | + cylinders = capacity; | |
951 | + do_div(cylinders,dummy); | |
952 | +#else | |
953 | + cylinders = (ulong)capacity / (heads * sectors); | |
954 | +#endif | |
955 | } | |
956 | + | |
957 | + /* return result */ | |
958 | + geom[0] = heads; | |
959 | + geom[1] = sectors; | |
960 | + geom[2] = cylinders; | |
961 | + | |
962 | + dprintk((KERN_NOTICE | |
963 | + ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n", | |
964 | + sdev->id, sdev->lun,sdev->channel,(int)cylinders,heads,sectors)); | |
965 | + | |
966 | return 0; | |
967 | } | |
968 | ||
969 | @@ -3366,7 +3492,7 @@ | |
970 | vdev->raidVolume = 0; | |
971 | if (hd->is_spi && (hd->ioc->spi_data.isRaid & (1 << (device->id)))) { | |
972 | vdev->raidVolume = 1; | |
973 | - ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", target_id)); | |
974 | + ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", device->id)); | |
975 | } | |
976 | ||
977 | mptscsih_target_settings(hd, vdev, device); | |
978 | @@ -3648,36 +3774,6 @@ | |
979 | return -1; | |
980 | } | |
981 | ||
982 | -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
983 | - | |
984 | -/* see mptscsih.h */ | |
985 | - | |
986 | -#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS | |
987 | -static Scsi_Host_Template driver_template = { | |
988 | - .proc_name = "mptscsih", | |
989 | - .proc_info = x_scsi_proc_info, | |
990 | - .name = "MPT SCSI Host", | |
991 | - .detect = x_scsi_detect, | |
992 | - .release = x_scsi_release, | |
993 | - .info = x_scsi_info, | |
994 | - .queuecommand = x_scsi_queuecommand, | |
995 | - .slave_alloc = x_scsi_slave_alloc, | |
996 | - .slave_configure = x_scsi_slave_configure, | |
997 | - .slave_destroy = x_scsi_slave_destroy, | |
998 | - .eh_abort_handler = x_scsi_abort, | |
999 | - .eh_device_reset_handler = x_scsi_dev_reset, | |
1000 | - .eh_bus_reset_handler = x_scsi_bus_reset, | |
1001 | - .eh_host_reset_handler = x_scsi_host_reset, | |
1002 | - .bios_param = x_scsi_bios_param, | |
1003 | - .can_queue = MPT_SCSI_CAN_QUEUE, | |
1004 | - .this_id = -1, | |
1005 | - .sg_tablesize = MPT_SCSI_SG_DEPTH, | |
1006 | - .max_sectors = MPT_SCSI_MAX_SECTORS, | |
1007 | - .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, | |
1008 | - .use_clustering = ENABLE_CLUSTERING, | |
1009 | -}; | |
1010 | -#include "../../scsi/scsi_module.c" | |
1011 | -#endif | |
1012 | ||
1013 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
1014 | /* Search the pendingQ for a command with specific index. | |
1015 | @@ -4318,6 +4414,8 @@ | |
1016 | case WRITE_10: | |
1017 | case READ_12: | |
1018 | case WRITE_12: | |
1019 | + case READ_16: | |
1020 | + case WRITE_16: | |
1021 | break; | |
1022 | default: | |
1023 | return 0; | |
1024 | @@ -5413,7 +5511,7 @@ | |
1025 | flags = hd->ioc->spi_data.noQas; | |
1026 | if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) { | |
1027 | data = hd->ioc->spi_data.nvram[id]; | |
1028 | - | |
1029 | + | |
1030 | if (data & MPT_NVRAM_WIDE_DISABLE) | |
1031 | flags |= MPT_TARGET_NO_NEGO_WIDE; | |
1032 | ||
1033 | @@ -5518,7 +5616,7 @@ | |
1034 | /* DV only to SCSI adapters */ | |
1035 | if ((int)ioc->chip_type <= (int)FC929) | |
1036 | continue; | |
1037 | - | |
1038 | + | |
1039 | /* Make sure everything looks ok */ | |
1040 | if (ioc->sh == NULL) | |
1041 | continue; | |
1042 | @@ -7007,3 +7105,6 @@ | |
1043 | ||
1044 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
1045 | ||
1046 | + | |
1047 | +module_init(mptscsih_init); | |
1048 | +module_exit(mptscsih_exit); | |
1049 | diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h | |
1050 | --- linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h 2004-01-06 14:17:58.000000000 -0700 | |
1051 | +++ linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h 2003-12-16 12:18:46.000000000 -0700 | |
1052 | @@ -160,8 +160,6 @@ | |
1053 | ||
1054 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
1055 | ||
1056 | -#define x_scsi_detect mptscsih_detect | |
1057 | -#define x_scsi_release mptscsih_release | |
1058 | #define x_scsi_info mptscsih_info | |
1059 | #define x_scsi_queuecommand mptscsih_qcmd | |
1060 | #define x_scsi_abort mptscsih_abort | |
1061 | @@ -170,9 +168,6 @@ | |
1062 | #define x_scsi_host_reset mptscsih_host_reset | |
1063 | #define x_scsi_bios_param mptscsih_bios_param | |
1064 | ||
1065 | -#define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh | |
1066 | -#define x_scsi_old_abort mptscsih_old_abort | |
1067 | -#define x_scsi_old_reset mptscsih_old_reset | |
1068 | #define x_scsi_slave_alloc mptscsih_slave_alloc | |
1069 | #define x_scsi_slave_configure mptscsih_slave_configure | |
1070 | #define x_scsi_slave_destroy mptscsih_slave_destroy | |
1071 | @@ -182,8 +177,6 @@ | |
1072 | /* | |
1073 | * MPT SCSI Host / Initiator decls... | |
1074 | */ | |
1075 | -extern int x_scsi_detect(Scsi_Host_Template *); | |
1076 | -extern int x_scsi_release(struct Scsi_Host *host); | |
1077 | extern const char *x_scsi_info(struct Scsi_Host *); | |
1078 | extern int x_scsi_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); | |
1079 | extern int x_scsi_abort(Scsi_Cmnd *); | |
1080 | @@ -191,8 +184,7 @@ | |
1081 | extern int x_scsi_dev_reset(Scsi_Cmnd *); | |
1082 | extern int x_scsi_host_reset(Scsi_Cmnd *); | |
1083 | extern int x_scsi_bios_param(struct scsi_device * sdev, struct block_device *bdev, | |
1084 | - sector_t capacity, int *ip); | |
1085 | -extern void x_scsi_taskmgmt_bh(void *); | |
1086 | + sector_t capacity, int geom[]); | |
1087 | extern int x_scsi_slave_alloc(Scsi_Device *); | |
1088 | extern int x_scsi_slave_configure(Scsi_Device *); | |
1089 | extern void x_scsi_slave_destroy(Scsi_Device *); |