]> git.pld-linux.org Git - packages/kernel.git/blob - 2.6.1-rc2-mptlinux-3.00.00.patch
- obsolete
[packages/kernel.git] / 2.6.1-rc2-mptlinux-3.00.00.patch
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  
530 -#define MPT_LINUX_VERSION_COMMON       "2.05.00.05"
531 -#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-2.05.00.05"
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)
667 @@ -1231,8 +1275,9 @@
668         } else {
669                 mem = (u8 *) hd->ReqToChain;
670         }
671 -       memset(mem, 0xFF, sz);
672 -
673 +/*     memset(mem, 0xFF, sz); */
674 +       for(ii=0;ii<hd->ioc->req_depth;ii++)
675 +               hd->ReqToChain[ii] = MPT_HOST_NO_CHAIN;
676  
677         /* ChainToChain size must equal the total number
678          * of chain buffers to be allocated.
679 @@ -1275,7 +1320,6 @@
680                 mem = (u8 *) hd->ChainToChain;
681         }
682         memset(mem, 0xFF, sz);
683 -
684         sz = num_chain * hd->ioc->req_sz;
685         if (hd->ChainBuffer == NULL) {
686                 /* Allocate free chain buffer pool
687 @@ -1357,18 +1401,13 @@
688  /*  SCSI host fops start here...  */
689  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
690  /**
691 - *     mptscsih_detect - Register MPT adapter(s) as SCSI host(s) with
692 + *     mptscsih_init - Register MPT adapter(s) as SCSI host(s) with
693   *     linux scsi mid-layer.
694 - *     @tpnt: Pointer to Scsi_Host_Template structure
695   *
696 - *     (linux Scsi_Host_Template.detect routine)
697 - *
698 - *     Returns number of SCSI host adapters that were successfully
699 - *     registered with the linux scsi mid-layer via the scsi_register()
700 - *     API call.
701 + *     Returns 0 for success, non-zero for failure.
702   */
703 -int
704 -mptscsih_detect(Scsi_Host_Template *tpnt)
705 +static int
706 +__init mptscsih_init(void)
707  {
708         struct Scsi_Host        *sh = NULL;
709         MPT_SCSI_HOST           *hd = NULL;
710 @@ -1387,6 +1426,12 @@
711                 ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSCSIH_DRIVER);
712                 ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, MPTSCSIH_DRIVER);
713  
714 +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
715 +               if(mpt_dv_register(mptscsih_domainValidation, MPTSCSIH_DRIVER) != 0 ) {
716 +                       dprintk((KERN_INFO MYNAM
717 +                       ": failed to register dv callback\n"));
718 +               }
719 +#endif
720                 if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) {
721                         dprintk((KERN_INFO MYNAM ": Registered for IOC event notifications\n"));
722                 } else {
723 @@ -1431,14 +1476,17 @@
724                                 continue;
725                         }
726  
727 -                       tpnt->proc_info = mptscsih_proc_info;
728 -                       sh = scsi_register(tpnt, sizeof(MPT_SCSI_HOST));
729 +                       sh = scsi_host_alloc(&driver_template, sizeof(MPT_SCSI_HOST));
730                         if (sh != NULL) {
731                                 spin_lock_irqsave(&this->FreeQlock, flags);
732                                 sh->io_port = 0;
733                                 sh->n_io_port = 0;
734                                 sh->irq = 0;
735  
736 +                               /* set 16 byte cdb's
737 +                               */
738 +                               sh->max_cmd_len = 16;
739 +
740                                 /* Yikes!  This is important!
741                                  * Otherwise, by default, linux
742                                  * only scans target IDs 0-7!
743 @@ -1634,7 +1682,7 @@
744                                         hd->ioc->spi_data.forceDv = 0;
745                                         for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
746                                                 hd->ioc->spi_data.dvStatus[ii] = MPT_SCSICFG_NEGOTIATE;
747 -       
748 +
749                                         if (hd->negoNvram == 0) {
750                                                 for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
751                                                         hd->ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_DV_NOT_DONE;
752 @@ -1649,6 +1697,10 @@
753                                 }
754  
755                                 mpt_scsi_hosts++;
756 +
757 +                               scsi_add_host (sh, &this->pcidev->dev);
758 +                               scsi_scan_host(sh);
759 +
760                         }
761  
762                 }       /* for each adapter port */
763 @@ -1657,24 +1709,62 @@
764         }
765  
766  done:
767 -       if (mpt_scsi_hosts > 0)
768 +       if (mpt_scsi_hosts > 0) {
769                 register_reboot_notifier(&mptscsih_notifier);
770 -       else {
771 +               return 0;
772 +       } else {
773                 mpt_reset_deregister(ScsiDoneCtx);
774                 dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n"));
775  
776                 mpt_event_deregister(ScsiDoneCtx);
777                 dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n"));
778  
779 +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
780 +               mpt_dv_deregister(MPTSCSIH_DRIVER);
781 +#endif
782                 mpt_deregister(ScsiScanDvCtx);
783                 mpt_deregister(ScsiTaskCtx);
784                 mpt_deregister(ScsiDoneCtx);
785  
786                 if (info_kbuf != NULL)
787                         kfree(info_kbuf);
788 +
789 +               return -EBUSY;
790         }
791  
792 -       return mpt_scsi_hosts;
793 +}
794 +
795 +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
796 +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
797 +/**
798 + *     mptscsih_exit - Unregisters MPT adapter(s)
799 + *
800 + */
801 +static void
802 +__exit mptscsih_exit(void)
803 +{
804 +       MPT_ADAPTER             *this;
805 +       struct Scsi_Host        *sh = NULL;
806 +
807 +       this = mpt_adapter_find_first();
808 +       while (this != NULL) {
809 +
810 +               if (this->last_state != MPI_IOC_STATE_OPERATIONAL) {
811 +                       this = mpt_adapter_find_next(this);
812 +                       continue;
813 +               }
814 +
815 +               sh = this->sh;
816 +               if( sh == NULL ) {
817 +                       continue;
818 +               }
819 +
820 +               scsi_remove_host(sh);
821 +               mptscsih_release(sh);
822 +               scsi_host_put(sh);
823 +               this->sh = NULL;
824 +               this = mpt_adapter_find_next(this);
825 +       }
826  }
827  
828  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
829 @@ -1801,7 +1891,6 @@
830         /* NULL the Scsi_Host pointer
831          */
832         hd->ioc->sh = NULL;
833 -       scsi_unregister(host);
834  
835         if (mpt_scsi_hosts) {
836                 if (--mpt_scsi_hosts == 0) {
837 @@ -1811,6 +1900,10 @@
838                         mpt_event_deregister(ScsiDoneCtx);
839                         dprintk((KERN_INFO MYNAM ": Deregistered for IOC event notifications\n"));
840  
841 +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
842 +                       mpt_dv_deregister(MPTSCSIH_DRIVER);
843 +#endif
844 +
845                         mpt_deregister(ScsiScanDvCtx);
846                         mpt_deregister(ScsiTaskCtx);
847                         mpt_deregister(ScsiDoneCtx);
848 @@ -2606,7 +2699,7 @@
849   *     Returns 0 for SUCCESS or -1 if FAILED.
850   */
851  static int
852 -mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag)
853 +mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag)
854  {
855         MPT_ADAPTER     *ioc = NULL;
856         int              rc = -1;
857 @@ -2662,7 +2755,7 @@
858                  */
859                 if (hd->hard_resets < -1)
860                         hd->hard_resets++;
861 -               rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, sleepFlag);
862 +               rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, timeout, sleepFlag);
863                 if (rc) {
864                         printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", hd->ioc->name);
865                 } else {
866 @@ -2708,7 +2801,7 @@
867   *     else other non-zero value returned.
868   */
869  static int
870 -mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, int sleepFlag)
871 +mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag)
872  {
873         MPT_FRAME_HDR   *mf;
874         SCSITaskMgmt_t  *pScsiTm;
875 @@ -2758,7 +2851,7 @@
876         */
877         hd->tmPtr = mf;
878         hd->numTMrequests++;
879 -       hd->TMtimer.expires = jiffies + HZ*20;  /* 20 seconds */
880 +       hd->TMtimer.expires = jiffies + timeout;
881         add_timer(&hd->TMtimer);
882  
883         if ((retval = mpt_send_handshake_request(ScsiTaskCtx, hd->ioc->id,
884 @@ -2868,7 +2961,8 @@
885  
886         spin_unlock_irq(host_lock);
887         if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
888 -                              SCpnt->device->id, SCpnt->device->lun, ctx2abort, CAN_SLEEP)
889 +               SCpnt->device->id, SCpnt->device->lun,
890 +               ctx2abort, (HZ*2) /* 2 second timeout */,CAN_SLEEP)
891                 < 0) {
892  
893                 /* The TM request failed and the subsequent FW-reload failed!
894 @@ -2938,7 +3032,7 @@
895         }
896  
897         if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
898 -                              SCpnt->device->id, 0, 0, CAN_SLEEP)
899 +               SCpnt->device->id, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP)
900                 < 0){
901                 /* The TM request failed and the subsequent FW-reload failed!
902                  * Fatal error case.
903 @@ -3002,7 +3096,7 @@
904  
905         /* We are now ready to execute the task management request. */
906         if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
907 -                              0, 0, 0, CAN_SLEEP)
908 +               0, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP)
909             < 0){
910  
911                 /* The TM request failed and the subsequent FW-reload failed!
912 @@ -3085,7 +3179,7 @@
913  mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd)
914  {
915         unsigned long  flags;
916 -       int            loop_count = 60 * 4;  /* Wait 60 seconds */
917 +       int            loop_count = 10 * 4;  /* Wait 10 seconds */
918         int            status = FAILED;
919  
920         do {
921 @@ -3225,18 +3319,50 @@
922   */
923  int
924  mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
925 -               sector_t capacity, int *ip)
926 +               sector_t capacity, int geom[])
927  {
928 -       int size;
929 +       int             heads;
930 +       int             sectors;
931 +       sector_t        cylinders;
932 +#ifdef CONFIG_LBD
933 +       ulong           dummy;
934 +#endif
935  
936 -       size = capacity;
937 -       ip[0] = 64;                             /* heads                        */
938 -       ip[1] = 32;                             /* sectors                      */
939 -       if ((ip[2] = size >> 11) > 1024) {      /* cylinders, test for big disk */
940 -               ip[0] = 255;                    /* heads                        */
941 -               ip[1] = 63;                     /* sectors                      */
942 -               ip[2] = size / (255 * 63);      /* cylinders                    */
943 +       heads = 64;
944 +       sectors = 32;
945 +#ifdef CONFIG_LBD
946 +       dummy = heads * sectors;
947 +       cylinders = capacity;
948 +       do_div(cylinders,dummy);
949 +#else
950 +       cylinders = (ulong)capacity / (heads * sectors);
951 +#endif
952 +
953 +       /*
954 +        * Handle extended translation size for logical drives
955 +        * > 1Gb
956 +        */
957 +       if ((ulong)capacity >= 0x200000) {
958 +               heads = 255;
959 +               sectors = 63;
960 +#ifdef CONFIG_LBD
961 +               dummy = heads * sectors;
962 +               cylinders = capacity;
963 +               do_div(cylinders,dummy);
964 +#else
965 +               cylinders = (ulong)capacity / (heads * sectors);
966 +#endif
967         }
968 +
969 +       /* return result */
970 +       geom[0] = heads;
971 +       geom[1] = sectors;
972 +       geom[2] = cylinders;
973 +
974 +       dprintk((KERN_NOTICE
975 +               ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n",
976 +               sdev->id, sdev->lun,sdev->channel,(int)cylinders,heads,sectors));
977 +
978         return 0;
979  }
980  
981 @@ -3366,7 +3492,7 @@
982                         vdev->raidVolume = 0;
983                         if (hd->is_spi && (hd->ioc->spi_data.isRaid & (1 << (device->id)))) {
984                                 vdev->raidVolume = 1;
985 -                               ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", target_id));
986 +                               ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", device->id));
987                         }
988  
989                         mptscsih_target_settings(hd, vdev, device);
990 @@ -3648,36 +3774,6 @@
991         return -1;
992  }
993  
994 -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
995 -
996 -/* see mptscsih.h */
997 -
998 -#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS
999 -static Scsi_Host_Template driver_template = {
1000 -       .proc_name                      = "mptscsih",
1001 -       .proc_info                      = x_scsi_proc_info,
1002 -       .name                           = "MPT SCSI Host",
1003 -       .detect                         = x_scsi_detect,
1004 -       .release                        = x_scsi_release,
1005 -       .info                           = x_scsi_info,  
1006 -       .queuecommand                   = x_scsi_queuecommand,
1007 -       .slave_alloc                    = x_scsi_slave_alloc,
1008 -       .slave_configure                = x_scsi_slave_configure,
1009 -       .slave_destroy                  = x_scsi_slave_destroy,
1010 -       .eh_abort_handler               = x_scsi_abort,
1011 -       .eh_device_reset_handler        = x_scsi_dev_reset,
1012 -       .eh_bus_reset_handler           = x_scsi_bus_reset,
1013 -       .eh_host_reset_handler          = x_scsi_host_reset,
1014 -       .bios_param                     = x_scsi_bios_param,
1015 -       .can_queue                      = MPT_SCSI_CAN_QUEUE,
1016 -       .this_id                        = -1,
1017 -       .sg_tablesize                   = MPT_SCSI_SG_DEPTH,
1018 -       .max_sectors                    = MPT_SCSI_MAX_SECTORS,
1019 -       .cmd_per_lun                    = MPT_SCSI_CMD_PER_LUN,
1020 -       .use_clustering                 = ENABLE_CLUSTERING,
1021 -};
1022 -#include "../../scsi/scsi_module.c"
1023 -#endif
1024  
1025  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1026  /* Search the pendingQ for a command with specific index.
1027 @@ -4318,6 +4414,8 @@
1028         case WRITE_10:
1029         case READ_12:
1030         case WRITE_12:
1031 +       case READ_16:
1032 +       case WRITE_16:
1033                 break;
1034         default:
1035                 return 0;
1036 @@ -5413,7 +5511,7 @@
1037                                 flags = hd->ioc->spi_data.noQas;
1038                                 if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) {
1039                                         data = hd->ioc->spi_data.nvram[id];
1040 -       
1041 +
1042                                         if (data & MPT_NVRAM_WIDE_DISABLE)
1043                                                 flags |= MPT_TARGET_NO_NEGO_WIDE;
1044  
1045 @@ -5518,7 +5616,7 @@
1046                         /* DV only to SCSI adapters */
1047                         if ((int)ioc->chip_type <= (int)FC929)
1048                                 continue;
1049 -                       
1050 +
1051                         /* Make sure everything looks ok */
1052                         if (ioc->sh == NULL)
1053                                 continue;
1054 @@ -7007,3 +7105,6 @@
1055  
1056  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1057  
1058 +
1059 +module_init(mptscsih_init);
1060 +module_exit(mptscsih_exit);
1061 diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h
1062 --- linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h 2004-01-06 14:17:58.000000000 -0700
1063 +++ linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h   2003-12-16 12:18:46.000000000 -0700
1064 @@ -160,8 +160,6 @@
1065  
1066  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1067  
1068 -#define x_scsi_detect          mptscsih_detect
1069 -#define x_scsi_release         mptscsih_release
1070  #define x_scsi_info            mptscsih_info
1071  #define x_scsi_queuecommand    mptscsih_qcmd
1072  #define x_scsi_abort           mptscsih_abort
1073 @@ -170,9 +168,6 @@
1074  #define x_scsi_host_reset      mptscsih_host_reset
1075  #define x_scsi_bios_param      mptscsih_bios_param
1076  
1077 -#define x_scsi_taskmgmt_bh     mptscsih_taskmgmt_bh
1078 -#define x_scsi_old_abort       mptscsih_old_abort
1079 -#define x_scsi_old_reset       mptscsih_old_reset
1080  #define x_scsi_slave_alloc     mptscsih_slave_alloc
1081  #define x_scsi_slave_configure mptscsih_slave_configure
1082  #define x_scsi_slave_destroy   mptscsih_slave_destroy
1083 @@ -182,8 +177,6 @@
1084  /*
1085   *     MPT SCSI Host / Initiator decls...
1086   */
1087 -extern int              x_scsi_detect(Scsi_Host_Template *);
1088 -extern int              x_scsi_release(struct Scsi_Host *host);
1089  extern const char      *x_scsi_info(struct Scsi_Host *);
1090  extern int              x_scsi_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
1091  extern int              x_scsi_abort(Scsi_Cmnd *);
1092 @@ -191,8 +184,7 @@
1093  extern int              x_scsi_dev_reset(Scsi_Cmnd *);
1094  extern int              x_scsi_host_reset(Scsi_Cmnd *);
1095  extern int              x_scsi_bios_param(struct scsi_device * sdev, struct block_device *bdev,
1096 -                               sector_t capacity, int *ip);
1097 -extern void             x_scsi_taskmgmt_bh(void *);
1098 +                               sector_t capacity, int geom[]);
1099  extern int              x_scsi_slave_alloc(Scsi_Device *);
1100  extern int              x_scsi_slave_configure(Scsi_Device *);
1101  extern void             x_scsi_slave_destroy(Scsi_Device *);
This page took 0.189364 seconds and 3 git commands to generate.