diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-20 13:20:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-20 13:20:07 -0400 |
commit | d67e91117d104d98635e1b1623aafb26604cecbb (patch) | |
tree | a328b623ed07a33c1322ebc234e3236aa326494b | |
parent | 00c04db982b66fe9e8c8c5156808b905199bd645 (diff) | |
parent | 28aef2f7d9415b881c9145ab9b2c1c234064a243 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
[SCSI] a100u2w: fix bitmap lookup routine
[SCSI] fix media change events for polled devices
[SCSI] sd, sr: do not emit change event at device add
[SCSI] mpt fusion: Power Management fixes for MPT SAS PCI-E controllers
[SCSI] gdth: Allocate sense_buffer to prevent NULL pointer dereference
[SCSI] arcmsr: fix iounmap error for Type B adapter
[SCSI] isd200: Allocate sense_buffer for hacked up scsi_cmnd
[SCSI] fix bsg queue oops with iscsi logout
[SCSI] Fix dependency problems in SCSI drivers
[SCSI] advansys: Fix bug in AdvLoadMicrocode
-rw-r--r-- | drivers/message/fusion/mptbase.c | 276 | ||||
-rw-r--r-- | drivers/message/fusion/mptscsih.c | 11 | ||||
-rw-r--r-- | drivers/scsi/Kconfig | 2 | ||||
-rw-r--r-- | drivers/scsi/a100u2w.c | 9 | ||||
-rw-r--r-- | drivers/scsi/advansys.c | 2 | ||||
-rw-r--r-- | drivers/scsi/arcmsr/arcmsr.h | 14 | ||||
-rw-r--r-- | drivers/scsi/gdth.c | 7 | ||||
-rw-r--r-- | drivers/scsi/scsi_lib.c | 5 | ||||
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 2 | ||||
-rw-r--r-- | drivers/scsi/sd.c | 1 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 1 | ||||
-rw-r--r-- | drivers/usb/storage/isd200.c | 5 |
12 files changed, 199 insertions, 136 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 6b6df8679585..c6be6eba7dc3 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -1430,6 +1430,98 @@ mpt_get_product_name(u16 vendor, u16 device, u8 revision, char *prod_name) | |||
1430 | sprintf(prod_name, "%s", product_str); | 1430 | sprintf(prod_name, "%s", product_str); |
1431 | } | 1431 | } |
1432 | 1432 | ||
1433 | /** | ||
1434 | * mpt_mapresources - map in memory mapped io | ||
1435 | * @ioc: Pointer to pointer to IOC adapter | ||
1436 | * | ||
1437 | **/ | ||
1438 | static int | ||
1439 | mpt_mapresources(MPT_ADAPTER *ioc) | ||
1440 | { | ||
1441 | u8 __iomem *mem; | ||
1442 | int ii; | ||
1443 | unsigned long mem_phys; | ||
1444 | unsigned long port; | ||
1445 | u32 msize; | ||
1446 | u32 psize; | ||
1447 | u8 revision; | ||
1448 | int r = -ENODEV; | ||
1449 | struct pci_dev *pdev; | ||
1450 | |||
1451 | pdev = ioc->pcidev; | ||
1452 | ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); | ||
1453 | if (pci_enable_device_mem(pdev)) { | ||
1454 | printk(MYIOC_s_ERR_FMT "pci_enable_device_mem() " | ||
1455 | "failed\n", ioc->name); | ||
1456 | return r; | ||
1457 | } | ||
1458 | if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) { | ||
1459 | printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with " | ||
1460 | "MEM failed\n", ioc->name); | ||
1461 | return r; | ||
1462 | } | ||
1463 | |||
1464 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); | ||
1465 | |||
1466 | if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) | ||
1467 | && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { | ||
1468 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT | ||
1469 | ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", | ||
1470 | ioc->name)); | ||
1471 | } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK) | ||
1472 | && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { | ||
1473 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT | ||
1474 | ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", | ||
1475 | ioc->name)); | ||
1476 | } else { | ||
1477 | printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n", | ||
1478 | ioc->name, pci_name(pdev)); | ||
1479 | pci_release_selected_regions(pdev, ioc->bars); | ||
1480 | return r; | ||
1481 | } | ||
1482 | |||
1483 | mem_phys = msize = 0; | ||
1484 | port = psize = 0; | ||
1485 | for (ii = 0; ii < DEVICE_COUNT_RESOURCE; ii++) { | ||
1486 | if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { | ||
1487 | if (psize) | ||
1488 | continue; | ||
1489 | /* Get I/O space! */ | ||
1490 | port = pci_resource_start(pdev, ii); | ||
1491 | psize = pci_resource_len(pdev, ii); | ||
1492 | } else { | ||
1493 | if (msize) | ||
1494 | continue; | ||
1495 | /* Get memmap */ | ||
1496 | mem_phys = pci_resource_start(pdev, ii); | ||
1497 | msize = pci_resource_len(pdev, ii); | ||
1498 | } | ||
1499 | } | ||
1500 | ioc->mem_size = msize; | ||
1501 | |||
1502 | mem = NULL; | ||
1503 | /* Get logical ptr for PciMem0 space */ | ||
1504 | /*mem = ioremap(mem_phys, msize);*/ | ||
1505 | mem = ioremap(mem_phys, msize); | ||
1506 | if (mem == NULL) { | ||
1507 | printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter" | ||
1508 | " memory!\n", ioc->name); | ||
1509 | return -EINVAL; | ||
1510 | } | ||
1511 | ioc->memmap = mem; | ||
1512 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %lx\n", | ||
1513 | ioc->name, mem, mem_phys)); | ||
1514 | |||
1515 | ioc->mem_phys = mem_phys; | ||
1516 | ioc->chip = (SYSIF_REGS __iomem *)mem; | ||
1517 | |||
1518 | /* Save Port IO values in case we need to do downloadboot */ | ||
1519 | ioc->pio_mem_phys = port; | ||
1520 | ioc->pio_chip = (SYSIF_REGS __iomem *)port; | ||
1521 | |||
1522 | return 0; | ||
1523 | } | ||
1524 | |||
1433 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1525 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1434 | /** | 1526 | /** |
1435 | * mpt_attach - Install a PCI intelligent MPT adapter. | 1527 | * mpt_attach - Install a PCI intelligent MPT adapter. |
@@ -1452,13 +1544,6 @@ int | |||
1452 | mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | 1544 | mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) |
1453 | { | 1545 | { |
1454 | MPT_ADAPTER *ioc; | 1546 | MPT_ADAPTER *ioc; |
1455 | u8 __iomem *mem; | ||
1456 | u8 __iomem *pmem; | ||
1457 | unsigned long mem_phys; | ||
1458 | unsigned long port; | ||
1459 | u32 msize; | ||
1460 | u32 psize; | ||
1461 | int ii; | ||
1462 | u8 cb_idx; | 1547 | u8 cb_idx; |
1463 | int r = -ENODEV; | 1548 | int r = -ENODEV; |
1464 | u8 revision; | 1549 | u8 revision; |
@@ -1468,52 +1553,32 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1468 | struct proc_dir_entry *dent, *ent; | 1553 | struct proc_dir_entry *dent, *ent; |
1469 | #endif | 1554 | #endif |
1470 | 1555 | ||
1471 | if (mpt_debug_level) | ||
1472 | printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); | ||
1473 | |||
1474 | ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); | 1556 | ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); |
1475 | if (ioc == NULL) { | 1557 | if (ioc == NULL) { |
1476 | printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); | 1558 | printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); |
1477 | return -ENOMEM; | 1559 | return -ENOMEM; |
1478 | } | 1560 | } |
1479 | ioc->debug_level = mpt_debug_level; | 1561 | |
1480 | ioc->id = mpt_ids++; | 1562 | ioc->id = mpt_ids++; |
1481 | sprintf(ioc->name, "ioc%d", ioc->id); | 1563 | sprintf(ioc->name, "ioc%d", ioc->id); |
1482 | 1564 | ||
1483 | ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); | 1565 | /* |
1484 | if (pci_enable_device_mem(pdev)) { | 1566 | * set initial debug level |
1485 | printk(MYIOC_s_ERR_FMT "pci_enable_device_mem() " | 1567 | * (refer to mptdebug.h) |
1486 | "failed\n", ioc->name); | 1568 | * |
1487 | kfree(ioc); | 1569 | */ |
1488 | return r; | 1570 | ioc->debug_level = mpt_debug_level; |
1489 | } | 1571 | if (mpt_debug_level) |
1490 | if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) { | 1572 | printk(KERN_INFO "mpt_debug_level=%xh\n", mpt_debug_level); |
1491 | printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with " | ||
1492 | "MEM failed\n", ioc->name); | ||
1493 | kfree(ioc); | ||
1494 | return r; | ||
1495 | } | ||
1496 | 1573 | ||
1497 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name)); | 1574 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name)); |
1498 | 1575 | ||
1499 | if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) { | 1576 | ioc->pcidev = pdev; |
1500 | dprintk(ioc, printk(MYIOC_s_INFO_FMT | 1577 | if (mpt_mapresources(ioc)) { |
1501 | ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", ioc->name)); | ||
1502 | } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { | ||
1503 | printk(MYIOC_s_WARN_FMT ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n", | ||
1504 | ioc->name); | ||
1505 | kfree(ioc); | 1578 | kfree(ioc); |
1506 | return r; | 1579 | return r; |
1507 | } | 1580 | } |
1508 | 1581 | ||
1509 | if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { | ||
1510 | dprintk(ioc, printk(MYIOC_s_INFO_FMT | ||
1511 | ": Using 64 bit consistent mask\n", ioc->name)); | ||
1512 | } else { | ||
1513 | dprintk(ioc, printk(MYIOC_s_INFO_FMT | ||
1514 | ": Not using 64 bit consistent mask\n", ioc->name)); | ||
1515 | } | ||
1516 | |||
1517 | ioc->alloc_total = sizeof(MPT_ADAPTER); | 1582 | ioc->alloc_total = sizeof(MPT_ADAPTER); |
1518 | ioc->req_sz = MPT_DEFAULT_FRAME_SIZE; /* avoid div by zero! */ | 1583 | ioc->req_sz = MPT_DEFAULT_FRAME_SIZE; /* avoid div by zero! */ |
1519 | ioc->reply_sz = MPT_REPLY_FRAME_SIZE; | 1584 | ioc->reply_sz = MPT_REPLY_FRAME_SIZE; |
@@ -1551,48 +1616,9 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1551 | /* Find lookup slot. */ | 1616 | /* Find lookup slot. */ |
1552 | INIT_LIST_HEAD(&ioc->list); | 1617 | INIT_LIST_HEAD(&ioc->list); |
1553 | 1618 | ||
1554 | mem_phys = msize = 0; | ||
1555 | port = psize = 0; | ||
1556 | for (ii=0; ii < DEVICE_COUNT_RESOURCE; ii++) { | ||
1557 | if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { | ||
1558 | if (psize) | ||
1559 | continue; | ||
1560 | /* Get I/O space! */ | ||
1561 | port = pci_resource_start(pdev, ii); | ||
1562 | psize = pci_resource_len(pdev,ii); | ||
1563 | } else { | ||
1564 | if (msize) | ||
1565 | continue; | ||
1566 | /* Get memmap */ | ||
1567 | mem_phys = pci_resource_start(pdev, ii); | ||
1568 | msize = pci_resource_len(pdev,ii); | ||
1569 | } | ||
1570 | } | ||
1571 | ioc->mem_size = msize; | ||
1572 | |||
1573 | mem = NULL; | ||
1574 | /* Get logical ptr for PciMem0 space */ | ||
1575 | /*mem = ioremap(mem_phys, msize);*/ | ||
1576 | mem = ioremap(mem_phys, msize); | ||
1577 | if (mem == NULL) { | ||
1578 | printk(MYIOC_s_ERR_FMT "Unable to map adapter memory!\n", ioc->name); | ||
1579 | kfree(ioc); | ||
1580 | return -EINVAL; | ||
1581 | } | ||
1582 | ioc->memmap = mem; | ||
1583 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %lx\n", ioc->name, mem, mem_phys)); | ||
1584 | |||
1585 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", | 1619 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", |
1586 | ioc->name, &ioc->facts, &ioc->pfacts[0])); | 1620 | ioc->name, &ioc->facts, &ioc->pfacts[0])); |
1587 | 1621 | ||
1588 | ioc->mem_phys = mem_phys; | ||
1589 | ioc->chip = (SYSIF_REGS __iomem *)mem; | ||
1590 | |||
1591 | /* Save Port IO values in case we need to do downloadboot */ | ||
1592 | ioc->pio_mem_phys = port; | ||
1593 | pmem = (u8 __iomem *)port; | ||
1594 | ioc->pio_chip = (SYSIF_REGS __iomem *)pmem; | ||
1595 | |||
1596 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); | 1622 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); |
1597 | mpt_get_product_name(pdev->vendor, pdev->device, revision, ioc->prod_name); | 1623 | mpt_get_product_name(pdev->vendor, pdev->device, revision, ioc->prod_name); |
1598 | 1624 | ||
@@ -1688,7 +1714,9 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1688 | list_del(&ioc->list); | 1714 | list_del(&ioc->list); |
1689 | if (ioc->alt_ioc) | 1715 | if (ioc->alt_ioc) |
1690 | ioc->alt_ioc->alt_ioc = NULL; | 1716 | ioc->alt_ioc->alt_ioc = NULL; |
1691 | iounmap(mem); | 1717 | iounmap(ioc->memmap); |
1718 | if (r != -5) | ||
1719 | pci_release_selected_regions(pdev, ioc->bars); | ||
1692 | kfree(ioc); | 1720 | kfree(ioc); |
1693 | pci_set_drvdata(pdev, NULL); | 1721 | pci_set_drvdata(pdev, NULL); |
1694 | return r; | 1722 | return r; |
@@ -1784,13 +1812,10 @@ mpt_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1784 | u32 device_state; | 1812 | u32 device_state; |
1785 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1813 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1786 | 1814 | ||
1787 | device_state=pci_choose_state(pdev, state); | 1815 | device_state = pci_choose_state(pdev, state); |
1788 | 1816 | printk(MYIOC_s_INFO_FMT "pci-suspend: pdev=0x%p, slot=%s, Entering " | |
1789 | printk(MYIOC_s_INFO_FMT | 1817 | "operating state [D%d]\n", ioc->name, pdev, pci_name(pdev), |
1790 | "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n", | 1818 | device_state); |
1791 | ioc->name, pdev, pci_name(pdev), device_state); | ||
1792 | |||
1793 | pci_save_state(pdev); | ||
1794 | 1819 | ||
1795 | /* put ioc into READY_STATE */ | 1820 | /* put ioc into READY_STATE */ |
1796 | if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) { | 1821 | if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) { |
@@ -1805,10 +1830,14 @@ mpt_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1805 | /* Clear any lingering interrupt */ | 1830 | /* Clear any lingering interrupt */ |
1806 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); | 1831 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); |
1807 | 1832 | ||
1833 | free_irq(ioc->pci_irq, ioc); | ||
1834 | if (mpt_msi_enable) | ||
1835 | pci_disable_msi(ioc->pcidev); | ||
1836 | ioc->pci_irq = -1; | ||
1837 | pci_save_state(pdev); | ||
1808 | pci_disable_device(pdev); | 1838 | pci_disable_device(pdev); |
1809 | pci_release_selected_regions(pdev, ioc->bars); | 1839 | pci_release_selected_regions(pdev, ioc->bars); |
1810 | pci_set_power_state(pdev, device_state); | 1840 | pci_set_power_state(pdev, device_state); |
1811 | |||
1812 | return 0; | 1841 | return 0; |
1813 | } | 1842 | } |
1814 | 1843 | ||
@@ -1823,48 +1852,54 @@ mpt_resume(struct pci_dev *pdev) | |||
1823 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1852 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1824 | u32 device_state = pdev->current_state; | 1853 | u32 device_state = pdev->current_state; |
1825 | int recovery_state; | 1854 | int recovery_state; |
1855 | int err; | ||
1826 | 1856 | ||
1827 | printk(MYIOC_s_INFO_FMT | 1857 | printk(MYIOC_s_INFO_FMT "pci-resume: pdev=0x%p, slot=%s, Previous " |
1828 | "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", | 1858 | "operating state [D%d]\n", ioc->name, pdev, pci_name(pdev), |
1829 | ioc->name, pdev, pci_name(pdev), device_state); | 1859 | device_state); |
1830 | 1860 | ||
1831 | pci_set_power_state(pdev, 0); | 1861 | pci_set_power_state(pdev, PCI_D0); |
1862 | pci_enable_wake(pdev, PCI_D0, 0); | ||
1832 | pci_restore_state(pdev); | 1863 | pci_restore_state(pdev); |
1833 | if (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT) { | 1864 | ioc->pcidev = pdev; |
1834 | ioc->bars = pci_select_bars(ioc->pcidev, IORESOURCE_MEM | | 1865 | err = mpt_mapresources(ioc); |
1835 | IORESOURCE_IO); | 1866 | if (err) |
1836 | if (pci_enable_device(pdev)) | 1867 | return err; |
1837 | return 0; | ||
1838 | } else { | ||
1839 | ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); | ||
1840 | if (pci_enable_device_mem(pdev)) | ||
1841 | return 0; | ||
1842 | } | ||
1843 | if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) | ||
1844 | return 0; | ||
1845 | 1868 | ||
1846 | /* enable interrupts */ | 1869 | printk(MYIOC_s_INFO_FMT "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", |
1847 | CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); | 1870 | ioc->name, (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), |
1848 | ioc->active = 1; | 1871 | CHIPREG_READ32(&ioc->chip->Doorbell)); |
1849 | 1872 | ||
1850 | printk(MYIOC_s_INFO_FMT | 1873 | /* |
1851 | "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", | 1874 | * Errata workaround for SAS pci express: |
1852 | ioc->name, | 1875 | * Upon returning to the D0 state, the contents of the doorbell will be |
1853 | (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), | 1876 | * stale data, and this will incorrectly signal to the host driver that |
1854 | CHIPREG_READ32(&ioc->chip->Doorbell)); | 1877 | * the firmware is ready to process mpt commands. The workaround is |
1878 | * to issue a diagnostic reset. | ||
1879 | */ | ||
1880 | if (ioc->bus_type == SAS && (pdev->device == | ||
1881 | MPI_MANUFACTPAGE_DEVID_SAS1068E || pdev->device == | ||
1882 | MPI_MANUFACTPAGE_DEVID_SAS1064E)) { | ||
1883 | if (KickStart(ioc, 1, CAN_SLEEP) < 0) { | ||
1884 | printk(MYIOC_s_WARN_FMT "pci-resume: Cannot recover\n", | ||
1885 | ioc->name); | ||
1886 | goto out; | ||
1887 | } | ||
1888 | } | ||
1855 | 1889 | ||
1856 | /* bring ioc to operational state */ | 1890 | /* bring ioc to operational state */ |
1857 | if ((recovery_state = mpt_do_ioc_recovery(ioc, | 1891 | printk(MYIOC_s_INFO_FMT "Sending mpt_do_ioc_recovery\n", ioc->name); |
1858 | MPT_HOSTEVENT_IOC_RECOVER, CAN_SLEEP)) != 0) { | 1892 | recovery_state = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, |
1859 | printk(MYIOC_s_INFO_FMT | 1893 | CAN_SLEEP); |
1860 | "pci-resume: Cannot recover, error:[%x]\n", | 1894 | if (recovery_state != 0) |
1861 | ioc->name, recovery_state); | 1895 | printk(MYIOC_s_WARN_FMT "pci-resume: Cannot recover, " |
1862 | } else { | 1896 | "error:[%x]\n", ioc->name, recovery_state); |
1897 | else | ||
1863 | printk(MYIOC_s_INFO_FMT | 1898 | printk(MYIOC_s_INFO_FMT |
1864 | "pci-resume: success\n", ioc->name); | 1899 | "pci-resume: success\n", ioc->name); |
1865 | } | 1900 | out: |
1866 | |||
1867 | return 0; | 1901 | return 0; |
1902 | |||
1868 | } | 1903 | } |
1869 | #endif | 1904 | #endif |
1870 | 1905 | ||
@@ -1903,6 +1938,7 @@ mpt_signal_reset(u8 index, MPT_ADAPTER *ioc, int reset_phase) | |||
1903 | * -3 if READY but PrimeIOCFifos Failed | 1938 | * -3 if READY but PrimeIOCFifos Failed |
1904 | * -4 if READY but IOCInit Failed | 1939 | * -4 if READY but IOCInit Failed |
1905 | * -5 if failed to enable_device and/or request_selected_regions | 1940 | * -5 if failed to enable_device and/or request_selected_regions |
1941 | * -6 if failed to upload firmware | ||
1906 | */ | 1942 | */ |
1907 | static int | 1943 | static int |
1908 | mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | 1944 | mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) |
@@ -2097,7 +2133,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
2097 | } else { | 2133 | } else { |
2098 | printk(MYIOC_s_WARN_FMT | 2134 | printk(MYIOC_s_WARN_FMT |
2099 | "firmware upload failure!\n", ioc->name); | 2135 | "firmware upload failure!\n", ioc->name); |
2100 | ret = -5; | 2136 | ret = -6; |
2101 | } | 2137 | } |
2102 | } | 2138 | } |
2103 | } | 2139 | } |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 0c252f60c4c1..c207bda6723b 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
@@ -1170,6 +1170,10 @@ mptscsih_shutdown(struct pci_dev *pdev) | |||
1170 | int | 1170 | int |
1171 | mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) | 1171 | mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) |
1172 | { | 1172 | { |
1173 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | ||
1174 | |||
1175 | scsi_block_requests(ioc->sh); | ||
1176 | flush_scheduled_work(); | ||
1173 | mptscsih_shutdown(pdev); | 1177 | mptscsih_shutdown(pdev); |
1174 | return mpt_suspend(pdev,state); | 1178 | return mpt_suspend(pdev,state); |
1175 | } | 1179 | } |
@@ -1183,7 +1187,12 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1183 | int | 1187 | int |
1184 | mptscsih_resume(struct pci_dev *pdev) | 1188 | mptscsih_resume(struct pci_dev *pdev) |
1185 | { | 1189 | { |
1186 | return mpt_resume(pdev); | 1190 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
1191 | int rc; | ||
1192 | |||
1193 | rc = mpt_resume(pdev); | ||
1194 | scsi_unblock_requests(ioc->sh); | ||
1195 | return rc; | ||
1187 | } | 1196 | } |
1188 | 1197 | ||
1189 | #endif | 1198 | #endif |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index c46666a24809..b9d374082b65 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -325,7 +325,7 @@ menuconfig SCSI_LOWLEVEL | |||
325 | depends on SCSI!=n | 325 | depends on SCSI!=n |
326 | default y | 326 | default y |
327 | 327 | ||
328 | if SCSI_LOWLEVEL | 328 | if SCSI_LOWLEVEL && SCSI |
329 | 329 | ||
330 | config ISCSI_TCP | 330 | config ISCSI_TCP |
331 | tristate "iSCSI Initiator over TCP/IP" | 331 | tristate "iSCSI Initiator over TCP/IP" |
diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c index f608d4a1d6da..792b2e807bf3 100644 --- a/drivers/scsi/a100u2w.c +++ b/drivers/scsi/a100u2w.c | |||
@@ -674,12 +674,13 @@ static struct orc_scb *__orc_alloc_scb(struct orc_host * host) | |||
674 | for (index = 0; index < 32; index++) { | 674 | for (index = 0; index < 32; index++) { |
675 | if ((host->allocation_map[channel][i] >> index) & 0x01) { | 675 | if ((host->allocation_map[channel][i] >> index) & 0x01) { |
676 | host->allocation_map[channel][i] &= ~(1 << index); | 676 | host->allocation_map[channel][i] &= ~(1 << index); |
677 | break; | 677 | idx = index + 32 * i; |
678 | /* | ||
679 | * Translate the index to a structure instance | ||
680 | */ | ||
681 | return host->scb_virt + idx; | ||
678 | } | 682 | } |
679 | } | 683 | } |
680 | idx = index + 32 * i; | ||
681 | /* Translate the index to a structure instance */ | ||
682 | return (struct orc_scb *) ((unsigned long) host->scb_virt + (idx * sizeof(struct orc_scb))); | ||
683 | } | 684 | } |
684 | return NULL; | 685 | return NULL; |
685 | } | 686 | } |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 3c2d6888bb8c..8591585e5cc5 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
@@ -6439,7 +6439,7 @@ static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size, | |||
6439 | i += 2; | 6439 | i += 2; |
6440 | len += 2; | 6440 | len += 2; |
6441 | } else { | 6441 | } else { |
6442 | unsigned char off = buf[i] * 2; | 6442 | unsigned int off = buf[i] * 2; |
6443 | unsigned short word = (buf[off + 1] << 8) | buf[off]; | 6443 | unsigned short word = (buf[off + 1] << 8) | buf[off]; |
6444 | AdvWriteWordAutoIncLram(iop_base, word); | 6444 | AdvWriteWordAutoIncLram(iop_base, word); |
6445 | len += 2; | 6445 | len += 2; |
diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h index 0393707bdfce..3288be2e49f8 100644 --- a/drivers/scsi/arcmsr/arcmsr.h +++ b/drivers/scsi/arcmsr/arcmsr.h | |||
@@ -341,13 +341,13 @@ struct MessageUnit_B | |||
341 | uint32_t done_qbuffer[ARCMSR_MAX_HBB_POSTQUEUE]; | 341 | uint32_t done_qbuffer[ARCMSR_MAX_HBB_POSTQUEUE]; |
342 | uint32_t postq_index; | 342 | uint32_t postq_index; |
343 | uint32_t doneq_index; | 343 | uint32_t doneq_index; |
344 | uint32_t __iomem *drv2iop_doorbell_reg; | 344 | void __iomem *drv2iop_doorbell_reg; |
345 | uint32_t __iomem *drv2iop_doorbell_mask_reg; | 345 | void __iomem *drv2iop_doorbell_mask_reg; |
346 | uint32_t __iomem *iop2drv_doorbell_reg; | 346 | void __iomem *iop2drv_doorbell_reg; |
347 | uint32_t __iomem *iop2drv_doorbell_mask_reg; | 347 | void __iomem *iop2drv_doorbell_mask_reg; |
348 | uint32_t __iomem *msgcode_rwbuffer_reg; | 348 | void __iomem *msgcode_rwbuffer_reg; |
349 | uint32_t __iomem *ioctl_wbuffer_reg; | 349 | void __iomem *ioctl_wbuffer_reg; |
350 | uint32_t __iomem *ioctl_rbuffer_reg; | 350 | void __iomem *ioctl_rbuffer_reg; |
351 | }; | 351 | }; |
352 | 352 | ||
353 | /* | 353 | /* |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 27ebd336409b..0b2080d33575 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -493,6 +493,12 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, | |||
493 | if (!scp) | 493 | if (!scp) |
494 | return -ENOMEM; | 494 | return -ENOMEM; |
495 | 495 | ||
496 | scp->sense_buffer = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL); | ||
497 | if (!scp->sense_buffer) { | ||
498 | kfree(scp); | ||
499 | return -ENOMEM; | ||
500 | } | ||
501 | |||
496 | scp->device = sdev; | 502 | scp->device = sdev; |
497 | memset(&cmndinfo, 0, sizeof(cmndinfo)); | 503 | memset(&cmndinfo, 0, sizeof(cmndinfo)); |
498 | 504 | ||
@@ -513,6 +519,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, | |||
513 | rval = cmndinfo.status; | 519 | rval = cmndinfo.status; |
514 | if (info) | 520 | if (info) |
515 | *info = cmndinfo.info; | 521 | *info = cmndinfo.info; |
522 | kfree(scp->sense_buffer); | ||
516 | kfree(scp); | 523 | kfree(scp); |
517 | return rval; | 524 | return rval; |
518 | } | 525 | } |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ba21d97d1855..f40898dc2d14 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -2162,10 +2162,15 @@ void sdev_evt_send(struct scsi_device *sdev, struct scsi_event *evt) | |||
2162 | { | 2162 | { |
2163 | unsigned long flags; | 2163 | unsigned long flags; |
2164 | 2164 | ||
2165 | #if 0 | ||
2166 | /* FIXME: currently this check eliminates all media change events | ||
2167 | * for polled devices. Need to update to discriminate between AN | ||
2168 | * and polled events */ | ||
2165 | if (!test_bit(evt->evt_type, sdev->supported_events)) { | 2169 | if (!test_bit(evt->evt_type, sdev->supported_events)) { |
2166 | kfree(evt); | 2170 | kfree(evt); |
2167 | return; | 2171 | return; |
2168 | } | 2172 | } |
2173 | #endif | ||
2169 | 2174 | ||
2170 | spin_lock_irqsave(&sdev->list_lock, flags); | 2175 | spin_lock_irqsave(&sdev->list_lock, flags); |
2171 | list_add_tail(&evt->node, &sdev->event_list); | 2176 | list_add_tail(&evt->node, &sdev->event_list); |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index ed83cdb6e67d..b9b09a704584 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -294,6 +294,7 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) | |||
294 | } | 294 | } |
295 | 295 | ||
296 | if (sdev->request_queue) { | 296 | if (sdev->request_queue) { |
297 | bsg_unregister_queue(sdev->request_queue); | ||
297 | sdev->request_queue->queuedata = NULL; | 298 | sdev->request_queue->queuedata = NULL; |
298 | /* user context needed to free queue */ | 299 | /* user context needed to free queue */ |
299 | scsi_free_queue(sdev->request_queue); | 300 | scsi_free_queue(sdev->request_queue); |
@@ -857,7 +858,6 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
857 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) | 858 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) |
858 | return; | 859 | return; |
859 | 860 | ||
860 | bsg_unregister_queue(sdev->request_queue); | ||
861 | class_device_unregister(&sdev->sdev_classdev); | 861 | class_device_unregister(&sdev->sdev_classdev); |
862 | transport_remove_device(dev); | 862 | transport_remove_device(dev); |
863 | device_del(dev); | 863 | device_del(dev); |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 7aee64dbfbeb..5fe7aaed904c 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1654,6 +1654,7 @@ static int sd_probe(struct device *dev) | |||
1654 | sdkp->disk = gd; | 1654 | sdkp->disk = gd; |
1655 | sdkp->index = index; | 1655 | sdkp->index = index; |
1656 | sdkp->openers = 0; | 1656 | sdkp->openers = 0; |
1657 | sdkp->previous_state = 1; | ||
1657 | 1658 | ||
1658 | if (!sdp->timeout) { | 1659 | if (!sdp->timeout) { |
1659 | if (sdp->type != TYPE_MOD) | 1660 | if (sdp->type != TYPE_MOD) |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 208565bdbe8e..7ee86d4a7618 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -623,6 +623,7 @@ static int sr_probe(struct device *dev) | |||
623 | cd->disk = disk; | 623 | cd->disk = disk; |
624 | cd->capacity = 0x1fffff; | 624 | cd->capacity = 0x1fffff; |
625 | cd->device->changed = 1; /* force recheck CD type */ | 625 | cd->device->changed = 1; /* force recheck CD type */ |
626 | cd->previous_state = 1; | ||
626 | cd->use = 1; | 627 | cd->use = 1; |
627 | cd->readcd_known = 0; | 628 | cd->readcd_known = 0; |
628 | cd->readcd_cdda = 0; | 629 | cd->readcd_cdda = 0; |
diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index 2ae1e8673b19..9d3f28b92cbe 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c | |||
@@ -1469,6 +1469,7 @@ static void isd200_free_info_ptrs(void *info_) | |||
1469 | if (info) { | 1469 | if (info) { |
1470 | kfree(info->id); | 1470 | kfree(info->id); |
1471 | kfree(info->RegsBuf); | 1471 | kfree(info->RegsBuf); |
1472 | kfree(info->srb.sense_buffer); | ||
1472 | } | 1473 | } |
1473 | } | 1474 | } |
1474 | 1475 | ||
@@ -1494,7 +1495,9 @@ static int isd200_init_info(struct us_data *us) | |||
1494 | kzalloc(sizeof(struct hd_driveid), GFP_KERNEL); | 1495 | kzalloc(sizeof(struct hd_driveid), GFP_KERNEL); |
1495 | info->RegsBuf = (unsigned char *) | 1496 | info->RegsBuf = (unsigned char *) |
1496 | kmalloc(sizeof(info->ATARegs), GFP_KERNEL); | 1497 | kmalloc(sizeof(info->ATARegs), GFP_KERNEL); |
1497 | if (!info->id || !info->RegsBuf) { | 1498 | info->srb.sense_buffer = |
1499 | kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL); | ||
1500 | if (!info->id || !info->RegsBuf || !info->srb.sense_buffer) { | ||
1498 | isd200_free_info_ptrs(info); | 1501 | isd200_free_info_ptrs(info); |
1499 | kfree(info); | 1502 | kfree(info); |
1500 | retStatus = ISD200_ERROR; | 1503 | retStatus = ISD200_ERROR; |