diff options
Diffstat (limited to 'drivers/message/fusion/mptbase.c')
-rw-r--r-- | drivers/message/fusion/mptbase.c | 260 |
1 files changed, 68 insertions, 192 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 8b22630f1aef..42ed5e272dca 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -1,55 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/message/fusion/mptbase.c | 2 | * linux/drivers/message/fusion/mptbase.c |
3 | * High performance SCSI + LAN / Fibre Channel device drivers. | ||
4 | * This is the Fusion MPT base driver which supports multiple | 3 | * This is the Fusion MPT base driver which supports multiple |
5 | * (SCSI + LAN) specialized protocol drivers. | 4 | * (SCSI + LAN) specialized protocol drivers. |
6 | * For use with PCI chip/adapter(s): | 5 | * For use with LSI Logic PCI chip/adapter(s) |
7 | * LSIFC9xx/LSI409xx Fibre Channel | ||
8 | * running LSI Logic Fusion MPT (Message Passing Technology) firmware. | 6 | * running LSI Logic Fusion MPT (Message Passing Technology) firmware. |
9 | * | 7 | * |
10 | * Credits: | 8 | * Copyright (c) 1999-2005 LSI Logic Corporation |
11 | * There are lots of people not mentioned below that deserve credit | ||
12 | * and thanks but won't get it here - sorry in advance that you | ||
13 | * got overlooked. | ||
14 | * | ||
15 | * This driver would not exist if not for Alan Cox's development | ||
16 | * of the linux i2o driver. | ||
17 | * | ||
18 | * A special thanks to Noah Romer (LSI Logic) for tons of work | ||
19 | * and tough debugging on the LAN driver, especially early on;-) | ||
20 | * And to Roger Hickerson (LSI Logic) for tirelessly supporting | ||
21 | * this driver project. | ||
22 | * | ||
23 | * A special thanks to Pamela Delaney (LSI Logic) for tons of work | ||
24 | * and countless enhancements while adding support for the 1030 | ||
25 | * chip family. Pam has been instrumental in the development of | ||
26 | * of the 2.xx.xx series fusion drivers, and her contributions are | ||
27 | * far too numerous to hope to list in one place. | ||
28 | * | ||
29 | * All manner of help from Stephen Shirron (LSI Logic): | ||
30 | * low-level FC analysis, debug + various fixes in FCxx firmware, | ||
31 | * initial port to alpha platform, various driver code optimizations, | ||
32 | * being a faithful sounding board on all sorts of issues & ideas, | ||
33 | * etc. | ||
34 | * | ||
35 | * A huge debt of gratitude is owed to David S. Miller (DaveM) | ||
36 | * for fixing much of the stupid and broken stuff in the early | ||
37 | * driver while porting to sparc64 platform. THANK YOU! | ||
38 | * | ||
39 | * Special thanks goes to the I2O LAN driver people at the | ||
40 | * University of Helsinki, who, unbeknownst to them, provided | ||
41 | * the inspiration and initial structure for this driver. | ||
42 | * | ||
43 | * A really huge debt of gratitude is owed to Eddie C. Dost | ||
44 | * for gobs of hard work fixing and optimizing LAN code. | ||
45 | * THANK YOU! | ||
46 | * | ||
47 | * Copyright (c) 1999-2004 LSI Logic Corporation | ||
48 | * Originally By: Steven J. Ralston | ||
49 | * (mailto:sjralston1@netscape.net) | ||
50 | * (mailto:mpt_linux_developer@lsil.com) | 9 | * (mailto:mpt_linux_developer@lsil.com) |
51 | * | 10 | * |
52 | * $Id: mptbase.c,v 1.126 2002/12/16 15:28:45 pdelaney Exp $ | ||
53 | */ | 11 | */ |
54 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 12 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
55 | /* | 13 | /* |
@@ -101,6 +59,7 @@ | |||
101 | #include <linux/blkdev.h> | 59 | #include <linux/blkdev.h> |
102 | #include <linux/delay.h> | 60 | #include <linux/delay.h> |
103 | #include <linux/interrupt.h> /* needed for in_interrupt() proto */ | 61 | #include <linux/interrupt.h> /* needed for in_interrupt() proto */ |
62 | #include <linux/dma-mapping.h> | ||
104 | #include <asm/io.h> | 63 | #include <asm/io.h> |
105 | #ifdef CONFIG_MTRR | 64 | #ifdef CONFIG_MTRR |
106 | #include <asm/mtrr.h> | 65 | #include <asm/mtrr.h> |
@@ -218,35 +177,9 @@ static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); | |||
218 | static void mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info); | 177 | static void mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info); |
219 | 178 | ||
220 | /* module entry point */ | 179 | /* module entry point */ |
221 | static int __devinit mptbase_probe (struct pci_dev *, const struct pci_device_id *); | ||
222 | static void __devexit mptbase_remove(struct pci_dev *); | ||
223 | static void mptbase_shutdown(struct device * ); | ||
224 | static int __init fusion_init (void); | 180 | static int __init fusion_init (void); |
225 | static void __exit fusion_exit (void); | 181 | static void __exit fusion_exit (void); |
226 | 182 | ||
227 | /**************************************************************************** | ||
228 | * Supported hardware | ||
229 | */ | ||
230 | |||
231 | static struct pci_device_id mptbase_pci_table[] = { | ||
232 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909, | ||
233 | PCI_ANY_ID, PCI_ANY_ID }, | ||
234 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929, | ||
235 | PCI_ANY_ID, PCI_ANY_ID }, | ||
236 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919, | ||
237 | PCI_ANY_ID, PCI_ANY_ID }, | ||
238 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X, | ||
239 | PCI_ANY_ID, PCI_ANY_ID }, | ||
240 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X, | ||
241 | PCI_ANY_ID, PCI_ANY_ID }, | ||
242 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030, | ||
243 | PCI_ANY_ID, PCI_ANY_ID }, | ||
244 | { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_1030_53C1035, | ||
245 | PCI_ANY_ID, PCI_ANY_ID }, | ||
246 | {0} /* Terminating entry */ | ||
247 | }; | ||
248 | MODULE_DEVICE_TABLE(pci, mptbase_pci_table); | ||
249 | |||
250 | #define CHIPREG_READ32(addr) readl_relaxed(addr) | 183 | #define CHIPREG_READ32(addr) readl_relaxed(addr) |
251 | #define CHIPREG_READ32_dmasync(addr) readl(addr) | 184 | #define CHIPREG_READ32_dmasync(addr) readl(addr) |
252 | #define CHIPREG_WRITE32(addr,val) writel(val, addr) | 185 | #define CHIPREG_WRITE32(addr,val) writel(val, addr) |
@@ -330,8 +263,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) | |||
330 | ioc->name, mr, req_idx)); | 263 | ioc->name, mr, req_idx)); |
331 | DBG_DUMP_REPLY_FRAME(mr) | 264 | DBG_DUMP_REPLY_FRAME(mr) |
332 | 265 | ||
333 | /* NEW! 20010301 -sralston | 266 | /* Check/log IOC log info |
334 | * Check/log IOC log info | ||
335 | */ | 267 | */ |
336 | ioc_stat = le16_to_cpu(mr->u.reply.IOCStatus); | 268 | ioc_stat = le16_to_cpu(mr->u.reply.IOCStatus); |
337 | if (ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) { | 269 | if (ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) { |
@@ -357,9 +289,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) | |||
357 | mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa); | 289 | mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa); |
358 | } else if (type == MPI_CONTEXT_REPLY_TYPE_LAN) { | 290 | } else if (type == MPI_CONTEXT_REPLY_TYPE_LAN) { |
359 | cb_idx = mpt_lan_index; | 291 | cb_idx = mpt_lan_index; |
360 | /* | 292 | /* Blind set of mf to NULL here was fatal |
361 | * BUG FIX! 20001218 -sralston | ||
362 | * Blind set of mf to NULL here was fatal | ||
363 | * after lan_reply says "freeme" | 293 | * after lan_reply says "freeme" |
364 | * Fix sort of combined with an optimization here; | 294 | * Fix sort of combined with an optimization here; |
365 | * added explicit check for case where lan_reply | 295 | * added explicit check for case where lan_reply |
@@ -725,11 +655,9 @@ int | |||
725 | mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) | 655 | mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) |
726 | { | 656 | { |
727 | MPT_ADAPTER *ioc; | 657 | MPT_ADAPTER *ioc; |
728 | int error=0; | ||
729 | 658 | ||
730 | if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) { | 659 | if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) { |
731 | error= -EINVAL; | 660 | return -EINVAL; |
732 | return error; | ||
733 | } | 661 | } |
734 | 662 | ||
735 | MptDeviceDriverHandlers[cb_idx] = dd_cbfunc; | 663 | MptDeviceDriverHandlers[cb_idx] = dd_cbfunc; |
@@ -737,14 +665,12 @@ mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) | |||
737 | /* call per pci device probe entry point */ | 665 | /* call per pci device probe entry point */ |
738 | list_for_each_entry(ioc, &ioc_list, list) { | 666 | list_for_each_entry(ioc, &ioc_list, list) { |
739 | if(dd_cbfunc->probe) { | 667 | if(dd_cbfunc->probe) { |
740 | error = dd_cbfunc->probe(ioc->pcidev, | 668 | dd_cbfunc->probe(ioc->pcidev, |
741 | ioc->pcidev->driver->id_table); | 669 | ioc->pcidev->driver->id_table); |
742 | if(error != 0) | ||
743 | return error; | ||
744 | } | 670 | } |
745 | } | 671 | } |
746 | 672 | ||
747 | return error; | 673 | return 0; |
748 | } | 674 | } |
749 | 675 | ||
750 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 676 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
@@ -1058,7 +984,7 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp) | |||
1058 | 984 | ||
1059 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 985 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1060 | /* | 986 | /* |
1061 | * mptbase_probe - Install a PCI intelligent MPT adapter. | 987 | * mpt_attach - Install a PCI intelligent MPT adapter. |
1062 | * @pdev: Pointer to pci_dev structure | 988 | * @pdev: Pointer to pci_dev structure |
1063 | * | 989 | * |
1064 | * This routine performs all the steps necessary to bring the IOC of | 990 | * This routine performs all the steps necessary to bring the IOC of |
@@ -1073,8 +999,8 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp) | |||
1073 | * | 999 | * |
1074 | * TODO: Add support for polled controllers | 1000 | * TODO: Add support for polled controllers |
1075 | */ | 1001 | */ |
1076 | static int __devinit | 1002 | int |
1077 | mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 1003 | mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) |
1078 | { | 1004 | { |
1079 | MPT_ADAPTER *ioc; | 1005 | MPT_ADAPTER *ioc; |
1080 | u8 __iomem *mem; | 1006 | u8 __iomem *mem; |
@@ -1084,7 +1010,6 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1084 | u32 psize; | 1010 | u32 psize; |
1085 | int ii; | 1011 | int ii; |
1086 | int r = -ENODEV; | 1012 | int r = -ENODEV; |
1087 | u64 mask = 0xffffffffffffffffULL; | ||
1088 | u8 revision; | 1013 | u8 revision; |
1089 | u8 pcixcmd; | 1014 | u8 pcixcmd; |
1090 | static int mpt_ids = 0; | 1015 | static int mpt_ids = 0; |
@@ -1097,15 +1022,15 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1097 | 1022 | ||
1098 | dinitprintk((KERN_WARNING MYNAM ": mpt_adapter_install\n")); | 1023 | dinitprintk((KERN_WARNING MYNAM ": mpt_adapter_install\n")); |
1099 | 1024 | ||
1100 | if (!pci_set_dma_mask(pdev, mask)) { | 1025 | if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) { |
1101 | dprintk((KERN_INFO MYNAM | 1026 | dprintk((KERN_INFO MYNAM |
1102 | ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n")); | 1027 | ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n")); |
1103 | } else if (pci_set_dma_mask(pdev, (u64) 0xffffffff)) { | 1028 | } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { |
1104 | printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n"); | 1029 | printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n"); |
1105 | return r; | 1030 | return r; |
1106 | } | 1031 | } |
1107 | 1032 | ||
1108 | if (!pci_set_consistent_dma_mask(pdev, mask)) | 1033 | if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) |
1109 | dprintk((KERN_INFO MYNAM | 1034 | dprintk((KERN_INFO MYNAM |
1110 | ": Using 64 bit consistent mask\n")); | 1035 | ": Using 64 bit consistent mask\n")); |
1111 | else | 1036 | else |
@@ -1303,8 +1228,7 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1303 | #endif | 1228 | #endif |
1304 | } | 1229 | } |
1305 | 1230 | ||
1306 | /* NEW! 20010220 -sralston | 1231 | /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. |
1307 | * Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. | ||
1308 | */ | 1232 | */ |
1309 | mpt_detect_bound_ports(ioc, pdev); | 1233 | mpt_detect_bound_ports(ioc, pdev); |
1310 | 1234 | ||
@@ -1354,13 +1278,13 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1354 | 1278 | ||
1355 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1279 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1356 | /* | 1280 | /* |
1357 | * mptbase_remove - Remove a PCI intelligent MPT adapter. | 1281 | * mpt_detach - Remove a PCI intelligent MPT adapter. |
1358 | * @pdev: Pointer to pci_dev structure | 1282 | * @pdev: Pointer to pci_dev structure |
1359 | * | 1283 | * |
1360 | */ | 1284 | */ |
1361 | 1285 | ||
1362 | static void __devexit | 1286 | void |
1363 | mptbase_remove(struct pci_dev *pdev) | 1287 | mpt_detach(struct pci_dev *pdev) |
1364 | { | 1288 | { |
1365 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1289 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1366 | char pname[32]; | 1290 | char pname[32]; |
@@ -1397,43 +1321,21 @@ mptbase_remove(struct pci_dev *pdev) | |||
1397 | pci_set_drvdata(pdev, NULL); | 1321 | pci_set_drvdata(pdev, NULL); |
1398 | } | 1322 | } |
1399 | 1323 | ||
1400 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
1401 | /* | ||
1402 | * mptbase_shutdown - | ||
1403 | * | ||
1404 | */ | ||
1405 | static void | ||
1406 | mptbase_shutdown(struct device * dev) | ||
1407 | { | ||
1408 | int ii; | ||
1409 | |||
1410 | /* call per device driver shutdown entry point */ | ||
1411 | for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { | ||
1412 | if(MptDeviceDriverHandlers[ii] && | ||
1413 | MptDeviceDriverHandlers[ii]->shutdown) { | ||
1414 | MptDeviceDriverHandlers[ii]->shutdown(dev); | ||
1415 | } | ||
1416 | } | ||
1417 | |||
1418 | } | ||
1419 | |||
1420 | |||
1421 | /************************************************************************** | 1324 | /************************************************************************** |
1422 | * Power Management | 1325 | * Power Management |
1423 | */ | 1326 | */ |
1424 | #ifdef CONFIG_PM | 1327 | #ifdef CONFIG_PM |
1425 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1328 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1426 | /* | 1329 | /* |
1427 | * mptbase_suspend - Fusion MPT base driver suspend routine. | 1330 | * mpt_suspend - Fusion MPT base driver suspend routine. |
1428 | * | 1331 | * |
1429 | * | 1332 | * |
1430 | */ | 1333 | */ |
1431 | static int | 1334 | int |
1432 | mptbase_suspend(struct pci_dev *pdev, pm_message_t state) | 1335 | mpt_suspend(struct pci_dev *pdev, pm_message_t state) |
1433 | { | 1336 | { |
1434 | u32 device_state; | 1337 | u32 device_state; |
1435 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1338 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1436 | int ii; | ||
1437 | 1339 | ||
1438 | switch(state) | 1340 | switch(state) |
1439 | { | 1341 | { |
@@ -1453,14 +1355,6 @@ mptbase_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1453 | "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n", | 1355 | "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n", |
1454 | ioc->name, pdev, pci_name(pdev), device_state); | 1356 | ioc->name, pdev, pci_name(pdev), device_state); |
1455 | 1357 | ||
1456 | /* call per device driver suspend entry point */ | ||
1457 | for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { | ||
1458 | if(MptDeviceDriverHandlers[ii] && | ||
1459 | MptDeviceDriverHandlers[ii]->suspend) { | ||
1460 | MptDeviceDriverHandlers[ii]->suspend(pdev, state); | ||
1461 | } | ||
1462 | } | ||
1463 | |||
1464 | pci_save_state(pdev); | 1358 | pci_save_state(pdev); |
1465 | 1359 | ||
1466 | /* put ioc into READY_STATE */ | 1360 | /* put ioc into READY_STATE */ |
@@ -1484,18 +1378,18 @@ mptbase_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1484 | 1378 | ||
1485 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1379 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1486 | /* | 1380 | /* |
1487 | * mptbase_resume - Fusion MPT base driver resume routine. | 1381 | * mpt_resume - Fusion MPT base driver resume routine. |
1488 | * | 1382 | * |
1489 | * | 1383 | * |
1490 | */ | 1384 | */ |
1491 | static int | 1385 | int |
1492 | mptbase_resume(struct pci_dev *pdev) | 1386 | mpt_resume(struct pci_dev *pdev) |
1493 | { | 1387 | { |
1494 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1388 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1495 | u32 device_state = pdev->current_state; | 1389 | u32 device_state = pdev->current_state; |
1496 | int recovery_state; | 1390 | int recovery_state; |
1497 | int ii; | 1391 | int ii; |
1498 | 1392 | ||
1499 | printk(MYIOC_s_INFO_FMT | 1393 | printk(MYIOC_s_INFO_FMT |
1500 | "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", | 1394 | "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", |
1501 | ioc->name, pdev, pci_name(pdev), device_state); | 1395 | ioc->name, pdev, pci_name(pdev), device_state); |
@@ -1533,14 +1427,6 @@ mptbase_resume(struct pci_dev *pdev) | |||
1533 | "pci-resume: success\n", ioc->name); | 1427 | "pci-resume: success\n", ioc->name); |
1534 | } | 1428 | } |
1535 | 1429 | ||
1536 | /* call per device driver resume entry point */ | ||
1537 | for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { | ||
1538 | if(MptDeviceDriverHandlers[ii] && | ||
1539 | MptDeviceDriverHandlers[ii]->resume) { | ||
1540 | MptDeviceDriverHandlers[ii]->resume(pdev); | ||
1541 | } | ||
1542 | } | ||
1543 | |||
1544 | return 0; | 1430 | return 0; |
1545 | } | 1431 | } |
1546 | #endif | 1432 | #endif |
@@ -1719,8 +1605,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
1719 | ioc->alt_ioc->active = 1; | 1605 | ioc->alt_ioc->active = 1; |
1720 | } | 1606 | } |
1721 | 1607 | ||
1722 | /* NEW! 20010120 -sralston | 1608 | /* Enable MPT base driver management of EventNotification |
1723 | * Enable MPT base driver management of EventNotification | ||
1724 | * and EventAck handling. | 1609 | * and EventAck handling. |
1725 | */ | 1610 | */ |
1726 | if ((ret == 0) && (!ioc->facts.EventState)) | 1611 | if ((ret == 0) && (!ioc->facts.EventState)) |
@@ -1729,9 +1614,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
1729 | if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) | 1614 | if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) |
1730 | (void) SendEventNotification(ioc->alt_ioc, 1); /* 1=Enable EventNotification */ | 1615 | (void) SendEventNotification(ioc->alt_ioc, 1); /* 1=Enable EventNotification */ |
1731 | 1616 | ||
1732 | /* (Bugzilla:fibrebugs, #513) | 1617 | /* Add additional "reason" check before call to GetLanConfigPages |
1733 | * Bug fix (part 2)! 20010905 -sralston | ||
1734 | * Add additional "reason" check before call to GetLanConfigPages | ||
1735 | * (combined with GetIoUnitPage2 call). This prevents a somewhat | 1618 | * (combined with GetIoUnitPage2 call). This prevents a somewhat |
1736 | * recursive scenario; GetLanConfigPages times out, timer expired | 1619 | * recursive scenario; GetLanConfigPages times out, timer expired |
1737 | * routine calls HardResetHandler, which calls into here again, | 1620 | * routine calls HardResetHandler, which calls into here again, |
@@ -1829,37 +1712,43 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
1829 | static void | 1712 | static void |
1830 | mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev) | 1713 | mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev) |
1831 | { | 1714 | { |
1832 | unsigned int match_lo, match_hi; | 1715 | struct pci_dev *peer=NULL; |
1716 | unsigned int slot = PCI_SLOT(pdev->devfn); | ||
1717 | unsigned int func = PCI_FUNC(pdev->devfn); | ||
1833 | MPT_ADAPTER *ioc_srch; | 1718 | MPT_ADAPTER *ioc_srch; |
1834 | 1719 | ||
1835 | match_lo = pdev->devfn-1; | 1720 | dprintk((MYIOC_s_INFO_FMT "PCI device %s devfn=%x/%x," |
1836 | match_hi = pdev->devfn+1; | 1721 | " searching for devfn match on %x or %x\n", |
1837 | dprintk((MYIOC_s_INFO_FMT "PCI bus/devfn=%x/%x, searching for devfn match on %x or %x\n", | 1722 | ioc->name, pci_name(pdev), pdev->devfn, |
1838 | ioc->name, pdev->bus->number, pdev->devfn, match_lo, match_hi)); | 1723 | func-1, func+1)); |
1724 | |||
1725 | peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func-1)); | ||
1726 | if (!peer) { | ||
1727 | peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func+1)); | ||
1728 | if (!peer) | ||
1729 | return; | ||
1730 | } | ||
1839 | 1731 | ||
1840 | list_for_each_entry(ioc_srch, &ioc_list, list) { | 1732 | list_for_each_entry(ioc_srch, &ioc_list, list) { |
1841 | struct pci_dev *_pcidev = ioc_srch->pcidev; | 1733 | struct pci_dev *_pcidev = ioc_srch->pcidev; |
1842 | 1734 | if (_pcidev == peer) { | |
1843 | if ((_pcidev->device == pdev->device) && | ||
1844 | (_pcidev->bus->number == pdev->bus->number) && | ||
1845 | (_pcidev->devfn == match_lo || _pcidev->devfn == match_hi) ) { | ||
1846 | /* Paranoia checks */ | 1735 | /* Paranoia checks */ |
1847 | if (ioc->alt_ioc != NULL) { | 1736 | if (ioc->alt_ioc != NULL) { |
1848 | printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", | 1737 | printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", |
1849 | ioc->name, ioc->alt_ioc->name); | 1738 | ioc->name, ioc->alt_ioc->name); |
1850 | break; | 1739 | break; |
1851 | } else if (ioc_srch->alt_ioc != NULL) { | 1740 | } else if (ioc_srch->alt_ioc != NULL) { |
1852 | printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", | 1741 | printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", |
1853 | ioc_srch->name, ioc_srch->alt_ioc->name); | 1742 | ioc_srch->name, ioc_srch->alt_ioc->name); |
1854 | break; | 1743 | break; |
1855 | } | 1744 | } |
1856 | dprintk((KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n", | 1745 | dprintk((KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n", |
1857 | ioc->name, ioc_srch->name)); | 1746 | ioc->name, ioc_srch->name)); |
1858 | ioc_srch->alt_ioc = ioc; | 1747 | ioc_srch->alt_ioc = ioc; |
1859 | ioc->alt_ioc = ioc_srch; | 1748 | ioc->alt_ioc = ioc_srch; |
1860 | break; | ||
1861 | } | 1749 | } |
1862 | } | 1750 | } |
1751 | pci_dev_put(peer); | ||
1863 | } | 1752 | } |
1864 | 1753 | ||
1865 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1754 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
@@ -2333,7 +2222,7 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason) | |||
2333 | return -55; | 2222 | return -55; |
2334 | } | 2223 | } |
2335 | 2224 | ||
2336 | r = sz = le32_to_cpu(facts->BlockSize); | 2225 | r = sz = facts->BlockSize; |
2337 | vv = ((63 / (sz * 4)) + 1) & 0x03; | 2226 | vv = ((63 / (sz * 4)) + 1) & 0x03; |
2338 | ioc->NB_for_64_byte_frame = vv; | 2227 | ioc->NB_for_64_byte_frame = vv; |
2339 | while ( sz ) | 2228 | while ( sz ) |
@@ -4250,7 +4139,7 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum) | |||
4250 | if ((ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD) || | 4139 | if ((ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD) || |
4251 | (ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE)) { | 4140 | (ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE)) { |
4252 | 4141 | ||
4253 | if (ioc->spi_data.minSyncFactor < MPT_ULTRA) | 4142 | if (ioc->spi_data.minSyncFactor < MPT_ULTRA) |
4254 | ioc->spi_data.minSyncFactor = MPT_ULTRA; | 4143 | ioc->spi_data.minSyncFactor = MPT_ULTRA; |
4255 | } | 4144 | } |
4256 | } | 4145 | } |
@@ -4753,9 +4642,7 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) | |||
4753 | u32 flagsLength; | 4642 | u32 flagsLength; |
4754 | int in_isr; | 4643 | int in_isr; |
4755 | 4644 | ||
4756 | /* (Bugzilla:fibrebugs, #513) | 4645 | /* Prevent calling wait_event() (below), if caller happens |
4757 | * Bug fix (part 1)! 20010905 -sralston | ||
4758 | * Prevent calling wait_event() (below), if caller happens | ||
4759 | * to be in ISR context, because that is fatal! | 4646 | * to be in ISR context, because that is fatal! |
4760 | */ | 4647 | */ |
4761 | in_isr = in_interrupt(); | 4648 | in_isr = in_interrupt(); |
@@ -4861,9 +4748,7 @@ mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) | |||
4861 | u32 flagsLength; | 4748 | u32 flagsLength; |
4862 | int in_isr; | 4749 | int in_isr; |
4863 | 4750 | ||
4864 | /* (Bugzilla:fibrebugs, #513) | 4751 | /* Prevent calling wait_event() (below), if caller happens |
4865 | * Bug fix (part 1)! 20010905 -sralston | ||
4866 | * Prevent calling wait_event() (below), if caller happens | ||
4867 | * to be in ISR context, because that is fatal! | 4752 | * to be in ISR context, because that is fatal! |
4868 | */ | 4753 | */ |
4869 | in_isr = in_interrupt(); | 4754 | in_isr = in_interrupt(); |
@@ -5130,20 +5015,26 @@ static int | |||
5130 | procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eof, void *data) | 5015 | procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eof, void *data) |
5131 | { | 5016 | { |
5132 | int ii; | 5017 | int ii; |
5133 | int scsi, lan, ctl, targ, dmp; | 5018 | int scsi, fc, sas, lan, ctl, targ, dmp; |
5134 | char *drvname; | 5019 | char *drvname; |
5135 | int len; | 5020 | int len; |
5136 | 5021 | ||
5137 | len = sprintf(buf, "%s-%s\n", "mptlinux", MPT_LINUX_VERSION_COMMON); | 5022 | len = sprintf(buf, "%s-%s\n", "mptlinux", MPT_LINUX_VERSION_COMMON); |
5138 | len += sprintf(buf+len, " Fusion MPT base driver\n"); | 5023 | len += sprintf(buf+len, " Fusion MPT base driver\n"); |
5139 | 5024 | ||
5140 | scsi = lan = ctl = targ = dmp = 0; | 5025 | scsi = fc = sas = lan = ctl = targ = dmp = 0; |
5141 | for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { | 5026 | for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { |
5142 | drvname = NULL; | 5027 | drvname = NULL; |
5143 | if (MptCallbacks[ii]) { | 5028 | if (MptCallbacks[ii]) { |
5144 | switch (MptDriverClass[ii]) { | 5029 | switch (MptDriverClass[ii]) { |
5145 | case MPTSCSIH_DRIVER: | 5030 | case MPTSPI_DRIVER: |
5146 | if (!scsi++) drvname = "SCSI host"; | 5031 | if (!scsi++) drvname = "SPI host"; |
5032 | break; | ||
5033 | case MPTFC_DRIVER: | ||
5034 | if (!fc++) drvname = "FC host"; | ||
5035 | break; | ||
5036 | case MPTSAS_DRIVER: | ||
5037 | if (!sas++) drvname = "SAS host"; | ||
5147 | break; | 5038 | break; |
5148 | case MPTLAN_DRIVER: | 5039 | case MPTLAN_DRIVER: |
5149 | if (!lan++) drvname = "LAN"; | 5040 | if (!lan++) drvname = "LAN"; |
@@ -5832,6 +5723,12 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) | |||
5832 | } | 5723 | } |
5833 | 5724 | ||
5834 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 5725 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
5726 | EXPORT_SYMBOL(mpt_attach); | ||
5727 | EXPORT_SYMBOL(mpt_detach); | ||
5728 | #ifdef CONFIG_PM | ||
5729 | EXPORT_SYMBOL(mpt_resume); | ||
5730 | EXPORT_SYMBOL(mpt_suspend); | ||
5731 | #endif | ||
5835 | EXPORT_SYMBOL(ioc_list); | 5732 | EXPORT_SYMBOL(ioc_list); |
5836 | EXPORT_SYMBOL(mpt_proc_root_dir); | 5733 | EXPORT_SYMBOL(mpt_proc_root_dir); |
5837 | EXPORT_SYMBOL(mpt_register); | 5734 | EXPORT_SYMBOL(mpt_register); |
@@ -5860,19 +5757,6 @@ EXPORT_SYMBOL(mpt_read_ioc_pg_3); | |||
5860 | EXPORT_SYMBOL(mpt_alloc_fw_memory); | 5757 | EXPORT_SYMBOL(mpt_alloc_fw_memory); |
5861 | EXPORT_SYMBOL(mpt_free_fw_memory); | 5758 | EXPORT_SYMBOL(mpt_free_fw_memory); |
5862 | 5759 | ||
5863 | static struct pci_driver mptbase_driver = { | ||
5864 | .name = "mptbase", | ||
5865 | .id_table = mptbase_pci_table, | ||
5866 | .probe = mptbase_probe, | ||
5867 | .remove = __devexit_p(mptbase_remove), | ||
5868 | .driver = { | ||
5869 | .shutdown = mptbase_shutdown, | ||
5870 | }, | ||
5871 | #ifdef CONFIG_PM | ||
5872 | .suspend = mptbase_suspend, | ||
5873 | .resume = mptbase_resume, | ||
5874 | #endif | ||
5875 | }; | ||
5876 | 5760 | ||
5877 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 5761 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
5878 | /* | 5762 | /* |
@@ -5884,7 +5768,6 @@ static int __init | |||
5884 | fusion_init(void) | 5768 | fusion_init(void) |
5885 | { | 5769 | { |
5886 | int i; | 5770 | int i; |
5887 | int r; | ||
5888 | 5771 | ||
5889 | show_mptmod_ver(my_NAME, my_VERSION); | 5772 | show_mptmod_ver(my_NAME, my_VERSION); |
5890 | printk(KERN_INFO COPYRIGHT "\n"); | 5773 | printk(KERN_INFO COPYRIGHT "\n"); |
@@ -5896,8 +5779,7 @@ fusion_init(void) | |||
5896 | MptResetHandlers[i] = NULL; | 5779 | MptResetHandlers[i] = NULL; |
5897 | } | 5780 | } |
5898 | 5781 | ||
5899 | /* NEW! 20010120 -sralston | 5782 | /* Register ourselves (mptbase) in order to facilitate |
5900 | * Register ourselves (mptbase) in order to facilitate | ||
5901 | * EventNotification handling. | 5783 | * EventNotification handling. |
5902 | */ | 5784 | */ |
5903 | mpt_base_index = mpt_register(mpt_base_reply, MPTBASE_DRIVER); | 5785 | mpt_base_index = mpt_register(mpt_base_reply, MPTBASE_DRIVER); |
@@ -5913,11 +5795,7 @@ fusion_init(void) | |||
5913 | #ifdef CONFIG_PROC_FS | 5795 | #ifdef CONFIG_PROC_FS |
5914 | (void) procmpt_create(); | 5796 | (void) procmpt_create(); |
5915 | #endif | 5797 | #endif |
5916 | r = pci_register_driver(&mptbase_driver); | 5798 | return 0; |
5917 | if(r) | ||
5918 | return(r); | ||
5919 | |||
5920 | return r; | ||
5921 | } | 5799 | } |
5922 | 5800 | ||
5923 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 5801 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
@@ -5933,7 +5811,6 @@ fusion_exit(void) | |||
5933 | 5811 | ||
5934 | dexitprintk((KERN_INFO MYNAM ": fusion_exit() called!\n")); | 5812 | dexitprintk((KERN_INFO MYNAM ": fusion_exit() called!\n")); |
5935 | 5813 | ||
5936 | pci_unregister_driver(&mptbase_driver); | ||
5937 | mpt_reset_deregister(mpt_base_index); | 5814 | mpt_reset_deregister(mpt_base_index); |
5938 | 5815 | ||
5939 | #ifdef CONFIG_PROC_FS | 5816 | #ifdef CONFIG_PROC_FS |
@@ -5941,6 +5818,5 @@ fusion_exit(void) | |||
5941 | #endif | 5818 | #endif |
5942 | } | 5819 | } |
5943 | 5820 | ||
5944 | |||
5945 | module_init(fusion_init); | 5821 | module_init(fusion_init); |
5946 | module_exit(fusion_exit); | 5822 | module_exit(fusion_exit); |